将Notes转换为Hertz(iOS)

时间:2015-08-23 03:37:51

标签: objective-c midi

我曾尝试编写一个以MIDI格式(C2,A4,Bb6)录制音符的功能,并以赫兹为单位返回各自的频率。我不确定这样做的最佳方法是什么。我在两种方法之间挣扎。 1)一个基于列表的列表,我可以打开输入并返回硬编码的频率值,因为我可能只需要为88个音符执行此操作(在三角钢琴的情况下)。 2)一个简单的数学方法,但我的数学技能是一个限制,以及将输入字符串转换为数值。最终我已经在这方面工作了一段时间,并且可以使用一些方向。

2 个答案:

答案 0 :(得分:3)

您可以使用基于此公式的函数:

  

等于音符的频率的基本公式   

给出了韵律比例      

fn = f0 *(a)n

     

,其中

     

f0 =必须定义的一个固定音符的频率。常见的选择是将A设置在中间C(A4)上,f0 = 440 Hz。

     

n =离固定音符半步的数量。如果你有更高的音符,则n是正数。如果你是低音,则n为负数。

     

fn =音符的频率n半步之遥。 a =(2)1/12 = 2的第二根=与自身相乘的次数12次等于2 = 1.059463094359 ...

http://www.phy.mtu.edu/~suits/NoteFreqCalcs.html

在Objective-C中,这将是:

+ (double)frequencyForNote:(Note)note withModifier:(Modifier)modifier inOctave:(int)octave {
    int halfStepsFromA4 = note - A;
    halfStepsFromA4 += 12 * (octave - 4);
    halfStepsFromA4 += modifier;

    double frequencyOfA4 = 440.0;
    double a = 1.059463094359;

    return frequencyOfA4 * pow(a, halfStepsFromA4);
}

定义了以下枚举:

typedef enum : int {
    C = 0,
    D = 2,
    E = 4,
    F = 5,
    G = 7,
    A = 9,
    B = 11,
} Note;

typedef enum : int {
    None = 0,
    Sharp = 1,
    Flat = -1,
} Modifier;

https://gist.github.com/NickEntin/32c37e3d31724b229696

答案 1 :(得分:1)

为什么不使用MIDI pitch

enter image description here

其中f是频率,d是MIDI数据。