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 SubJa 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.