summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--notes.c195
1 files changed, 99 insertions, 96 deletions
diff --git a/notes.c b/notes.c
index 25122f5..4688d67 100644
--- a/notes.c
+++ b/notes.c
@@ -25,6 +25,69 @@
25 25
26unsigned short freqs[] = { 26unsigned short freqs[] = {
27 // PD3-7 27 // PD3-7
28 100,
29 200,
30 250,
31 300,
32 350,
33 // PB0-4
34 400,
35 450, // middle c
36 500,
37 600,
38 700,
39 // PC0-4
40 750,
41 800,
42 850,
43 900,
44 950,
45
46 // notes
47 [MARIO] = 131, // C3
48 262, // C4
49 110, // A2
50 220, // A3
51 117, // Bb2
52 233, // Bb3
53
54 87,
55 175,
56 73,
57 147,
58 78,
59 156,
60
61 156,
62 147,
63 139,
64 131,
65 156,
66 147,
67 104,
68 98,
69 139,
70
71 156,
72 185,
73 175,
74 165,
75 233,
76 220,
77 208,
78 156,
79 123,
80 123,
81 110,
82 104,
83
84 ['"'] = 16000,
85
86 [255] = 0 // used as a 'silent' note
87};
88
89unsigned short t_freqs[] = {
90 // PD3-7
28 FREQ(100), 91 FREQ(100),
29 FREQ(200), 92 FREQ(200),
30 FREQ(250), 93 FREQ(250),
@@ -86,8 +149,9 @@ unsigned short freqs[] = {
86 [255] = 0 // used as a 'silent' note 149 [255] = 0 // used as a 'silent' note
87}; 150};
88unsigned char note = 0; 151unsigned char note = 0;
89// 0 = buttons write note+cycles+\xff to UART 152// 0 = normal/piano mode
90// 1 = buttons don't do anything, speaker reads note+cycles+\xff from UART 153// 1 = recording mode
154// 2 = mario demo
91unsigned char mode = '0'; 155unsigned char mode = '0';
92 156
93ISR (PCINT0_vect) 157ISR (PCINT0_vect)
@@ -126,9 +190,9 @@ ISR (PCINT2_vect)
126void 190void
127usart_init(void) 191usart_init(void)
128{ 192{
129 // 115200 bps, RX/TX enabled 193 // 9600 bps, TX enabled
130 UBRR0 = 103; 194 UBRR0 = 103;
131 UCSR0B = (1 << RXEN0) | (1 << TXEN0); 195 UCSR0B = 1 << TXEN0;
132 UCSR0C = (1 << UCSZ01) | (1 << UCSZ00); 196 UCSR0C = (1 << UCSZ01) | (1 << UCSZ00);
133} 197}
134 198
@@ -158,7 +222,7 @@ playtone(void)
158{ 222{
159 // Prepare Timer/Counter 223 // Prepare Timer/Counter
160 TCNT1 = 1; 224 TCNT1 = 1;
161 OCR1A = freqs[note]; 225 OCR1A = t_freqs[note];
162 TCCR1B |= 1 << CS11; 226 TCCR1B |= 1 << CS11;
163 227
164 // Monitor OutPut Compare Flag 228 // Monitor OutPut Compare Flag
@@ -177,24 +241,10 @@ play_note(unsigned char _note, unsigned short _cycles)
177 241
178 usart_send(note); 242 usart_send(note);
179 243
180 if (note != 255) { 244 for (unsigned short i = 0; i < _cycles; i++)
181 for (unsigned short i = 0; i < _cycles; i++) 245 playtone();
182 playtone(); 246
183 } else { 247 _delay_ms(25);
184 // when note is 255, don't play anything for _cycles ms
185 // Prepare Timer/Counter
186 TCNT1 = 1;
187 OCR1A = 16e3 * _cycles / T1_PRESCALAR;
188 TCCR1B |= 1 << CS11;
189
190 // Monitor OutPut Compare Flag
191 while ((TIFR1 & (1 << OCF1A)) == 0);
192
193 // Toggles port For Speaker
194 PORTD ^= 1 << P_SPKR;
195 TIFR1 |= 1 << OCF1A;
196 TCCR1B &= ~(1 << CS11);
197 }
198} 248}
199 249
200int 250int
@@ -224,6 +274,8 @@ main(void)
224 for (unsigned char n = 0;; n = (n + 1) % 2) { 274 for (unsigned char n = 0;; n = (n + 1) % 2) {
225 if (PINC & _BV(5)) 275 if (PINC & _BV(5))
226 mode = '2'; 276 mode = '2';
277 else if (PINB & _BV(5))
278 mode = '3';
227 else 279 else
228 mode = '0'; 280 mode = '0';
229 281
@@ -243,79 +295,30 @@ main(void)
243 playtone(); 295 playtone();
244 296
245 cycles = (cycles + 1) % 0xffff; 297 cycles = (cycles + 1) % 0xffff;
246 } else if (mode == '2') { 298 } else if (mode == '1') {
247 play_note(MARIO + 0, 131 * 0.3); 299
248 play_note(MARIO + 1, 262 * 0.3); 300 } else if (mode == '3') {
249 play_note(MARIO + 2, 110 * 0.3); 301 for (unsigned char i = 0; i < 2; i++) {
250 play_note(MARIO + 3, 220 * 0.3); 302 for (unsigned char j = 0; j <= 5; j++)
251 play_note(MARIO + 4, 117 * 0.3); 303 play_note(MARIO + j, freqs[MARIO + j] * 0.3);
252 play_note(MARIO + 5, 233 * 0.3); 304 _delay_ms(1800);
253 _delay_ms(1800); 305 }
254 play_note(MARIO + 0, 131 * 0.3); 306
255 play_note(MARIO + 1, 262 * 0.3); 307 for (unsigned char i = 0; i < 2; i++) {
256 play_note(MARIO + 2, 110 * 0.3); 308 for (unsigned char j = 6; j <= 11; j++)
257 play_note(MARIO + 3, 220 * 0.3); 309 play_note(MARIO + j, freqs[MARIO + j] * 0.3);
258 play_note(MARIO + 4, 117 * 0.3); 310 _delay_ms(1800);
259 play_note(MARIO + 5, 233 * 0.3); 311 }
260 _delay_ms(1800); 312
261 313 for (unsigned char i = 12; i <= 14; i++)
262 play_note(MARIO + 6, 87 * 0.3); 314 play_note(MARIO + i, freqs[MARIO + i] * 0.3);
263 play_note(MARIO + 7, 175 * 0.3); 315 for (unsigned char i = 15; i <= 20; i++)
264 play_note(MARIO + 8, 73 * 0.3); 316 play_note(MARIO + i, freqs[MARIO + i] * 0.6);
265 play_note(MARIO + 9, 147 * 0.3); 317
266 play_note(MARIO + 10, 78 * 0.3); 318 for (unsigned char i = 21; i <= 26; i++)
267 play_note(MARIO + 11, 156 * 0.3); 319 play_note(MARIO + i, freqs[MARIO + i] * 0.3);
268 _delay_ms(1800); 320 for (unsigned char i = 27; i <= 32; i++)
269 play_note(MARIO + 6, 87 * 0.3); 321 play_note(MARIO + i, freqs[MARIO + i] * 0.6);
270 play_note(MARIO + 7, 175 * 0.3);
271 play_note(MARIO + 8, 73 * 0.3);
272 play_note(MARIO + 9, 147 * 0.3);
273 play_note(MARIO + 10, 78 * 0.3);
274 play_note(MARIO + 11, 156 * 0.3);
275 _delay_ms(1800);
276
277 play_note(MARIO + 12, 156 * 0.3);
278 _delay_ms(25);
279 play_note(MARIO + 13, 147 * 0.3);
280 _delay_ms(25);
281 play_note(MARIO + 14, 139 * 0.3);
282 _delay_ms(25);
283 play_note(MARIO + 15, 131 * 0.6);
284 _delay_ms(25);
285 play_note(MARIO + 16, 156 * 0.3);
286 _delay_ms(25);
287 play_note(MARIO + 17, 147 * 0.6);
288 _delay_ms(25);
289 play_note(MARIO + 18, 104 * 0.6);
290 _delay_ms(25);
291 play_note(MARIO + 19, 98 * 0.6);
292 _delay_ms(25);
293 play_note(MARIO + 20, 139 * 0.6);
294
295 play_note(MARIO + 21, 156 * 0.3);
296 _delay_ms(25);
297 play_note(MARIO + 22, 185 * 0.3);
298 _delay_ms(25);
299 play_note(MARIO + 23, 175 * 0.3);
300 _delay_ms(25);
301 play_note(MARIO + 24, 165 * 0.3);
302 _delay_ms(25);
303 play_note(MARIO + 25, 233 * 0.3);
304 _delay_ms(25);
305 play_note(MARIO + 26, 220 * 0.3);
306 _delay_ms(25);
307 play_note(MARIO + 27, 208 * 0.6);
308 _delay_ms(25);
309 play_note(MARIO + 28, 156 * 0.6);
310 _delay_ms(25);
311 play_note(MARIO + 29, 123 * 0.6);
312 _delay_ms(25);
313 play_note(MARIO + 30, 123 * 0.6);
314 _delay_ms(25);
315 play_note(MARIO + 31, 110 * 0.6);
316 _delay_ms(25);
317 play_note(MARIO + 32, 104 * 0.6);
318 _delay_ms(25);
319 } 322 }
320 } 323 }
321} 324}