1 /*
2 * noiser.cc
3 * DIN Is Noise is copyright (c) 2006-2021 Jagannathan Sampath
4 * DIN Is Noise is released under GNU Public License 2.0
5 * For more information, please visit https://dinisnoise.org/
6 */
7 
8 #include "noiser.h"
9 #include "keyboard_keyboard.h"
10 #include "audio.h"
11 #include "console.h"
12 
noiser()13 noiser::noiser () {
14 	warp (&interp);
15 	last_vol = 0.0f;
16 	set_spread (0.0f);
17 	set_value (0);
18 }
19 
set_value(float v)20 void noiser::set_value (float v) {
21 	value.cur = v;
22 	value.next = random_value ();
23 	value.delta = value.next - value.cur;
24 	alpha.val = 0.0f;
25 }
26 
calc_delta_alpha()27 void noiser::calc_delta_alpha () {
28 	if (samples.due < 3) alpha.delta = 1; else alpha.delta = 1.0f / (samples.due - 1);
29 }
30 
set_samples(float sn)31 void noiser::set_samples (float sn) {
32 	samples.next = sn;
33 	samples.duei = samples.due = int (sn);
34 	samples.derr = samples.next - samples.duei;
35 	calc_delta_alpha ();
36 }
37 
set_spread(float s)38 void noiser::set_spread (float s) {
39 	spread = s;
40 	random_value.set (-spread, spread);
41 }
42 
operator ()(float * L,float * R,int n,float * vola)43 void noiser::operator() (float* L, float* R, int n, float* vola) {
44 	for (int i = 0; i < n; ++i) {
45 		alpha.val += alpha.delta;
46 		alpha.warp = warp (alpha.val);
47 		float no = value.cur + alpha.warp * value.delta;
48 		float vno = vola[i] * no;
49 		L[i] += vno;
50 		R[i] += vno;
51 		if (++samples.cur < samples.due); else {
52 			set_value (no);
53 			samples.cur = 0;
54 			samples.err += samples.derr;
55 			if (samples.err < 1.0f) {
56 				samples.due = samples.duei;
57 			} else {
58 				samples.due = samples.duei + 1;
59 				samples.err = 1.0f - samples.err;
60 			}
61 			calc_delta_alpha ();
62 		}
63 	}
64 }
65 
operator ()(float * L,float * R,int n,float vol)66 void noiser::operator() (float* L, float* R, int n, float vol) {
67 	float v = last_vol;
68 	float dv = (vol - last_vol) * 1.0f / n;
69 	for (int i = 0; i < n; ++i) {
70 		alpha.val += alpha.delta;
71 		alpha.warp = warp (alpha.val);
72 		float no = value.cur + alpha.warp * value.delta;
73 		v += dv;
74 		float vno = v * no;
75 		L[i] += vno;
76 		R[i] += vno;
77 		if (++samples.cur < samples.due); else {
78 			set_value (no);
79 			samples.cur = 0;
80 			samples.err += samples.derr;
81 			if (samples.err < 1.0f) {
82 				samples.due = samples.duei;
83 			} else {
84 				samples.due = samples.duei + 1;
85 				samples.err = 1.0f - samples.err;
86 			}
87 			calc_delta_alpha ();
88 		}
89 	}
90 	last_vol = vol;
91 }
92 
operator <<(ofstream & o,noiser & n)93 ofstream& operator<< (ofstream& o, noiser& n) {
94 	extern const char spc;
95 	o << n.spread << spc << n.samples.next;
96 	return o;
97 }
98