Melodic keyboard using 4ch PWMs

Dependencies:   mbed

Committer:
MACRUM
Date:
Mon May 04 14:50:49 2015 +0000
Revision:
0:30b446b0af9a
Child:
1:2c75ba53ee40
Initial commit

Who changed what in which revision?

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