DIY midi-faderbak met Arduino

cult45

011110111000
Lid sinds
13 juli 2004
Berichten
2.007
Locatie
amsterdam
Met de nieuwe JJOSXL OS voor de MPC1000/2500 kan je met midiCC's bij verschillende parameters waaronder de mixer. midi fader bakken kosten weinig, maar hebben tegenwoordig bijna nooit "echte" midi-poorten meer. Daarom wil ik zelf een compacte midi-fader controller bouwen met een ATmega chip die in Arduino bords wordt gebruikt. Ik pruts al een paar jaar sporadisch met Arduinos en dit was een kans om in de multiplexer chips te duiken waarmee je op 1 analoge input meerdere inputs kwijt kan. Dit omdat de kleinere(gedkopere) ATmega chips maar 6 analoge inputs hebben.

Tot dusfer deksel gedremeld, faders erin en de eerste succesvolle test met een multiplexer. Momenteel werk ik op een Arduino mega die in principe genoeg inputs heeft, maar straks moet dat een standaard Arduino of beter nog ATmega op perfbord gaan worden.

Uiteindelijke code gaat interessant worden want ik moet de 4051 input waarden opslaan in een geheugen, vervolgens inputs scannen/vergelijken en in het geval van een noemenswaardige verandering naar midiCC vertalen.

multiplex.jpg
 
coden kan ik ook niet. pruts maar wat. Als het zover is post ik het wel.

Het is net gelukt om de inputs te scannen, waarden op te slaan en pas een message weg te sturen als iets wordt aangepast (anders dikke midi overload). Nu nog een jittertje hier en daar als de faders soms op bepaalde plekken stoppen. Volgende uitdaging is om dit op te lossen zonder de nauwkeurigheid (die met 128 waarden al karrig is) teveel minder te maken.

maar eerst slapen.
 
kleine update.

inputwaarden stabiel krijgen is aardig gelukt. 8 faders naar midiCC in Ableton Live is getest en werkt. Nu nog de chip/bord.

Vandaag een paar ATmega32's binnen gekregen(met arduino bootloader) en een ftdi bord om te kunnen programmeren. Alles in elkaar geknutseld op een breadbord en het werkt! Ik kan nu in principe alles op een stuk perfboard gaan solderen.

edit: Dit is dus een kale arduino op een breadbord, zonder de multiplexer.

atmega32_standalone.jpg
 
mooi gemaakt, zou het ook mogelijk zijn om er bijvoorbeeld 16 faders van te maken?

dus met 2 arduino's.


Hoe kan je de controller nummers invoeren?
 
met een 2e multiplexer kunnen makkelijk 16 faders gebruikt worden. Voor mijn doeleinden zijn vaste cc's prima. De ATmega chips hebben wel een EProm geheugen waarin de CC asignments opgeslagen zounden kunnen worden(ook als die uitgezet wordt). met een aantal 7 segment led displays (cijfers op een digitale klok) en 1 drukknop zou je een interface kunnen bouwen om deze in te voeren op dezelfde wijze als bijv. een BCF2000 van behringer dat doet. Stiekem heb ik wel 3 led displays leggen om te checken.
 
ikzelf heb ook wel de nodige matrialen, alleen een beperkte elektronica kennis. Ook nog 3 8-segment displaytjes liggen. De atmega(welke weet ik zo even niet). hoop gates(AND, NOR, OR, flip-flops). dus kan zo wel genoeg proberen en bouwen.

dacht zelf ook aan een behringer kloon. Maar met vaste CC is geen probleem, je kan altijd nog in fruity loops makkelijk midi kanalen verwijzen naar knoppen of faders.
 
De laatste dagen alles op een perfbord gesoldeerd. Alles lijkt het goed te doen, alleen heb ik heel veel jitter in de analoge input als ik met mijn hand in de buurt van de selectie pins van de 4051 kom. Dit geldt zowel aan de kant van de 4051 als de ATmega328. De overige analoge inputs van de ATmega zijn aan GND vastgemaakt. De niet gebruikte digitale in/outs nog niet.

midifader01.jpg
 
Als de ingangen los hangen/zwevend zijn kan je het best een pull-down weerstandje gebruiken, de ingangen zijn nu zo hoogohmig dat ze elk spettertje oppikken.
Weerstandje van 100K naar massa is meestal wel voldoende.

Ja dat was het, had gister nacht al 10K's tussen gezet en dat helpt. dank.


Waarom niet gewoon een lcd schermpje op de arduino aangesloten?

patser. :D De chips in de Arduino mega borden hebben meerdere RX/TX lijnen maar dan zit je wel aan de SMD.

