オーディオプラグインの作成、パート4

シリーズのすべての投稿:

パート1.紹介とセットアップ

パート2.コードの学習

パート3. VSTおよびAU

パート4.デジタル歪み

パート5.プリセットとGUI

パート6.信号合成

パート7. MIDIメッセージの受信

パート8.仮想キーボード

パート9.封筒

パート10. GUIの改善

パート11.フィルター

パート12.低周波発振器

パート13.再設計

パート14.ポリフォニー1

パート15.ポリフォニー2

パート16.アンチエイリアス






最初のプラグインの作成を開始します。 それは汚いデジタル歪みになります。 より具体的には、プラグインは単にオーディオ信号の振幅のピークをトリミングします。



デジタル歪み





特定のしきい値を超える信号値は、それを超えないように制限されます。







「超過」と言うことは、「特定の正のしきい値を超えるか、特定の負のしきい値を下回る」ことを意味します。



古き良きduplicate



スクリプトを使用して、プロジェクトに新しい名前を付けてコピーできます。 また、新しいプロジェクトごとに前に説明したすべての変更を行う必要はありません。

ターミナルを開き、 IPlugExamplesディレクトリに移動して、これを入力します。



./duplicate.py MyFirstPlugin/ DigitalDistortion YourName







以前の投稿を読んでいない場合、それらの結果はこちらからダウンロードできます 。 Macでこれを行う場合、他のプロジェクトがXcodeで開いていないことを確認してください。 新しく作成されたDigitalDistortionフォルダーには、 DigitalDistortion.xcodeprojファイルがあります。 開いて、APPターゲットアセンブリがエラーなしで起動することを確認します。 前述のようにスキーマを編集して、REAPERがVSTおよびAUで実行されるようにします。 起動時に渡される引数が目的の.rppファイルを指すことを忘れないでください。



REAPERを起動すると、 MyFirstPluginではなくDigitalDistortionがロードされます。 奇跡 これは、REAPERのプロジェクトファイルが、構造化されたテキストファイルであり、 duplicate



スクリプトがすべての「MyFirstPlugin」を「DigitalDistortion」に置き換えたためです。



最初にmGain



パラメータの名前をmGain



変更しましょう。 DigitalDistortion.hを開き、 private



変数の名前を変更します。



 private: double mThreshold;
      
      







DigitalDistortion.cppで、 Threshold



発生したすべてのGain



(Cmd + Alt + F) 置き換えます。 組み立てるときに、エラーがポップアップしないはずです。 コンストラクターのパラメーター初期化行で、最小値として0.01



、デフォルト値として100.0



を指定します。



 GetParam(kThreshold)->InitDouble("Threshold", 100.0, 0.01, 100.0, 0.01, "%");
      
      







次に、デジタル信号処理を直接記述しましょう。



 void DigitalDistortion::ProcessDoubleReplacing( double** inputs, double** outputs, int nFrames) { // Mutex is already locked for us. int const channelCount = 2; for (int i = 0; i < channelCount; i++) { double* input = inputs[i]; double* output = outputs[i]; for (int s = 0; s < nFrames; ++s, ++input, ++output) { if(*input >= 0) { // Make sure positive values can't go above the threshold: *output = fmin(*input, mThreshold); } else { // Make sure negative values can't go below the threshold: *output = fmax(*input, -mThreshold); } } } }
      
      







fmin



fmax



定義されfmax



いないfmin



エラーがfmin



場合は、単にmin



max



名前を変更してみてください。 これで解決しない場合は、DigitalDistortion.cppヘッダーに次を追加します。



 #include <math.h>
      
      







これで問題が解決しない場合は、前の行の代わりにこれを追加します。



 #include <algorithm>
      
      







fmin



std::min



に、 fmax



std::max



置き換えます。



channelCount



channelCount



ハードコーディングされているという事実にもかかわらず、外部のforループを使用してチャネルを反復処理することにより、冗長性をある程度除去しました。 つまり、最初にプラグインは1つのチャネルからのいくつかのサンプルを処理し、次に2番目のサンプルで同じことを行います。

条件付きif



の興味深い点。 振幅が正の値の場合、入力値またはしきい値のいずれか小さい方を選択します。 反対に、負の値の場合は、大きい方を選択します: *input



または負のしきい値。 つまり、常にゼロに近い値を選択します。

REAPERでプラグインを起動し、テストサウンドに駆動します。 ノブを右いっぱいまで回すと、クリアな音が聞こえます。 ノブを反時計回りに回すほど、信号の歪みが大きくなります。

歪みが大きくなると、信号はより静かになります。これは、しきい値をゼロに近づけるにつれて小さくし、それに応じて振幅をより静かな値にカットするためです。 これを補正するには、入力値をしきい値で除算します。



 if(*input >= 0) { *output = fmin(*input, mThreshold); } else { *output = fmax(*input, -mThreshold); } *output /= mThreshold;
      
      







もう少し高く、パラメーターの最小値を0.01



設定します。 したがって、ノブを左いっぱいに回しても、ゼロで除算することはありません。

プラグインを再度実行すると、振幅は同じレベルのままになります。 しかし、音量は大きくなります 。振幅のカットオフにより、正弦波の形状が蛇行に近くなり、 蛇行の rms値が大きくなります



これまでのところ、私は意図的にデジタル信号処理のジャングルに入らないようにしています。 私の意見では、良いプラグインは単なる信号処理アルゴリズムではありません。 これは、次のものを含む混合物です







したがって、次の投稿でサウンド処理アルゴリズムに飛び込む前に、プリセットとより快適なインターフェースを追加します。



元の記事:

martin-finke.de/blog/articles/audio-plugins-005-digital-distortion



All Articles