Audacity Support Forum / Audacity and Nyquist / Nyquist Reference Manual / Nyquist Examples and Tutorials
Back to Pedro Morales' Examples Page
Sound Example: flute.ogg
;;; DSP in Nyquist
;;; Flute Physical Modelling
;;; Based on Nicky Hind CLM Tutorial
;;; (Based on Perry Cook Flute Physical Modelling)
;;; Coded by Pedro J. Morales
;;; e-mail: pmorales @iele-ab.uclm.es
(load "pjmg.lsp")
;; DELAY LINE
(setf dl-class (send class :new '(cnt line len output)))
(send dl-class :answer :isnew '(init-len)
'((setf cnt 0)
(setf len init-len)
(setf line (make-array len))
(dotimes (i len) (setf (aref line i) 0.0))))
(send dl-class :answer :next '(val)
'((setf output (aref line cnt))
(setf (aref line cnt) val)
(setf cnt (if (= cnt (1- len)) 0 (1+ cnt)))
output))
(defun make-delay-line (len)
(send dl-class :new len))
(defun delay-line (dl-obj val)
(send dl-obj :next val))
; UNA EXCITACION
(defun flute-exc (noise-lev vib-amount vib-rate atk dec dur)
(let ((current-flow (sim (pwl atk 0.55 (- dur dec) 0.55 dur) ;puede variar 0.5 .. 0.8
(scale vib-amount (lfo vib-rate dur)))))
(sim current-flow
(scale noise-lev (mult current-flow (lp (noise dur) (/ *sound-srate* 2.0)))))))
;; FLUTE PHYSICAL MODELLING
(setf flute-class (send class :new '(sum1 sum1-output freq dur bore-delay emb-delay
period-samples out-sig last-sig current-bore)))
(defun cubic-polynomial (x) (- x (expt x 3.0)))
(send flute-class :answer :isnew '(exc emb-size ifreq idur)
'((setf sum1 exc)
(setf freq (step-to-hz ifreq))
(setf period-samples (round (/ *sound-srate* freq)))
(setf bore-delay (make-delay-line period-samples))
(setf emb-delay (make-delay-line (round (* emb-size period-samples))))
(setf last-sig 0.0)))
(send flute-class :answer :next '()
'((setf sum1-output (snd-fetch sum1))
(when sum1-output
(progn
(setf current-bore (delay-line bore-delay last-sig))
(setf out-sig
(+ (* 0.7 (+ (* 0.55 current-bore)
(cubic-polynomial (delay-line emb-delay (+ sum1-output
(* 0.5 current-bore))))))
(* 0.3 last-sig)))
(setf last-sig out-sig)))))
(defun flute (freq dur &key (noise-lev 0.0356) (atk 0.05) (dec 0.1) (emb-size 0.5)
(vib-amount 0.015) (vib-rate 5))
(let (obj)
(setf obj (send flute-class :new
(flute-exc noise-lev vib-amount vib-rate atk dec dur) emb-size freq dur))
(hp (snd-fromobject 0.0 *sound-srate* obj) 20.0)))
(ss (seq (flute a4 0.5 :dec 0.01)
(flute b4 0.5 :dec 0.01)
(flute c5 0.5 :dec 0.01)
(flute gs4 1.0)))
Back to Pedro Morales' Examples Page
Audacity Support Forum / Audacity and Nyquist / Nyquist Reference Manual / Nyquist Examples and Tutorials