Edited at
JUCEDay 17

リバースゲートのVSTを作った

More than 1 year has passed since last update.

このエントリはJUCE Advent Calendar 2017の17日向けに書いたものです。

リバースゲートのVSTをJuceで作ったので紹介します。


作ったもの

シューゲイザーでよく使われるリバースゲートのVSTです。



マイブラのケヴィンがリバースゲートのことをBackwardsと呼んでいるそうなので名前はそこから貰いました。


リバースゲートってなに

YAMAHA SPXシリーズ等に搭載されている空間系エフェクトです。原音に対して残響音が徐々に大きくなっていくようなサウンドが特徴です。歪んだギターにかけると轟音、かつ少し夢見心地という不思議なサウンドになります。

SPX2000の取扱説明書には以下の記載があります。


リバースゲートは逆回転風リバーブと呼ばれるものです。



下調べ

実装するにあたり、リバースゲートの効果について掘り下げていきます。


ゲート?

まずゲートについてですが、ある閾値で音を切るエフェクトです。リバースゲートは空間系なので残響音が途中で切れるという動きが正しそうです。

簡単なディレイやリバーブの実装では残響音に係数を掛けてフィードバックさせる手法をとりますが、これだと任意の時点での残響音を取り出せないのでゲートをかけるのは難しそうです。

ここでマニュアルを見るとリバースゲートはアーリーリフレクション(初期反射音)にカテゴライスされています。初期反射音はマルチタップディレイで実装される事が多く、タップの数と遅延時間を工夫すれば単純なゲートリバーブは作れそうです。


リバース?

マニュアルに「逆回転“風”」と書いているので、本当に逆回転しているわけではないのが分かります。残響音が徐々に大きくなる様子を「逆回転風」と呼んでいると考えれば、先程のタップの係数を徐々に大きくしてあげれば良さそうです。


まとめ

以上より、

”リバースゲートはタップの係数を徐々に大きくしたマルチタップディレイである。”

と予想をたてて実装していきます。

※長々書きましたが、古いYAMAHA SPX90のマニュアルをみると以下のような図があるのでなんとなく合ってそう。


実装

まず適当にタップの数と遅延時間を決めます。(今回はタップを25個、遅延時間を素数msにしました。)

JuceにはAudioSampleBufferというバッファ確保用のクラスがあるので、タップ毎にそこから過去のサンプルを拾ってきて出力音にします。この際、タップの係数をループ毎に大きい値にすることでリバースゲートになります。

基本的にはこれだけ!

パラメータは以下とします。

パラメータ
効果

ROOMSIZE
残響音の間隔

DELAY
残響音が鳴るまでの時間(PRE DELAY)

LPF
ローパスフィルタ

OUT LVL
出力レベル

MIX BAL
ドライとウェットのバランス

パラメータはAudioProcessorValueTreeStateというクラスで管理します。これを使わないとなかなか辛いのでチュートリアルを読みましょう。

Tutorial: The AudioParameter classes

パラメータのうちLPFについてはIIRFilterというクラスを用いて簡単に実装できます。Juceでの基本的なフィルタ実装についてはJUCE JAPAN vol.2に詳しく載っているので持っていない方は是非。

GUIもほとんどチュートリアルそのままの実装です。

Tutorial: Advanced Rectangle techniques


リバースゲートを使ったデモ

00:13~ ギターにかけてます


リポジトリ

delatetei/Backwards


最後に

あまりJuceに言及せず、コードも載せない変な記事になってしまいました。でも逆に言うとJuceを使えばそのぐらいコードを意識すること無くVSTを作ることができます。本来なら実装に費やすリソースを他に回せるのでめちゃくちゃ有り難いです。

本記事が誰かの役に立てば幸いです。


参考

YAMAHA SPX2000取扱説明書

YAMAHA SPX90取扱説明書

補足説明、及び蛇足記 : コンパクトエフェクターでの「リバース・リバーブ」(別名:リバースゲート、バックワーズ)

補足説明、及び蛇足記 : YAMAHA FX500 で リバースリバーブ

リバーブレーター 残響装置 : ソフトウェアと音響のデジタル信号処理