【问题标题】:Make the distance between neighbor notes the same (Theremin like app)使相邻音符之间的距离相同(Theremin like app)
【发布时间】:2022-01-24 03:36:23
【问题描述】:

我正在 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 轴),我们可以看到,频率越高,两个音符之间的跳跃就越高。

// 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表示note在X轴0到1之间的位置

output

问题:

我想在两个音符之间进行同样的跳跃(如果你明白我的意思,让它成为线性而不是指数)。在 Wikipedia Piano_key_frequencies 上找到了方程式,但它是用于密钥的。我希望它适用于每个频率,但我无法在我发布的 2 个代码示例中弄清楚如何实现它

【问题讨论】:

    标签: c# unity3d math audio frequency


    【解决方案1】:

    我想通了。试图将其绘制成对数以至少近似结果。

    我受到这个答案的启发 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 之间)?

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-01-29
      • 2021-06-17
      • 2021-07-31
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多