REAPERのJSFXでピンクノイズを生成してみた

REAPERのEffectsフォルダにはIvanov氏が作った「Pink Noise Generator」というJSFXが入っていたのですが、ソースを読んでみるとホワイトノイズにフィルタをかけてピンクにしているものでした。ホワイトノイズにフィルタをかけるのではなくピンクノイズを直接生成するプログラムを、以前Pythonで作ったことがあるので、それをリアルタイムで動作するようにしてみます。

marui.hatenablog.com

Voss-McCartney法そのままで、効率化もまったくしていません。しかも定数をそのまま書いているので汚いコードですが、低域から高域まできれいなピンクノイズが出力されます。

f:id:amarui:20190704141710p:plain
ピンクノイズJSFXからの出力のスペクトル

以下、JSFXコードです。

desc:Prosix Pinknoise Generator
//tags: generator synthesizer
//author: MARUI Atsushi

slider1:-6<-60,0,0.1>Level (dB)

@init
t = 0;
outmax = 0;

@slider
slider1<=-60 ? gain=0 : gain=pow(10, slider1/20);

@sample
                      r1 = rand();
t %    2 ==    0 ?    r2 = rand();
t %    4 ==    1 ?    r4 = rand();
t %    8 ==    3 ?    r8 = rand();
t %   16 ==    7 ?   r16 = rand();
t %   32 ==   15 ?   r32 = rand();
t %   64 ==   31 ?   r64 = rand();
t %  128 ==   63 ?  r128 = rand();
t %  256 ==  127 ?  r256 = rand();
t %  512 ==  255 ?  r512 = rand();
t % 1024 ==  511 ? r1024 = rand();

out = r1 + r2 + r4 + r8 + r16 + r32 + r64 + r128 + r256 + r512 + r1024;
abs(out) > outmax ? outmax=abs(out);
out = (out / outmax - 0.5) * 1.9999;

spl0 = out * gain;
spl1 = out * gain;
t = t+1;