PLAY on yksi niistä komennoista, jotka ovat QBasicissa mutta eivät Visual Basicissa. Tässä on lähes 100% yhteensopiva PLAY-komento Visual Basicille toteutettuna API-komennon Beep avulla. Ainoat puuttuvat komennot ovat MB ja MF toteutussyistä.
Määrittelyt ja muuttujat
Private Declare Function Beep Lib "kernel32" (ByVal dwFreq As Long, ByVal dwDuration As Long) As Long Private Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long) Dim Aanet(1 To 84) As Integer Dim tempo As Integer, oktaavi As Integer, nkesto As Integer Dim tyyli As Integer
Pääohjelma
Private Sub Form_Load() 'aloitusarvot tempo = 120 oktaavi = 3 nkesto = 4 tyyli = 2 'lasketaan sävelien taajuudet Aanet(1) = 64 For i = 2 To 84 Aanet(i) = Aanet(i - 1) * 1.06 Next 'esimerkkimusiikkia PLAY "t160l16gl8gl16gl8ab-bp8l32gb>dg<p8 l16cegecegecegecegecdgdcdgc<b>dgd<b>dgd<a>cec<a>cec<a>cec<a>cec" PLAY "<gb>e<bgb>e<b><gb>e<bgb>e<bfa>c<afa>c<afa>c<afa>c<aeg>c<geg>c<geg>c<geg>c<g" PLAY "dg>c<gdg>c<gdg>c<gdg>c<gdgbgdgbgdgbgdgbg" 'virheenkäsittelyesimerkki PLAY "t256cdefg" End Sub
Aliohjelmat
Sub PLAY(musiikki As String) Dim um As String, vaihdettu As Boolean, unuotti As Integer Dim nuottij As String, unuottia(1 To 7) As Integer Dim vkesto As Integer um = LCase$(musiikki) nuottij = "cdefgab" nuottia = Array(0, 0, 2, 4, 5, 7, 9, 11) Do vaihdettu = False 'jos tempoa vaihdetaan If Left$(um, 1) = "t" Then If IsNumeric(Mid$(um, 2, 1)) Then If IsNumeric(Mid$(um, 3, 1)) Then If IsNumeric(Mid$(um, 4, 1)) Then tempo = Val(Mid$(um, 2, 3)) um = Mid$(um, 5) Else tempo = Val(Mid$(um, 2, 2)) um = Mid$(um, 4) End If Else MsgBox "Virhe: Tempo tulee olla väliltä 32-255", , "PLAY": Exit Sub End If Else MsgBox "Virhe: Tempo tulee olla väliltä 32-255", , "PLAY": Exit Sub End If vaihdettu = True End If If tempo < 32 Or tempo > 255 Then MsgBox "Virhe: Tempo tulee olla väliltä 32-255", , "PLAY": Exit Sub 'jos oktaavia vaihdetaan komennolla o If Left$(um, 1) = "o" Then If IsNumeric(Mid$(um, 2, 1)) Then oktaavi = Val(Mid$(um, 2, 1)) um = Mid$(um, 3) Else MsgBox "Virhe: Oktaavin tulee olla väliltä 0-6", , "PLAY": Exit Sub End If vaihdettu = True End If If oktaavi > 6 Then MsgBox "Virhe: Oktaavin tulee olla väliltä 0-6", , "PLAY": Exit Sub 'jos oktaavia vaihdetaan < tai > merkillä If Left$(um, 1) = "<" Then oktaavi = oktaavi - 1 If oktaavi < 0 Then MsgBox "Virhe: Oktaavin tulee olla väliltä 0-6", , "PLAY": Exit Sub um = Mid$(um, 2) vaihdettu = True End If If Left$(um, 1) = ">" Then oktaavi = oktaavi + 1 If oktaavi > 6 Then MsgBox "Virhe: Oktaavin tulee olla väliltä 0-6", , "PLAY": Exit Sub um = Mid$(um, 2) vaihdettu = True End If 'jos soittotyyliä vaihdetaan If Left$(um, 1) = "m" Then Select Case Mid$(um, 2, 1) Case "l" tyyli = 1 Case "n" tyyli = 2 Case "s" tyyli = 3 Case Else MsgBox "Virhe: Soittotyylin tulee olla l, n tai s", , "PLAY": Exit Sub End Select um = Mid$(um, 3) vaihdettu = True End If 'jos nuotin kestoa vaihdetaan If Left$(um, 1) = "l" Then If IsNumeric(Mid$(um, 2, 1)) Then If IsNumeric(Mid$(um, 3, 1)) Then nkesto = Val(Mid$(um, 2, 2)) um = Mid$(um, 4) Else nkesto = Val(Mid$(um, 2, 1)) um = Mid$(um, 3) End If Else MsgBox "Virhe: Nuotin keston tulee olla väliltä 1-64", , "PLAY": Exit Sub End If If nkesto > 64 Then MsgBox "Virhe: Nuotin keston tulee olla väliltä 1-64", , "PLAY": Exit Sub vaihdettu = True End If 'jos nuotti soitetaan komennolla n If Left$(um, 1) = "n" Then If IsNumeric(Mid$(um, 2, 1)) Then If IsNumeric(Mid$(um, 3, 1)) Then If Val(Mid$(um, 2, 2)) < 85 Then SoitaNuotti Val(Mid$(um, 2, 2)) um = Mid$(um, 4) Else MsgBox "Virhe: Soitettava nuotti tulee olla väliltä 0-84", , "PLAY": Exit Sub End If Else SoitaNuotti Val(Mid$(um, 2, 1)) um = Mid$(um, 3) End If Else MsgBox "Virhe: Soitettava nuotti tulee olla väliltä 0-84", , "PLAY": Exit Sub End If vaihdettu = True End If 'jos tauko If Left$(um, 1) = "p" Then If IsNumeric(Mid$(um, 2, 1)) Then If IsNumeric(Mid$(um, 3, 1)) Then If Val(Mid$(um, 2, 2)) < 65 Then vkesto = nkesto nkesto = Val(Mid$(um, 2, 2)) SoitaNuotti 0 nkesto = vkesto um = Mid$(um, 4) Else MsgBox "Virhe: Tauon pituus tulee olla väliltä 1-64", , "PLAY": Exit Sub End If Else vkesto = nkesto nkesto = Val(Mid$(um, 2, 1)) SoitaNuotti 0 nkesto = vkesto um = Mid$(um, 3) End If Else MsgBox "Virhe: Soitettava nuotti tulee olla väliltä 0-84", , "PLAY": Exit Sub End If vaihdettu = True End If 'jos jotain muuta If vaihdettu = False Then Select Case Left$(um, 1) Case "a", "b", "c", "d", "e", "f", "g", "+", "#", "-" unuotti = (oktaavi + 1) * 12 + nuottia(InStr(nuottij, Left$(um, 1))) + 1 If Mid$(um, 2, 1) = "+" Or Mid$(um, 2, 1) = "#" Then unuotti = unuotti + 1 um = Mid$(um, 2) ElseIf Mid$(um, 2, 1) = "-" Then unuotti = unuotti - 1 um = Mid$(um, 2) End If SoitaNuotti unuotti um = Mid$(um, 2) Case " " um = Mid$(um, 2) Case Else MsgBox "Virhe: Tunnistamaton komento: " + Left$(um, 1), , "PLAY": Exit Sub End Select End If DoEvents Loop While um <> "" End Sub Sub SoitaNuotti(nuotti As Integer) 'aliohjelma nuotin soittamiseen tai taukoon Dim nopeus As Integer, tauko As Integer tauko = 0 nopeus = 4 / (tempo / 60) * 1000 nopeus = nopeus / nkesto If nuotti <> 0 Then If tyyli = 2 Then tauko = nopeus * (1 / 8) nopeus = nopeus * (7 / 8) ElseIf tyyli = 3 Then tauko = nopeus * (1 / 4) nopeus = nopeus * (3 / 4) End If End If If nuotti = 0 Then Sleep nopeus Else x = Beep(Aanet(nuotti), nopeus) If tauko <> 0 Then Sleep tauko End If End If End Sub
hmm...ja kuka haluaa piipperi äänet vb:ssä?
Pienoinen korjaus koodiin. Nuo määrittelyt kun tulee luonnollisesti moduuliin, niin jostain syystä samaan listaukseen on laitettu muuttujat. Joten väärinkäsitestysen välttämiseksi laittakaa siis nuo muuttujat formin puolelle tai vaihtakaa Dim arvot Public:eiksi.
Esim. minä :) Määrittelyt voi kyllä kirjoittaa Formillekin.
Juu, juu, mutta kun jos joku luulee, että nuo kuuluu laittaa moduuliin, kun yleensä ne on aina tossa moduulissa, vaikkei tuossa nyt luekkaan mitään moduulista :)
Tolleehan saa tehtyä parempaa musaa ku monet midit :)
Olisiko mahdollista saada piste (esim. CD.E) toimimaan?
Tämähän on kiva! :)
Meinasin jo valittaa kun lopussa tuli virhe "Tempo tulee olla väliltä 32-255", mutta sitten huomasinkin että se on tahallinen :P
tästä pitää vääntää myös se moniraitaversio
lainaus:
Rykker [04.03.2002 19:33:22] Lainaa Muokkaa
hmm...ja kuka haluaa piipperi äänet vb:ssä?
Piiperi on äänistä kaikkein paras mitä tietokoneista voi löytää elikkä minä
Tämä on yksi parhaista vinkeistä mitä on koskaan ollut kiitos!
Hieno on!!
VÄHÄN COOL...:D
Miten ton saa pysäytettyä jos laitaa loopin??
Ctrl + Alt + Pause (arvatkaa mikä kappale:
"t120l4cccedddfeeddl2cl4p8ffffl2agp8l4eeeel2gfp4l4cccedddfeeddl2cl4"
)
Oliskohan ukko nooa? :D
Aihe on jo aika vanha, joten et voi enää vastata siihen.