We read every piece of feedback, and take your input very seriously.
To see all available qualifiers, see our documentation.
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
“之后改变这个播放的频率”
The text was updated successfully, but these errors were encountered:
LibWaveSynther/LibWaveSynther/synther.c
Line 68 in bd0b71a
简单说这里用了一个算法: 音频变速重采样。 对于一个波表来说,首先我们要知道其“周期数”。在这个程序里因为所有的表都是仅保存了一个完整的周期,因此周期数固定为1。 那么我们假如要输出44100hz,假设要弹奏钢琴的国际标准音A4(440.000hz)。然后这个程序里的波表是512个点,周期是完整一个周期。 那么每个周期的点数毫无疑问是512 / 1 = 512。 而A4这个音要以440hz播放这个周期,也就是说每秒播放440个完整周期。那么能够算出来512 * 440 = 225280个点。 由于最终输出要44100hz,而我们算得原始情况下要一秒225280个点。为了进行重采样,我们要的就是在不改变输出频率的情况下改变波表的正确播放速度,让这个225280以正确的播放速度重采样到44100。则计算225280 / 44100 = 5.108,最终得出结论若播放A4音,则渲染每个点的时候需要跳跃5.108个下标来查波表。
此时这里会发现下标出现了小数。解决方法是使用线性插值,对两个临近的点进行插值计算。即result = table[5] + table[6] * 0.108。 而对于浮点数的问题,为了提高性能,改用定点数优化掉即可。
如此可见其实算法是一致的,而改变音高,唯一的参数实际上就是每次渲染要跳跃多少个点。 为了提高效率,这个参数没必要动态计算,可以直接先在编译之前计算好,直接打表,即这里的keydelta.c。用的时候直接根据音高读出来即可。
这就是如何重采样改变音高(波表的播放频率)的算法。
Sorry, something went wrong.
No branches or pull requests
“之后改变这个播放的频率”
The text was updated successfully, but these errors were encountered: