エフェクト切替(Pure Data パッチ)

Pure Data(Pd)でマルチエフェクターを実現するにあたって、複数接続したエフェクトを瞬時に切り替える、いわゆるプリセットチェンジ(パッチチェンジ)をする方法を考えなくてはいけません。Isaac(139)さんの[pd spigot~]のように信号経路を切り替える方法が簡単だと思います。しかし使っていないエフェクト側でもチルダオブジェクトは常に計算を行っているので、[switch~]を利用することにより不要な部分のDSPをオフにしてCPU負荷を軽減できます。
03p_225_1fxc.png
[pd fx0~]・・・のようにエフェクトをサブパッチの形で並べて全て繋げておきます。選択したエフェクトの[switch~]のみに1が入りサブパッチのDSPがオンとなります。信号線がたくさん繋ぎっぱなしですが、選択しなかったエフェクトはDSPがオフなのでおそらく問題ないと思います。この形を複数直列に繋げていけばマルチエフェクターの出来上がりです。



他の信号経路切替方法についてメモしておきます。

・[send~][receive~][throw~][catch~]
ヘルプパッチの通り、setメッセージを使い送信先や受信元を切り替えることができますが、1ブロックサイズ(64サンプル)分の遅延が生じます。遅延回避方法も一応ありますがやや面倒です。

・[multiplex~][demultiplex~]
外部オブジェクトzexyが必要です。複数経路を簡単に切り替えることができます。

タグ : PureData 

OSCによるPure DataとPythonの連携

Pure Data(Pd)とPythonを連携させる方法として、Open Sound Control(OSC)という通信方法を試しました。これによりRaspberrry Pi(RPi)上でPdから間接的にGPIOを操作し、スイッチやLED等を扱うことができるようになります。もちろん別のコンピュータとの通信を行うといったことも可能です。



Python側の準備として、pylibloを導入します。python-oscというものもあるようですが、試していません。
$ sudo apt-get install python-liblo
参考ページ→pylibloを使ってOSCメッセージを扱う
Pd側はversion 0.46以降であればOSC用オブジェクト[oscformat][oscparse]が使えます。

▽テストプログラム
py_osc.py
#!/usr/bin/env python
# coding:utf-8

import liblo

server = liblo.Server(8000)
target = liblo.Address("127.0.0.1",8001)

def callback(path, args, types, src):
print "py got msg from pd:", args[0]

server.add_method("/msg_from_pd","f", callback)
liblo.send(target,"/msg_to_pd", 4558)
server.recv(1)

pd_osc.pd
03p_218_1osc.png

先にバックグラウンドでPdパッチを実行した後、Pythonプログラムを実行します。
$ pd pd_osc.pd &
$ python py_osc.py
通信に成功すれば、以下のメッセージが表示されるはずです。
pd_got_msg_from_py: 4558
py got msg from pd: 4558.0

Pythonプラグラムから送信された4558という数値をPdが受け取り、Pdから同じ数値が送信されてPythonが受け取ります。pylibloのExample Codeや[oscformat][oscparse]のヘルプを簡略化したものなので、特に難しいところはないでしょう。



Pdでスイッチ類を扱う他の方法についてメモしておきます。

・pdsend、pdreceiveコマンド
  pdsendは今まで使っていました。pdreceiveの方は詳細不明で通信成功に至りませんでした。
・Pduino
  別途Arduinoが必要で、検証していません。
Pd-wiringPi(Pd外部オブジェクト)
  Pdの実行にsudoが必要になります。GPIOの入力待ちがやりにくそうでしたが、使えないことはないと思います。
py/pyext(Pd外部オブジェクト)
  Pdでpythonプログラムを動かします。導入が難しく、RPiではコンパイルが必要なようです。

タグ : PureData 

オーバードライブ(Pure Data パッチ)

デジタルの歪みはなかなか自然な感じにするのが難しく、自分なりにいろいろと検討しました。詳細は前回の記事(真空管風デジタル歪み)をご覧ください。
03p_211_1od.pngこのパッチをダウンロード
gain1では二次関数 f(x) = x2 + x を使い、波形を非対称に変形させて浅い歪みを調整します。ただそのままでは x < -0.5 のとき波形が折りたたまれる形になるため、[clip~ -0.5 100]を入れてそれを防いでいます。gain2は[tanh~]を使った対称ソフトクリップで、深い歪みを調整します。

