今回は、JavaでMidiを扱うための実装をしていきます。やはり、初めにハローワールドをやります。これにより基本的な情報を集めます。
具体的に
<作成したテストコード>
private void printInfo(MidiDevice.Info info) { System.out.println("*** Name ***"); System.out.println(info.getName()); System.out.println("*** Vendor ***"); System.out.println(info.getVendor()); System.out.println("*** Description ***"); System.out.println(info.getDescription()); } @Test public void testMidiCreator() { MidiDevice.Info[] infos = MidiSystem.getMidiDeviceInfo(); int i = 0; for (MidiDevice.Info inf : infos) { System.out.println("*** Info" + i + " ***"); printInfo(inf); i++; } System.out.println("// シーケンサ"); // シーケンサー printInfo(target.getSeq().getDeviceInfo()); System.out.println("// シンセサイザ"); // シンセサイザ printInfo(target.getSynth().getDeviceInfo()); }
<テスト対象クラス(実装するクラス)>
private Sequencer seq; private Transmitter seqTrans; private Synthesizer synth; private Receiver synthRcvr; /** コンストラクタ */ public MidiCreator() { try { seq = MidiSystem.getSequencer(); seqTrans = seq.getTransmitter(); synth = MidiSystem.getSynthesizer(); synthRcvr = synth.getReceiver(); seqTrans.setReceiver(synthRcvr); } catch (MidiUnavailableException e) { e.printStackTrace(); // handle or throw exception } } /** ゲッターとセッターは省略します */
そして、実行結果
////// init ////// *** Info0 *** *** Name *** Gervill *** Vendor *** OpenJDK *** Description *** Software MIDI Synthesizer *** Info1 *** *** Name *** Real Time Sequencer *** Vendor *** Oracle Corporation *** Description *** Software sequencer // シーケンサ *** Name *** Real Time Sequencer *** Vendor *** Oracle Corporation *** Description *** Software sequencer // シンセサイザ *** Name *** Gervill *** Vendor *** OpenJDK *** Description *** Software MIDI Synthesizer
これはコンソールに出力した結果です。
そして実行画像は下にあります。
これは、Microbitからのメッセージを受けてMIDI音源を鳴らすための仕組みづくりの一環です。
作成したコードはGithubにアップしています。
ちなみに、MIDIを再生する順序は以下のようになります。
MIDIの再生
- デバイスを読み込む
MidiSystem.getSequencer();
- Midiファイル(*.midなど)を読み込む
new File("midiファイルへのパス");
- 再生するデバイスにシーケンス(MIDIファイル)をセット
Sequence mySeq = MidiSystem.getSequence(midi); seq.setSequence(mySeq);
- 再生処理
seq.start();
- 再生する時間分処理を停止する
Thread.sleep(10000);
- 再生処理を停止する
seq.stop();
こんな感じです。
実際に処理が動いて音がなるとわかっていても感動するものがあります。
でわでわ。。。