VSTシンセ自作 オシレータ実験

Audacityのコンパイル用に超巨大開発環境のVisualStudioをインストールしたのが去年の年末。 せっかく入れたので、これで何か作ってみようかと思ってVSTシンセの実験をしてみた。

VSTは9年前にちょっと触ったことはあるのだが、当然ながら大きく変化していた。まずVSTは現在3.6で仕様も大きく異なっていた。とりあえずGUIなしで、シンセのオシレータ部分(発振回路)だけでも作ってみようと試行錯誤してみる。

割とあっさり音が出せるところまでこぎつける。とりあえずサイン波を電子ピアノから鳴らすことはできた。

手持ちの電子ピアノのMIDI信号をキャッチしてみたら、ノートオフは使われていないのね。すべてノートオンで、音を止める時は0で止めていた。

次にノコギリ波にチャレンジ。 まずは理論通りのサイン波の合成によるノコギリ波を作ってみた。基本的には5年前に作ったこのページの加算合成の方法。1サンプルごとに膨大な計算量なので、どうかな?と思っていたが、リアルタイムでもあっさり再生。最近のPCパワーは素直にすげーと思った。

デジタルの場合、倍音が多く含まれる波形は要注意で、ナイキスト周波数を意識する必要がある。ナイキスト周波数はサンプリング周波数の半分で、再生できる最高音のこと。これを超える周波数を扱おうとするとエイリアスノイズが発生する。

下が60倍音まで扱ったノコギリ波の音。低い音は問題ないのだが、音が上がるにつれて、妙な音が入ってくる。この音がナイキスト周波数を超えた倍音が、低い音として認識されて、再生されてしまっている状態。

波形はこんな感じでノコギリ波としては悪くない。

これではまずいということで、次の実験。
だったら倍音を少な目にするという方法。手持ちの電子ピアノの最高音はG7の3136Hzなので、ナイキスト周波数24000Hz(サンプリング周波数48000Hz)とした場合7倍音までならナイキスト周波数は超えない。ということで、 低音から高音まで一貫して7倍音まで扱うノコギリ波にしてみた。音はこんな感じ。

聴いてみると低音が物足りない。波形を見ても、ノコギリ波としては中途半端。

次にやることは倍音をナイキスト周波数まで扱うというもの。これは音域ごとに倍音の数が違うので、以下のようなプログラムで対応してみた。 整数倍音を60回まで順次加算するのだが、倍音が最高音の24000Hzを超えたら抜けるという内容。
for(int i = 1; i <= 60; i++){
if(pitch * i  >= 24000) break;
  phase += sin(theta * i) * (1.0f / i);
 }

音はこんな感じになった。低音から最高音まで問題なし。

エフェクトを通すと、まともなシンセと比較しても大差ないのでは?という印象。

ここまで来ると結構面白くなってくる。いろいろな方法で波形を作ってみようかな。