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