■ノイズゲート(Pure Data パッチ)

Pure Data(Pd)には[threshold~]という音の始まり(立ち上がり、trigger)と終わり(立ち下がり?、rest)を検出できる便利なオブジェクトがあります。これを使うと簡単にノイズゲートを作れると思ったのですが、音声信号をそのままつなぐとtriggerとrestが頻繁に入れ替わってしまいます。この現象はおそらく[threshold~]の内部処理がエンベロープ検出になっていないために起こっているので、[env~]を入れることで対処できます。ただ更に検討していくと、[threshold~]は64サンプル分余計に処理時間がかかってしまう場合があることがわかったため、結局[env~]と[moses]でノイズゲートを作ることにしました。
03p_205_1noiseg.pngこのパッチをダウンロード
threshold以上になった信号は[moses]により右側に送られ、[change]でtriggerを検出します。検出後、左側の[change]に[set 0]が送られrestの受付を開始しますが、同時に左側の[spigot]が一定時間閉じられるため、restをすぐには検出しないようになっています。これによりtriggerとrestの短時間での繰り返しが防げます。threshold未満のときは左側に信号が送られ、同様のことが起こります。

立ち上がり時間(attack)はできるだけ短くしたいのですが、0にするとプチッというノイズが発生することがあるため、とりあえず0.1msというごく短い設定です。立ち下がり時間(decay)は500msと長い設定なのでノイズ遮断のキレが悪いですが、音の消え際を自然にするためにはやむを得ないでしょう。

(※パッチ内容を把握しきれていませんが、Isaac(139)さんのノイズゲートの方が高機能だと思います。→139 not found [Puredata]Noise Gate

バックグラウンドのノイズを消すという機能は、[rfft~]を使って周波数解析すれば実現できるかもしれません。しかしCPU負荷と処理時間の問題があるため、難しいだろうと思います。

■タグ : PureData

■オートワウ(Pure Data パッチ)

[env~](エンベロープフォロワー)を使って音量データを取得し、それに応じてバンドパスフィルター(BPF)の中心周波数が変わるようにすれば、オートワウ(エンベロープフィルター)となります。中心周波数を揺らす場合のBPFは[vcf~]を使いますが、Q値が基本的に固定値となります。ペダルワウは中心周波数が高い時(ペダルを閉じたとき)Q値が小さくなりますが、そこまで再現しなくてもワウっぽい音にはなるようです。
03p_204_1awah.pngこのパッチをダウンロード
rangeコントロールは、中心周波数が最高(2200Hz)になる時と最低(440Hz)になる時の音量差を調整します。rangeが小さい方が、音量減衰時に周波数の変化が急(速くこもる)ということになります。

滑らかに中心周波数を変化させるため、周波数と変化にかける時間の数値を[pack]でまとめて[line~]に送ります。[env~ 1024]からは512サンプルごとに数値が出力されるため、変化にかける時間は、512÷44100で約12msという計算となります(44100サンプル時)。

LFOやタップテンポを入れ、周期的にワウをかけることも可能です。ただデジタルだからといって多機能にしすぎると、CPU負荷の問題が出てくるかもしれないので、シンプルな構成にしています。

■フェイザー(Pure Data パッチ)

Pure Data(Pd)でのオールパスフィルター(APF)は[rzero_rev~]と[rpole~]を組み合わせて作ります。原音とAPFを通した音を足せばフェイザーとなります。参考ページ→Making and using all-pass filters
03p_203_1phaser.pngこのパッチをダウンロード
[rzero_rev~]と[rpole~]に入れる係数計算は、1次ローパスフィルターのときの[rpole~]用計算式をそのまま使うとうまくいきました。上側の[expr~]が2π*fc/fsの計算ですが、周波数はMXR Phase 90を参考に150~2250Hzで変化するようにしています。

Uni-Vibeもフェイザーと似た仕組みなので再現できそうなのですが、いまいち係数の設定がうまくいきませんでした。今後使いたくなったときに作るかもしれません。



【フィードバックについて】

Phase 90ではAPF最終段から2段目にフィードバックがかかっていますが、Pdで同じことをやろうとすると、「error: DSP loop detected」と出てしまいます。このエラーを回避するには、[send~][receive~]を使い1ブロックサイズ分遅延を発生させます。参考ページ→What's A "DSP-Loop"?

今回のフェイザーでは上記の方法だと出音がアナログの場合とは違うように感じたので、結局フィードバックは入れないことにしました。[block~]でブロックサイズを減らし遅延を少なくする方法もありますが、CPU負荷を考えると現実的ではないと思います。

■ビブラート/コーラス(Pure Data パッチ)

ディレイの時には[delread~]からディレイ音を出力させましたが、ディレイタイムを連続的に変化させる場合は、[vd~](variable delay)を使います。LFOで周期的にディレイタイムを変化させると、ディレイ音の音程が揺れてビブラートがかかり、原音とビブラート音を足せばコーラスとなります。
03p_202_1chorus.pngこのパッチをダウンロード
LFOの出力はトレモロの時と同じ三角波ですが、abs関数を使うと簡単になると気づいて式を変更しました。出力範囲は0~1で、[*~ ]により振幅が調整されます。[+~ 3]を入れているのは、[vd~]の最短ディレイタイムが64サンプル分(44100サンプリング時1.5ms)となっているためで、一応余裕をみて3ms足しています。

ビブラート音をフィードバックさせればフランジャーとなりますが、いまいち数値の調整がうまくいきませんでした。今後使いたくなったときに作るかもしれません。



【depth計算について】

通常のコーラスエフェクターは、揺れのスピードを遅くすると効きが浅くなります。今回のdepthコントロールでは音程を変える幅が設定され(いわゆるデチューン機能)、rateを変更しても効果が変わらないようにしました。具体的には、最大で約25centピッチが変化するように調整しています。

詳しい原理は省くとして、例えば1000Hzの信号に可変ディレイをかけるとします。1秒間かけて徐々にディレイタイムを0から100msに変化させたとき、ディレイ音は100Hzズレて900Hzの音になります。同様に、0.5秒間かけてディレイタイムを0から25msへ変化させたとき、ディレイ音は50Hzズレて950Hzとなります。このように、比例計算によって周波数の変化幅を調節できます。

■LFO/トレモロ(Pure Data パッチ)

Pure Data(Pd)では、[osc~]で余弦波、[phasor~]でノコギリ波を発生させることができます。[cos~]はコサインを計算しますが、[phasor~]と組み合わせて余弦波を発生させるために使う場合があります。[phasor~]は0から1へ上がる形なので、-1をかければ0から-1へ下がる形になります。
03p_201_1wave.png

<三角波(Triangle Wave)>
エフェクターに使われるLFO(Low Frequency Oscillator)は三角波が多いようです。Pdでは[phasor~]等を組み合わせることになります。
03p_201_2tri.png
3パターン示していますが、結局[expr~]が一番楽な気がします。

<矩形波(Square Wave)>
あまり使わなさそうですが、一応3パターン示しています。
03p_201_3squ.png



三角波を使い普通のトレモロを作りました。waveコントロールは、三角波を増幅してクリップすることで矩形波へと近づける仕組みになっています。
03p_201_4trem.pngこのパッチをダウンロード
三角波は直線的な数値変化ですが、[dbtorms~]を入れることで指数的な倍率変化による音量操作となるようにしています。

■タグ : PureData トレモロ

管理人

ブログ内検索

メールフォーム

当ブログに関するお問い合わせはこちらからお願いします。 ※FAQ(よくある質問)もお読みください。

お名前
メールアドレス
件名
本文

アクセスカウンター