![見出し画像](https://assets.st-note.com/production/uploads/images/68166255/rectangle_large_type_2_e55d3da457dfe78a14585eab18c5ba5b.png?width=1200)
Csoundでシフトレジスタ&AU/VST plugin化 (2/3)
以前の記事で説明したシフトレジスタをCsoundでプログラミングし、AU/VST plugin化します。
プロトタイプ2:ランダムネスの導入
前回作成したプロトタイプ1に、ランダムネスを導入します。
ランダムネスのコントロール方法
色々な方法が考えられますが、簡単なのは、bit 0の値をbit 7にシフトする際に確率的にbitを反転させる方法です。
ランダムネスは0 〜 1の値で指定する(0:ランダムネスなし)
0 〜 1の値をとる乱数(一様分布)を生成する
乱数の値に基づき、ビット反転の実行フラグ(0:反転しない、1:反転する)をセットする
乱数の値 < ランダムネスの指定値 の場合は実行フラグ = 1
乱数の値 >= ランダムネスの指定値 の場合は実行フラグ = 0
ランダムネスの指定値が0.1であれば10%、0.5であれば50%の確率でビット反転が実行されます。
ビットの反転
ビットの反転にはビット演算子のXOR(排他的論理和、Csoundでは'#')を使います。Bit 0の元の値と、ビット反転の実行フラグとをXORすると下表のようになります。このA XOR Bの値を、シフトレジスタのbit 7にセットします。
![](https://assets.st-note.com/img/1640012138008-bdSnrFO5Rz.png?width=1200)
Csoundプログラムのコア部分は以下のようになります。この例ではランダムネスの指定値は0.5(50%)です。
;Initialize probability of bit inversion when bit0 is shifted to bit7
kprob init 0.5
;Trigger for bitshift, 1 shift per second
kpulse metro 1
;Bitshift
if (kpulse == 1) then
krand unirand 1
kinvflag = (krand < kprob ? 1 : 0)
abit0 = aval&1
anewbit7 = abit0 # kinvflag ;If kinvflag=1, new bit7 is inverted bit0 (XOR)
aval = (aval>>1) + anewbit7*128 ;bit shift
endif
プロトタイプ2のCsoundプログラム
このプログラムでは音は生成しません。1秒に1回ビットシフトし、シフトレジスタの値を表示します。ログから、Bit inversion:1の時は、bit 0の値が反転されてbit 7にシフトされているのが確認できます。
![](https://assets.st-note.com/img/1640011886160-0uPRtrchxG.png?width=1200)
9回実行されたビットシフトのうち3回でビット反転しているので、その割合は3/9=0.333となり、ランダムネスの指定値0.5と大分異なりますが、ビットシフトの回数が大きくなれば、割合は0.5に近くなることが期待されます。
ランダムネスの指定値を$${p}$$とした場合、$${n}$$回のシフトで$${x}$$回ビット反転が実行される確率は$${{}_n\mathrm{C}_xp^x(1-p)^{n-x}}$$となります(二項分布の確率密度)。
なお、ランダムネスの指定値=1とした場、常にビット反転することになるので、8*2=16回ビットシフトすると元に戻ります。ランダムネスの指定値=0の時は、8回のシフトで同じ数が繰り返されます。直感的には、ランダムネスの指定値=0.5の時に、最もランダムな出力が得られると思います。
次回は、CsoundのIDEのCabbageを使って、作成したシフトレジスタにGUIを追加してAU/VST plugin化します。
Version history
v1.1 : 2024/10/12 ランダムネスの指定値についての記述を更新
v1.0 : 2021/12/23 公開