www.deejaysystem.com
Controladores externos para Deejaysystem(tm) MK2 / VJ2
 
 
Manual > Controladores externos > MIDI genérico English | Français

MIDI genérico

Deejaysystem puede utilizar cualquier controlador compatible con el estándar MIDI. Se pueden añadir nuevos controladores escribiendo ficheros de definición en formato XML.

Los controladores MIDI soportados por Deejaysystem están definidos cada uno por un fichero midi_<nombre>.xml en la carpeta Plugins. La configuración por defecto para todos los controladores (asignación de controles físicos a comandos en Deejaysystem) está definida en el fichero Plugins\MidiDefaults.xml.

Contáctanos si has escrito un fichero XML para tu controlador y quieres que sea incluido en la próxima versión de Deejaysystem.

Fichero de definición de controlador MIDI: midi_*.xml

Debe ser un fichero XML cuyo nombre empieza por midi_, de forma que cumpla el patrón de búsqueda midi_*.xml. El fichero debe estar en la carpeta Plugins.

Estructura de un fichero de definición de controlador MIDI:

<MidiDevice>
<Info> ... </Info>
<Inputs> <Input ... /> <Input ... /> ... </Inputs>
<Outputs> <Output ... /> <Output ... /> ... </Outputs>
<OutputMaps> <OutputMap ... /> <OutputMap ... /> ... </OutputMaps>
</MidiDevice>

Outputs y OutputMaps son opcionales.

1. La sección Info

Proporciona los datos para identificar el dispositivo

<MidiDevice>
    <Info>
<Name>Numark Omni Control</Name>
<PrefixId>NMC</PrefixId>
<MidiInName>Numark OMNI CONTROL MIDI</MidiInName>
<MidiOutName>Numark OMNI CONTROL MIDI</MidiOutName>
</Info>

Dispositivo que puede presentar varios nombres MIDI:

<MidiDevice>
    <Info>
<Name>Hercules DJ Console Mk2 / DJ Control MP3</Name>
<PrefixId>HDC</PrefixId>
<MidiInNames>
<MidiName>Hercules DJ Console Mk2 MIDI</MidiName>
<MidiName>Hercules DJ Control MP3 MIDI</MidiName>
</MidiInNames>
<MidiOutName>Hercules DJ Console Mk2 MIDI</MidiOutName>
</Info>

Identificación del dispositivo mediante códigos de vendedor y producto. Además usa un módulo externo DLL para traducción de mensajes MIDI:

<MidiDevice>
    <Info>
<Name>Denon DN-HC4500</Name> <PrefixId>DNHC</PrefixId>
<MidiInVendor>0xFFFF</MidiInVendor>
<MidiInProduct>0xFFFF</MidiInProduct>
<MidiOutVendor>0xFFFF</MidiOutVendor>
<MidiOutProduct>0xFFFF</MidiOutProduct>
<MidiOutDeviceType>1</MidiOutDeviceType>
<ExternalModule>MidiDevices.dll</ExternalModule>
</Info>
Valores admitidos en la sección Info:
Valor Descripción
NAME* Nombre para mostrar
PREFIXID* Prefijo ÚNICO. Se antepone junto con el caracter de subrayado (_) a todos los nombres de entrada, salida y función externa para este dispositivo. Sólo se admiten letras y números. Debe empezar y terminar en letra.
DESCRIPTION Descripción, comentarios, indicaciones...
SINGLEDECK 0 ó 1, por defecto 0. Indica si el dispositivo sólo manda información al reproductor activo.
EXTERNALMODULE Nombre (sin ruta) de un fichero DLL con funciones que se invocarán para traducción de mensajes MIDI en las salidas modo TRANSLATED. Ver la sección Outputs para más información.
 
MIDIINNAME Nombre para identificar el dispositivo en la lista de dispositivos MIDI-IN
MIDIINVENDOR
MIDIINPRODUCT
Códigos de vendedor y producto del dispositivo MIDI-IN. Si no se indica MIDIINNAME o no coincide con ninguno de los dispositivos conectados, entonces se realiza una búsqueda por vendedor y producto.
 
