如何准确更改播放所有分辨率的Midi文件的速度?

问题描述

我有一个Java swing中的Midi编辑器应用程序,可以播放加载的音乐。分辨率(每四分音符音高的拍子数)可以在24到1000之间变化,大多数midi文件都在较高的范围内。我实现了一项功能,用户可以按每分钟四分之一节拍设置播放速度。该程序通过使用以下方法计算Swing计时器延迟来改变播放速度:

enter image description here

其中BPM和分辨率是变量。基本上,该函数看起来像y = 1 / x,固定了BPM的值。但是,Swing计时器延迟是一个整数值(以毫秒为单位)。对于更高的分辨率,由于功能的性质,无论BPM多少,延迟总是四舍五入。

什么是最佳解决方案,以便我可以大致准确的速度播放音乐?我是否需要使用更快的计时器?如果是这样,有什么选择?我是否应该编写一些逻辑来使每个计时器刻度前进x个中刻度而不是1个,以解决Swing计时器的局限性?

解决方法

舍入错误将加总。而且由于执行代码而造成的延迟将加起来。

因此:

  • 将时间戳计算为浮点值(这样,单个时间戳可能会偏离±0.5 ms,但时间间隔之和不会更糟);和
  • 计算每个事件的绝对时间,并设置计时器,以使其在target_time - current_time毫秒(无论可能是什么)内经过。

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...