First Draft of Code

First draft of the code to convert keyboard input to midi. There is a bug somewhere, the midi sounds continuously with new notes added but not switched off.

// Convert thirteen input wires from bass pedal into midi output
// Rob Ives 2012
// This code is realeased into the Public Domain.
 
#include <wire.h>
unsigned char data1; //data from chip 1
unsigned char data2; //data from chip 2
unsigned char keys[16]; //storage array for key states.
byte notevalue = 0; //lowest note on the bass board
 
void setup() // the setup loop
 
{
  Wire.begin(); // setup the I2C bus
  Serial.begin(9600); // serial set up for midi
  for (unsigned int i = 0; i < 16; i++) { //clear the keys array
    keys[i] = 1;
  }
}
// ----------------------------------------------------------------
void loop() // the main loop
{
  byte velocity; //note velocity
  velocity = 90; //initially set at 90 - add volume control later
  Wire.requestFrom(0x38, 1); // read the data from chip 1 into data1
  if (Wire.available()){
     data1 = Wire.read(); 
 
  }
  Wire.requestFrom(0x39, 1); // read the data freom chip 2 into data2
  if (Wire.available()){
     data2 = Wire.read();
  }
 
  for (unsigned char i = 0; i &lt; 8; i++) {// puts data bits from chip 1 into keys array     if (keys[i] != ((data1 &gt;&gt; i) &amp; 1)){ // edge detect. If the key state has changed.
      if (keys[i] == 1){// if the key was on send an Start Note midi command
        playnote(0x90, notevalue + i, velocity); // channel 1 midi on
      }
      else{ // send a end note midi command
        playnote(128, notevalue + i, 0); // channel 1 midi off
      }
    }
    keys[i] = ((data1 &gt;&gt; i) &amp; 1); // set the key variable to the current state.
  }
 
 /* for (unsigned char i = 0; i &lt; 8; i++) {// puts data bits from chip 2 into keys array     if (keys[i+8] != ((data2 &gt;&gt; i) &amp; 1)){ // edge detect. If the key state has changed.
      if (keys[i+8] == 1){// if the key was on send an start Note midi command
          //Serial.print(i+8);
          //Serial.println(" Midi On");
          Serial.print(0x80); // channel 1 midi on
          Serial.print(notevalue+i+8); //note value
          Serial.println(velocity); // note velocity
      }
      else{ // send a end note midi command
        //Serial.print(i+8);
        //Serial.println(" Midi Off");
        Serial.write(0x90); // channel 1 midi off
        Serial.write(notevalue+i+8); //note value
        Serial.write(velocity); // note velocity
      }
    }
    keys[i + 8] = ((data2 &gt;&gt; i) &amp; 1);
  } */
 
  /* for (unsigned char i = 0; i &lt; 16; i++) {
      Serial.print(keys[i]);
  }
  Serial.println("-"); */
}
 
//-------------------------------------
//play note
void playnote(byte cmd, byte data1, byte data2) {
   //--------------- debug
   Serial.print(cmd);
   Serial.print(" | ");
   Serial.print(data1);
   Serial.print(" | ");
   Serial.println(data2);
   //-----------------
   Serial.write(cmd);
   Serial.write(data1);
   Serial.write(data2);
 }

One thought on “First Draft of Code

  1. Hi I have just bought the exact same bass pedals and I want to do this project aswell. I have everything but the code I’ll give this a try later. How is the debugging going? also I wonder how hard it would be to add a octave switch?

    Thanks

Leave a Reply

Your email address will not be published. Required fields are marked *