32 Channels MIDI trigger Schematic Diagram

Here is the schematic diagram to build 32 channels MIDI trigger board to use with Arduino.

mutiplex_var1_schematic

Arduino sketch:

Drum sketch
 
  1. // TAPDRUM 32 input triggers MIDI board
  2. //  Mux address pins
  3. #define addr1 4
  4. #define addr2 5
  5. #define addr3 6
  6. #define addr4 3
  7. int ledPin = 13   ;    // Led connected to digital pin 13
  8. int pzo = 0 ;     // Piezo connected to analog channels start with analog 0
  9. int mux=0 ;  // multiplexer address start with address 0
  10. int val[32]    ;     // array to store the value read from the sensor pin
  11. int valold[32];
  12. // 32 address location for MIDI percussion/drum notes
  13. // General MIDI drum notes reference
  14. //note=35 Bass Drum 2
  15. //note=36 Bass Drum 1
  16. //note=37 Side Stick
  17. //note=38 Snare Drum 1
  18. //note=39 Hand Clap
  19. //note=40 Snare Drum 2
  20. //notemutiplex_var1_scheet=41 Low Tom 2
  21. //note=42 Closed Hi-hat
  22. //...... note=81 open triangle
  23. int loc[32] = {35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66};
  24. int i = 0; 
  25. int inh=0;
  26. int statePin = 0; // variable used to store the last LED status , to toglle the light
  27. byte THRESHOLD = 5;  // threshold value to decide when the detected sound is a knock or not
  28. void setup()  
  29. {
  30.  pinMode(ledPin, OUTPUT); // declare the ledPin  as OUTPUT
  31.   pinMode(addr1, OUTPUT);
  32.   pinMode(addr2, OUTPUT);
  33.   pinMode(addr3, OUTPUT);
  34.   pinMode(addr4, OUTPUT);
  35. //Arduino Leonardo standard MIDI
  36. Serial.begin(31250); //standard MIDI
  37. //Serial.begin(57600);  // set MIDI baud rate  for Spikienzilab.com  serial to MIDI converter
  38. //Serial.begin(31250); //standard MIDI
  39. //Serial.begin(38400); // Roland USB MIDI
  40. //Serial.begin(36000);  // set MIDI baud rate for ser2MIDI software
  41. }  
  42. void loop(){
  43.  
  44.   digitalWrite(addr4, LOW);
  45.   for (mux=0; mux <8; mux++) {
  46.     // set control pins on the multiplexers
  47.    
  48.     digitalWrite(addr1, (mux&7)>>2);//bit3
  49.     digitalWrite(addr2, (mux&3)>>1);//bit2
  50.     digitalWrite(addr3, (mux&1)   );//bit1
  51.  
  52.   // deal with  piezo analog channel loop
  53. for (pzo=0; pzo<4; pzo++)
  54. {
  55.   valold[mux+8*pzo]= val[mux+8*pzo];
  56.   val[mux+8*pzo] = analogRead(pzo)/8;  
  57.   
  58.  if (val[mux+8*pzo] >=THRESHOLD & valold[mux+8*pzo] >=val[mux+8*pzo]) 
  59.  //if (val >  20)
  60.    {
  61.      //remove following comments to check trigger input and value
  62. //    Serial.print ("trigger-->");
  63. //    Serial.print (mux+8*pzo);
  64. //    Serial.print ("--value---->");
  65.  //   Serial.println (valold[mux+8*pzo]);
  66.   noteOn (153 , loc[mux+8*pzo], valold[mux+8*pzo]);
  67.     digitalWrite(ledPin, HIGH);
  68.    delay(2);
  69.     noteOn (137 , loc[mux+8*pzo], 0);
  70.     digitalWrite(ledPin, LOW);
  71.    delay(2); 
  72.     valold[mux+8*pzo]= 0;
  73.  val[mux+8*pzo]= 0;
  74.    }
  75. }  
  76. }
  77. }
  78. // plays a MIDInote doesn't check to see that cmd is greater  than 127 or that data values are less than 127
  79. //void noteOn(unsigned char cmd, unsigned char data1, unsigned char data2) {
  80. // Serial.print(cmd);
  81. // Serial.print(data1);
  82. // Serial.print(data2);
  83. void noteOn(int cmd, int data1, int data2) {
  84.  Serial.write(cmd);
  85.  Serial.write(data1);
  86.  Serial.write(data2);
  87. //For arduino leonardo
  88. // Serial1.write(cmd);
  89. // Serial1.write(data1);
  90. // Serial1.write(data2);
  91. }
Press Ctrl+C to copy the following code.
"