情弱

情弱のVST作製メモ

JUCEでソフトシンセをつくる 1 ~ Hello, SineとMIDI入力

はじめに

JUCEを使って、ソフトシンセを作っていきます。

とりあえず、今回はSine波オシレータとMIDI入力を実装してみます。

仕様

以下の機能を実装します。

  1. MIDI入力から音階(周波数)を取り出す
  2. 音階に対応したSine波を出力
  3. MIDIがONの間はSine波を出力し、OFFになったら出力を止める
プロジェクトの設定

下記の画像のように設定します。

f:id:aogiri_m2d:20170607212201j:plain

  • Plugin is a SynthとPlugin Midi Inputに☑を入れておきます
  • SineOscillator、Synthヘッダ・ソースファイルを追加します(前者には、Sine波オシレータの実装を、後者には、オシレータで生成した波形のレンダリングMIDI入力に関する実装を書いていきます)
SineOscillatorの実装

SineOscillator.h, cppに記述していきます。

本当はSine波の生成はテーブル・ルックアップを使った方が速い(らしい)のですが、それは、次回ということで。今回は、普通にsin関数を使っています。

波形のレンダリングMIDI処理の実装

Synth.h, cppに記述していきます。

実際、このMIDI入力処理だと1つのMIDI入力があったらすぐにオーディオレンダリングに入っているので、1ボイスしか同時発音できません。

また、鍵盤が現在押しこまれているのかどうかを判断できないので、2鍵盤を押しこんだ状態で片方を放した時、まだ、打鍵状態にある方の音が鳴らない等という問題が残っていたりしますが、この対処については、またの機会に。

とりあえず、MIDI鍵盤を通して任意の音階を鳴らすことはできるようになりました。

 オーディオバッファの取得云々等については、JUCE JAPANを読もう(ダイレクトマーケティング)。

後は、実際にこれをProcessBlockで走らせれば、Hello, sineできます。

f:id:aogiri_m2d:20170607232125j:plain

無事、MIDI入力を通して、Hello, sineできてますね。

次の予定

ただ、Sine波を鳴らすだけではつまらないので、次は、基本波形を一式実装…といきたいのですが、Sine波以外のバンドリミット済みの基本波形テーブル作製や波形の切り替え処理の実装が意外と面倒なので、次回は、SineテーブルのみからできるFM Oscillatorを実装してみようかと思います。そのうち書きます。