USBMIDI sampled pipe organ uses real pipe organ samples to produce a realistic sound with 16 note polyphony. A serial output will drive external TPIC6A596 shift registers that could be used to drive pipe organ magnets (Solenoid valves)

Dependencies:   TextLCD USBDevice mbed

Revision:
13:decb94698003
Parent:
12:74b52900cddb
Child:
15:c1854904f0d7
--- a/main.cpp	Sun Nov 08 14:23:33 2015 +0000
+++ b/main.cpp	Sun Nov 08 15:03:24 2015 +0000
@@ -40,11 +40,13 @@
 DigitalIn sw3(PTA4);
 
 //Stop switches on = 0
-DigitalIn p1 (PTB2);                                                                                    //16'
-DigitalIn p2 (PTB3);                                                                                    //8'
-DigitalIn p3 (PTB10);                                                                                   //4'
-DigitalIn p4 (PTB11);                                                                                   //2 2/3'
-DigitalIn p5 (PTC11);                                                                                   //2'
+//DigitalIn p1 (PTB2);                                                                                    //16'
+//DigitalIn p2 (PTB3);                                                                                    //8'
+//DigitalIn p3 (PTB10);                                                                                   //4'
+//DigitalIn p4 (PTB11);                                                                                   //2 2/3'
+//DigitalIn p5 (PTC11);                                                                                   //2'
+
+BusInOut stops (PTB2, PTB3, PTB10, PTB11, PTC11);
 
 //Wi-Fi connector J6 note pin 3 is incorrectly idenifed in the documentation as PTC12
 //Connects the shift register solenoid driver board
@@ -109,6 +111,7 @@
 int synthstat[16]= {};
 unsigned char synthoctave[16]= {};
 unsigned char synthnote[16]= {};
+unsigned char notstops=0;
 int sucess=0;
 int noteidx=0;
 int i;
@@ -224,21 +227,13 @@
         case MIDIMessage::NoteOnType:                                                                   //MIDI note on received
             if (key<120) {
                 onoff=1;
-                if(p1==0& key>35) {
-                    keybuf[(key-36)]|= 1 << 1;                                                          //Store @ 16' pitch
-                }
-                if (p2==0) {
-                    keybuf[(key-24)]|= 1 << 2;                                                          //Store @ 8' pitch
+                if(key>35) {
+                    keybuf[(key-36)]|= 1 << 0;                                                          //Store @ 16' pitch
                 }
-                if (p3==0) {
-                    keybuf[(key)-12]|= 1 << 3;                                                          //Store @ 4' pitch
-                }
-                if (p4==0) {
-                    keybuf[(key)-5]|= 1 << 4;                                                           //Store @ 2 2/3' pitch
-                }
-                if (p5==0) {
-                    keybuf[(key)]|= 1 << 5;                                                             //Store @ 2' pitch
-                }
+                    keybuf[(key-24)]|= 1 << 1;                                                          //Store @ 8' pitch
+                    keybuf[(key)-12]|= 1 << 2;                                                          //Store @ 4' pitch
+                    keybuf[(key)-5]|= 1 << 3;                                                           //Store @ 2 2/3' pitch
+                    keybuf[(key)]|= 1 << 4;                                                             //Store @ 2' pitch
             }
 
             break;
@@ -248,12 +243,12 @@
             if (key<120) {
                 onoff=0;
                 if (key>35) {
-                    keybuf[(key-36)]&= ~(1 << 1);                                                       //Store @ 16' pitch
+                    keybuf[(key-36)]&= ~(1 << 0);                                                       //Store @ 16' pitch
                 }
-                keybuf[(key-24)]&= ~(1 << 2);                                                           //Store @ 8' pitch
-                keybuf[(key-12)]&= ~(1 << 3);                                                           //Store @ 4' pitch
-                keybuf[(key-5)]&= ~(1 << 4);                                                            //Store @ 2 2/3' pitch
-                keybuf[(key)]&= ~(1 << 5);                                                              //Store @ 2' pitch
+                keybuf[(key-24)]&= ~(1 << 1);                                                           //Store @ 8' pitch
+                keybuf[(key-12)]&= ~(1 << 2);                                                           //Store @ 4' pitch
+                keybuf[(key-5)]&= ~(1 << 3);                                                            //Store @ 2 2/3' pitch
+                keybuf[(key)]&= ~(1 << 4);                                                              //Store @ 2' pitch
             }
             break;
 
@@ -282,12 +277,14 @@
 
     sw1.mode(PullUp);
     sw3.mode(PullUp);
-    p1.mode(PullUp);
-    p2.mode(PullUp);
-    p3.mode(PullUp);
-    p4.mode(PullUp);
-    p5.mode(PullUp);
-
+//    p1.mode(PullUp);
+//    p2.mode(PullUp);
+//    p3.mode(PullUp);
+//    p4.mode(PullUp);
+//    p5.mode(PullUp);
+    stops.mode(PullUp);
+    stops.input();
+    
     output_ticker.attach(&aout, sample_rate);                                                           //Set Sample frequency
 
     lcd.cls();
@@ -324,8 +321,11 @@
         }
 //Process keys on
 //Find a free note generator and start the note playing, if no slots available just ignore the note
+        notstops=~stops;
+        notstops=notstops&0x1f;
+        
         for (keyidx=95; keyidx>=0; keyidx--) {
-            if (keybuf[keyidx]>0 & oldkeybuf[keyidx]==0) {                                              //Key is pressed
+            if ((keybuf[keyidx]&notstops)>0 & oldkeybuf[keyidx]==0) {                                              //Key is pressed
 //Find and use any channel that is free
                 sucess=0;
                 ii=0;
@@ -479,7 +479,7 @@
                     if(keyidx_t>94) {
                         keyidx_t=keyidx_t-95;
                     }
-                    tval=keybuf[keyidx_t];
+                    tval=keybuf[keyidx_t]&notstops;
                     if(tval>0) {
                         tval=1;
                     }
@@ -488,7 +488,7 @@
                     if(keyidx_t>94) {
                         keyidx_t=keyidx_t-95;
                     }
-                    tval1=keybuf[keyidx_t];
+                    tval1=keybuf[keyidx_t]&notstops;
                     if (tval1>0) {
                         tval1=1;
                     }
@@ -499,7 +499,7 @@
                     if(keyidx_t>94) {
                         keyidx_t=keyidx_t-95;
                     }
-                    tval1=keybuf[keyidx_t];
+                    tval1=keybuf[keyidx_t]&notstops;
                     if (tval1>0) {
                         tval1=1;
                     }