Stap 6: XY MIDI Pad
Als u uitvoeren van de laatste voorbeelden opgemerkt hebben lopen ze heel langzaam. Er is niets mis met TFT display en ook is er niets mis met de code of bibliotheken. Dit is omdat we proberen het gebruik van een 8-bit microcontroller op 16MHz (of 20MHz). In feite deze weergave veel sneller dan we gegevens sturen kunnen kunt uitvoeren (met onze processor).
Inderdaad kunnen we sommige verbeteringen aan de code en Bibliotheken, maar wijzigingen zullen niet dramatisch. Idealiter moeten we krachtigere bewerker, 32-bits (zelfs 16 bit), DMA-controller, > 150 Mhz, meer RAM (voor video buffer) enz...
In plaats daarvan kunnen we het ontwerp van onze programma's bijwerken slechts een klein gebied van het scherm wanneer we snelheid nodig.
Ik zet hier de hele code voor Arduino project XY Pad MIDI (verbonden aan deze stap, MIDIPad.zip). Kunnen bestudeerd worden in detail om te zien hoe ik toegepast wat ik zei hierboven. Nochtans zal ik ingaan op sommige secties.
In de functie draw_Pad (lang x, lange y), voordat de nieuwe lijnen, duidelijke oude lijnen opnieuw tekenen met de achtergrondkleurtekenen.
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 }
Ik heb niet de bekende Arduino MIDI-bibliotheek gebruikt (zoals mijn vorige project). Ik gebruik in plaats daarvan een eenvoudige functie om MIDI CC opdrachten te verzenden:
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); }
Voor het verzenden van MIDI opdrachten op PC via USB gebruikte ik een module die ik eerder gemaakt. Voor details zie mijn project hier:
Belangrijk!:
We kunnen niet de eerste seriële poort gebruiken , pennen omdat haar pins al door TFT schild gebruikt worden.
- Wij moeten SoftwareSerialgebruiken voor Arduino UNO .
- Voor Arduino MEGA kunnen we gebruik maken van SoftwareSerial of Serial1 / Serial2 (ik getest met SoftwareSerial en Serial1)
Mijn Arduino USB Midi-Interface module kunnen replaced(theoretical) met een combinatie van het Schild van de MIDI en USB naar MIDI converter. Ik heb niet getest op deze manier (ik heb geen noch).