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 }