将scale factor转换为note transposition音符移调值的计算方法
缩放系数转音符移调值(Javascript实现)
核心逻辑
音符频率与半音移调的对应关系为:每升高12个半音(1个八度),频率变为原有的2倍,因此通过对数计算即可完成转换:移调值 = 12 * 以2为底的缩放系数对数,计算后四舍五入取整即可得到无半音误差的结果。
转换示例验证
- 输入
0.5:12 * log₂(0.5) = -12(降低1个八度),符合预期 - 输入
1.0:12 * log₂(1) = 0(音高无变化),符合预期 - 输入
2.0:12 * log₂(2) = 12(升高1个八度),符合预期 - 输入
4.0:12 * log₂(4) = 24(升高2个八度),符合预期
实现代码
基础版本(ES6及以上环境)
function scaleToTransposition(scaleFactor) { if (scaleFactor <= 0) { throw new Error('缩放系数必须为大于0的数值'); } return Math.round(12 * Math.log2(scaleFactor)); }
兼容旧环境版本
function scaleToTransposition(scaleFactor) { if (scaleFactor <= 0) { throw new Error('缩放系数必须为大于0的数值'); } return Math.round(12 * (Math.log(scaleFactor) / Math.log(2))); }
测试用例
console.log(scaleToTransposition(0.5)); // 输出 -12 console.log(scaleToTransposition(1)); // 输出 0 console.log(scaleToTransposition(2)); // 输出 12 console.log(scaleToTransposition(4)); // 输出 24
内容的提问来源于stack exchange,提问作者user11762396
相关产品推荐
相关产品推荐

