De flesta programmerare använder datorljud av två orsaker: att skapa musik och för att göra ljudeffekter. Innan vi börjar med djupsinnigheter i hur man programmerar ljud ska vi se på hur ett typiskt ljudprogram är uppbyggt... och ge dig ett kort ljudprogram som du kan experimentera med.
Till att börja med finns det 5 inställningar som du måste känna till för att skapa ljud med din Commodore 64: VOLYM, ATTACK/DECAY, SUSTAIN/RELEASE (ADSR), VÅGFORMKONTROLL och HÖG FREKVENS/LÅG FREKVENS. De första tre inställningarna görs vanligtvis EN GÅNG i början av ditt program. Hög och låg frekvensinställning måste ställas om för varje ton du spelar. Vågformkontrollen startar och stoppar varje ton. Här följer hur ett typiskt Ijud/musik program är uppbyggt.
Innan du börjar måste du välja en stämma. Det finns 3 stämmor. Varje stämma kräver ljudinställningar för vågform etc. Du kan spela 1-, 2- eller 3-stämmigt men vårt lilla program använder enbart STÄMMA NUMMER 1. Skriv in detta program rad för rad... kom ihåg att trycka RETURN efter varje rad.
1. Nollställ först ljudkretsen. | 5 FOR L=54272 TO 54296:POKE L,0:NEXT |
2. Sätt på full VOLYM. | 10 POKE 54296, 15 |
3. Sätt ATTACK/DECAY nivå för att bestämma hur snabbt en ton ökar till och faller från sin högsta ljudstyrka (0 till 255). | 20 POKE 54277, 190 |
4. Sätt SUSTAIN/RELEASE värde för att bestämma nivån på den förlängda tonen och hastigheten den sedan ska tona ner med. | 30 POKE 54278, 248 |
5. Leta rätt på den not/ton du vill spela i tabellen i appendix M och skriv in HÖG. FREKVENS och LÅG-FREKVENS värde för den ton. (Varje ton kräver 2 POKEvärden.) | 40 POKE 54273, 17:POKE 54272, 37 |
6. Starta VÅGFORM med en av 4 standardinställningar (17, 33, 65 eller 129). | 50 POKE 54276, 17 |
7. Skriv en fördröjningsloop för att bestämma VARAKTIGHETEN av tonen som spelas (en kvartsnot är ca. "250" men kan variera då längre program kan påverka tiden) | 60 FOR T=1 TO 250:NEXT |
8. Stäng av TONEN | 70 POKE 54276,16 |
För att lyssna till den ton du just skapade, skriv RUN och tryck på RETURN. För att se eller ändra i programmet skriv LIST och tryck på RETURN (Glöm inte att spara ditt demo-program på kassett eller disk.
Du behöver inte vara musiker för att kunna göra musik med din Commodore 64! Allt du behöver kunna är några stycken enkla tal som talar om för din dator hur stark volym, vilka toner, hur länge de ska ljuda etc. Men först... här följer ett program som ger dig en snabb demonstration av Commodore 64 otroliga musikförmåga, genom att använda en av datorns 3 separata stämmor.
Skriv ordet NEW och tryck RETURN. så raderas ditt tidigare program. Skriv därefter in följande program och skriv RUN och tryck RETURN
5 REM SKALA ←------------------------- Programmets titel 7 FOR L=54272 TO 54296:POKE L,0:NEXT 10 POKE 54296,15 ←--------------------- Sätter full volym 20 POKE 54277,7:POKE 54278,133 ←------- Sätter ADSR (varje ton) 50 READ A ←---------------------------- Läser första DATA i rad 110. 60 READ B ←---------------------------- Läser andra talet på rad 110 DATA. 70 IF B=-1 THEN END ←------------------ Programmet stänger av de två stämmorna och avslutar när det läst -1 på rad 900. 80 POKE 54273,A:POKE 54272,B ←--------- POKEar det första talet från DATA på rad 110 (A=17) som HÖG FREKVENS och det andra talet (B=37) som LÅG FREKVENS. Nästa gång programmet loopat runt läser det A som 19 och B som 63, osv. Dessa tal POKEas in i HÖG och LÅG-FREKVENSREGISTREN. Adresserna är för HÖG FREKVENS=54273 och LÅG FREKVENS=54272 för stämma 1. 85 POKE 54276,17 ←--------------------- Startar tonen 90 FOR T=1 TO 250:NEXT:POKE 54276,16 ←- Spelar tonen och stänger därefter av den. 95 FOR T=1 TO 50:NEXT ←---------------- RELEASE-tiden. 100 GOTO 20 ←--------------------------- Loopar tillbaka för att återställa KONTROLLER och spela en ny ton. 110 DATA 17,37,19,63,21,154,22,227 ←---- Not-värde från tabell appendix 7. 120 DATA 25,177,28,214,32,94,34,175 ←--- Varje par siffror representerar en not. Exempelvis, 17 och 37 representerar "C" i fjärde oktaven, 19 och 63 representerar "D" osv. 900 DATA -1,-1 ←------------------------ När programmet når -1 stängs HÖG/LÅGFREKVENSERNA av och programmet avslutas som instrueras på rad 70.För att förändra Ijudet till "cembalo", ändra så det står följande på rad 85:
POKE 54276,33och rad 90 till:
FOR T=1 TO2 50:NEXT:POKE 54276,32och kör programmet igen. (Ändra programmet genom att trycka ned RUN/STOP-tangenten för att stoppa det, skriv därefter LIST och tryck RETURN). Skriv därefter på nytt den programrad du vill ändra, den nya raden ersätter automatiskt den tidigare med samma radnummer. Vad vi gjorde här var att ändra VÅGFORMEN från triangelform till sågtandsform. Förändring av vågformen kan drastiskt ändra Ijudet från Commodore 64... men... vågform är endast en av flera inställningar du kan ändra för att skapa olika musikaliska klanger och ljudeffekter! Du kan också ändra ATTACK/DECAY förhållandet för varje ton... exempelvis kan du ändra "cembalo" att låta mera "banjo"-likt genom att ändra rad 20 och lägga till rad 30.
20 POKE 54277,193 30 POKE 54278,8 ←----------------- Sätter SUSTAIN till 0 för "banjoljud"
Som du just sett, kan du få Commodore 64's ljud att låta som olika musikinstrument. Låt oss studera hur varje ljudinställning fungerar.
POKE54296,0
Du behöver enbart ställa in volymen EN GÅNG i början av ditt program, eftersom inställningen aktiverar alla tre stämmorna i Commodore 64. (Förändring av volymen under det att en ton spelas eller i en ljudeffekt hörs kan skapa ett intressant "sound" men är utanför vad vi tar upp i denna bruksanvisning).
2. ADSR och VÅGFORMKONTROLLINSTÄLLNING -- Du har redan konstaterat hur en ändring av vågform kan ändra "soundet" från "xylofon" till "cembalo". Varje stamma har sin egen VÅGFORMKONTROLL vilken låter dig bestämma en av fyra vågformer: Triangel, sågtand, puls (fyrkant) och brus. Kontrollen aktiverar också Commodore 64's ADSR funktion, men vi återkommer strax om detta. Ett prov på vågformsstart kan se så här ut:
POKE 54276,17där det första talet (54276) representerar kontrollen för stämma 1 och det andra talet (17) representerar start av triangelvågform. Inställningar för varje stämma och vågformskombination visas i tabellen nedan.
KONTROLL | TRIANGEL | SÅNGTAND | PULS | BRUS | |
---|---|---|---|---|---|
STÄMMA 1 | 54276 | 17/16 | 33/32 | 65/64 | 129/128 |
STÄMMA 2 | 54283 | 17/16 | 33/32 | 65/64 | 129/128 |
STÄMMA 3 | 54290 | 17/16 | 33/32 | 65/64 | 129/128 |
Även om KONTROLLREGISTREN är olika för varje stäma är vågformsvärdena samma för varje typ av vågform. För att förstå hur detta fungerar, se på rad 85 och 90 i programmet som spelade skalan. l detta program, direkt efter att vi satt frekvensen på rad 80 ställde in KONTROLLINSTÄLLNINGARNA för stämma 1 på rad 85 genom: POKE54276,17. Detta startade stämma 1 med triangelvåg (17). På rad 70 stoppade vi tonen genom POKE54276,16. Därefter ändrade vi VÅGFORMS-startinställningen från 17 till 33 för att skapa en sågtandsform och detta gav skalan cembalo-"sound". Nu förstår du hur KONTROLLREGISTRET och VÅGFORM hor ihop. Att ställa in vågform görs på samma sätt som volyminställning, med den skillnaden att varje stämma har sin egen inställning och att istället för att POKEa ett volymvärde definierar vi vågformen. Nu ska vi se på en annan aspekt på ljud... ADSR-egenskapen.
3. ATTACK/DECAY-INSTÄLLNING -- om vi nämnde tidigare, styr KONTROLLREGISTRET inte enbart vågorna utan aktiverar också ADSR, eller ATTACK/DECAY/SUSTAIN/RELEASE egenskaperna hos Commodore 64. Vi ska börja med att se på ATTACK/DECAY inställningen. Tabellen nedan visar de olika ATTACK/DECAY nivåerna för varje stämma. Om du inte är bekant med ljuduttrycken ATTACK och DECAY kan du föreställa dig ATTACK som ett mått på den tid det tar för en ton att nå sin högsta Ijudstyrka. Decay är motsatsen, ett mått på hur snabbt en ton faller från sin högsta Ijudstyrka tillbaka till SUSTAIN nivå. Följande tabell visar ATTACK/DECAY inställning. Lägg märke till att DU MÅSTE KOMBINERA ATTACK OCH DECAY INSTÄLLNINGARNA GENOM ATT ADDERA DEM OCH SKRIVA IN TOTALA VÄRDET. Du kan exempelvis ställa in HÖG ATTACK och LÅG DECAY genom att addera värdet för låg attack (64) med värdet för låg decay (2). Summan (66) talar om för datorn att ställa in högt attack- och lågt decay-förhållande. Du kan också öka attackförhållandet genom att addera samman dem (128 + 64 + 32 + 16 = högsta möjliga attackförhållande = 240).
ATTACK/DECAY-INSTÄLLNING | HÖG ATTACK | MEDIUM ATTACK | LÅG ATTACK | LÄGSTA ATTACK | HÖG DECAY | MEDIUM DECAY | LÅG DECAY | LÄGSTA DECAY | |
---|---|---|---|---|---|---|---|---|---|
STÄMMA 1 | 54277 | 128 | 64 | 32 | 16 | 8 | 4 | 2 | 1 |
STÄMMA 2 | 54284 | 128 | 64 | 32 | 16 | 8 | 4 | 2 | 1 |
STÄMMA 3 | 54291 | 128 | 64 | 32 | 16 | 8 | 4 | 2 | 1 |
Om du ställer in ett attackförhållande utan decay blir decay automatiskt 0, och omvänt. Exempelvis om du skriver POKE 54277,64 sätts medium attack med noll decay för stämma 1. Skriver du POKE 54277,66 sätter du medium attack och lågt decay förhållande (eftersom 66 = 64 + 2 sätts båda inställningarna). Du kan också addera flera attackvärden, eller flera decayvärden. Du kan exempelvis addera låg attack (32) och medium attack (64) far ett kombinerat attackförhållande av 96, därefter addera medium decay med 4 och... hokuspokus.. POKE 54277,100.
Nu är det bäst att demonstrera effekterna genom ett kort program. Skriv ordet NEW, tryck RETURN. och skriv in detta program och kör det.
5 FOR L=54272 TO 54296:POKE L,0:NEXT 10 PRINT "TRYCK EN TANGENT" 20 POKE 54296,15 30 POKE 54277,64 50 POKE 54273,17 : POKE 54272,37 60 GET K$ : IF K$ = "" THEN 60 70 POKE 54276,17: FOR T=1 TO 200: NEXT 80 POKE 54276,16: FOR T=1 TO 50: NEXT 90 GOTO 20
Här har vi använt STÄMMA 1 för att skapa en ton i taget... med medium attack och noll decay. Nyckelraden är rad 30. Genom POKE med 64 av attack/decay inställningen aktiveras ett medium attack förhållande. Resultatet låter som någon som studsar en boll i ett tomt oljefat. Tryck RUN/STOP-tangenten och stoppa programmet. Skriv LIST och tryck RETURN Skriv följande rad och tryck RETURN. (den nya raden 30 ersätter automatisk den gamla raden med samma radnummer):
30 POKE 54277,190
Skriv ordet RUN och tryck RETURN så får du se hur det låter. Vad vi gjort nu är att vi kombinerat flera attack- och decay-inställningar. Inställningarna är: HÖG ATTACK(128) + LÅG ATTACK(32) + LÄGSTA ATTACK(16) + HÖG DECAY(8) + MEDIUM DECAY(4) + LÅG DECAY(2) = 190.
Detta påverkar ljudet att låta som en oboe eller något annat rörblåsinstrument. Om du vill experimentera, prova med att ändra vågform och attack/decay värden i programmet som spelade skalan för att höra hur en oboe låter. Därigenom kan du se hur förändring av attack/decay kan användas för att skapa olika typer av ljudeffekter.
4. SUSTAIN/RELEASE INSTÄLLNINGEN. Så som ATTACK/DECAY aktiveras av ADSR/VÅGFORM-kontrollregistret aktiveras även SUSTAIN/RELEASE av samma register. SUSTAIN/RELEASE låter dig "förlänga" en del av ett speciellt ljud, på samma sätt som sustain-pedalen på en orgel eller piano förlänger tiden innan en ton klingat ut. Vilken som helst ton eller ljudeffekt kan förlängas vid vilken som helst av 16 ljudnivåer... du kan även sätta SUSTAIN på maximum (240) och låta tonen spelas oändligt. SUSTAIN/RELEASE-inställningen kan användas i en FOR... NEXT-loop för att bestämma hur länge tonen ska hållas på SUSTAIN Ijudstyrka innan den avslutas (RELEASE). Följande tabell visar de tal som ska POKEas för att nå olika SUSTAIN/RELEASE-förhållande.
SUSTAIN/RELEASE | HÖG | MEDIUM | LÅG | LÄGSTA | HÖG | MEDIUM | LÅG | LÄGSTA | |
---|---|---|---|---|---|---|---|---|---|
KONTROLLADRESS | SUSTAIN | RELEASE | |||||||
STÄMMA 1 | 54278 | 128 | 64 | 32 | 16 | 8 | 4 | 2 | 1 |
STÄMMA 2 | 54285 | 128 | 64 | 32 | 16 | 8 | 4 | 2 | 1 |
STÄMMA 3 | 54292 | 128 | 64 | 32 | 16 | 8 | 4 | 2 | 1 |
Om du exempelvis använder STAMMA 1, kan du ställa in ett högt SUSTAIN-värde genom att skriva: POKE 54278, 128 eller du kan kombinera ett högt SUSTAIN-värde med ett lågt RELEASE-värde genom att addera 128+2 och sedan skriva POKE 54278,130. Här kommer samma demonstrationsprogram som vi använde i ATTACK/DECAY avsnittet tidigare... nu utökat med SUSTAIN/RELEASE. Lägg märke till skillnaden i "sound".
5 FOR L=54272 TO 54296:POKE L,0:NEXT 10 POKE 54296,15 20 POKE 54277,64 30 POKE 54278,128 40 POKE 54273,17 : POKE 54272,37 50 PRINT "TRYCK EN TANGENT" 60 GET K$ : IF K$ = "" THEN 60 70 POKE 54276,17: FOR T=1 TO 200: NEXT 80 POKE 54276,16: FOR T=1 TO 50: NEXT 90 GOTO 20
På rad 30 ber vi datorn att förlänga (SUSTAIN) tonen med HÖG SUSTAIN-nivå (128 från tabellen ovan), varefter tonen blir RELEASEad) på rad 80. Du kan variera tiden för en ton genom att ändra TO-värdet i rad 70. For att se effekten av att använda RELEASE prova med att ändra rad 30 till: POKE54278,89 (SUSTAIN:80,RELEASE=9).
5. VÄLJA STÄMMA OCH STÄLLA IN HÖG/LÅG FREKVENS Varje individuell ton hos Commodore 64 kräver 2 separata POKE-instruktioner... en för HÖG FREKVENS och en för LAG FREKVENS. Tabellen över musiktonernas värde finns i bilaga M vilken visar vilka POKE-värden som erfordras för att spela de olika tonerna inom Commodore 64's åtta oktavområden. HÖG och LÅG-FREKVENS-kommandona är olika för varje stämma du använder. Detta medger att du kan programmera alla tre stämmorna var för sig för att skapa 3-stämmig musik eller exotiska ljudeffekter.
HÖG och LÅG-FREKVENS POKE-värde för varje stämma visas i tabellen nedan, vilken också innehåller tonvärden för den mellersta (femte) oktaven.
STÄMMA och FREKVENS | POKE-NUMMER | C | C# | D | D# | E | F | F# | G | G# | A | A# | B | C | C# |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
STÄMMA 1/HÖG | 54273 | 34 | 36 | 38 | 40 | 43 | 45 | 48 | 51 | 54 | 57 | 61 | 64 | 68 | 72 |
STÄMMA 1/LÅG | 54272 | 75 | 85 | 126 | 200 | 52 | 198 | 127 | 97 | 111 | 172 | 126 | 188 | 149 | 169 |
STÄMMA 2/HÖG | 54280 | 34 | 36 | 38 | 40 | 43 | 45 | 48 | 51 | 54 | 57 | 61 | 64 | 68 | 72 |
STÄMMA 2/LÅG | 54279 | 75 | 85 | 126 | 200 | 52 | 198 | 127 | 97 | 111 | 172 | 126 | 188 | 149 | 169 |
STÄMMA 3/HÖG | 54287 | 34 | 36 | 38 | 40 | 43 | 45 | 48 | 51 | 54 | 57 | 61 | 64 | 68 | 72 |
STÄMMA 3/LÅG | 54286 | 75 | 85 | 126 | 200 | 52 | 198 | 127 | 97 | 111 | 172 | 126 | 188 | 149 | 169 |
Som du ser, finns det två inställningar för varje stämma. En HÖG- och en LÅGFREKVENS inställning. För att spela en ton måste du POKEa ett värde i HÖGFREKVENS- och ett värde i LÅGFREKVENS-registren. Genom att använda ovanstående tabell finner vi att inställningen för tonen C i förste stämmans femte oktav skrives:
POKE 54273,34:POKE 54272,75Samma ton i stämma 2 blir:
POKE 54280,34:POKE 54279,75Använder vi detta i programmet ser det ut så här:
5 FORL=54272TO54296:POKEL,0:NEXT 10 V=54296:W=54276:A=54277: ←---- Låter adresser motsvaras av bokstav S=54278:H=54273:L=54272 20 POKE V,15:POKE A,190:POKE S,89 ←Sätter VOLYN, ADSR 30 POKE H,34:POKE L,75 ←--------- HÖG/LÅG FREKVENS 40 POKE W,33:FOR T=1 TO 200:NEXT ← Startar tonen, låter den spela 50 POKE W,32 ←------------------- Stänger av tonen
Följande kan användas för att komponera eller spela ett musikstycke med stämma 1. Det är två viktiga lärdomar i detta program. Lägg märke till hur vi namnger alla de långa registeradresserna i programmets första rad. Därefter kan vi använda bokstaven W för "VÅGFORM" istället för 54276.
Den andra lärdomen gäller det sätt vi använder DATA. Detta program är gjort så att du ska skriva in tre värden för varje ton: HÖG FREKVENS, LAG FREKVENS och TIDEN som tonen ska spelas.
För detta stycke används en tidsfördröjning av 125 för en åttondelston, 250 för en fjärdedelston, 375 för en punkterad fjärdedelston, 500 för en halvton och 1000 för en helton. Dessa värden kan ökas eller minskas för att passa ett speciellt tempo, eller din egen musiksmak.
För att förstå hur ett stycke skrivs in studera rad 100. Vi skrev in 34 och 75 som HÖG och LAG FREKVENS-inställning för att spela tonen "C" (från tabellen på föregående sida) och därefter värdet 250 för en fjärdedelston. Därför blir den första tonen i vårt stycke en fjärdedelston "C". Den andra tonen är också en fjärdedel, denna gång tonen "E"... och så fortsätter det till slutet på stycket. Du kan skriva in nästan vilket stycke som helst på detta sätt och använda så många DATA rader du behöver. Du kan fortsätta skriva ton och varaktighetsvärden över flera rader men varje ny programrad måste börja med ordet "DATA". DATA-1,-1,-1 ska vara den sista raden i ditt program. Denna rad avslutar stycket.
Skriv ordet NEW för att radera tidigare program och skriv därefter in följande program. Skriv RUN och tryck RETURN så för då höra melodin:
5 V=54296:W=54276:A=54277:HF=54273:LF=54272:S=54278:PH=54275:PL=54274 10 POKEV,15:POKEW,65:POKEA,190:POKEPH,15:POKEPL,15 20 READH 30 READL 40 READD 50 IFH=-1THENEND 60 POKEHF,H:POKELF,L 70 FORx=D-50TOD-20:POKES,136:NEXT 80 FORt=1TOD:NEXT:POKEHF,0:POKELF,0:POKEW,0 90 GOTO10 100 DATA34,75,250,43,52,250,51,97,375,43,52,125,51,97 105 DATA250,57,172,250 110 DATA51,97,500,0,0,125,43,52,250,51,97,250,57,172 115 DATA1000,51,97,500 120 DATA-1,-1,-1(Hämta)
Till skillnad från musik är Ijudeffekter ofta knutna till en speciell programhändelse så som explosion från ett rymdskepp när det krockar med en barriär i ett rymdspel... eller varningssurr i ett seriöst program, varnande för att du t.ex. är på väg att radera flexskivan.
Du har möjligheter att själv skapa olika Ijudeffekter. Här följer 10 program-idéer som kan hjälpa dig igång att experimentera med Ijudeffekter:
Följande program kan användas till i stort sett alla BASIC program. De har tagits med för att ge dig några program-idéer och demonstrera Commodore 64's Ijudeffektegenskaper.
Lägg märke till den programmeringsgenväg vi använder på rad 10. Vi kan förkorta långa besvärliga ljudregisternummer genom att definiera dem som enkla, lättanvända bokstäver (numeriska variabler). Rad 10 betyder helt enkelt att dessa lätt ihågkommna bokstäver kan användas i stället för de långa nummer vi använda tidigare. Här betyder V = Volym, W = vågform, A = attack/Decay, H = hög frekvens (stämma 1), L = låg frekvens (stämma 1). Vi använder sedan dessa bokstäver istället för siffrorna i vårt program... vilket gör vårt program kortare, inskrivningen kortare och ljudinställningarna lättare att komma ihåg.
10 V=54296 : W=54276 : A=54277 : H=54273 : L=54272 20 POKE V,15 : POKE W,33 : POKE A,15 30 FOR X = 200 TO 5 STEP -2 : POKE H,40 : POKE L,X : NEXT 40 FOR X = 150 TO 5 STEP -2 : POKE H,40 : POKE L,X : NEXT 50 POKE W,0
10 V=54296 : W=54276 : A=54277 : H=54273 : L=54272 20 FOR X = 15 TO 0 STEP -1 : POKE V,X : POKE W,129: POKE A,15 : POKE H,40 : POKE L,200 : NEXT 30 POKE W,0 : POKE A,0