MIDIOUTNAME Nombre para identificar el dispositivo en la lista de dispositivos MIDI-OUT
MIDIOUTVENDOR
MIDIOUTPRODUCT
MODOUTDEVICETYPE
Códigos de vendedor, producto y tipo de dispositivo MIDI-OUT. Si no se indica MIDIOUTNAME o no coincide con ninguno de los dispositivos conectados, entonces se realiza una búsqueda por vendedor, producto y tipo.

* Obligatorios

2. La sección Inputs

Define los controles MIDI disponibles que ofrece el dispositivo y los datos MIDI para interpretarlas. Cada control (INPUT) se define con una subsección Input. Los valores dependen del tipo de control.

<Inputs>
    <Input Name="A_MONITOR"
           Type="BUTTON"
           Command="0x0B"
           Id="0x15"
           Press="0x7F"
           Release="0"
           />
<Input Name="A_VOLUME" Type="ANALOG" Command="0x0B" Id="0x32" Min="0" Max="127" Default="127" NoCenter="1" />
<Input Name="A_JOG" Type="ENCODER" Command="0x0B" Id="0x36" Mode="1" Left="127" Right="1" Pulses="45" /> <Input Name="A_PITCH" Type="ANALOGHR" Channel="0" Command="0x0E" Min="0" Max="16383" Center="8192" Invert="1" /> ...

Valores comunes a todos los controles:

Valor Descripción
NAME* Identificador del control. Debe ser único entre los controles de este dispositivo.
TYPE* Tipo de control: BUTTON, ANALOG, ANALOGHR, o ENCODER
CHANNEL Canal MIDI. Si no se indica, servirá cualquier canal.
COMMAND* Comando MIDI disparado por este control.
ID Identificador MIDI para este control (Data1). Excepto controles tipo ANALOGHR.
DEFAULT Valor por defecto de este control. Usado cuando el valor lógico en su posición inicial es distinto de 0.

* Obligatorios

Controles tipo BUTTON

Controles de dos estados (botón, pulsador, conmutador...). Generan valores lógicos 0 (desactivado) y 1 (activado).

Valor Descripción
COMMANDRELEASE Opcional, si es distinto de COMMAND.
PRESS Valor MIDI emitido al pulsar o activar el control (Data2)
RELEASE Valor MIDI emitido al soltar o desactivar el control (Data2)
Controles tipo ANALOG y ANALOGHR

Emiten un rango limitado de valores (rueda, deslizador, fader...). Generan valores lógicos analógicos desde -1.0 (un extremo del recorrido), 0.0 (centro), y +1.0 (otro extremo del recorrido). Si se indica NOCENTER generan valores entre 0.0 y 1.0.

Valor Descripción
MIN, MAX Valores MIDI mínimo y máximo emitidos por el control (Data2)
CENTER Valor MIDI que representa el centro del control. Opcional, si no se indica se calcula como la parte entera de (MAX-MIN)/2. El control generará el valor lógico 0 en el centro.
NOCENTER Indica que el control no tiene un centro lógico definido. Sólo generará valores lógicos positivos. Si se indica, se ignora CENTER. Ejemplo: deslizadores de volumen.
INVERT Invertir. Generar valores opuestos entre los extremos del recorrido.

Los controles ANALOGHR emiten un valor de 14 bits combinando Data1 (7 bits inferiores) y Data2 (7 bits superiores). Varios controles ANALOGHR en el mismo dispositivo se diferencian por CHANNEL en vez de ID.

Controles tipo ENCODER

Ruedas analógicas que indican movimiento en un sentido o en otro (jog-wheel, ruedas sin fin...). Generan valores lógicos entre -1.0 (izquierda) y +1.0 (derecha) según la velocidad y el sentido del movimiento. En reposo generan 0.

Valor Descripción
MODE Modo de operación: 0, 1, 2. Indica la forma en el que el control emite los valores de movimiento.
LEFT, RIGHT Valores MIDI que indican una unidad de movimiento en cada sentido (Data2)
PULSES Número de unidades de movimiento que representan una vuelta completa del control

Modos de operación (MODE):

  • 0 - Valores únicos izquierda-derecha. Data2 contiene sólo LEFT o RIGHT.
  • 1 - Base 0. Data2 es un valor con signo de 7 bits indicando las unidades y el sentido del movimiento. 0 representa reposo.
  • 2 - Base 64. Data2 es un valor sin signo de 7 bits indicando las unidades y el sentido del movimiento. 64 representa reposo.

