Kirjautuminen

Haku

Tehtävät

Koodit: QB: Soittimia

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

Kommentit

tgunner [01.01.2007 18:44:00]

#

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.

Kentti [01.01.2007 20:44:42]

#

Syntikka :)

tejeez [01.01.2007 22:20:10]

#

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

Juhko [02.01.2007 11:27:25]

#

Hienolta näyttää, mutta tuo eka koodi soi oudosti...

moptim [02.01.2007 12:09:23]

#

:D

Codeprofile [02.01.2007 19:06:19]

#

En ole vielä testannut, mutta kommenttien ja koodin perusteella vaikuttaa lupaavalta.

Juhko [03.01.2007 11:11:16]

#

Binää­ri­ii­i­ii­i­ii­i­ii­i­ii­i­ii­i­ii­i­ii­i­ii.........................

Kun QBasic 1.1:llä ei toimi...........................

T.M. [12.01.2007 22:54:23]

#

Juu, ei toimi minullakaan, valittaa tuosta INTERRUPT aliohjelmasta.

Grey [14.01.2007 23:49:26]

#

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

moptim [14.02.2007 16:38:12]

#

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.

Chaosworm [02.03.2007 14:27:36]

#

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.

roxas [23.07.2007 00:15:13]

#

ai hittolainen ku o hiano

Dude [25.07.2007 10:35:27]

#

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.

Kirjoita kommentti

Muista lukea kirjoitusohjeet.
Tietoa sivustosta