www.deejaysystem.com
Controladores externos para Deejaysystem(tm) MK2 / VJ2
Ver. 2009.11.11
(c) 1998-2009 Angel García "Edy"
 
Manual > Controladores externos > MIDI genérico English

MIDI genérico

Deejaysystem puede utilizar cualquier controlador compatible con el estándar MIDI. Sólo es necesario escribir un fichero de configuración en formato XML.

Los controladores MIDI soportados por Deejaysystem están definidos en el fichero Plugins\MidiDevices.xml. Las asignaciones de controles por defecto están en el Plugins\MidiDefaults.xml. No edites estos ficheros porque son actualizados en cada nueva versión de Deejaysystem, y se perderían tus cambios.

Puedes escribir tus propias definiciones de controladores en los ficheros Plugins\UserMidiDevices.xml, con sus asignaciones por defecto en Plugins\UserMidiDefaults.xml. Crea los ficheros si no existen. Deejaysystem los cargará al arrancar.

Contáctanos si quieres que tu controlador MIDI sea soportado oficialmente en Deejaysystem.

Fichero de definición de dispositivos MIDI

Define los controles que ofrece cada dispositivo MIDI y los datos para interactuar con ellos. Deejaysystem lee las definiciones desde los ficheros MidiDevices.xml y UserMidiDevices.xml.

La sección principal MidiDevices contiene una sección Device para cada dispositivo soportado. Cada sección Device contiene las subsecciones Info, Inputs, Outputs y OutputMaps (las dos últimas son opcionales).

<MidiDevices>
<Device> <Info> ... </Info>
<Inputs> <Input ... /> </Inputs>
<Outputs> <Output ... /> </Outputs>
<OutputMaps> <OutputMap ... /> </OutputMaps>
</Device>
</MidiDevices>

1. La sección Info

Proporciona los datos para identificar el dispositivo

<MidiDevices>
<Device>
<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:

    <Device>
<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:

   <Device>
<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 se indican ambos, el dispositivo se busca en la lista mediante estos datos en lugar de buscar por el nombre MIDIINNAME.
 
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 se indican los tres, el dispositivo se busca en la lista mediante estos datos en lugar de buscar por el nombre MIDIOUTNAME.

* 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.

<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.

<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 para actuar sobre el valor de una salida en el dispositivo.

La salida se identifica con un valor EXTERNALID. En cada acción se invocará a la función <PREFIX>_MidiProc en el módulo externo, el cual traducirá la acción en una secuencia de mensajes MIDI. Esta secuencia se enviará al dispositivo. PREFIX está definido en la sección Info.

 <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.

El módulo externo es el fichero DLL indicado en la sección Info (EXTERNALMODULE). Es necesario sólo cuando el dispositivo tiene alguna salida en modo TRANSLATED. Debe estar localizado en la misma carpeta que MidiDevices.xml. Contiene una o varias funciones exportadas de la siguiente 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 terminada en carácter nulo (\0). Sólo aplicable a salidas tipo TEXT.
100 (INITIALIZE) Enviado en la inicialización, antes que cualquier otro comando.
101 (RELEASE) Enviado en la finalización. 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 estructuras SMidiMessage. La función debe rellenar una por cada mensaje MIDI que sea necesario para aplicar la acción, y devolver en el retorno el número de mensajes MIDI que ha rellenando.

struct SMidiMessage
       {
       union {
             // Mensaje en bruto

             DWORD dwMessage;

             // Mensaje por componentes

             struct {
                    BYTE  nChannel : 4;    // Byte de estado
                    BYTE  nCommand : 4;

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

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

                    BYTE  nUnused  : 8;
                    };
             };
       };

dwDataSize: Número máximo de mensajes MIDI que se pueden meter en el buffer.

Valor de retorno: El número de mensajes MIDI que se ha metido en el buffer. Serán enviados en orden al dispositivo MIDI.

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 actualmente (2009.11.11). 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 configuración por defecto de controles MIDI

Define las funciones por defecto que se configuran en los dispositivos MIDI. Estas definiciones se cargan al iniciar el programa por primera vez y en Settings > Control > Por Defecto.

Deejaysystem lee las configuraciones desde los ficheros MidiDefaults.xml y UserMidiDefaults.xml.