3. La sección Outputs

Define las salidas MIDI que ofrece el dispositivo para visualización, luces, etc. y los datos MIDI para accionarlas. Cada salida (OUTPUT) se define con una subsección Output.

<Outputs>
 <Output Name="A_CUE" Type="BOOL" Channel="0" Command="0x0B" Data1="0x4A" Data1Off="0x4B" Data2="0x26" />
<Output Name="A_TIME" Type="INT" Mode="TRANSLATED" ExternalId="0x01" />
<Output Name="A_DATAREQUEST" Type="CONTROL" Channel="0" Command="0x0B" Data1="0x4A" Data2="0x3C" />
Valor Descripción
NAME* Identificador de la salida. Debe ser único entre las salidas de este dispositivo.
TYPE* Tipo de dato que recibe salida: BOOL, CONTROL, INT, TEXT
MODE Modo de operación: MIDI (por defecto) o TRANSLATED. INT y TEXT sólo admiten TRANSLATED.

* Obligatorios

Tipo de salida (TYPE) Descripción Modos admitidos (MODE)
BOOL Recibe eventos de Encendido y Apagado. Ejemplo: luces. MIDI, TRANSLATED
CONTROL Comandos del dispositivo. Ejemplo: DATAREQUEST solicita las posiciones actuales de los controles analógicos. MIDI, TRANSLATED
INT Valor numérico entero TRANSLATED
TEXT Linea de texto TRANSLATED
Modo de operación MIDI

Se indican todos los datos MIDI necesarios para operar la salida.

<Outputs>
<Output Name="A_CUE" Type="BOOL" Channel="0" Command="0x0B" Data1="0x4A" Data1Off="0x4B" Data2="0x26" />
<Output Name="A_PLAY" Type="BOOL" Channel="0" Command="0x0B" Data1="0x4A" Data1Off="0x4B" Data2="0x27" />
<Output Name="A_DATAREQUEST" Type="CONTROL" Channel="0" Command="0x0B" Data1="0x4A" Data2="0x3C" />
Salida (TYPE) Valores requeridos
BOOL CHANNEL, COMMAND, DATA1, DATA2: Mensaje MIDI que activa o enciende la salida. Obligatorios.
COMMANDOFF, DATA1OFF, DATA2OFF: necesario al menos uno de éstos. Se combinan con los anteriores para formar el mensaje MIDI que desactiva o apaga la salida.
CONTROL CHANNEL, COMMAND, DATA1, DATA2: Mensaje MIDI que ejecuta el comando. Obligatorios.
Modo de operación TRANSLATED

Se utiliza cuando son necesarios varios mensajes MIDI o un mensaje SysEx (System Exclusive) para actuar sobre el valor de una salida en el dispositivo.

Requiere una librería DLL externa especificada en la sección Info del dispositivo (<ExternalModule>) con una función exportada en la forma <PREFIJO>_MidiProc. PREFIJO también se define en la sección Info (<PrefixId>). La DLL debe residir en la carpeta Plugins.

La salida se identifica con un atributo EXTERNALID. En cada acción sobre esta salida el valor de EXTERNALID se manda a la función <PREFIJO>_MidiProc en la DLL externa, la cual traduce la acción en una secuencia de mensajes MIDI o en un mensaje SysEx. Este resultado es lo que se envía al controlador.

<Outputs>
 <Output Name="A_TIMEMODE" Type="BOOL" Mode="TRANSLATED" ExternalId="0x00" />
 <Output Name="A_TIME" Type="INT" Mode="TRANSLATED" ExternalId="0x01" />
 <Output Name="A_PITCH" Type="INT" Mode="TRANSLATED" ExternalId="0x02" />
 <Output Name="A_TEXT1" Type="TEXT" Mode="TRANSLATED" ExternalId="0x05" Lines="1" Length="12" />
