Jump to content

Controlador midi con Arduino


Recommended Posts

Hola buen día a todos! Quería preguntar si alguien del foro construyó una controladora midi usando Arduino? Estoy por empezar este proyecto, tengo una noción muy básica de como funciona pero me falta bastante. Si alguno lo hizo y tuviera alguna recomendación o info de como lo hizo estaría muy agradecido! Saludos!!

Link to comment
Share on other sites

creo que no, fijate que yo le cambié el firmware de la leonardo que usé para poderla conectar como midi-usb. sino podes hacer lo mismo pero saliendo por una salida midi y te tenes que conectar a una entrada midi (suponiendo que tu placa de sonido tenga una por ejemplo) o usar un cable midi-usb 

te recomiendo que revises el repositorio del firmware que usé como base del proyecto 

https://github.com/rkistner/arcore

dice que soporta varias versiones de Leonardo, pero tambien aclara que agregar otras placas es cuestion de agregar algunas configuraciones y compilar. pegale una mirada, en una de esas podes contribuir al proyecto con soporte para esa mega ?

 

Link to comment
Share on other sites

hace 1 hora, mcniac dijo:

por cierto, si no tenes experiencia encarar esto de una puede ser medio complejo, te recomiendo que hagas pequeñas partes de a una y despues le vas sumando complejidad

Anoche pude hacerlo andar, es para controlar un rack, hice un circuito en un protoboard con 2 pulsadores y funcionó bien, ahora la idea es armarme una pedalera del estilo ground control... Tengo que sumarle los LEDS a cada pulsador y estaria

Link to comment
Share on other sites

hace 7 horas, mcniac dijo:

genial! si te puedo ayudar en algo avisame. espero ver como queda.

Ahí tengo todo el prototipo hecho, 2 pulsadores con 2 leds, te pregunto... Cuando apretó los pulsadores la señal modo sale instantáneo, perfecto por así decirlo... Pero con los leds es como que aveces hay un delay, al presionar el botón se tiene que encender el LED correspondiente y apagar el otro. Aveces esa secuencia es perfecta pero otras veces no hace el cambio de LED, envía la señal midi pero sigue encendido el LED del pulsador anterior. En estos casos tengo que mantener apretado el pulsador durante medio segundo o un segundo y ahí si hace el cambio de LED, tenés idea a qué se puede deber? Probé hacer unos cambios en el código y sigue igual

Link to comment
Share on other sites

hace 22 minutos, mcniac dijo:

creo que eso depende bastante de como lo codificaste, usaste millis o delay? 

Para los leds no utilice nada, solo comando if, dónde la condición es si el pulsador está activo activa tal les y apaga el resto

Link to comment
Share on other sites

hace 51 minutos, mcniac dijo:

creo que eso depende bastante de como lo codificaste, usaste millis o delay? 

