如何解决如何准确更改播放所有分辨率的Midi文件的速度?
我有一个Java swing中的Midi编辑器应用程序,可以播放加载的音乐。分辨率(每四分音符音高的拍子数)可以在24到1000之间变化,大多数midi文件都在较高的范围内。我实现了一项功能,用户可以按每分钟四分之一节拍设置播放速度。该程序通过使用以下方法计算Swing计时器延迟来改变播放速度:
其中BPM和分辨率是变量。基本上,该函数看起来像y = 1 / x,固定了BPM的值。但是,Swing计时器延迟是一个整数值(以毫秒为单位)。对于更高的分辨率,由于功能的性质,无论BPM多少,延迟总是四舍五入。
什么是最佳解决方案,以便我可以大致准确的速度播放音乐?我是否需要使用更快的计时器?如果是这样,有什么选择?我是否应该编写一些逻辑来使每个计时器刻度前进x个中刻度而不是1个,以解决Swing计时器的局限性?
解决方法
舍入错误将加总。而且由于执行代码而造成的延迟将加起来。
因此:
- 将时间戳计算为浮点值(这样,单个时间戳可能会偏离±0.5 ms,但时间间隔之和不会更糟);和
- 计算每个事件的绝对时间,并设置计时器,以使其在
target_time - current_time
毫秒(无论可能是什么)内经过。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。