ではコードを作るにあたり使う音を抜き出して見ましょう。
使う音をリストアップする
リストにはフレーズの8音全てを書いているわけではありません。全てのフレーズで共通ですがフレーズの2、6番目は同じ音ですし、3、57番目は同じです。8番目は2番目と基本的に同じなのですが4小節目の最後の音がG3になるべきところがF#と不規則になっているので注意しておきます。楽曲的には次の小節でE3に行くための経過音なのでこれはこれで重要な変化です。
以下の表で小節番号はJavaのコードに合わせて0ベースにしています。国際式の音名表記とMIDIのノート番号の両方を書いていますが譜面から直接ノート番号を読み取れるように訓練すると色々便利です。上記の不規則がなければ1フレーズ4つの音で作れたところですがこの対応のため1フレーズ5つの音で作ることにします。
0小節目 | G2 / 43 | D3 / 50 | B3 / 59 | A3 / 57 | D3 / 50 |
---|---|---|---|---|---|
1小節目 | G2 / 43 | E3 / 52 | C4 / 60 | B3 / 59 | E3 / 52 |
2小節目 | G2 / 43 | F#3 / 54 | C4 / 60 | B3 / 59 | F#3 / 54 |
3小節目 | G2 / 43 | G3 / 55 | B3 / 59 | A3 / 57 | F#3 / 54 |
上記の音のリストを二次元配列にしました。
int[][] notes = new int[][]{ new int[]{43, 50, 59, 57, 50}, new int[]{43, 52, 60, 59, 52}, new int[]{43, 54, 60, 59, 54}, new int[]{43, 55, 59, 57, 54} };
実装
まずシーケンスを作ります。解像度は一般的な480にしてあります。
int resolution = 480; Sequence sequence = new Sequence(Sequence.PPQ, resolution);
トラックを作ります。最初のトラックはコンダクタートラックとして使うようにして演奏情報のためには使いません。ここではテンポを設定するようにしています。
JavaとMIDI:シーケンスにテンポを設定する(1)
JavaとMIDI:シーケンスにテンポを設定する(2)
Track track; track = sequence.createTrack(); double tempo = 65; track.add(new MidiEvent(getTempoMessage(tempo), 0));
時間情報を管理するクラスのインスタンスを作ります。初期値に解像度と4拍子であることを設定します。
MidiTimeSign timeSign = new MidiTimeSign(resolution, 4.0);
演奏用のトラックを作ります。音色を呼び出しておきます。チェロのプログラム番号はGMで43番ですが0ベースに読み替えて42を指定します。最初の二つの引数は0小節目の0拍目、サウンドバンクは使わないので次の二つの引数も0二つ、最後にプログラムチェンジの42を指定します。
JavaとMIDI:音色を変更する(1)
JavaとMIDI:音色を変更する(2)
JavaとMIDI:音色を変更する(3)
TrackEditor te1 = new TrackEditor(timeSign, sequence.createTrack(), 0); te1.setProgram(0, 0, 0, 0, 42);
次は演奏情報を設定していきます。