1 //-----------------------------------------------------
2 // name: "NoiseRing"
3 // version: "1.0"
4 // author: "Julian Parker & Till Bovermann"
5 // license: "GPL2+"
6 // copyright: "(c) Julian Parker & Till Bovermann 2013"
7 //-----------------------------------------------------
8
9 #include "SC_PlugIn.h"
10 // #include <stdio.h>
11
12 // #ifndef MAXFLOAT
13 // # include <float.h>
14 // # define MAXFLOAT FLT_MAX
15 // #endif
16
17 // InterfaceTable contains pointers to functions in the host (server).
18 static InterfaceTable *ft;
19 typedef unsigned int uint;
20 // declare struct to hold unit generator state
21 struct DNoiseRing : public Unit
22 {
23 uint state;
24 };
25
26
27 // declare unit generator functions
28
29 void DNoiseRing_Ctor(DNoiseRing *unit);
30 void DNoiseRing_Dtor(DNoiseRing *unit);
31 void DNoiseRing_next(DNoiseRing *unit, int inNumSamples);
32
33 //////////////// DNoiseRing //////////////////////////////////////////////
34
35
DNoiseRing_Ctor(DNoiseRing * unit)36 void DNoiseRing_Ctor(DNoiseRing *unit)
37 {
38 SETCALC(DNoiseRing_next);
39
40 unit->state = 0;
41
42 DNoiseRing_next(unit, 0);
43 // printf("initial unit state: %d,\n", unit->state);
44 OUT0(0) = 0.f;
45 }
46
DNoiseRing_Dtor(DNoiseRing * unit)47 void DNoiseRing_Dtor(DNoiseRing *unit)
48 {
49 // unit->~DNoiseRing();
50 }
51
52
DNoiseRing_next(DNoiseRing * unit,int inNumSamples)53 void DNoiseRing_next(DNoiseRing *unit, int inNumSamples)
54 {
55 float change = DEMANDINPUT_A(0, inNumSamples);
56 float chance = DEMANDINPUT_A(1, inNumSamples);
57 uint shift = (uint) DEMANDINPUT_A(2, inNumSamples);
58 uint numBits = (uint) DEMANDINPUT_A(3, inNumSamples);
59 uint initialState = (uint) DEMANDINPUT_A(4, inNumSamples);
60
61 // get random state
62 RGET
63
64 if (inNumSamples) {// calc one sample
65 uint x = unit->state;
66
67 // bitwise rotate right
68 uint lsbs = x & ((1 << shift) - 1);
69 x = (x >> shift) | (lsbs << (numBits-shift));
70
71 float coin = frand(s1, s2, s3);
72 if(coin < change){
73 float flipUp = frand(s1, s2, s3);
74 if (flipUp < chance){
75 // set bit0 to 1
76 x |= 1;
77 } else {
78 // set bit0 to 0
79 x &= ~1;
80 }
81 };
82 unit->state = x;
83
84 OUT0(0) = (float) x;
85 } else {
86 unit->state = initialState; //trand(s1, s2, s3);
87 RESETINPUT(0);
88 RESETINPUT(1);
89 RESETINPUT(2);
90 RESETINPUT(3);
91 // do not reset the initialState slot
92 }
93 // save random state
94 RPUT
95 }
96
97
98
99 //////////////////////////////
PluginLoad(Chaos)100 PluginLoad(Chaos)
101 {
102 // InterfaceTable *inTable implicitly given as argument to load function
103 ft = inTable;
104 DefineDtorUnit(DNoiseRing);
105 }