Salida (TYPE) Valores requeridos
BOOL EXTERNALID
CONTROL EXTERNALID
INT EXTERNALID
MIN, MAX: opcional, rango de valores que admite la salida. Informativo, no tiene efecto real.
TEXT EXTERNALID
LENGTH: número de caracteres que la salida puede mostrar en una linea de texto al mismo tiempo.
LINES: número de líneas de texto, por defecto 1. Si uso actualmente.

La librería DLL contiene una o varias funciones exportadas en esta forma:

DWORD __stdcall
HDC_MidiProc(DWORD dwCommand, DWORD dwOutputId, LONG lValue, void* pData, DWORD dwDataSize);

DWORD __stdcall
DNHC_MidiProc(DWORD dwCommand, DWORD dwOutputId, LONG lValue, void* pData, DWORD dwDataSize);

dwCommand: Acción que debe ejecutarse sobre la salida:

dwCommand Efecto requerido
0 (VALUE) Aplicar el valor lValue a la salida. En salidas BOOL 0 es FALSE y cualquier otro valor es TRUE.
1 (UNDEFINED) Mostrar valor indefinido o ausencia de valor. Ejemplo: mostrar "---" en el número de pista cuando no hay pista cargada.
2 (ALLON) La salida debe encender todo lo que tenga, todas sus luces, segmentos, etc. Se utiliza al inicio para comprobar que todas las salidas funcionan correctamente.
3 (ALLOFF) La salida debe apagarse por completo.
4 (TEXT) lValue es un puntero a una cadena de texto Ansi terminada en carácter nulo (LPCSTR). Sólo aplicable a salidas tipo TEXT.
100 (INITIALIZE) Enviado en la inicialización, una vez a cada función exportada, antes que cualquier otro comando.
101 (RELEASE) Enviado en la finalización, una vez a cada función exportada. Después de éste no se enviarán más comandos.

dwOutputId: Identificador de la salida que se indicó en EXTERNALID.

lValue: Valor a mandar a la salida en la acción VALUE (dwCommand = 0), o puntero a cadena de texto en acción TEXT (dwCommand = 4).

pData: Puntero a un buffer de dwDataSize bytes. Debes convertir (cast) este puntero a SMidiMessage* si la función va a devolver una secuencia de mensajes MIDI, o a BYTE* si va a devolver un mensaje SysEx (System Exclusive).

Valor de retorno: El número de mensajes MIDI que se ha rellenado en el buffer, o el número de bytes en el mensaje SysEx junto con el bit más significativo activado:

Devolver una secuencia de mensajes MIDI

struct SMidiMessage
       {
       union {
             // Mensaje en bruto

             DWORD dwMessage;

             // Mensaje por componentes

             struct {
                    BYTE  nChannel : 4;    // Status byte
                    BYTE  nCommand : 4;

                    BYTE  nData1   : 7;
                    BYTE  nSpacer1 : 1;    // Always 0

                    BYTE  nData2   : 7;
                    BYTE  nSpacer2 : 1;    // Always 0

                    BYTE  nUnused  : 8;
                    };
             };
       };
      

Convierte pData en SMidiMessage*, entonces rellena los mensajes MIDI y devuelve el número de mensajes en esta secuencia:

SMidiMessage* pMidiMessages = (SMidiMessage*)pData;

pData[0].nChannel = 1;
pData[0].nCommand = 7;
pData[0].nData1 = 0;
pData[0].nData2 = 1; pData[1].nChannel = 2; pData[1].nCommand = 7; pData[1].nData1 = 0;
pData[1].nData2 = 2; return 2; // Dos mensajes MIDI en esta secuencia

Devolver un mensaje MIDI SysEx

Convierte pData en BYTE*, entonces rellena los datos para el mensaje SysEx incluyendo la cabecera (F7) y el terminador (F0). Devuelve el número de bytes en la secuencia activando además el bit más significativo del DWORD:

BYTE* pSysEx = (BYTE*)pData;
pSysEx[0] = 0xF0;
pSysEx[1] = 0x7E;
pSysEx[2] = 0x70;
pSysEx[3] = 0x4A;
pSysEx[4] = 0x39;
pSysEx[5] = 0xF7; return 6 | 0x80000000; // 6 bytes en este mensaje SysEx

4. La sección OutputMaps

