Kirjoittaja: Antti Laaksonen
Kirjoitettu: 06.12.2002 – 06.12.2002
Tagit: ääni, koodi näytille, vinkki
Tämän koodin avulla saat QBasic-ohjelmasi taustalle soimaan jopa "kolmiäänistä" piipperimusiikkia. Musiikki määritellään koodin alussa kolmena kanavana, käytössä on seuraavat nuotit:
c=c, C=cis, d=d, D=dis, e=e, E=f, f=f, F=fis, g=g, G=gis, a=a, A=ais (b), b=h, B=c
Pienellä kirjoitettu vastaa siis tavallista nuottia ja iso kirjain tuottaa sille ylennyksen. Ensimmäinen merkki on nuotti ja toinen oktaavi (0-6). Tauot määritetään jättämällä tyhjää nuottien välille, PLAY-komennosta tuttuja l- ja p-merkintöjä ei näin ollen ole käytössä.
Kolmen äänen "yhtäaikainen" soittaminen perustuu siihen, että äänet soitetaan hyvin lähellä toisiaan - oikeastihan piipperillä on mahdollista soittaa vain yksi ääni kerrallaan. Soita-aliohjelmakutsu on laitettava jokaiseen silmukkaan, missä pelin/ohjelman aikana ollaan, jottei musiikki katkea.
Esimerkkikappaleena on jouluteemaan sopiva "Kulkuset" - tuobin pyynnöstä ;)
DECLARE SUB Soita () DIM SHARED k1 AS STRING, k2 AS STRING, k3 AS STRING DIM SHARED kohta AS INTEGER, nuotit(256) AS STRING * 2 'taulukko nuottien nimelle nuotit(ASC("c")) = "c": nuotit(ASC("d")) = "d": nuotit(ASC("e")) = "e" nuotit(ASC("f")) = "f": nuotit(ASC("g")) = "g": nuotit(ASC("a")) = "a" nuotit(ASC("b")) = "b": nuotit(ASC("C")) = "c+": nuotit(ASC("D")) = "d+" nuotit(ASC("E")) = "f": nuotit(ASC("F")) = "f+": nuotit(ASC("G")) = "g+" nuotit(ASC("A")) = "b-": nuotit(ASC("B")) = "c" 'Esimerkkikappale "Kulkuset" k1 = "g3 g3 g3 c4 c4 c4 c4c4 b3 b3 b3 d4 d4 c4 a3 g3 " k2 = "b2 c3 d3 e3 e3 e3 e3g3 g3 e3 e3 a3 a3 d3 d3 b2 " k3 = "g1 a1 b1 c1 g1 e1 g1 g1 d2 b1 d2 a1 c2 d2 d1 g1 " k1 = k1 + "d3 d3 b3 a3 g3 d3 D3 e3 c4 b3 a3 e3 " k2 = k2 + "d2 b2 d3 c3 b2 g2 g2 c3 e3 d3 c3 a2 " k3 = k3 + "d1 g1 d2 b1 d2 g1 d1 e1 G1 a1 e2 e1 a1 a1 e2 c2" k1 = k1 + " f3 F3 c4 b3 a3 d4 b3 a3 e3 F3 g3 a3 d3" k2 = k2 + " a2 d3 d3 d3 d3 g3 d3 C3 C3 C3 C3 c3 c3" k3 = k3 + " e2 d1 a1 F1 a1 g1 d2 b1 d2 a1 e2 C2 e2 d2 c2 b1 a1" k1 = k1 + " d3 b3 a3 g3 d3 D3 e3 c4 b3 a3 e3 " k2 = k2 + " b2 d3 c3 b2 g2 g2 c3 e3 d3 c3 a2 " k3 = k3 + " g1 d2 b1 d2 g1 d1 e1 G1 a1 e2 e1 a1 a1 e2 c2" k1 = k1 + " f3 F3 c4 b3 a3 d4 d4 d4 d4 e4 d4 c4 a3 g3 d4" k2 = k2 + " a2 d3 d3 d3 d3 g3 g3 g3 g3 a3 a3 d3 d3 b2 d3" k3 = k3 + " e2 d1 a1 F1 a1 g1 f1 e1 e1 a1 a1 d1 d1 g1 d1" k1 = k1 + " b3 b3 b3 b3 b3 b3 b3 d4 g3 a3b3 b3 " k2 = k2 + " g3 g3 g3 g3 g3 g3 g3 g3 c3 c3g3 g1 " k3 = k3 + " g1 d2 d1 d2 g1 d2 d1 d2 g1 d2 d1 d2 g1 g1 a1 b1 " k1 = k1 + "c4 c4 c4 c4c4 b3 b3 b3b3 a3 a3 b3 a3 d2 " k2 = k2 + "e3 e3 e3 e3g3 g3 g3 g3C3 C3 C3 C3 d3 F3 " k3 = k3 + "c1 g1 e1 g1 g1 d2 b1 d2 a1 e2 C2 e2 d2 c2 b1 a1 " k1 = k1 + "b3 b3 b3 b3 b3 b3 b3 d4 g3 a3b3 b3 " k2 = k2 + "g3 g3 g3 g3 g3 g3 g3 g3 c3 c3g3 g1 " k3 = k3 + "g1 d2 d1 d2 g1 d2 d1 d2 g1 d2 d1 d2 g1 g1 a1 b1 " k1 = k1 + "c4 c4 c4 c4c4 b3 b3 b3d4 d4 c4 a3 g3 " k2 = k2 + "e3 e3 e3 e3g3 g3 g3 g3d3 d3 e3 F3 g3 " k3 = k3 + "c1 g1 e1 g1 g1 d2 b1 d2 d2 c2 b1 a1 g1 " k1 = k1 + "e4 e4 e4 d4 c4 d4 e4 d4 d4 d4 g3 b3 " k2 = k2 + "g3 g3 g3 f3 e3 f3 g3 g3 g3 g3 b2 d3 " k3 = k3 + "c1 g1 e1 g1 c1 g1 e1 g1 g1 d2 b1 d2 g1 d2 b1 d2 " k1 = k1 + "b3 b3 b3 g3 e3 F3 g3 F3 F3 g3 g3 a3 " k2 = k2 + "C3 C3 C3 C3 a2 a2 a2 d3 d3 d3 d3 d3 " k3 = k3 + "a1 e2 C2 e2 a1 e2 C2 e2 d1 d1 e1 e1 d2 c2 b1 a1 " k1 = k1 + "b3 b3 b3 b3 b3 b3 b3 d4 g3 a3b3 b3 " k2 = k2 + "g3 g3 g3 g3 g3 g3 g3 g3 c3 c3g3 g1 " k3 = k3 + "g1 d2 d1 d2 g1 d2 d1 d2 g1 d2 d1 d2 g1 g1 a1 b1 " k1 = k1 + "c4 c4 c4 c4c4 b3 b3 b3d4 d4 c4 a3 g3 " k2 = k2 + "e3 e3 e3 e3g3 g3 g3 g3d3 d3 e3 F3 g3 " k3 = k3 + "c1 g1 e1 g1 g1 d2 b1 d2 d2 c2 b1 a1 g1 " 'alkuvalmistelut PLAY "t170" 'tempo PLAY "l64" kohta = -1 SCREEN 13 'Soitetaan kappaletta, kunnes painetaan Esc DO Soita 'köyhän miehen lumisade CIRCLE (RND * 320, RND * 200), RND * 50, 25 + RND * 5 LOOP UNTIL INKEY$ = CHR$(27) SUB Soita DIM nuotti AS STRING, oktaavi AS STRING IF PLAY(0) = 0 THEN kohta = kohta + 2 IF kohta > LEN(k1) THEN kohta = 1 PLAY "p64" 'kanava 3 nuotti = MID$(k3, kohta, 1) oktaavi = MID$(k3, kohta + 1, 1) IF oktaavi <> " " THEN PLAY "mbo" + oktaavi + "mn" + nuotit(ASC(nuotti)) ELSE PLAY "p64" END IF 'kanava 1 nuotti = MID$(k1, kohta, 1) oktaavi = MID$(k1, kohta + 1, 1) IF oktaavi <> " " THEN PLAY "mbo" + oktaavi + "ml" + nuotit(ASC(nuotti)) ELSE PLAY "p64" END IF 'kanava 2 nuotti = MID$(k2, kohta, 1) oktaavi = MID$(k2, kohta + 1, 1) IF oktaavi <> " " THEN PLAY "mbo" + oktaavi + "mn" + nuotit(ASC(nuotti)) ELSE PLAY "p64" END IF PLAY "p64" END IF END SUB
Wau!
Musiikkimiehiä, musiikkimiehiä. :D
kerrankin hyvä vinkki
Oikein hyvä.
Ihan kivasti piipittelee :) Joku kun vielä väsää jonkinlaisen trackerin niin.. :)
harmi ettei tossa windowskoneesa oo piipperinjohto kiinni emossa
!!!!!!!!
Eli pelkkä 'IF PLAY(0) = 0' riittää tarkistamaan soittaako PLAY jotain?
~Sose~
hieno
Ei hullumpi esimerkki piipperimusasoittimesta basicille! Vaikka itse q(uick)basic piipperimusineen jakaikkimuusinnepäin olivat jo 10 vuotta sitten lahoa tavaraa.
lumisade on just cool :D mutta hyvää kuullostaa biisikin :)
Joo, lumisade on laadukas isolla L:llä. ;) Biisi on myös laadukas, kiitos vain Antti, kun toteutit pyyntöni. :)
Mitä "Köyhän miehen lumisade" tarkoittaa???
-The PC-Master-
Jos kerran oot PC-Master niin sano ite
Jeh.. "Koyhän miehen lumisade" = vaatimattomasti toteutettu lumisateelta näyttävä koodipätkä, QBasicilla ;) Milläköhän kielellä ne matopelit jotka olivat Kilpailu sivulla on tehty? Ainakin ne olivat laadukkaita ja vissiin kaikissa oli taustamusiikit. Yhdessä ne musiikit avattiin .mid tiedostosta. Onnistuukohan tämä QBasicilla?
Voi onnistua. QB:llä voi soittaa muutakin kuin piipperimusiikkia :)
Loistava! Lisää tämmöstä!! Eikä toi lumisadekaan ollu niin "köyhän" miehen.
Ihan hianon kuulonen/näköinen...
hieno tausta
Ton lumisateen olisin osannut tehdä 8-vuotiaana!
Tässä on enemmänkin ideana toi kulkustelu.
miten saan kopioitua tuon Qbasicille ku ei millään onnistu?
MIDI:n toistoon sopivat koodinpätkät löytyvät varmaankin osoitteesta www.qbasic.com .
Huh, en ole vieläkään lakannu nauramasta. Aivan uskomaton vinkki, mahtava biisi ja upea 'köyhän miehen lumisade'. :D Kiitos, tälle löytyy kyllä käyttöä.
Hyvä ohjelma. :)
Mulla ei kuulu mitään ääntä jostain syystä. Mulla on QBasic 7.1. Toimiiko se sitten vanhemmalla QBasicilla??
Onkohan herralla piipperi kiinni koneessa? Ja lumisade on upea.
Codeprofile kirjoitti:
Mulla ei kuulu mitään ääntä jostain syystä. Mulla on QBasic 7.1. Toimiiko se sitten vanhemmalla QBasicilla??
se toimii kyllä sillä ainaki mulla
edit: Siis 7.ykköses.
tomaattigeeni kirjoitti:
harmi ettei tossa windowskoneesa oo piipperinjohto kiinni emossa
Voit sä yrittää saara piipperin kuulumaan äänikortin kautta BIOSsista. Mulla yhyres konees piipperi kuuluu Sound Blaster(16)in kautta.