Synth.cpp
 All Data Structures Namespaces Files Functions Variables Macros
synth.h
Go to the documentation of this file.
1 #ifndef SYNTH_H_INCLUDED
2 #define SYNTH_H_INCLUDED 1
3 
15 #include <stdlib.h>
16 
17 #ifndef __ARM
18 #define __ARM 1
19 #endif
20 
21 
22 #include <stdint.h>
23 
24 #define SAMPLING_RATE 40000
25 #define DT (1.0 / SAMPLING_RATE)
26 
27 #define ASSERT(cond) assertion(cond, #cond, __FILE__, __LINE__)
28 extern void assertion(int cond, const char *strcond,
29  const char *file, const int line);
30 
31 extern float small_random();
32 
33 extern uint8_t play_tune(uint32_t *tune, uint32_t msecs);
34 
36 #define BUFSIZE 1024
37 
38 #define MIN(x, y) (((x) < (y)) ? (x) : (y))
39 #define MAX(x, y) (((x) > (y)) ? (x) : (y))
40 
41 inline int32_t clip(int32_t x) {
42  return MAX(-0x800, MIN(0x7ff, x));
43 }
44 
45 class IVoice {
46 public:
47  virtual ~IVoice() {} // http://stackoverflow.com/questions/318064
48  virtual void quiet(void) = 0;
49  virtual void step(void) = 0;
50  virtual void setfreq(float f) = 0;
51  virtual void keydown(void) = 0;
52  virtual void keyup(void) = 0;
53  virtual int32_t output(void) = 0;
54  virtual bool idle(void) = 0;
55  virtual void ioctl(uint32_t, uint32_t) = 0;
56 };
57 
58 class ISynth {
59 public:
60  virtual ~ISynth() {}
61  virtual void quiet(void) = 0;
62  virtual void add(IVoice *voice) = 0;
63  virtual void keydown(int8_t pitch) = 0;
64  virtual void keyup(int8_t pitch) = 0;
65  virtual uint8_t get_sample(uint32_t *x) = 0;
66  virtual void write_sample(void) = 0;
67  virtual void compute_sample(void) = 0;
68  virtual void ioctl(uint32_t, uint32_t) = 0;
69 };
70 
71 extern void use_read_key(uint8_t (*rk)(uint32_t));
72 extern void use_synth_array(ISynth **s, uint8_t _num_synths);
73 extern ISynth * get_synth(void);
74 extern void use_synth(uint8_t i);
75 
95 class Queue
96 {
98  uint32_t buffer[BUFSIZE];
99  inline int size(void) {
100  return (wpointer + BUFSIZE - rpointer) & (BUFSIZE - 1);
101  }
102  inline int empty(void) {
103  return size() == 0;
104  }
105  inline int full(void) {
106  return size() == BUFSIZE - 1;
107  }
108 public:
109  Queue() {
110  wpointer = rpointer = 0;
111  }
117  uint8_t read(uint32_t *x);
123  uint8_t write(uint32_t x);
124 };
125 
126 class Synth : public ISynth {
127  IVoice * voices[32];
130  IVoice * get_next_available_voice(int8_t pitch);
132  uint32_t x, again;
133 
134  uint32_t get_12_bit_value(void);
135 
136 public:
137  Synth() {
138  uint32_t i;
139  again = num_voices = 0;
141  for (i = 0; i < 100; i++) {
142  assignments[i] = NULL;
143  }
144  }
145 
146  void add(IVoice *voice) {
147  voices[num_voices++] = voice;
148  }
149 
150  void quiet(void);
151 
152  // Pitch is in half-tones, middle C is at 0.
153  void keydown(int8_t pitch);
154  void keyup(int8_t pitch);
155 
156  uint8_t get_sample(uint32_t *x) {
157  return samples.read(x);
158  }
159 
160  // On a Teensy, you want to overload this method with a version
161  // where interrupts are disabled
162  void write_sample(void) {
163  again = samples.write(x);
164  }
165 
166  void compute_sample(void);
167 
168  void ioctl(uint32_t param, uint32_t value) {
169  uint32_t i;
170  for (i = 0; i < num_voices; i++) {
171  voices[i]->ioctl(param, value);
172  }
173  }
174 };
175 
176 class ADSR {
177  uint32_t _value; // 28 bits used, 16 are fraction bits
178  int32_t dvalue;
179  uint32_t count;
180  uint8_t _state;
182 
183  void rare_step(void);
184 
185 public:
186  ADSR() {
187  _state = _value = dvalue = count = 0;
188  }
189 
190  void setA(float a);
191  void setD(float d);
192  void setS(float s);
193  void setR(float r);
194 
195  uint32_t state() {
196  return _state;
197  }
198  void quiet(void) {
199  _state = 0;
200  _value = 0;
201  dvalue = 0;
202  }
203  int32_t output() {
204  return _value >> 16;
205  }
206  void keydown(void);
207  void keyup(void);
208 
209  void step(void);
210 };
211 
212 class Filter {
214 
215  void compute_two_k(void);
216 
217 public:
218  Filter() {
219  integrator1 = integrator2 = u = 0;
220  }
221 
222  void setF(uint32_t f);
223  void setQ(float q);
224  void step(int32_t x);
225 
226  int32_t highpass(void) {
227  return u;
228  }
229  int32_t bandpass(void) {
230  return integrator1;
231  }
232  int32_t lowpass(void) {
233  return integrator2;
234  }
235 };
236 
237 class Oscillator {
243  uint32_t phase;
249  uint32_t dphase;
250  uint32_t waveform;
251 
252 public:
254  waveform = 1;
255  }
256 
257  void setfreq(float f) {
258  dphase = (int32_t)((f * (1LL << 32)) / SAMPLING_RATE);
259  }
260  void setwaveform(int32_t x) {
261  // 0 ramp, 1 triangle, 2 square
262  waveform = x;
263  }
264 
265  void step(void) {
266  phase += dphase;
267  }
268  uint32_t get_phase(void) {
269  return phase;
270  }
271  int32_t output(void);
272 };
273 
278 class Key {
279 public:
283  uint32_t id;
287  uint32_t state;
291  uint32_t count;
295  int8_t pitch;
300 
301  Key() {
302  count = state = 0;
303  voice = NULL;
304  }
309  void check(void);
314  void keydown(void);
319  void keyup(void);
320 };
321 
322 #endif // SYNTH_H_INCLUDED
void keydown(void)
Definition: synth.cpp:253
Queue()
Definition: synth.h:109
IVoice * get_next_available_voice(int8_t pitch)
Definition: synth.cpp:169
int size(void)
Definition: synth.h:99
void rare_step(void)
Definition: synth.cpp:210
virtual void add(IVoice *voice)=0
uint32_t count
Definition: synth.h:179
Definition: synth.h:58
tuple q
Definition: test.py:48
Definition: synth.h:126
#define MIN(x, y)
Definition: synth.h:38
void compute_sample(void)
Definition: synth.cpp:145
uint8_t read(uint32_t *x)
Definition: synth.cpp:100
void setfreq(float f)
Definition: synth.h:257
def f
Definition: test.py:35
int32_t output(void)
Definition: synth.cpp:270
void step(void)
Definition: synth.cpp:262
uint32_t _value
Definition: synth.h:177
int32_t integrator2
Definition: synth.h:213
void quiet(void)
Definition: synth.h:198
void setR(float r)
Definition: synth.cpp:249
uint32_t dphase
Definition: synth.h:249
float attack
Definition: synth.h:181
uint32_t id
Definition: synth.h:283
void compute_two_k(void)
Definition: synth.cpp:300
Oscillator()
Definition: synth.h:253
ThreadSafeSynth s
Definition: teensy.ino:55
virtual ~ISynth()
Definition: synth.h:60
void step(void)
Definition: synth.h:265
int32_t w0dt
Definition: synth.h:213
Queue samples
Definition: synth.h:131
void write_sample(void)
Definition: synth.h:162
virtual bool idle(void)=0
float small_random()
Definition: synth.cpp:45
virtual void keyup(int8_t pitch)=0
Definition: synth.h:212
Definition: synth.h:95
void setA(float a)
Definition: synth.cpp:237
virtual void keydown(int8_t pitch)=0
void setS(float s)
Definition: synth.cpp:245
void add(IVoice *voice)
Definition: synth.h:146
uint32_t next_voice_to_assign
Definition: synth.h:129
int32_t two_k
Definition: synth.h:213
#define SAMPLING_RATE
Definition: synth.h:24
void setD(float d)
Definition: synth.cpp:241
uint32_t again
Definition: synth.h:132
int32_t bandpass(void)
Definition: synth.h:229
uint32_t count
Definition: synth.h:291
Definition: synth.h:45
virtual void write_sample(void)=0
void keyup(void)
Definition: synth.cpp:258
uint32_t num_voices
Definition: synth.h:129
void setF(uint32_t f)
Definition: synth.cpp:305
virtual void keydown(void)=0
uint8_t play_tune(uint32_t *tune, uint32_t msecs)
Definition: synth.cpp:51
void use_synth(uint8_t i)
Definition: synth.cpp:29
uint32_t state
Definition: synth.h:287
#define BUFSIZE
Definition: synth.h:36
uint32_t get_phase(void)
Definition: synth.h:268
uint32_t state()
Definition: synth.h:195
uint32_t get_12_bit_value(void)
Definition: synth.cpp:156
int rpointer
Definition: synth.h:97
float decay
Definition: synth.h:181
IVoice * voice
Definition: synth.h:299
uint32_t x
Definition: synth.h:132
virtual void quiet(void)=0
Filter()
Definition: synth.h:218
int wpointer
Definition: synth.h:97
uint8_t _state
Definition: synth.h:180
int32_t integrator1
Definition: synth.h:213
virtual void quiet(void)=0
Key()
Definition: synth.h:301
int32_t _k
Definition: synth.h:213
IVoice * assignments[100]
Definition: synth.h:128
float sustain
Definition: synth.h:181
uint32_t tune[]
Definition: tune.cpp:3
int32_t clip(int32_t x)
Definition: synth.h:41
void use_read_key(uint8_t(*rk)(uint32_t))
Definition: synth.cpp:24
void step(int32_t x)
Definition: synth.cpp:321
#define MAX(x, y)
Definition: synth.h:39
int full(void)
Definition: synth.h:105
uint32_t waveform
Definition: synth.h:250
ADSR()
Definition: synth.h:186
virtual void step(void)=0
uint32_t buffer[BUFSIZE]
Definition: synth.h:98
void keyup(int8_t pitch)
Definition: synth.cpp:137
virtual void setfreq(float f)=0
int32_t _f
Definition: synth.h:213
virtual int32_t output(void)=0
uint8_t write(uint32_t x)
Definition: synth.cpp:107
void use_synth_array(ISynth **s, uint8_t _num_synths)
Definition: synth.cpp:39
int empty(void)
Definition: synth.h:102
Definition: synth.h:278
virtual uint8_t get_sample(uint32_t *x)=0
Synth()
Definition: synth.h:137
void keydown(void)
Definition: synth.cpp:360
virtual void ioctl(uint32_t, uint32_t)=0
virtual void compute_sample(void)=0
float release
Definition: synth.h:181
Definition: synth.h:176
void quiet(void)
Definition: synth.cpp:114
void setwaveform(int32_t x)
Definition: synth.h:260
uint32_t phase
Definition: synth.h:243
void check(void)
Definition: synth.cpp:330
virtual ~IVoice()
Definition: synth.h:47
ISynth * get_synth(void)
Definition: synth.cpp:34
void keydown(int8_t pitch)
Definition: synth.cpp:123
int32_t u
Definition: synth.h:213
int32_t highpass(void)
Definition: synth.h:226
int32_t dvalue
Definition: synth.h:178
int32_t lowpass(void)
Definition: synth.h:232
IVoice * voices[32]
Definition: synth.h:127
void assertion(int cond, const char *strcond, const char *file, const int line)
Definition: synth.cpp:86
uint8_t get_sample(uint32_t *x)
Definition: synth.h:156
void keyup(void)
Definition: synth.cpp:366
int32_t output()
Definition: synth.h:203
virtual void keyup(void)=0
virtual void ioctl(uint32_t, uint32_t)=0
int8_t pitch
Definition: synth.h:295
void ioctl(uint32_t param, uint32_t value)
Definition: synth.h:168
void setQ(float q)
Definition: synth.cpp:312