見出し画像

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にセットします。

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にシフトされているのが確認できます。

実行ログ

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 公開

いいなと思ったら応援しよう!