MIDIで楽曲を演奏するにあたって今までは全ての音をノート番号で指定していました。しかし人が演奏するときには音についてもう少し理解して演奏しています。
音階について
調性はほとんどの曲で意識されるものです。例えばハ長調、Cメジャーの曲であれば使う音はC、D、E、F、G、A、Bです。簡単な曲であればこの7つの音で表現できます。このまとまりを音階 scaleといいます。この例は長音階、ダイアトニックスケール、アイオニアン(イオニアン)スケールなどと呼ばれています。
音程について
それぞれの音は音程 intervalと呼ばれて「度」で表現します。最初の音を「一度」ここではCを指します。ハ長調では以下のようになります。音程差は基本となるCからの半音の数になります。
音名 | C | D | E | F | G | A | B |
---|---|---|---|---|---|---|---|
音程の名前(和名) | 一度 | 二度 | 三度 | 四度 | 五度 | 六度 | 七度 |
音程の名前(英語) | unison | second | third | fourth | fifth | sixth | seventh |
音程差 | 0 | 2 | 4 | 5 | 7 | 9 | 11 |
ここでも0ベースか1ベースかの違いが出てきます。音楽用語では同じ音程を一度からつまり1から数え始めます。実際のところ基準となる音からの音程差は0です。この数の数え方の違いがいろいろ混乱を起こします。
プログラムを書くときには音楽用語の数え方に反しますが0ベースにします。このインターバルをプログラムで書くと以下のようになります。
int[] intervals = new int[]{0, 2, 4, 5, 7, 9, 11};
for文で繰り返すと音階を作ることがきます。中央のドはノート番号60なのでこれを使って実際のMIDIノートを出力します。
int[] intervals = new int[]{0, 2, 4, 5, 7, 9, 11}; for(int interval:intervals){ System.out.println(60 + interval); }
実行結果は以下の通りです。
60 62 64 65 67 69 71
この値をシーケンスに設定していくと音階を演奏することができます。またさらには音階よりももっと複雑なメロディを作ることもできるようになるでしょう。
通常のシーケンスアプリケーションでは演奏された結果と等しい音を並べていくだけですがプログラムを使うことによって演奏する前の楽曲の考え方の部分まで踏み込むことができます。ここからしばらくは少し楽曲の構造に近い部分をJavaを使って実装していきたいと思います。