Mono-Tabla MIDI Controller

 

Objective:

Prototype a MIDI controller

Audience:

Musicians experienced with playing the Tabla.

Components:

Arduino, MIDI tone generator, switches, wires, mount board.

Code:

#include <SoftwareSerial.h>
int keys[] = {8, 9, 10, 11};  
int lastKeyState[] = {0, 0, 0, 0}; 
int keyCount = 4;            
int baseNote = 40;         
 int lastSwitchState = 0;   
 int currentSwitchState = 0;
 int vol = 0;
SoftwareSerial midiSerial(2, 3);
void setup() {
  Serial.begin(9600);             
  midiSerial.begin(31250);              
  for (int k = 0; k < keyCount; k++) { 
    pinMode(keys[k], INPUT);      
  }
}
void loop() {
  int currentKeyState[] = {0, 0, 0, 0};
  for (int k = 0; k < keyCount; k++) {        
    currentKeyState[k] = digitalRead(keys[k]); 
    if (currentKeyState[k] != lastKeyState[k]) {
      int thisNote = k + baseNote;               
      int thisCommand = 0;
      if (currentKeyState[k] == HIGH ) {         
        thisCommand = 0x90;                  
        Serial.print(" on: ");
      } else {                                
        thisCommand = 0x80;                   
        Serial.print("off: ");
      }
      midiCommand(thisCommand, thisNote, 127); 
      Serial.println(thisNote, HEX);           
      lastKeyState[k] = currentKeyState[k];     
    }
  }
  int pitchBendSensor = analogRead(A0);        
  if (pitchBendSensor > 10 ) {                 
    byte msb = highByte(pitchBendSensor << 1);   
    byte lsb = lowByte(pitchBendSensor);         
    bitWrite(lsb, 7, 0);                         
    midiCommand(0xE0, lsb, msb);                
  }
int bassSensor = analogRead (A1);
Serial.println(bassSensor);
   vol = bassSensor/8;
   currentSwitchState = bassSensor;
   if (currentSwitchState > 1) {
     if (lastSwitchState < 1) {
       midiCommand(0x90, 35, vol);
     }
   }
   else {
     if (lastSwitchState > 1) {
       midiCommand(0x90, 35, vol);
     }
   }
   lastSwitchState = currentSwitchState;
   delay(50);
}
void midiCommand(byte cmd, byte data1, byte  data2) {
  midiSerial.write(cmd);    
  midiSerial.write(data1);   
  midiSerial.write(data2);  
}

Design

 
Nitish WakalkarComment