多摩美 – サウンド&ソフトウェアアート 2013
PdとArduinoの連携 2 – Pduinoで音響合成
今日の内容
前回に引き続き、Pduinoを使用したArduinoとPdの連携を実践していきます。今回は最終課題の制作の参考となるよう様々なサンプルを紹介しながら最終課題のための主にソフトウェア側の作成の考え方について、解説していきます。
Pdの機能の補足
Arduinoとの連携の解説に入る前に、まず課題制作のために役立ちそうな、PdのいろいろなTipsについて補足説明します。Pdも様々な工夫をすることで効率的にプログラミングが可能になったり、発表の際のセットアップの手間が省けたりします。細かなテクニックを身につけて便利にプログラミングしていきましょう。
パッチの工夫 1 : プリセット
これまで扱かったパッチは、スライダーやナンバーボックスの数値を設定しても、一度パッチを閉じて再度開くと設定した値はまた初期化されてしまいました。今後パフォーマンスでPdのパッチを使用したりする場面を想定すると、パッチを開いてから時間をかけてパラメーターを設定することができない状況が多々あるでしょう。
多くのパラメータを一度に記憶するための手段として「プリセット」機能があります。プリセットを使えば複数のパラメータを記憶して一度に呼び出すことが可能です。
復習: sendとreceive
sendとreceiveについて復習します。sendとreceiveは対として使用して、パッチケーブルを接続することなく数値、メッセージ、bangなどの値を送受信できる仕組みでした。また、シグナルを送受信する際にはsend~とreceive~を使用します。sendとreceiveはそれぞれ「s」「r」、send~とreceive~は「s~」「r~」と省略して記述可能です。
メッセージボックスでプリセットをつくる
まず初めに、メッセージボックスを使用したプリセットの例をとりあげます。
メッセージボックス内で以下のような書式にすると、送信先のreceiveの名前を指定してメッセージを送出することが可能となります。
; 送信先receive名 メッセージ
また、この書式を複数記述して、複数のメッセージを一斉にreceiveオブジェクトに向けて送出することができます。
;
送信先receive名1 メッセージ1;
送信先receive名2 メッセージ2;
送信先receive名3 メッセージ3;
...
では、メッセージボックスを使用したパラメーターの一斉送信の簡単なサンプルを作ってみましょう。例えば下記のように様々な種類の値をそれぞれのreceiveオブジェクトに向けて送出ができています。
プリセットをパッチに適用する
では、次に音響合成をするパッチにプリセットを適用してみましょう。例として以前とりあげたFM合成のパッチを使用します。プリセットを適用する前は以下ような状態です。
ここにプリセットでパラメータを設定するためには、以下のような手順でプリセットを追加します。
- プリセットを設定するパラメータへそれぞれreceiveオブジェクトを配置して名前をつける
- それぞれのreceiveに送出するメッセージボックスを配置
- 複数のセットがある場合は、その数だけメッセージボックスのセットを配置する
この手順で以下のようなパッチが完成しました。
パラメーターを徐々に変化させる
プリセットを適用したパッチに少し工夫を加えることで、パラメーターの値が徐々にゆるやかに変化するようにすることが可能です。
各receiveオブジェクトの下にlineオブジェクトを配置します。これで指定した時間で徐々に値が変化するようになります。ここにpresetから値を送る場合には以下のようなメッセージに変更します。
;
送信先receive名1 メッセージ1 経過時間1;
送信先receive名2 メッセージ2 経過時間2;
送信先receive名3 メッセージ3 経過時間3;
...
経過時間の単位はミリセカンド(ms)で指定します。1000ms = 1sec になります。
この変更を加えたパッチは、例えば以下のようになるでしょう。
キーボードでプリセットを切り替える
さらに工夫をして、キーボードからの入力でプリセットが切り替わるようにしましょう。
keyオブジェクトはキーボードからの入力をasciiコードで出力します。これをselオブジェクトを使用して特定のキーが入力された際に反応するようにしてみましょう。
例えば、以下のパッチでは、[a][s][d][f]のキーで、それそれ4種類のプリセットを選択するようにしています。
パッチの工夫 2 : サブパッチ
サブパッチとは、パッチの中のパッチです。つまりパッチの中に階層構造をつくっていくことが可能となります。サブパッチを効果的に用いることで複雑なパッチもすっきと整理することが可能となります。
サブパッチとの値の送受信
サブパッチへ、サブパッチを配置した上位のパッチ(スーパーパッチ)から値を送りこんだり、逆にサブパッチで生成した値をスーパーパッチへ戻すには、inletとoutletというオブジェクトを用います。サブパッチを作成するには、スーパーパッチの側に「pd サブパッチ名」オブジェクトを配置します。このpdオブジェクトをダブルクリックするとサブパッチは別ウィンドウとして起動します。このなかにサブパッチを記述します。サブパッチへの入力はinlet、サブパッチからの出力はoutletオブジェクトを利用します。
数値を入力すると、その二乗の数を返すシンプルなサブパッチを例に考えてみましょう。スーパーパッチ内に、「pd poweroftwo」を配置しその中身を記述します。入力した数値を二乗した値がアウトレットから出力されるはずです。
サブパッチはウィンドウを閉じてもそのまま機能は保持されます。ですので、複雑な処理をサブパッチとしてまとめることで、スーパーパッチ側はシンプルに構造をわかりやすくプログラミングしてくことが可能となります。
Pduinoのアナログ入力をサブパッチ化
では、このサプパッチ化の手法をPduinoに応用してみましょう。
前回作成したArduinoにAnalog Inされた値を取得して数値として取り出すパッチをサブパッチ化します。。汎用的に使えるようAnalog InのPIN番号0〜5までをあらかじめ全て使用できるようにして、それぞれを別々に数値のみ取り出すようにしてみましょう。
ここでは、「pd analogIn」というパッチ名にしています。
アナログ入力を音響合成に適用
ではサブパッチ化したAnalog Insを使用して音響合成のパラメーターに適用してみましょう。まず始めに、先程のFM合成のパッチを使用してみます。
このパッチでは、アナログインの0〜5PINからの出力をFMのそれぞれのパラメータに適用しています。アナログ入力の値は、0〜1までの値として出力されます。この値をFMのパッチでちょうど面白い音になるように調整する必要があります。値の調整にはmapオブジェクトを使用しています。mapオブジェクトは入力値の最小値と最大値、その変換後の最小値と最大値を指定します。するとちょうどその値に納まるようにスケーリングします。
- map 入力最小値 入力最大値 出力最小値 出力最大値
この結果をそれぞれのreceiveオブジェクトに対して送出しています。
実習: 最終課題制作に向けて
今日の内容を踏まえて、最終課題に向けて自分自身のパッチをプログラミングしていきましょう。
ハードウェア: センサー + Arduino
最終課題で使用するセンサーをブレッドボードとArduinoで配線します。センサーの配線がわからない場合は、ProtoTypingラボやGoogle先生を積極的に活用しましょう!センサーの配線ができたら、先程使用したPduinoのAudioInのサブパッチを使用してきちんと値が検出できているか確認します。
ソフトウェア: Pdのパッチ
ソフトウェア側は、これまで月曜の授業でやってきたPdによる「楽器」制作です。この授業でとりあげたサンプルだけでなく、インターネットに様々なPdに関するリソースがありますので、積極的に活用しまよう。
- チュートリアル | Pure Data Japan
- 書籍『Pd Recipe Book ―Pure Dataではじめるサウンドプログラミング』とそのサンプル
- 書籍『Pure Data チュートリアル&リファレンス』とそのサンプル
- Pd Tutorials And HOWTOs? | puredata.info
残り二週間、がんばりましょう!!