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.