サンプルプログラムの作成を通してSPフレームワークの使用方法を解説する。
SPは流れるデータと処理するモジュールの繋がりで構成される。
ここでは、MidiDeviceからMidiMessageを受け取るMidiInputModuleと受け取ったMidiMessageを鳴らすMidiOutputModuleを用いる。
まず、MidiInputModuleにメッセージを送信するためのMidiDeviceを用意する。通常、USB端子等から入力できる専用のハードウェアを用いるが、ここではそれを仮想的に実現するVirtualKeyboardクラスを用いる。
import javax.sound.midi.MidiSystem; import jp.crestmuse.cmx.amusaj.sp.MidiInputModule; import jp.crestmuse.cmx.amusaj.sp.MidiOutputModule; import jp.crestmuse.cmx.amusaj.sp.SPExecutor; import jp.crestmuse.cmx.sound.VirtualKeyboard; public class CmxTutorial { public static void main(String[] args) { try { // 仮想キーボード VirtualKeyboard vk = new VirtualKeyboard(); vk.setVisible(true);
VirtualKeyboardはJFrameを継承しているので、setVisibleでウィンドウが現れる。このウィンドウに対してキーイベントを送信するとMIDIイベントが発生する。
次に必要なSPモジュールを用意する。今回はMIDI入力を受け取るMidiInputModuleとメッセージを受け取って音を鳴らすMidiOutModuleを使う。
// SPモジュール MidiInputModule mi = new MidiInputModule(vk); MidiOutputModule mo = new MidiOutputModule(MidiSystem.getReceiver());
MidiInputModuleはコンストラクタでMidiDeviceを要求するので先に作ったVirtualKeyboardを渡す。MidiOutputModuleにはReceiverを指定する必要があるのでデフォルトのレシーバーを渡す。それぞれ、外部デバイスを使用する場合は適宜変更する。
SPフレームワークを動作させるためにはSPExecutorが必要になる。SPExecutorは複数のSPモジュールを保持し、それらの実行を管理する。
// SPExecutor SPExecutor sp = new SPExecutor();
コンストラクタにはパラメータと流れるデータの次元数を指定する。今回はパラメータは不要で次元数は1を指定する。(コンストラクタには引数は与えない仕様に変更されました.)
用意したSPモジュールはSPExecutorに登録する必要がある。
// SPExecutorにモジュールを登録する
sp.addSPModule(mi);
sp.addSPModule(mo);
addSPModuleに作成したSPモジュールを指定する。
登録したSPモジュールは処理を実行する順に繋ぐ。
// モジュールを繋ぐ sp.connect(mi, 0, mo, 0);
MidiInputModuleからの出力をMidiOutputModuleの入力に繋ぐ。第二、第四引数はそれぞれのモジュールのチャンネル番号を指定する。この場合両方0を指定する。
用意ができたらSPExecutorを実行する。
sp.start();
startメソッドを呼び出すとSPExecutorは処理を開始する。SPExecutorの実行は別スレッドで行われるため、startメソッドはすぐに呼び出し側に処理を返す。SPExecutorを安全に終了させるためにはstopメソッドを呼び出す。
// 終了 System.in.read(); sp.stop(); } catch (Exception e) { e.printStackTrace(); } System.exit(0); } }
標準入力で処理をブロックし、SPExecutorを終了させる。SPExecutorは他にも、終了用オブジェクトを流す事で処理を終了させる事も出来る。
import javax.sound.midi.MidiSystem; import jp.crestmuse.cmx.amusaj.sp.MidiInputModule; import jp.crestmuse.cmx.amusaj.sp.MidiOutputModule; import jp.crestmuse.cmx.amusaj.sp.SPExecutor; import jp.crestmuse.cmx.sound.VirtualKeyboard; public class CmxTutorial { public static void main(String[] args) { try { // 仮想キーボード VirtualKeyboard vk = new VirtualKeyboard(); vk.setVisible(true); // SPモジュール MidiInputModule mi = new MidiInputModule(vk); MidiOutputModule mo = new MidiOutputModule(MidiSystem.getReceiver()); // SPExecutor SPExecutor sp = new SPExecutor(); // SPExecutorにモジュールを登録する sp.addSPModule(mi); sp.addSPModule(mo); // モジュールを繋ぐ sp.connect(mi, 0, mo, 0); sp.start(); // 終了 System.in.read(); sp.stop(); } catch (Exception e) { e.printStackTrace(); } System.exit(0); } }