Kirjautuminen

Haku

Tehtävät

Keskustelu: Ohjelmointikysymykset: VB6: Ongelmia midin soitossa

Isopaha [27.07.2008 13:35:37]

#

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.

petrinm [27.07.2008 14:27:31]

#

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

Antti Laaksonen [27.07.2008 22:36:09]

#

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

Isopaha [28.07.2008 13:51:24]

#

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.

Vastaus

Aihe on jo aika vanha, joten et voi enää vastata siihen.

Tietoa sivustosta