SSブログ

「SPRESENSEでデジタルエフェクターを作ろう!」ーコンプレッサーとディストーションの実現ー [SPRESENSE]

いよいよ今回から、デジタルエフェクターらしくギターの生音に信号処理を加えていきます。


SpresenseDigitalEffector.PNG


ギターのエフェクターは次のように接続するのが一般的なようです。今回は、コンプレッサーとディストーションをまず実現したいと思います。ボリュームはアンプの抵抗定数変更やマイク入力のゲイン変更で行うことできます。


EffectorConnection.PNG


信号処理は次の本を参考にしました。音声音響信号処理の基本が身につきますのでおすすめです。







■ コンプレッサーの信号処理

コンプレッサーは設定した閾値から観測信号を圧縮する処理を行います。変換を表すグラフと式を次に表します。グラフを見ても明らかなように、小さい音を持ち上げて大きな音を抑制する働きをします。


Compressor.PNG


■ ノイズゲートの信号処理

ノイズを除去するフィルターとしてノイズゲートというものもあります。これはある閾値以下の値はノイズとして処理するものです。あまりやり過ぎると音が不自然になるのでこれはなくてもよいかも知れません。


NoiseGate.PNG


■ ディストーションの信号処理

ディストーションはある閾値以上の音をクリップしてしまう処理です。ロックでは非常に重要なエフェクトですね。信号処理でゲインを与えるというやり方はありますが、情報が欠落してしまうのであまりおすすめしません。

ゲインを上げたい時はアンプのボリューム抵抗で入力信号を増幅するか、マイク入力のゲインをあげたほうがロックらしい音が得られます。


Distortion.PNG

ディストーションは、あるレベルで信号をクリップしてしまうので、音のレベルを小さくしてしまうのに注意してください。出来る限りアンプの増幅度をあげてアナログ的にクリップしたほうがいいかも知れません。ここは、アナログとデジタルをうまく使い分けたいところです。


■ コンプレッサー、ノイズゲート、ディストーションの実装

これらの処理を実装してみました。前回紹介したコードの中の singnal_process 関数部分だけを掲載します。


void signal_process(int16_t* mono_input, int16_t* stereo_output, uint32_t sample_size) {

  /* clean up the output buffer */
  memset(stereo_output, 0, sizeof(int16_t)*sample_size*2);

  /* volume (gain setting) */
  static int16_t gain = 0; /* 0dB */
  theFrontEnd->setMicGain(gain);
  
  /* compressor & distotin*/
  static int16_t comp_th = 0x7fff/128;
  static int16_t noise_g = 0x0005;
  static int16_t dist_th = 0x7fff/32;
  static float alpha = 0.5;
  for (int n = SAMPLE_SIZE-1; n >= 0; --n) {
    /* compressor process */
    if (abs(mono_input[n]) > comp_th) {
      int32_t value = mono_input[n];
      mono_input[n] = value/abs(value)*(abs(value)*alpha + (1.-alpha)*comp_th);
    }
    /* noise gate process */
    if (abs(mono_input[n]) < noise_g) {
      mono_input[n] = 0;
    }
    /* distortion process */
    if (abs(mono_input[n]) > dist_th) {
      int32_t value = mono_input[n];
      mono_input[n] = value/abs(value)*dist_th;
    }   
  }

  /* copy the signal to output buffer */
    for (int n = SAMPLE_SIZE-1; n >= 0; --n) {
    stereo_output[n*2] = stereo_output[n*2+1] = mono_input[n];
  }

  return;
}



処理時間を計測してみると最大で1.6ミリ秒でした。トータル15ミリ秒ありますので、まだ処理を追加できそうですね。SPRESENSEの計算能力恐るべしです。


■ 効果を確認

実際の効果を確認してみました。なかなかそれらしい音を出せました。全部プログラムで処理しているので、自分好みの音を自分で作れるのが醍醐味ですね。






次は空間系エフェクターの実装をしてみたいと思います。(⌒▽⌒)/~


「SPRESENSEでデジタルエフェクターを作ろう!」ープリアンプの製作編

「SPRESENSEでデジタルエフェクターを作ろう!」ー低遅延入出力の実現ー

「SPRESENSEでデジタルエフェクターを作ろう!」ーコンプレッサーとディストーションの実現ー

「SPRESENSEでデジタルエフェクターを作ろう!」ー空間系エフェクターの実現ー

「SPRESENSEでデジタルエフェクターを作ろう!」ーモジュレーション系エフェクターの実現ー






SPRESENSEではじめるローパワーエッジAI (Make: PROJECTS)

SPRESENSEではじめるローパワーエッジAI (Make: PROJECTS)

  • 出版社/メーカー: オライリージャパン
  • 発売日: 2022/02/28
  • メディア: 単行本(ソフトカバー)



SONY SPRESENSE メインボード CXD5602PWBMAIN1

SONY SPRESENSE メインボード CXD5602PWBMAIN1

  • 出版社/メーカー: スプレッセンス(Spresense)
  • メディア: Tools & Hardware



SONY SPRESENSE 拡張ボード CXD5602PWBEXT1

SONY SPRESENSE 拡張ボード CXD5602PWBEXT1

  • 出版社/メーカー: スプレッセンス(Spresense)
  • メディア: Tools & Hardware




nice!(16)  コメント(0) 
共通テーマ:趣味・カルチャー