Pd会(PureData のソースコードを読んで何かする会)の第3回に参加してきました。会場をご提供くださったワークスコーポレーション 様ありがとうございました。ちなみにCG WORLD は数年前までは定期購読しておりました。最近は……ゴホゴホ。
今日の発表は3つでした
- PureData の起動プロセスの概要と外部から PureData を操作する方法について(Ruby/PureData のデモ) by @nagachika
- RjDj の紹介 by @tatmos さん
- audio signal を入出力するオブジェクトの作り方(dspobj~) by @yasos さん
わたしの発表資料は slideshare に上げておきました。
Ruby から netreceive を経由してメッセージを送信して PureData を操作するライブラリ Ruby/PureData は Github に置きます。Pd-extended がインストールされている Mac OS X なら動くと思うのでよければ遊んでみてください。
http://github.com/nagachika/ruby-puredata/
わたしの宿題としては以下のようなコメントを頂きました
- sub-patch や abstraction がメッセージから使えるかどうか確認
- netreceive を使ってメッセージを送るのではなくて GUI になりすます方法はどうか
- エラー検出ができるかどうか(inlet, outlet オブジェクトを使ってできるかも?)
Ruby/PureData 自体についてはいずれ今日やったような簡単なデモのスクリーンキャストを撮影して紹介したいと思います。
RjDj の紹介では、開発者向けのテンプレートが非常に充実した PureData のサンプルにもなっていて、添付されているドキュメントもとても詳しいもので一同驚きでした。あれを読むことで PureData のみならず音響処理の一般的な practice に詳しくなることができそうなので、ぜひダウンロードしてみます。
RjDj は iPhone のアプリなので若干スルー気味でしたが、自分で Scene を作らないにしても中身は PureData なのでバックエンドを覗いてみるのは楽しそうです。
dpsobj~ の作成は、第2回での control 系の external object 実装の続編的な位置付けで今度はいよいよ audio signal を入出力するオブジェクトの実装方法についての解説でした。
わたしなりにミソと思ったところは
- ブロック単位(デフォルトで 64 sample)毎に処理する
- PureData では connection = 1-channel。ステレオは線自体が2本になる
- CLASS_MAINSIGNAL で inlet を作成
- "dsp" メソッドを登録する。そのメソッドの関数の中で callback 関数を dsp_add で登録する。
- callback 関数ではブロック毎に望みの処理をして出力バッファに詰める
- 入出力のバッファが実は同じものを差してることがあるので注意が必要
64 sample 以上のサイズをまとめて処理したいような時(もっと大きなサイズで FFT したい時とか)にはオブジェクト毎にバッファを用意してためていって必要なサイズに達したら処理して出力にまわすんでしょうかね。そうするとそのオブジェクトのところで少し信号が遅延すると思うのですがどうなんでしょう。オブジェクトに渡すデータのブロックサイズを変更してもらうこともできるのかもしれませんね。
external object の実装は、多少泥くさいところ(コールバックで次の処理のオフセットを返してあげないといけないとか)もあるものの、シグナル処理自体はかなりシンプルにできるようになっていました。Pd が信号線を入力から出力に向かって、複数のパスがあるときも1本に serialize してくれているようです。あとはブロック単位で全ての処理を頭から出力まで一気に実行してしまっているようです。ふむふむ、かなりイメージが掴めてきましたぞ。もっとオブジェクト毎にごにょごにょやっているのかと思ってました。まーそれは効率が悪いですよね。
その後カフェで少し談笑。今日もとっても楽しい集まりでした。次回も是非参加したいと思います。