ねこでじ(Nekodigi)

Nekodigi’s diary

学習中の気づきをまとめています。応援よろしくお願いします

【Processing】Midiデータを再生して、押されているキーを表示する。

成果物

www.youtube.com
ProcessingでどうやってMidiファイルを扱うのかが長年の謎だったのですが、標準ライブラリを使ってMidiデータが扱えることがわかりました。再生速度などをいちいち考慮しないといけないと思っていたのですが、Sequencerを使って簡単に再生出来ることが分かったので、一旦投稿します。機能を盛り込もうかと思いましたが、既出のネタだったので、分かりやすさ重視でコンパクトに収めておきます。

仕組み

今回のプログラムは、こちらのプログラムの最重要部分を抽出したものです。詳細を知りたい方はこちらをご覧ください。
github.com
まず。Sequencerを作成し、
Sequencer sequencer = MidiSystem.getSequencer();
midiFileを指定します。
sequencer.setSequence(MidiSystem.getSequence(midiFile));
Sequencerをアクセス可能にします。
sequencer.open();
どのキーが押されたか取得するために独自でReceiverを拡張したクラスを作成します。そして、Transmitterを使って、Receiverに転送します。
Receiver receiver = new myListener();
Transmitter transmitter = sequencer.getTransmitter();
transmitter.setReceiver(receiver);
あとは、再生するだけです。
sequencer.start();
曲が終わったあとは、stop() close()を行う必要があります。詳しくはコードをご覧ください。

コード

Simple_Midi_File_Testという名前で追加しています。
github.com
Public Domainですが、一応音源のリンクを張っておきます。
Music Listing - without preview images