ソフトウェアシンセサイザー(8/15更新)




ソフトウェアシンセサイザー製作

ディジタルシンセサイザの製作の準備段階として、ソフトウェアシンセサイザの製作を行っています。
 実は16BitのDSPでディジタルシンセを作りかけて音も出ていたのですが、計算精度が足らず、フィルタの性能がいまひとつだったので、そちらは保留中です


開発日誌


音色作成画面
8/15
一人でやってるとなかなか進みません。そうこうしているうちに市販品にどんどん追い越されていきますが、めげずに進めています。
5/5でも述べたように、内部構造を作り直し、音生成モジュール(発振器など)を、C++のオブジェクトに1:1で対応させるようにしました。なぜ最初からそうしなかったかと言いますと、音を生成するたびにクラス生成をしてたら遅くなりそうな気がしたので、当初は音生成関数のポインタをスタティックに呼び出して音を生成するような変則的な構成にしてましたが、どうせ遅いので(リアルタイムが必要ならばDSPを使おうと考えているので)、1つ1つの音生成モジュールをクラス化したらすっきりしました。
 各音生成モジュールは、ベースクラスSoundObjectItemからすべて派生します。そこで、音出しは、
SoundObjectModule Object[MAX_OBJECT]
とかいう配列に各音生成モジュールのインスタンスハンドルを入れておいて、
for(int i = 0;i < max_object;i++) {
  SObject[i]->Genegare();
}
とすることで、異なる音生成モジュールも一気に音生成ができ、プログラム上はきわめてすっきりします
現在、基本的なフレームワークのデバッグをしながら、音生成モジュールをどんどん作成中です。一応、画面上で結線し、スライダーでパラメータを設定してやって、キーボードをクリックすると音が出ます

5/5
音が出るところまで無理やり作ったのですが、どうもプログラム構造がぐちゃぐちゃになってきました。オブジェクト指向の勉強から始めたのですから最初はこんなものでしょう。必要な要素技術は揃ったと思ったので、一旦白紙に戻して組み立てなおしています
 図は、音色エディタの画面です。今はテスト用の音部品が少しあるだけですが、音部品デザイン画面というのもあって、デザイン画面でデザインした後、音部品描画用のヘッダファイルを自動生成する機能を作りましたので、完成したら音部品をガンガン作って行けばいいわけです(近い将来、DLLとして呼ぶことができるような構造になっています)。
 Nord Modularのような、音部品間を曲線のワイヤで接続する機能に挑戦してみました。これ、リージョンで端を切ったウィンドウなんです。線の角度で幅が変わらないようにするのにけっこう苦労しましたが、まずまずのできだと思っています
 下のキーボードはテスト弾き用です
 つぎの課題は、この音色設定をファイルに読み書きする部分です
4/3
以前はパッチベイのようなパネル上で結線してましたが、Nord Modularを見て、「やっぱアナログシンセはケーブルで結線だがね」と思いなおして作りました。まだ、モジュールを動かしたとき、線が完全についてこないバグがありますが、機能的にはほぼ動いています。最終的には、重力でたわむ放物線上のケーブルにしようと思っています(この線は、リージョンで周りをカットした線型のウィンドウなのです)。
 ちなみに、このパッチは、トリガユニット(MIDIキーボードとつながっている)からのトリガとキー情報を簡単なディジタルウェーブガイドに入れて撥弦音を作り、ミキサでゲイン調整して出力するというもので、この絵には出てませんがキーボードの絵をクリックすると弾くことができます。最終的には標準MIDIファイルで演奏をできるようにします
 図のように、画面に音源モジュールを並べて結線し音を出すソフトウェアです。まだ、使用できるモジュールが数個しかなく、ディジタルウェーブガイドによる弦の音(物理モデルの項参照)ぐらいしか出ませんが、とりあえずアナログシンセサイザのシミュレーションをすることを目標に増やして行きたいと思っています
 このソフトを発想した後にkymaが出て、開発中にNordModularが出てしまったので、なんかマネしているみたいになってきました。ちょっとくやしいです
こういう不特定多数のオブジェクトを扱うプログラムは、オブジェクト志向開発が非常に便利です(参考文献:Tucker!著「憂鬱なプログラマのためのオブジェクト志向開発講座」名著です)

電子楽器に戻る