2015-08-23 25 views
-6

我试图编写一个函数,它以MIDI形式(C2,A4,Bb6)记录音符并以赫兹为单位返回它们各自的频率。我不确定这样做的最佳方法是什么。我在两种方法之间撕裂。 1)基于一个列表,我可以打开一个输入并返回硬编码的频率值,因为我可能只需要为88个音符(在大钢琴情况下)执行此操作。 2)一个简单的数学方法,但是我的数学技能是一个限制,以及将输入字符串转换为数值。最终,我一直在研究这一点,并可以使用一些方向。将音符转换为赫兹(iOS)

+5

好主意。去做。你有问题吗? – matt

+0

http://rypress.com/tutorials/objective-c/data-types/nsdictionary –

回答

3

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

为等于 回火规模的音符的频率的基本公式是由

FN给出= F0 *(a)将正

其中

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

n =远离固定音符的半步数。如果你的记录较高,n是正数。如果你在低音上,n是负数。

fn =音符的频率n半步远。 A =(2)1/12 = 2的twelth根=其中,当乘以本身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

+0

这个问题被标记为Objective-C。答案应该以相关语言发布。这将有助于未来对这个问题的搜索,同时寻找Objective-C解决方案。 – rmaddy

+0

哎呀,出于某种原因,我认为这被贴上'ios',而不是'objective-c'。修复了答案。 – NickEntin

1

为什么不使用MIDI pitch

enter image description here

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

相关问题