void loop() {
    
  if (digitalRead(buttonOne) == HIGH){
    digitalWrite(LED1, HIGH);
    digitalWrite(LED2, LOW);
    
}
  if (digitalRead(buttonTwo) == HIGH){
    digitalWrite(LED1, LOW);
    digitalWrite(LED2, HIGH);

este codigo es el que use para los leds

Link to comment
Share on other sites

hiciste debounce? fijate que viene un ejemplo de eso en la misma IDE de arduino.

si no le haces debounce el mismo ruido del switch puede hacer que se te disparen eventos de más, por eso el debounce y usar resistencias pullup o pulldown en los pulsadores

Edited by mcniac
aclaracion
Link to comment
Share on other sites

hace 5 horas, mcniac dijo:

hiciste debounce? fijate que viene un ejemplo de eso en la misma IDE de arduino.

si no le haces debounce el mismo ruido del switch puede hacer que se te disparen eventos de más, por eso el debounce y usar resistencias pullup o pulldown en los pulsadores

No, voy a ver qué onda eso. En los pulsadores según el esquema que ví en un pin se conecta el positivo 5v, y en el otro la entrada digital y una resistencia conectada a masa

Link to comment
Share on other sites

claro, esa es una manera de usarlos, y podes hacerlo laburar como NC o NA, otra manera es configurando para que pin funcione como pullup y lo conectas a tierra con un swich. de todos modos el debounce cumple la funcion de evitar el ruido y que se dispare más de una vez. calculá que si no tenes un delay dentro de tu funcion loop esta se va a ejecutar muchismas veces por segundo

 

Link to comment
Share on other sites

hace 1 hora, mcniac dijo:

claro, esa es una manera de usarlos, y podes hacerlo laburar como NC o NA, otra manera es configurando para que pin funcione como pullup y lo conectas a tierra con un swich. de todos modos el debounce cumple la funcion de evitar el ruido y que se dispare más de una vez. calculá que si no tenes un delay dentro de tu funcion loop esta se va a ejecutar muchismas veces por segundo

 

Claro, lo raro es que la función de enviar el comando midi sale de manera instantánea al apretar el pulsador, la cosa es con los leds... Voy a investigar eso que me decís, de todas formas ya compré los pulsadores por MercadoLibre, y en una metalúrgica me hacen el gabinete de chapa estampada, estilo una réplica del ground control de Voodoo lab voy a hacer pero sin pantalla

Link to comment
Share on other sites

hace 29 minutos, mcniac dijo:

y el resto del código? estaras demorando en el envio del comando midi? fijate el codigo que te pase que andaba bien. aunque nunca le puse leds

El código midi anda perfecto, apenas toco el pulsador instantáneamente cambia al banco que selecciono. Solo tengo ese delay en los leds

Link to comment
Share on other sites

hace 7 minutos, mcniac dijo:

si, te entendí, te pedia que muestres el resto del código a ver si hay otra cosa que lo pueda estar causando ?

#include <MIDI.h>
#include <midi_Defs.h>
#include <midi_Message.h>
#include <midi_Namespace.h>
#include <midi_Settings.h>

const int buttonOne = 22; // assign button pin to variable
const int buttonTwo = 23; // assign button pin to variable
const int LED1 = 41;
const int LED2 = 36;
int a;
int b;
MIDI_CREATE_INSTANCE(HardwareSerial,Serial, midiOut); // create a MIDI object called midiOut

void setup() {
  pinMode(buttonOne,INPUT); // setup button as input
  pinMode(buttonTwo,INPUT); // setup button as input
  pinMode(LED1,OUTPUT);
  pinMode(LED2,OUTPUT);
  Serial.begin(31250); // setup MIDI output
}

void loop() {
  if(digitalRead(buttonOne) == HIGH) { // check button state
    delay(10); // software de-bounce
    if(digitalRead(buttonOne) == HIGH) { // check button state again
      midiOut.sendControlChange(56,127,1); // send a MIDI CC -- 56 = note, 127 = velocity, 1 = channel
      delay(250);
      midiOut.sendProgramChange(12,1); // send a MIDI PC -- 12 = value, 1 = channel
  delay(1000);  // wait 1 second 
    }
  }
 
  if(digitalRead(buttonTwo) == HIGH) { // check button state
    delay(10); // software de-bounce
    if(digitalRead(buttonTwo) == HIGH) { // check button state again
      midiOut.sendControlChange(42,127,1); // send a MIDI CC -- 42 = note, 127 = velocity, 1 = channel
      delay(250);midiOut.sendProgramChange(16,1); // send a MIDI PC -- 12 = value, 1 = channel
  delay(1000);  // wait 1 second
    }
  }

  a = digitalRead(buttonOne);
  b = digitalRead(buttonTwo);
  if (a == HIGH){
    digitalWrite(LED1, HIGH);
    digitalWrite(LED2, LOW);
    
}
  if (b == HIGH){
    digitalWrite(LED1, LOW);
    digitalWrite(LED2, HIGH);
    
}
}

Link to comment
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Restore formatting

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

×
×
  • Create New...