CMXチュートリアル

SPフレームワークの使い方

サンプルプログラムの作成を通してSPフレームワークの使用方法を解説する。

  1. 仮想キーボードを作る
  2. SPモジュールを作る
  3. SPExecutorを作る
  4. SPモジュールを登録する
  5. SPモジュールを繋ぐ
  6. 実行

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モジュールを作る

次に必要なSPモジュールを用意する。今回はMIDI入力を受け取るMidiInputModuleとメッセージを受け取って音を鳴らすMidiOutModuleを使う。

      // SPモジュール
      MidiInputModule mi = new MidiInputModule(vk);
      MidiOutputModule mo = new MidiOutputModule(MidiSystem.getReceiver());

MidiInputModuleはコンストラクタでMidiDeviceを要求するので先に作ったVirtualKeyboardを渡す。MidiOutputModuleにはReceiverを指定する必要があるのでデフォルトのレシーバーを渡す。それぞれ、外部デバイスを使用する場合は適宜変更する。

SPExecutorを作る

SPフレームワークを動作させるためにはSPExecutorが必要になる。SPExecutorは複数のSPモジュールを保持し、それらの実行を管理する。

      // SPExecutor
      SPExecutor sp = new SPExecutor();

コンストラクタにはパラメータと流れるデータの次元数を指定する。今回はパラメータは不要で次元数は1を指定する。(コンストラクタには引数は与えない仕様に変更されました.)

SPモジュールを登録する

用意したSPモジュールはSPExecutorに登録する必要がある。

      // SPExecutorにモジュールを登録する
      sp.addSPModule(mi);
      sp.addSPModule(mo);

addSPModuleに作成したSPモジュールを指定する。

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は他にも、終了用オブジェクトを流す事で処理を終了させる事も出来る。

CmxTutorial.java
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);
  }
}