desc:XFSJ.O_ROTARENEG_ESION_DEROLOC_O_COLORED_NOISE_GENERATOR_O.JSFX
//author: Tale

// Copyright (C) 2014-2019 Theo Niessink

// This effect generates different "colors" of noise. Apart from the listed
// colors it can also generate "black" noise. To do so select white noise
// and lower the density. Note that density affects only white noise, and is
// ignored for other colors.

slider1:2<0,5,1{Brown,Pink,White,Blue,Violet,Grey}>Color
slider2:1.0<0.0,1.0,0.001>Density
slider3:1<0,1,1{Mono,Stereo}>Mode
slider4:0.0<-150.0,24.0,0.1>Dry (dB)
slider5:-11.313708498984760390413509793678<-150.0,24.0,0.1>Wet (dB)
slider6:3<0,4,1{Bypass,Low-Pass,Band-Pass,High-Pass,Notch>Filter
slider7:509995.84720537942501053791990222186318497155456598412304868358108557027626312690815935436254312602380018384146080819361007052417300859576823494123354649454926715171837589447981303118680732051619241592857387560590731916727159219127114882812681142120000554521560244913724923454007879077709074231501660225902442031789292684020306214368751195131273379421417845989953743715595075459241726299378244182461305505070375764767335490052526771981672645254414552948943121530561597814431046304162565579215354915247841761114912105370238007407508983661576583875120003420248355074960241061954772747944892479433834092157209409992279777253481869675216782249641677168906120833230534971021742355668735687929091896175666876500006347222803210212631375777229696044706631724728254149463617716033302396933227863890157372790290233995392313821826983566333795103781153844010689705367866876395573767335136278953651277507312186731926532903168308989390791632885935949826790084692769229099264556000544482993008597606494205516727581482236383541063657052078233821338541513246237144247240590830971740874537135482701700958324991646101144590829094601038006398488740920465796629933308216061279639353750463603056759567826992705349280827423518730760471575559776467317297469894072959876295555711577623291341231240334568507706860032265067540564697722222144271200830667266315957331735226365235326039281300510228761442424478400377156239212703455594001241853910265448844789801726604797202532945123007980563402562095395238094022542320763664790699552827851396211457350705127421161251921443445513981361537189899239991716386926296459286522618390765481408114150633624011506148754014897247955369197187826578366144763148073513285072727446584433633489088312137846249844046634559194409090360096638581573528279706553907658205054124154830047879717182875967322129411313051795642923180733623661322110915690713689585101389937415101156669214729369866114242453296946091425236473782865861335598384719164772240403888592485356868870621800748871639269903338486650605375905346938983688226898999559283156527174355321103335086791075913022096822576359265959513025827624325734133591802598193083306874163459605674301966055953114636428410566892703362484439588146316758877673536193887236581140125293936103084249714403080878658996861280630505404415193355467779280069506338043384263588697899696252054007139085714087129549769637934832935602896512218849491000572892778459288879791829417283905351352612174075617765736308820625812297396043555548310325007648722786520242558074274625108561578996268413060368614732666088409545595826128543223567719720038169335346612909428728848814688690359884555752352227228385101307993106373221174625683717336143817116998796227106359127196127577440000343724526369471320935997030569459432982763741242773485553204133415364295557845616972761783463606926263355348348807579938980907891222120395933959636416838530531694236397141954774954831775139525904254282253309782389642898808492723162770825690114585782750231302873044335253462046109594733727288536265172625039889674387821289059105022201059730013066667389037477508887582464359761285947415652273373649287001481290831884906950633728084720450047240968156353209522010735777694197927924501000626008055152747264759816287979150016254303682017329831258454994097876887551946027084821471649407571949947985228336740122293389906650772653254844963417843948968113877504894557727804730742779858795565498186443870554103097116809032575135909777057519220967785923744425524116605066227277727846301671267867444382111975051778939894391316275467945145199080810298293567935210017538302640904821874756605044683864578782432814667254616354468569023517534655421182595837452350218532916619165421964631110126468238197376785638871034363887737858181775839832927751040359748796345714152245809969521791894585436616952676747208110938506667602538528008965271304506819421237661023179572988822709595628488781184124592825494000415353791638917058907606230593625922823686883410278034499115441697424459341960598853860346242966069239971055568353808208484004820733276638269048160529592223045358159646376<20.0,20000.0,1.0>Cutoff (Hz





)
slider8:11.313708498984760390413509793678<0.01,8.0,0.01>Q

in_pin:Left
in_pin:Right

out_pin:Left
out_pin:Right

import noise.jsfx-inc
import rc_filter.jsfx-inc
import zdf_filter.jsfx-inc

@init

function pow4(x) ( x*x*x*x );
function cache(x) ( x != this ? ( this = x; 1; ); );

function gain(db, inf)
(
  db <= inf ? 0 : exp(/* log(10)/20 */ 0.11512925464970228 * db);
);

smooth.rc_set(0.0033);

function smooth()
(
  smooth.rc_hp_precise = this.smooth;
  this.smooth = smooth.rc_hp_precise(this);
);

min_inf = -384.0;
dry.smooth = gain(slider4, min_inf);
wet.smooth = gain(slider5, min_inf);

// rms = 0;
rms[0] = 0.075;
rms[1] = 1/3;
rms[2] = 1;
rms[3] = 0.56;
rms[4] = sqrt(0.5);
rms[5] = 0.125;

ratio = 6;
ratio[3] = srate * 1/44100;
ratio[5] =
ratio[2] = sqrt(ratio[3]);
ratio[4] = ratio[2] * ratio[3];
ratio[0] = 1 / ratio[2];
ratio[1] = 1;

@slider

color = slider1|0;
gain = rms[color] * ratio[color];

rng0.lcg_density(color < 0 || color > 5 ? 0 : pow4(slider2) );
rng1.lcg_density(rng0.density);

stereo.cache(slider3 >= 0.5) ? (
  rng0.lcg_init(2147483646);
  stereo ? rng1.lcg_init(1518500249);
);

dry = gain(slider4, min_inf);
wet = gain(slider5, min_inf);

filter = max(slider6|0, 0);
filter > 4 ? filter = 0;

filter ? (
  fc = max(0, slider7);
  q = max(0.01, slider8);

  filter == 1 ? zdf0.zdf_lp(fc, q) :
  filter == 2 ? zdf0.zdf_bp(fc, q) :
  filter == 3 ? zdf0.zdf_hp(fc, q) :
  /* filter == 4 ? */ zdf0.zdf_bs(fc, q);

  stereo ? (
    zdf1.cb = zdf0.cb; zdf1.ch = zdf0.ch; zdf1.cl = zdf0.cl;
    zdf1.g = zdf0.g; zdf1.h = zdf0.h; zdf1.r2 = zdf0.r2;
  );
);

@sample

color == 0 ? (
  left = rng0.lcg_brown();
  stereo ? right = rng1.lcg_brown();
) :

color == 1 ? (
  left = rng0.lcg_pink();
  stereo ? right = rng1.lcg_pink();
) :

color == 3 ? (
  left = rng0.lcg_blue();
  stereo ? right = rng1.lcg_blue();
) :

color == 4 ? (
  left = rng0.lcg_violet();
  stereo ? right = rng1.lcg_violet();
) :

color == 5 ? (
  left = rng0.lcg_grey();
  stereo ? right = rng1.lcg_grey();
) :

/* color == 2 ? */ (
  left = rng0.lcg_black();
  stereo ? right = rng1.lcg_black();
);

left *= gain;
stereo ? right *= gain : right = left;

filter ? (
  left = zdf0.zdf_svf(left);
  right = stereo ? zdf1.zdf_svf(right) : left;
);

//spl0 = dry.smooth() * spl0 + wet.smooth() * left;
//spl1 = dry.smooth * spl1 + wet.smooth * right;

spl0 = (FLOOR( dry.smooth() * spl0 + wet.smooth() * left )+.5)*2;
spl1 = (FLOOR( dry.smooth() * spl1 + wet.smooth() * right)+.5)*2;
