⠀⠀⠀⠀ⵙᴥⵙⓄⵙ✤ⵙᗩⵙᴥⵙᗱᗴⵙИNⵙᗱᗴⵙᕤᕦⵙᗱᗴⵙᔓᔕⵙꖴⵙⓄⵙИNⵙ◯ⵙ✤ⵙᗱᗴⵙᗯⵙᙁⵙᗱᗴⵙᗯⵙ◯ⵙИNⵙᗩⵙꖴⵙᔓᔕⵙᑎⵙᗩⵙᕤᕦⵙ⠀⠀⠀⠀◯⠀⠀⠀⠀ⵙ⠀⠀⠀⠀◯⠀⠀⠀⠀ⵙᕤᕦⵙᗩⵙᑎⵙᔓᔕⵙꖴⵙᗩⵙИNⵙ◯ⵙᗯⵙᗱᗴⵙᙁⵙᗯⵙᗱᗴⵙ✤ⵙ◯ⵙИNⵙⓄⵙꖴⵙᔓᔕⵙᗱᗴⵙᕤᕦⵙᗱᗴⵙИNⵙᗱᗴⵙᴥⵙᗩⵙ✤ⵙⓄⵙᴥⵙ⠀⠀⠀⠀ 3.7KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159
  1. desc:O____ROTARENEG_ESION_TEWLEW_NAISUAG____O____GAUSIAN_WELWET_NOISE_GENERATOR____O
  2. //tags: analysis generator synthesis
  3. //author: SCHWA
  4. // Generator choices are listed in rough order of fanciness and cost.
  5. slider1:-16<-120,6,0.1>Noise dB (RMS)
  6. slider2:0.5<0,1,0.01>Wet Mix
  7. slider3:1<0,3,1{Central Limit Approximation,Box-Muller,Ziggurat (not implemented yet),Inverse Transform}>Gaussian Generator
  8. slider4:0<-1,1>Noise Mean (should be ~0)
  9. slider5:0<0,2>Noise Standard Deviation (should be ~1)
  10. in_pin:left input
  11. in_pin:right input
  12. out_pin:left output
  13. out_pin:right output
  14. @init
  15. AMP_DB = 20.0 / log(10);
  16. CENTRAL_LIMIT = 0;
  17. BOX_MULLER = 1;
  18. ZIGGURAT = 2;
  19. INV_TRANSFORM = 3;
  20. @slider
  21. noise_level = exp(slider1 / AMP_DB);
  22. (slider3 == CENTRAL_LIMIT) ? (
  23. N_DEV = 12;
  24. )
  25. :
  26. (slider3 == INV_TRANSFORM) ? (
  27. A1 = -39.69683028665376;
  28. A2 = 220.9460984245205;
  29. A3 = -275.9285104469687;
  30. A4 = 138.3577518672690;
  31. A5 = -30.66479806614716;
  32. A6 = 2.506628277459239;
  33. B1 = -54.47609879822406;
  34. B2 = 161.5858368580409;
  35. B3 = -155.6989798598866;
  36. B4 = 66.80131188771972;
  37. B5 = -13.28068155288572;
  38. C1 = -0.007784894002430293;
  39. C2 = -0.3223964580411365;
  40. C3 = -2.400758277161838;
  41. C4 = -2.549732539343734;
  42. C5 = 4.374664141464968;
  43. C6 = 2.938163982698783;
  44. D1 = 0.007784695709041462;
  45. D2 = 0.3224671290700398;
  46. D3 = 2.445134137142996;
  47. D4 = 3.754408661907416;
  48. P_LO = 0.02425;
  49. P_HI = 1.0 - P_LO;
  50. );
  51. i = sum = sum2 = 0;
  52. @sample
  53. z0 = z1 = 0;
  54. (slider3 == CENTRAL_LIMIT) ? (
  55. // Quick & dirty.
  56. loop (N_DEV,
  57. z0 += rand(1);
  58. z1 += rand(1);
  59. );
  60. z0 -= N_DEV / 2.0;
  61. z1 -= N_DEV / 2.0;
  62. )
  63. :
  64. (slider3 == BOX_MULLER) ? (
  65. // Conveniently a stereo twofer.
  66. w = 0;
  67. while (
  68. z0 = 2.0 * rand(1) - 1.0;
  69. z1 = 2.0 * rand(1) - 1.0;
  70. w = z0 * z0 + z1 * z1;
  71. w >= 1.0;
  72. );
  73. w = sqrt(-2.0 * log(w) / w);
  74. z0 *= w;
  75. z1 *= w;
  76. )
  77. :
  78. (slider3 == INV_TRANSFORM) ? (
  79. r0 = rand(1);
  80. r1 = rand(1);
  81. (r0 < P_LO) ? (
  82. q = sqrt(-2.0 * log(r0));
  83. z0 = ((((C1 * q + C2) * q + C3) * q + C4) * q + C5) * q + C6;
  84. z0 /= (((D1 * q + D2) * q + D3) * q + D4) * q + 1.0;
  85. )
  86. :
  87. (r0 < P_HI) ? (
  88. q = r0 - 0.5;
  89. r = q * q;
  90. z0 = (((((A1 * r + A2) * r + A3) * r + A4) * r + A5) * r + A6) * q;
  91. z0 /= ((((B1 * r + B2) * r + B3) * r + B4) * r + B5) * r + 1.0;
  92. )
  93. :
  94. (
  95. q = sqrt(-2.0 * log(1.0 - r0));
  96. z0 = -(((((C1 * q + C2) * q + C3) * q + C4) * q + C5) * q + C6);
  97. z0 /= (((D1 * q + D2) * q + D3) * q + D4) * q + 1.0;
  98. );
  99. (r1 < P_LO) ? (
  100. q = sqrt(-2.0 * log(r1));
  101. z1 = ((((C1 * q + C2) * q + C3) * q + C4) * q + C5) * q + C6;
  102. z1 /= (((D1 * q + D2) * q + D3) * q + D4) * q + 1.0;
  103. )
  104. :
  105. (r1 < P_HI) ? (
  106. q = r1 - 0.5;
  107. r = q * q;
  108. z1 = (((((A1 * r + A2) * r + A3) * r + A4) * r + A5) * r + A6) * q;
  109. z1 /= ((((B1 * r + B2) * r + B3) * r + B4) * r + B5) * r + 1.0;
  110. )
  111. :
  112. (
  113. q = sqrt(-2.0 * log(1.0 - r0));
  114. z1 = -(((((C1 * q + C2) * q + C3) * q + C4) * q + C5) * q + C6);
  115. z1 /= (((D1 * q + D2) * q + D3) * q + D4) * q + 1.0;
  116. );
  117. );
  118. spl0 = ((FLOOR(spl0 * (1.0 - slider2) + z0 * noise_level * slider2))+.5)/6;
  119. spl1 = ((FLOOR(spl1 * (1.0 - slider2) + z1 * noise_level * slider2))+.5)/6;
  120. //spl0 = spl0 * (1.0 - slider2) + z0 * noise_level * slider2;
  121. //spl1 = spl1 * (1.0 - slider2) + z1 * noise_level * slider2;
  122. sum += z0;
  123. sum2 += z0 * z0;
  124. i += 1;
  125. (i == srate) ? (
  126. mean = sum / srate;
  127. stdev = sqrt(sum2 / srate - mean * mean);
  128. slider4 = mean;
  129. slider5 = stdev;
  130. sliderchange(2^4 + 2^5);
  131. i = sum = sum2 = 0;
  132. );