はじめに
リバーブサウンド(残響音)を作りたいと思った時に、思い浮かぶアルゴリズムといったら、畳み込み(convolution)が真っ先に来るかも知れません。サンプリングリバーブ全盛というか、最近はいわゆるデジタルリバーブさえも、いったんインパルス応答に落としてから、畳み込みエフェクトとして入力波形を処理するようなありさまです。ハードウェア資源が限られていた時分の、少ないディレイタップ数で、ゴージャスな響きを作り出すアルゴリズムの工夫なんかは、かえってあまり詳しく知られていないかもしれません。
しかし、アルゴリズムによるインパルス応答の生成は、中々捨てがたい魅力があるものです。もっとも大きな魅力の1つに、リアルタイムで響きをコントロールできるというものがあります。リバーブ長や、密度、ルームサイズ、フィルタ、スプレッドなどなど、リバーブのパラメータは多種多様で、数あるオーディオエフェクトの中でも随一と言えると思います。歌モノのリバーブなんかだと、歌っているときは、短めのリバーブにしておいて、フレーズの切れ目で、リバーブを長くするなどといったやり方は、常套手段といえるでしょう。
サンプリングリバーブですと、まさにサンプリングなわけですから、普通は最初から最後まで、ずーっと同じ響き方となってしまいます。中にはリアルタイムで響き方やリバーブ長を変えられるような兵(ツワモノ)サンプリングリバーブも存在するようですが、そいつなんかはむしろ昔ながらのリバーブ生成アルゴリズムを応用しているのではないかと思えてなりません。
つまりは、リアルタイムで様々な響き方を狙ってリバーブ成分を生成できることが、昔ながらのリバーブ生成アルゴリズムの魅力と言えそうです。
今回は、このリバーブ生成アルゴリズムとして、僕がはるか昔に思いついていて、中々ちゃんと作り上げることができていなかった一品を紹介してみようと思います。というよりも、このコラムで紹介するためにアイデアをブラッシュアップしたと言えなくもありません。
対象読者
C++のソースコードを理解できて、音楽向けデジタル信号処理の実装に関心を持つ人。インパルス応答、畳み込みなどの基本的な言葉が分からない方は、ぜひこちらのコラムをご覧下さい。
必要な環境
C++のコンパイラ。浮動小数点値のPCM波形ファイルを読み込み可能な波形編集ソフト。スピーカーあるいはヘッドフォン。
省(スクナ)キ点ニテ厚キ響ヲ
デジタルリバーブは広い意味ではディレイエフェクトです。なので固有のディレイタイム(ヤマビコの間隔)と、フィードバック量を持ち、ディレイ成分(ヤマビコ成分)を生成する要素(ディレイタップ)を各々組み合わせることにより、残響音を作るというのが基本となります。
昨今のマシンパワーを鑑みれば、100個とか200個といった規模のディレイタップ数を用意しても、大した負荷とならないようにも思えます。
しかし、響き方をリアルタイムでコントロールしたい、しかも、より複雑な計算方法で前例の無い独創的な響きを作り出したいなどといった野望を有する場合に備えて、少ないディレイタップ数で工夫を凝らす方法を知っておくのも損ではありません。
少ないディレイタップ数で、それなりに厚みのある響きを作るには、 「各々のタップのディレイタイムをなるべく整数倍の関係とならないようにランダムに散らす」という手があります。この手は割りと重要で、もちろん外せませんが、それだけでは不十分で、ディレイタップ数をある程度多くしないとディレイ臭さが残ることになります。
ところで、このディレイ臭さとは一体なんでしょうか?
物の本を読んでいると固有モードだとか色々と難しそうなことが書いてあるものですが、要するに「一定の間隔でヤマビコのように響く感じ」がいかにも無機質で硬い感じの質感となってしまうし、特にディレイタイムが短い場合は、周波数特性としても変なクセが付いてしまうこと(コムフィルタ効果)が気にかかるわけです。 ディレイタップ数を十分に増やして、ディレイタイムもバラバラにすれば、各々のクセが相殺されより自然なリバーブ感が得られることでしょう。
しかしここで必要としているのは、少ないディレイタップ数で、クセの無い厚みのあるリバーブを作る妙技です。これを実現するためのほとんど唯一と言ってもいい手段は、ディレイタイムをこまめに変更することです。
しかし、そうは言っても単純にディレイタイムをランダムに変更させてしまっては、変えた瞬間に当然のごとくノイズが発生してしまいますし、仮にゆっくりと前後に移動するようにディレイタイムを変更したとしても、ドップラー効果が発生して、微妙にピッチが変わってしまいます(これを利用したエフェクトがフランジャやコーラスです)。
そもそもディレイタイムを1サンプルづつ移動させる程度では十分に滑らかとは言えず、オーバーサンプリングするか、上手い補間処理を行わなければ、聴き取れるノイズが発生してしまうか、そうでなくてもイマイチ硬い音として感じられてしまうことでしょう。