Thread Rating:
  • 0 Vote(s) - 0 Average
  • 1
  • 2
  • 3
  • 4
  • 5
Controlador MIDI
02-07-2011, 06:26 AM,
#1
Controlador MIDI
Code:
/*
Primer intento para configuracion de un MIDI controller,
basicamente tienes que cambiar 2 variables:
buttons: numero de botones
pins:  los pines donde los conectaras

npots: numero de potenciometros
pinpot: los pines donde los conectaras

ya lo probe con Virtual DJ y funciona bien :)
ahora lo que hay que hacer es ponerlo a funcionar en serio para
saber si truena o no a dar uso rudo.. espero tus comentarios mejoras..
y demas.. espero retomar mi controlador a base de un teclado matricial y
dejarlo como este :D

por cierto.. hay que probarlo usando mas y menos botones.. con 3 anda bien..
pero son todos los que tengo xD .. asi que.. te libero mi alpha test :D
*/
#include <stdlib.h>
#include <string.h>

//#DEFINE PIC18F4550    // Si utilizas este modelo

#define buttons    3     // define el numero de botones a utilizar
#define npots    2         // define el numero de potenciometros a utilizar
                            // estos numeros deben ser iguales que el numero de pines y pots declarados
                    
u8 pins[buttons]= {7,1,4};     // se declaran los pines de pinguino a los cuales
                                        // estaran conectados los botones, ejemplo:
                                        // boton 1: conectado al pin 0 de pinguino
                                        // boton 2: conectado al pin 1 de pinguino etc
                                        // si se desea conectar mas, actualizar "define botones"    
                                            
u8 epin[buttons];                // variable para guardar el estado del pin            
u8 lastepin[buttons];        // variable auxiliar para guardar el estado anterior de epin

u8 pinpot[npots]= {13,14};    // se declaran los pines de pinguino en los cuales conectaras tus pots
                                    
u8 vpot[npots];                // aqui se guardaran los valores de los pots
u8 lastvpot[npots];             // variable auxiliara para guardar el valor anterior de los pots

u8 gap= 3;                        // esta variable es para que el pot mande valores solo si la
                                    // el valor actual supera al anterior
void midicmd(u8 cmd, u8 pitch, u8 velocity){
u8 command[3];                // variable para mandar el comando midi
    command[0]= cmd;
    command[1]= pitch;
    command[2]= velocity & 0x7F;
    CDC.print(command,3);
}

void checkpots(){
u8 k;
    for(k=0;k<npots;k++){
        vpot[k]= analogRead(pinpot[k])/8;    // los valores varian entre 0-127
        if( (lastvpot[k]-vpot[k]) > gap || (lastvpot[k]-vpot[k]) < -gap ){
            midicmd(0xB0 | k ,0x7,vpot[k]);    // modificamos el canal segun el pot
            lastvpot[k]=vpot[k];
        }
    }    // en el if se calcula la diferencia entre el valor actual y al anterior
}        // para mandar un valor solo cuando este sea diferente deacuerdo a gap (3)

void checkstate(){
u8 j;
    for(j=0;j<buttons;j++){
        epin[j]= digitalRead(pins[j]); // se lee el estado del pin y se guarda en epin
        // compara el estado actual de epin con el anterior lastepin
        if (epin[j] != lastepin[j]) {
        // si el estado cambio se verifica en que sentido lo hizo
            if (epin[j] == HIGH) {
            // si hubo un cambio y ahora esta en HIGH
            //quiere decir que paso de LOW a HIGH
                midicmd(0x90,pins[j]+1,0x45);    //manda el comando a volumen medio
            } else {
            // si hubo un cambio y ahora esta enLOW
            //quiere decir que paso de HIGH a LOW
                midicmd(0x80,pins[j]+1,0x45);    //apaga el comando
            }
        }
        lastepin[j]= epin[j];    // se guarda el estado actual en lastepin
    }                                    // para la siguiente iteracion
}

void setup(){
u8 i;
    for(i=0;i<buttons;i++){
        pinMode(pins[i],INPUT); // los botones se declaran como entradas digitales
        epin[i]= 0;                    // se inicializa esta variable con 0's
        lastepin[i]= 0;            
    }
}

void loop(){ CONTROL_LINE= 1;    //para asegurar que el CDC este funcionando (solo en WXP o W7)
    checkstate();                     // mandamos verficar el estado de los botones
    checkpots();                    // verificamos los potenciometros
}
Reply
02-07-2011, 01:00 PM,
#2
RE: Controlador MIDI
Hola cris3d!
Buen proyecto! Un pequeño vídeo para ver como funciona estaría bien jeje! No sé mucho sobre música, por eso lo digo Wink. Igualmente, la foto en la otra parte del foro está genial!
Reply


Forum Jump:


Users browsing this thread: 1 Guest(s)