Tabla de contenido:

EAL - Controlador MIDI Arduino: 7 pasos
EAL - Controlador MIDI Arduino: 7 pasos

Video: EAL - Controlador MIDI Arduino: 7 pasos

Video: EAL - Controlador MIDI Arduino: 7 pasos
Video: #2 Como construir um controlador MIDI DIY: Fazendo Música com Arduino 2024, Noviembre
Anonim
EAL - Controlador MIDI Arduino
EAL - Controlador MIDI Arduino

Fabricado por Søren Østergaard Petersen, OEAAM16EDA

Este instructable describe un controlador MIDI basado en arduino. Este es un proyecto escolar. Usando su mano, puede tocar melodías simples a través de la conexión MIDI y un instrumento MIDI conectado (o como en este caso, un portátil con un software softsynth). Puede tocar notas de una escala de Do mayor, do-re-mi-fa-sol-a-si-do. Para poder conectar el controlador MIDI a una computadora portátil, necesitará una interfaz MIDI a USB como m-audio Uno.

Paso 1: video de demostración

Image
Image

Sube el volumen y disfruta !

Cómo funciona:

El controlador MIDI utiliza una placa Arduino MEGA 2560. Dos sensores de luz (LDR) integrados en un tubo eléctrico de 16 mm forman un sistema de sensor doble y se utilizan para crear un disparador estable sin ningún disparo doble falso. Una linterna está creando un rayo de luz, cuando el rayo es interrumpido por la mano que toca el controlador, el sensor de luz inferior detecta el rayo que falta y un sensor ultrasónico HC-SR04 mide la distancia entre el sensor y la mano.

La distancia medida se usa en el programa Arduino para calcular y configurar el valor de número de nota apropiado para ser empaquetado en un mensaje MIDI Note On y transmitido en la interfaz MIDI. La interfaz de salida MIDI utiliza un inversor hexadecimal 74HC14 y es prácticamente un circuito estándar. La comunicación MIDI usa serial1, el puerto serial estándar se usa para depurar.

Cuando la mano se mueve hacia arriba y lejos del rayo de luz, el sensor de luz superior detecta el rayo de luz de nuevo y se empaqueta y transmite un mensaje MIDI Note Off en la salida MIDI.

El área de juego entre los sensores es de alrededor de 63 cm y la longitud total del controlador MIDI es de alrededor de 75 cm.

Paso 2: Detalles de los sensores de luz

Detalles de los sensores de luz
Detalles de los sensores de luz
Detalles de los sensores de luz
Detalles de los sensores de luz

Los dos sensores de luz están montados uno encima del otro para formar un sistema de sensor doble. Evita disparos falsos cuando se usa correctamente en el software. Cada sensor de luz consta de un módulo de fotorresistencia integrado en un tubo eléctrico estándar de 16 mm. Se hace una ranura en cada tubo con una sierra para metales y la PCB de la fotorresistencia se puede presionar en la ranura. Los sensores se pegan con cinta adhesiva y también se fijan a un extremo de un trozo de madera. Ninguna luz debe poder llegar a los sensores desde atrás. Los sensores de luz tienen resistencias pull-up de 10k integradas.

Paso 3: Detalles del sensor ultrasónico HC-SR04

Detalles del sensor ultrasónico HC-SR04
Detalles del sensor ultrasónico HC-SR04

El sensor ultrasónico HC-SR04 se fija en el otro extremo del controlador MIDI. Aquí también se coloca una linterna brillante, que crea el haz de luz necesario.

Paso 4: El circuito de Aduino

El circuito de Aduino
El circuito de Aduino
El circuito de Aduino
El circuito de Aduino

El circuito de salida MIDI es básicamente un inversor hexagonal 74HC14 estándar y algunas resistencias más un conector hembra DIN de 5 pines. El circuito 74HC14 controla la salida MIDI y al mismo tiempo proporciona algunos medios de protección para la placa Arduino contra el "mundo real" conectado a la salida MIDI. Una característica práctica adicional es el LED de actividad MIDI que indica cuándo se envían datos.

He usado un prototipo de PCB adecuado para mi hardware porque tuve muchos problemas con malas conexiones en mi placa de pruebas. El esquema está hecho en Fritzing, se puede descargar una copia en pdf de alta resolución presionando el enlace a continuación. Prefiero usar un programa de esquemas adecuado como Kicad, creo que Fritzing es demasiado limitado para cualquier cosa que no sean los experimentos más simples.

