next up previous contents index
Next: Litt om Lisp Up: Rutiner fra signal Previous: Rutiner fra signal

Karplus-Strong-algoritmen

  Karplus-Strong-algoritmen blir brukt til å syntetisere lyden fra oppspente strenger som blir slått an. Kort skissert virker algoritmen som følger:

Vi trenger en tabell for å ta vare på et visst antall noter, og et lavpass-filter til å modifisere nota etter at den er spilt og før den blir puttet tilbake i tabellen igjen. Vi tar det ikke så grusomt nøye med filteret her. Hvis vi for hver tone vi tar ut av tabellen og sender til avspilling tar gjennomsnittet av denne tonen og forrige (allerede filtrerte) tone og putter tilbake i tabellen, er det godt nok. Dette vil virke som et lavpass-filter, og etterhvert jevne ut forskjellen mellom tonene.


(defun fyll-tabell (lengde); tabellen fylles med tilfeldige verdier
  (loop repeat lengde
	collect (+ 20 (random 70))))

(generator pluck instrument-note (length 60)
	   ;; vi vil ha nye tabell-verdier hver gang generatoren kalles
	   (vars (tbl-lgd 10)
		 (tabell (make-array tbl-lgd :initial-contents (fyll-tabell tbl-lgd))))
	   (let* ((denne (aref tabell (mod count tbl-lgd)))
		  (forrige (aref tabell (mod (1- count) tbl-lgd)))
		  (inn-i-tabell (/ (+ tabell-oppslag forrige-oppslag) 2)))
	     (setf note (note (floor tabell-oppslag)))
	     (setf (aref tabell (mod count tbl-lgd)) inn-i-tabell)
	     (setf rhythm 0.5)))

 
Figure 4.14: Pluck --- forløpet blir lavpass-filtrert

Selvfølgelig kan formelle beskrivelser fra et hvilket som helst felt brukes som materiale for en musikalsk komposisjon. Astronomi , biologi , geologi  osv.



Anders Vinjar
Tue Jan 9 13:10:19 MET 1996