Kirjoittaja: Antti Laaksonen
Kirjoitettu: 01.01.2007 – 01.01.2007
Tagit: ääni, koodi näytille, vinkki
QBasicissa on kaksi ääneen liittyvää komentoa: PLAY soittaa tietyn sävelen ja SOUND soittaa äänen annetulta taajuudelta. Näiden komentojen avulla voi tehdä mm. hauskoja soittimia, joista tässä on kaksi esimerkkiä.
Ensimmäinen ohjelma on tietokoneen näppäimistöllä soitettava piano. Koskettimisto on jaettu kahteen tasoon: alempi oktaavi lähtee näppäimestä "<", ylempi näppäimestä "q". Ohjelmalla voi soittaa useita säveliä samaan aikaan, koska yksi sävel on hyvin lyhyt. Kannattaa kokeilla muuttaa sävelen pituutta omalle tietokoneelle sopivaksi.
Toinen ohjelma sisältää lisäksi hiirellä soitettavan viulun. Äänen taajuus määrätään liikuttamalla hiirtä ylös ja alas, ja ääni soi aina, kun hiiren vasen näppäin on painettu alas. Tämän viulun taajuusalue on 40 - 1320 hertsiä. Mitä herkemmin hiiri liikkuu, sitä helpompaa soittaminen on. Pianoa ja viulua voi soittaa yhtä aikaa vaikka kaverin kanssa.
Soittimia voi tietenkin kaikin tavoin muutella eri tarkoituksiin. Yksi näppärä muutos on pianon koskettimien järjestys. Moni tavallisella pianolla vaikea kohta (esim. Lisztin teoksissa, joissa oma käsi tuntuu usein auttamattoman pieneltä), helpottuu kummasti, kun siirtää vaikkapa oktaavit vierekkäisiksi koskettimiksi. Viuluunkin on helppo keksiä "parannuksia", esim. automaattinen lähimmän puhtaan sävelen etsintä.
Ohjelmat sulkeutuvat painamalla ESC-näppäintä tai molempia hiiren näppäimiä yhtä aikaa. Hiiren käyttö ohjelmassa vaatii, että QBasic käynnistetään parametrilla /L.
Jos soitat näillä tai muilla QBasic-soittimilla hienoja juttuja ja pystyt nauhoittamaan esityksen, lähetä nauhoitus minulle sähköpostilla, niin se julkaistaan Ohjelmointiputkassa!
pelkkä piano
DIM tiedot$(256) ' luetaan sävelet taulukkoon READ maara% FOR i% = 1 TO maara% READ koodi$, nuotti$ tiedot$(ASC(koodi$)) = nuotti$ NEXT ' yhden sävelen pituus PLAY "t255l40" DO nappi$ = LCASE$(INKEY$) IF nappi$ = CHR$(27) THEN END IF nappi$ <> "" THEN PLAY tiedot$(ASC(nappi$)) END IF LOOP ' ensin tulee sävelten määrä, sitten vuorotellen nappi ja sävel DATA 36 DATA <,o2c,a,o2c+,z,o2d,s,o2d+,x,o2e,c,o2f,f,o2f+,v,o2g DATA g,o2g+,b,o2a,h,o2a+,n,o2b,m,o3c,k,o3c+,",",o3d DATA l,o3d+,.,o3e,-,o3f DATA q,o3c,2,o3c+,w,o3d,3,o3d+,e,o3e,r,o3f,5,o3f+,t,o3g DATA 6,o3g+,y,o3a,7,o3a+,u,o3b,i,o4c,9,o4c+,o,o4d DATA 0,o4d+,p,o4e,å,o4f
piano ja viulu
TYPE RegType ax AS INTEGER bx AS INTEGER cx AS INTEGER dx AS INTEGER bp AS INTEGER si AS INTEGER di AS INTEGER flags AS INTEGER END TYPE DIM SHARED o AS RegType DIM SHARED i AS RegType AlustaHiiri onko%, napit% RajaaHiiri 0, 0, 0, 1280 DIM tiedot$(256) ' luetaan sävelet taulukkoon READ maara% FOR a% = 1 TO maara% READ koodi$, nuotti$ tiedot$(ASC(koodi$)) = nuotti$ NEXT ' yhden sävelen pituus PLAY "t255l40" DO nappi$ = LCASE$(INKEY$) IF nappi$ = CHR$(27) THEN END IF nappi$ <> "" THEN PLAY tiedot$(ASC(nappi$)) END IF LueHiiri nappi%, x%, y% IF nappi% = 3 THEN END IF nappi% = 1 THEN SOUND 1320 - y%, .1 END IF LOOP ' ensin tulee sävelten määrä, sitten vuorotellen nappi ja sävel DATA 36 DATA <,o2c,a,o2c+,z,o2d,s,o2d+,x,o2e,c,o2f,f,o2f+,v,o2g DATA g,o2g+,b,o2a,h,o2a+,n,o2b,m,o3c,k,o3c+,",",o3d DATA l,o3d+,.,o3e,-,o3f DATA q,o3c,2,o3c+,w,o3d,3,o3d+,e,o3e,r,o3f,5,o3f+,t,o3g DATA 6,o3g+,y,o3a,7,o3a+,u,o3b,i,o4c,9,o4c+,o,o4d DATA 0,o4d+,p,o4e,å,o4f ' aloittaa hiiren käytön ohjelmassa SUB AlustaHiiri (onko%, napit%) i.ax = 0 CALL INTERRUPT(&H33, i, o) onko% = o.ax napit% = o.bx END SUB ' lukee hiiren painetut napit ja sijainnin SUB LueHiiri (nappi%, x%, y%) i.ax = 3 CALL INTERRUPT(&H33, i, o) nappi% = o.bx x% = o.cx y% = o.dx END SUB ' määrittää hiiren alueen vaaka- ja pystysuunnassa SUB RajaaHiiri (xp%, xs%, yp%, ys%) i.ax = 7 i.cx = xp% i.dx = xs% CALL INTERRUPT(&H33, i, o) i.ax = 8 i.cx = yp% i.dx = ys% CALL INTERRUPT(&H33, i, o) END SUB
Pakko kyllä sanoa, että tämä on aivan jotain muuta! Hieno koodi ja hienosti keksitty uusi idea, en ole tällaista ennen nähnytkään.
Syntikka :)
Hmm, tässä vissiin tulee suoraan niinku lineaarisesti hiiren paikasta se taajuus? Vois olla jännempi jos se menis niinku oikeestiki viulussa (tai siis missä tahansa semmosessa soittimessa, vaikkapa kitarassa) eli keskeltä kieltä (vaik keskeltä näyttöä) tulee tuplasti se taajuus mitä ihan sieltä reunasta.. hmm, mitenhän se on. Oisko se taajuus niinku vakio jaettuna hiiren paikalla.
Eikä toi nyt mikään uus idea oo soitella pianoa näppäimistöltä, mut onhan tollanen qbasic-toteutus ihan jännä.
Hienolta näyttää, mutta tuo eka koodi soi oudosti...
:D
En ole vielä testannut, mutta kommenttien ja koodin perusteella vaikuttaa lupaavalta.
Binääriiiiiiiiiiiiiiiiiiiiiiiiiii.........................
Kun QBasic 1.1:llä ei toimi...........................
Juu, ei toimi minullakaan, valittaa tuosta INTERRUPT aliohjelmasta.
>Juhko, T.M.
/L-parametri kenties jäänyt puuttumaan? Tosin, se ei toimi 1.1:n kanssa, että hommatkaa vain suosiolla se 4.5 tai 7.1. Ei Microsoftin sedät teitä rais.. siis, vie oikeuteen, jos sen jostain lataatte. Eikä myöskään moni muukaan setä tai täti..
-Grey-
Pitäisiköhän ihan väsätä joku PowerQB-compileri, jossa olisi n+1 lisätoimintoa? Voisi tehdä C:llä. Siihen saa ainakin ilmaisen kääntäjän.
VAU! Aivan mahtava ohjelma! Interruptista se siinä toisessa ohjelmassa valitteli, mutta annoin niille käskyille kenkää ja toimi. En kyllä enää havainnut minkään laista eroa ensimmäiseen, lienevätkö olleet tärkeätkin käskyt.
ai hittolainen ku o hiano
moptim kirjoitti:
Pitäisiköhän ihan väsätä joku PowerQB-compileri, jossa olisi n+1 lisätoimintoa? Voisi tehdä C:llä. Siihen saa ainakin ilmaisen kääntäjän.
Joo. tee se.