Vi har nå gått igjennom de grunnleggende deler av C, og vi kan begynne å lage musikk. Vi skal gi endel eksempler på algoritmisk komposisjon, der vi bruker C-programmer til å generere notelister. Selve lyden genereres med synteseprogrammet CSound. Vi har laget noen enkle CSound-instrumenter som man kan bruke til testformål, disse ligger i /local/ckurs/test.orc.
En noteliste som kan leses av CSound består av en rekke enkeltnoter, en på hver linje i en tekstfil. Linjene kan se ut f.eks. slik:
;Ins Start Dur Frekv Amp i1 0 1 440 80 i1 1 1 660 70
Som antydet i kommentarlinjen øverst, angir det første feltet hvilket instrument vi vil bruke (det ligger 3 forskjellige instrumenter i test.orc, nummerert fra i1 til i3). Det neste feltet angir notens starttidspunkt i sekunder. Det tredje feltet angir notens varighet i sekunder. De to siste feltene er det opp til instrumentet å tolke, men det er vanlig å bruke dem til frekvens i Hz og amplityde i dB.
Granulær syntese innebærer at vi bygger opp lydbilder ved hjelp av et stort antall korte, enkle lyder ("plopper"). Kombinasjonen av C og CSound egner seg godt for dette. Følgende program lager en stor noteliste ved hjelp av tilfeldighet med pålagte "trender":
#include <stdio.h> int i; float frek, start; void main(void) { printf("f1 0 4096 10 1\n"); /* Maa vaere med for CSound */ for (i=0; i<1000; i++) { frek = rand()*655/32768+i; start = i*i/100000.; printf("i1 %f 0.1 %f 60\n", start, frek); } }
Legg merke til kommentaren, som er markert med /* og */. I printf er det brukt en ny formateringskode, %f, som må brukes for flyttall.
Kompiler og kjør dette programmet (kall det f.eks. granul). Notelisten blir skrevet ut på skjermen. For å skrive til en fil istedet kan vi bruke et UNIX-knep, nemlig å redirigere utskriften fra programmet:
granul > granul.sco
Utskriften blir da sendt til filen granul.sco. For å lage lyd vha. CSound kan man gi kommandoen
csound -Ago testlyd /local/ckurs/test.orc granul.sco
CSound bruker da orkesterfilen /local/ckurs/test.orc og score-filen (notelisten) granul.sco, og lager en lydfil som får navnet testlyd. Spill lydfilen med kommandoen sfplay testlyd.
Hvis du vil eksperimentere med programmet, kan det være lurt å legge alle UNIX-kommandoene (kompilering, kjøring, syntese og avspilling) i en egen kommandofil. Kommandofilen må gjøres kjørbar ved hjelp av UNIX-kommandoen
chmod +x filnavn
En gammel traver i bransjen er kaos-musikk, der vi bruker ulineære dynamiske systemer til å produsere notelistene. Her er et eksempel som bruker den såkalte Verhulst-likningen:
#include <stdio.h> int i; float lambda, x; void main(void) { x = 0.5; for (i=0; i<200; i++) { lambda = i/300.+3.33; printf("i2 %f 0.3 %f 80\n", i/8., x*1000.+50.); x = lambda*x*(1.-x); } }
Bruk CSound og C til å simulere lyden av en ball som spretter fortere og fortere, på følgende måte. Velg en fast pitch. Start med et intervall mellom notene på 0.5 sekunder, og multipliser dette intervallet med 0.9 for hver påfølgende note slik at vi får aksellerando. Generer 50 noter.
(Litt krevende)
Utvid programmet fra oppgave 1 til å simulere mange baller, som starter sprettingen på tilfeldige tidspunkter og med hver sin egen tilfeldige pitch. Husk at CSound ikke krever at notene angis med stigende starttidspunkter, de kan godt ligge hulter til bulter. Tips: Lag en ny løkke utenpå løkken fra oppgave 1!