Deze moet juist erg rechtdoorzee. Met de globaal inzetbare controllers(bcf/doepfer) ben ik eerst bezig met het achterhalen van wat er precies gaat gebeuren als ik aan een knop/fader draai. 1 van de grote voordelen van losse apparaten met duidelijk, toegespitste interfaces is dat je (vind ik) meteen weet wat en waar alles is. Mijn idee is ook om deze faderbak dus niet voor alles te gebruiken, maar alleen toe te wijzen aan bijv een 707 sample program in de MPC.
 
Ik wil geen Arduino Mega gebruiken...2 gewone ATmega32's is voldoende.

En een gewone print maken voor een arduino is ook niet al te moeilijk
 
Alles geboord en in elkaar getieft. De code is niet fraai, maar hij doet het. Leuk detail is de dubbele DC aansluiting zodat ik de stroom door kan koppelen naar een 2e apparaat. Aparte adapter is ook wel een beetje overkill voor deze.

jjfader0.jpg

jjfader1.jpg

jjfader2.jpg

jjfader3.jpg
 
alsjeblieft...?

jaja, komt eraan. Ik liep tegen wat functionaliteit van de midiCC's aan in JJOS en heb ook een request gemaakt bij JJ. Dit heeft gevolgen voor de(mijne iig) code, maar ik zal het in de komende dagen posten..

weetjewat, fokkit..


// midifader 003G - WORKING!!

//midi blue=tx, black=gnd, red=220-5v

// STORE INITIAL VALUES

// count0
// read bin for s0, 1, 2
// set outputs
// read analog
// set max, min
// >max, <min then send (function)
// next

// send:
// bin = midiCC
// send serial from analog



//shits real messy and i havn't cleaned it up. The setup reading can go i think.




int inputPin = 0; // select the input pin for 4051
int inputValue = 0; // store the current fader value, maybe not needed!!!!
int oldValue = 0; //place to store called value
int s0 = 9; // outputs on board
int s1 = 10; // outputs on board
int s2 = 11; // outputs on board
int r0 = 0; //value for output
int r1 = 0; //value for output
int r2 = 0; //value for output
int memory [8] ; // array to store fader values
int buffer = 0 ; // int to store values for averaging
int AVcount = 0;
int count = 0; // counter to cycle through inputs
int row = 0; // place to store bin value
int minimum = 0; // minimum value for output decision
int maximum = 0; // max value for output decision
int bin [] = {000, 1, 10, 11, 100, 101, 110, 111}; //binary numbers for outputs
int ledPin = 8;

void setup() {
for (int count = 0; count < 8; count++) {
row = bin[count]; // load binary for current input
r0 = row & 0x01; // tricky bitshifterism copy/pasted
r1 = (row>>1) & 0x01; // tricky bitshifterism copy/pasted
r2 = (row>>2) & 0x01; // tricky bitshifterism copy/pasted
digitalWrite(s0, r0); // send output value
digitalWrite(s1, r1); // send output value
digitalWrite(s2, r2); // send output value
digitalWrite(ledPin, 1); // led on
inputValue = analogRead(inputPin)/8; // reads the incoming value and devides by 8
memory[count] = inputValue;
}
pinMode(s0, OUTPUT);
pinMode(s1, OUTPUT);
pinMode(s2, OUTPUT);
Serial.begin (31250);
}

void loop() {


/// READ BIN TO SET OUTPUT PINS AND CHOOSE INPUT ///////////////////////////

row = bin[count]; // load binary for current input
r0 = row & 0x01; // tricky bitshifterism copy/pasted
r1 = (row>>1) & 0x01; // tricky bitshifterism copy/pasted
r2 = (row>>2) & 0x01; // tricky bitshifterism copy/pasted
digitalWrite(s0, r0); // send output value
digitalWrite(s1, r1); // send output value
digitalWrite(s2, r2); // send output value

/// READ ANALOG PIN WHICH IS LISTENING TO INPUT DEFINED ABOVE /////////


oldValue = memory[count];

for (int AVcount = 0; AVcount < 80; AVcount++)
{
inputValue = analogRead(inputPin)/8;
buffer = buffer+inputValue;
}
inputValue = (buffer/72)-7;
inputValue = min(inputValue, 127);
inputValue = max(inputValue, 0);

if (inputValue != oldValue)
{
midiCC(0xB0, count, inputValue);
memory [count] = inputValue;
}
buffer = 0;


if (count < 7)
{ count ++; }
else
{count = 0;}

}

// This function sends a Midi CC.
void midiCC(char CC_data, char c_num, char c_val){
Serial.print(CC_data, BYTE);
Serial.print(c_num, BYTE);
Serial.print(c_val, BYTE);

}


@SoulC

Alle onderdelen besteld bij Farnell:

deze zijn het dus
 
Back
Top