Das Ortofo Version 1

This one might be interesting for all you GrandMa onPC users out there. Those who are operating a GrandMa Micro or Pico and are missing the motorfaders of the fullsize console might also benefit from it. Das Ortofo is a hardware-based midi processor especially designed for controlling the motorfaders of a Behringer BCF2000 and sending the corresponding MIDI-data to the GrandMA lighting desk.

[Update 30.9.2010: I’ve built a new version which natively supports USB and which is for sale. Find it over here .]

The Video says it all:

[tube]http://www.youtube.com/watch?v=1QmLDfRrPaw&feature=player_embedded[/tube]

 

Beautiful, isn’t it?

By having a look at the next pictures you should easily be able to find out where the name is derived from….

 

The red button resets the device, the big silver knob controls the display’s contrast. Of course it’s not really necessary to make ’em that big but…it looks funny – and sick..

The whole device is based on the Arduino Platform (Duemilanove with AtMega328). The display is connected as shown here. The Midi-Connectors are attached to the RX / TX -Ports using a 6n138 as an optocoupler for protecting the input. Pin 8 of the optocoupler (chip enable) is derived from Pin 2 of the Arduino (should also be clear by looking at the code),

The Code is listed at the end. first let’s have a look at how the cabling is done:

 

The BCF2000 is set to Mode ‘S-2’ and to factory-preset ‘1’. The MIDI-OUT-Port is connected to the Ortofo’s MIDI-IN (the left one) and vice versa. The BCF’s MIDI-THRU-Port is connected to your GrandMa (onPC) console

How it works:

The Behringer controller sends out Midi CCs when a fader is moved. Every time a CC value arives at Das Ortofo it is translated into a certain Midi Note and sent back to the BCF. The CC Number corrseponding to the note’s value, the CC value being the note’s velocity. Due to the fact that the controller is set to mode “S-2” the incoming MIDI-data are internally sent to the MIDI-THRU-Port where they can be used to drive a GrandMA console. The reason why this is done is because the GrandMa can only be controlled by MIDI Notes (many people I met told me that it’s not possible to drive faders via MIDI….don’t believe them since this one is a rather good prove against it…).

The Midi values that are sent out by Das Ortofo are hardcoded. The first fader of the Behringer causes note C4 to be sent, the second C#4 and so on. Furthermore the Arduino also keeps track of 128 faderpages. Every time you hit the + / – button (the buttons at the lower right end of the BCF; please have another look at the video….it’s way easier than trying to explain) the previous / next page of faders is recreated. Also there is a MIDI note being sent to tell the GrandMA to switch to the next / previous page. At this moment (July 2009) the use of the Behringer’s rotary encoders and pushbuttons is not yet implemented. I just couldn’t decide on what to do with them.

In order to get this whole thing working you need to tell your GrandMA what to do with the incoming Midi-Data. This is done via 2 Makros.

This picture shows the Makro for ‘Page -‘ command. (Guess how the ‘Page +’ one looks like.)

(Click for larger view.)

Due to the Midi values sent out by Das Ortofo being hardcoded you have to connect the ‘Page -‘ Makro to GrandMA’s Midi-Button 69 and the ‘Page +’ Makro to Midi-Button 70. (I won’t go into detail on this one. If you made it up to here you probably know how to do this.) The first time any of the Makros is triggered it takes care of connecting the right Midi-Buttons to the faders.

Das Ortofo (of course) only works in one direction. Changing a fader directly at the GrandMa itself (let it be onPC or hardware-based) will NOT change the state of any of the BCR’s faders. In order to get this working you’d need to decypher MALighting’s MA-Net protocol. I started working on that one but don’t wait for any release about it since it would probably cause some serious copyright-reverse-engineering-fraud-diaster. That’s just not worth it.

Please let me know if this is useful for you. If you build one yourself I’d definitely like to see pictures of it in action.

 

[Update 2.3.2010]

The Buttons that switch the Grandma’s pages are hardcoded to the lower right-end buttons of the controller (‘User buttons’). The Controller’s “Preset + / -” buttons are not used since they do not send any values by default. You could, however, change the behaviour of the controller’s “Preset + / – ” with Mark van den Berg’s selfbuilt Editor (which is WAY better than Behringer’s crappy JAVA-Editor) but i wanted to keep the original settings of the Behringer controller untouched.

 

[Update 2.5.2010]

