実装の続きです。
左側小節の実装
実装内容は以下の8音でフレーズを設定した後音程を1ずつ増やして14回繰り返すのでした。
1. 基準 | 60 | 60 | 60 | 60 | 60 | 60 | 60 | 60 |
---|---|---|---|---|---|---|---|---|
2. オクターブ | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
3. 音程 | 0 | 2 | 3 | 4 | 5 | 4 | 3 | 2 |
出力ノート番号 | 60 | 64 | 65 | 67 | 69 | 67 | 65 | 64 |
小節は変数measureで管理し、1フレーズ演奏するごとにインクリメントします。intの配列を作り8音を順次設定していきます。音程部分は繰り返されるごとに数が増えるようにしています。
int measuer = 1; for (int i = 0; i < 14; i++) { int[] notes = new int[]{ scale.note(60, 0, 0 + i), scale.note(60, 0, 2 + i), scale.note(60, 0, 3 + i), scale.note(60, 0, 4 + i), scale.note(60, 0, 5 + i), scale.note(60, 0, 4 + i), scale.note(60, 0, 3 + i), scale.note(60, 0, 2 + i),}; pe1.playPhrase(measuer++, 0, notes); }
右側小節の実装
次に右側です。こちらも同様ですが15回繰り返すことと繰り返しごとに下がっていくことに注意してください。
1. 基準 | 60 | 60 | 60 | 60 | 60 | 60 | 60 | 60 |
---|---|---|---|---|---|---|---|---|
2. オクターブ | 2 | 2 | 2 | 2 | 2 | 2 | 2 | 2 |
3. 音程 | 4 | 2 | 1 | 0 | -1 | 0 | 1 | 2 |
出力ノート番号 | 91 | 88 | 86 | 84 | 83 | 84 | 86 | 88 |
for (int i = 0; i < 15; i++) { int[] notes = new int[]{ scale.note(60, 2, 4 - i), scale.note(60, 2, 2 - i), scale.note(60, 2, 1 - i), scale.note(60, 2, 0 - i), scale.note(60, 2, -1 - i), scale.note(60, 2, 0 - i), scale.note(60, 2, 1 - i), scale.note(60, 2, 2 - i),}; pe1.playPhrase(measuer++, 0, notes); }
終端の設定と演奏処理
最後の1音は開始の音と同じです。
PhraseEditor pe2 = new PhraseEditor(se) { @Override public void playPhrase(int[] notes) { play(0, 0.00, 0, notes[0], 100, 2); } }; pe2.playPhrase(measuer++, 0, scale.note(60, 0, 0));
演奏処理です。ここは以前作ったメソッドを再利用しています。
Synthesizer synthesizer = MidiSystem.getSynthesizer(); synthesizer.open(); Receiver receiver = synthesizer.getReceiver(); playMidi(se.getSequence(), receiver);
実行結果
実行した結果は動画にしてあります。今回も外部音源Personal Orhchestra 5を利用しています。
ソース
今回のソースです。
import javax.sound.midi.MidiSystem; import javax.sound.midi.MidiUnavailableException; import javax.sound.midi.Receiver; import javax.sound.midi.Synthesizer; import static mocha.sound.midi.MidiUtil.playMidi; import mocha.sound.midi.PhraseEditor; import mocha.sound.midi.SequenceEditor; import mocha.sound.note.Scale; /* * mocha-java.com * */ public class HanonExercise1 { public static void main(String[] args) throws MidiUnavailableException { Scale scale = new Scale(0, 2, 4, 5, 7, 9, 11); double tempo = 80; SequenceEditor se = new SequenceEditor(1, 2, tempo); se.getTrackEditor(0).setProgram(0, 0, 0, 0, 73); PhraseEditor pe1 = new PhraseEditor(se) { @Override public void playPhrase(int[] notes) { play(0, 0.00, 0, notes[0], 100, 0.25); play(0, 0.25, 0, notes[1], 90, 0.25); play(0, 0.50, 0, notes[2], 80, 0.25); play(0, 0.75, 0, notes[3], 80, 0.25); play(0, 1.00, 0, notes[4], 80, 0.2); play(0, 1.25, 0, notes[5], 70, 0.2); play(0, 1.50, 0, notes[6], 70, 0.2); play(0, 1.75, 0, notes[7], 70, 0.2); } }; PhraseEditor pe2 = new PhraseEditor(se) { @Override public void playPhrase(int[] notes) { play(0, 0.00, 0, notes[0], 100, 2); } }; int measuer = 1; for (int i = 0; i < 14; i++) { int[] notes = new int[]{ scale.note(60, 0, 0 + i), scale.note(60, 0, 2 + i), scale.note(60, 0, 3 + i), scale.note(60, 0, 4 + i), scale.note(60, 0, 5 + i), scale.note(60, 0, 4 + i), scale.note(60, 0, 3 + i), scale.note(60, 0, 2 + i),}; pe1.playPhrase(measuer++, 0, notes); } for (int i = 0; i < 15; i++) { int[] notes = new int[]{ scale.note(60, 2, 4 - i), scale.note(60, 2, 2 - i), scale.note(60, 2, 1 - i), scale.note(60, 2, 0 - i), scale.note(60, 2, -1 - i), scale.note(60, 2, 0 - i), scale.note(60, 2, 1 - i), scale.note(60, 2, 2 - i),}; pe1.playPhrase(measuer++, 0, notes); } pe2.playPhrase(measuer++, 0, scale.note(60, 0, 0)); //MidiDevice aria = MidiUtil.getMidiDevices("ARIA", true)[0]; //aria.open(); //Receiver receiver = aria.getReceiver(); Synthesizer synthesizer = MidiSystem.getSynthesizer(); synthesizer.open(); Receiver receiver = synthesizer.getReceiver(); playMidi(se.getSequence(), receiver); } }