Javaで平均律の周波数を求める

スポンサーリンク

前回はドミソの和音を鳴らしました。でもこのとき周波数は他から持ってきた数字をそのまま書いていました。今回はどの音でも自由に鳴らせるように周波数は自前で計算します。

Java複数のサイン波を同時に鳴らす(3)

平均律についてのおさらい

平均律については依然に説明しました。

調律の話(1)
調律の話(2)

平均律は1オクターブに12の音があると想定してその関係を、全ての比率を同じにしたものです。半音、つまり隣同士の音の比率はオクターブの比率2の12乗根(ルート12)になります。逆にいうと半音の比率xを12回かけると2になるような比率xが平均律での基本的な数字になります。

音の高さの指定方法

音の高さには便宜的にドレミとかCDEとかハニホなど名前をつけていますがこのままではプログラムではなかなか使いにくいです。

楽器間の通信の規格MIDIでは音の高さを数字で表しているのでこれを利用しましょう。

  • 一番真ん中のドが60
  • オクターブ上になると12を足す
  • オクターブ下になると12を引く

12音の平均律は1オクターブに12音の半音の音程があるので1オクターブ上のドにいくには12半音移動し72になります。下のドは48ですしそのさらに下のドは36になります。

MIDIの規格では音の高さに7ビットを当てています。つまり0〜127までの数字が使えます。

通常の楽器のなかで一番音域の広い楽器はピアノです。その一番低い音は真ん中のドから3オクターブ下の度から3半音降ったラでMIDIの番号では21です。上は4オクターブ上のドでMIDIの番号は108です。ピアノを触ったことのある人ならわかると思いますがあまり下の方の音や上の方の音は通常使いません。だいたい真ん中のドから上下2オクターブもあればほとんどの簡単な曲は弾けるものです。

以前ラの音は440であることを話しましたがこれは真ん中のドから9半音上のラのことでMIDIで69になります。この音を基準として周波数を求めることにします。

1半音上の場合は上記比率xを440にかけます。2半音上の場合には比率xの2乗を440にかけます。1音下の場合には比率xの-1乗を440にかける、つまり440を比率xで割ることになります。

Javaで計算式を作る

まず定数を決めておきます。

public static double NOTES_IN_OCTAVE = 12;
public static double FREQUENCY_A = 440;
public static double NOTE_NUMBER_A = 69;

ここでの定数を元に計算します。

public static double getFreq(double noteNumber) {
  return Math.pow(2d, (noteNumber - NOTE_NUMBER_A) / NOTES_IN_OCTAVE) * FREQUENCY_A;
}

例えば古楽では440Hzよりもっと低い音で調律していました。これは当時はステンレスの弦を作る技術はなく必然と張力の弱い弦を使っていたことからも推測できます。

ドミソを計算する

ではドミソそれぞれの周波数を計算します。真ん中のドはMIDIで60、ミは4半音上で64、ソはさらに3半音上で67になります。

System.out.println(getFreq(60));
System.out.println(getFreq(64));
System.out.println(getFreq(67));

結果は以下の通りです。

261.6255653005986
329.6275569128699
391.99543598174927
スポンサーリンク

シェアする

  • このエントリーをはてなブックマークに追加

フォローする

%d人のブロガーが「いいね」をつけました。