もともともう音源制作は引退しようと思っていたのですが、Kontaktに頼らない音源制作にちょっと興味を持ってしまって…。
まずはSteinbergのVST SDKを使って作ろうとしたのですが、あまりにもわからなすぎて中断。そこでJUCEに移動。そしたらJUCEもよくわからなくて中断。またSDKに戻って、とあっちこっち行ったり来たりしてるうちに外国のJUCEのYoutubeを見てずいぶん覚えていきました。
ある一定のラインまで理解すると国内のJUCE先輩方の記事の意味がわかるようになり、さくさく進んでいきました。
最初の難関は、ピッチベンドでした。JUCE純正のサンプラーでは、引数を与えるだけでサンプルピッチが上がる仕組みはなかったのです。ピッチが関係するビブラートも同様です。そこでオワッタと思っていろいろ調べていたら偶然モジュールのなかにPitchRatioとかいう変数を発見。これです。これは、ファイルのサンプルレートと本体のサンプルレートが異なる場合に正しいピッチに修正するパラメーターでした。これの導き方をみると、2の(1/12)乗で半音上がるパラメーターです。つまり、1オクターブ(12半音)で2となるのです。
ソースサンプルレートが96000でゲットサンプルレートが48000だと、2をかけるので、つまり、ピッチを倍にしないと正しく鳴らない、そのままだと1オクターブ低いということですね。ソース48000、ゲット44100だとpitchRatioは1.08843...となり、少しだけピッチを上げてやるということ(で合ってると思います。逆だったらごめんなさい)です。
そこへ変数を運ぶためにstatic変数を使いました。これが後に問題に。というのも、VSTではstaticを使うと同一DLLで共有され読み書きするとバグると。で、面倒くさかったのですが、そこのモジュールまで一個ずつたどって全部の関数に引数をつけていきました。これで変数を運ぶことはできました。
ビブラートはもう一個Ratioを掛け算で置いてやり、そいつを超低周波のサイン波で動かすだけでした。ちなみにここに出てくるaudioPというポインタはstaticではないものの、staticのように使えるもので、voice毎に全て同じ固定アドレスを渡してます。noteOnの度に毎回あっちのaudioPアドレスをこっちのaudioPにもらい、あっちのクラスでもこっちのクラスでも、audioPを使えば、こっちのクラスの共有みたいな変数にアクセスできるようにしています。
考え方としてはたぶん、staticの代わりになる一つのオブジェクトを作っているということでしょうか。そのオブジェクトにみんなでワイワイアクセスしてるわけです。ややこしいですがとにかく正しく動作してくれてます。
次の難関が、最後まで引きずった 、ストリーミング再生です。2.5GBもあるファイルを全部メモリに読み込むと、プラグインはたぶん3Gを超えてしまうのでこれが解決できなければ本当に詰みでした。終わりですよまじで。これはいろんな要素が混じっていて簡単に説明できないのですが、できるだけ短く言うと、最初は音を繋げる手法を取りました。同じサンプルを1秒のAとフルのBにわけ、Aはあらかじめ読み込んでおき、Aをならしている間にBを読み込んで、Aの終了と同時にBに切り替えるものでした。48000分の1秒でもずれるとノイズが入るのでとてもシビアでした。うまく繋げることはできたのですが、その後のいろんな事情でまたノイズが混入することに。
で、違う方法を思い付きました。繋げるのではなくすり替えるのです。Aがなっている間にBの読み込みが完了したらその時にAが参照しているアドレスをBのアドレスに変えてしまうのです。こうすれば、2つは長さが違うだけの同じファイルなので、繋ぎ目の心配はありません。案の定うまくいきました。ただし、AとBの取り扱いを間違えると正しい音がならないので、注意が必要です。画像ではBから直接Aを変更すればいいのでは?と思うかもしれませんが、試しましたが、バグが発生しました。理由はいろいろあるのでしょうが、AからBを取りに行く必要があったのでこういうややこしい方法になりました。ここら辺は企業秘密ということで。あとポインタが三次元配列になってますが、実際はただの1個のポインタです。制作中多次元でテストしていた名残です。
あとは大きな問題はなかったですが、自作VSTとして一番あってはならないことが残ってました。クラッシュです。突然落ちるんです。これは利用者が一気に離れてしまうので最後の最後までチェックしました。完璧ではないかもしれませんが、少なくとも、負荷のかかった状態で操作しても落ちないレベルには作ったつもりです。
さて、今後のKMG7Vですが、様子を見ていきながら、余裕があらばエフェクト類を強化したり、サンプルを録音し直したり、コードをならせるようになどと思ってますが、予定にも入っていませんのでまだ期待しないでください。開発費がなくなれば倒産です。
ギター音源の世界は10年前と違って飽和してきてるので、もう戦えないかもしれません。でも自分はKMG7Vのソロサウンドは宇宙一くらいに思っています。
みなさんフリー版を使ってみてくださいね。