Kirjautuminen

Haku

Tehtävät

Keskustelu: Ohjelmointikysymykset: VB6: Midit soimaan loputtomasti

Sivun loppuun

Gaxx [05.06.2004 13:50:53]

#

Käytän mciSendString API-kutsua midien soittamiseen, ja haluaisin musiikin alkavan alusta kun se loppuu. Timerin intervalli ei riitä, vaan se heittää overflow erroria. Onko tuossa API-kutsussa jokin sellainen parametri, jolla saisi määriteltyä midin jatkumaan loputtomasti vai pitääkö käyttää jotain muuta tekniikkaa(kuten esimerkiksi päivämäärä kikkailua)?

Edit: typo

Bill Keltanen [05.06.2004 15:38:11]

#

Öhh, jos sen pituuden jotenkin saa, ja sitten se vertailee sitä pituutta ja sitten kun se on lopussa niin loop?

Antti [05.06.2004 16:43:45]

#

Lueppas tämä:
http://www.geocities.com/smigman.geo/mci/mid.html

Gaxx [05.06.2004 17:19:54]

#

Juu, oppaasta löyty ratkasu. Kiitokset!

Edit: Eh... tai ei sittenkään :(, mutta ratkaisin jo ongelmani.

nomic [06.06.2004 17:37:34]

#

oma tekniikka olisi ehkä että aluksi luetaan midin pituus
laitetaan se muistiin
ja kun se aika on loppu käynnistetään midi uudestaan jne...
en tiedä onko tohon parempaa vaihtoehtoa mutta näin itsetekisin... mutta varmasti on järkevämpiäkin vaihtoehtoja :)

Gaxx [06.06.2004 21:26:24]

#

nomic kirjoitti:

oma tekniikka olisi ehkä että aluksi luetaan midin pituus
laitetaan se muistiin
ja kun se aika on loppu käynnistetään midi uudestaan jne...
en tiedä onko tohon parempaa vaihtoehtoa mutta näin itsetekisin... mutta varmasti on järkevämpiäkin vaihtoehtoja :)

Siis tollai ajattelin tietty heti alkuun tehdä sen, mut sitten tuli vastaan, ettei timerin intervalli riittänyt. Pientä kikkailua ja sillä selvittiin.

nomic [06.06.2004 23:58:16]

#

jos ei intervalli riitä niin eikös silloin voisi laittaa lukua johonkin long-muuttujaan ja laittaa timerin intervalli pyörimään alusta ja lisämään se taas siihen samaan muuttujaan ja kun muuttujan arvo on jonkin verran niin sitten uusiksi tai jotain...
tai sitten laittaa kolme timeria
yksi laskee sekuntit, toinen minuutit ja kolmas kymmenesosat jne...
noh hyvä kuiteskin että löysit ratkaisun mutta aina kannattaa miettiä mikä on paras vaihtoehto :)

Antti [07.06.2004 10:29:23]

#

Tuossa oppaassa jonka linkin laitoin (lukutaito kunniaan!!!) nimenomaan selitetään kuinka timeri laitetaan tutkimaan mciSendStringin "stopped"- tilaa jonka toteutuessa soitto aloitetaan alusta.

Timerille ei tarvitse tehdä mitään ylimääräisiä looppeja - laitat vain sen tutkimaan kyseistä tilaa vaikka sekunnin (1000 ms) välein. Tällöin soitto on maksimissaan sekunnin hiljaa mciSendStringin tilan vaihdon nopeudesta riippuen (sehän ei vauhdikkaimpia rajapintoja ole).

Gaxx [07.06.2004 11:47:23]

#

Antti: Ensinnäkin mainittakoon, että englannin taitoni ei ole mitenkään mahtava(lukiotasolla 5). Kuitenkin mielestäni ymmärsin mitä siellä sanottiin. En kuitenkaan saanut lukuisista yrityksistäni huolimatta hommaa toimimaan oppaasta ronkkimallani tiedolla. Jos nyt en väärin kääntänyt niin sielä sanotaan, että timer controllin PITÄISI huomata kun midi loppuu. Sinne kun sitten sijoittaa jotain play käskyn tapaista niin pitäs alottaa alusta.(tätä kirjoittaessani kyllä ei tunnu kovin vakuuttavalta)

Lisäksi tuli huomattua, että vb:n timer on ihan buginen tai jotain... Pistin timerin intervalliksi 1000 ja komennoksi pysäyttää midi ja sitten saman tien soittaa sitä kohdasta 0. Eipä toiminut niin kuin olisin olettanut vaan se soitti sen loppuun asti(midillä on pituutta sentään yli 2min) ja aina kun suljin ohjelman niin se tiletti(ja windowsin midisysteemi kans) --> reboot.

Täten olisi ihan kiva, jos joku viitsisi pistää esimerkkikoodin, kuinka tuo ko. asia tehdään. Kiitos :)

Edit: Hups... :) Ei se timer mitään bugittanutkaan, vaan MINÄ :D again...

Antti [08.06.2004 12:45:11]

#

Ei tämä nyt oikeasti voi nyt olla liian vaikeaa:

Tässä on ainakin se sama tehtynä MMC:llä...

