Sunday, January 16, 2011

So I'm a guitarist that has been playing for right around 12 years. As such, I've amassed some equipment that is quite pricey.

Last week a power surge took out my Behringer FCB1010 midi foot controller that I use to control my Behringer V-Amp Pro multieffects processor. Double damn it!

I was sad and pissed off. I think I went through the seven stages of grief when I saw a bunch of surface mount resistors and transistors let the magic smoke out on the foot controller's main circuit board. Then a thought occurred to me. The controller board is nothing more than a crude microcontroller like a BASIC Stamp or an Arduino. All of the actual physical controls were in tact (pushbuttons and rheostats). I could build a better foot controller with an Arduino.

Planning

I have all of the original manuals for both the V-Amp and the FCB1010 that show the MIDI implementation and control codes. So those values just need plugged into the code.

I want this new controller to have the following features:
  1. Run on phantom power through the MIDI out port
  2. USB port mounted where the mains power used to come into the chassis for programming without tearing the thing apart.
  3. Fully-functional volume and wah expression pedals
  4. All selector switches function as labeled.

Reverse Engineering

All drawings are the circuit boards unmodified. Some changes may be necessary.
The footswitch PCB Both identical to this:
The MIDI out PCB (MIDI in won't be used so omitted):

The Code

I'm really crappy at coding for a microcontroller that I haven't even received in the mail yet. As such, the code so far is just my thought process as to how it will work. This is just for the changing of banks and changing of programs via MIDI. Any help would be appreciated.
const byte BANKSELECT = 0x00;        //0-31
const byte CONTROL_CHANGE = 0xB0;    //For Volume and Wah
const byte PROGRAMCHANGE = 0xC0;    //0-127
const int MIDI_CHANNEL = 0;;  
const int SERIAL_PORT_RATE = 31250;
const int UPPERLIMIT = 127;
const int LOWERLIMIT = 0;
const int UPPER_BANK = 25;
const int LOWER_BANK = 1;
const int LED[] = {1,2,3,4,5,6,7,8,9,10};
const int SWITCH[] = {11,12,13,14,15,16,17,18,19,20,21,22};
int ACTIVE = 0;

void setup(){
  int BANK_PROGS[][5] = {};
  //Populate bank_progs array
  int i,j;
   int COUNTER = 0;
  for(i=1; i<26; i++)
  {
    for(j=0; j<5; i++)
      BANK_PROGS[i][j] == COUNTER;
      COUNTER++;
    {
    
    }
  }

  int x;
  for(x=0; x<10; x++){
    pinMode(LED[x], OUTPUT);
  }
  for(x=0; x<13; x++){
    pinMode(SWITCH[x], INPUT);
  }
  byte BANK = 0x01;            //Default Bank is homed
  Serial.begin(SERIAL_PORT_RATE);
}

void loop(){
  //Search for a high switch
  int x;
  for(x=0; x<10; x++){
    int SWITCHSTATE = digitalRead(SWITCH[x]);
    if(SWITCHSTATE == HIGH){
      if(x=5)
      {
        BANK_CHANGE(1);
      }else if(x=11)
      {
        BANK_CHANGE(0);
      }
      else
      {
        int program = 0;
        EFFECT_CHANGE(x);
      }
      ACTIVE = x;
    }
  }
  //TURN THE ACTIVE LED ON
  digitalWrite(LED[ACTIVE], HIGH);

}

void BANK_CHANGE(int BANKDIFF){
  int BANK=0;
  if(BANKDIFF==1){
  //Bank Up  
    if(BANK!=UPPER_BANK){
      BANK = BANK+2;
    }else{
      BANK = 0x00;
    }
  
  }else{
    //Bank Down
    if(BANK != 0){
      BANK = BANK-2;
    }else{
      BANK = UPPER_BANK;      
    }
  }
  Serial.print(CONTROL_CHANGE, BYTE);
  Serial.print(BANKSELECT, BYTE);
  Serial.print(BANK, BYTE);
}

void EFFECT_CHANGE(byte program){
    Serial.print(PROGRAMCHANGE, BYTE);
    Serial.print(program, BYTE);
}

Stay tuned for more as this project develops.
Part 2 ->
Reactions:
Categories: , , , ,

1 comment:

  1. Nice! Can't wait to see it when it is completed

    ReplyDelete

Subscribe to RSS Feed Follow me on Twitter!