Go Down

Topic: [SOLUCIONADO]Repeticion de mensaje en programacion MIDI (Read 201 times) previous topic - next topic

marinox8

Buen dia a todos

Mi problema es el siguiente, estoy haciendo un proyecto para un MIDI foot controller para usarse en programas como bias fx o guitar rig y cuando intento probar la señal en MIDIBerry o pocketMIDI el mensaje de salida se repite infinitamente.

Estoy usando un arduino leonardo con unos switches 3PDT
adjunto codigo



Code: [Select]
#include <MIDIUSB.h>



int estadoboton = 0;
const int boton = 3;
 int estadoBoton;
 int estadoBotonAnterior;
 

void controlChange(byte channel, byte control, byte value) {
  midiEventPacket_t event = {0x0B, 0xB0 | channel, control, value};
  MidiUSB.sendMIDI(event);
  MidiUSB.flush();
}

void noteOn(byte channel, byte pitch, byte velocity) {
  midiEventPacket_t noteOn = {0x09, 0x90 | channel, pitch, velocity};
  MidiUSB.sendMIDI(noteOn);
  MidiUSB.flush();
}

void noteOff(byte channel, byte pitch, byte velocity) {
  midiEventPacket_t noteOff = {0x08, 0x80 | channel, pitch, velocity};
  MidiUSB.sendMIDI(noteOff);
  MidiUSB.flush();
}





void setup() {
  // put your setup code here, to run once:
  Serial.begin(31250);
pinMode(boton, INPUT_PULLUP);
}
void loop() {
  // put your main code here, to run repeatedly:
  estadoboton = digitalRead(boton);
if(estadoboton != estadoBotonAnterior){
controlChange(0, 5, 127);
}
else{
  controlChange(0, 5, (byte)0x00);
}
  estadoBotonAnterior=estadoBoton;
}


asi se veria en pocketMIDI
Code: [Select]

B0 05 7F
B0 05 7F
B0 05 7F
B0 05 7F
B0 05 7F
B0 05 7F
B0 05 7F
B0 05 7F
B0 05 7F
B0 05 7F
B0 05 7F
B0 05 7F
B0 05 7F
B0 05 7F
B0 05 00
B0 05 00
B0 05 00
B0 05 00
B0 05 00
B0 05 00
B0 05 00
B0 05 00
B0 05 00
B0 05 7F
B0 05 7F
B0 05 7F
B0 05 7F
B0 05 7F
B0 05 7F
B0 05 7F
B0 05 7F
B0 05 7F
B0 05 00
B0 05 00
B0 05 00
B0 05 00
B0 05 00
B0 05 00
B0 05 00
B0 05 00
B0 05 00
B0 05 00
B0 05 00
B0 05 00
B0 05 00
B0 05 7F
B0 05 7F
B0 05 7F
B0 05 7F
B0 05 7F
B0 05 7F
B0 05 7F
B0 05 7F
B0 05 7F
B0 05 7F
B0 05 7F
B0 05 7F
B0 05 7F


¿Hay alguna solución?

Un cordial saludo.

surbyte

No se si te comprendo bien porque no conozco que hace la librería MIDIUSB pero esto podría resolver tu problema

Code: [Select]
void loop() {
   
    // put your main code here, to run repeatedly:
    estadoboton = digitalRead(boton);
    if (estadoboton && !estadoBotonAnterior){ // envia 0,5,127 cuando cambia de 1 a 0
        controlChange(0, 5, 127);
    }
    if (!estadoboton && estadoBotonAnterior){{// envia 0 5 0 cuando cambia de 0 a 1
         controlChange(0, 5, (byte)0x00);
    }
    estadoBotonAnterior = estadoBoton;
}

marinox8

Hola

gracias por la respuesta surbyte probe el codigo y sigue mandando erro en el mensaje final, pero actualmente ya logre una solucion para este

dejare la programacion que estoy usando por si a alguien mas le sirve actualmente la estoy usando en Bias FX para prender y apagar pedales y/o cambiar el preset
Code: [Select]

#include <MIDIUSB.h>




bool estadoBoton, estadoBotonAnt = false;
bool estadoBoton2, estadoBotonAnt2 = false;
bool estadoBoton3, estadoBotonAnt3 = false;
bool estadoBoton4, estadoBotonAnt4 = false;

void controlChange(byte channel, byte control, byte value) {
  midiEventPacket_t event = {0x0B, 0xB0 | channel, control, value};
  MidiUSB.sendMIDI(event);
  MidiUSB.flush();
}

void noteOn(byte channel, byte pitch, byte velocity) {
  midiEventPacket_t noteOn = {0x09, 0x90 | channel, pitch, velocity};
  MidiUSB.sendMIDI(noteOn);
  MidiUSB.flush();
}

void noteOff(byte channel, byte pitch, byte velocity) {
  midiEventPacket_t noteOff = {0x08, 0x80 | channel, pitch, velocity};
  MidiUSB.sendMIDI(noteOff);
  MidiUSB.flush();
}





void setup() {
  // put your setup code here, to run once:
  Serial.begin(31250);
pinMode(2, INPUT_PULLUP);
pinMode(3, INPUT_PULLUP);
pinMode(4, INPUT_PULLUP);
pinMode(5, INPUT_PULLUP);
}


void botonuno(){
  // put your main code here, to run repeatedly:
  estadoBoton = digitalRead(5);
if(estadoBoton == HIGH && estadoBotonAnt == LOW){
controlChange(0, 5, 127);
delay(100);
}else{
if (estadoBoton == LOW && estadoBotonAnt == HIGH){
controlChange(0, 5, (byte)0x00);
  delay(100);
}
 
}
 
 estadoBotonAnt=estadoBoton;           
}
void botondos(){
  // put your main code here, to run repeatedly:
  estadoBoton2 = digitalRead(4);
if(estadoBoton2 == HIGH && estadoBotonAnt2 == LOW){
controlChange(0, 6, 127);
delay(100);
}else{
if (estadoBoton2 == LOW && estadoBotonAnt2 == HIGH){
controlChange(0, 6, (byte)0x00);
  delay(100);
}
 
}
 
 estadoBotonAnt2 =estadoBoton2; 
}
void botontres(){
   // put your main code here, to run repeatedly:
  estadoBoton3 = digitalRead(3);
if(estadoBoton3 == HIGH && estadoBotonAnt3 == LOW){
controlChange(0, 7, 127);
delay(100);
}else{
if (estadoBoton3 == LOW && estadoBotonAnt3 == HIGH){
controlChange(0, 7, (byte)0x00);
  delay(100);
}
 
}
 
 estadoBotonAnt3 =estadoBoton3; 
}
void botoncuatro(){
   // put your main code here, to run repeatedly:
  estadoBoton4 = digitalRead(2);
if(estadoBoton4 == HIGH && estadoBotonAnt4 == LOW){
controlChange(0, 8, 127);
delay(100);
}else{
if (estadoBoton4 == LOW && estadoBotonAnt4 == HIGH){
controlChange(0, 8, (byte)0x00);
  delay(100);
}
 
}
 
 estadoBotonAnt4 =estadoBoton4; 
}

void loop() {
   
  botonuno();
 botondos();
 botontres();
 botoncuatro();

}


si alguien tiene alguna duda que no dude en preguntar

Saludos cordiales.

Go Up