求解释Amiga周期与频率转换公式中的魔数8687700
Amiga Period与音高频率转换的魔数疑问
我正在实现一款针对S3M模块的老式音乐追踪器,目前已接近完成,其中一项核心需求是实现Amiga系音乐追踪器(如Protracker、Scream Tracker)中,用于定义音高的period(周期)到音高频率的转换逻辑。
经调研(包括参考Music StackExchange上的相关讨论),理论上的转换公式应为Amiga的PAL时钟频率除以period,即:
3546895 / period
但用这个公式计算出的频率完全错误。
后来我找到一个开源S3M播放器的转换公式:
frequency = 14317056.0 * sample_rate / (8363.0 * 16.0 * period)
但这个公式同样无法得到正确结果,于是我自行调整为:
frequency = (SCREAM_TRACKER_CLOCK_RATE * (MAGIC_NUMBER / sample_rate)) / (AMIGA_MIDDLE_C_RATE * 16.0 * period)
其中各参数的含义:
SCREAM_TRACKER_CLOCK_RATE:3579264Hz的4倍,即14317056AMIGA_MIDDLE_C_RATE:8363Hz(Amiga平台中央C对应的period基准值)sample_rate:待播放采样的采样率(比如中央C对应的44100Hz)period:需要转换的Amiga周期值MAGIC_NUMBER:8687700(我通过听觉试错得到的数值)
除了这个魔数外,其他参数的逻辑我都能理解(不过也不清楚公式中16的作用)。如果去掉这个魔数,计算出的音高完全错误。我也可以将公式简化为:
929002505.162523900573614 / (sample_rate * period)
但我希望代码中的公式具备可理解性,而非充斥无意义的魔数,因此想搞清楚:为什么乘以8687700能得到正确结果?
补充说明:这个魔数是我在适配44100Hz采样时得到的,当时公式未将采样率设为变量,该数值等于44100 * 197,而197同样是仅凭听觉试出的,完全不知道其逻辑来源。
内容的提问来源于stack exchange,提问作者Bri Bri
相关产品推荐
相关产品推荐

