2023/06/27

MaybeCabinetIR

Try MaybeCabinetIR (github.io)
See list of other web synthesizers (github.io)

MaybeCabinetIR is impulse response (IR) generator which resembles guitar cabinets.

The sound is a bit too clean, but it works okay. When `Source -> LP Q` is high, strange delays are added to IR. Maybe this can be used for another reverb IR generator.

At start, I analyzed several cabinet IRs and came up with the recipe below:

  • Peaking at 100 to 200 Hz, around +20 dB. Broad Q.
  • Peaking at 1000 to 3000 Hz, +10 to +20 dB. Less broad Q.
  • (Optional) Negative peaking or notch at 500 to 1000 Hz. Narrow Q.

Character is mostly decided by the ratio between lower and higher peak.

IR is generated by following steps:

  1. Generate random noise.
  2. Apply low-pass bidirectionally.
  3. Apply inverse FFT.
  4. Rotate half to move peak into center
  5. Apply peaking filters bidirectionally.
  6. Transform 5 into minimum phase FIR.
  7. Apply highpass and lowpass to remove direct current and Nyquist frequency.
  8. Normalize amplitude.

The recipe is used at step 5. Bidirectional filtering is a technique to apply IIR filter as linear phase. It can only work on offline (or non real-time) processing as all the signal has to be known beforehand. Minimum phase algorithm is ported from `scipy.signal.minimum_phase`.

---

MaybeCabinetFIR を試す (github.io)
Web シンセサイザの一覧を見る (github.io)

MaybeCabinetIR はギターキャビネットに似せたインパルス応答 (IR) の Web シンセです。

クリーンすぎる感じもしますが、それなりに使えます。 `Source -> LP Q` の値が大きいとき変なディレイが現れます。また別のリバーブ IR 合成器へと応用できそうです。

制作にあたっては、いくつかキャビネット IR を分析して以下のレシピにたどり着きました。

  • ピーキング、 100 ~ 200 Hz, +20 dB 付近。広めの Q 。
  • ピーキング、 1000 ~ 3000 Hz, +10 ~ +20 dB。やや狭めた Q 。
  • (任意) 負のピーキングかノッチ、 500 ~ 1000 Hz。狭い Q 。

音のキャラクターは高低のピーキングのゲイン差で決まります。

IR は以下の手順で合成しています。

  1. ランダムなノイズを生成。
  2. 双方向にローパスを適用。
  3. 逆 FFT 。
  4. ピークを中央に動かすように半分回転。
  5. 双方向にピーキングを適用。
  6. 最小位相 (minimum phase) FIR に変換。
  7. ローパスとハイパスで直流とナイキスト周波数を除去。
  8. 振幅の正規化。

先のレシピはステップ 5 で適用されます。双方向フィルタリングは IIR フィルタを線形位相を保ったままかけるテクニックです。事前に信号がすべて分かっている必要があるのでオフライン (あるいは非リアルタイム) 処理でなければ使えません。最小位相に変換するアルゴリズムは `scipy.signal.minimum_phase` から移植しました。