2011-05-10 3 views
3

I이 http://www.metronomeonline.com/ 사운드에 따라 (X는 NumericStepper 구성 객체 인 BPM을 통해 결정된다)타이머를 정확하게 만드는 방법은 무엇입니까? (플래시/액션 3.0)

var mainTimer:Timer = new Timer(60/(bpm.value * 1000),0); 
mainTimer.addEventListener(TimerEvent.TIMER, fl_TimerHandler,false, 0, true); 
mainTimer.start(); 

function fl_TimerHandler(event:TimerEvent):void 
    { 
     metroTransform.volume = vol; 
     flash.media.SoundMixer.soundTransform = metroTransform; 
     metroChannel = metro.play(); 
     mainTimer.delay = 60/bpm.value * 1000; 
     } 

X 회/분의 음성을 전달하기 위해 다음 방법을 사용하고 잘 앉아 있지 않습니다. 내가 갇혀있는이 문제를 해결하기 위해 할 수있는 일이 있습니까? 내가 갖는 출력 파일에

경로 : 시간 지연 값이기 때문에 http://conatur.net/metroBig.swf

+0

볼륨 변환을 비활성화 하시겠습니까? flash.media.SoundMixer를 호출 할 때마다 함수를 호출 할 때마다 metroTransform과 마찬가지로 객체를 만들어 함수 외부에서 인스턴스화해야합니다. 그냥 여기에 추측하지만 만약 당신이 아주 낮은 프레임 속도를 사용한다면 어쩌면 그것을 부딪 치십시오. –

+0

여기에 몇 가지 문제가 있습니다.가장 치명적인 첫 번째이자 가장 치명적인 것은 Flash가 불편한 대기 시간 문제를 가지고 있기 때문에 코드가 완성되었다고하더라도 사운드가 큐에 정확하게 재생된다는 것을 확신 할 수는 없습니다. @ Valkie는 답변의 절반을 가지고 있지만 나머지 절반은 대기 시간 문제를 진정으로 "치료"하지 않는다는 사실의 단순한 증상 일뿐입니다. – scriptocalypse

답변

3

http://cookbooks.adobe.com/post_Accurate_timer-17332.html 도움을 받으실 수 있습니다.

문제 Timer 클래스 2 개 이벤트 사이의 지연은 많은 요인에 따라
(FPS, 메모리, 무비 클립 엔드, 즉 재생). 타이머 클래스의 속성 지연으로 설정된 시간 제한은 근사치이므로 타이머의 정확성을 높이는 방법이 필요합니다.

솔루션
정확성을 높이기 위해 내 솔루션은 타이머 클래스를 확장하고 정확한 사용자 지정 속성의 따라 더주기를 만들기 위해 타이머를 강제하는 것입니다. 이 방법으로 타이머의 2 가지 이벤트 사이의 지연은 delay - + accurate/2로 설정됩니다. 이벤트의 상승은 2 가지 이벤트 사이의 진정한 딜레이 - 플래시 플레이어의 다음 해고 이벤트까지의 지연 - 정확도/2 가지 요인에 따라 달라집니다.

0

흠이되지 지연 값은

60000/bpm.value 
// with BPM = 80 we have 60000/80 = 750 

대신

60/(bpm.value * 1000) 
// with BPM = 80 we have 60/80000 = 0.00075 

이어야하며 설명서에 설명되어 있습니다.

delay : Number - 타이머 이벤트 사이의 지연 시간 (밀리 초 단위)입니다. 보다 20 밀리 초 미만의 지연은 을 권장하지 않습니다. 타이머 빈도는 초당 60 프레임으로 제한되며, 지연 시간이 16.6 밀리 초보다 작 으면 런타임 문제가 발생합니다.

나는 750 밀리 초가 0.00075 밀리 초보다 적합하다고 생각합니다.

SWF를 테스트하고 BPM을 60으로 설정하면 매 초마다 문제없이 소리가납니다. bpm.value는 모양이 같지 않습니다.. 어쨌든


, 당신의 SWF 및 두 개의 탭 (또는 창)의 "metronomeonline"웹 사이트를 열고 같은 BPM에 그들을 설정, 그들은 나에게 동기 소리.

+0

약간의 시간을 계속 듣고 계셨습니까? 또한 bpm이 130보다 클 때 문제는 최악이됩니다. – Lucas

+0

130 BTM은 약 460ms이므로 20ms 제한보다 훨씬 큽니다. 문제가되지 않아야합니다. 그러나 AS3의 타이머는 거의 모든 언어에서와 같이 기본 루프를 기반으로하며 루프 시간이 다른 것보다 길어집니다 (기술적 이유로) ... 그래서 고정밀 타이머를 사용하는 것이 어렵습니다. 특히 AS3처럼 다른 언어의 최상위를 감싸는 언어에서도 마찬가지입니다. 나는 시간 사건이 OK라고 생각한다. – Valkea

+0

타이머 이벤트가 정상인지 확인하는 가장 좋은 방법은 디스플레이 카운터를 5로 재설정 한 다음 상대적으로 "긴"시간 (예 : 5 분) 동안 주어진 BTM (예 : 180)을 설정하는 것입니다. 시계로 계산), 마지막으로 총 시간 (분)으로 얻은 카운터 값을 나눕니다. 따라서 시간의 좋은 수 또는 해고 여부를 알 수 있습니다 (180 BPM로 5 분이 900을 제공해야 함). 결과가 예상 결과에 가까울수록 타이머 이벤트가 정확 해지고 정확 해지면 문제는 항상 재생되지 않는 사운드에서 비롯됩니다. – Valkea

관련 문제