diff options
| author | Vineet K <git@vineetk.net> | 2024-04-22 13:18:20 -0400 |
|---|---|---|
| committer | Shokara Kou <kou@13f0.net> | 2024-04-22 13:43:06 -0400 |
| commit | b33e1fe796c489065b652f887b9ffec08d3f1091 (patch) | |
| tree | efd9b183c83ba17f0f840805f774ae3deca770bf /notes.c | |
| parent | 8cacc107c96a8816c8d15ad491af583ec75825de (diff) | |
Diffstat (limited to 'notes.c')
| -rw-r--r-- | notes.c | 195 |
1 files changed, 99 insertions, 96 deletions
| @@ -25,6 +25,69 @@ | |||
| 25 | 25 | ||
| 26 | unsigned short freqs[] = { | 26 | unsigned 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 | |||
| 89 | unsigned 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 | }; |
| 88 | unsigned char note = 0; | 151 | unsigned 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 | ||
| 91 | unsigned char mode = '0'; | 155 | unsigned char mode = '0'; |
| 92 | 156 | ||
| 93 | ISR (PCINT0_vect) | 157 | ISR (PCINT0_vect) |
| @@ -126,9 +190,9 @@ ISR (PCINT2_vect) | |||
| 126 | void | 190 | void |
| 127 | usart_init(void) | 191 | usart_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 | ||
| 200 | int | 250 | int |
| @@ -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 | } |
