Visualizzazione dei risultati da 1 a 4 su 4
  1. #1

    [VB6] mcisendstring e XP

    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

  2. #2

    Re: [VB6] mcisendstring e XP

    Originariamente inviato da nivio
    ...prima guardare il codice poi spiego
    ... prima formattare il codice poi leggo
    Vascello fantasma dei mentecatti nonchè baronetto della scara corona alcolica, piccolo spuccello di pezza dislessico e ubriaco- Colui che ha modificato l'orribile scritta - Gran Evacuatore Mentecatto - Tristo Mietitore Mentecatto chi usa uTonter danneggia anche te

  3. #3
    Scusa xe ma interessa anche me

    codice:
    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

  4. #4
    Originariamente inviato da raffaeu
    Scusa xe ma interessa anche me
    Fai pure anzi..

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.