If you carefully look around you will find other solutions. Some of them show the possibility of a 2-way-communication (use the mouse to move a fader at the GrandMa onPc and the BCF’s fader moves as well) . Please realize that this only works for the first two faderpages of the GrandMa onPC.

 

 

 

As promised here’s the code:

/*
Behringer BCF2000  —  GrandMA (onPC)
*/

#include <MIDI.h>
#include <LiquidCrystal.h>
//LiquidCrystal(rs, rw, enable, d4, d5, d6, d7)
LiquidCrystal lcd(12, 11, 6, 7, 8, 9, 10);

#define ActiveMidi 2  //chip enable für den optpkoppler

byte Fader[128][8];      //Bank, Fader; ATMega128 schafft mit dem programm hier nicht mehr seiten.
byte MidiType;
byte MidiData1;
byte MidiData2;
int intBank=0;
boolean TRX=true;

void setup()
{
pinMode(ActiveMidi,OUTPUT);
digitalWrite(ActiveMidi,HIGH);  //optokoppler AN
MIDI.begin();                // Launch MIDI with default options
MIDI.setInputChannel(1);     // Midi input channel 1
PrintHello();
intBank=0;
}

void loop()
{
if (MIDI.read())
{
MidiType=MIDI.getType();
if (MidiType==3)                   //CC in
{
MidiData1=MIDI.getData1();               // CC-Number
MidiData2=MIDI.getData2();               // CC-Value
if ((MidiData1>=81) && (MidiData1<=88))  //einer der fader wird bewegt
{
Fader[intBank][MidiData1-81]=MidiData2;  //befüllen des arrays, der die faderwerte vorhält
lcd.setCursor(0,1);
lcd.print(“Fader:”);
lcd.print(MidiData1-81+1, DEC);
if (MidiData2<100)
{
lcd.print(”  Val: “);
lcd.print(MidiData2, DEC);
}else{
lcd.print(”  Val:”);
lcd.print(MidiData2, DEC);
}
if (TRX)                                 //TRX=false: fader werden via RecallFader() auf position gefahren
{                                      //d.h. keine weitere  auswertung des faderinputs nötig
MIDI.send(NoteOn,MidiData1-81+60,MidiData2,1);
}else
{
int j;
for (j=0;j<=7;j++)      //trotzdem liegen die midi-daten in der queue und würden gesendet,
{                     //sobald TRX=true, daher löschen
MIDI.delMsg();
MIDI.read();
delay(5);            //Midi is’ langsam
}
TRX=true;
}
}

if ((MidiData1==91) && (MidiData2==127))               //Page-
{
if(intBank > 0)
{
intBank=intBank-1;
MIDI.send(NoteOn,69,127,1);
delay(10);
MIDI.send(NoteOn,69,0,1);
RecallFader();
}
}

if ((MidiData1==92) && (MidiData2==127))               //Page+
{
if(intBank < 127)
{
intBank=intBank+1;
MIDI.send(NoteOn,70,127,1);
delay(10);
MIDI.send(NoteOn,70,0,1);
RecallFader();
}
}
}
}
}

void RecallFader()
{
TRX=false;                  //siehe oben
int j=0;
for (j=0;j<=7;j++)
{
MIDI.send(CC,81+j,Fader[intBank][j],1);
delay(5);
}

lcd.clear();
lcd.setCursor(0,0);
lcd.print(“Page: “);
lcd.print(intBank+1, DEC);
}

void PrintHello()
{
lcd.clear();
lcd.print(“BCF2000 GrandMA “);
lcd.setCursor(0,1);
lcd.print(” Doktor-Andy.de “);
delay(3000);
lcd.setCursor(0,0);
lcd.clear();
lcd.print(“…waiting for”);
lcd.setCursor(0,1);
lcd.print(”   action…”);

}

Tagged , , , , , .Speichere in deinen Favoriten diesen permalink.

2 Antworten zu Das Ortofo Version 1

  1. DMB sagt:

    Hello,

    I’ve bought a Grandma 1 Pico and found your ‘old’ page with the bcf2000 connected to a grandma using an arduino.
    My questions is which midi library you used for the midicode.
    When I use the standard midi library it doesn’t recognize the MIDI.delMsg() and the MIDI.send(…).

    Regards,

    DMB

Schreibe einen Kommentar zu DMB Antworten abbrechen

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert