www.deejaysystem.com
Contrôleurs matériels pour Deejaysystem™ MK2 / VJ2
 
 
Manuel > Contrôleurs matériels > Périphériques MIDI Génériques Español | English

Périphériques MIDI Génériques

Deejaysystem peut utiliser tout contrôleur compatible avec le standard MIDI. Les nouveaux périphériques peuvent être supportés en écrivant un fichier de définitions au format XML.

Les contrôleurs MIDI supportés par Deejaysystem sont tous définis avec un nom de fichier midi_<nom du périphériqe>.xml dans le dossier Plugins. L'arrangement par défaut des correspondances des entrées (fonction sur le contrôleur vers fonctions de Deejaysystem) sont définies dans le fichier Plugins\MidiDefaults.xml.

Contactez nous si vous avez écrit un fichier XML pour votre contrôleur et désirez le voir inclu dans la prochaine édition de Deejaysystem.

Fichier de définition de périphérique MIDI : midi_*.xml

Ce doit être un fichier xml dont le nom débute par midi_, pour qu'il soit de la forme midi_*.xml. Il doit se situer dans le dossier Plugins.

Structure d'un fichier de définition de périphérique MIDI :

<MidiDevice>
     <Info> </Info>

     <Inputs>
        <Input … />
        <Input … />
        …
    </Inputs>

     <Outputs>
        <Output … />
        <Output … />
        …
     </Outputs>

     <OutputMaps>
        <OutputMap … />
        <OutputMap … />
        …
     </OutputMaps>
</MidiDevice>
      

Outputs et OutputMaps sont optionnels.

1. Section Info

Fournie les données d'identification du périphérique :

 <MidiDevice>

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

Un périphérique peut avoir plusieur noms 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>
      

Identification du périphérique par ses vendeur, type de produit et de périphérique. Utilise aussi une DLL externe pour traduire certains messages 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>
      
Les valeurs suivantes sont reconnues dans la section Info :
Valeur Description
NAME* Nom affiché
PREFIXID* Préfixe UNIQUE. Ce préfixe + le souligné (_) préfixe tous les bnoms d'entrées, de sorties et de fonction externes concernant ce périphérique. Seuls les lettres et les chiffres sont autorisés. Il doit débuter et se terminer par une lettre.
DESCRIPTION Description, commentaires…
SINGLEDECK 0 or 1, default 0. Indicates whether the device sends information to the active deck only.
EXTERNALMODULE Nom (sans le chemin) d'un fichier DLL contenant les fonctions à appeler pour traduire les messages MIDI dans le mode sorties TRADUITES. Voir la section Sorties pour plus amples informations.
 
MIDIINNAME Nom destiné à identifier le périphérique dans la liste des périphériques MIDI-IN
MIDIINVENDOR
MIDIINPRODUCT
Codes Vendeur et produit pour les périphériques MIDI-IN. Si aucun MIDIINNAME n'est spécifié ou s'il ne correspond avec aucun périphérique branché, alors une recherche par Vendeur/produit est effectuée.
 
MIDIOUTNAME Nom destiné à identifier le périphérique dans la liste des périphériques MIDI-OUT
MIDIOUTVENDOR
MIDIOUTPRODUCT
MODOUTDEVICETYPE
Codes Vendeur et produit pour les périphériques MIDI-OUT. Si aucun MIDIINNAME n'est spécifié ou s'il ne corrrespond avec aucun périphérique branché, alors une recherche par Vendeur/produit est effectuée.

* Obligatoire

2. Section Entrées

Enumère les contrôles en entrée disponibles sur le périphérique et les données MIDI pour les interpréter. Chaque contrôle (INPUT) est défini dans une sous-section Input. Les valeurs dépendent du type de contrôle :

<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"
    />
    …
      

Valeurs communes à tous les contrôles :

Valeur Description
NAME* Identifiant du contrôle. Doit être unique parmis tous les contrôles de ce périphérique.
TYPE* Type de contrôle : BUTTON, ANALOG, ANALOGHR ou ENCODER
CHANNEL Canal MIDI. S"il n'est pas spécifié, accepte n'importe quel canal.
COMMAND* commande MIDI gérée par ce contrôle.
ID Identifiant MIDI pour ce contrôle (Data1). Sauf pour les contrôles de type ANALOGHR.
DEFAULT Valeur initiale par défaut pour ce contrôle. Utilisé lorsque la valeur logique initiale est différente de 0.

