LOS PROBLEMAS DE LATENCIA SE SOLUCIONAN CON ESTE POST!
ANTES QUE NADA
Hay que pasar el sketch que queramos utilizar, porque despues de actualizar el firmware ya no es posible pasarlo. Lo que si se puede es revertir (colocar el firmware original de arduino UNO)
(ver un sketch de ejemplo al final de este post)
Para instalar hiduino:
Tocar y soltar los dos pines que aparecen en la imagen:
NOTA: Si en los próximos pasos el dfu-programmer da error diciendo que no encuentra libusb0.dll:
Copiar el archivo libusb0_x86.dll
desde dfu-programmer-win-0.7.0\dfu-prog-usb-1.2.2\x86
hacia dfu-programmer-win-0.7.0
Entrar a dfu-programmer-win-0.7.0 y renombrar libusb0_x86.dll a libusb0.dll
dfu-programmer atmega16u2 erase
dfu-programmer atmega16u2 flash arduino_midi.hex
dfu-programmer atmega16u2 reset
[Para ver los dispositivos usb se puede usar la utilidad lsusb.exe]
Para volver el arduino UNO a su origen
dfu-programmer atmega16u2 erase
dfu-programmer atmega16u2 flash "c:\Program Files (x86)\Arduino\hardware\arduino\avr\firmwares\atmegaxxu2\Arduino-COMBINED-dfu-usbserial-atmega16u2-Uno-Rev3.hex" --suppress-bootloader-mem
[Para ver los dispositivos usb se puede usar la utilidad lsusb.exe]
Acá está la lista de notas utilizadas para DRUMS
http://soundprogramming.net/file-formats/general-midi-drum-note-numbers/
Sketch de ejemplo (toca DO cuando el piezo se golpea)
#include <MIDI.h> // Incluimos la libreria MIDI
//Xylophone
//Adapted for an ArduinoMega
//from Jenna deBoisblanc and Spiekenzie Labs initial code
//*******************************************************************
// User settable variables
//*******************************************************************
MIDI_CREATE_DEFAULT_INSTANCE();
int pinRead;
char pinAssignments[6] ={'A0','A1','A2','A3','A4','A5'};
byte PadNote[16] = {57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72}; // MIDI notes from 0 to 127 (Mid C = 60)
int PadCutOff[16] =
{
400,400,200,800,400,400,400,400,400,400,400,400,400,400,400,400}; // Minimum Analog value to cause a drum hit
int MaxPlayTime[16] = {
90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90}; // Cycles before a 2nd hit is allowed
#define midichannel 1; // MIDI channel from 0 to 15 (+1 in "real world")
boolean VelocityFlag = true; // Velocity ON (true) or OFF (false)
//*******************************************************************
// Internal Use Variables
//*******************************************************************
boolean activePad[16] = {
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}; // Array of flags of pad currently playing
int PinPlayTime[16] = {
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}; // Counter since pad started to play
byte status1;
int pin = 0;
int hitavg = 0;
//*******************************************************************
// Setup
//*******************************************************************
void setup()
{
MIDI.begin();
}
//*******************************************************************
// Main Program
//*******************************************************************
void loop()
{
for(int pin=0; pin < 16; pin++) //
{
//int pin = 3;
// for (pinRead=0; pinRead < 16, pin++){
hitavg = analogRead(pinAssignments[pin]);
//Serial.println(hitavg);
// read the input pin
if((hitavg > PadCutOff[pin]))
{
if((activePad[pin] == false))
{
if(VelocityFlag == true)
{
// hitavg = 127 / ((1023 - PadCutOff[pin]) / (hitavg - PadCutOff[pin])); // With full range (Too sensitive ?)
hitavg = (hitavg / 8) -1 ; // Upper range
}
else
{
hitavg = 127;
}
// MIDI.sendNoteOn(144,PadNote[pin],hitavg); //note on
MIDI.sendNoteOn(48, 127, 1);
PinPlayTime[pin] = 0;
activePad[pin] = true;
}
else
{
PinPlayTime[pin] = PinPlayTime[pin] + 1;
}
}
else if((activePad[pin] == true))
{
PinPlayTime[pin] = PinPlayTime[pin] + 1;
if(PinPlayTime[pin] > MaxPlayTime[pin])
{
activePad[pin] = false;
MIDI.sendNoteOn(144,PadNote[pin],0);
}
}
}
}
Fuentes:
http://geekytheory.com/arduinomidi-tu-propio-piano/
http://bartruffle.blogspot.com/2013/09/dfu-programming-atmega16u2-on-arduino.html
http://answers.microsoft.com/en-us/windows/forum/windows_7-pictures/latency-problem-using-ms-gs-wavetable-synth/1e85704a-803c-438f-b472-fb0cb5211be4




