オーディオプラグインの作成、パート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); } } } } 


fminfmax定義されfmaxいないfminエラーがfmin場合は、単にminmax名前を変更してみてください。 これで解決しない場合は、DigitalDistortion.cppヘッダーに次を追加します。

 #include <math.h> 


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

 #include <algorithm> 


fminstd::minに、 fmaxstd::max置き換えます。

channelCountchannelCountハードコーディングされているという事実にもかかわらず、外部の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

Source: https://habr.com/ru/post/J225751/


All Articles