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