C-programmer kan lese og skrive lydfiler, og dermed har du direkte tilgang til samplene i lyden og kan lage dine egne syntese- og lydbehandlingsmetoder. Dette trenger ikke være avanserte signalbehandlingsteknikker, enkle og "naive" algoritmer kan ofte låte minst like spennende.
Vi har laget et eget bibliotek som gjør det enkelt å håndtere lydfiler fra C. La oss prøve kaos-programmet fra et tidligere kapittel igjen, men denne gangen skriver vi ut verdiene direkte som samples.
#include <stdio.h>
#include "/local/ckurs/lydfil.h"
Lydfil *lydfil;
void main(void)
{
int i;
float lambda, x;
lydfil = lydfil_openskriv("test", 16000); /* Filnavn, samplerate */
x = 0.5;
for (i=0; i<400000; i++) {
lambda = i/600000.+3.33;
lydfil_skrivsample(lydfil, x*20000.);
x = lambda*x*(1.-x);
}
lydfil_lukk(lydfil);
}
Lydfil-funksjonene skulle være selvforklarende. Programmet må kompileres med -laudiofile for å lenke inn lydfilbiblioteket:
cc kaoslyd.c -laudiofile -o kaoslyd
(Krevende)
Lag en pulsbreddemodulert lyd. Dette kan gjøres ved å skrive f.eks. 200 samples (en periode) 200 ganger etter hverandre i en loop. Første gang er første sample i perioden 0, resten 20000. Andre gang er de to første samplene 0, osv., inntil alle 200 samplene er 0.
Funksjonene for å lese samples fra en lydfil er like enkle. I eksemplet under leser vi inn samples fra en lydfil, ringmodulerer dem (multipliserer med en sinusbølge) og skriver til en annen lydfil. Bemerk &-tegnene i lydfil_openles, de brukes på samme måte som vi har sett for fscanf og betyr at verdiene for antall samples i lyden og for samplingsfrekvensen skal legges inn i variablene antsamp og srate.
#include <stdio.h>
#include <math.h>
#include "/local/ckurs/lydfil.h"
Lydfil *innlydfil, *utlydfil;
void main(void)
{
int i, innsamp, antsamp, srate;
float modulator;
innlydfil = lydfil_openles("test", &antsamp, &srate);
utlydfil = lydfil_openskriv("test2", srate);
for (i=0; i<antsamp; i++) {
modulator = sin(i*110.*2.*3.14159/srate);
innsamp = lydfil_lessample(innlydfil);
lydfil_skrivsample(utlydfil, modulator*innsamp);
}
lydfil_lukk(innlydfil);
lydfil_lukk(utlydfil);
}
Lag et program som tar absoluttverdien av en lyd. Dette simulerer en gitareffekt som heter diodefuzz.