IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

WinDev Discussion :

Recevoir et Décoder les Message MIDI IN reçus d'un clavier MIDI [WD20]


Sujet :

WinDev

  1. #1
    Membre à l'essai
    Homme Profil pro
    RETRAITE
    Inscrit en
    Février 2012
    Messages
    35
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : RETRAITE

    Informations forums :
    Inscription : Février 2012
    Messages : 35
    Points : 18
    Points
    18
    Par défaut Recevoir et Décoder les Message MIDI IN reçus d'un clavier MIDI
    Bonjour,
    Je souhaite récupérer les messages SYSEX envoyés par un TYOS 5 (Yamaha)
    Pour le moment je suis dans la CallBack ...
    j'ai ouvert mon port Midi IN et l'écoute : ça ça fonctionne
    J'appuie sur un bouton du TYROS : je vais bien dans ma fonction CallBack
    Je récupere le contenu de wMsg, de dwParam1 et dwParam 2
    et là je tourne en rond pour décoder les infos

    Voilà le PB posé
    Ce que j'ai fait

    Mes structures
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
     
    //-----------------------------------------------------------------------------------------------------------------------------
    STMIDIHDR est une Structure
    	DataPtr 			est une chaîne            	// Address of MIDI data
    	BufferLength 		est un entier sur 8     	        // Size of the buffer
    	BytesRecorded 		est un entier sur 8     	        // Actual amount of data in the buffer. This value should be less than or equalto the value given in the dwBufferLength member
    	MhdrID 			est un entier sur 8              // Custom user data
    	Flags 			est un entier sur 8              // Flags giving information about the buffer
    	Reserved1 		est un entier sur 8              // Reserved - do not use
    	Reserved2 		est un entier sur 8              // Reserved - do not use
    	CallbackOffset 		est un entier 			//Type C : DWORD offset into Buffer WHEN callback is performed
    	Reserved3a 		est un entier sur 8 octets 	//Type C : DWORD
    	Reserved3b 		est un entier sur 8 octets 	//Type C : DWORD
    	Reserved3c		est un entier sur 8 octets 	//Type C : DWORD
    	Reserved3d		est un entier sur 8 octets 	//Type C : DWORD
    FIN
    gstHDRMidi 			est un STMIDIHDR
    gstPMidiHdr 			est un STMIDIHDR

    Ouverture et Ecoute
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    //********************************************************************************************
    PROCEDURE MidiIN_Lance(nDevice est un entier système)
    //********************************************************************************************
    nRetFonc2 				est un entier
    nRetFoncStart 				est un entier
    nsyNGnIDProced 			est un entier système = &MidiInCalBak  				// pointeur de la fonction de callback
    nRetourMidiIn 				est un entier
    sTestSaisie                                est une chaîne
     
    FEN_PRINCIPALE.BTN_MidiInDemarre..Visible 	= Faux												// Pour ne pas ouvrir plusieurs à la fois et ne pas planter
    //FEN_PRINCIPALE.ListeMidiIN..Visible 		= Faux
     
    //POUR i = 1 _A_ NumSysexBuffers
    //Marshal.FreeHGlobal(MidiInHdr[i].DataPtr)
    //Liberer MidiInHdr[i]
    //midiInUnprepareHeader(i)
    nRetourMidiIn 		= API("WINMM.DLL","midiInUnprepareHeader",gnHandleMidiIn, &gstHDRMidi, Dimension(gstHDRMidi))
     
    StopCapture()
     
    nRetFonc2 		= API("WINMM.DLL","midiInOpen",&gnHandleMidiIn,nDevice, &MidiHandlerBack,0,CALLBACK_FUNCTION)// On lance l'écoute du driver sélectionné
    ThreadExécute("EcouteIN",threadNormal,StartMidiIn)
    //nRetFoncStart = StartMidiIn()			//RetFoncStart 	= API("WINMM.DLL","midiInStart",gnHandleMidiIn) 								// On démarre l'écoute
     
    // Il faudra recupérer un Numero de partition , afficher une partition et relancer le thread
     
    FEN_PRINCIPALE.LIB_Message..Libellé = "Sysex -> J'attend le sysex....."
    // Si pas d'appui sur un bouton du TYROS : c'est une partition affichée et il faut laisser la main à la fenetre principale
     
    sTestSaisie                                         = FEN_PRINCIPALE.SAI_TestPendantThread
     
    //-------------------------------------------------------------------------------------------
    PROCEDURE StartMidiIn()
    //-------------------------------------------------------------------------------------------
    nRetFoncStart 	est un entier
    nRet2,nRet3 	est un entier
     
    nRetFoncStart 	= API("WINMM.DLL","midiInStart",gnHandleMidiIn) 								// On démarre l'écoute
    nRet2 		= API("WINMM.DLL","midiInPrepareHeader",gnHandleMidiIn, &gstHDRMidi, Dimension(gstHDRMidi))
    nRet3 		= API("WINMM.DLL","midiInAddBuffer",gnHandleMidiIn, &gstHDRMidi, Dimension( &gstHDRMidi))
     
    RENVOYER nRetFoncStart
     
    //*********************************************************************************
    PROCEDURE StopCapture()
    //*********************************************************************************
    nRetFonc,nRetFonc1,nRetFonc2 est un entier
     
    // on veut quitter
    nRetFonc	 	= API("WINMM.DLL","midiInReset",gnHandleMidiIn)   // on réinitialise
    nRetFonc1		= API("WINMM.DLL","midiInStop",gnHandleMidiIn)
    nRetFonc2		= API("WINMM.DLL","midiInClose",gnHandleMidiIn)
    Ma fonction CallBack
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
     
    //-------------------------------------------------------------------------------------------------------------
    PROCEDURE MidiHandlerBack( nStINMidi est un entier,wMsg est un entier système,dwParam1 est un entier système,DwParam2 est un entier système)
    //-------------------------------------------------------------------------------------------------------------
    //PROCEDURE MidiHandlerBack( stINMidi est un entier,wMsg est un entier systeme,nsyDwInstance est un entier systeme,dwParam1 est un entier système,DwParam2 est un entier système)
    //STTMidiBufferItem  est une Structure
    //	timestamp 		est un entier sans signe sur 2 octets				// Timestamp IN milliseconds after midiInStart }
    //	data 				est un entier sans signe sur 2 octets				// MIDI Message received }
    //	stLeSYSEX 			est un entier systeme							// Pointer TO SYSEX MIDIHDR, nil IF NOT SYSEX }	
    //FIN
    //PMidiBufferItem  		est un STTMidiBufferItem
     
    //TCircularBuffer est une Structure
    //	RecordHandle 		est un entier système								// Windows memory Handle FOR this record }
    //	BufferHandle 		est un entier système								// Windows memory Handle FOR the buffer }
    //	pStart 			est un entier systeme								// ptr TO start of buffer }
    //	pEnd 			est un entier systeme								// ptr TO END of buffer }
    //	pNextPut 			est un entier systeme								// next location TO fill }
    //	//pNextGet 		est un STTMidiBufferItem							// next location TO empty }
    //	pNextGet 			est un entier systeme
    //	Anomalie 			est un entier sans signe	sur 2	octets 			// Error code from MMSYSTEM functions }
    //	Capacity 			est un entier sans signe	sur 2 octets			// buffer size (IN TMidiBufferItems) }
    //	EventCount 		est un entier sans signe	sur 2 octets			// Number of events IN buffer }	
    //PCircularBuffer  		est un TCircularBuffer
     
    //TMidiCtlInfo est une Structure
    //	hMem 			est un entier système 				    			// Memory Handle FOR this record }
    //	nsyPBuffer 		est un entier systeme								// Pointer TO the MIDI Input data buffer }
    //	hWindow 			est un entier système		   						// Control's window Handle }
    //	SysexOnly 			est un booléen	   									// Only process System Exclusive Input }
    //	FilterMTC 			est un booléen       								// Filter Midi Time Code messages out }
    //	FilterAS 			est un booléen        								// Filter Active Sensing messages out }	
    //FIN
    //stPMidiCtlInfo  		est un TMidiCtlInfo
     
    stThisEvent 		est un STTMidiBufferItem
    stthisCtlInfo 		est un  TMidiCtlInfo
    stthisBuffer 		est un TCircularBuffer
    bProcessThisMessage est un booléen
    bResCircbuf 		est un booléen	
    nsyPointeurDataSysex est un entier système
    nsyPointeurDataSysex = &gstHDRMidi.DataPtr
     
    FEN_PRINCIPALE.LIB_Message1 = "je suis dans la CallBack nStInMidi = " + nStINMidi
     
    SELON wMsg
    	CAS MM_MIM_RIEN     // Code 254
    	CAS MM_MIM_OPEN 	//nothing};
     
    	CAS MM_MIM_ERROR 	//TODO: handle (message to trigger exception?) };
     
    	CAS MM_MIM_DATA, MM_MIM_LONGDATA, MM_MIM_LONGERROR
    		// Note: mim_Longerror included because there's a bug in the Maui
    		// input driver that sends MIM_LONGERROR for subsequent buffers when
    		//the input buffer is smaller than the sysex block being received }
    		//stthisCtlInfo = nsydwInstance
     
    		// Filter messages if enabled (is there a more efficient way?
    		SELON dwParam1 //case dwParam1 of
    			CAS MIDI_ACTIVESENSING 			//254
    				bProcessThisMessage = PAS stthisCtlInfo.FilterAS
    			CAS MIDI_TIMINGCLOCK 			//248
    				bProcessThisMessage = PAS stthisCtlInfo.FilterMTC
    			AUTRE CAS
    				bProcessThisMessage = Vrai
     
    		FIN
     
    		SI bProcessThisMessage ALORS
    			// The device driver passes us the instance data pointer we
    			// specified for midiInOpen. Use this to get the buffer address
    			// and window handle for the MIDI control }
     
    			stthisBuffer.pStart = stthisCtlInfo.nsyPBuffer			
    			// Screen out short messages if we've been asked to }
    			SI ((wMsg <> MM_MIM_DATA) OR (stthisCtlInfo.SysexOnly = Faux)) ET (stthisCtlInfo <> Null) AND (stthisBuffer <> Null) ALORS
    				stThisEvent.timestamp = DwParam2
    				stThisEvent.data = nsyPointeurDataSysex			
    				stthisCtlInfo.nsyPBuffer = nsyPointeurDataSysex
     
    				SI DwParam2 <> MM_MIM_RIEN ALORS
    					Trace("Event est Param 2:" +"wMsg = "+wMsg + "   " + "param 1 = "+dwParam1+"   "+"Param 2 = "+DwParam2 + " Data = "+ gstPMidiHdr.DataPtr)
    					TableAjouteLigne(FEN_PRINCIPALE.TABLE_InfocallBack,"Event est Param2 : wMsg = ",wMsg,dwParam1,DwParam2,nsyPointeurDataSysex)
    					// La faudrait décoder et envoyer .... je sais pas ou
    				FIN
     
    				bResCircbuf = CircbufPutEvent(stthisBuffer, stThisEvent)
    			SINON
    				SI DwParam2 <> MM_MIM_RIEN ALORS
    					Trace("Event est Param 1:" +"   wMsg = "+wMsg + "   " + "param 1 = "+dwParam1+"   "+"Param 2 = "+DwParam2+ " Data = "+ gstPMidiHdr.DataPtr)
    					TableAjouteLigne(FEN_PRINCIPALE.TABLE_InfocallBack,"Event est Param1 : wMsg = ",wMsg,dwParam1,DwParam2,gstPMidiHdr.DataPtr)
    					// La faudrait décoder et envoyer .... je sais pas ou
    				FIN
     
    				stThisEvent.data          = dwParam1
    				SI (wMsg = MM_MIM_LONGDATA) OU (wMsg = MM_MIM_LONGERROR) ALORS
    					stThisEvent.data 	        = 0
    					stThisEvent.stLeSYSEX 	= dwParam1
    				FIN
    				stThisEvent.stLeSYSEX = Null
    			FIN
    		FIN
     
    		SI bResCircbuf ALORS
    			// Send a message to the control to say input's arrived }
    			PostMessage(stthisCtlInfo.hWindow, MM_MIM_DATA, 0, 0)
    		SINON
    			// Buffer overflow }
    			//PostMessage(stthisCtlInfo.hWindow, gnmim_Overflow, 0, 0);
    			//PostMessage(stthisCtlInfo.hWindow, WM_USER, 0, 0)
     
    		FIN
     
     
    	CAS MOM_DONE // Sysex output complete, dwParam1 is pointer to MIDIHDR }
     
    		// Notify the control that its sysex output is finished.
    		// The control should call midiOutUnprepareHeader before freeing the buffer }
    		PostMessage(stPMidiCtlInfo.hWindow, MOM_DONE, 0, dwParam1)
    FIN     //{ SELON wMsg }
    //------------------------------------------------------------------------------------------------------
    PROCEDURE CircbufPutEvent(stPBuffer est un TCircularBuffer, stPTheEvent est un STTMidiBufferItem)
    //------------------------------------------------------------------------------------------------------
    // Add an event to the circular input buffer.
    bValeurRetour est un booléen
    //Trace("stPBuffer.EventCount  =  " + stPBuffer.EventCount)
    //Trace("stPBuffer.Capacity       =  " + stPBuffer.Capacity)
    //Trace("stPBuffer.pNextPut       =  " + stPBuffer.pNextPut)
    //Trace("stPBuffer.pEnd              =  " + stPBuffer.pEnd)
    //Trace("stPBuffer.pStart             =  " + stPBuffer.pStart)
     
    SI (stPBuffer.EventCount < stPBuffer.Capacity) ALORS
    	stPBuffer.EventCount++
     
    	// Todo: better way of copying this record }
    	//with PBuffer^.PNextput^ do
     
    	stPTheEvent.timestamp 	= stPTheEvent.timestamp
    	stPTheEvent.data 		= stPTheEvent.data
    	stPTheEvent.stLeSYSEX 		= stPTheEvent.stLeSYSEX
     
     
    	// Move to next put location, with wrap }
    	stPBuffer.pNextPut++
    	SI (stPBuffer.pNextPut = stPBuffer.pEnd) ALORS
    		stPBuffer.pNextPut = stPBuffer.pStart	
    		bValeurRetour = Vrai
    	FIN
    SINON
    	bValeurRetour = Faux
    FIN
    RENVOYER bValeurRetour
    CE que je reçois

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
    168
    169
    170
    171
    172
    173
    174
    175
    176
    177
    178
    179
    180
    181
    182
    183
    184
    185
    186
    187
    188
    189
    190
    191
    192
    193
    194
    195
    196
    197
    198
    199
    200
    201
    202
    203
    204
    205
    206
    207
    208
    209
    210
    211
    212
    213
    214
    215
    216
    217
    218
    219
    220
    221
    222
    223
    224
    225
    226
    227
    228
    229
    230
    231
    232
    233
    234
    235
    236
    237
    238
    239
    240
    241
    242
    243
    244
    245
    246
    247
    248
    249
    250
    251
    252
    253
    254
    255
    256
    257
    Event est Param 2:wMsg = 963   param 1 = 0   Param 2 = 176 Data = 
    Event est Param 2:wMsg = 963   param 1 = 0   Param 2 = 7413936 Data = 
    Event est Param 2:wMsg = 963   param 1 = 0   Param 2 = 192 Data = 
    Event est Param 2:wMsg = 963   param 1 = 0   Param 2 = 6555568 Data = 
    Event est Param 2:wMsg = 963   param 1 = 0   Param 2 = 26032 Data = 
    Event est Param 2:wMsg = 963   param 1 = 0   Param 2 = 91312 Data = 
    Event est Param 2:wMsg = 963   param 1 = 0   Param 2 = 4196016 Data = 
    Event est Param 2:wMsg = 963   param 1 = 0   Param 2 = 9904 Data = 
    Event est Param 2:wMsg = 963   param 1 = 0   Param 2 = 2120624 Data = 
    Event est Param 2:wMsg = 963   param 1 = 0   Param 2 = 6815921 Data = 
    Event est Param 2:wMsg = 963   param 1 = 0   Param 2 = 336049 Data = 
    Event est Param 2:wMsg = 963   param 1 = 0   Param 2 = 193 Data = 
    Event est Param 2:wMsg = 963   param 1 = 0   Param 2 = 6293425 Data = 
    Event est Param 2:wMsg = 963   param 1 = 0   Param 2 = 3016625 Data = 
    Event est Param 2:wMsg = 963   param 1 = 0   Param 2 = 4606641 Data = 
    Event est Param 2:wMsg = 963   param 1 = 0   Param 2 = 26033 Data = 
    Event est Param 2:wMsg = 963   param 1 = 0   Param 2 = 91313 Data = 
    Event est Param 2:wMsg = 963   param 1 = 0   Param 2 = 4196017 Data = 
    Event est Param 2:wMsg = 963   param 1 = 0   Param 2 = 9905 Data = 
    Event est Param 2:wMsg = 963   param 1 = 0   Param 2 = 1727409 Data = 
    Event est Param 2:wMsg = 963   param 1 = 0   Param 2 = 179 Data = 
    Event est Param 2:wMsg = 963   param 1 = 0   Param 2 = 7676083 Data = 
    Event est Param 2:wMsg = 963   param 1 = 0   Param 2 = 12739 Data = 
    Event est Param 2:wMsg = 963   param 1 = 0   Param 2 = 3606451 Data = 
    Event est Param 2:wMsg = 963   param 1 = 0   Param 2 = 2885555 Data = 
    Event est Param 2:wMsg = 963   param 1 = 0   Param 2 = 1574323 Data = 
    Event est Param 2:wMsg = 963   param 1 = 0   Param 2 = 26035 Data = 
    Event est Param 2:wMsg = 963   param 1 = 0   Param 2 = 91315 Data = 
    Event est Param 2:wMsg = 963   param 1 = 0   Param 2 = 4196019 Data = 
    Event est Param 2:wMsg = 963   param 1 = 0   Param 2 = 9907 Data = 
    Event est Param 2:wMsg = 963   param 1 = 0   Param 2 = 3300275 Data = 
    Event est Param 2:wMsg = 963   param 1 = 0   Param 2 = 178 Data = 
    Event est Param 2:wMsg = 963   param 1 = 0   Param 2 = 7545010 Data = 
    Event est Param 2:wMsg = 963   param 1 = 0   Param 2 = 194 Data = 
    Event est Param 2:wMsg = 963   param 1 = 0   Param 2 = 6555570 Data = 
    Event est Param 2:wMsg = 963   param 1 = 0   Param 2 = 1458 Data = 
    Event est Param 2:wMsg = 963   param 1 = 0   Param 2 = 26034 Data = 
    Event est Param 2:wMsg = 963   param 1 = 0   Param 2 = 91314 Data = 
    Event est Param 2:wMsg = 963   param 1 = 0   Param 2 = 4196018 Data = 
    Event est Param 2:wMsg = 963   param 1 = 0   Param 2 = 9906 Data = 
    Event est Param 2:wMsg = 963   param 1 = 0   Param 2 = 1727410 Data = 
    Event est Param 2:wMsg = 963   param 1 = 0   Param 2 = 2623412 Data = 
    Event est Param 2:wMsg = 963   param 1 = 0   Param 2 = 2623413 Data = 
    Event est Param 2:wMsg = 963   param 1 = 0   Param 2 = 2623414 Data = 
    Event est Param 2:wMsg = 963   param 1 = 0   Param 2 = 2623415 Data = 
    Event est Param 2:wMsg = 963   param 1 = 0   Param 2 = 2493108 Data = 
    Event est Param 2:wMsg = 963   param 1 = 0   Param 2 = 2493109 Data = 
    Event est Param 2:wMsg = 963   param 1 = 0   Param 2 = 2493110 Data = 
    Event est Param 2:wMsg = 963   param 1 = 0   Param 2 = 2493111 Data = 
    Event est Param 2:wMsg = 963   param 1 = 0   Param 2 = 24254 Data = 
    Event est Param 2:wMsg = 963   param 1 = 0   Param 2 = 24253 Data = 
    Event est Param 2:wMsg = 963   param 1 = 0   Param 2 = 24252 Data = 
    Event est Param 2:wMsg = 963   param 1 = 0   Param 2 = 1334971 Data = 
    Event est Param 2:wMsg = 963   param 1 = 0   Param 2 = 24250 Data = 
    Event est Param 2:wMsg = 963   param 1 = 0   Param 2 = 24249 Data = 
    Event est Param 2:wMsg = 963   param 1 = 0   Param 2 = 24248 Data = 
    Event est Param 2:wMsg = 963   param 1 = 0   Param 2 = 24254 Data = 
    Event est Param 2:wMsg = 963   param 1 = 0   Param 2 = 24253 Data = 
    Event est Param 2:wMsg = 963   param 1 = 0   Param 2 = 24252 Data = 
    Event est Param 2:wMsg = 963   param 1 = 0   Param 2 = 1334971 Data = 
    Event est Param 2:wMsg = 963   param 1 = 0   Param 2 = 24250 Data = 
    Event est Param 2:wMsg = 963   param 1 = 0   Param 2 = 24249 Data = 
    Event est Param 2:wMsg = 963   param 1 = 0   Param 2 = 24248 Data = 
    Event est Param 2:wMsg = 963   param 1 = 0   Param 2 = 176 Data = 
    Event est Param 2:wMsg = 963   param 1 = 0   Param 2 = 7413936 Data = 
    Event est Param 2:wMsg = 963   param 1 = 0   Param 2 = 192 Data = 
    Event est Param 2:wMsg = 963   param 1 = 0   Param 2 = 6555568 Data = 
    Event est Param 2:wMsg = 963   param 1 = 0   Param 2 = 4197040 Data = 
    Event est Param 2:wMsg = 963   param 1 = 0   Param 2 = 8326064 Data = 
    Event est Param 2:wMsg = 963   param 1 = 0   Param 2 = 2120624 Data = 
    Event est Param 2:wMsg = 963   param 1 = 0   Param 2 = 23984 Data = 
    Event est Param 2:wMsg = 963   param 1 = 0   Param 2 = 24240 Data = 
    Event est Param 2:wMsg = 963   param 1 = 0   Param 2 = 26032 Data = 
    Event est Param 2:wMsg = 963   param 1 = 0   Param 2 = 25776 Data = 
    Event est Param 2:wMsg = 963   param 1 = 0   Param 2 = 132784 Data = 
    Event est Param 2:wMsg = 963   param 1 = 0   Param 2 = 9904 Data = 
    Event est Param 2:wMsg = 963   param 1 = 0   Param 2 = 26032 Data = 
    Event est Param 2:wMsg = 963   param 1 = 0   Param 2 = 156848 Data = 
    Event est Param 2:wMsg = 963   param 1 = 0   Param 2 = 4196016 Data = 
    Event est Param 2:wMsg = 963   param 1 = 0   Param 2 = 9904 Data = 
    Event est Param 2:wMsg = 963   param 1 = 0   Param 2 = 26032 Data = 
    Event est Param 2:wMsg = 963   param 1 = 0   Param 2 = 91312 Data = 
    Event est Param 2:wMsg = 963   param 1 = 0   Param 2 = 4196016 Data = 
    Event est Param 2:wMsg = 963   param 1 = 0   Param 2 = 9904 Data = 
    Event est Param 2:wMsg = 963   param 1 = 0   Param 2 = 4194528 Data = 
    Event est Param 2:wMsg = 963   param 1 = 0   Param 2 = 208 Data = 
    Event est Param 2:wMsg = 963   param 1 = 0   Param 2 = 432 Data = 
    Event est Param 2:wMsg = 963   param 1 = 0   Param 2 = 16560 Data = 
    Event est Param 2:wMsg = 963   param 1 = 0   Param 2 = 16816 Data = 
    Event est Param 2:wMsg = 963   param 1 = 0   Param 2 = 17072 Data = 
    Event est Param 2:wMsg = 963   param 1 = 0   Param 2 = 17328 Data = 
    Event est Param 2:wMsg = 963   param 1 = 0   Param 2 = 4212912 Data = 
    Event est Param 2:wMsg = 963   param 1 = 0   Param 2 = 4212656 Data = 
    Event est Param 2:wMsg = 963   param 1 = 0   Param 2 = 4213168 Data = 
    Event est Param 2:wMsg = 963   param 1 = 0   Param 2 = 4213424 Data = 
    Event est Param 2:wMsg = 963   param 1 = 0   Param 2 = 1456 Data = 
    Event est Param 2:wMsg = 963   param 1 = 0   Param 2 = 91056 Data = 
    Event est Param 2:wMsg = 963   param 1 = 0   Param 2 = 549552 Data = 
    Event est Param 2:wMsg = 963   param 1 = 0   Param 2 = 4196016 Data = 
    Event est Param 2:wMsg = 963   param 1 = 0   Param 2 = 9904 Data = 
    Event est Param 2:wMsg = 963   param 1 = 0   Param 2 = 91056 Data = 
    Event est Param 2:wMsg = 963   param 1 = 0   Param 2 = 615088 Data = 
    Event est Param 2:wMsg = 963   param 1 = 0   Param 2 = 4196016 Data = 
    Event est Param 2:wMsg = 963   param 1 = 0   Param 2 = 9904 Data = 
    Event est Param 2:wMsg = 963   param 1 = 0   Param 2 = 91056 Data = 
    Event est Param 2:wMsg = 963   param 1 = 0   Param 2 = 680624 Data = 
    Event est Param 2:wMsg = 963   param 1 = 0   Param 2 = 4196016 Data = 
    Event est Param 2:wMsg = 963   param 1 = 0   Param 2 = 9904 Data = 
    Event est Param 2:wMsg = 963   param 1 = 0   Param 2 = 91056 Data = 
    Event est Param 2:wMsg = 963   param 1 = 0   Param 2 = 6578864 Data = 
    Event est Param 2:wMsg = 963   param 1 = 0   Param 2 = 4196016 Data = 
    Event est Param 2:wMsg = 963   param 1 = 0   Param 2 = 9904 Data = 
    Event est Param 2:wMsg = 963   param 1 = 0   Param 2 = 6815921 Data = 
    Event est Param 2:wMsg = 963   param 1 = 0   Param 2 = 336049 Data = 
    Event est Param 2:wMsg = 963   param 1 = 0   Param 2 = 193 Data = 
    Event est Param 2:wMsg = 963   param 1 = 0   Param 2 = 3016625 Data = 
    Event est Param 2:wMsg = 963   param 1 = 0   Param 2 = 4197041 Data = 
    Event est Param 2:wMsg = 963   param 1 = 0   Param 2 = 8326065 Data = 
    Event est Param 2:wMsg = 963   param 1 = 0   Param 2 = 1727409 Data = 
    Event est Param 2:wMsg = 963   param 1 = 0   Param 2 = 23985 Data = 
    Event est Param 2:wMsg = 963   param 1 = 0   Param 2 = 24241 Data = 
    Event est Param 2:wMsg = 963   param 1 = 0   Param 2 = 26033 Data = 
    Event est Param 2:wMsg = 963   param 1 = 0   Param 2 = 25777 Data = 
    Event est Param 2:wMsg = 963   param 1 = 0   Param 2 = 132785 Data = 
    Event est Param 2:wMsg = 963   param 1 = 0   Param 2 = 9905 Data = 
    Event est Param 2:wMsg = 963   param 1 = 0   Param 2 = 26033 Data = 
    Event est Param 2:wMsg = 963   param 1 = 0   Param 2 = 156849 Data = 
    Event est Param 2:wMsg = 963   param 1 = 0   Param 2 = 4196017 Data = 
    Event est Param 2:wMsg = 963   param 1 = 0   Param 2 = 9905 Data = 
    Event est Param 2:wMsg = 963   param 1 = 0   Param 2 = 26033 Data = 
    Event est Param 2:wMsg = 963   param 1 = 0   Param 2 = 91313 Data = 
    Event est Param 2:wMsg = 963   param 1 = 0   Param 2 = 4196017 Data = 
    Event est Param 2:wMsg = 963   param 1 = 0   Param 2 = 9905 Data = 
    Event est Param 2:wMsg = 963   param 1 = 0   Param 2 = 4194529 Data = 
    Event est Param 2:wMsg = 963   param 1 = 0   Param 2 = 209 Data = 
    Event est Param 2:wMsg = 963   param 1 = 0   Param 2 = 433 Data = 
    Event est Param 2:wMsg = 963   param 1 = 0   Param 2 = 16561 Data = 
    Event est Param 2:wMsg = 963   param 1 = 0   Param 2 = 16817 Data = 
    Event est Param 2:wMsg = 963   param 1 = 0   Param 2 = 17073 Data = 
    Event est Param 2:wMsg = 963   param 1 = 0   Param 2 = 17329 Data = 
    Event est Param 2:wMsg = 963   param 1 = 0   Param 2 = 4212913 Data = 
    Event est Param 2:wMsg = 963   param 1 = 0   Param 2 = 4212657 Data = 
    Event est Param 2:wMsg = 963   param 1 = 0   Param 2 = 4213169 Data = 
    Event est Param 2:wMsg = 963   param 1 = 0   Param 2 = 4606641 Data = 
    Event est Param 2:wMsg = 963   param 1 = 0   Param 2 = 1457 Data = 
    Event est Param 2:wMsg = 963   param 1 = 0   Param 2 = 91057 Data = 
    Event est Param 2:wMsg = 963   param 1 = 0   Param 2 = 549553 Data = 
    Event est Param 2:wMsg = 963   param 1 = 0   Param 2 = 4196017 Data = 
    Event est Param 2:wMsg = 963   param 1 = 0   Param 2 = 9905 Data = 
    Event est Param 2:wMsg = 963   param 1 = 0   Param 2 = 91057 Data = 
    Event est Param 2:wMsg = 963   param 1 = 0   Param 2 = 615089 Data = 
    Event est Param 2:wMsg = 963   param 1 = 0   Param 2 = 4196017 Data = 
    Event est Param 2:wMsg = 963   param 1 = 0   Param 2 = 9905 Data = 
    Event est Param 2:wMsg = 963   param 1 = 0   Param 2 = 91057 Data = 
    Event est Param 2:wMsg = 963   param 1 = 0   Param 2 = 680625 Data = 
    Event est Param 2:wMsg = 963   param 1 = 0   Param 2 = 4196017 Data = 
    Event est Param 2:wMsg = 963   param 1 = 0   Param 2 = 9905 Data = 
    Event est Param 2:wMsg = 963   param 1 = 0   Param 2 = 91057 Data = 
    Event est Param 2:wMsg = 963   param 1 = 0   Param 2 = 6578865 Data = 
    Event est Param 2:wMsg = 963   param 1 = 0   Param 2 = 4196017 Data = 
    Event est Param 2:wMsg = 963   param 1 = 0   Param 2 = 9905 Data = 
    Event est Param 2:wMsg = 963   param 1 = 0   Param 2 = 179 Data = 
    Event est Param 2:wMsg = 963   param 1 = 0   Param 2 = 7676083 Data = 
    Event est Param 2:wMsg = 963   param 1 = 0   Param 2 = 12739 Data = 
    Event est Param 2:wMsg = 963   param 1 = 0   Param 2 = 2885555 Data = 
    Event est Param 2:wMsg = 963   param 1 = 0   Param 2 = 4197043 Data = 
    Event est Param 2:wMsg = 963   param 1 = 0   Param 2 = 8326067 Data = 
    Event est Param 2:wMsg = 963   param 1 = 0   Param 2 = 3300275 Data = 
    Event est Param 2:wMsg = 963   param 1 = 0   Param 2 = 23987 Data = 
    Event est Param 2:wMsg = 963   param 1 = 0   Param 2 = 24243 Data = 
    Event est Param 2:wMsg = 963   param 1 = 0   Param 2 = 26035 Data = 
    Event est Param 2:wMsg = 963   param 1 = 0   Param 2 = 25779 Data = 
    Event est Param 2:wMsg = 963   param 1 = 0   Param 2 = 1715 Data = 
    Event est Param 2:wMsg = 963   param 1 = 0   Param 2 = 9907 Data = 
    Event est Param 2:wMsg = 963   param 1 = 0   Param 2 = 26035 Data = 
    Event est Param 2:wMsg = 963   param 1 = 0   Param 2 = 156851 Data = 
    Event est Param 2:wMsg = 963   param 1 = 0   Param 2 = 4196019 Data = 
    Event est Param 2:wMsg = 963   param 1 = 0   Param 2 = 9907 Data = 
    Event est Param 2:wMsg = 963   param 1 = 0   Param 2 = 26035 Data = 
    Event est Param 2:wMsg = 963   param 1 = 0   Param 2 = 91315 Data = 
    Event est Param 2:wMsg = 963   param 1 = 0   Param 2 = 4196019 Data = 
    Event est Param 2:wMsg = 963   param 1 = 0   Param 2 = 9907 Data = 
    Event est Param 2:wMsg = 963   param 1 = 0   Param 2 = 4194531 Data = 
    Event est Param 2:wMsg = 963   param 1 = 0   Param 2 = 211 Data = 
    Event est Param 2:wMsg = 963   param 1 = 0   Param 2 = 435 Data = 
    Event est Param 2:wMsg = 963   param 1 = 0   Param 2 = 16563 Data = 
    Event est Param 2:wMsg = 963   param 1 = 0   Param 2 = 16819 Data = 
    Event est Param 2:wMsg = 963   param 1 = 0   Param 2 = 17075 Data = 
    Event est Param 2:wMsg = 963   param 1 = 0   Param 2 = 17331 Data = 
    Event est Param 2:wMsg = 963   param 1 = 0   Param 2 = 4212915 Data = 
    Event est Param 2:wMsg = 963   param 1 = 0   Param 2 = 4212659 Data = 
    Event est Param 2:wMsg = 963   param 1 = 0   Param 2 = 4213171 Data = 
    Event est Param 2:wMsg = 963   param 1 = 0   Param 2 = 4213427 Data = 
    Event est Param 2:wMsg = 963   param 1 = 0   Param 2 = 1574323 Data = 
    Event est Param 2:wMsg = 963   param 1 = 0   Param 2 = 91059 Data = 
    Event est Param 2:wMsg = 963   param 1 = 0   Param 2 = 549555 Data = 
    Event est Param 2:wMsg = 963   param 1 = 0   Param 2 = 4196019 Data = 
    Event est Param 2:wMsg = 963   param 1 = 0   Param 2 = 9907 Data = 
    Event est Param 2:wMsg = 963   param 1 = 0   Param 2 = 91059 Data = 
    Event est Param 2:wMsg = 963   param 1 = 0   Param 2 = 615091 Data = 
    Event est Param 2:wMsg = 963   param 1 = 0   Param 2 = 4196019 Data = 
    Event est Param 2:wMsg = 963   param 1 = 0   Param 2 = 9907 Data = 
    Event est Param 2:wMsg = 963   param 1 = 0   Param 2 = 91059 Data = 
    Event est Param 2:wMsg = 963   param 1 = 0   Param 2 = 680627 Data = 
    Event est Param 2:wMsg = 963   param 1 = 0   Param 2 = 4196019 Data = 
    Event est Param 2:wMsg = 963   param 1 = 0   Param 2 = 9907 Data = 
    Event est Param 2:wMsg = 963   param 1 = 0   Param 2 = 91059 Data = 
    Event est Param 2:wMsg = 963   param 1 = 0   Param 2 = 6578867 Data = 
    Event est Param 2:wMsg = 963   param 1 = 0   Param 2 = 4196019 Data = 
    Event est Param 2:wMsg = 963   param 1 = 0   Param 2 = 9907 Data = 
    Event est Param 2:wMsg = 963   param 1 = 0   Param 2 = 178 Data = 
    Event est Param 2:wMsg = 963   param 1 = 0   Param 2 = 7545010 Data = 
    Event est Param 2:wMsg = 963   param 1 = 0   Param 2 = 194 Data = 
    Event est Param 2:wMsg = 963   param 1 = 0   Param 2 = 6555570 Data = 
    Event est Param 2:wMsg = 963   param 1 = 0   Param 2 = 4197042 Data = 
    Event est Param 2:wMsg = 963   param 1 = 0   Param 2 = 8326066 Data = 
    Event est Param 2:wMsg = 963   param 1 = 0   Param 2 = 1727410 Data = 
    Event est Param 2:wMsg = 963   param 1 = 0   Param 2 = 23986 Data = 
    Event est Param 2:wMsg = 963   param 1 = 0   Param 2 = 24242 Data = 
    Event est Param 2:wMsg = 963   param 1 = 0   Param 2 = 26034 Data = 
    Event est Param 2:wMsg = 963   param 1 = 0   Param 2 = 25778 Data = 
    Event est Param 2:wMsg = 963   param 1 = 0   Param 2 = 132786 Data = 
    Event est Param 2:wMsg = 963   param 1 = 0   Param 2 = 9906 Data = 
    Event est Param 2:wMsg = 963   param 1 = 0   Param 2 = 26034 Data = 
    Event est Param 2:wMsg = 963   param 1 = 0   Param 2 = 156850 Data = 
    Event est Param 2:wMsg = 963   param 1 = 0   Param 2 = 4196018 Data = 
    Event est Param 2:wMsg = 963   param 1 = 0   Param 2 = 9906 Data = 
    Event est Param 2:wMsg = 963   param 1 = 0   Param 2 = 26034 Data = 
    Event est Param 2:wMsg = 963   param 1 = 0   Param 2 = 91314 Data = 
    Event est Param 2:wMsg = 963   param 1 = 0   Param 2 = 4196018 Data = 
    Event est Param 2:wMsg = 963   param 1 = 0   Param 2 = 9906 Data = 
    Event est Param 2:wMsg = 963   param 1 = 0   Param 2 = 4194530 Data = 
    Event est Param 2:wMsg = 963   param 1 = 0   Param 2 = 210 Data = 
    Event est Param 2:wMsg = 963   param 1 = 0   Param 2 = 434 Data = 
    Event est Param 2:wMsg = 963   param 1 = 0   Param 2 = 16562 Data = 
    Event est Param 2:wMsg = 963   param 1 = 0   Param 2 = 16818 Data = 
    Event est Param 2:wMsg = 963   param 1 = 0   Param 2 = 17074 Data = 
    Event est Param 2:wMsg = 963   param 1 = 0   Param 2 = 17330 Data = 
    Event est Param 2:wMsg = 963   param 1 = 0   Param 2 = 4212914 Data = 
    Event est Param 2:wMsg = 963   param 1 = 0   Param 2 = 4212658 Data = 
    Event est Param 2:wMsg = 963   param 1 = 0   Param 2 = 4213170 Data = 
    Event est Param 2:wMsg = 963   param 1 = 0   Param 2 = 4213426 Data = 
    Event est Param 2:wMsg = 963   param 1 = 0   Param 2 = 1458 Data = 
    Event est Param 2:wMsg = 963   param 1 = 0   Param 2 = 91058 Data = 
    Event est Param 2:wMsg = 963   param 1 = 0   Param 2 = 549554 Data = 
    Event est Param 2:wMsg = 963   param 1 = 0   Param 2 = 4196018 Data = 
    Event est Param 2:wMsg = 963   param 1 = 0   Param 2 = 9906 Data = 
    Event est Param 2:wMsg = 963   param 1 = 0   Param 2 = 91058 Data = 
    Event est Param 2:wMsg = 963   param 1 = 0   Param 2 = 615090 Data = 
    Event est Param 2:wMsg = 963   param 1 = 0   Param 2 = 4196018 Data = 
    Event est Param 2:wMsg = 963   param 1 = 0   Param 2 = 9906 Data = 
    Event est Param 2:wMsg = 963   param 1 = 0   Param 2 = 91058 Data = 
    Event est Param 2:wMsg = 963   param 1 = 0   Param 2 = 680626 Data = 
    Event est Param 2:wMsg = 963   param 1 = 0   Param 2 = 4196018 Data = 
    Event est Param 2:wMsg = 963   param 1 = 0   Param 2 = 9906 Data = 
    Event est Param 2:wMsg = 963   param 1 = 0   Param 2 = 91058 Data = 
    Event est Param 2:wMsg = 963   param 1 = 0   Param 2 = 6578866 Data =
    ce que j'ai reçu de BomeSendX pour le même bouton

    F0 43 10 4C 08 00 76 10 F7
    F0 43 10 4C 08 00 72 6C F7
    F0 43 10 4C 08 00 73 60 F7
    F0 43 10 4C 08 01 0D 3A F7
    F0 43 10 4C 08 01 0C 43 F7
    F0 43 10 4C 08 01 0C 47 F7
    F0 43 10 4C 08 01 76 10 F7
    F0 43 10 4C 08 01 72 40 F7
    F0 43 10 4C 08 01 77 2B F7
    F0 43 10 4C 08 01 73 67 F7
    F0 43 10 4C 08 03 1E 37 F7
    F0 43 10 4C 0A 03 40 28 F7
    F0 43 10 4C 0A 03 42 47 F7
    F0 43 10 4C 08 03 0D 40 F7
    F0 43 10 4C 08 02 1E 2A F7
    F0 43 10 4C 08 02 76 10 F7
    F0 43 10 4C 08 02 77 2F F7
    F0 43 10 4C 03 03 00 15 00 F7
    F0 43 10 4C 03 03 0C 03 F7
    F0 43 10 4C 03 03 0B 24 F7
    F0 43 10 4C 03 04 00 57 10 F7
    F0 43 10 4C 03 04 0B 0C F7
    F0 43 10 4C 10 00 0B 00 F7
    F0 43 10 4C 10 00 13 1E F7
    F0 43 10 4C 04 00 00 5A 17 F7
    F0 43 10 4C 04 00 0C 7F F7
    F0 43 10 4C 04 00 18 7F F7
    F0 43 10 4C 04 00 19 7F F7
    F0 43 10 4C 04 00 1A 00 F7
    F0 43 10 4C 04 00 1B 00 F7
    F0 43 73 01 11 00 50 10 02 F7
    F0 43 10 4C 04 00 60 00 00 F7
    F0 43 10 4C 02 01 00 01 20 F7
    F0 43 10 4C 02 01 20 41 00 F7
    F0 43 10 4C 02 01 40 15 00 F7
    F0 43 10 4C 02 01 5A 01 F7
    F0 43 10 4C 02 01 42 00 08 F7
    F0 43 10 4C 02 40 01 49 F7
    F0 43 10 4C 02 40 02 1F F7
    F0 43 10 4C 02 40 03 14 F7
    F0 43 10 4C 02 40 05 47 F7
    F0 43 10 4C 02 40 06 1B F7
    F0 43 10 4C 02 40 07 0C F7
    F0 43 10 4C 02 40 09 46 F7
    F0 43 10 4C 02 40 0A 26 F7
    F0 43 10 4C 02 40 0B 10 F7
    F0 43 10 4C 02 40 0D 45 F7
    F0 43 10 4C 02 40 0E 2A F7
    F0 43 10 4C 02 40 0F 19 F7
    F0 43 10 4C 02 40 11 49 F7
    F0 43 10 4C 02 40 12 36 F7
    F0 43 10 4C 02 40 13 0A F7
    F0 43 10 4C 02 01 40 40 00 F7
    F0 7E 7F 09 01 F7
    F0 43 10 4C 02 01 00 01 20 F7
    F0 43 10 4C 02 01 0C 40 F7
    F0 43 10 4C 02 01 0D 40 F7
    F0 43 10 4C 02 01 20 41 00 F7
    F0 43 10 4C 02 01 2D 40 F7
    F0 43 10 4C 02 01 2E 00 F7
    F0 00 00 04 04 F7 <---------------------------C'est celui-là et seulement celui-là qui m'intéresse: partition N° 44
    F0 43 10 4C 02 01 40 15 00 F7
    F0 43 10 4C 02 01 5A 01 F7
    F0 43 10 4C 02 01 5B 7F F7
    F0 43 10 4C 02 01 42 00 08 F7
    F0 43 10 4C 02 01 56 40 F7
    F0 43 10 4C 02 01 57 40 F7
    F0 43 10 4C 02 01 58 00 F7
    F0 43 10 4C 02 01 59 00 F7
    F0 43 10 4C 02 01 5C 40 F7
    F0 43 10 4C 02 01 5D 40 F7
    F0 43 10 4C 02 01 5E 40 F7
    F0 43 10 4C 02 01 5F 40 F7
    F0 43 10 4C 02 01 60 40 F7
    F0 43 10 4C 08 08 14 00 F7
    F0 43 10 4C 08 09 14 00 F7
    F0 43 10 4C 08 0A 14 00 F7
    F0 43 10 4C 08 0B 14 14 F7
    F0 43 10 4C 08 0C 14 00 F7
    F0 43 10 4C 08 0D 14 00 F7
    F0 43 10 4C 08 0E 14 00 F7
    F0 43 10 4C 08 0F 14 00 F7
    F0 43 10 4C 04 00 00 5A 17 F7
    F0 43 10 4C 08 00 11 7F F7
    F0 43 10 4C 08 00 72 6C F7
    F0 43 10 4C 08 00 73 60 F7
    F0 43 10 4C 08 00 76 10 F7
    F0 43 10 4C 08 00 77 2F F7
    F0 43 10 4C 08 00 1E 2A F7
    F0 43 10 4C 08 00 20 00 F7
    F0 43 10 4C 08 01 11 7F F7
    F0 43 10 4C 08 01 72 40 F7
    F0 43 10 4C 08 01 73 67 F7
    F0 43 10 4C 08 01 76 10 F7
    F0 43 10 4C 08 01 77 2B F7
    F0 43 10 4C 08 01 0C 47 F7
    F0 43 10 4C 08 01 0D 3A F7
    F0 43 10 4C 08 01 1E 2A F7
    F0 43 10 4C 08 01 20 00 F7
    F0 43 10 4C 08 03 11 7F F7
    F0 43 10 4C 08 03 72 40 F7
    F0 43 10 4C 08 03 73 40 F7
    F0 43 10 4C 08 03 76 10 F7
    F0 43 10 4C 08 03 77 2F F7
    F0 43 10 4C 0A 03 40 28 F7
    F0 43 10 4C 0A 03 42 47 F7
    F0 43 10 4C 08 03 1E 37 F7
    F0 43 10 4C 08 03 20 00 F7
    F0 43 10 4C 08 02 11 7F F7
    F0 43 10 4C 08 02 72 40 F7
    F0 43 10 4C 08 02 73 40 F7
    F0 43 10 4C 08 02 76 10 F7
    F0 43 10 4C 08 02 77 2F F7
    F0 43 10 4C 08 02 1E 2A F7
    F0 43 10 4C 08 02 20 00 F7
    Théoriquement il faut que j'applique un filtre F9 qui a la valeur dans mes constantes: FILTER_F9 = 0xF9 //filter undefined F9
    parce que mon sysex n'a pas la structure standard des sysex : donc il doit sortir en exception

    J'ai essayé de convertir du code DELPHI mais je tricote dans les pointeurs et les classes (Mes connaissances Pascal datent d'il y a au moins 30 ans donc j'ai un peu oublié
    Si une âme charitable pouvait me donner un début de solution pour passer d'un Param 2 = 2885555 à une info SYSEX Exploitable F0........F7

    Mon dernier problème
    J'ai lancé l'écoute dans un Thread
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    nRetFonc2 		= API("WINMM.DLL","midiInOpen",&gnHandleMidiIn,nDevice, &MidiHandlerBack,0,CALLBACK_FUNCTION)// On lance l'écoute du driver sélectionné
    ThreadExécute("EcouteIN",threadNormal,StartMidiIn)
    donc mon programme passe à la suite tant que je n'ai pas appuyé sur un bouton.
    J'appuie sur une registration : Ma table se remplit avec les codes Param2 (comme indiqué plus haut)
    Pour le moment je sors manuellement et relance une nouvelle écoute
    Il faudrait que :
    Dès que j'ai récupéré le sysex qui m'intéresse :
    - Je quitte la CallBack et l'écoute
    - J'appelle ma partition
    - Je relance l'écoute

    Voilà le lien du Source de mon programme de test (En Windev 20)

    https://share.orange.fr/#aE0lwQAfYC3cb9d8dacf

    Je remercie par avance tous les spécialistes qui voudront bien me donner un coup de main

  2. #2
    Membre averti Avatar de LeonCosnyd
    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    439
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2007
    Messages : 439
    Points : 368
    Points
    368
    Par défaut
    Bonjour,

    Patrice Terrier à partagé un projet sur le site de dépot PcSoft : http://depot.pcsoft.fr/resource.awp?...ion-bas-niveau

    Celui-ci permet de faire fonctionner un piano MIDI. Je te conseille de regarder les sources du projet pour voir si tu arrives à trouver ton bonheur.
    Google est ton ami !

  3. #3
    Membre à l'essai
    Homme Profil pro
    RETRAITE
    Inscrit en
    Février 2012
    Messages
    35
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : RETRAITE

    Informations forums :
    Inscription : Février 2012
    Messages : 35
    Points : 18
    Points
    18
    Par défaut
    Bonjour,
    Je te remercie, j'avais déjà regardé dans son code mais il n'utilise que le MIDI OUT .il n'y a pas de Gestion du Midi IN.
    Pour le Midi Out j'ai pas de probleme.Je sais envoyer des messages au clavier (Changement de registration , de style etc..)
    Mon souci c'est le décodage des messages Midi In : comment a partir de dwparam1 et dwparam2 de la callback construire un sysex F0 .......... F7

    normalement le message est mis quelque part dans une structure MIDIHDR , dwparam1 et 2 donne des pointeurs sur ces infos et là je suis paumé ??????

  4. #4
    Membre éclairé
    Avatar de Narwe
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2013
    Messages
    253
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Mayenne (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Février 2013
    Messages : 253
    Points : 668
    Points
    668
    Par défaut
    Je me permet de répondre (peut-être à coté).

    La fonction Windev Transfert permet de transférer des données présentes à une adresse données dans une structure.
    C'est notamment utilisé avec certaines API Windows (exemple ici : http://www.developpez.net/forums/d11...rincipalement/, post 4, bloc de code 4)

  5. #5
    Membre à l'essai
    Homme Profil pro
    RETRAITE
    Inscrit en
    Février 2012
    Messages
    35
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : RETRAITE

    Informations forums :
    Inscription : Février 2012
    Messages : 35
    Points : 18
    Points
    18
    Par défaut
    Bonjour,
    Je connais la fonction transfert que j'ai essayé mais elle me met une erreur - les adresses sont sur 9 octets alors que la fonction en veux 8 - .Mais pour l'utiliser, il faut déjà que je sache ou récupérer la data.
    C'est aussi ça mon problème.quand je regarde avec le Debuggueur je ne trouve pas d'infos.
    dwparam1 et dwparam2 doivent me donner des infos mais comme je sais pas les décoder !
    J'ai essayé avec PoidsFort et PoidsFaible (qui sont pas dans un bateau !) sur dwparam1 et ça me donne pas grand chose.
    De plus j'ai rien dans le pointeur Data de MIDIHDR

    en fait il faut pour chaque wMsg reçus que j'aille récupérer la data quelque part , la stocker et la décoder pour obtenir mes sysex
    F0 ........F7 et parmis ceux-là trouver mon sysex F0 05 00 01 04 06 F7 qui une fois décodé me donnera 146 numéro de ma partition

    Ma callback fonctionne bien car elle me sélectionne mes messages MM_DATA qui partent je sais pas ou , donc que je récupère pas
    gstHDRMidi.DataPtr reste à 0

    J'ai peut-être loupé quelque chose dans ma structure STMIDIHDR. A la fin de ma capture BytesRecorded contient bien quelque chose mais le reste est à 0.

  6. #6
    Membre éclairé
    Avatar de Narwe
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2013
    Messages
    253
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Mayenne (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Février 2013
    Messages : 253
    Points : 668
    Points
    668
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    STMIDIHDR est une Structure
    	DataPtr 			est une chaîne            	// Address of MIDI data
    C'est étrange qu'un pointeur soit stocké sous forme de chaine (on peut même dire que c'est faux)
    Je suis pas un spécialiste mais pour moi une adresse c'est grand maximum 8 octets (soit 64bits).

    D'après les traces, wMsg vaut MIM_DATA (963).
    Pour comprendre ce qu'il contient, je suis arrivé sur cette page : http://www.bass.radio42.com/help/htm...bef9c693a7.htm

    param2 : c'est le timestamp d'envoi de l'événement (donc ça n'est pas intéressant)

    param1 : c'est ça
    MIDI message that was received. The message is packed into a doubleword value as follows:
    High word: High-order byte: Not used. Low-order byte: Contains a second byte of MIDI data (when needed).
    Low word: High-order byte: Contains the first byte of MIDI data (when needed). Low-order byte: Contains the MIDI status.
    The two MIDI data bytes are optional, depending on the MIDI status byte.
    Donc si je comprend bien (mon anglais n'est pas parfait et là, on est au limite de mes connaissances), ce qui nous intéresse (l'adresse des datas), devrait être dans Low word, Hight-order bytes.

    Donc param1 est un entier sur 4 octets, on va dire que low word ce sont les 2 derniers octet et high-order byte, le premier octet de ces 2 octet donc l'adresse serait sur 1 octet (là, je pense que je me trompe) qui serait le 3e octet de param1
    on aurait alors (d'après http://doc.pcsoft.fr/fr-FR/?1512009&...teurs_binaires)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    MonAdresse = DwParam1[3, wlentier1]
    Et derrière je ferais
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Transfert(&gstPMidiHdr, MonAdresse, Dimension(gstPMidiHdr))
    Mais je ne suis pas certains de la structure de STMIDIHDR quand je regarde cela http://www.bass.radio42.com/help/htm...d5bcd1d398.htm

  7. #7
    Membre à l'essai
    Homme Profil pro
    RETRAITE
    Inscrit en
    Février 2012
    Messages
    35
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : RETRAITE

    Informations forums :
    Inscription : Février 2012
    Messages : 35
    Points : 18
    Points
    18
    Par défaut
    J'ai modifié MonMidiHDR comme ça

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    STMIDIHDR est une Structure
    	DataPtr 			est un entier système            	// Address of MIDI data
    	BufferLength 		est un entier système    		// Size of the buffer
    	BytesRecorded 		est un entier système    		// Actual amount of data in the buffer. This value should be less than or equalto the value given in the dwBufferLength member
    	MhdrID 			est un entier système        		// Custom user data
    	Flags 				est un entier système    			// Flags giving information about the buffer
    	Reserved1 			est un entier système    			// Reserved - do not use
    	Reserved2 			est un entier système   			// Reserved - do not use
    	CallbackOffset 		est un entier système 				//Type C : DWORD offset into Buffer WHEN callback is performed
    	Reserved3a 		est un entier système 				//Type C : DWORD
    	Reserved3b 		est un entier système 				//Type C : DWORD
    	Reserved3c			est un entier système 				//Type C : DWORD
    	Reserved3d			est un entier système 				//Type C : DWORD
    FIN
    gstHDRMidi 				est un STMIDIHDR
    gstPMidiHdr 			est un STMIDIHDR
    Dans la CallBack j'ai ajouté ça

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    nFortParam1 			est un entier système
    nFaibleParam1 			est un entier système
    nFaibleFortP1 			est un entier système 
    nFortFortP1 			est un entier système
    nFaibleFaiblep1 		est un entier système
    nFortFaibleP1 			est un entier système
     
    sData 					est une chaîne
    nPtrData 				est un entier système
     
    nFortParam1 		= PoidsFort(dwParam1)	
    nFortFortP1 		= PoidsFort(nFortParam1)
    nFaibleFortP1 		= PoidsFaible(nFortParam1)
     
    nFaibleParam1 		= PoidsFaible(dwParam1)
    nFaibleFaiblep1 	        = PoidsFaible(nFaibleParam1)
    nFortFaibleP1 		= PoidsFort(nFaibleParam1)
     
    //nPtrData 			= ConstruitEntier(nFortFaibleP1,nFaibleFortP1)
    //Transfert(&sData,nPtrData,Dimension(sData))
    ConstruitEntier ne donne pas une adresse memoire valide : comment fait-on pour avoir l'adresse data à partir du poidsfort et du poidsfaible ?

    ce qui m'a donné à la capture
    Nom : MidiIn_capture.jpg
Affichages : 1281
Taille : 149,6 Ko

    100, 64, 127 ça ressemble pas à des adresses mémoire mais plutôt à des valeurs ou des codes Midi ?

    j'ai mis a jour le source en tete du post
    https://share.orange.fr/#n9LpjyaLSu3f0de55874

  8. #8
    Rédacteur/Modérateur

    Homme Profil pro
    Ingénieur qualité méthodes
    Inscrit en
    Décembre 2013
    Messages
    4 053
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur qualité méthodes
    Secteur : Conseil

    Informations forums :
    Inscription : Décembre 2013
    Messages : 4 053
    Points : 9 392
    Points
    9 392
    Par défaut
    Ton dernier lien ne marche pas.

    Et tout ça est touffu, ça manque de synthèse.

    Construitentier () Cette fonction attend 2 paramètres, entiers sur 2 octets. ( donc le type entier système n'est pas adapté)
    Ton système est en 32 bits ou 64 ?

    Et vérifie si tu veux, mais il me semble que la fonction construitentier(), c'est tout bêtement : 65536* Param1 + Param2.
    N'oubliez pas le bouton Résolu si vous avez obtenu une réponse à votre question.

  9. #9
    Membre à l'essai
    Homme Profil pro
    RETRAITE
    Inscrit en
    Février 2012
    Messages
    35
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : RETRAITE

    Informations forums :
    Inscription : Février 2012
    Messages : 35
    Points : 18
    Points
    18
    Par défaut
    Désolé pour le lien mais celui mis à jour dans le premier post fonctionne.
    Ben en synthèse :
    J'ai un clavier qui m'envoie des messages midi
    Je veux récupérer un seul sysex qui est F0 xx xx xx xx xx F7
    Ce sysex qui n'a pas la structure standard doit être filtre en exception
    Il contient un no de partition à afficher

    Pour l'instant j'en suis à récupérer swparam1 et swparam2 dans là calambacs de midi open
    Et là je bloque pour transformer ce que je reçois en sysex F0 ..... F7

    Windows 10 64 bit / appli compilée en 32 bits

  10. #10
    Membre éclairé
    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    486
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2007
    Messages : 486
    Points : 875
    Points
    875
    Par défaut
    L'utilisation de la structure MIDIHDR est identique à celle de WAVEHDR.

    Mais la défiinition de votre structure WinDev est incorrecte.

    Pour commencer lpData est un pointeur sur une chaine ASCIIZ
    un DWORD se traduit en 32-bit par un entier sans signe sur 4 octets, et ainsi de suite.

    Au total, la taille de la structure MIDIHRD doit être de 64 octets.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    MIDIHDR is structure
        lpData          is system int    // LPSTR       lpData;               /* pointer to locked data block */ 
        dwBufferLength  is unsigned int  // DWORD       dwBufferLength;       /* length of data in data block */ 
        dwBytesRecorded is unsigned int  // DWORD       dwBytesRecorded;      /* used for input only */          
        dwUser          is unsigned int  // DWORD_PTR   dwUser;               /* for client//s use */               
        dwFlags         is unsigned int  // DWORD       dwFlags;              /* assorted flags (see defines) */   
        lpNext          is int           // struct midihdr_tag far *lpNext;   /* reserved for driver */          
        Reserved        is system int    // DWORD_PTR   reserved;             /* reserved for driver */          
        dwOffset        is unsigned int  // DWORD       dwOffset;             /* Callback offset into buffer */  
        dwReserved[8]   is system int    // DWORD_PTR   dwReserved[8];        /* Reserved for MMSYSTEM */        
    END
    POUR INFO, si vous aviez consulté l'aide WinDev sur les API (WDAPI) vous auriez gagné un peu de temps, car la structure y est {im}parfaitement documentée !

  11. #11
    Membre à l'essai
    Homme Profil pro
    RETRAITE
    Inscrit en
    Février 2012
    Messages
    35
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : RETRAITE

    Informations forums :
    Inscription : Février 2012
    Messages : 35
    Points : 18
    Points
    18
    Par défaut
    J'ai comparé ce que je reçois avec MidiOX

    Nom : MidiIn_capture.jpg
Affichages : 1292
Taille : 160,1 Ko

    MidiOx
    Nom : midioxCapture.jpg
Affichages : 1280
Taille : 180,2 Ko

    Je pense que je ne reçois que du MIM_DATA et que les sysex doivent etre de type MIM_LONGDATA (964)
    ça doit être une histoire de filtre : c'est pour ça que j'ai pas de pointeur vers de la data car en MIM_DATA les infos sont dans le dwparam1 (des Controle Change et Program Change + des parametres en fonction du message) avec le canal midi dans le Midi Status. (Il faut récupérer les 3 derniers bits du Midi Status)
    Pour le TimeStamp : comment passer de 10136 à 0000367A ?
    Cette partie là ne m'est pas utile (en dehors du fait de savoir décoder completement ces messages comme dans MidiOX)

    Alors la question : Comment mettre un filtre pour recevoir les MIM_LONGDATA ? F0......F7
    le source du programme test
    https://share.orange.fr/#n9LpjyaLSu3f0de55874

  12. #12
    Rédacteur/Modérateur

    Homme Profil pro
    Ingénieur qualité méthodes
    Inscrit en
    Décembre 2013
    Messages
    4 053
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur qualité méthodes
    Secteur : Conseil

    Informations forums :
    Inscription : Décembre 2013
    Messages : 4 053
    Points : 9 392
    Points
    9 392
    Par défaut
    Entre tes 2 copies d'écran, les timestamp sont censés être les mêmes ?
    10136 ,10137, 10185 , 10191
    367A , 367B, 367C, 367E

    Sur la première ligne, on a +1 , +48 puis +6 , et sur la 2ème ligne, ça ressemble beaucoup à +1 +1 puis +2 ... donc pas les mêmes data dans les 2 copies d'écran.


    Pars en Week-end, oublie, parce que là , tu boucles complètement. Ton message est incompréhensible.
    N'oubliez pas le bouton Résolu si vous avez obtenu une réponse à votre question.

  13. #13
    Membre à l'essai
    Homme Profil pro
    RETRAITE
    Inscrit en
    Février 2012
    Messages
    35
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : RETRAITE

    Informations forums :
    Inscription : Février 2012
    Messages : 35
    Points : 18
    Points
    18
    Par défaut
    Un retraité en WE ?
    C'est comme un pruneau : c'est vieux, c'est tout fripé et ça fait chier tout le monde!
    La capture est faite en simultané donc la réception est sensée être identique.
    Je comprend pas tes +1 +6 etc...
    Les program change contrôle change sont identiques
    Le timestamp c'est depuis le démarrage du midi start ?
    J'ai démarré Midipx avant mon test.
    Bon WE en attendant d'avancer sur mon problème

  14. #14
    Rédacteur/Modérateur

    Homme Profil pro
    Ingénieur qualité méthodes
    Inscrit en
    Décembre 2013
    Messages
    4 053
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur qualité méthodes
    Secteur : Conseil

    Informations forums :
    Inscription : Décembre 2013
    Messages : 4 053
    Points : 9 392
    Points
    9 392
    Par défaut
    Reprenons.

    Intuitivement, pour convertir de décimal en hexadecimal ou inversement, on est tenté de faire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    info (  NumeriqueVersChaine(10136 , "4X" ) )   // Malheureusement , ça ne donne pas 367A
    info ( 0x367A )                                               // Malheureusement, ça ne donne pas 10136 , normal vu que le 1er test n'a pas marché.
    Donc premier indice pour dire que les 2 copies d'écran ne proviennent pas des mêmes données.

    Deuxième indice, plus compliqué, mais aussi plus probant.
    Tu dis que 10136 devrait correspondre à 367A (TimeStamp de la première ligne sur chaque écran)

    J'extrapole, peut-être à tort, et je note les valeurs suivantes des TimeStamp sur les 2 écrans, et ces valeurs aussi devraient correspondre , je me trompe ?

    On cherche donc une fonction f qui donne :
    f(367A) = 10136
    f(367B) = 10137 : on passe de 367A à 367B ( = 367A+1) et de l'autre coté, on passe de 10136 à 10137 : +1 également, parfait , encourageant !
    Puis :
    f(367C) = 10185 : on passe de 367B à 367C ( donc +1 sauf piège inhabituel) , mais de l'autre côté, on passe de 10137 à 10185 : +48 : Notre fonction f a un comportement bizarre !

    Ce manque de logique me fait penser, une nouvelle fois, que les 2 copies d'écran ne coïncident pas.
    N'oubliez pas le bouton Résolu si vous avez obtenu une réponse à votre question.

  15. #15
    Membre à l'essai
    Homme Profil pro
    RETRAITE
    Inscrit en
    Février 2012
    Messages
    35
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : RETRAITE

    Informations forums :
    Inscription : Février 2012
    Messages : 35
    Points : 18
    Points
    18
    Par défaut
    Il y a un élément qui n'apparaît pas dans les copies d'écran :
    La capture de mon programme ne montre que des MIM_DATA msg 963
    La capture de MidiOX elle comporte des MIM_LONGDATA msg 964 - des sysex ceux-là même qui m'intéressent et que je n'arrive pas à avoir !


    Nom : MidiInCapt-2.jpg
Affichages : 1259
Taille : 261,0 Ko

    Nom : midioxCapture-2.jpg
Affichages : 1211
Taille : 225,1 Ko

    1-Le "trou" dans les TimeStamp ne vient-il pas de là ?
    2-Pourquoi je ne capture pas les msg 964 ? même si je n'arrive pas a avoir correctement les contenus, je devrais les voir passer non ?
    Nom : midioxCapture-3.jpg
Affichages : 1247
Taille : 126,5 Ko

    Je dois louper quelque chose. Je vais me replonger dans la doc des messages Midi.
    Pendant le WE j'ai trouvé un programme en DELPHI qui fonctionne, mais je n'arrive pas à le transposer en WINDEV , c'est rempli de Class, de Property, dedans je ne vois même pas apparaitre la structure MIDIHDR.

    Au cas ou il y ait un super DelphiWindeveur, je donne le lien du source en Delphi qui fonctionne (Delphi 2010)
    https://share.orange.fr/#CFCVqOJuyy43b5fd3e5d

    Pourquoi tout ça c'est important pour moi ?
    Celà fait 3 ans que je bosse sur un logiciel d'affichage de partitions musicales.J'ai "appris" WINDEV en commençant ce logiciel.Il permet de gerer et d'afficher des partitions en ayant le MP3, le fichier MIDI, la registration correspondante.Ca permet donc de faire monter le réglage correspondant à la partition sur le Clavier (Principalement TYROS 3,4 et 5)
    J'ai réussi à traiter la Partie MIDI OUT pour les Registrations, les Styles et Multipads interne.
    La Partie MIDI IN me permettra de faire l'inverse, c'est à dire faire afficher la partition correspondant à un réglage du TYROS.ce sera la fin du développement de ce logiciel.

    Nom : PartiGest.jpg
Affichages : 1349
Taille : 583,8 Ko

  16. #16
    Membre à l'essai
    Homme Profil pro
    RETRAITE
    Inscrit en
    Février 2012
    Messages
    35
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : RETRAITE

    Informations forums :
    Inscription : Février 2012
    Messages : 35
    Points : 18
    Points
    18
    Par défaut
    Bonjour,

    Je reviens sur mon problème de décodage sysex :
    Je vais essayer de synthétiser ça:

    1- Ma structure MIDIHDR
    Code c : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    //******************************************************************************************************************************
    // MIDIIN Structure : MIDIHDR
    //******************************************************************************************************************************
    //LPSTR      lpData; 
    //DWORD      dwBufferLength; 
    //DWORD      dwBytesRecorded; 
    //DWORD_PTR  dwUser; 
    //DWORD      dwFlags; 
    //struct midihdr_tag * lpNext; 
    //DWORD_PTR  reserved; 
    //DWORD      dwOffset; 
    //DWORD_PTR  dwReserved[4];

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    MIDIHDR est une Structure
    	DataPtr 		est un entier sans signe								// Address of MIDI data entier systeme
    	BufferLength 		est un entier sans signe sur 4 octets	  					// Size of the buffer
    	BytesRecorded 		est un entier sans signe sur 4 octets	  					// Actual amount of data in the buffer. This value should be less than or equalto the value given in the dwBufferLength member
    	User 				est un entier sans signe sur 8 octets	      					// Custom user data DWORD_PTR 
    	Flags 			est un entier sans signe sur 4 octets	  					// Flags giving information about the buffer
    	Reserved1 		est un entier sans signe sur 8 octets	  					// Reserved - do not use  DWORD_PTR 
    	Reserved2 		est un entier sans signe sur 8 octets	 					// Reserved - do not use  DWORD_PTR 
    	CallbackOffset 		est un entier sans signe sur 4 octets						//Type C : DWORD offset into Buffer WHEN callback is performed
    	Reserved3 		est un entier sans signe sur 8 octets						//Type C : DWORD_PTR 
    	Reserved4 		est un entier sans signe sur 8 octets						//Type C :  DWORD_PTR 
    	Reserved5 		est un entier sans signe sur 8 octets						//Type C :  DWORD_PTR 
    	Reserved6 		est un entier sans signe sur 8 octets						//Type C :  DWORD_PTR 
    FIN
     
    //  J'ai créé une structure pour enregistrer toutes les infos reçues
    SysExData est une Structure
    	NumSysex			est un entier
    	MsgCode 			est un entier système											// Code Msg : 963, 964
    	SysExHeader 		est un MIDIHDR 													// le MIDIHDR qui entregistre les infos relative au message Midi
    	Param1 				est un entier sans signe sur 8 octets							// dwParam1 recu dans la CallBack
    	Param2 				est un entier système											// dwParam2 recu dans la CalBack
    	StatusByte 			est un entier système											// Bit de Statut : B0, C0, F0, etc...
    	TailleSysex 		est un entier système  											// = SysExHeader.ByteRecorded
    	DataPtr 			est un entier sans signe											// = SysExHeader.DataPtr : Pointeur Data du Sysex = normalement doit pointer sur SysexInfo
    	SysexInfo 			est une chaîne ASCIIZ	sur SysExSize 											// Contenu data de SysExHeader.DataPtr 
    	SysexTraduit 		est une chaîne 													// contient la chaine sysex finale sous forme F0 43 10 4C 08 00 1E 2A F7
    	NumeroPartition 	est un entier 													// contiendra le numéro de partition récupéré dans un sysex
     
    FIN
    SysexRecus			est un tableau de NumSysexBuffers SysExData		// Contient toutes les infos SYSEX à traiter
    2- Je prépare ma capture MIDI IN

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
     
    //********************************************************************************************
    PROCEDURE MidiIN_Lance(nDevice est un entier système)
    //********************************************************************************************
    nRetFonc2				est un entier
    nsyNGnIDProced 				est un entier système = &MidiHandlerBack	// pointeur de la fonction de callback
    i est un entier
    FEN_PRINCIPALE.BTN_Demarre..Visible 	= Faux						// Pour ne pas ouvrir plusieurs à la fois et ne pas planter
     
    POUR i = 1 _A_ NumSysexBuffers
    	//Marshal.FreeHGlobal(MidiInHdr[i].DataPtr) : c'est du VB
    	//Liberer MidiInHdr[i]                      : c'est du VB
    	MidiInUnprepareHeader(i)			
    FIN
     
    MsgNombre 			= 0
     
    StopCapture()  										// on ferme ce qui pourrait etre ouvert
     
    nRetFonc2 = API("WINMM.DLL","midiInOpen",&HandleMidiIn,nDevice, &MidiHandlerBack,0,CALLBACK_FUNCTION)	// On lance l'écoute du driver sélectionné
     
    POUR  i = 1 _A_ NumSysexBuffers
    	MidiInPrepareHeader(i)
    	SysexRecus[i].SysExHeader.DataPtr 		= &SysexRecus[i].SysexInfo          // Pointeur sur la Data - celle indiquée dans le Prepare et le AddHeader
    	SysexRecus[i].SysExHeader.BufferLength 	= BufferInSize 						// taille attendue d un sysex
    	SysexRecus[i].TailleSysex 				= 0									// sera mis à jour depuis la Callback
    	SysexRecus[i].DataPtr 					= SysexRecus[i].SysExHeader.DataPtr
    	SysexRecus[i].SysexInfo 				= ""									// Contiendra la data du sysex
    	SysexRecus[i].NumSysex 					=  i								// N° ordre du sysex				
    	SysexRecus[i].SysexTraduit 				= ""									// Valeur du sysex sous la forme F0 xx xx xx xx xx xx F7
    	MidiInAddBuffer(i)	
    	SysexRecus[i].SysExHeader.Flags 		= MHDR_PREPARED						// = 2 														// prepare SysexRecus[i].SysExHeader
    FIN
    ThreadExécute("EcouteIN",threadNormal,StartMidiIn)
     
    // Là faudra trouver une méthode pour sortir du thread lorsque j'ai trouvé ce que je cherche pour afficher ma partition
    *********************************************************************************************
    3- Mon Thread StartMidiIn qui lance la capture
    *********************************************************************************************

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    //-------------------------------------------------------------------------------------------
    PROCEDURE StartMidiIn()
    //-------------------------------------------------------------------------------------------
    nRetFoncStart 	est un entier
    i est un entier
    // Récupère l'heure système
    HeureDuSysteme = HeureSys()
    nRetFoncStart 	= API("WINMM.DLL","midiInStart",HandleMidiIn) 								// On démarre l'écoute
     
    RENVOYER nRetFoncStart
    ********************************************************************************************
    4- Ma Fonction CallBack
    ********************************************************************************************

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
     
    //-------------------------------------------------------------------------------------------------------------
    PROCEDURE MidiHandlerBack( StINMidi est un entier,
    			wMsg est un entier système,
    			dwInstance est un entier système,
    			dwParam1 est un entier sans signe sur 4 octets,
    			DwParam2 est un entier système)
    //-------------------------------------------------------------------------------------------------------------
    //Parameters
    //hMidiIn    : Handle to the MIDI input device.
    //wMsg       : MIDI input message.
    //dwInstance : Instance data supplied with the*midiInOpen*function.
    //dwParam1   : Message parameter.
    //DwParam2   : Message parameter.
    //------------------------------------------
    //MM_MIM_LONGDATA structure  (964)
    //	wParam = (WPARAM) 	hInput 
    //	lParam = (LPARAM) 	lpMidiHdr
    //		Paramètres
    //			hInput 		:Manipuler le dispositif d'entrée MIDI qui a reçu les données.
    //			lpMidiHdr 	:Pointeur vers une*MIDIHDR*structure de l'*identification de*la mémoire tampon.
     
     
    dwParam1_Statut		est un entier système
    dwparam1_Data1		est un entier système
    dwparam1_Data2		est un entier système
    savparam1		est un entier sans signe sur 4 octets
    InfoCallBackHexa	est une chaîne
     
    sData			est  chaînes
    sData1			est une chaîne
    m			est un tableau de 3 entiers sur 1 octet			// en VB -> Dim m(2) As Byte
    b			est un entier système
    Chan			est un entier système					// Canal midi
     
    SELON wMsg
    	CAS MM_MIM_DATA
    		savparam1 = dwParam1						// pour ne pas détruire wParam dans notre processus
    		POUR i  = 1 _A_ 3
    			b = savparam1 & 0xFF					// En VB -> Dim _b As Byte = CByte(wParam2 And &HFF)
    			m[i] = b
    			savparam1 = bitDécaleDroite(DwParam2,8)			// wParam2 >> 8
    		FIN
    		dwParam1_Statut	= dwParam1 & 0xFF				// En Vb -> Statusbyte: = midiMsg & 0xFF;  EXTRAIT DU BYTE STATUS (Détermine le type de message)			
    		Chan		= (dwParam1_Statut & 0x0f) + 1	
    		dwparam1_Data1	= bitDécaleDroite(dwParam1,8) & 0xFF		// CECI est LA VALEUR DATA1 = NOTE NOMBRE OU CC NOMBRE midi_slider_number: = (midiMsg >> 8) & 0xFF; 
    		dwparam1_Data2	= bitDécaleDroite( dwParam1,16) & 0xFF		// En VB -> midi_value: = (midiMsg >> 16) & 0xFF; VALEUR Data2 est NOTE VELEOCITY OU de LA VALEUR CC	
     
    		SELON dwParam1
    			CAS 254 // ceux-la ne sont pas intéressants
     
    			AUTRE CAS		// Ce sont les Controle Change et Program Change
    				MsgMIM_Data++									// On compte les MIM_DATA
    				InfoCallBackHexa	=  EntierVersHexa(dwParam1,2)				// Valeur Hexa
    				i est un entier
    				j est un entier		= ChaîneOccurrence(InfoCallBackHexa," ")
    				k est entier
     
    				// Inverser la chaine Hexa			
    				POUR i = j _A_ 1 PAS -1
    					k = (i*3)+1
    					sData1 = sData1 + Milieu(InfoCallBackHexa,k,2) + " "
    				FIN
     
     
    				dwParam1_Statut 	= dwParam1 & 0xFF				//Statusbyte: = midiMsg & 0xFF; EXTRAIT DU BYTE STATUS (QUEL TYPE DE MIDI MESSAGE EST?)			
    				Chan			= (dwParam1_Statut & 0x0f) + 1			// QU'EST-CE QUE CANAL MIDI EST LE MESSAGE ON?
    				dwparam1_Data1 		= bitDécaleDroite(dwParam1,8) & 0xFF 		// CECI est LA VALEUR DATA1 = NOTE NOMBRE OU CC NOMBRE midi_slider_number: = (midiMsg >> 8) & 0xFF; 
    				dwparam1_Data2 		= bitDécaleDroite( dwParam1,16) & 0xFF 		//midi_value: = (midiMsg >> 16) & 0xFF; VALEUR Data2 est NOTE VELEOCITY OU de LA VALEUR CC	
     
    				TableAjouteLigne(FEN_PRINCIPALE.CAPTURE,"MM_MIM_DATA",
    									HeureVersChaîne(HeureSys()),
    									MsgMIM_Data,
    									DwParam2,
    									wMsg,
    									dwParam1,
    									NumériqueVersChaîne(dwParam1_Statut, "02X"),
    									NumériqueVersChaîne(dwparam1_Data1, "02X"),
    									NumériqueVersChaîne(dwparam1_Data2, "02X"),
    									Chan,
    									" ",
    									" ",
    									0,
    									sData1)	
    		FIN
     
     
    	CAS  MM_MIM_LONGDATA	// 964 ou 0x3C4
    		MsgNombre++															// On compte les sysex
    		dwParam1_Statut	= &dwParam1 & 0x000000FF   						//   A priori c'est pas bon, on devrait récupérer un F0 (240)	
    		sData 				= DoSysExData(wMsg,dwParam1,DwParam2,dwParam1_Statut)	// Traiter le sysex
     
    		TableAjouteLigne(FEN_PRINCIPALE.CAPTURE,"MM_MIM_LONGDATA",
    							HeureVersChaîne(HeureSys()),
    							MsgNombre,
    							DwParam2,
    							wMsg,
    							dwParam1,
    							dwParam1_Statut,
    							" ",
    							" ",
    							0,
    							SysexRecus[MsgNombre].DataPtr,
    							SysexRecus[MsgNombre].TailleSysex ,
    							SysexRecus[MsgNombre].SysexInfo,
    							" ",
    							sData)
     
    	CAS MM_MIM_ERROR 	//TODO: handle (message to trigger exception?) };
    		PostMessage( HandleFenPrinc, WM_MIM_ERROR, dwInstance, dwParam1)
     
    	CAS MM_MIM_LONGERROR
    		PostMessage( HandleFenPrinc, WM_MIM_LONGERROR, dwInstance, dwParam1)
     
    FIN     //{ SELON wMsg }
    La CallBack fonctionne bien
    La Partie MIM_DATA (Msg 963) est décodée correctement (Identique à MidiOX)
    Je récupere le meme nombre de sysex que MidiOX ou BOME SenX et dans le même ordre
    Mais
    Je n'arrive pas à décoder la Data

    ******************************************************************************************************
    5- Ma procédure DoSysExData qui traite les infos reçues
    ******************************************************************************************************
    C'est là que je patauge dans les octets , les bits

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    //-------------------------------------------------------------------------------------------------------
    PROCEDURE DoSysExData(CodeMsg,Parametre1,Parametre2,BitStatut)
    //-------------------------------------------------------------------------------------------------------
    //  INFOS SUR LES STRUCTURES UTILISEES
    // SysExData est une structure
    //	NumSysex		est un entier
    //	MsgCode			est un entier systeme						// Code Msg : 963, 964
    //	SysExHeader 		est un MIDIHDR							// le MIDIHDR qui entregistre les infos relative au message Midi
    //	Param1 			est un entier sans signe sur 4 octets				// dwParam1 recu dans la CallBack
    //	Param2 			est un entier systeme						// dwParam2 recu dans la CalBack
    //	TailleSysex 		est un entier systeme						// = SysExHeader.ByteRecorded
    //	DataPtr			est un entier systeme						// = SysExHeader.DataPtr : Pointeur Data du Sysex = normalement doit pointer sur SysexInfo
    //	SysexInfo		est un entier sans signe sur 4 octets				// Contenu data de SysExHeader.DataPtr 
    //	Sysexchaine 		est un tableau de BufferInSize entier sans signe sur 1 octet 	// Contient la data du pointeur SysExHeader.DataPtr en tableau de n octets
    //	SysexTraduit 		est une chaine							// contient la chaine sysex finale sous forme F0 43 10 4C 08 00 1E 2A F7
    //	NumeroPartition 	est un entier							// contiendra le numéro de partition récupéré dans un sysex
    //FIN
     
    // SysexRecus est un tableau de NumSysexBuffers SysExData
     
     
    contenu 	est un tableau de 10 caractères
    i 		sont un entiers
    LeSysex 	est une chaîne  = "Sysex décodé"
     
    POUR i = 1 _A_ NumSysexBuffers
    	SI SysexRecus[i].SysExHeader.BytesRecorded <> 0	
    		// en VB -> Marshal.Copy(MidiInHdr(i).DataPtr, InSysex, 0, BufferInSize)   
    		Transfert(&contenu,&SysexRecus[i].SysexInfo,SysexRecus[i].SysExHeader.BytesRecorded)		
    		SysexRecus[i].DataPtr		= SysexRecus[i].SysExHeader.DataPtr    
    		SysexRecus[i].TailleSysex	= SysexRecus[i].SysExHeader.BytesRecorded			
     		SysexRecus[i].SysexInfo		= &contenu		// Il faudrait décoder ce que j'ai reçu dans SysexRecus[i].SysexInfo
     		SysexRecus[i].MsgCode		= CodeMsg
     		SysexRecus[i].Param1		= Parametre1
     		SysexRecus[i].Param2		= Parametre2
     		SysexRecus[i].StatusByte	= BitStatut
     		SysexRecus[i].NumeroPartition	= 0			// Pour le moment. Lorsque le décodage du sysex sera fait il faudra mettre le N° de partition 
    		//SysexRecus[i].Sysexchaine	= "Le sysex décodé"	// après avoir passé SysexRecus[i].SysexInfo dans une moulinette ? dans SysToString	
    		//SysexRecus[i].SysexTraduit	= "Je sais pas"		// Contiendrait une valeur intermediaire si c'est nécessaire
    		//SysexRecus[i].SysExHeader.BytesRecorded = 0		// La data a été traitée									
    	FIN		
    FIN
     
    RENVOYER LeSysex
    *********************************************************************************************
    MA procédure de décodage SYSEX
    *********************************************************************************************
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    //--------------------------------------------------------------------------------------------------------------------
    PROCEDURE SysExToString(SysExBody est une chaîne)
    //--------------------------------------------------------------------------------------------------------------------
    ResultatDecode	est une chaîne
    MaxLong		est un entier
    CompleteBit	est une chaîne
     
     
    //'Un message complet SYSEX a été reçu dans le' MIDI Input.Buffer '' 
    // Maintenant, nous allons mettre le premier octet de données de SYSEX message dans le ResultatDecode
    ResultatDecode	= NumVersHexa(Caract(Gauche(SysExBody, 1))) 				// En VB -> DisplayBufferString(SysexListCount) = Hex(Asc(Left(MIDIInput1.Buffer, 1)))	
    MaxLong		= Taille(SysExBody)
    // Maintenant, nous allons passer à travers la partie restante de la
    // Message sysex et qu'elle soit prête à afficher. Nous serons alors en mesure
    // Pour afficher et modifier le message sysex complet.
    POUR n = 2 A MaxLong
     
    	CompleteBit = NumVersHexa(Caract(Milieu(SysExBody, n, 1)))			// En VB ->	CompleteBit = Hex(Caract(Milieu(MIDIInput2.Buffer, n, 1)))		
     
    	SI NumVersHexa(Caract(Milieu(SysExBody, n, 1))) < 10 ALORS			// En VB ->	SI Hex(Caract(Milieu(MIDIInput2>>Buffer, n, 1))) < 10 ALORS
    		CompleteBit = "0" + CompleteBit
    	FIN		 
    	ResultatDecode = ResultatDecode + " " + CompleteBit
    	CompleteBit = ""
    FIN
     
    SI ResultatDecode = "F0 43 10 4C 02 01 40 40 00 F7" ALORS				// A titre d'exemple
    	// ICI IL FAUT INSERER LE TRAITEMENT TOURNER PAGE
    FIN
     
    RENVOYER ResultatDecode
    Toutes les*données midi se présente sous la forme de*PmEvent*structures.
    Un message sysex est codé en*tant que séquence de*PmEvent*structures,
    chaque structure porteuse 4 octets du message, à*savoir que la première*PmEvent*porte l'octet d'état.

    champs de données
    PmMessage* message
    PmTimestamp* timestamp

    C'est défini comme àa dans PortMidi.h
    Code c : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    typedef struct {
        PmMessage      message;
        PmTimestamp    timestamp;
     } PmEvent;

    Dans ma structure j'ai défini SysexInfo est un entier sans signe sur 4 octets
    donc mon info est xxxxxxxx xxxxxxxx xxxxxxxx xxxxxxxx
    L'octet d'état est dans le premier Octet et ça doit être = F0 ?

    Exemple de mon premier Sysex
    msg = 964
    dwParam1 = 42859884
    dwParam2 = 11053
    Code Status = 96 en utilisant dwParam1_Statut = &dwParam1 & 0x000000FF Je devrais obtenir F0
    Pointeur Data = 42859956
    dwByteRecorded = 9
    SysexInfo = 49822744
    je devrais obtenir après décodage = F0 43 10 4C 08 00 1E 2A F7

    Le deuxieme sysex
    msg = 964
    dwParam1 = 42859972
    dwParam2 = 11058
    Code Status = 96 en utilisant dwParam1_Statut = &dwParam1 & 0x000000FF Je devrais obtenir F0
    Pointeur Data = 42860044
    dwByteRecorded = 9
    SysexInfo = 51207104
    je devrais obtenir après décodage = F0 43 10 4C 08 00 20 00 F7

    Le sysex qui m'intéresse
    msg = 964
    dwParam1 = 42865516
    dwParam2 = 11544
    Code Status = 232 en utilisant dwParam1_Statut = &dwParam1 & 0x000000FF Je devrais obtenir F0
    Pointeur Data = 42865588
    dwByteRecorded = 9
    SysexInfo = 51576120
    je devrais obtenir après décodage = F0 00 00 01 09 F7 qui me donnera N° de partition = 19 Question: Comment je fais pour avoir 19 ?

    Le probleme vient peut-être d'une mauvaise utilisation des types de données pour
    dwParam1 est un entier sans signe sur 4 octets,
    DwParam2 est un entier système
    DataPtr est un entier système // = SysExHeader.DataPtr : Pointeur Data du Sysex = normalement doit pointer sur SysexInfo
    SysexInfo est un entier sans signe sur 4 octets // Contenu data de SysExHeader.DataPtr Normalement ça pointe sur une Chaine ?

    A mon avis il y a un probleme de pointeur et ou de Data et peut-être même des annomalies dans la définition des types de Données
    La Data ne correspond pas, telle qu'elle est, a quelque chose de décodable

    J'espère avoir été assez clair pour que vous puissiez m'aider.

  17. #17
    Membre à l'essai
    Homme Profil pro
    RETRAITE
    Inscrit en
    Février 2012
    Messages
    35
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : RETRAITE

    Informations forums :
    Inscription : Février 2012
    Messages : 35
    Points : 18
    Points
    18
    Par défaut
    Bonjour,
    Je reviens sur mon probleme de sysex.

    Je récupere bien le bon nombre de sysex avec les bonnes longueurs dans mon tableau de 300 structures MidiHDR

    je recupere les données avec Transfert(&PointeurdeMidiHdr, ZoneResultat,LongueurOctectrecus)

    Je n'arrive pas à décoder le contenu de ZoneResultat

    Quel doit etre le Format de ZoneResultat ? : une chaine, une chaine ASCII, ?
    Le plus souvent les sysex recus font 9 octets.

    si j'affiche ce contenu en decimal c'est du genre 52454587
    si j'affiche en ASCII ce sont des caracteres non imprimables
    J'ai essaye de mettre chaque octet dans un tableau de n Octets sans signe
    mais j'arrive à rien
    J'ai trouvé ce code en langage C
    Code c : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    /*! \brief Decode System Exclusive messages.
     SysEx messages are encoded to guarantee transmission of data bytes higher than
     127 without breaking the MIDI protocol. Use this static method to reassemble
     your received message.
     \param inSysEx The SysEx data received from MIDI in.
     \param outData    The output buffer where to store the decrypted message.
     \param inLength The lenght of the input buffer.
     \return The lenght of the output buffer.
     @see encodeSysEx @see getSysExArrayLength
     Code inspired from Ruin & Wesen's SysEx encoder/decoder - http://ruinwesen.com
     */
    unsigned decodeSysEx(const byte* inSysEx, byte* outData, unsigned inLength)
    {
        unsigned count  = 0;
        byte msbStorage = 0;
     
        for (unsigned i = 0; i < inLength; ++i)
        {
            if ((i % 8) == 0)
            {
                msbStorage = inSysEx[i];
            }
            else
            {
                outData[count++] = inSysEx[i] | ((msbStorage & 1) << 7);
                msbStorage >>= 1;
            }
        }
        return count;
    }
    mais je sais pas trop comment transposer ça en WINDEV

    Merci d'avance

  18. #18
    Membre à l'essai
    Homme Profil pro
    RETRAITE
    Inscrit en
    Février 2012
    Messages
    35
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : RETRAITE

    Informations forums :
    Inscription : Février 2012
    Messages : 35
    Points : 18
    Points
    18
    Par défaut
    Bonjour,

    J'ai avancé sur le sujet : Je décode correctement les sysex reçus

    Ci-dessous les structures et les codes qui fonctionnent

    1- STRUCTURE MIDIHDR

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
     
    //******************************************************************************************************************************
    // MIDIIN Structure : MIDIHDR
    //******************************************************************************************************************************
    //LPSTR      lpData; 
    //DWORD      dwBufferLength; 
    //DWORD      dwBytesRecorded; 
    //DWORD_PTR  dwUser; 
    //DWORD      dwFlags; 
    //struct midihdr_tag * lpNext; 
    //DWORD_PTR  reserved; 
    //DWORD      dwOffset; 
    //DWORD_PTR  dwReserved[4];
     
     
    MIDIHDR est une Structure
    	DataPtr 			est un entier sans signe 							// Address of MIDI data entier systeme
    	BufferLength 		est un entier sans signe sur 4 octets	  						// Size of the buffer
    	BytesRecorded 		est un entier sans signe sur 4 octets	  						// Actual amount of data in the buffer. This value should be less than or equalto the value given in the dwBufferLength member
    	User 				est un entier sans signe sur 8 octets	      					// Custom user data
    	Flags 				est un entier sans signe sur 4 octets	  						// Flags giving information about the buffer
    	Reserved1 			est un entier sans signe sur 8 octets	  						// Reserved - do not use
    	Reserved2 			est un entier sans signe sur 8 octets	 						// Reserved - do not use
    	CallbackOffset 		est un entier sans signe sur 4 octets							//Type C : DWORD offset into Buffer WHEN callback is performed
    	Reserved3 			est un entier sans signe sur 8 octets											//Type C : DWORD
    	Reserved4 			est un entier sans signe sur 8 octets											//Type C : DWORD
    	Reserved5 			est un entier sans signe sur 8 octets											//Type C : DWORD
    	Reserved6 			est un entier sans signe sur 8 octets											//Type C : DWORD
    	//Reserved7 			est un entier système											//Type C : DWORD
    	//Reserved8 			est un entier système											//Type C : DWORD
    	//Reserved9 			est un entier système											//Type C : DWORD
    	//Reserved10 			est un entier système											//Type C : DWORD
    FIN
     
    SysExData est une Structure
    	NumSysex			est un entier
    	MsgCode 			est un entier système											// Code Msg : 963, 964
    	SysExHeader 		est un MIDIHDR 													// le MIDIHDR qui entregistre les infos relative au message Midi
    	Param1 				est un entier sans signe sur 8 octets							// dwParam1 recu dans la CallBack
    	Param2 				est un entier système											// dwParam2 recu dans la CalBack
    	TailleSysex 		est un entier système  											// = SysExHeader.ByteRecorded
    	DataPtr 			est un entier sans signe										// = SysExHeader.DataPtr : Pointeur Data du Sysex = normalement doit pointer sur SysexInfo				
    	SysexBuffer 		est un Buffer sur SysExSize										// Contenu data de SysExHeader.DataPtr 
    	SysexTraduit 		est une chaîne 													// contient la chaine sysex finale sous forme F0 43 10 4C 08 00 1E 2A F7
    	NumeroPartition 	est un entier 													// contiendra le numéro de partition récupéré dans un sysex
     
    FIN
    SysexRecus 				est un tableau de NumSysexBuffers SysExData						// Contient toutes les infos SYSEX à traiter
    2- Ma FONCTION CALLBACK

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
     
    //-------------------------------------------------------------------------------------------------------------
    PROCEDURE MidiHandlerBack(INMidi est un entier,wMsg est un entier système,dwInstance,dwParam1,DwParam2)
    //-------------------------------------------------------------------------------------------------------------
    //PROCEDURE MidiHandlerBack( stINMidi est un entier,wMsg est un entier systeme,nsyDwInstance est un entier systeme,dwParam1 est un entier système,DwParam2 est un entier système)
    //Parameters
    //HMIDIIN   hMidiIn,
    //UINT      wMsg,
    //DWORD_PTR dwInstance,
    //DWORD_PTR dwParam1,
    //DWORD_PTR dwParam2
    //hMidiIn    : Handle to the MIDI input device.
    //wMsg       : MIDI input message.
    //dwInstance : Instance data supplied with the*midiInOpen*function.
    //dwParam1   : Message parameter.
    //DwParam2   : Message parameter.
    //------------------------------------------
    //MM_MIM_LONGDATA
    //	wParam = (WPARAM) 	hInput 
    //	lParam = (LPARAM) 	lpMidiHdr
    //		Paramètres
    //			hInput 		:Manipuler le dispositif d'entrée MIDI qui a reçu les données.
    //			lpMidiHdr 	:Pointeur vers une*MIDIHDR*structure de l'*identification de*la mémoire tampon.
     
    dwParam1_Statut 		est un entier système
    dwparam1_Data1 			est un entier système
    dwparam1_Data2 			est un entier système
    savparam1 				est un entier sans signe sur 4 octets
    InfoCallBackHexa 		est une chaîne
     
    sStatut est une chaîne
    sInfo1 est une chaîne
    sInfo2 est une chaîne
     
    sData 					est  chaînes ASCIIZ de SysExSize 
    sData1 					est une chaîne
     
    m 						est un tableau de 3 entiers sur 1 octet 			// en VB -> Dim m(2) As Byte
    b 						est un entier système
    Chan 					est un entier système 								// Canal midi
     
    SELON wMsg
    	CAS MM_MIM_DATA
    		savparam1 = dwParam1 												// pour ne pas détruire wParam dans notre processus
    		POUR i  = 1 _A_ 3
    			b = savparam1 & 0xFF 											// En VB -> Dim _b As Byte = CByte(wParam2 And &HFF)
    			m[i] = b
    			savparam1 = bitDécaleDroite(DwParam2,8)							// wParam2 >> 8
    		FIN
     
    		SELON dwParam1
    			CAS 254
     
    			AUTRE CAS
    				MsgMIM_Data++ 												// On compte les MIM_DATA
    				InfoCallBackHexa  =  EntierVersHexa(dwParam1,2)				// Valeur Hexa
    				i est un entier
    				j est un entier= ChaîneOccurrence(InfoCallBackHexa," ")
    				k est entier
     
    				// Inverser la chaine Hexa			
    				POUR i = j _A_ 1 PAS -1
    					k = (i*3)+1
    					sData1 = sData1 + Milieu(InfoCallBackHexa,k,2) + " "
    				FIN
     
    				dwParam1_Statut 	= dwParam1 & 0xFF								// En Vb -> Statusbyte: = midiMsg & 0xFF;                           EXTRAIT DU BYTE STATUS (QUEL TYPE DE MIDI MESSAGE EST?)			
    				Chan 				= (dwParam1_Statut & 0x0f) + 1					// Canal	
    				dwparam1_Data1 		= bitDécaleDroite(dwParam1,8) & 0xFF 			// CECI est LA VALEUR DATA1 = NOTE NOMBRE OU CC NOMBRE midi_slider_number: = (midiMsg >> 8) & 0xFF; 
    				dwparam1_Data2 		= bitDécaleDroite( dwParam1,16) & 0xFF 			// En VB -> midi_value: = (midiMsg >> 16) & 0xFF; VALEUR Data2 est NOTE VELEOCITY OU de LA VALEUR CC
    				sStatut = NumériqueVersChaîne(dwParam1_Statut, "02X")
    				sInfo1 	= NumériqueVersChaîne(dwparam1_Data1, "02X")	
    				sInfo2 	= NumériqueVersChaîne(dwparam1_Data2, "02X")	
    		FIN	
     
    	CAS MM_MIM_LONGDATA	// 964 ou 0x3C4
    		MsgNombre++		
    		sData 				= DoSysExData(wMsg,MsgNombre,dwParam1,DwParam2,dwParam1_Statut) 			// Traiter le sysex
    		SI	SysexRecus[MsgNombre].NumeroPartition <> 0 ALORS
    				SAI_NoPart = 	SysexRecus[MsgNombre].NumeroPartition
    				PartitionSysex = SysexRecus[MsgNombre].NumeroPartition	     // Je recupere l'info qui m'intéresse dans une variable globale
    		FIN
     
    	CAS MM_MIM_ERROR 	//TODO: handle (message to trigger exception?) };
    		PostMessage( HandleFenPrinc, WM_MIM_ERROR, dwInstance, dwParam1)
     
    	CAS MM_MIM_LONGERROR
    		PostMessage( HandleFenPrinc, WM_MIM_LONGERROR, dwInstance, dwParam1)
     
    FIN     //{ SELON wMsg }
     
    // Décodage des sysex
    PROCEDURE DoSysExData(CodeMsg,NumMsg,Parametre1,Parametre2,BitStatut)
    //------------------------------------------------------------------------------------------------------------------------------------
    //  INFOS SUR LES STRUCTURES UTILISEES
    // SysExData est une structure
    //	NumSysex			est un entier
    //	MsgCode 			est un entier systeme											// Code Msg : 963, 964
    //	SysExHeader 		est un MIDIHDR 													// le MIDIHDR qui entregistre les infos relative au message Midi
    //	Param1 				est un entier sans signe sur 4 octets							// dwParam1 recu dans la CallBack
    //	Param2 				est un entier systeme											// dwParam2 recu dans la CalBack
    //	TailleSysex 		est un entier systeme  											// = SysExHeader.ByteRecorded
    //	DataPtr 			est un entier systeme 											// = SysExHeader.DataPtr : Pointeur Data du Sysex = normalement doit pointer sur SysexInfo
    //	SysexInfo 			est un entier sans signe sur 4 octets 							// Contenu data de SysExHeader.DataPtr 
    //SysexInfo 			estune chaine ANSI
    //	Sysexchaine 		est un tableau de BufferInSize entier sans signe sur 1 octet 	// Contient la data du pointeur SysExHeader.DataPtr en tableau de n octets
    //	SysexTraduit 		est une chaine 													// contient la chaine sysex finale sous forme F0 43 10 4C 08 00 1E 2A F7
    //	NumeroPartition 	est un entier 													// contiendra le numéro de partition récupéré dans un sysex
    //FIN
     
    i,y,LaPart 	sont un entiers
    LeSysex 	est une chaîne
    i = NumMsg
     
     
    SI SysexRecus[i].SysExHeader.BytesRecorded <> 0	
     
    		//Transfert(&SysexRecus[i].SysexInfo,SysexRecus[i].SysExHeader.DataPtr,SysexRecus[i].SysExHeader.BytesRecorded)
     
    		Transfert(&SysexRecus[i].SysexBuffer,SysexRecus[i].SysExHeader.DataPtr,SysexRecus[i].SysExHeader.BytesRecorded)		// en VB -> Marshal.Copy(MidiInHdr(i).DataPtr, InSysex, 0, BufferInSize)   SysexRecus[nbSysex].SysExHeader      &TMidiInHdr[i].DataPtr
    		SysexRecus[i].DataPtr 					= SysexRecus[i].SysExHeader.DataPtr    
    		SysexRecus[i].TailleSysex 				= SysexRecus[i].SysExHeader.BytesRecorded			
     		SysexRecus[i].MsgCode 					= CodeMsg
     		SysexRecus[i].NumSysex					= NumMsg
     		SysexRecus[i].Param1 					= Parametre1
     		SysexRecus[i].Param2 					= Parametre2
     		SysexRecus[i].NumeroPartition 			= 0	
     		SysexRecus[i].SysexTraduit 				= BufferEnHexa(SysexRecus[i].SysexBuffer,SysexRecus[i].SysExHeader.BytesRecorded)
    		LeSysex = SysexRecus[i].SysexTraduit 												// La data a été traitée
    		LaPart = ChercheNumPartDansSysex(LeSysex,"00")  // Verifier si contient un N° de partition : renvoie 0 si pas 
    		SysexRecus[i].NumeroPartition = LaPart
    FIN		
    RENVOYER LeSysex
     
    //--------------------------------------------------------------------------------------
    PROCEDURE BufferEnHexa(InfoBuffer est un Buffer,DimInfo)
    //--------------------------------------------------------------------------------------
    Res_Hexa 	est une chaîne 
    i  est un entier
    TabDec est un tableau de DimInfo chaînes
    POUR i = 1 _A_ DimInfo 
    	TabDec[i] = Asc(InfoBuffer[[i]])
    FIN
     
    //Res_Decimal1 = hexres
    POUR i  = 1 _A_ DimInfo 
    	Res_Hexa += NumériqueVersChaîne(Asc(InfoBuffer[[i]]), "02X") + " "
    FIN
    RENVOYER Res_Hexa
    Il reste donc

    Sortir Proprement de la Callback avec le N° de partition (Variable globale PartitionSysex chargée dans la callback fonction) en sachant que j'ai lancé le MidiStart depuis le programme principal avec

    TâcheParallèleExécute(StartMidiIn)

    Le programme principal devra faire
    Stopper le thread
    AffichePartition(PartitionSysex)
    Relancer le thread
    dès que la Callback a trouvé un N° de partition

    Merci d'avance

  19. #19
    Membre à l'essai
    Homme Profil pro
    RETRAITE
    Inscrit en
    Février 2012
    Messages
    35
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : RETRAITE

    Informations forums :
    Inscription : Février 2012
    Messages : 35
    Points : 18
    Points
    18
    Par défaut
    Bonjour,

    J'ai résolu le probleme de la capture et le décodage des Messages Sysex

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [OL-2003] Icône inconnue dans les messages reçus
    Par xdoreau dans le forum Outlook
    Réponses: 1
    Dernier message: 15/08/2009, 14h58
  2. [Indy] Vider les messages reçus
    Par bib34690 dans le forum Composants VCL
    Réponses: 6
    Dernier message: 27/01/2008, 15h24
  3. Réponses: 1
    Dernier message: 15/05/2007, 11h35
  4. [MySQL] il n'affiche pas les messages reçus
    Par schats dans le forum PHP & Base de données
    Réponses: 2
    Dernier message: 24/04/2007, 10h33

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo