【PureData Tips】ランダム確率を制御する2つの方法を用途に合わせて使い分けよう!
おはようございます^ – ^
ナカジ(@cp_nakajun)です。
僕はPureDataを使って音楽制作をしてます。
その手法として「僕が設定したルールにのっとってフレーズを生成」させているのですが
その時に必要なプログラミングが音の出現確率の制御です。
そう、「ランダムの確率を制御する」というルールが必要になります。
(設定したルールの1つではありますが)
以前、このブログの
アルゴリズム作曲的にフレーズを生成するRandamの確率を制御する方法!
という記事でプログラムの内容そのものを晒しちゃってるのですが
ふと先日、PureDataの日本語コミュニティー「Puredata Japan」の
確率のプログラミングという記事を見て、今更ながら気がついたことがありましてね。
ランダム確率を制御する方法
[ < ]オブジェクトを使う
「<」の左インレットに入力された値が「<」の右インレットに入力された値よりも小さいときに1を、そうでないときに0を出力します。
というオブジェクトですね。
画像のように右インレットが「50」なので50%の確率で「1」が出力されます。
[ expr ]オブジェクトを使う
C-like expression evaluation objects for graphical music languages
(グラフィカルな音楽言語のためのCのような表現評価オブジェクト)
「expr」オブジェクトを使うとif文を使えるようになります。
【if( 評価, 正の場合, 負の場合)】
「expr」で先の「<」と同じことをしたのが、下記の画像の左側です。
(出力結果はprint 1)
どう使い分けのか
単純に1つだけ「確率」を制御する(0か1を出力する)ならどちらでもいいと思います。
個人的には「expr」の方が処理の結果が見てわかりやすく感じますが。
確率を後から変更する場合はナンバーボックスに数値を入力するので「<」の方がわかりやすい気がします。
が、「expr」であっても[expr if($i1 < $i2 ,1 ,0)]と入力用の引数を書いて右インレットから入力すればいいので大差ないように感じます。
この場合は見た目的に「<」の方が僕個人はわかりやすく感じる。といったレベルです。
じゃあ、「expr」を使うケースはというと
下記の画像の右側を見てください
結果でいうと0か1か-1を出力します。
「<」のような先までの例だと
例えば右インレットが20の場合。
20%の確率で「1」を出力。
逆に言えば80%の確率で「0」を出力するということになります。
なので「1ならAという動作、0ならBという動作」
という使い方をすることができます。
これを3つやろうとしたのが先の画像の右側の「expr」です。
[expr if($i1 < 20 ,-1 ,if($i1 >70 ,1 ,0))]
その上に[random 100]がついてるので動作としては
- 20%の確率で「-1」
- 30%の確率で「1」
- 50%の確率で「0」
という処理を1つの「expr」オブジェクトで書けるということになります。
後から見直したときに少しわかりにくくなりますが
もちろん、先に書いたように引数を増やす($i2・$i3など)ことで確率を変更することもできます。
僕の演奏パッチは「expr」で書いていて今のところ確率が固定になってるのですが
今になって作れるバリエーションが増えるので、変更できるようにしておけば良かった気もしています。
それはまたそのうちやります。
こんな感じで同じ動作をさせるのにもいろいろな方法があったり
人によって違う方法を選んでいたりというのがプログラミングの魅力であり
Puredataを使ってる最大のメリットだと思います。
いかがでしたでしょうか?
お役に立てれば幸いです。