2015-08-23 55 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數據。

相關問題