Laita lomakkeelle:
Timer Control, jonka nimeksi: Timer1,
Microsoft Multimedia Control, jonka nimeksi: MMControl1
Microsoft CommonDialog, jonka nimeksi: CommonDialog1
TextBox, jonka nimeksi: txtFile
Kaksi painiketta (Button Control)joiden nimiksi: cmdFile, cmdPlay

Lomakkeelle seuraava koodi:

Private Sub cmdFile_Click()
    CommonDialog1.ShowOpen
    Me.txtFile.Text = CommonDialog1.FileName
End Sub

Private Sub Form_Load()
    ' Prepare the MCI control for WaveAudio.
    MMControl1.Notify = False
    MMControl1.Wait = True
    MMControl1.Shareable = False
    MMControl1.DeviceType = "Sequencer"
    MMControl1.Visible = False

    Timer1.Enabled = False
    Timer1.Interval = 500

    cmdPlay.Caption = "Play"
    cmdFile.Caption = "Open"

End Sub

' Avaa laite ja soita
Private Sub cmdPlay_Click()
    If Timer1.Enabled Then
        Timer1.Enabled = False
        cmdPlay.Caption = "Play"

        'Sulje laite.
        MMControl1.Command = "Close"
    Else
        Timer1.Enabled = True
        cmdPlay.Caption = "Stop"

        ' Aseta tiedoston nimi
        MMControl1.FileName = txtFile.Text

        ' Avaa MCI laite.
        MMControl1.Wait = True
        MMControl1.Command = "Open"
    End If
End Sub

Private Sub Timer1_Timer()
    ' Tarkista MMC-kontrollin tila
    If MMControl1.Mode = mciModeStop Then
        ' Kontrolli on pysähtynyt soita se uudelleen.
        MMControl1.Wait = True
        MMControl1.Command = "Prev"
        MMControl1.Command = "Play"
    End If
End Sub

Ja tässä sama mciSendStringillä

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

Dim RetString As String * 256

Dim strFile As String
Dim lFileLength As Long
Dim lPlayLength As Variant

Private Sub cmdOpen_Click()
    CommonDialog1.ShowOpen
    txtFile.Text = CommonDialog1.FileName
    OpenMidi (CommonDialog1.FileName)
End Sub

Private Sub cmdPlay_Click()
    Select Case cmdPlay.Caption
    Case "Play"
        cmdPlay.Caption = "Stop"
        PlayMidi
    Case "Stop"
        cmdPlay.Caption = "Play"
        StopMidi
    End Select
End Sub

Public Sub OpenMidi(sFile As String)

    Dim sShortFile As String * 67
    Dim lResult As Long
    Dim sError As String * 255

    lResult = GetShortPathName(sFile, sShortFile, _
                               Len(sShortFile))
    sFile = Left$(sShortFile, lResult)

    lResult = mciSendString("open " & sFile & _
    " type sequencer alias mcitest", ByVal 0&, 0, 0)

    lResult = mciSendString("status mcitest length", RetString, Len(RetString), 0)
    lFileLength = CLng(RetString)

End Sub

Public Sub PlayMidi()
    Dim lResult As Integer
    Dim sError As String * 255
    lResult = mciSendString("play mcitest", ByVal 0&, 0, 0)
    Timer1.Enabled = True

End Sub
Public Sub StopMidi()
    Dim lResult As Integer
    Dim sError As String * 255
    lResult = mciSendString("stop mcitest", "", 0&, 0&)
    Timer1.Enabled = False

End Sub

Private Sub Form_Unload(Cancel As Integer)
    lResult = mciSendString("close mcitest", "", 0&, 0&)
    Timer1.Enabled = False
End Sub

Private Sub Timer1_Timer()
    lResult = mciSendString("status mcitest position", RetString, Len(RetString), 0)
    lPlayLength = CLng(RetString)
    Label1.Caption = lPlayLength & ":" & lFileLength
    If lPlayLength >= lFileLength Then
        lResult = mciSendString("seek mcitest to start", "", 0&, 0&)
        lResult = mciSendString("play mcitest", "", 0&, 0&)
    End If
End Sub

... ja lasku tulee perässä hyvä Gaxx

Edit: typoja ja turhia v...luita pois ;D

Gaxx [08.06.2004 13:54:07]

#

ARGH! Kyllähän tuo olisi ollut ihan helppoa, jos olisi tiennyt, että tuollainen status komentokin on olemassa mideissä :| Tuon koodin nähtyäni kattelin sitten, että mistä olit tuon statuksen repässy niin waveista ainakin löyty. En olisi kyllä arvannut, että joitain wavin komentoja voi käyttää mideissä(siis esim tota statusta). Miksi sitä ei oltu laitettu mukaan midien komentolistaan? Kysympähän vain!

Sain toimimaan, ja tuhannet kiitokset Antille vaivan näöstä!

miiro [09.06.2004 19:57:52]

#

[offtopic]
miten muuten voi katsoa kuinka pitkä mp3-tiedosto on, siis tyyliin 00:10 sek esim...?
[/offtopic]

Antti [10.06.2004 13:13:43]

#

Siihen tarkoitukseen löytyy pienellä vaivalla netistä valmiita ActiveX komponenttejä ilmaiseksi.


Sivun alkuun

Vastaus

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

Tietoa sivustosta