Arduino MIDI drums paso a paso - instalacion de hiduino

ATENCION: Todo esto fue testeado en arduino UNO R3, que corresponde a atmega16u2
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


Transferir el firmware hiduino de esta forma:

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

Solucionar problema de latencia en Microsoft GS Wavetable Synth / latency

1. Descargar VirtualMidiSynth desde aquí: http://coolsoft.altervista.org/en/virtualmidisynth
(o bajarlo desde Drive, del proyecto Arduino DRUMS)

2. Descargar un sound font desde la misma página (o bajarlo del Drive)

3. Instalar VirtualMidiSynth y configurarlo:
             Establecerlo como el dispositivo midi por defecto
             Agregarle el sound font que bajamos en el paso 2

4. En la ficha "Advanced" reducir el "additional output buffer" a cero.

5. Ejecutar Ableton, y elegir como salida VirtualMidiSynth en lugar de Microsoft GS Wavetable
(tambien se puede probar con synthesia)


Fuentes:

http://answers.microsoft.com/en-us/windows/forum/windows_7-pictures/latency-problem-using-ms-gs-wavetable-synth/1e85704a-803c-438f-b472-fb0cb5211be4

http://kbd-infinity.com/kbd-infinity-blog/replacing-microsoft-gs-wavetable-synth/

Configuracion de instrumento MIDI en Ableton Live

ATENCION!!! Si se esta utilizando EZdrummer y el driver ASIO, los sonidos NO salen por los parlantes. Hay que conectar auriculares!!!!!

(Otra opcion es ir a las propiedades del dispositivo de salida, y en la ficha Avanzadas, desmarcar "Allow applications to take exclusive control of this device")


1. Arrastrar External Instrument a donde dice Drag and Drop Devices Here


2. Luego de agregarlo, ver que aparece abajo a la izquierda un recuadro que dice External Instrument


3. En MIDI To, elegir el dispositivo por el cual queremos que salga el audio *elegir USB Midi Cable"


Luego hay que arrastrar al external instrument recien agregado, el instrumento que queramos utilizar (los instrumentos elegirlos de la carpeta instrument rack) .



Recordar que el audio sale por los auriculares y no por el parlante!!!