個人的に便利かなと思い組み込んだのが、右側に配置している音量調節機能です。弾きながらadjust_vol(フットスイッチを想定)を押すと、エフェクト音の音量が原音と同じになるように変更されます。原理は簡単で、原音とエフェクト音それぞれに繋がっている[env~ 32768](左上と左下のあたりに配置)から出力される値の差を計算するだけです。

トーン調整についてはとりあえず単純なハイパスフィルターとローパスフィルターにしていますが、私の感覚には結構合っている調整方法のようです。デジタルなので内容の変更や追加は簡単にできます。気が向いたらクリーンミックスやフェンダー型トーン回路等いろいろ試してみたいと思います。

タグ : 歪み PureData 

コンプレッサー(Pure Data パッチ)

Pure Data(Pd)では[limiter~]でコンプレッサーを作ることができます(zexyが必要)。自分で作ってもそこまで複雑ではありませんが、今回はニー(knee)というコントロールを追加していますので、やや大掛かりなパッチとなっています。
03p_206_1comp.png
このパッチをダウンロード
[env~ 256]は128サンプルごとに値を出力するため、[delwrite~]で原音をその時間分遅延させてタイミングを合わせています(Windows環境ではなぜかさらに64サンプル程度タイミングがずれました)。[env~]を使ったエフェクト全てに行うべき処理ですが、ディレイタイムがそのままレイテンシーの増加になってしまうため、ノイズゲートオートワウでは省きました。

[env~ 256]からのエンベロープデータは2つの[moses]で3パターンに振り分けます。threshold+kneeの値以上では通常の圧縮動作となり、threshold-kneeの値未満では圧縮がかかりません。真ん中下側と右側の[expr]の式がコンプレッサーの定義的な式となります。
(例)入力:80dB、threshold:60dB、ratio:10のとき
   →( 80 - 60 )÷10 + 60 - 80 = -18 (入力音を-18dB変化させる)

threshold±kneeの範囲では、滑らかにthresholdを変化させます。どういった曲線にするかですが、下図のような楕円を考えました。参考ページ→平行四辺形に内接する楕円の三種
03p_206_2comk.png
k=0のときは急に折れ曲がる形(ハードニー)で、kを上げていく程なだらかなカーブ(ソフトニー)になります。市販のコンプレッサーではどのように処理しているかわからないので、完全に自己流です。

attackとreleaseは音量変化にかける時間(ms)を指定します。[env~]からはデータが次々と出力されてくるので、音量変化の最中にまた次の音量変化に切り替えることになります。このため、実際の変化時間は指定した時間よりも長くかかりますが、動作の仕方としてはそれで問題ないようです。参考ページ→コンプレッサーを考える コンプレッサー アタックタイムの真実 (各種コンプ比較あり)

コンプレッサーの世界は思っていたより奥が深く、入出力の関係がもっと複雑なカーブになっていたり、周波数によって特性が違ったりするものがあるようです。まぁ私には大して違いがわからないでしょうから、あまり深追いしないことにします。

タグ : コンプレッサー PureData 

ノイズゲート(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 

管理人

管理人

自己紹介のページ
記事一覧
Twitter
GitHub

ブログ内検索
カテゴリー
タグ

自作エフェクター   レイアウト   回路図   歪み   PureData   周波数特性   マイコン   波形・倍音   RaspberryPi   エレキギター   アンプ   エフェクター自作方法   歪率   エレキベース   真空管   コーラス   ピックアップ   静音ギター   ヘッドフォンアンプ   擬似ギター出力   市販エフェクター   アコースティックギター   ブースター   コンデンサ   ソロギター   ポールピース   イコライザー   コンプレッサー   ビブラート   フェイザー   トレモロ   TAB譜   ディレイ   DIY_Layout_Creator   ワウ   オートワウ   バッファー   

最近の記事
最新コメント
Twitter
RSS
メールフォーム
当ブログに関するお問い合わせはこちらからお願いします。 ※FAQ(よくある質問)もお読みください。

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

アクセスカウンター