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
Diff: main.cpp
- 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]¬stops)>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]¬stops; 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]¬stops; 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]¬stops; if (tval1>0) { tval1=1; }