Anda di halaman 1dari 6

ARDUINO GUITAR ROUTER LOOPER GNU/GPL BY VICTOR A.R.

Puedes usar y modificar el cdigo a tu gusto siempre que cites al autor.


#include <LiquidCrystal.h>

#define NLOOPS 8
#define BANKMIN 1
#define BANKMAX 2
#define NBANCOS 2

#define NLEDPE 4
#define NPULSA 6

#define PEDAL1 0
#define PEDAL2 1
#define PEDAL3 2
#define PEDAL4 3
#define BANKUP 4
#define BANKDO 5

#define PULSADO 0
#define LIBRE 1

#define NUMFX 8

// Pines donde se encuentran los pedales 1-4 Y LOS BANCOS


int vpedal_pin[]={5,4,3,2,6,7};

int looperok=0;
// Valor actualizado de los pedales
int vpedal_valactual[]={0,0,0,0,0,0};
int vpedal_valsaved[] ={0,0,0,0,0,0};
int vpedal_valtmp[]={0,0,0,0,0,0};
int vpedal_led[]={14,15,16,17};
char *vpedal_nom[]={ "P1","P2","P3","P4","UP","DW"};
long vpedal_stamp[]={0,0,0,0,0,0};
//int vloop_pin[]={22,24,26,28,30,32,34,36};
int vloop_pin[]={36,34,32,30,28,26,24,22};

byte vbitmask[]={1,2,4,8,16,32,64,128};

char *vfx_nombres[]={
"CLEAN DELAY ",
"CLEAN COMPRE ",
"DISTORSION #1",
"BIG MUFF V1 ",
"RAT 1 CLEAN ",
"RAT 2 OVERD ",
"RAT COMPRESOR",
"ULTIMAT DRIVE"};

byte vfx_data[]={2,76,124,240,15,32,94,72};

int mipedal;
ARDUINO GUITAR ROUTER LOOPER GNU/GPL BY VICTOR A.R.
Puedes usar y modificar el cdigo a tu gusto siempre que cites al autor.
int mibanco;
int miposfx;

LiquidCrystal lcd(13, 12, 11, 10, 9 , 8);

int k;
char mensa[16];
char buffer[32];

void clearBuffer()
{
int k;
for(k=0;k<32;k++)
buffer[k]=' ';
}

void setupPantalla()
{
lcd.begin(16, 2);
lcd.setCursor(0,0);
lcd.write("Pedalera Vic");
lcd.setCursor(0,1);
lcd.write(" ");
k=0;
}

