Toyomasa Watarai / Mbed 2 deprecated melodic_keyboard

Dependencies:   mbed

Revision:
0:30b446b0af9a
Child:
1:2c75ba53ee40
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/main.cpp	Mon May 04 14:50:49 2015 +0000
@@ -0,0 +1,109 @@
+#include "mbed.h"
+
+DigitalIn  btn_0(D0);
+DigitalIn  btn_1(D1);
+DigitalIn  btn_2(D2);
+DigitalIn  btn_3(D3);
+DigitalIn  btn_4(D4);
+DigitalIn  btn_5(D5);
+DigitalIn  btn_6(D6);
+DigitalIn  btn_7(D7);
+DigitalIn  btn_8(D8);
+DigitalIn  btn_9(D9);
+DigitalIn  btn_10(D10);
+DigitalIn  btn_11(D11);
+DigitalIn  btn_12(D12);
+
+PwmOut tone_0(A0);
+PwmOut tone_1(A1);
+PwmOut tone_2(A2);
+PwmOut tone_3(A3);
+
+const int tone_table_us[] = {
+0,
+3820, // C    1
+3610, // C#   2
+3410, // D    3
+3210, // D#   4
+3030, // E    5
+2860, // F    6
+2700, // F#   7
+2550, // G    8
+2410, // G#   9
+2270, // A   10
+2150, // A#  11
+2020, // B   12
+1910  // C   13
+};
+
+#define MAX_PWM_CHANNEL 4
+#define NUM_KEYS        13
+
+int ch[MAX_PWM_CHANNEL] = {0};
+PwmOut *tone[MAX_PWM_CHANNEL];
+
+int key_index[NUM_KEYS];
+DigitalIn *key[NUM_KEYS];
+
+int getFreeChannel()
+{
+    for (int i = 0; i <MAX_PWM_CHANNEL; i++) {
+        if (ch[i] == 0) {
+            ch[i] = 1;
+            return i;
+        }
+    }
+    return -1;
+}
+
+int main()
+{
+    memset(key_index, -1, (NUM_KEYS)*4);
+
+    tone_0.period(0);
+    tone_1.period(0);
+    tone_2.period(0);
+    tone_3.period(0);
+
+    tone[0] = &tone_0;
+    tone[1] = &tone_1;
+    tone[2] = &tone_2;
+    tone[3] = &tone_3;
+
+    key[0] = &btn_0;
+    key[1] = &btn_1;
+    key[2] = &btn_2;
+    key[3] = &btn_3;
+    key[4] = &btn_4;
+    key[5] = &btn_5;
+    key[6] = &btn_6;
+    key[7] = &btn_7;
+    key[8] = &btn_8;
+    key[9] = &btn_9;
+    key[10] = &btn_10;
+    key[11] = &btn_11;
+    key[12] = &btn_12;
+
+    while(1) {
+        for (int i=0; i<NUM_KEYS; i++) {
+            volatile uint32_t dummy = key[i]->read();
+            if (key[i]->read() != 1) {
+                if (key_index[i] == -1) {
+                    int num = getFreeChannel();
+                    if (num != -1) {
+                        key_index[i] = num;
+                        tone[num]->period_us(tone_table_us[i+1]);
+                        tone[num]->write(0.5f);
+                    }
+                }
+            }
+            else {
+                if (key_index[i] != -1) {
+                    tone[key_index[i]]->period(0);
+                    ch[key_index[i]] = 0;
+                    key_index[i] = -1;
+                }
+            }
+        }
+    }
+}