SMF スタンダードMIDIファイルをJavaで演奏します。前回は以下の3以降を実装しました。
- 音源を出力先として取得
- SMFをシーケンスとして取得
- シーケンサーを取得
- シーケンサーにシーケンスを設定
- シーケンサーに音源の出力先を設定
- シーケンサーを開始する
今回は1と2を実装します。
音源の取得
音源の出力先はふた通りの方法があります。一つはJavaデフォルトのシンセサイザー音源を利用する方法、他は環境上にある音源を利用する方法です。
デフォルトのシンセサイザー音源を利用する方法
Javaと同時にインストールと同時に配置されるのでどの環境でも利用することができます。ただ音質としては最低限のものなので他の音源を持っている場合は下の方法も試してください。
Synthesizer synthesizer = MidiSystem.getSynthesizer(); synthesizer.open(); Receiver receiver = synthesizer.getReceiver();
環境上にある音源を利用する方法
環境上にあるものであれば音源として使えます。まずは環境上にどのような音源があるか確認してください。
またデバイスを取得するには以下のようにします。例では”ARIA”という文字列を含む出力用デバイスを取得するようにしています。
MidiDevice[] devices = getMidiDevices("ARIA", true);
if(devices.length == 0){
throw new IllegalStateException("cannot find device");
}
devices[0].open();
Receiver receiver = devices[0].getReceiver();
シーケンスの取得
SMF形式のファイルから取得する方法のほか自前で作る方法もあります。
SMF形式のファイルからシーケンスを取得する方法
拡張子が.midのファイルを開くには以下のようにします。
Sequence sequence = MidiSystem.getSequence(new File("midi/test.mid"));
シーケンスを自前で作る方法
以前シーケンスを自前で作りました。こちらを参考にしてください。
演奏する
ここまできたら前回のメソッドを使って演奏することができます。
playMidi(sequence, receiver);
ソース
デフォルトのシンセサイザー音源でSMFファイルを演奏する実装になっています。
import java.io.File;
import javax.sound.midi.InvalidMidiDataException;
import javax.sound.midi.MidiSystem;
import javax.sound.midi.MidiUnavailableException;
import javax.sound.midi.Receiver;
import javax.sound.midi.Sequence;
import javax.sound.midi.Sequencer;
import javax.sound.midi.Synthesizer;
import javax.sound.midi.Transmitter;
public class MidiPlayTest {
public static void main(String[] args) throws Exception {
Synthesizer synthesizer = MidiSystem.getSynthesizer();
synthesizer.open();
Receiver receiver = synthesizer.getReceiver();
Sequence sequence = MidiSystem.getSequence(new File("midi/test.mid"));
playMidi(sequence, receiver);
}
public static void playMidi(Sequence sequence, Receiver receiver) {
Sequencer sequencer;
try {
sequencer = MidiSystem.getSequencer(false);
} catch (MidiUnavailableException e) {
throw new IllegalStateException(e);
}
if (sequencer == null) {
throw new IllegalStateException("can't get a Sequencer");
}
try {
sequencer.open();
} catch (MidiUnavailableException e) {
throw new IllegalStateException(e);
}
try {
sequencer.setSequence(sequence);
} catch (InvalidMidiDataException e) {
throw new IllegalStateException(e);
}
Transmitter seqTransmitter;
try {
seqTransmitter = sequencer.getTransmitter();
} catch (MidiUnavailableException e) {
throw new IllegalStateException(e);
}
seqTransmitter.setReceiver(receiver);
System.out.println("start");
sequencer.start();
}
}