Materiales usados:

1 pieza Arduino MEGA 2560

2 piezas de resistencia fotográfica (LDR) con resistencia pull up incorporada (del kit de 37 sensores)

1 pieza de sensor ultrasónico HC-SR04

1 Uds 74HC14 disparador Schmitt inversor hexagonal

Resistencia de 2 piezas 220 Ohm 0,25 W

1 pieza de resistencia 1k Ohm 0.25W

1 Uds LED de baja corriente 2mA

1 condensador cerámico de 100nF (para desacoplar la fuente de alimentación, directamente en los pines de alimentación del 74HC14)

Placa de pruebas o prototipo de PCB

2 tubos eléctricos de 16 mm, longitud 65 mm

1 pieza de madera, longitud 75 cm

Cinta adhesiva

Alambres

Paso 5: Listado de E / S

Listado de E / S
Listado de E / S

Paso 6: el código Aduino

El boceto test_Midi6 usa la biblioteca NewPing que debe incluir en su entorno de programación Arduino, para usar el sensor ultrasónico HC-SC04. El boceto está comentado en danés, lo siento. Para mantener el boceto bien estructurado, se crean funciones separadas para diferentes partes lógicas del boceto y en su mayoría se evitan las variables globales. El flujo del programa se visualiza en el pdf del diagrama de flujo del controlador MIDI.

// 15-05-2017 versión: test_Midi6

