mirror of
				https://code.rhodecode.com/u/OOOOOOOOOOOOOOOO/OOOOOOOOOOOOOOOO/000080-0-8-088-00-080-00-880-8-0-080000
				synced 2025-10-21 09:48:43 +02:00 
			
		
		
		
	
		
			
				
	
	
		
			159 lines
		
	
	
	
		
			3.7 KiB
		
	
	
	
		
			Text
		
	
	
	
	
	
			
		
		
	
	
			159 lines
		
	
	
	
		
			3.7 KiB
		
	
	
	
		
			Text
		
	
	
	
	
	
| desc:O____ROTARENEG_ESION_TEWLEW_NAISUAG____O____GAUSIAN_WELWET_NOISE_GENERATOR____O
 | |
| //tags: analysis generator synthesis
 | |
| //author: SCHWA
 | |
| 
 | |
| // Generator choices are listed in rough order of fanciness and cost.
 | |
| 
 | |
| slider1:-16<-120,6,0.1>Noise dB (RMS)
 | |
| slider2:0.5<0,1,0.01>Wet Mix
 | |
| slider3:1<0,3,1{Central Limit Approximation,Box-Muller,Ziggurat (not implemented yet),Inverse Transform}>Gaussian Generator
 | |
| slider4:0<-1,1>Noise Mean (should be ~0)
 | |
| slider5:0<0,2>Noise Standard Deviation (should be ~1)
 | |
| 
 | |
| in_pin:left input
 | |
| in_pin:right input
 | |
| out_pin:left output
 | |
| out_pin:right output
 | |
| 
 | |
| @init
 | |
| 
 | |
| AMP_DB = 20.0 / log(10);
 | |
| 
 | |
| CENTRAL_LIMIT = 0;
 | |
| BOX_MULLER = 1;
 | |
| ZIGGURAT = 2;
 | |
| INV_TRANSFORM = 3;
 | |
| 
 | |
| @slider
 | |
| 
 | |
| noise_level = exp(slider1 / AMP_DB);
 | |
| 
 | |
| (slider3 == CENTRAL_LIMIT) ? (
 | |
|   N_DEV = 12;
 | |
| )
 | |
| :
 | |
| (slider3 == INV_TRANSFORM) ? (
 | |
|    A1 = -39.69683028665376;
 | |
|    A2 =  220.9460984245205;
 | |
|    A3 = -275.9285104469687;
 | |
|    A4 =  138.3577518672690;
 | |
|    A5 = -30.66479806614716;
 | |
|    A6 =  2.506628277459239;
 | |
| 
 | |
|    B1 = -54.47609879822406;
 | |
|    B2 =  161.5858368580409;
 | |
|    B3 = -155.6989798598866;
 | |
|    B4 =  66.80131188771972;
 | |
|    B5 = -13.28068155288572;
 | |
| 
 | |
|    C1 = -0.007784894002430293;
 | |
|    C2 = -0.3223964580411365;
 | |
|    C3 = -2.400758277161838;
 | |
|    C4 = -2.549732539343734;
 | |
|    C5 =  4.374664141464968;
 | |
|    C6 =  2.938163982698783;
 | |
| 
 | |
|    D1 =  0.007784695709041462;
 | |
|    D2 =  0.3224671290700398;
 | |
|    D3 =  2.445134137142996;
 | |
|    D4 =  3.754408661907416;
 | |
| 
 | |
|    P_LO = 0.02425;
 | |
|    P_HI = 1.0 - P_LO;
 | |
| );
 | |
| 
 | |
| i = sum = sum2 = 0;
 | |
| 
 | |
| @sample
 | |
| 
 | |
| z0 = z1 = 0;
 | |
| 
 | |
| (slider3 == CENTRAL_LIMIT) ? (
 | |
| 
 | |
|   // Quick & dirty.  
 | |
|   loop (N_DEV, 
 | |
|     z0 += rand(1);
 | |
|     z1 += rand(1);
 | |
|   );
 | |
|   z0 -= N_DEV / 2.0;
 | |
|   z1 -= N_DEV / 2.0;
 | |
| )
 | |
| :
 | |
