2012-04-07 10 views
0

私は与えられたオクターブの音符の周波数を決定しようとしています。私の機能は以下の通りで、thisサイトのjavascriptに基づいています。作品を持っているものはすべて見つかりますが、その一部が欠けています。たとえば、B#C-です。より完全な数式を使用するか、すでに使用している数式を調整する必要があります。それとも、私はばかだ、とB#などのようなものはない? C.シャープベースノートより半音高い移動し、フラットベースノートよりも低い半音を行くよう音符の周波数を決定する方法は?

- (int)getNoteNumber:(NSString*)note 
{ 
    note = [note uppercaseString]; 
    DLog(@"%@", note); 

    if ([note isEqualToString:@"A"]) 
     return 0; 
    else if ([note isEqualToString:@"A#"] || [note isEqualToString:@"B-"]) 
     return 1; 
    else if ([note isEqualToString:@"B"]) 
     return 2; 
    else if ([note isEqualToString:@"C"]) 
     return 3; 
    else if ([note isEqualToString:@"C#"] || [note isEqualToString:@"D-"]) 
     return 4; 
    else if ([note isEqualToString:@"D"]) 
     return 5; 
    else if ([note isEqualToString:@"D#"] || [note isEqualToString:@"E-"]) 
     return 6; 
    else if ([note isEqualToString:@"E"]) 
     return 7; 
    else if ([note isEqualToString:@"F"]) 
     return 8; 
    else if ([note isEqualToString:@"F#"] || [note isEqualToString:@"G-"]) 
     return 9; 
    else if ([note isEqualToString:@"G"]) 
     return 10; 
    else if ([note isEqualToString:@"G#"]) 
     return 11; 
} 

- (void)setFreq:(int)note 
{ 
    float a = powf(2, self.octive); 
    float b = powf(1.059463, note); 
    float freq = roundf((275.0 * a * b)/10); 
    self.toneGen.frequency = freq; 
} 
+2

B#のようなものがありますが、[均等チューニング](http://en.wikipedia.org/wiki/Equal_temperament)では、Cと同じことです。 –

+0

@OliCharlesworth - ピアノになりますか平等な人ですか?私はそれが私がスケールを取得しようとしているものだと思う。私はBASICから古い[PLAY](http://www.antonis.de/qbebooks/gwbasman/index.html)コマンドを再現しようとしています。 – Justin808

+0

ピアノは幾分ユニークですが、これは等気質の近似値です(http://en.wikipedia.org/wiki/Piano_key_frequenciesを参照)。しかし、あなたの目的のために、あなたが使った式はうまくいくはずです。 –

答えて

0

B#が同じ音です。たとえば、E#はFと同じです。C flatはBと同じものです。

+0

これは均等な気質の場合にのみ当てはまります(幸いにも、OPが興味を持っているようです)。 –

関連する問題