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
Öhh, jos sen pituuden jotenkin saa, ja sitten se vertailee sitä pituutta ja sitten kun se on lopussa niin loop?
Lueppas tämä:
http://www.geocities.com/smigman.geo/mci/mid.
Juu, oppaasta löyty ratkasu. Kiitokset!
Edit: Eh... tai ei sittenkään :(, mutta ratkaisin jo ongelmani.
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 :)
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.
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 :)
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).
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...
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
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ä!
[offtopic]
miten muuten voi katsoa kuinka pitkä mp3-tiedosto on, siis tyyliin 00:10 sek esim...?
[/offtopic]
Siihen tarkoitukseen löytyy pienellä vaivalla netistä valmiita ActiveX komponenttejä ilmaiseksi.
Aihe on jo aika vanha, joten et voi enää vastata siihen.