| (slider3 == BOX_MULLER) ? (
 | |
| 
 | |
|   // Conveniently a stereo twofer.
 | |
|   w = 0;
 | |
|   while (
 | |
|     z0 = 2.0 * rand(1) - 1.0;
 | |
|     z1 = 2.0 * rand(1) - 1.0;
 | |
|     w = z0 * z0 + z1 * z1;
 | |
|     w >= 1.0;
 | |
|   );
 | |
|   w = sqrt(-2.0 * log(w) / w);
 | |
|   z0 *= w;
 | |
|   z1 *= w;
 | |
| )
 | |
| :
 | |
| (slider3 == INV_TRANSFORM) ? (
 | |
| 
 | |
|    r0 = rand(1);
 | |
|    r1 = rand(1);
 | |
| 
 | |
|    (r0 < P_LO) ? (
 | |
|      q = sqrt(-2.0 * log(r0));
 | |
|      z0 = ((((C1 * q + C2) * q + C3) * q + C4) * q + C5) * q + C6;
 | |
|      z0 /= (((D1 * q + D2) * q + D3) * q + D4) * q + 1.0;
 | |
|    )
 | |
|    :
 | |
|    (r0 < P_HI) ? (
 | |
|      q = r0 - 0.5;
 | |
|      r = q * q;
 | |
|      z0 = (((((A1 * r + A2) * r + A3) * r + A4) * r + A5) * r + A6) * q;
 | |
|      z0 /= ((((B1 * r + B2) * r + B3) * r + B4) * r + B5) * r + 1.0;
 | |
|    )
 | |
|    :
 | |
|    (
 | |
|      q = sqrt(-2.0 * log(1.0 - r0));
 | |
|      z0 = -(((((C1 * q + C2) * q + C3) * q + C4) * q + C5) * q + C6);
 | |
|      z0 /= (((D1 * q + D2) * q + D3) * q + D4) * q + 1.0;
 | |
|    );
 | |
| 
 | |
|    (r1 < P_LO) ? (
 | |
|      q = sqrt(-2.0 * log(r1));
 | |
|      z1 = ((((C1 * q + C2) * q + C3) * q + C4) * q + C5) * q + C6;
 | |
|      z1 /= (((D1 * q + D2) * q + D3) * q + D4) * q + 1.0;
 | |
|    )
 | |
|    :
 | |
|    (r1 < P_HI) ? (
 | |
|      q = r1 - 0.5;
 | |
|      r = q * q;
 | |
|      z1 = (((((A1 * r + A2) * r + A3) * r + A4) * r + A5) * r + A6) * q;
 | |
|      z1 /= ((((B1 * r + B2) * r + B3) * r + B4) * r + B5) * r + 1.0;
 | |
|    )
 | |
|    :
 | |
|    (
 | |
|      q = sqrt(-2.0 * log(1.0 - r0));
 | |
|      z1 = -(((((C1 * q + C2) * q + C3) * q + C4) * q + C5) * q + C6);
 | |
|      z1 /= (((D1 * q + D2) * q + D3) * q + D4) * q + 1.0;
 | |
|    );
 | |
| );
 | |
| 
 | |
| spl0 = ((FLOOR(spl0 * (1.0 - slider2) + z0 * noise_level * slider2))+.5)/6;
 | |
| spl1 = ((FLOOR(spl1 * (1.0 - slider2) + z1 * noise_level * slider2))+.5)/6;
 | |
| //spl0 = spl0 * (1.0 - slider2) + z0 * noise_level * slider2;
 | |
| //spl1 = spl1 * (1.0 - slider2) + z1 * noise_level * slider2;
 | |
| 
 | |
| sum += z0;
 | |
| sum2 += z0 * z0;
 | |
| 
 | |
| i += 1;
 | |
| (i == srate) ? (
 | |
|   mean = sum / srate;
 | |
|   stdev = sqrt(sum2 / srate - mean * mean);
 | |
|   slider4 = mean;
 | |
|   slider5 = stdev;
 | |
|   sliderchange(2^4 + 2^5);
 | |
|   i = sum = sum2 = 0;
 | |
| );
 | |
| 
 | |
| 
 | 
