Pure Dataの音をMIDIで鳴らす

前回に引き続き、もう少し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」ですが、購入してざっと目を通してみました。

Making Musical Apps
Want to turn your mobile device into a musical instrument? Or equip your game with interactive audio, rather than canned...

内容としては、

・Pure Dataそのものの紹介
RjDjというiOSアプリの紹介(2013年に終了しており、今は入手不可能)
・libpdやAPIの紹介
・libpdを組み込んだアプリをAndroidで開発する方法
・同じく、iOSで開発する方法

となっていました。

本書は発行から10年以上経っているので、多分コードはそのまま使えないと思います。とはいえlibpdの部分はおそらく大きく変わっていないはずなので、もう少し読み込んでみようと思います。

コメント