先に紹介したMoMuでのオーディオ処理は、基本的な入出力を肩代わりしてくれるものの、それ以上のことは自前でやらなくてはいけない。実際にもMoMuオーディオは内部的にRemoteIOを呼び出しているだけ。自前でデジタル信号処理を書くのは、お勉強にはイイけど、面倒で難解であることも確か。
一方、MoMuを使うメリットは、同時に用意されたThe Synthesizer Toolkit (STK)を簡単に利用できること。STKはCCARMAを中心に開発されている音響合成ライブラリで、そのクラス・リストを見れば分かるように、基本的なオシレータやフィルタ、エフェクタはもちろんのこと、フィジカル・モデリング系の音源が充実している。Maxな人にはPeRColateという移植ライブラリで有名かもね。
と言う訳で例によってナンチャッテ路線で、MoMu-STKを使ってみよう。まずは「MoMuでオーディオ処理」に示した手順で爆音が出るようにしておく。そして、The Synthesis Toolkit (STK): MoMu ReleaseのサイトからMoMu-STKをダウンロード。その上での手順は以下の通り。ここではTubeBellクラスを用いて、鐘(チューブラー・ベル)を鳴らす。
(1) プロジェクトにMoMu-STK-1.0.0フォルダを追加。
(2) ソースコード(例えば〜ViewController.mm)で、ヘッダをインポートし、定数と鐘のオブジェクトを定義。
#import "mo_audio.h" #import "TubeBell.h" #define SRATE 44100 #define FRAMESIZE 128 #define NUMCHANNELS 2 stk::TubeBell *myBell;
(3) 適切なメソッド(例えばviewDidLoad)でMoMuのオーディオ処理の初期化と開始の後、鐘のインスタンスを生成し、鳴らす。
MoAudio::init(SRATE, FRAMESIZE, NUMCHANNELS ); MoAudio::start(audioCallback, nil); myBell = new stk::TubeBell(); myBell->keyOn();
(4) コールバック関数では、tick()メソッドによって返される値でバッファを満たす。
Float32 *data = buffer; for (int i=0; i<framesize; i++) { Float32 value = 0; if (myBell != nil) value = myBell->tick(); *data++ = value; *data++ = value; }
このようにしてアプリを起動すると鐘が鳴り響くハズ。シミュレータでも実機でもOK。はい、おしまい。
というのも味気ないので、もう少しシンセシスらしいことをしておこう。
まずボタンを作り、Touch DownでplayBell:メソッドを呼び出すようにアクションを定義する。
- (IBAction)playBell:(UIButton *)sender { myBell->keyOn(); }
同じくスライダーを作り、Value ChangedでmodulationChanged:メソッドを呼び出すようにアクションを定義する。
- (IBAction)modulationChanged:(UISlider *)sender { myBell->controlChange(2, sender.value * 127.0); }
これで、ボタンをタップすると鐘が鳴り、スライダーを動かすと鐘の音色が変わる。シンプルながら、これだけでもサンプリング音の再生では難しい音響合成ですね。他にもパラメータは沢山あるので、いろいろとイヂってみてください。
はい、おしまい。