Mozzi  version 2016-12-11-17:03
sound synthesis library for Arduino
mozzi_rand.cpp
1 #include "mozzi_rand.h"
2 
3 // moved these out of xorshift96() so xorshift96() can be reseeded manually
4 static unsigned long x=132456789, y=362436069, z=521288629;
5 // static unsigned long x= analogRead(A0)+123456789;
6 // static unsigned long y= analogRead(A1)+362436069;
7 // static unsigned long z= analogRead(A2)+521288629;
8 
17 unsigned long xorshift96()
18 { //period 2^96-1
19  // static unsigned long x=123456789, y=362436069, z=521288629;
20  unsigned long t;
21 
22  x ^= x << 16;
23  x ^= x >> 5;
24  x ^= x << 1;
25 
26  t = x;
27  x = y;
28  y = z;
29  z = t ^ x ^ y;
30 
31  return z;
32 }
33 
34 
44 void randSeed(long seed)
45 {
46  x=seed;
47 }
48 
49 
50 #if defined (__AVR_ATmega644P__)
51 
52 // a less fancy version for gizduino (__AVR_ATmega644P__) which doesn't know INTERNAL
53 static long longRandom()
54 {
55  return ((long)analogRead(0)+63)*(analogRead(1)+97); // added offsets in case analogRead is 0
56 }
57 
58 #elif defined (__AVR_ATmega2560__)
59 /*
60 longRandom(), used as a seed generator, comes from:
61 http://arduino.cc/forum/index.php/topic,38091.0.html
62 // AUTHOR: Rob Tillaart
63 // PURPOSE: Simple Random functions based upon unreliable internal temp sensor
64 // VERSION: 0.1
65 // DATE: 2011-05-01
66 //
67 // Released to the public domain, use at own risk
68 //
69 */
70 static long longRandom()
71 {
72  //analogReference(INTERNAL2V56);
73  unsigned long rv = 0;
74  for (uint8_t i=0; i< 32; i++) rv |= ((analogRead(8)+2294) & 1L) << i; // added 2294 in case analogRead is 0
75  return rv;
76 }
77 
78 #else
79 
80 static long longRandom()
81 {
82  //analogReference(INTERNAL);
83  unsigned long rv = 0;
84  for (uint8_t i=0; i< 32; i++) rv |= ((analogRead(8)+1171) & 1L) << i; // added 1171 in case analogRead is 0
85  return rv;
86 }
87 
88 
89 #endif
90 
91 
106 void randSeed() {
107  #if defined(__MK20DX128__) || defined(__MK20DX256__) || defined(TEENSYDUINO) // teensy 3, 3.1
108 #else
109  ADCSRA &= ~ (1 << ADIE); // adc Disable Interrupt, re-enable at end
110  // this attempt at remembering analog_reference stops it working
111  // maybe needs a delay after changing analog reference in longRandom (Arduino reference suggests this)
112  // because the analog reads return 0
113  //uint8_t analog_reference_orig = ADMUX&192; // analog_reference is high 2 bits of ADMUX, store this because longRandom sets it to internal
114  x=longRandom();
115  y=longRandom();
116  z=longRandom();
117  //analogReference(analog_reference_orig); // change back to original
118  ADCSRA |= (1 << ADIE); // adc re-Enable Interrupt
119  #endif
120 }
121 
122 
123 
128 void xorshiftSeed(long seed)
129 {
130  x=seed;
131 }
132 
133 
134 
141 int8_t rand(int8_t minval, int8_t maxval)
142 {
143  return (int8_t) ((((int) (lowByte(xorshift96()))) * (maxval-minval))>>8) + minval;
144 }
145 
146 
153 uint8_t rand(uint8_t minval, uint8_t maxval)
154 {
155  return (uint8_t) ((((unsigned int) (lowByte(xorshift96()))) * (maxval-minval))>>8) + minval;
156 }
157 
158 
165 int rand( int minval, int maxval)
166 {
167  return (int) ((((xorshift96() & 0xFFFF) * (maxval-minval))>>16) + minval);
168 }
169 
170 
177 unsigned int rand(unsigned int minval, unsigned int maxval)
178 {
179  return (unsigned int) ((((xorshift96() & 0xFFFF) * (maxval-minval))>>16) + minval);
180 }
181 
182 
188 int8_t rand(int8_t maxval)
189 {
190  return (int8_t) ((((int) (lowByte(xorshift96()))) * maxval)>>8);
191 }
192 
193 
199 uint8_t rand(uint8_t maxval)
200 {
201  return (uint8_t) ((((unsigned int) (lowByte(xorshift96()))) * maxval)>>8);
202 }
203 
204 
210 int rand(int maxval)
211 {
212  return (int) (((xorshift96() & 0xFFFF) * maxval)>>16);
213 }
214 
215 
221 unsigned int rand(unsigned int maxval)
222 {
223  return (unsigned int) (((xorshift96() & 0xFFFF) * maxval)>>16);
224 }
225 
226 
231 uint8_t randMidiNote()
232 {
233  return lowByte(xorshift96())>>1;
234 }
void xorshiftSeed(long seed)
Initialises Mozzi&#39;s (pseudo)random number generator xorshift96() with a chosen seed number...
Definition: mozzi_rand.cpp:128
void randSeed(long seed)
Initialises Mozzi&#39;s (pseudo)random number generator xorshift96(), which is used in Mozzi&#39;s rand() fun...
Definition: mozzi_rand.cpp:44
unsigned long xorshift96()
Random number generator.
Definition: mozzi_rand.cpp:17
uint8_t randMidiNote()
Generates a random number in the range for midi notes.
Definition: mozzi_rand.cpp:231
int8_t rand(int8_t minval, int8_t maxval)
Ranged random number generator, faster than Arduino&#39;s built-in random function, which is too slow for...
Definition: mozzi_rand.cpp:141