summaryrefslogtreecommitdiff
path: root/demos/pmorales/ks.lsp
diff options
context:
space:
mode:
Diffstat (limited to 'demos/pmorales/ks.lsp')
-rw-r--r--demos/pmorales/ks.lsp33
1 files changed, 33 insertions, 0 deletions
diff --git a/demos/pmorales/ks.lsp b/demos/pmorales/ks.lsp
new file mode 100644
index 0000000..8000f32
--- /dev/null
+++ b/demos/pmorales/ks.lsp
@@ -0,0 +1,33 @@
+;;; DSP in Nyquist
+;;; Karplus-Strong Algorithm
+;;; Coded by Pedro J. Morales.
+;;; e-mail: pmorales@iele-ab.uclm.es
+
+(load "pjmg.lsp")
+
+(setf ks-class (send class :new
+ '(cnt total-cnt last-output current-output string len total-len)))
+
+(send ks-class :answer :isnew '(pitch dur)
+ '((setf len (round (/ *sound-srate* (step-to-hz pitch))))
+ (setf total-len (* *sound-srate* dur))
+ (setf string (snd-samples (noise (/ (step-to-hz pitch))) len))
+ (setf cnt 0)
+ (setf total-cnt 0)
+ (setf last-output 0.0)
+ (setf current-output 0.0)))
+
+(send ks-class :answer :next '()
+ '((setf current-output (aref string cnt))
+ (setf (aref string cnt) (/ (+ current-output last-output) 2.0))
+ (setf last-output current-output)
+ (setf cnt (if (= (1- len) cnt) 0 (1+ cnt)))
+ (setf total-cnt (1+ total-cnt))
+ (if (= total-cnt total-len) NIL current-output)))
+
+(defun ks (pitch dur)
+ (let (obj)
+ (setf obj (send ks-class :new pitch dur))
+ (snd-fromobject 0.0 *sound-srate* obj)))
+
+(ss (seq (ks e2 2)(ks a2 2)(ks d3 2)(ks g3 2)(ks b3 2)(ks e4 2)))