The Tooba
 All Data Structures Namespaces Files Functions Variables Macros Pages
teensy.ino
Go to the documentation of this file.
1 /*
2 We have a 40 kHz or 50 kHz timer interrupt that handles sound
3 samples. First it writes the previously computed sample to the serial DAC.
4 Then it computes the sample for the next time.
5 */
6 
7 #if ! defined(__ARDUINO)
8 #define __ARDUINO 1
9 #include <TimerOne.h>
10 #endif
11 
12 #include <string.h>
13 #include <stdarg.h>
14 #include <math.h>
15 
16 #include "common.h"
17 #include "voice.h"
18 #include "key.h"
19 #include "queue.h"
20 
24 
25 void timer_interrupt(void);
26 
27 void setup() {
28  int i;
29 #if __ARDUINO
30  analogWriteResolution(12);
31  Timer1.initialize((int) (1000000 * DT));
32  Timer1.attachInterrupt(timer_interrupt);
33  pinMode(11, INPUT_PULLUP);
34  pinMode(10, OUTPUT);
35  digitalWrite(10, LOW);
36  pinMode(2, OUTPUT);
37  pinMode(3, OUTPUT);
38  pinMode(4, OUTPUT);
39  pinMode(5, OUTPUT);
40  pinMode(6, OUTPUT);
41  pinMode(7, OUTPUT);
42  pinMode(8, OUTPUT);
43  pinMode(9, OUTPUT);
44  pinMode(LED_BUILTIN, OUTPUT);
45 #endif
46 
47  for (i = 0; i < NUM_VOICES; i++)
48  v[i].setfreq(6 + 2 * i);
49 
50  for (i = 0; i < NUM_KEYS; i++) {
51  keyboard[i] = new Key();
52  keyboard[i]->id = i;
53  keyboard[i]->pitch = 440.0 * pow(1.0594631, i - 9);
54  }
55 }
56 
57 
58 uint32_t get_12_bit_value(void)
59 {
60  int i;
61  int64_t x = 0;
62  for (i = 0; i < NUM_VOICES; i++)
63  x += v[i].output();
64  return ((x >> (20 + NUM_VOICE_BITS)) + 0x800) & 0xFFF;
65 }
66 
72 void timer_interrupt(void)
73 {
74  static uint8_t led_time;
75  uint32_t x;
76  if (samples.read(&x) == 0) {
77 #if __ARDUINO
78  analogWrite(A14, x);
79 #endif
80  } else {
81  led_time = 100;
82  }
83  if (led_time > 0) {
84  led_time--;
85 #if __ARDUINO
86  digitalWrite(LED_BUILTIN, HIGH);
87 #endif
88  } else {
89 #if __ARDUINO
90  digitalWrite(LED_BUILTIN, LOW);
91 #endif
92  }
93 }
94 
95 uint8_t read_key(uint32_t id)
96 {
97  uint32_t Y = 0;
98 #if __ARDUINO
99  uint32_t j = id, chip;
100  digitalWrite(10, LOW);
101  j = id;
102  switch (id) { // OOPS WIRING ERRORS
103  case 0:
104  j = 1;
105  break;
106  case 1:
107  j = 0;
108  break;
109  }
110  chip = j >> 3;
111  digitalWrite(4, (j >> 2) & 1);
112  digitalWrite(3, (j >> 1) & 1);
113  digitalWrite(2, (j >> 0) & 1);
114  digitalWrite(5, chip == 1); // OOPS WIRING ERROR
115  digitalWrite(6, chip == 0);
116  digitalWrite(7, chip == 2);
117  digitalWrite(8, chip == 3);
118  digitalWrite(9, chip == 4);
119  Y = 0;
120  digitalWrite(10, HIGH);
121  while (!digitalReadFast(11)) Y++;
122  digitalWrite(10, LOW);
123 #endif
124  return Y;
125 }
126 
133 void compute_sample(void) {
134  int i;
135  static uint32_t x, again = 0;
136 
137  if (!again) {
138  for (i = 0; i < NUM_VOICES; i++)
139  v[i].step();
140  x = get_12_bit_value();
141  }
142 #if __ARDUINO
143  cli();
144 #endif
145  again = samples.write(x);
146 #if __ARDUINO
147  sei();
148 #endif
149 }
150 
158 void loop(void) {
159  int i;
160 
161  for (i = 0; i < NUM_KEYS; i++)
162  keyboard[i]->check();
163  for (i = 0; i < 64; i++)
164  compute_sample();
165 }
#define HIGH
Definition: instr.cpp:13
void compute_sample(void)
Definition: teensy.ino:133
uint8_t read(uint32_t *x)
Definition: queue.h:50
Voice v[NUM_VOICES]
Definition: teensy.ino:21
float pitch
Definition: key.h:29
uint32_t id
Definition: key.h:16
#define LOW
Definition: instr.cpp:14
uint32_t get_12_bit_value(void)
Definition: teensy.ino:58
void setup()
Definition: teensy.ino:27
Definition: voice.h:132
Definition: queue.h:28
uint8_t read_key(uint32_t id)
Definition: teensy.ino:95
#define NUM_KEYS
Definition: common.h:30
#define NUM_VOICES
Definition: common.h:32
#define NUM_VOICE_BITS
Definition: common.h:31
Key * keyboard[NUM_KEYS]
Definition: teensy.ino:22
uint8_t write(uint32_t x)
Definition: queue.h:61
Definition: key.h:11
tuple x
Definition: testit.py:14
Queue samples
Definition: teensy.ino:23
#define DT
Definition: common.h:28
void timer_interrupt(void)
Definition: teensy.ino:72
void loop(void)
Definition: teensy.ino:158