Paso 7: Cómo funciona
Como se describe anteriormente (en cambio-en-midi-description.rtf, disponible en GitHub), el microcontrolador hace que los registros de cambio al cierre de los datos en cada entrada y luego cambios de todos los 64 bits de datos de los registros. Aquí es el proceso para convertir los datos de registro de cambio de notas:
Nota: este proceso se ejecuta continuamente en un bucle, miles de veces por segundo
1. los registros de desplazamiento son trabados, leyendo la 61inputs de una vez.
Nota: puertas lógicas siempre necesitan una referencia para alta o baja. Generalmente lo mejor es proporcionar una referencia a la "alta". Esto era necesario para los primeros circuitos integrados se llama "lógica de emisor acoplado" o "TTL". Fue mucho menos desperdicio de energía a tirar entradas en estos chips que intente sacarlos bajo. Cuando decimos "tirar" queremos conectar una clavija en una fuente de corriente o un lavabo a través de un resistor. Por lo general de 10K Ohm se utiliza. Así, en nuestro caso, cada entrada requiere una conexión a la tensión de alimentación (5 V) a través de una resistencias de 10K. Se trata de un montón de resistencias, pero por suerte, resistencias son muy baratas. Por lo tanto, cuando cierre en las entradas, si ninguna tecla es presionada un estado "alto" lógica se leerá. Conectamos el bus compartido a tierra (en realidad un pin en el microcontrolador será una salida baja, que actúa como un sumidero de corriente). Si se pulsa una tecla, "tira" la clavija de entrada de registro de cambio a un estado lógico "bajo". Esto es una clave "on" es leído como "off", que es al revés, pero nos podemos arreglar esto fácilmente un poco más adelante.
2. cambio de registro de datos se almacenan en una matriz de 8 bytes de la clave actual y anterior estado clave.
Una vez que se cierre los registros de cambio, comenzamos enviando pulsos de reloj. Cada pulso de reloj hace que el estado del registro de desplazamiento para cambiar de puesto un pedacito hacia el pin de salida. Cada salida de virutas está conectada a la entrada del siguiente chip. Esto permite los datos para moverse secuencialmente a través de todas las fichas. Pero ¿cómo tratamos con el "en es de" y "off"? El 74hc165 proporciona dos salidas serie - una salida normal y una salida invertida. Conectamos el microcontrolador a la salida invertida del último registro de desplazamiento. Este cambia la entrada de los Estados a lo que queremos - tecla abajo es "on" o "1" y clave para arriba son "off" o "0".
Estamos utilizando un microcontrolador de 8 bits. Funciona mejor y más eficientemente con 8 bits (un byte) a la vez. Así, leemos el cambio registro de datos un byte a la vez. Los ocho bits en un byte a almacenar el estado clave de ocho teclas. Necesitamos 8 bytes para almacenar los Estados claves de todas 61 teclas.
Tenemos que prestar mucha atención a cómo los datos provienen de los registros de cambio. Hemos conectado nuestros chips así que el primer pin primeros registros (entrada A) está conectado a la tecla de la derecha - que llamamos la tecla "1". La última clave es clave "61". Por lo tanto, vamos a obtener de los Estados claves de los registros en la derecha a la izquierda orden. Así que el primer byte leído realmente va a ser el último cinco llaves (y las tres entradas no utilizadas). Queríamos que nuestros bytes a ser almacenado en izquierda a derecha orden, tuvimos también que asegurarse de que ponemos el primer bit recibido en cada octeto en el bit más a la izquierda del byte de estado clave.
Puede hacerlo cualquier orden que desee, pero tienes que ser constante!
3. principales Estados se convierten en Estados de empuje; los Estados de empuje se almacenan en una matriz de bytes de 61 con nota sobre, nota apagado y ningún cambio.
Así pues, tenemos 8 bytes digno de Estados clave para los 61 teclas. Pero esto no es exactamente lo que necesitamos para enviar comandos MIDI. MIDI causa notas al sonido con un comando "Nota sobre" y la nota permanece encendida hasta que se envía "note off". Así que tenemos que convertir el estado dominante en un estado de la prensa. Queremos saber cuando se pulsa una tecla para que podamos encender la nota y queremos saber cuando una tecla ha sido liberada por lo que podremos apagar la nota. No queremos enviar "Nota sobre" miles de veces por segundo. Que inundaría los autobuses MIDI con datos y no funcionaría.
Para generar Estados de empuje de Estados clave tenemos que guardar la clave actual y el anterior estado clave. Comparamos los dos cada exploración bucle y ver si el estado cambiado. Si fue a la baja, luego empuje hacia abajo está registrado y se envía una "Nota sobre". Si fue alto a bajo, luego una tecla arriba está registrada y se envía una nota de"apagado". Si nada cambia, no hay nuevos datos de MIDI se envían.
Computamos la información de nota MIDI por almacenar un valor más bajo de nota y luego agregando el índice de la matriz para obtener la nota real. Esta es la forma más sencilla de aproximarse. Si usted quiere conseguir lujo necesita a algún tipo de tabla de búsqueda.
4. el proceso se repite. Nos aseguramos de que esperamos una cantidad mínima de tiempo entre escaneos del teclado. Si explora muy rápidamente vamos a recoger lo que se llama "clave bounce" - ruido eléctrico generado cuando los contactos abren y cierran. Si lo leemos obtenemos información falsa del estado dominante. Todo lo que tenemos que hacer es esperar un poco más largo el período típico "rebote". Si no ha transcurrido aún el período de rebote (10 microsegundos en este proyecto), nosotros simplemente salir del bucle de exploración y vuelva a intentarlo.
¿Cómo realmente nos convertir Estados clave en los Estados de empuje?
En este proyecto, podemos leer que el cambio se registra utilizando el software. Esto se llama "bit golpeando". No es el método más rápido. Hay una instalación de hardware en el chip ATMEGA llamado el SPI (Serial/interfaz paralela) que podría hacerlo mucho más rápido. Sin embargo, es más difícil de entender y resulta que leyendo entradas humanos golpeando poco es mucho rápido. Nos aseguramos de que es rápido utilizando el microcontrolador tan eficientemente como sea posible. Hacemos todas nuestras comparaciones de estado clave con operadores bit a bit. Los operadores bit a bit que utilizamos son "<<" desplazamiento a la izquierda, ">>" shift derecho. "^" OR exclusiva (XOR) y "y" XOR y se usa para ver cuándo estado clave dentro de un byte de Estado ha cambiado en comparación con el estado anterior. Y se utiliza para seleccionar los bits de un byte mediante una máscara de bits. Los operadores de desplazamiento se utilizan para mover un poco de máscara de bits izquierda o derecha dentro de un byte para seleccionar un bit específico para comparar. Todas estas operaciones pueden llevarse a cabo en uno o dos ciclos de reloj, lo que los hace muy rápidos.
Si quieres aprender más sobre cómo funciona el código, mira la fuente. Ofrecemos un montón de comentarios sobre el funcionamiento de cada parte. Una vez más, la parte más difícil es simplemente asegurarse de leer y comparar datos en el orden correcto.