では実際にテンポ指定をしてシーケンスを演奏するコードを書いていきます。
実装
まずシーケンスを作ります。解像度は480にしてあります。
int resolution = 480; Sequence sequence = new Sequence(Sequence.PPQ, resolution);
トラックを作ります。
Track track; track = sequence.createTrack();
テンポを指定しています。ここではBPM120でシーケンスの一番最初、tickが0のところにイベントを設定します。あとでテンポを変更する場合にはこの変数tempoを任意に変更してください。
double tempo = 120; track.add(new MidiEvent(getTempoMessage(tempo), 0));
以下演奏のイベントを指定します。今回はCメジャーの分散和音を四分音符で演奏するようにします。MIDIノート番号は60, 64, 67, 72です。
一般にメタメッセージを最初のトラックにおいて演奏用のトラックとは分けることが多いようです。このためここでも演奏用のトラックを作っています。演奏開始位置は2小節目つまり4拍先にします。
track = sequence.createTrack(); long current = resolution * 4;
for文で分散和音を4回演奏するようにしています。
for (int i = 0; i < 4; i++) { track.add(new MidiEvent(new ShortMessage(ShortMessage.NOTE_ON, 0, 60, 127), current)); current += resolution; track.add(new MidiEvent(new ShortMessage(ShortMessage.NOTE_ON, 0, 60, 0), current)); track.add(new MidiEvent(new ShortMessage(ShortMessage.NOTE_ON, 0, 64, 127), current)); current += resolution; track.add(new MidiEvent(new ShortMessage(ShortMessage.NOTE_ON, 0, 64, 0), current)); track.add(new MidiEvent(new ShortMessage(ShortMessage.NOTE_ON, 0, 67, 127), current)); current += resolution; track.add(new MidiEvent(new ShortMessage(ShortMessage.NOTE_ON, 0, 67, 0), current)); track.add(new MidiEvent(new ShortMessage(ShortMessage.NOTE_ON, 0, 72, 127), current)); current += resolution; track.add(new MidiEvent(new ShortMessage(ShortMessage.NOTE_ON, 0, 72, 0), current)); }
最後に出力先を取得してMIDI演奏を開始します。この辺りは以前の記事に詳しく書いてあります。
Synthesizer synthesizer = MidiSystem.getSynthesizer(); synthesizer.open(); Receiver receiver = synthesizer.getReceiver(); playMidi(sequence, receiver);