Paso 13: La biblioteca
En la introducción de este Instructable, te prometí una manera fácil de programar su propio controlador de MIDI. Bueno, aquí está!
Es una biblioteca que intenta comprometer entre gran personalización y código fácil de usar, accesible para los principiantes de Arduino.
Actualmente soporta potenciómetros, potenciómetros, interruptores, botones, codificadores rotatorios y tiene una función fácil para enviar comandos MIDI.
Estoy pensando en añadir más salida de LED y soporte de Control de Pitch Bend en el futuro cercano.
Instalación de la biblioteca de MIDI_controller
Esta biblioteca se basa en las funciones de MIDI del software que instalamos anteriormente (Teensyduino, TeeOnArdu, HIDUINO, etc.) así que regresamos al paso 6 y 8 e instalarlos. No se desanime por el procedimiento de instalación aparentemente largo, si sigues las instrucciones, usted debe ser fino. Una vez que todo está configurado, es realmente fácil de usar!
La propia biblioteca de MIDI_controller se instala como cualquier otra biblioteca de Arduino.
Estas son las instrucciones para IDE de Arduino 1.0.6:
- Descargar la biblioteca aquí.
- En el menú 'dibujo' haga clic en 'importarbiblioteca...' y luego ' Añadir biblioteca...'.
- Vaya al directorio de descargas, haga doble clic y en la columna de la derecha, seleccione MIDI_controller.zip.
- Haga clic en 'Aceptar'.
- Reiniciar el IDE para cargar las palabras clave (para obtener el color naranja para las funciones etc..)
Eso es todo.
Instrucciones para el uso
Primero añadir la biblioteca a su bosquejo escribiendo esta línea en la parte superior del archivo:
La biblioteca tiene actualmente 4 clases: análogo, Digital, DigitalLatch y codificador.
Una clase tiene un conjunto de funciones y un conjunto de variables. Algunos son privados y se utilizan dentro de la clase, otros son públicos y se puede llamar desde fuera de la clase. Más clases aquí.
El primer paso en el uso de una clase es crear a un miembro de la clase. Sobre todo ello, antes de la instalación, puede utilizar el miembro por todas partes en el programa.
Por ejemplo, permite añadir a un miembro 'potenciómetro' de la clase analógica:
Analógica potenciómetro (bla, bla, bla...);
(Sólo ignorar el blah por ahora)
Ahora que el miembro se crea, podemos usar las funciones de análoga en él, por ejemplo, la función de actualización:
potentiometer.refresh() de ;
Al igual que Arduino funciones como digitalWrite, no puede utilizar esas funciones fuera de la instalación o el bucle.
Para la explicación de lo que las funciones de hacen y lo hicieron, leer después de referencia.
Análogo
La clase analógica está diseñada para entradas analógicas, potenciómetros y faders (o sensores analógicos que un valor entre 0 y 5V de salida). Un número de pin inválido dará como resultado el LED en el pin 13 intermitente en 1Hz.
Crear miembros
- Analógico (pin bytes, controlador de byte, canal de byte, byte de resolución);
el PIN es el pin analógico al leer. Está conectado con el limpiaparabrisas del potenciómetro.
es el número de controlador MIDI (datos 1 en el mensaje de MIDI). Esto es cómo va a aparecer en el software de MIDI, como una dirección única.
es el canal de MIDI.
la resolución es la resolución de la analógica de lectura. Una resolución de 2 le daría sólo 2 posibles valores (0 y 127), una resolución de 3 daría 3 valores posibles (0, 63 y 127). Una resolución de 128 da 128 posibles valores (0-127), esto es el valor por defecto, porque es todos los números de 7 bits. (MIDI utiliza números de 7 bits para el envío de valores) Utilice un valor inferior a 128, como 64, si hay mucho ruido en su entrada, por ejemplo, si el controlador mantiene en envío de 0,1,0,1,0,1,0,1,... Utilice 128 si desea utilizar la máxima resolución disponible.
Funciones
- Refresh();
Esta función comprueba la entrada, y si ha cambiado desde la última vez que fue llamada actualización, envía el nuevo valor sobre MIDI (en el número de controlador predefinidos y canal).
- Banco (pin de byte, byte regulador, canal bytes);
Esta función le permite utilizar una entrada analógica (junto con un interruptor) para varios controles. Si el interruptor está en la posición, el controlador y el canal serán las que se han definido durante la creación de miembros, si el interruptor está en la posición ON, el controlador y el canal serán las que se especifican como argumentos de esta función.
el PIN es el pin digital con el interruptor conectado. Se habilitará el resistor interno de pull-up.
controlador es el controlador cuando el interruptor está encendido.
canal es el canal a utilizar cuando el interruptor está encendido.
- detachBank();
Esta función desactiva la funcionalidad de banco que se creó con la función de Banco. El controlador y el canal serán las que se han definido durante la creación de miembros una vez más, independientemente del estado del interruptor.
El pasador del interruptor definido en la función del Banco se establecerá como una entrada sin resistor de pull-up otra vez.
Constantes
- Ninguno.
Ejemplos
- Analog_example
- Analog_bank_example
Digital
La clase Digital está diseñada para uso con interruptores y botones. Envía un mensaje de noteOn cuando se presiona el botón y un mensaje de noteOff cuando se suelta el botón. Conectar los conmutadores entre la clavija de entrada y el suelo, se utilizarán las resistencias de pull-up interna. Un número de pin inválido dará como resultado el LED en el pin 13 intermitente en 1Hz.
Crear miembros
- Digital (pin bytes, nota de byte, canal de byte, velocity byte);
el PIN es el pin digital con el botón conectado.
Nota es la nota de MIDI para enviar. 60 es C media, y cada nota media es de más o menos uno. Puede comparar esto al número regulador analógico.
es el canal de MIDI.
la velocidad es tan fuerte se golpea la nota. Esto no importa para un botón normal, siempre y cuando no es 0. (Importa sin embargo para sensibles al tacto los cojines por ejemplo.)
Funciones
- Refresh();
Esta función comprueba la entrada, y si ha cambiado desde la última vez que fue llamada actualización, envía el mensaje correspondiente: noteOn cuando se presiona el botón, noteOff cuando se suelta el botón.
- Banco (pin de byte, byte nota, canal bytes);
Esta función le permite usar un botón (junto con un interruptor) para varios controles. Si el interruptor está en la posición, la nota y canal serán las que se han definido durante la creación de miembros, si el interruptor está en la posición ON, la nota y el canal serán las que se especifican como argumentos de esta función.
el PIN es el pin digital con el interruptor conectado. Se habilitará el resistor interno de pull-up.
Nota es la nota cuando el interruptor está encendido.
canal es el canal a utilizar cuando el interruptor está encendido.
- detachBank();
Esta función desactiva la funcionalidad de banco que se creó con la función de Banco. La nota y el canal serán las que se han definido durante la creación de miembros una vez más, independientemente del estado del interruptor. El pasador del interruptor definido en la función del Banco se establecerá como una entrada sin resistor de pull-up otra vez.
Constantes
- Ninguno.
Ejemplos
- Digital_example
- Digital_bank_example
DigitalLatch
La clase DigitalLatch está pensada para usar con interruptores de palanca, que no son momentáneos. Envía un noteOn y un mensaje de noteOff, cada vez los cambios de estado. El retardo entre el encendido y apagado el mensaje pueden ajustarse. Si el estado cambia antes de que el retraso ha terminado, se envía el mensaje de noteOff todos modos y se inicia otro 'pulso': se envía otro mensaje de noteOn y después fijar retardo, se envía el mensaje de noteOff así.
Esta clase es útil si desea utilizar los botones de 'silencio' o 'solas' el software no momentáneo interruptores de palanca. Si se cambia el interruptor, se silencia la pista apropiada, cuando cambie el interruptor de apagado una vez más, la pista no apagado, por ejemplo.
Conectar los conmutadores entre la clavija de entrada y el suelo, se utilizarán las resistencias de pull-up interna. Un número de pin inválido dará como resultado el LED en el pin 13 intermitente en 1Hz.
Crear miembros
- DigitalLatch (pin bytes, nota byte, byte canal, velocidad del byte, int retardo);
el PIN es el pin digital con el interruptor conectado. Se habilitará el resistor interno de pull-up.
Nota es la nota de MIDI para enviar. 60 es C media, y cada nota media es de más o menos uno. Puede comparar esto al número regulador analógico.
es el canal de MIDI.
la velocidad es tan fuerte se golpea la nota. Esto no importa para un interruptor normal, siempre y cuando no es 0.
Delay es el retardo entre los mensajes noteOn y noteOff, en milisegundos. 100ms funciona muy bien. No escriba 0.
Funciones
- Refresh();
Esta función comprueba la entrada y envía el mensaje apropiado, como se explica en la descripción de esta clase. (Nota: no se envía el mensaje de noteOff, si esta función no es llamada otra vez, después de enviar el mensaje de noteOn. Si usted acaba de poner esto en su ciclo, sin embargo, usted debe bien.)
- Banco (pin de byte, byte nota, canal bytes);
Esta función le permite utilizar un interruptor (junto con un interruptor de banco) para varios controles. Si el interruptor del Banco está en la posición, la nota y canal serán las que se han definido durante la creación de miembros, si el interruptor del Banco está en la posición ON, la nota y el canal serán las que se especifican como argumentos de esta función.
el PIN es el pin digital con el interruptor conectado. Se habilitará el resistor interno de pull-up.
Nota es la nota cuando el interruptor está encendido.
canal es el canal a utilizar cuando el interruptor está encendido.
- detachBank();
Esta función desactiva la funcionalidad de Banco que se estableció con el Banco de la función. La nota y el canal serán las que se han definido durante la creación de miembros una vez más, independientemente del estado del interruptor. El pasador del interruptor definido en la función del Banco se establecerá como una entrada sin resistor de pull-up otra vez.
Constantes
- Ninguno.
Ejemplos
- DigitalLatch_example
- DigitalLatch_bank_example
RotaryEncoder
Esta biblioteca está pensada para usar con un codificador de cuadratura. Se adapta desde biblioteca de codificador de PJRC. Envía mensajes de relativos. Puede establecer la manera en que se manejan valores negativos. Conectar la clavija común del codificador en el terreno, se utilizarán las resistencias de pull-up interna. Un número de pin inválido dará como resultado el LED en el pin 13 intermitente en 1Hz.
Crear miembros
- RotaryEncoder (byte pin1, pin2 bytes, controlador bytes, bytes canal, int speedMultiply, byte pulsesPerStep, modo de byte);
PIN1 es el pin de interrupción primero con el codificador conectado.
PIN2 es el segundo pin de interrupción con el codificador conectado.
es el número de controlador MIDI (datos 1 en el mensaje de MIDI). Esto es cómo va a aparecer en el software de MIDI, como una dirección única.
es el canal de MIDI.
speedMultiply es el valor que se multiplicará con el desplazamiento relativo, si el codificador no es rápido en su software. Si, por ejemplo, speedMultiply se establece en 5, y el codificador a enviar un mensaje de '+ 1', ahora se enviará un mensaje de '+ 5'. Valor predeterminado es 1.
pulsesPerStep es el número de pulsos del encoder salidas al girar a un paso, o haga clic en. En un encoder rotatorio normal, esto es 4. Cuando se establece en 4, cambiará la 1 unidad en tu software por haga clic en que girar, en lugar de 4. Esto sobre todo es más lógico. Sin embargo, para ruedas de avance lento puede establecer a 1, para tomar ventaja de la resolución completa de la rueda. Use 'NORMAL_ENCODER' o 'Correr' como argumento.
modo es la manera que se envía el mensaje MIDI (para que sea un número con signo). Hay 3 modos disponibles. Utilizan 'ADD_64', 'SIGN_BIT' o 'POS1_NEG127' como argumento.
Funciones
- Refresh();
Esta función comprueba la posición de codificador, y si ha cambiado desde la última vez, el cambio relativo se envía a través de MIDI.
Constantes
- NORMAL_ENCODER
configurar pulsesPerStep para 4, para codificadores rotatorios normales.
- JOG
establezca pulsesPerStep en 1, para ruedas de avance lento.
- ADD_64
Primer modo relativo mensajes MIDI. Este es probablemente el más simple. Esto básicamente asigna 0 a 64 (que es 128/2). Por ejemplo, si quiero enviar -1 Añadir 64 = 63 y lo envíe. Si quiero enviar + 1, también añadir 64 = 65. Si envío a sólo 64, el equipo no hará nada, porque sabe que es un desplazamiento de 0. (En el lado de la computadora, sólo restan 64, y se puede utilizar el resultado como si nada ha pasado).
- SIGN_BIT
Segundo modo de relativa mensajes MIDI. En equipos, sobre todo se guardan los valores firmados con un bit de signo. El bit de signo es el bit más significativo. Cuando es 0, el definido por los otros bits es positivo, cuando es 1, el número es negativo. En un mensaje MIDI, esto es de tipo bit 6 (el bit 7, ya que es basado en 0). Por ejemplo: + 4 sería 0b00000100 y -4 sería 0b01000100.
- POS1_NEG127
Tercer modo relativo mensajes MIDI. Definir + 1 1 y -1 como 127. Podemos seguir esto: + 2 = 2 y -2 = 126, etc. hasta + 63 = 63 y = 65 -63.
Ejemplos
- Encoder_example
sendMidi.h
Esta no es una clase, es sólo dos funciones. Automáticamente Descubre qué Arduino está utilizando y elige los ajustes necesarios para enviar un MIDI. (Nota: ya está automáticamente incluido si se incluye la biblioteca de MIDI_controller, ya que las clases dependen de comunicación MIDI.)
Funciones
- setupMidi (byte ledPin, retraso);
Configura la conexión MIDI. Una vez en configuración.
ledPin es el pin con el LED conectado. Generalmente se trata de 13. El LED parpadeará cada vez que se envía un mensaje. Si no quieres esto, o si desea utilizar todos sus pines como entradas, utilizar 'NO_BLINK'.
Delay es el retardo (en milisegundos) Añadir después de cada mensaje que envía. 5 o 10 ms funciona bien. Aumentar la estabilidad, disminuir para una respuesta más rápida. Uso 'NO_DELAY' para continuar tan pronto como el mensaje se envía sin demora. (Nota: es normal que el 'blink led' a son muy tenues, si usas poco o ningún retraso, esto es simplemente porque el tiempo es muy corto.)
- sendMidi (byte messageType canal bytes, byte data1, data2 bytes);
Envía un mensaje MIDI.
messageType es el tipo de mensaje, como noteOn, noteOff o CC. Este es un número de 4 bits.
es el canal de MIDI. Se trata de un número de 4 bits.
data1 es el primer byte de datos. Este es un número de 7 bits.
data2 es el segundo byte de datos. Este es también un número de 7 bits.
Nota: Lea paso 6 para obtener más información sobre mensajes MIDI.
- sendMidi (byte messageType, canal de byte, int datos);
Envía un mensaje MIDI
messageType es el tipo de mensaje, como el cambio de programa o Pitch Bend.
es el canal de MIDI. Se trata de un número de 4 bits.
datos es el valor a enviar. 7-bits en el caso de un cambio de programa, para elegir un instrumento para un canal, o un número entre-8192 y 8191 en caso de un Pitch Bend.
Constantes
- NO_BLINK
Parpadeará el LED no parpadea cuando se envía un mensaje. El pin del LED también no se establecerá como salida.
- NO_DELAY
Demora no se añadirá después de enviar el mensaje.
- NOTE_ON
Tipo de mensajes: 0x90, se utilizan para encender una nota. Utilice NOTE_OFF o enviar otra vez con velocidad = 0 para apagar otra vez.
- NOTE_OFF
Mensaje tipo: 0 x 80, use para apagar una nota.
- CC
Tipo de mensaje: 0xB0 (Control de cambio), se utiliza para enviar valores analógicos, como los valores de un potenciometro.
- PROGRAM_CHANGE
Tipo de mensaje: 0xC0 (cambio de programa), se utiliza para establecer el instrumento de un determinado canal. (Canal 10 es percusión).
- PITCH_BEND
Tipo de mensaje: 0xE0 (Pitch Bend), usa para enviar grandes valores analógicos.
De depuración
En la carpeta de biblioteca de MIDI_controller, hay un archivo 'debug.h'. Si tienes problemas con los mensajes MIDI, descomentar la línea "#define DEBUG". Esto enviará todos los mensajes de MIDI sobre Serial, a 9600 baudios, en notación hexadecimal. También puede utilizar herramientas como 'midisnoop' para solucionar problemas de mensajes MIDI.
Nota: no olvides comentar la línea hacia fuera otra vez volver a utilizar USB MIDI.
Ejemplos
- sendMidi_example_intoxicated