NTS-1コラボ連載第五回の補足

  KORG, NTS-1, プログラミング

最終回を迎えましたコラボ企画ですが、全五回いかがでしたでしょうか?
デジタルエフェクターの内部に興味を持つきっかけになれば幸いです。

もっと知識を得たい場合にもネット検索で手軽に情報が手に入りますが、検索キーワードが分からなければ答えにたどり着けません。
今回の企画には沢山のキーワードが入ってますので有力な手がかりになると思います。

さて記事にあるボコーダーの解説をします。


そもそも一般的なボコーダーの原理は二つの音を周波数帯域(以下バンド)で分解し、それぞれの帯域を掛け合わせます。

たとえばA、Bと二つの音があり、それぞれフィルターで4つのバンドに分けるとします。
A1A2A3A4、B1B2B3B4という感じですね。
そしてA1×B1、A2×B2とそれぞれを掛けたものを最後に足し合わせます。

もしBがマイク入力だった場合、黙っていればB1~B4の音量は全て0になりますからAをいくら鳴らしても音がでません。
逆に話したとき、話の音量変化に従ってAの波形が鳴る。
これが簡単なボコーダーの原理です。

ここでまず必要なのが正負を行ったり来たりする波形の聴感上の音量変化を検出することです。
何をいってるんだろう?ってなりますね。

音が段々と消えていく場合でも実際の波形は正負に揺れるため何度も0の状態を通っています。
もちろん波形データもそうなので、その瞬間を取れば無音です。
これでは音量変化のデータとして細切れになるので不都合ですよね。
高い位置から低い位置に綺麗な曲線で繋がってくれるのが理想です。
それを実現するのが包絡線というもので、シンセでよく聞くエンベロープです。
凄く単純には波形の「絶対値の最大値」を結んだ線で、実際には時間係数などが加わってより聴感に近い曲線になります。
エンベロープを取る(検出する)なんて言います。

もちろん各バンドに対して行いますので上の例だとB1~B4で4回行います。
まとめると毎サンプルごとに
・バンドに分ける
・各バンドのエンベロープを取る
・各バンドを合成する

という処理が必要です。

バンドを分けるフィルターはデジタル上で都合のよいFFTを使う方法と、アナログボコーダーと同じ仕組みのバンドパスフィルターを使う方法があります。
当然ながら処理は後者の方が重くなりますが、太くてごつい音が鳴らせますので弊社としては後者を選びました。

これをボコーダーのバンド数分必要になりますので、16バンドなら毎サンプルごとに16基の処理が必要です。
重い!

PCならともかくNTS-1で動かすには改良を重ねて1バンド当たりの負荷を極限まで下げる必要がありました。
そもそもデジタルシンセに搭載するボコーダーはほとんどFFTです。
でもやっぱりアナログボコーダーの音が出したいですよね。

解決方法は一択で如何に計算を減らすかという方法しかないのですが、そのために数式を簡略化し、予め計算で出せる係数は根こそぎ算出して入力(定数化)しました。
ハードウェアのエフェクタやシンセでは定数化は基本なのですが、そこまでやる?というレベルで根こそぎやりました。
プログラムサイズの制限も極限まで小さくして制限内に押し込めます。

それらに加えてコラボ記事で詳しく解説しているため割愛しますがシンセと音声の分離を行って、NTS-1で動作する16バンドアナログタイプボコーダーが完成しました。

是非みなさんもNTS-1を手に入れて自作シンセサイザーを作ってみてください。
プログラミングだけで自作シンセが作れるハードはlogue-SDK対応製品ぐらいですよ!

twitter facebook