MIDIを作れるJavaアプレットを作っているのだ。
前回でマウスやらキーボードのイベントが拾えるようになったのだ。
しかしそろそろ音が鳴らせないと不安で仕方ないのです。
とりあえず何か操作すれば音が出るようにしてみます。
音を鳴らすために
うまくいくかどうかはわかりませんがマウスを押したときにドの音を鳴らすようにしてみます。
public void mousePressed(MouseEvent e){ try { MidiSystem.getSynthesizer().getChannels()[0].noteOn(60,100); }catch(MidiUnavailableException ex) { } } public void mouseReleased(MouseEvent e){ try { MidiSystem.getSynthesizer().getChannels()[0].noteOff(60,100); }catch(MidiUnavailableException ex) { } }
エラーは出ませんでしたが音も全く鳴りません。
困りました。
いろいろ探してたら「MidiDevice.open()」というのを見つけました。
サブクラスのSynthesizerからも使えるはずです。
使うのは最初の一回だけのようですね。
そんなわけで親玉のMIDIAppletクラスに記述してみます。
public void start(){ // アプレットの実行を開始 doc = new MIDIDocument(); view = new MIDIViewTest(this); try { synthesizer = MidiSystem.getSynthesizer(); }catch(MidiUnavailableException ex) { } try { synthesizer.open(); }catch(MidiUnavailableException ex) { } }
やっぱり鳴りません。おかしいですね。そろそろ鳴っても良いのですが…。
第一前回リスナーをつけたのですが動くかどうかは確かめていませんでした。
確かめるために以下のコードを記述してみます。
public void mousePressed(MouseEvent e){ try { MidiSystem.getSynthesizer().getChannels()[0].noteOn(60,100); }catch(MidiUnavailableException ex) { } System.out.println("pressed"); } public void mouseReleased(MouseEvent e){ try { MidiSystem.getSynthesizer().getChannels()[0].noteOff(60,100); }catch(MidiUnavailableException ex) { } System.out.println("released"); }
これでクリックするたびに文字列が表示されるはずですが、何も起こりません。
なんということでしょう。リスナーが働いていなかったのです!
リスナーを今度こそ動かす
前回でやったのは、とりあえずリスナーとしての体裁を整えただけであって、それを実際に機能させるようなことは一切書いていませんでした。
これでは電源を入れないコンピュータと同じく、あっても何の意味もありません。
ちゃんとリスナーとして働かせます。
addMouseListener(this);
これで先ほどの文字列も表示されるようになり、動いてくれていることがわかりました。
しかしまだ鳴らないというのかしぶといやつめ!
今度こそ音を鳴らすために
MidiSystem.getSynthesizer().というところがちょっと引っかかります。
もしかしたらさっきsynthesizer.open();したのとは違うSynthesizerを使っていたから動かなかったのかもしれません。
MidiSystem.getSynthesizer().をapplet.synthesizer.に変更して改めて実行してみます。
public void mousePressed(MouseEvent e){ applet.synthesizer.getChannels()[0].noteOn(60,100); } public void mouseReleased(MouseEvent e){ applet.synthesizer.getChannels()[0].noteOff(60,100); }
なんかこうすると例外が捕らえきれないそうなのでtry~catchははずしています。本格的に作り始めたら改めて書き直す予定です。
で、実行してみると…。鳴りました!鳴りましたよ!!
これで今後心置きなく音以外の部分も進められるというものです。
では例によって実際のコードを。
鳴った!音!(2.52kilobyte)
要点
- addListenerしないとリスナーは用を成さない。
- 一度MidiSystem.getSynthesizer()で得たSynthesizerを保持しておいて何度も使う。
- MidiChannel.noteOnで音が鳴る。noteOffで音が消える。