* Nécessaire

Contrôles de type BUTTON

Contrôles à deux-états (bouton, commutacteur…). Génère des valeurs logiques 0 (off) et 1 (on).

Valeur Description
COMMANDRELEASE Optionel, si différent de COMMAND.
PRESS Valeur MIDI délivrée lors de l'appuis ou en activant le contrôle (Data2)
RELEASE Valeur MIDI délivrée lors de relachement ou en désactivant le contrôle(Data2)
Contrôles de type ANALOG et ANALOGHR

Ils émettent une plage limitée de valeurs (wheel, slider, fader…). Génère des valeurs analogiques logiques de -1.0 (une des extrémité de la course), 0.0 (milieu) et +1.0 (l'autre extrémitée de la course). Si NOCENTER est spécifié, ne génère que des valeurs entre 0.0 et 1.0.

Valeur Description
MIN, MAX Minimum and maximum MIDI values issued by the control (Data2).
CENTER Valeur MIDI représentant le centrage du contrôle. Optionnel, si non indiqué, il est calculé comme la partie entière de (MAX-MIN) / 2. Le contrôle génère la valeur logique 0 au centre.
NOCENTER Indique que ce contrôle n'a pas de centrage logique défini. Ne génère que des valeurs positives. Si spécifié, CENTER est ignoré. Exemple : les curseurs de volume.
INVERT Génère des valeurs opposées entre les deux extrèmes.

ANALOGHR Le contrôle émmet des valeurs sur 14-bit en combinant Data1 (7 bit bas) et Data2 (7 bit hauts). Divers contrôles ANALOGHR sur un même périphérique diffèrent par leur CHANNEL non pas par leur ID.

Contrôles de type ENCODER

Les roues analogiques indiquant un déplacement dans un sens ou un autre (jog-wheel, shuttle-dial…). Génère des valeurs logiques comprise entre -1.0 (gauche) et +1.0 (droite) en fonction de la vitesse et de la direction du deplacement. A l'arret génère 0.

Valeur Description
MODE Mode opératoire : 0, 1, 2. Définis sous quelle forme le contrôleur envois les valeurs de mouvement
LEFT, RIGHT Valeurs MIDI indiquant un déplacement dans chaque direction (Data2)
PULSES Nombre d'unité de mouvement représentant un tour complet (360°)

Modes opératoires (MODE) :

  • 0 - Valeurs Gauche-Droite uniquement. Data2 ne contient que LEFT ou RIGHT.
  • 1 - Base 0. Data2 est une valeur 7 bits signée indiquant la quantité et la direction du mouvement. 0 signifie arrêté.
  • 2 - Base 64. Data2 est une valeur 7 bits non signée indiquant la quantité et la direction du mouvement. 64 signifie arrêté.

3. Section Sorties

Enumère les sorties MIDI offertes par le périphérique pour l'affichage, les lampes, etc.. ainsi que les données MIDI pour les différencier. Chaque sortie (OUTPUT) est définie dans une sous-section 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" />
      
Valeur Description
NAME* Identifiant de la sortie. Doit être unique parmis les sorties de ce périphérique.
TYPE* Type de données reçus par la sortie : BOOL, CONTROL, INT ou TEXT
MODE Mode Opératoire : MIDI (défaut) ou TRANSLATED. INT et TEXT ne sont supportés qu'en mode TRANSLATED.

* Mandatory

Type de sortie (TYPE) Description Modes supportés (MODE)
BOOL Reçois des événemants On et Off. Exemple : lampes. MIDI, TRANSLATED
CONTROL Device commands. Example: DataRequest requests the current positions of the analog controls. MIDI, TRANSLATED
INT Valeur numérique entière TRANSLATED
TEXT Ligne de texte TRANSLATED
Mode opératoire MIDI

Toutes les données nécessaires pour gérer la sortie MIDI sont spécifiée :

 <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" />
Type de Sortie (TYPE) Valeurs demandées
BOOL CHANNEL, COMMAND, DATA1, DATA2 : message MIDI activant ou déésactivant cette sortie. Obligatoire.
COMMANDOFF, DATA1OFF, DATA2OFF : Nécessite au moins l'un de ceux-ci. Ils se combinent avec le précédant pour forme le message MIDI qui désactive ou ferme la sortie.
CONTROL CHANNEL, COMMAND, DATA1, DATA2 : Message MIDI invoquant la commande dans le périphérique. Obligatoire.
Mode opératoire TRANSLATED

Utilisé lors de multiples messages MIDI ou un SysEx (System Exclusive) sont nécessaires à la configuration d'une ou plusieurs valeurs d'une ou plusieurs sorties du périphérique.

Nécessite une bibliothèque partagée (DLL) externe spécifiée dans la section Info (<ExternalModule>) avec une fonction exportée préfixée par <PREFIX>_MidiProc. PREFIX est lui aussi défini dans la section Info (<PrefixId>). La DLL doit se trouver dans le dossier Plugins.

La sortie est identifiée par la valeur de EXTERNALID. A chaque action sur cette sortie la valeur EXTERNALID est fournie à la fonction <PREFIX>_MidiProc du module externe, qui doit alors traduire l'action en séquence MIDI ou en SysEx. La donnée retournée est alors envoyée au périphérique. 

 <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 />
Type de sortie (TYPE) Valeurs demandées
BOOL EXTERNALID
CONTROL EXTERNALID
INT EXTERNALID
MIN, MAX: optionnel, plage de valeurs supportées par la sortie. Informative, n'a pas d'effet réel.
TEXT EXTERNALID
LENGTH : nombre de caractères que la sortie peut afficher par ligne de texte.
LINES : nombre de lignes de texte, défaut 1. Non utilisée pour l'instant.

La DLL contient une ou plusieurs fonctions exportées comme suit :

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: Action à exécuter sur la sortie :

dwCommand Action demandée
0 (VALUE) Appliquer la valeur lValue à la sortie En BOOL la valeur 0 est FALSE toutes les autres sont TRUE.
1 (UNDEFINED) Afficher la valeur indéfinie ou aucune valeur. Exemple : affiche «---» comme numéro de piste si aucune n'est chargée.
2 (ALLON) La sortie doit activer tout ce qu'elle possède, toutes ses lumières, segments, etc. Utilisé au d"marrage pour s'assurer que toutes les sorties fonctionnent carrectement.
3 (ALLOFF) La sortie doit être totallement muette.
4 (TEXT) lValue est un pointeur vers une chaine Ansi mono-octet terminée par zéro (LPCSTR). Uniquement applicable aux sorties TEXT.
100 (INITIALIZE) Envoyé au démarrage, une fois par fonction exportée, avant toute autre commande.
101 (RELEASE) Envoyé lors de relachement, une fois par fonction exportée. Après quoi plus aucune commande n'est envoyée.

dwOutputId : Id de la sortie spécifiée dans EXTERNALID.

lValue : Valeur à envoyer à la sortie dans l'action VALUE (dwCommand = 0), ou pointeur vers une chaine d'action TEXT (dwCommand = 4).

pData : Pointeur vers un tampon de dwDataSize octets. Vous devez transtyper (cast) ce pointeur en SMidiMessage* s'il retourne une séquence de messages MIDI, ou en BYTE* s'il retourne un SysEx (System Exclusive).

Return value : Le nombre de messages MIDI qui ont été remplis dans le tampon, ou le nombre d'octets du SysEx message plus le drapeau MIDI_SYSEX :

Retourner une séquence de messages MIDI

En c/C++
struct SMidiMessage
       {
       union {
             // Message brut

             DWORD dwMessage;

             // Message par éléments MIDI

             struct {
                    BYTE  nChannel : 4;    // Octet de status
                    BYTE  nCommand : 4;

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

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

                    BYTE  nUnused  : 8;
                    };
             };
       };
      
ou en Delphi/Pascal (FPC)
type

  pSMidiMessage = ^SMidiMessage;
  SMidiMessage = record

    case byte of

    0: ( // Message brut

         dwMessage : DWORD

       );

    1: ( // Message par catégories

         msg : bitpacked record

             nChannel : 0..15;    // Octet de status
             nCommand : 0..15;

             nData1   : 0..$7F;
             nSpacer1 : 0..1;     // Toujours 0

             nData2   : 0..$7F;
             nSpacer2 : 0..1;     // Toujours 0

         end;

         nUnused  : BYTE;
       );
  end;
      

Transtype (Cast) pData en SMidiMessage*, puis remplis les messages MIDI et retourne le nombre de messages dans la séquence :

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;                // Deux messages MIDI dans cette séquence
      
ou en Delphi/Pascal (FPC)
const
    EVENT_TAG = $00000000;
    …
var
    pMidiMessage : ^SMidiMessage;
    …
    pMidiMessage := pData;

    pMidiMessage[0].msg.nCommand:=7;
    pMidiMessage[0].msg.nChannel:=1;
    pMidiMessage[0].msg.nData1:=0;
    pMidiMessage[0].msg.nData2:=1;
    pMidiMessage[1].msg.nCommand:=7;
    pMidiMessage[1].msg.nChannel:=2;
    pMidiMessage[1].msg.nData1:=0;
    pMidiMessage[1].msg.nData2:=2;  // Deux messages MIDI dans cette séquence

    exit(2 or EVENT_TAG);
      

Retourner un message MIDI SysEx

Cast pData en BYTE*, puis remplir les octets du message SysEx en incluant l'entête (F7) et le terminateur (F0). Retourne le nombre d'octets avec le bit le plus significatif positionné dans 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 octets dans ce SysEx
ou en Delphi/Pascal (FPC)
const
    SYSEX_TAG = $80000000;
    …
var
    pSysEx : PByte;
    …
    pSysEx := pData;

    pSysex[0]:=$F0;
    pSysex[1]:=$7E;
    pSysex[2]:=$70;
    pSysex[3]:=$4A;
    pSysex[4]:=$39;
    pSysex[5]:=$F7;

    exit(6 or SYSEX_TAG);  // 6 octets dans ce SysEx
      

4. Section OutputMaps

Fait correspondre les données et valeurs de Deejaysystem aux sorties disponibles sur le périphérique (telles que définies dans Outputs). Chaque correspondance ou map est définie par une sous-section 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 />
      
Valeur Description
SOURCE* Données source dans Deejaysystem
OUTPUT* Sortie recevant la valeur de la donnée SOURCE
IGNORE

IGNORENEG
Inhibe toute action sur la sortie si la donnée source a une valeur non nulle.
agit comme un «if 0 != source then return »
Inhibe toute action si la donnée a la valeur nulle.
agit comme un «if 0 == source then return »
REQUIRES

REQUIRESNEG
Désactive la sortie (ALLOFF) si la donnée source a une valeur non nulle.
agit comme un « if 0 != source then send ALLOFF »
Inhibe la sortie si la donnée a la valeur nulle.
agit comme un « if 0 == source then send ALLOFF »
UNDEFINED

UNDEFINEDNEG
Envois la valeur «indéfini» sur la sortie (UNDEFINED) si la donnée source a une valeur non nulle.
agit comme un « if 0 != source then send UNDEFINED »
Envois la valeur «indéfini» si la donnée a la valeur nulle.
agit comme un « if 0 == source then send UNDEFINED »
BLINK Indique a une source de donnée de faire clignotter la sortie (VALUE / ALLOFF)

Sources de données disponibles. Celles commençant par DjsA_ existent aussi avec DjsB_.

Donnée (SOURCE) Type de valeur Notes
Djs_NULL INT Toujours 0
Djs_Enabled BOOL Toujours 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 (boutton CUE maintenu)
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  

Table par défaut : MidiDefaults.xml

Les paramètres par défaut (maps) pour tous les périphériques d'entrées (MIDI et non-MIDI) sont lus depuis le fichier Plugins\MidiDefaults.xml. Ces paramètres sont chargés au premier démarrage et lors d'une restoration des paramètres par Réglages > Contrôleurs > Défauts.

Note : Les modifications apportées à ce fichier sont perdues en réinstallant et en mettant à jour le logiciel. Veuillez nous contacter si vous avez écrit un fichier XML pour votre contrôleur et désirez le voir inclu par défaut dans la prochaine version de Deejaysystem.

 

 


(c) 1998-2015 Angel García «Edy» - Traduit par Nicolas Vignot