我曾尝试编写一个以MIDI格式(C2,A4,Bb6)录制音符的功能,并以赫兹为单位返回各自的频率。我不确定这样做的最佳方法是什么。我在两种方法之间挣扎。 1)一个基于列表的列表,我可以打开输入并返回硬编码的频率值,因为我可能只需要为88个音符执行此操作(在三角钢琴的情况下)。 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;
答案 1 :(得分:1)