2010/06/09

NAMAGI Compressor

JAVAでエフェクト・コンプレッサー自作の記録 9
ダウンロード size 17KB Wav 32bit-float専用バージョン 111224
対応サンプリング周波数 44.1、48、96kHz
モノラル、ステレオ

最新リリース 111224
この手のダイナミック系のエフェクトは、ビット深度は深い方がよいので16bitから32bit-float専用に変更。16、24、32bit PCMのファイルは扱えないので注意。フロート専用です。32bit-floatなので、0dBを超えてもデータとしては維持。
サンプリング周波数は44.1、48、96kHzで使用可能。他のサンプリング周波数でもOK。
また内部を精度の高い計算処理に変更。やや処理時間がかかるようになったが、許容範囲だと思う。
Wav以外は扱えません。

特長 100609
WAVファイルを直接操作するJava製コンプ。Audacityの補助コンプとして作ってみた。VSTでもNyquistでもなくスタンドアローンで動作し、WAVファイルをドラッグして処理するので使い勝手は悪い。処理をすると新しいファイルが作られる。オリジナルファイルには手を加えない。Javaで動作するので、JVMがインストールされていないと動かない。JVMさえインストールされていればWin、Mac、Linuxでも動く。プログラムは小さく17KBしかない。リアルタイム処理しないので以下のような特長がある。

波形を崩さないで圧縮するコンプレッサー 
波形を半周期単位で制御。コンプの理屈どおりの原理とは違うが、音質を重視し歪まないコンプ。音質の変化は可能な限り少なくしたつもり。

加工する対象の波形以外はいじらない
ピークのカットなどでは、設定をThresholdとRatioだけでカットした波形だけをターゲットにすれば、Gainが0の場合、他の音は一切加工されない。波形半周期単位で加工しているので変化するのはその波形だけ。

アタック、リリース共に 0 設定が可能
これにより不要なピークのみカットすることが可能。ノイズ除去的な使い方ではあるが、ピークの首を切るような処理ではなく、ピーク全体のレベルを下げるので音が歪むことはない。

設定どおりに正確に圧縮するアルゴリズム
設定した数値に忠実に圧縮をするので、ちゃんと理解して使う必要がある。そもそもリアルタイムでないので、音を聴きながら調整は不可能。理論的に計算して使うというコンプ。あまり音楽的ではない。

スライダーの表示
スレッショルドは3の倍数とかちょっとこだわった。また、すべてのパラメーターはスライダーにない広い範囲の値も受け付ける。特殊な使い方になりそうだけど・・・ Ratioはタンジェントカーブで無限大まで増加するようにした。

テキストフィールドに直接打って実行可能
スライダーではなく、数値を入力して実行できるので計算して細かな制御をしたい場合に便利。特にRatioはそれを感じるのだが、意外と細かな数字を入力できないコンプ多し。

Attack Releaseについて
分かりやすいく、波形を並べてみた。WIKIにあった波形が分かりやすかったので真似してみた。リリースはひじょうに重要で音色にかかわってくる。アタックも、つぶしすぎると、特徴的な波形が失われたりするので、ある程度アタックタイムもあった方がよいのかもしれない。
ちょっと改良。直線的ではなく、y=(1-x)^2 のカーブにしてみた。これでスムーズなカーブになったが、聴いて分かるような違いでもなかったりする。
ちなみにクリッピングの絵は以下の通り。はじめに作ったコンプで試してみた。上段がソフトクリッピングでRatio2:1ぐらい、下がハードクリッピングでRatio無限大。もう波形が違うものになっているのが分かる。これは歪むのです。歪が迫力になるような場合もあるけど、個人的にはそういう使い方はNG。NAMAGI Compではクリッピングの設定はできず、ナチュラルに圧縮する。
Releaseの効果について
下記はRelease0の時。Thresholdにかからない小さい波形は全く圧縮されない。ピークだけをつぶしたいときはよいが、下記のように小さい波形も一緒になって音色を作っている場合は、音が変わってきてしまう。半周期ごとにチェックしている律儀なコンプではあるが、それが裏目に出たりもする。ということで、Releaseの出番。
そこでRelease50msecに設定した状態が下記。小さい波形も影響を受けて圧縮されている。ナチュラルな圧縮をする場合はReleaseを調整したほうがよいのが分かるだろう。
コンプを作った理由は理屈どおりに動作するコンプがほしかった
シンプルで入力値通りに圧縮してくれるコンプがなかなか見つからなくて、だったら作ってしまえということでスタートした。Java初心者なので作れるものにも限界があるけど結果的にはそこそこ実現できた。

使い方としては個人的に2通りあった
まずピークだけをスパッと切ってしまいたい。でもリミッターみたいに切り口が平らだと音が歪むのでだめ。音が歪まない切り方をしてもらいたい。が、なかなかそれを実現するコンプ/リミッターが見つからなかった。NAMAGI Compはピークを自在に切ることができる。リアルタイム処理を放棄した先読みコンプなので0msecアタックが可能になった。これが他にはない特徴。
他の使い方はコンプらしい使い方で、緩やかに圧縮する程度かな。実はこれはあまりやらない。これを実現するコンプはいくらでもある。
ということで、欲しかったのはリミッターのように使えるコンプであった。

圧縮加減は自分で計算したい
使い方にもよるけど、個人的には波形を見て、ピークをどれぐらい引っ込ませるかを考える。だいたい-6dBぐらい下げたいと思えたら、計算をする。ピークだけをカットしたいなら、Thresholdはそのピークを切るところに決めて、Ratioは6以上の高めで切ってしまう。やや全体的に圧縮したい場合は、Thresholdを低めにしてRatioは1.123とかかなり微妙な値を使う。小数点第3位ぐらいで調整できるコンプも見かけないし、正確に動くものも見つからなかったので、わざわざ作ったのだ。波形を見て計算してコンプをかける。こんな使い方は間違っている? Thresholdは波形を見て決めてしまう。Ratioは上記のように計算して決めるという感じ。Thresoldと音質は大きなかかわりがあるので、音質をあまり変えたくないなら深めでRatioは極端に小さくしないとだめ。ちなみに、スライドはアバウトな値しか出せないので、ちゃんと計算したなら、テキストフィールドに直接数字を打って使う。小数点以下は結構打てる。たしかdoubleで計算しているからかなりの桁までいける。普通は小数点第3位までで十分だろうけど。音色どうのというよりも正確に動くコンプ。使い方が適切であれば結構使えると思う。VSTじゃないので誰も使わないと思うけど。


コンプ製作の記録
1 Java 具体的に作ってみる
2 WAVについて
3 dBについて
4 コンプに必要な情報
5 Eclipseの導入
6 Nimbus
7 コンプの原理
8 コンプレッサーベータ版完成
9 NAMAGI Compressor