Paso 6: XY MIDI teclado
Si usted ejecutaremos ejemplos pasados ha notado funcionan muy lentamente. No hay nada de malo con TFT display y también no hay nada de malo con el código o librerías. Esto es porque tratamos de utilizar un microcontrolador de 8 bits a 16MHz (o 20MHz). De hecho esta pantalla puede ejecutar mucho más rápido que podemos enviar datos (con nuestro procesador).
De hecho podríamos hacer algunas mejoras en el código y las bibliotecas, pero cambios no será dramáticos. Idealmente necesitamos procesador más potente, (incluso de 16 bits) de 32 bits, controlador DMA, > 150 Mhz, más memoria RAM (para el búfer de vídeo) etc....
En cambio podemos diseñar nuestros programas para actualizar sólo una pequeña área de la pantalla cuando necesitamos velocidad.
Puse el código entero para Arduino proyecto XY Pad MIDI aqui (adjunta a este paso, MIDIPad.zip). Puede ser estudiada en detalle para ver cómo aplica lo que dije arriba. Sin embargo comentaré algunas secciones.
En la función draw_Pad (x largo, y largo), antes de dibujar nuevas líneas, Borrar líneas viejas redibujando con el color de fondo.
void draw_Pad(long x, long y)<br>{ // we draw 3 three lines for x and three lines for y // for better visibility myGLCD.setColor(pad_bk); myGLCD.drawLine(old_x-1,pad_topY,old_x-1,pad_bottomY); // clear old line x-1 myGLCD.drawLine(old_x+1,pad_topY,old_x+1,pad_bottomY); // clear old line x+1 myGLCD.drawLine(old_x,pad_topY,old_x,pad_bottomY); // clear old line x myGLCD.drawLine(pad_topX,old_y-1,pad_bottomY,old_y-1); // clear old line y-1 myGLCD.drawLine(pad_topX,old_y+1,pad_bottomY,old_y+1); // clear old line y+1 myGLCD.drawLine(pad_topX,old_y,pad_bottomY,old_y); // clear old line y myGLCD.setColor(reticle_color); myGLCD.drawLine(x-1,pad_topY,x-1,pad_bottomY); // draw new line x-1 myGLCD.drawLine(x+1,pad_topY,x+1,pad_bottomY); // draw new line x+1 myGLCD.drawLine(x,pad_topY,x,pad_bottomY); // draw new line x myGLCD.drawLine(pad_topX,y-1,pad_bottomX,y-1); // draw new line1 y-1 myGLCD.drawLine(pad_topX,y+1,pad_bottomX,y+1); // draw new line2 y+1 myGLCD.drawLine(pad_topX,y,pad_bottomX,y); // draw new line3 y }
No he utilizado la conocida biblioteca MIDI Arduino (como mi proyecto anterior). En su lugar utilizo una función simple para enviar comandos de MIDI CC:
void SendMIDIControl(byte channel, byte controller, byte value) { byte tmpChannel = (channel & 0b00001111)-1; //0= channel1...1=channel2... etc tmpChannel = 0b10110000 + tmpChannel; //midi data first bit allways 1, //+ 011 control change command //+ midi channel byte tmpController = controller & 0b01111111; //midi data first bit allways 0 byte tmpValue = value & 0b01111111; //midi data first bit allways 0 Serial1.write(tmpChannel); Serial1.write(tmpController); Serial1.write(tmpValue); }
Para enviar comandos de MIDI al PC por USB he utilizado un módulo que hice anteriormente. Para más detalles ver mi proyecto aquí:
Importante!:
No podemos usar el primer puerto serial pasadores porque sus pines son utilizados ya por shield TFT.
- Para Arduino UNO debemos utilizar SoftwareSerial.
- Para Arduino MEGA podemos utilizar SoftwareSerial o Serial1 / Serial2 (he probado con SoftwareSerial y Serial1)
Mi módulo Arduino USB Midi Interface puede ser replaced(theoretical) con una combinación de Escudo de MIDI y USB para MIDI converter. No he probado esta forma (no tengo ninguno).