我正在使用以下方法以X次/分钟发送声音(X是通过bpm确定的,这是一个NumericStepper对象)
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;
}
根据这个http://www.metronomeonline.com/声音不好。我有什么办法可以解决这个问题,我被困在了吗?
我得到的输出文件的路径:http://conatur.net/metroBig.swf
答案 0 :(得分:3)
http://cookbooks.adobe.com/post_Accurate_timer-17332.html可能会对您有所帮助。
<强>问题强>
定时器类的2个事件之间的延迟取决于许多因素(fps,存储器,播放的影片剪辑结束,即)。设置为定时器类的属性延迟的超时仅是近似的,因此需要一种方法来提高定时器的准确性。<强>解决方案强>
我提高准确性的解决方案是扩展计时器类并强制计时器根据自定义属性的准确性进行更多循环。以这种方式,定时器的2个事件之间的延迟将被设置为延迟 - +准确/ 2。因为事件的上升取决于许多因素,真正的2个事件之间的延迟来自:延迟 - 准确/ 2到闪存播放器的下一个触发事件。
答案 1 :(得分: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时,它们听起来与我同步。