Olen tekemässä eräänlaista resurssien tutkimis ohjelmaa, jonka pitäisi soittaa midi-ääni, kun se on valittu File-listasta. Ongelmana on vain se, että jostain kummallisesta syystä, midi ei soi!
Olen tehnyt havainnon, että midi soi, mikäli se sijaitsee samassa kansiossa kuin ohjelma ja sen polku on ilman kansioita (esim. "Biisi.Mid" eikä "D:\Musiikki\Biisi.Mid".
Olen kokeillut kahdella erilaisella midi funktiolla, joista toisen löysin täältä ja toisen täältä: http://www.freevbcode.com/ShowCode.asp?ID=459
**Soitto kontrolli Private Sub Command1_Click() PlayMidiFile (PlayMidi) End Sub
** Midi Funktio 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 Public Function PlayMidiFile(MidiFile As String) As Boolean 'MidiFile = File's Full Path 'Returns: True if successful, false otherwise Dim lRet As Long On Error Resume Next If Dir(MidiFile) = "" Then Exit Function 'Stop any currently playing .mid lRet = mciSendString("stop midi", "", 0, 0) lRet = mciSendString("close midi", "", 0, 0) 'Play lRet = mciSendString("open sequencer!" & MidiFile & " alias midi", "", 0, 0) lRet = mciSendString("play midi", "", 0, 0) PlayMidiFile = (lRet = 0) End Function Public Function StopMidi() As Boolean 'Stops midi from playing 'Returns: True if successful, false otherwise Dim lRet As Long On Error Resume Next 'Stop any currently playing .midi lRet = mciSendString("stop midi", "", 0, 0) StopMidi = (lRet = 0) lRet = mciSendString("close midi", "", 0, 0) End Function
** File-valintalaatikon koodi Private Sub File2_Click() PlayMidi = File2.Path & ".\" & File2.FileName End Sub
Itse en näe missään kohti ongelmia..
PS. Ei mitään kommentteja koodaustavastani. Jokainen meistä tekee sen omalla tavallaan.
Poista noi ensiksi On Error Resume Next -käskyt niin VB kertoo mahdollisesti mikä on vikana eikä vain skippaa virhettä.
Lisäksi voit tarkistaa että onnistuiko midin soitto lukemalla PlayMidiFile:n boolean palautus-arvon, joka on tosi kun soitto onnistui ja epätosi kun soitto epäonnistui.
Private Sub Command1_Click() If(PlayMidiFile (PlayMidi) = false) MsgBox "Fail!" End Sub
Lisäksi tutkaile vielä Antti Laaksosen koodivinkki MIDI-tiedoston soittaminen
Onko hakemistopolussa tai tiedoston nimessä välilyöntejä?
Kokeile silloin kirjoittaa funktion PlayMidiFile alkuun näin:
Dim nimi As String * 500 Dim pituus As Integer pituus = GetShortPathName(MidiFile, nimi, 500) MidiFile = Left(nimi, pituus)
Lisäksi tarvitset tämän määrittelyn:
Private Declare Function GetShortPathName Lib "kernel32" Alias _ "GetShortPathNameA" (ByVal lpszLongPath As String, _ ByVal lpszShortPath As String, ByVal cchBuffer As Long) As Long
Katos vain, lähti toimimaan tuolla Antin antamalla ohjeella.
@petrinm, myös sinun ohjeestasi oli apua. Soitto ei jostain syystä onnistunut ja tuo Fail Messageboxi pomppasi esiin.
Aihe on jo aika vanha, joten et voi enää vastata siihen.