Toyomasa Watarai
/
melodic_keyboard
Melodic keyboard using 4ch PWMs
main.cpp@1:2c75ba53ee40, 2015-05-04 (annotated)
- Committer:
- MACRUM
- Date:
- Mon May 04 14:54:28 2015 +0000
- Revision:
- 1:2c75ba53ee40
- Parent:
- 0:30b446b0af9a
Add LPC1549 platform check
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
MACRUM | 0:30b446b0af9a | 1 | #include "mbed.h" |
MACRUM | 0:30b446b0af9a | 2 | |
MACRUM | 1:2c75ba53ee40 | 3 | #if !defined(TARGET_LPC1549) |
MACRUM | 1:2c75ba53ee40 | 4 | #error This program uses 4ch PWMs of the LPC1549 platfrom |
MACRUM | 1:2c75ba53ee40 | 5 | #endif |
MACRUM | 1:2c75ba53ee40 | 6 | |
MACRUM | 0:30b446b0af9a | 7 | DigitalIn btn_0(D0); |
MACRUM | 0:30b446b0af9a | 8 | DigitalIn btn_1(D1); |
MACRUM | 0:30b446b0af9a | 9 | DigitalIn btn_2(D2); |
MACRUM | 0:30b446b0af9a | 10 | DigitalIn btn_3(D3); |
MACRUM | 0:30b446b0af9a | 11 | DigitalIn btn_4(D4); |
MACRUM | 0:30b446b0af9a | 12 | DigitalIn btn_5(D5); |
MACRUM | 0:30b446b0af9a | 13 | DigitalIn btn_6(D6); |
MACRUM | 0:30b446b0af9a | 14 | DigitalIn btn_7(D7); |
MACRUM | 0:30b446b0af9a | 15 | DigitalIn btn_8(D8); |
MACRUM | 0:30b446b0af9a | 16 | DigitalIn btn_9(D9); |
MACRUM | 0:30b446b0af9a | 17 | DigitalIn btn_10(D10); |
MACRUM | 0:30b446b0af9a | 18 | DigitalIn btn_11(D11); |
MACRUM | 0:30b446b0af9a | 19 | DigitalIn btn_12(D12); |
MACRUM | 0:30b446b0af9a | 20 | |
MACRUM | 0:30b446b0af9a | 21 | PwmOut tone_0(A0); |
MACRUM | 0:30b446b0af9a | 22 | PwmOut tone_1(A1); |
MACRUM | 0:30b446b0af9a | 23 | PwmOut tone_2(A2); |
MACRUM | 0:30b446b0af9a | 24 | PwmOut tone_3(A3); |
MACRUM | 0:30b446b0af9a | 25 | |
MACRUM | 0:30b446b0af9a | 26 | const int tone_table_us[] = { |
MACRUM | 0:30b446b0af9a | 27 | 0, |
MACRUM | 0:30b446b0af9a | 28 | 3820, // C 1 |
MACRUM | 0:30b446b0af9a | 29 | 3610, // C# 2 |
MACRUM | 0:30b446b0af9a | 30 | 3410, // D 3 |
MACRUM | 0:30b446b0af9a | 31 | 3210, // D# 4 |
MACRUM | 0:30b446b0af9a | 32 | 3030, // E 5 |
MACRUM | 0:30b446b0af9a | 33 | 2860, // F 6 |
MACRUM | 0:30b446b0af9a | 34 | 2700, // F# 7 |
MACRUM | 0:30b446b0af9a | 35 | 2550, // G 8 |
MACRUM | 0:30b446b0af9a | 36 | 2410, // G# 9 |
MACRUM | 0:30b446b0af9a | 37 | 2270, // A 10 |
MACRUM | 0:30b446b0af9a | 38 | 2150, // A# 11 |
MACRUM | 0:30b446b0af9a | 39 | 2020, // B 12 |
MACRUM | 0:30b446b0af9a | 40 | 1910 // C 13 |
MACRUM | 0:30b446b0af9a | 41 | }; |
MACRUM | 0:30b446b0af9a | 42 | |
MACRUM | 0:30b446b0af9a | 43 | #define MAX_PWM_CHANNEL 4 |
MACRUM | 0:30b446b0af9a | 44 | #define NUM_KEYS 13 |
MACRUM | 0:30b446b0af9a | 45 | |
MACRUM | 0:30b446b0af9a | 46 | int ch[MAX_PWM_CHANNEL] = {0}; |
MACRUM | 0:30b446b0af9a | 47 | PwmOut *tone[MAX_PWM_CHANNEL]; |
MACRUM | 0:30b446b0af9a | 48 | |
MACRUM | 0:30b446b0af9a | 49 | int key_index[NUM_KEYS]; |
MACRUM | 0:30b446b0af9a | 50 | DigitalIn *key[NUM_KEYS]; |
MACRUM | 0:30b446b0af9a | 51 | |
MACRUM | 0:30b446b0af9a | 52 | int getFreeChannel() |
MACRUM | 0:30b446b0af9a | 53 | { |
MACRUM | 0:30b446b0af9a | 54 | for (int i = 0; i <MAX_PWM_CHANNEL; i++) { |
MACRUM | 0:30b446b0af9a | 55 | if (ch[i] == 0) { |
MACRUM | 0:30b446b0af9a | 56 | ch[i] = 1; |
MACRUM | 0:30b446b0af9a | 57 | return i; |
MACRUM | 0:30b446b0af9a | 58 | } |
MACRUM | 0:30b446b0af9a | 59 | } |
MACRUM | 0:30b446b0af9a | 60 | return -1; |
MACRUM | 0:30b446b0af9a | 61 | } |
MACRUM | 0:30b446b0af9a | 62 | |
MACRUM | 0:30b446b0af9a | 63 | int main() |
MACRUM | 0:30b446b0af9a | 64 | { |
MACRUM | 0:30b446b0af9a | 65 | memset(key_index, -1, (NUM_KEYS)*4); |
MACRUM | 0:30b446b0af9a | 66 | |
MACRUM | 0:30b446b0af9a | 67 | tone_0.period(0); |
MACRUM | 0:30b446b0af9a | 68 | tone_1.period(0); |
MACRUM | 0:30b446b0af9a | 69 | tone_2.period(0); |
MACRUM | 0:30b446b0af9a | 70 | tone_3.period(0); |
MACRUM | 0:30b446b0af9a | 71 | |
MACRUM | 0:30b446b0af9a | 72 | tone[0] = &tone_0; |
MACRUM | 0:30b446b0af9a | 73 | tone[1] = &tone_1; |
MACRUM | 0:30b446b0af9a | 74 | tone[2] = &tone_2; |
MACRUM | 0:30b446b0af9a | 75 | tone[3] = &tone_3; |
MACRUM | 0:30b446b0af9a | 76 | |
MACRUM | 0:30b446b0af9a | 77 | key[0] = &btn_0; |
MACRUM | 0:30b446b0af9a | 78 | key[1] = &btn_1; |
MACRUM | 0:30b446b0af9a | 79 | key[2] = &btn_2; |
MACRUM | 0:30b446b0af9a | 80 | key[3] = &btn_3; |
MACRUM | 0:30b446b0af9a | 81 | key[4] = &btn_4; |
MACRUM | 0:30b446b0af9a | 82 | key[5] = &btn_5; |
MACRUM | 0:30b446b0af9a | 83 | key[6] = &btn_6; |
MACRUM | 0:30b446b0af9a | 84 | key[7] = &btn_7; |
MACRUM | 0:30b446b0af9a | 85 | key[8] = &btn_8; |
MACRUM | 0:30b446b0af9a | 86 | key[9] = &btn_9; |
MACRUM | 0:30b446b0af9a | 87 | key[10] = &btn_10; |
MACRUM | 0:30b446b0af9a | 88 | key[11] = &btn_11; |
MACRUM | 0:30b446b0af9a | 89 | key[12] = &btn_12; |
MACRUM | 0:30b446b0af9a | 90 | |
MACRUM | 0:30b446b0af9a | 91 | while(1) { |
MACRUM | 0:30b446b0af9a | 92 | for (int i=0; i<NUM_KEYS; i++) { |
MACRUM | 0:30b446b0af9a | 93 | volatile uint32_t dummy = key[i]->read(); |
MACRUM | 0:30b446b0af9a | 94 | if (key[i]->read() != 1) { |
MACRUM | 0:30b446b0af9a | 95 | if (key_index[i] == -1) { |
MACRUM | 0:30b446b0af9a | 96 | int num = getFreeChannel(); |
MACRUM | 0:30b446b0af9a | 97 | if (num != -1) { |
MACRUM | 0:30b446b0af9a | 98 | key_index[i] = num; |
MACRUM | 0:30b446b0af9a | 99 | tone[num]->period_us(tone_table_us[i+1]); |
MACRUM | 0:30b446b0af9a | 100 | tone[num]->write(0.5f); |
MACRUM | 0:30b446b0af9a | 101 | } |
MACRUM | 0:30b446b0af9a | 102 | } |
MACRUM | 0:30b446b0af9a | 103 | } |
MACRUM | 0:30b446b0af9a | 104 | else { |
MACRUM | 0:30b446b0af9a | 105 | if (key_index[i] != -1) { |
MACRUM | 0:30b446b0af9a | 106 | tone[key_index[i]]->period(0); |
MACRUM | 0:30b446b0af9a | 107 | ch[key_index[i]] = 0; |
MACRUM | 0:30b446b0af9a | 108 | key_index[i] = -1; |
MACRUM | 0:30b446b0af9a | 109 | } |
MACRUM | 0:30b446b0af9a | 110 | } |
MACRUM | 0:30b446b0af9a | 111 | } |
MACRUM | 0:30b446b0af9a | 112 | } |
MACRUM | 0:30b446b0af9a | 113 | } |