void setupPulsadores()
{
int k;
for(k=0;k<NPULSA;k++)
{
pinMode(vpedal_pin[k], INPUT_PULLUP);
vpedal_valactual[k]=LIBRE;
vpedal_valtmp[k]=LIBRE;
vpedal_valsaved[k]=LIBRE;
vpedal_stamp[k]=0;

for(k=0;k<NLEDPE;k++)
{
pinMode(vpedal_led[k], OUTPUT);
}
}

void setupLooper()
{
int k;
for(k=0;k<NLOOPS;k++)
{
ARDUINO GUITAR ROUTER LOOPER GNU/GPL BY VICTOR A.R.
Puedes usar y modificar el cdigo a tu gusto siempre que cites al autor.
pinMode(vloop_pin[k],OUTPUT);
digitalWrite(vloop_pin[k],0);
}
/*
for(k=0;k<NLOOPS;k++)
{
digitalWrite(vloop_pin[k],0);
}
*/
looperok=1;
}

void resetLooper()
{
int k;
for(k=0;k<NLOOPS;k++)
{
digitalWrite(vloop_pin[k],0);
}
}

void activarPresetLooper(int pos)


{
int k;
byte tmp;
byte valor=vfx_data[pos];
Serial.println("Enviando efecto al looper");
for(k=0;k<NLOOPS;k++)
{
tmp=(valor&vbitmask[k])? 1:0;
digitalWrite(vloop_pin[k],tmp);
}
}

void testLooper()
{
int ms=300;
lcd.setCursor(0,0);
lcd.write("Test looper ");
resetLooper();

for(k=0;k<NLOOPS;k++)
{
digitalWrite(vloop_pin[k],1);
delay(ms);
}

for(k=0;k<NLOOPS;k++)
{
digitalWrite(vloop_pin[k],0);
ARDUINO GUITAR ROUTER LOOPER GNU/GPL BY VICTOR A.R.
Puedes usar y modificar el cdigo a tu gusto siempre que cites al autor.
delay(ms);
}
lcd.setCursor(0,0);
lcd.write("Fin Test ");
}

void setup()
{
Serial.begin(9600);
mibanco=BANKMIN;
mipedal=PEDAL1;
miposfx=(mibanco-1)*4+mipedal;
clearBuffer();
setupLooper();
setupPulsadores();
setupPantalla();
delay(2000);
testLooper();
updateEfecto(mipedal);
updatePantalla();
}

void updatePantalla()
{
char cad[32];
String str;
clearBuffer();

sprintf(cad,"Banco %02d ",mibanco);


lcd.setCursor(0,0);
lcd.write(cad);
lcd.setCursor(0,1);
if(mipedal>=0 && miposfx>=0)
{
sprintf(cad,"%s:%s",vpedal_nom[mipedal],vfx_nombres[miposfx]);
lcd.write(cad);
}
else
{
lcd.write("ERR001");
}
}

void activarLedPedal(int idpedal)


{
int k,valor;
for(k=0;k<NLEDPE;k++)
{
valor=(k==idpedal)? 1:0;
digitalWrite(vpedal_led[k],valor);
}
}
ARDUINO GUITAR ROUTER LOOPER GNU/GPL BY VICTOR A.R.
Puedes usar y modificar el cdigo a tu gusto siempre que cites al autor.

void updateEfecto(int idpedal)


{
char cad[100];
miposfx=(mibanco-1)*4+idpedal;
sprintf(cad,"# Actualizando efecto %02d",idpedal);

if(miposfx>=0 && miposfx<4*NBANCOS)


activarPresetLooper(miposfx);
Serial.println(cad);
activarLedPedal(idpedal);
//updatePantalla();

void gestionarCambioPulsadores()
{
int val,lastval;
for(k=0;k<NPULSA;k++)
{
val=vpedal_valactual[k];
lastval=vpedal_valsaved[k];
if(val!=lastval && val==PULSADO) // Activo a baja
{
mipedal=k;
if(mipedal>=PEDAL1 || mipedal<=PEDAL4)
updateEfecto(mipedal);
if(k==BANKUP)
subirBanco();
if(k==BANKDO)
bajarBanco();
vpedal_valsaved[k]=val; // Ya no provocara un nuevo cambio
}
}
}

// Devuelve n de cambios
int updateEstadoPulsadores()
{
char cad[100];
int val,idpin,ahora,marca;
int ventana=20;
int sol=0;
//Serial.println("\n-------- Leyendo pulsadores------------- ");
for(k=0;k<NPULSA;k++)
{
idpin=vpedal_pin[k];
val=digitalRead(idpin);
ahora=millis();
if(val!=vpedal_valtmp[k]) // Distintos estados. Salvamos marca de tiempo
{
ARDUINO GUITAR ROUTER LOOPER GNU/GPL BY VICTOR A.R.
Puedes usar y modificar el cdigo a tu gusto siempre que cites al autor.
vpedal_stamp[k]=ahora;
}
marca=vpedal_stamp[k];
if(ahora-marca>ventana) //Ha pasado tiempo suficiente para estabilizarse
{

if(val!=vpedal_valactual[k]) // Pasado el tiempo se mantiene


{
vpedal_valsaved[k]=vpedal_valactual[k]; // Salvamos valor anterior
vpedal_valactual[k]=val; // Actualizamos el nuevo estado sin rebote
sol++;
}
}
vpedal_valtmp[k]=val;
}
return sol;
}

void subirBanco()
{
if(mibanco<BANKMAX)
mibanco++;
mipedal=PEDAL1;
updateEfecto(mipedal);
//updatePantalla();
}

void bajarBanco()
{
if(mibanco>BANKMIN)
mibanco--;
mipedal=PEDAL1;
updateEfecto(mipedal);
//updatePantalla();
}

int haypulso;

void loop()
{
haypulso=updateEstadoPulsadores();
if(haypulso)
{
gestionarCambioPulsadores();
updatePantalla();
}
//delay(10);
}