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 SubItse 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 SubLisä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.