エフェクト切替(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 

RasPd4 プログラミング編

各設定についてはRasPd2 ソフトウェア編と同じですが、今回はオーディオ設定の入出力音量を操作していないので、alsamixerのMasterとCaptureのdB gainは両方0となっています。内部プログラムは2チャンネルのディストーションエフェクトです(データダウンロードはこちらへ)。

▽コントロール割り当て
左側LED: エフェクトオン時点灯、チャンネル切替モード時点滅
中央LED: Aチャンネル選択時点灯
右側LED: Bチャンネル選択時点灯
左側スイッチ: バイパス音とエフェクト音を同じ音量に合わせる機能
中央スイッチ: チャンネル切替
右側スイッチ: 2秒長押しでシャットダウン
各ポット: エフェクトパラメータ(自動保存されている)
フットスイッチ: 2秒長押しで通常モードとチャンネル切替モードを変更、通常モード時はエフェクトオン・オフ切替、チャンネル切替モード時はチャンネル切替

なかなかプログラミングが面倒でしたが、完成すると大したことはしていない感じです。フットスイッチに長押し機能を持たせた関係で、スイッチを押した時ではなく離した時に切替が働く形になり、少し違和感は残っています。

一つ原因不明の問題があり、バックグラウンドでPure Data(Pd)が起動状態のとき、立ち下がりエッジ検出で定義したコールバック関数がたまに立ち上がりエッジでも呼び出されるという現象が起こりました。どう調べてもスイッチのチャタリングではないようです。とりあえず呼び出される関数に「対象GPIOピンがLOW(0)」という条件を追加して対策しています。

▽Pdパッチ
03_214_1raspd4pd.png
なぜか今回は[spigot~]でエフェクトオン・オフを切り替えるとプツっとノイズが出るため、Isaac(139)さんの[pd spigot~]に[line~]を入れたものを使っています。[pd effect_distortion]の中身の表示は省略しましたが、前々回の記事のオーバードライブのトーン部分を変更したものが入っています。2チャンネル程度ならエフェクトをまるごとコピーすれば簡単ですが、今後の応用を考えてPdのメッセージ機能を使うことにしました。終了時にこのパッチ自体を上書き保存するため、外部ファイル操作はしていません。参考ページ→PureDataで値のプリセットを外部ファイルで管理する方法

エフェクトパラメータの取得は、RasPd2と同じでMCP3008を使っています。0.2秒ごとに0.0から100.0までの値を取得しますが、ノブを触らなくてもたまに値がブレることがあるようです。勝手に値が変わるとPdパッチに記録しているデータも変化して困る場合があるので、1以上変化しないとPythonからPdへ値を送信しないようしています。すごくゆっくりとポットを動かしたときはパラメータが変化しないことになってしまいますが、実用上は問題ないでしょう。

▽Twitter動画(そのうち消えるかもしれません)



RasPd4 ハードウェア編

タグ : 自作エフェクター RaspberryPi PureData 

RasPd4 ハードウェア編

03_213_1raspd4p.jpg
微妙に不安定な面があったRasPd2を作り直しました。「3」を飛ばして「4」になっていますが、奇数番号は多機能タイプで、偶数番号はコンパクトタイプということにしておきます。スイッチやポットの基板についてはRasPd2のものを流用しており、外観は変わりません。初めてPCBを基板製造業者に注文しましたが、まぁまぁ納得の出来栄えでした。Raspberry Piは「zero W」です。

▽回路図
03_213_2raspd4s.png
入力にローパスフィルターを追加し、出力はヘッドフォン出力ではなくライン出力を使っています。ステレオ入力や出力バッファー追加も考えていたのですが、チップ部品でないと入らなさそうだったので諦めました。ダンピング抵抗は22Ωから47Ωへ上げて様子を見てみます。電源は9Vではなく5Vにしたので、大きな降圧レギュレータが不要となりました。DCジャックには間違えて9Vのプラグを挿さないように、秋月電子で買った「電圧区分4」というものを使用しています。

▽レイアウト(KiCadのデータはこちらへ)
03_213_3raspd4l.png
あまり意味はないかと思いますが、一応レイアウトも載せておきます。GNDはアナログ(右側)とデジタル(左側)に分けていて、中央下のあたりの一点で接続するようにしました。GPIOの番号は「*」印で示しており、使わないGPIOについては左端に引き出してあります。Raspberry Piが重なる部分は高さ7mmの電解コンデンサを使いましたが、スペースがあるので横に倒してもなんとか入りそうです。注文した基板は1M(R1)と1K(R2)の印字位置を逆にするというミスがあり、危ないところでした…

ノイズについてはRasPd2とほぼ同じくらいです。ギターが拾うノイズの方が大きいので、まぁOKということにしておきます。最大入出力レベルは0.9Vrms程度で、これも問題ないと思います。以前あったエラー音のような音については、起動して数十秒の間に短くビッと鳴ることがありますが、それ以外では今のところ大丈夫なようです。

WM8731より性能がよいIC(CS4272が候補)を使うとさらに高品質になると思われます。自作するとなると情報が少ないのですが、今後取り組んでみたいところです。



RasPd4 プログラミング編

タグ : 自作エフェクター 回路図 PureData RaspberryPi 

オーバードライブ(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 

管理人

管理人

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

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

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

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

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

アクセスカウンター