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