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. 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_*.xmlCe 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 InfoFournie 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 :
* Obligatoire 2. Section EntréesEnumè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 :
* Nécessaire Contrôles de type BUTTONContrôles à deux-états (bouton, commutacteur…). Génère des valeurs logiques 0 (off) et 1 (on).
Contrôles de type ANALOG et ANALOGHRIls é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.
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 ENCODERLes 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.
Modes opératoires (MODE) :
3. Section SortiesEnumè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" />
* Mandatory
Mode opératoire MIDIToutes 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" />
Mode opératoire TRANSLATEDUtilisé 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 />
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 :
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équenceou 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 SysExou 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 OutputMapsFait 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 />
Sources de données disponibles. Celles commençant par DjsA_ existent aussi avec DjsB_.
Table par défaut : MidiDefaults.xmlLes 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 |