したらばTOP ■掲示板に戻る■ 全部 1-100 最新50 | |

C++でVST作りの指摘・質問

109 管理人★ :2015/08/14(金) 20:12:15
猫十さん

書き込みありがとうございます。

私のVSTiサンプルは「http://www39.atwiki.jp/vst_prog/pages/84.html」だと
思いますので、これをを前提として簡単に説明させていただきます。

■MySynthSampleVSTのコンストラクタ
 まず、wavファイルから波形をすべて読み込む。
 読み込みを行うのはファイルでもリソースからでもどちらでもよい。

 次にMIDIノートと再生すべき波形の対応テーブルを作成する。
 対応テーブルは下記のような情報を持つ。
  MIDIノートNo69(A5)の時 … 波形1(440Hz)をそのまま再生
  MIDIノートNo70(A#5)の時 … 波形1(440Hz)を466.2Hzになるように早送りで再生
  MIDIノートNo71(B5)の時 … 波形1(440Hz)を493.2Hzになるように早送りで再生
    :
  MIDIノートNo81(A6)の時 … 波形2(880Hz)をそのまま再生
    :

 ※読み込むwavファイルが固定のためコンストラクタで読み込んでいる。
  サンプラーのように途中で読み込みが必要な場合は読み込みスレッド等を作成する必要あり。

■MySynthSampleVST::onMidiKeyOn()
 OFF状態のオシレータをONにする際に、波形の対応テーブルの情報(使用する波形と再生速度)を
 オシレータに渡すようにする。
 (オシレータに波形の対応テーブル情報引き渡し関数等を追加する必要あり。)

■CVoice::amplitude()
 まず、経過時間から波形の読み込み位置を計算する。
 読み込み位置は、
  経過時間 × (再生したい周波数 ÷ 波形自体の周波数)
 で求められる。
 例えば、波形1(440Hz)で466.2Hzとなるように再生するには、
  経過時間 × (466.2 ÷ 440)
 となる。

 読み込んだ波形は配列に保存されていると思うので計算した読み込み位置が整数でない場合、
 切り捨てたり前後の値から補完する。
 なお、経過時間が波形のサイズより長い場合は0を返す。


Waveテーブルシンセサイザにするには上記のような手順となります。

なお、wavファイルをリソースにするにはrcファイルとヘッダファイルを作れば
リソースに出来ますが、読み込みの部分で一工夫必要となります。
まずはwavファイルで試してみることをお勧めいたします。
(FindResource()やLockResource()等を使う必要が出てくると思います。)

お盆のため、すぐに確認できず記憶で書いている部分があります…
間違いがある可能性がありますが、ご了承ください…

不明点がございましたら再度 ご質問いただければと思います。


新着レスの表示


名前: E-mail(省略可)

※書き込む際の注意事項はこちら



掲示板管理者へ連絡 無料レンタル掲示板