// Søren Østergaard Petesen // Arduino MEGA 2560 // Programa de Dette udgør en simpel controlador MIDI som kan styre en ekstern MIDI enhed, f.eks en softsynt på en PC. // MIDI controlleren kan sende toneanslag (nota sobre kommando) hhv. (nota de kommando) para en oktav C-C, C dur skala. // Der spilles med en "karate hånd" på et brædt // hvor sensorerne er monteret. MIDI kommandoerne activa un sensor LDR en dobbelt, da der skal laves en sikker // detektering af både når hånden lander på brættet (nota activada), samt når hånden fjernes igen (nota desactivada). // MIDI kommandoerne "note on" og "note off" består hver af 3 bytes som sendes på serial1 porten // vha det i hardware opbyggede interfaz MIDI. // Tonehøjden bestemmes vha ultralydssensor HC-SR04 #include // bibliotek til den anvendte ultralydssensor HC-SR04 #define TRIGGER_PIN 3 // Arduino pin til trigger pin på sensor ultrasónico #define ECHO_PIN 2 // Arduino pin til echo pin på sensor ultrasónico # define MAX_DISTANCE 100 // Afstand máximo para Ping #define Median 5 // Antal målinger der beregnes gennemsnit af for at få en sikker afstandsbestemmelse NewPing sonar (TRIGGER_PIN, ECHO_PIN, MAX_DISTANCE); // Creando el Objeto NewPing. int Senspin1 = 53; // Subte LDR1 føler int Senspin2 = 52; // Øverste LDR2 føler byte MIDIByte2; // Deklaration de Variabel para MIDIByte2 bool klar_note_on = 1; // Variable deklaration para klar_note_on, styrer afsendelse af note on kommando. Første kommando er en note on kommando bool klar_note_off = 0; // Variable deklaration para klar_note_off, styrer afsendelse af note off kommando void setup () {pinMode (Senspin1, INPUT); // sæt entrada del sensor pinMode (Senspin2, INPUT); // sæt sensor input Serial1.begin (31250); // Serial1 brujas hasta comunicación MIDI: 31250 bit / sekundt Serial.begin (9600); // monitor en serie, prueba hasta} bucle vacío () {bool Sensor1 = digitalRead (Senspin1); // Læs LDR1 - underte LDR bool Sensor2 = digitalRead (Senspin2); // læs LDR2 - øverste LDR if (Sensor1 && klar_note_on) // hvis LDR1 aktiveret og klar til note sobre {byte Note_Byte = Hent_tonehojde (); // Hent tone højde a través del sensor ultralyds MIDIByte2 = Hent_MidiByte2 (Note_Byte); // Hent MidByte2, número de nota MIDI, værdien 0xFF er fuera de rango Send_Note_On (MIDIByte2); // kald Send_Note_On función klar_note_on = 0; // der skal kun sendes en nota sobre kommando klar_note_off = 1; // næste kommando er note off} if (Sensor2 &&! Sensor1 && klar_note_off) // Hvis der skal sendes note off kommando gøres det her.. {Send_Note_Off (MIDIByte2); // enviar nota de kommando klar_note_off = 0; // der skal kun sendes en note off kommando} if (! Sensor1 &&! Sensor2) // her gøres klar til ny note on kommando, hånd er væk fra brædt {klar_note_on = 1; }} byte Hent_MidiByte2 (byte NoteByte) {// Denne funktion retornerer número de nota MIDI, valgt ud fra NoteByte byte MIDIB2; switch (NoteByte) // sus defineres hvilken værdi MIDIByte2 skal tienen ud fra værdien af Note_Byte {caso 0: {MIDIB2 = 0x3C; // tonen 'C'} descanso; caso 1: {MIDIB2 = 0x3E; // tonen 'D'} descanso; caso 2: {MIDIB2 = 0x40; // tonen 'E'} descanso; caso 3: {MIDIB2 = 0x41; // tonen 'F'} descanso; caso 4: {MIDIB2 = 0x43; // tonen 'G'} descanso; caso 5: {MIDIB2 = 0x45; // tonen 'A'} descanso; caso 6: {MIDIB2 = 0x47; // tonen 'B'} descanso; caso 7: {MIDIB2 = 0x48; // tonen 'C'} descanso; predeterminado: {MIDIB2 = 0xFF; // fuera de rango}} return MIDIB2; // número de nota MIDI de retorno} byte Hent_tonehojde () {// Denne funktion henter resultatet af ultralydsmålingen unsigned int Tid_uS; // målt tid i uS byte Afstand; // beregnet afstand i cm byte resultante; // inddeling af spille område const float Omregningsfaktor = 58.3; // 2 * (1/343 m / s) / 100 = 58, 3uS / cm, der ganges med 2 da tiden er summen af tiden frem og tilbage. Tid_uS = sonar.ping_median (mediana); // Enviar ping, få tid return i uS, gennemsint af Median målinger Afstand = Tid_uS / Omregningsfaktor; // Omregn tid til afstand i cm (0 = rango de distancia exterior) resultat = Afstand / 8; // Beregn resultat return resultat; // Devuelve el resultado} void Send_Note_On (byte tonenr) {// Denne funktion sender en note on kommando på MIDI interfacet const byte kommando = 0x90; // Nota sobre kommando på MIDI kanal 1 const byte volumen = 0xFF; // volumen / velocidad = 127 Serial1.write (kommando); // enviar nota sobre kommando Serial1.write (tonenr); // enviar tono nummer Serial1.write (volumen); // enviar volumen (velocidad)} void Send_Note_Off (byte tonenr) {// Denne funktion sender note off kommando på MIDI interfacet const byte kommando = 0x80; // Note off kommando på MIDI kanal 1 const byte volumen = 0xFF; // volumen / velocidad = 127 Serial1.write (kommando); // enviar nota de kommando Serial1.write (tonenr); // enviar tono nummer Serial1.write (volumen); // enviar volumen (velocidad)}

Paso 7: Conceptos básicos de la comunicación MIDI

MIDI (Interfaz digital de instrumentos musicales) es un protocolo de comunicación en serie universal para interconectar instrumentos musicales electrónicos y otros dispositivos. Se utiliza comunicación en serie (31250 bit / s, el medio de transmisión es un bucle de corriente, optoaislado en el extremo del receptor. Se utilizan conectores DIN de 5 pines. Son posibles 16 canales de comunicación lógica en una conexión MIDI física. Muchos comandos están definidos en el MIDI estándar, utilizo dos comandos en este proyecto, estos comandos constan de 3 bytes:

a) Nota sobre el comando:

1. byte send = 0x90 que significa nota en el comando en el canal MIDI 1

2. byte send = 0xZZ ZZ es el número de nota, utilizo el rango 0x3C a 0x48

3. envío de bytes = 0xFF FF = 255 que significa volumen máximo, rango 0x00 a 0xFF

b) Comando Note Off: 1. envío de bytes = 0x80, lo que significa un comando de desactivación de nota en el canal MIDI 1

2. byte send = 0xZZ ZZ es el número de nota, utilizo el rango 0x3C a 0x48

3. envío de bytes = 0xFF FF = 255 que significa volumen máximo, rango 0x00 a 0xFF

Recomendado: