前回の続きで演奏部分の実装をします。
演奏情報
ノート番号の一覧は以下の通り設定していました。
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} };
ノート番号を使う順序をまとめました。変数iはfor文で使われるもので0から3の変数になります。
for (int i = 0; i < notes.length; i++) {
小節 | 拍 | ノート | ベロシティ | 長さ |
i + 1 | 0 | notes[i][0] | 100 | 0.3 |
i + 1 | 0.25 | notes[i][1] | 90 | 0.3 |
i + 1 | 0.5 | notes[i][2] | 90 | 0.28 |
i + 1 | 0.75 | notes[i][3] | 80 | 0.28 |
i + 1 | 1 | notes[i][2] | 90 | 0.13 |
i + 1 | 1.25 | notes[i][2] | 70 | 0.18 |
i + 1 | 1.5 | notes[i][1] | 70 | 0.15 |
i + 1 | 1.75 | notes[i][1] | 60 | 0.15 |
i + 1 | 2 | notes[i][0] | 100 | 0.3 |
i + 1 | 2.25 | notes[i][1] | 90 | 0.3 |
i + 1 | 2.5 | notes[i][2] | 90 | 0.28 |
i + 1 | 2.75 | notes[i][3] | 80 | 0.28 |
i + 1 | 3 | notes[i][2] | 90 | 0.13 |
i + 1 | 3.25 | notes[i][1] | 70 | 0.18 |
i + 1 | 3.5 | notes[i][2] | 70 | 0.15 |
i + 1 | 3.75 | notes[i][4] | 60 | 0.15 |
シーケンスでは通常0小節目には演奏情報をいれないため小節の指定は変数iに1を足しています。十六分音符は四分音符を1とした場合0.25の長さなので拍の指定は0.25ずつずらして指定していきます。
ベロシティと長さは聴きながら調整していきます。上のものは調整した結果を書きました。拍の頭のベロシティは大きめにしました。
長さは最初の4つはレガートを強調しています。十六分音符の長さが通常0.25であるところを0.3にするということは前の音の最後は次の音と少し重なることを意味しています。後半は逆に短くすることで対比をつけました。
実装
上記の想定を元に実装しました。
for (int i = 0; i < notes.length; i++) { int m = i + 1; te1.play(m, 0.00, notes[i][0], 100, 0.3); te1.play(m, 0.25, notes[i][1], 90, 0.3); te1.play(m, 0.50, notes[i][2], 90, 0.28); te1.play(m, 0.75, notes[i][3], 80, 0.28); te1.play(m, 1.00, notes[i][2], 90, 0.13); te1.play(m, 1.25, notes[i][1], 70, 0.18); te1.play(m, 1.50, notes[i][2], 70, 0.15); te1.play(m, 1.75, notes[i][1], 60, 0.15); te1.play(m, 2.00, notes[i][0], 100, 0.3); te1.play(m, 2.25, notes[i][1], 90, 0.3); te1.play(m, 2.50, notes[i][2], 90, 0.28); te1.play(m, 2.75, notes[i][3], 80, 0.28); te1.play(m, 3.00, notes[i][2], 90, 0.13); te1.play(m, 3.25, notes[i][1], 70, 0.18); te1.play(m, 3.50, notes[i][2], 70, 0.15); te1.play(m, 3.75, notes[i][4], 60, 0.15); }
この後以下のコードを追加すると演奏が始まります。
Synthesizer synthesizer = MidiSystem.getSynthesizer(); synthesizer.open(); Receiver receiver = synthesizer.getReceiver(); playMidi(sequence, receiver);
次回はもう少しだけ手を入れて完成としたいと思います。