Melodic keyboard using 4ch PWMs

Dependencies:   mbed

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?

UserRevisionLine numberNew 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 }