我有一个javaswing中的midi编辑器应用程序,可以播放加载的音乐。分辨率(每四分之一音符的刻度值)可以从24到1000不等,大多数midi文件的分辨率都在更高的范围内。我实现了一个特性,用户可以用每分钟四分之一拍来设置播放速度。程序通过计算摆动计时器的延迟来改变播放速度
其中bpm和分辨率是变量。基本上,函数看起来就像y=1/x,为bpm固定一个值。但是,swing timer delay是以毫秒为单位的int值。对于更高的分辨率,由于函数的性质,无论bpm如何,延迟总是舍入为1。
什么是最好的解决方案,以便我可以播放音乐在一个大致准确的速度?我需要用更快的计时器吗?如果是,有什么选择?我是否应该编写一些逻辑,在每个计时器滴答声中向前移动x midi滴答声,而不是1,以绕过swing计时器的限制?
1条答案
按热度按时间6tr1vspr1#
舍入误差会增加。由于执行代码而导致的延迟也会增加。
因此:
将时间戳计算为浮点值(这样,单个时间戳可能会被± 0.5ms,但时间间隔总和不差);和
计算每个事件的绝对时间,并设置计时器,使其在
target_time - current_time
毫秒,不管是什么。