next up previous contents
Next: Grafikk Up: C-programmering for musikere Previous: Filbehandling

Lydbehandling

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.

Å skrive lydfiler

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.

Eksempel 9: Kaotisk oscillator

#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

Oppgave

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

Lese lydfiler

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.

Eksempel 10: Ringmodulering

#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);
}

Oppgave

Lag et program som tar absoluttverdien av en lyd. Dette simulerer en gitareffekt som heter diodefuzz.



\yvind Hammer
Tue Oct 1 17:56:30 MDT 1996