Asocia los datos y valores de Deejaysystem a las salidas disponibles en el dispositivo (definidas en Outputs). Cada asociación se hace mediante una subsección OutputMap.

<OutputMaps>
    <OutputMap Source="DjsA_PlayLed" Output="A_PLAY" />
    <OutputMap Source="DjsA_CueLed" Output="A_CUE" />
    <OutputMap Source="DjsA_TimeValue" Output="A_TIME"
               Requires="DjsA_IsTrackOpen" Blink="DjsA_IsTimeBlink" />
    <OutputMap Source="DjsA_TrackValue" Output="A_TRACK"
               Requires="DjsA_TrackValue" />
Valor Descripción
SOURCE* Dato de origen en Deejaysystem
OUTPUT* Salida que recibe el valor del dato SOURCE
IGNORE
IGNORENEG
Evita acción alguna sobre la salida si el dato origen indicado tiene valor distinto de cero.
IGNORENEG evita la acción si el dato tiene valor cero.
REQUIRES
REQUIRESNEG
Apaga la salida (ALLOFF) si el dato origen indicado tiene valor distinto de cero.
REQUIRESNEG apaga la salida si el dato tiene valor cero.
UNDEFINED
UNDEFINEDNEG
Pone la salida en valor indefinido (UNDEFINED) si el dato origen indicado tiene valor distinto de cero.
UNDEFINEDNEG pone el valor indefinido si el dato tiene valor cero.
BLINK Indica un dato origen que hace parpadear a la salida (VALUE / ALLOFF)

Datos de origen disponibles. Los que comienzan por DjsA_ están también disponibles como DjsB_.

Dato (SOURCE) Tipo de valor Notas
Djs_NULL INT Always 0
Djs_Enabled BOOL Always TRUE
Djs_Blink BOOL  
Djs_Blink2 BOOL  
 
DjsA_PitchValue INT 10000 = pitch +10.000
DjsA_PitchBendValue INT -1000 = bend -1.000
DjsA_VolumeValue INT 10000 = 100%
DjsA_VideoOutLed BOOL  
DjsA_RemainTimeLed BOOL  
DjsA_TrueTimeLed BOOL  
DjsA_ShowBpmLed BOOL  
DjsA_MonitorLed BOOL  
DjsA_AutoGainLed BOOL  
DjsA_PitchLed BOOL  
DjsA_PitchBendPlusLed BOOL  
DjsA_PitchBendMinusLed BOOL  
DjsA_TitleText TEXT  
DjsA_Status1Text TEXT  
DjsA_Status2Text TEXT  
 
DjsA_IsTrackLoading BOOL  
DjsA_IsTrackOpen BOOL  
DjsA_PlayingState INT 0 = paused/cued, 1 = playing, 2 = cueing (CUE button hold)
DjsA_TrackValue INT  
DjsA_TrackPercentValue INT 0..100
DjsA_TimeValue INT ms
DjsA_BpmValue INT 1600 = 160 BPMs
DjsA_IsTimeBlink BOOL  
DjsA_PlayLed BOOL  
DjsA_CueLed BOOL  
 
Mixer_MonitorMixLed BOOL  
Playlist_Enabled BOOL  
Playlist_MixNowLed BOOL  
Playlist_AutoPlayLed BOOL  
Playlist_ShuffleLed BOOL  
Playlist_ListLoopLed BOOL  
Video_FullScreenEnabled BOOL  
Mods_ControlEnabled BOOL  
Mods_ShiftEnabled BOOL  
Mods_AltEnabled BOOL  
Mods_Extra1Enabled BOOL  
Mods_Extra2Enabled BOOL  

Fichero de configuraciones por defecto - MidiDefaults.xml

Las configuraciónes por defecto de todos los controladores (MIDI y no-MIDI) se leen del fichero Plugins\MidiDefaults.xml. Estas configuraciones se aplican cuando se arranca la aplicación por primera vez, y al restaurar la configuración por defecto en Settings > Control > Por Defecto.

Nota: Las modificaciones en este fichero se pierden al reinstalar el software o al actualizarlo a una nueva versión. Contáctanos si has escrito un fichero XML para tu controlador y quieres que sea incluido en la próxima versión de Deejaysystem.

 


(c) 1998-2013 Angel García "Edy"