Compiti per le vacanze ...prima guardare il codice poi spiego
Private Declare Function mciSendString Lib "winmm.dll" Alias "mciSendStringA" (ByVal lpstrCommand As String, ByVal lpstrReturnString As String, ByVal uReturnLength As Long, ByVal hwndCallback As Long) As Long
Private Declare Function GetShortPathName Lib "kernel32" Alias "GetShortPathNameA" (ByVal lpszLongPath As String, ByVal lpszShortPath As String, ByVal cchBuffer As Long) As Long
Private Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long)
Dim m_nomeCortoDos As String
Private Sub set_tempo(NewValue)
Dim ret As Long
ret = mciSendString("set MIDI tempo " & NewValue, 0, 0, 0)'imposta il tempo di metronomo del sequencer midi
End Sub
Private Sub play()
ret = mciSendString("OPEN " & m_nomeCortoDos & " ALIAS MIDI", ByVal 0&, ByVal 0&, ByVal 0&)
ret = mciSendString("PLAY MIDI FROM 0 TO 1000", ByVal 0&, ByVal 0&, ByVal 0&)
'ret = mciSendString("PLAY MIDI", ByVal 0&, ByVal 0&, ByVal 0&)
End Sub
Private Sub Command1_Click()
Dim buffer As String
buffer = Space(255)
cd1.ShowOpen 'non metto filtri ma .... aprire un file midi...
file_midi = cd1.FileName
ret = GetShortPathName(file_midi, buffer, 255)'devo usare questa perche se passo alla mci una stringa con degli spazi non carica il file
m_nomeCortoDos = Left(buffer, ret)
play
'Sleep 110 'occhio a questa istruzione che pare na boiata ma.....
set_tempo 300
End Sub
Private Sub Command2_Click()
set_tempo 300
End Sub
Private Sub Form_Unload(Cancel As Integer)
ret = mciSendString("CLOSE MIDI", ByVal 0&, ByVal 0&, ByVal 0&)
End Sub
Allora il codice sopra non fa altro che aprire un file midi e suonarlo con l'interfaccia mci, in più imposta il tempo di esecuzione del sequencer midi (sub set_tempo). Il valore di set_tempo l'ho impostato a 300 in modo che sia subito riconoscibile che il midi cambia tempo (nessun brano ha un tempo di metronomo a 300 o almeno pochissimissimissimi...è molto veloce).Tutto funziona ma....se la sub set_tempo la chiamiamo a brano iniziato il tempo cambia e tutto è OK
ma se set_tempo la chiamiamo subito dopo la routine play (vedi sub command1_click in fondo)il sistema non riesce in tempo a eseguire l'istruzione..è si dico che non fa in tempo perche se si prova a scommentare la sleep (tra play e set_tempo in command1_click) il sistema riesce e il tempo cambia.il valore passato alla sleep potrebbe cambiare sul vostro computer...
E sapete che cosa c'è di strano che ciò avviene solo su 2000 e XP perche sul 98 non ci sono questi problemi di ritardo ma l'istruzione set_tempo viene eseguita e 'letta' senza nessun problema.
A un ultima cosa il problema si veriffica solo con:
ret = mciSendString("PLAY MIDI FROM 0 TO 1000", ByVal 0&, ByVal 0&, ByVal 0&)'il 1000 (la fine dell'esecuzione e non necessariamente del brano) potete cambiarlo ma più o meno un brano midi dovrebbe essere lungo abbastanza.....
perchè se uso (provare a commantare l'una e a scommentare l'altra)senza indicazioni di inizio e fine
ret = mciSendString("PLAY MIDI", ByVal 0&, ByVal 0&, ByVal 0&)
la cosa funziona.
Non so se mi sono spiegato bene.....mah sti computer.![]()
Buon Natale a tutti..
Ciao![]()