使相邻音符之间的距离相同(像应用程序一样的 Theremin)

Make the distance between neighbor notes the same (Theremin like app)

我正在 Unity (C#) 中制作类似 Theremin 的应用程序。

我有水平轴 X,我可以在其上单击(使用鼠标或智能手机上的手指)。 该 X 轴确定将播放的频率。 用户将指定电路板的频率范围(X 轴),比方说从频率 261.63(注释 C4)到 523.25(注释 C5)。

我将计算 x_position_ratio,这是一个介于 0 和 1 之间的数字,用于确定用户点击 X 轴的位置(0 位于最左侧(本例中注意 C4),1在最右边(注 C5))

据此,我将通过等式计算要播放的频率

float freqRange = maxFreq - minFreq;
float frequency = (x_position_ratio * freqRange) + minFreq;

然后播放frequency。效果很好。

如果我在板上(X 轴)画出音符,我们可以看到,频率越高,2 个音符之间的跳跃就越高。

// Drawing just note A4 to demonstrate the code
float a4 = 440.0f //frequency of note A4
float x_position = (a4 - minFreq) / freqRange;

loc_x_position表示音符在X轴上0到1之间的位置

output

问题:

我想在 2 个音符之间进行相同的跳跃(如果您理解我的意思,请将其设为线性而不是指数)。在维基百科 Piano_key_frequencies 上找到方程式,但它是针对键的。我希望它适用于每个频率,但我不知道如何在我发布的 2 个代码示例中实现它

我明白了。试图将其绘制为对数以至少近似结果。

我受到了这个答案的启发Plotting logarithmic graph 事实证明这个解决方案有效

为了在 x 轴上画笔记,我使用了这个:

minFreq = Mathf.Log10(minFreq);
maxFreq = Mathf.Log10(maxFreq);
float freqRange = maxFreq - minFreq;
x_position = (Mathf.Log10(frequencyOfNoteToPlot) - minFreq) / freqRange;

为了计算频率,我刚刚从 x_position 的等式中导出频率,最后得到这段代码:

frequency = Mathf.Pow(10, x_position * freqRange + minFreq);

有一件事我仍然不明白,为什么我使用对数的底数并不重要。是不是因为我总是得到比率(值在 0 到 1 之间)?