前回に引き続き、もう少しPure Dataを紹介してみます。
前回は
・440Hzの音を出力
・マイクからの音声をそのまま出力
をやってみましたが、今回はMIDIノートに応じたサイン波を出力します。
いきなりですが、以下がパッチです。これはlibpdの作者Peter Brinkmannによる書籍「Making Musical Apps」からの引用です。(分かりやすくするためにちょっとだけ改変しています。)
noteinオブジェクトがMIDI入力デバイスです。パラメータの「1」はMIDIチャネルです。出力は左がノートナンバー、右がベロシティです。このオブジェクトはノートオン時とノートオフ時の両方で動作しますが、ノートオフの場合はベロシティが0で出力されます。
パッチの左側がオシレータ、右側がVCAになります。
左側から見ていきましょう。
mtofがMIDIノート番号を周波数に変更します。523.2という数字の入った箱がありますが、これはmtofが出力した周波数を画面上で表示させるためのもので、音には影響を与えません。
mtofが出力した周波数はoscオブジェクトに与えられ、ここで波形を生成します。
右側は、まずベロシティを127で割って、値を0 .. 1.0に正規化しています。
その次の箱ですが、これはそのあとに続くvline~オブジェクトに与えるパラメータを作っています。
vline~オブジェクトは、スペース区切りで
ターゲットとする値 所要時間 ターゲット到達後の遅延時間(オプション)
を与えるとそれに応じた信号を生成するので、オシレータの波形生成やエンベロープ信号の生成に使用できます。時間の単位はmsです。
また、複数のパラメータをカンマ区切りのリストで与えて、順に信号を生成することができます。例えば
a b, c d e
のようにリストでパラメータを与えると、下図のように時間的に変化する信号を生成します。
今回の例では
$1 10, 0 500 10
となっていますが、$1は入力の値、つまりベロシティを0 .. 1.0の範囲にマップした値になります。アタック成分として10msかけてピークの値(ベロシティ/127)に到達した後、500msかけて0まで減衰するということになります。
ちなみにノートオフ信号の時もこのエンベロープが駆動されますが、その場合は$1が0ですので、vline~の出力はずっと0のままになります。
最後に、osc~で生成した音声信号とエンベロープの信号を掛け算し、さらにマスターボリュームとして0.1を掛けてからDACで音を出力しています。
ちなみに、vline~オブジェクトと似たオブジェクトとして、line~オブジェクトとlineオブジェクトがあります。line~オブジェクトとlineオブジェクトのパラメータは
開始の値,終了の値 所要時間
あるいは
終了の値 所要時間
の形式になっており、遅延時間は指定できません。
vline~オブジェクトとline~オブジェクトは名称に「~」が付いていることからも分かる通り、オーディオ信号を処理する想定のオブジェクトで、1サンプル単位に信号を計算して出力します。一方、lineオブジェクトはより粒度の低い信号の生成用で、3番目のパラメータで信号を計算する周期を1ms単位で指定できます(デフォルトは20ms)。
なお冒頭で紹介したPeter Brinkmannに著「Making Musical Apps」ですが、購入してざっと目を通してみました。
内容としては、
・Pure Dataそのものの紹介
・RjDjというiOSアプリの紹介(2013年に終了しており、今は入手不可能)
・libpdやAPIの紹介
・libpdを組み込んだアプリをAndroidで開発する方法
・同じく、iOSで開発する方法
となっていました。
本書は発行から10年以上経っているので、多分コードはそのまま使えないと思います。とはいえlibpdの部分はおそらく大きく変わっていないはずなので、もう少し読み込んでみようと思います。
コメント