summaryrefslogtreecommitdiff
path: root/lpc/lpcdemo.lsp
diff options
context:
space:
mode:
Diffstat (limited to 'lpc/lpcdemo.lsp')
-rw-r--r--lpc/lpcdemo.lsp275
1 files changed, 275 insertions, 0 deletions
diff --git a/lpc/lpcdemo.lsp b/lpc/lpcdemo.lsp
new file mode 100644
index 0000000..2f02999
--- /dev/null
+++ b/lpc/lpcdemo.lsp
@@ -0,0 +1,275 @@
+;;; LPC demo 1
+;;; Pedro J. Morales.
+;;; February, 04
+;;; Roger B. Dannenberg
+;;; July, 04
+
+; PLEASE config ======================================================
+
+
+; where is the file lpc-example.dat
+(setf *lpc-data* "d:/rbd/nyquist/lpc/lpc-exmpl.dat")
+
+
+; this file generated by Nyquist will be loaded by Octave (or Matlab)
+(setf *default-octave-file*
+ "d:/rbd/temp/nyquist.dat")
+
+; config END ===========================================================
+
+
+
+; file-io tools ========================================================
+
+
+(defun octave-1 (outf data varname datatype &optional (n 1000))
+ (prog ((points (case datatype
+ (SND (snd-samples data (1+ n)))
+ (ARR data)))
+ len)
+ (setf len (length points))
+ (cond ((> len n)
+ (setf len n)
+ (format t "WARNING: DATA TRUNCATED TO ~A POINTS~%" len)))
+ (format outf "# name: ~A\n" varname)
+ (format outf "# type: matrix\n# rows: 1\n# columns: ~A\n " len)
+ (dotimes (i len)
+ (format outf "~A " (aref points i)))
+ (format outf "\n")))
+
+(defun octave (data-lists) ; (data varname datatype &optional (n 1000))
+ (prog ((filename *default-octave-file*)
+ outf)
+ (setf outf (open filename :direction :output))
+ (cond ((null outf)
+ (format t "octave: could not open ~A!~%" filename)
+ (return nil)))
+ (format t "octave: writing ~A ... ~%" filename)
+ (cond ((null outf)
+ (format t "octave: could not open ~A!~%" filename)
+ (return nil)))
+ ;(format t "octave: writing ~A ... ~%" filename)
+ (dolist (l data-lists)
+ (apply #'octave-1 (cons outf l)))
+ (close outf)))
+
+
+; LPANAL ======================================================
+
+; get lpc data ---------------------------------------------------
+
+
+(defun do-lpc-analysis ()
+ (setf *myfile* "d:/rbd/nyquist/voice.wav")
+ (save-lpc-file (make-lpanal-iterator (s-read *myfile*) 0.08 0.04 50)
+ "temp.dat"))
+
+;(if (not (boundp 'lpc-example))
+; (do-lpc-analysis))
+
+;(if (not (boundp 'lpc-example))
+; (setf lpc-example (load-file-data *lpc-data*)))
+
+;-----------------------------------------------------------------
+
+
+; SHOW-LPC-DATA ------------------------------------------------
+; show values of LPC analysis frames ----------------------------
+
+
+(defun ex-1 ()
+ ; do not show filter coefs
+ (show-lpc-data (make-lpc-file-iterator *lpc-data*) 100 120 NIL))
+
+
+; ------- SAVE-FILE-DATA ---------------------------------------
+(defun ex-2 ()
+ (save-lpc-file (make-lpc-file-iterator *lpc-data*) "temp.dat"))
+
+
+;----------- LPC-FREQ ------------------------------------------
+; LPC-FREQ. Show frequency response of ALLPOLES filter.
+; NEEDS MATLAB or OCTAVE
+;
+
+(defun ex-3 ()
+ (lpc-freq "frm70" (make-lpc-file-iterator *lpc-data*) 70))
+
+
+; in MATLAB/OCTAVE:
+; >> load -force nyquist.dat
+; >> [H,W] = freqz(1, frm70, 512);
+; >> plot(W,20*log10(abs(H)));
+
+
+;-------------------------------------------------------------------------
+; LPC-STABILITY Check for Stability of LPC filters
+; NEEDS MATLAB/OCTAVE
+
+; EXAMPLE
+
+; (ex-3)
+
+; in MATLAB/OCTAVE:
+; >> load -force nyquist.dat
+; >> find(abs(roots(frm70)) > 1)
+; if any abs root is > 1.0 then UNSTABLE
+
+;--------------------------------------------------------------------------
+; ALLPOLES LPC allpoles filter
+; WARNING: this is a static filter
+; for LPC resynthesis a dynamic LPC filter is needed
+
+
+; EXAMPLE
+
+(defun ex-4 ()
+ (play (seq
+ (allpoles-from-lpc (buzz 12 f2 (lfo 5.0 4.0))
+ (nth-frame (make-lpc-file-iterator *lpc-data*)
+ 30))
+ (allpoles-from-lpc (buzz 12 f2 (lfo 5.1 4.0))
+ (nth-frame (make-lpc-file-iterator *lpc-data*)
+ 60))
+ (allpoles-from-lpc (buzz 12 g2 (lfo 5.3 4.0))
+ (nth-frame (make-lpc-file-iterator *lpc-data*)
+ 100)) )))
+
+
+(setf a-lpcdata
+'(63.2144 0.674387 0.103287
+ #(-0.0381026 0.00804115 0.0109905 0.0145117 0.00199174 -0.00129314 0.0171826
+ 0.0181176 0.00179391 -0.0114089 -0.0120949 -0.000410595 -0.0122539
+ -0.0209354 -0.00804976 -0.00345041 -0.00409532 -0.00227011 0.014224 0.0135451
+ 0.0056023 -0.00651142 -0.00564953 -0.0168921 -0.0377939 -0.0449506 -0.0355592
+ -0.0339316 -0.0454434 1.19336)))
+
+(setf e-lpcdata
+'(40.7157 0.149753 0.0606467
+ #(0.0244574 -0.0225545 -0.0172724 -0.0122709 -0.0042946 0.00886974 0.0121516 0.0120936
+ 0.00197545 -0.00582163 -0.018367 -0.0201546 -0.00440599 0.00638936 0.0166275 0.0185066
+ 0.00890464 -0.00158013 -0.00494974 -0.00479037 0.0130814 0.0138648 -0.0022018 -0.021368
+ -0.0343532 -0.0312712 -0.0574975 -0.0918824 -0.112016 1.31398)))
+
+
+(setf i-lpcdata
+'(5.5391 0.0321825 0.0762238 #(-0.0341124 -0.0149688 -0.00585657 -0.0111572
+ 0.00769712 0.0190367 0.00885366 0.0112762 0.0118286 -0.00059044 -0.0140864 -0.0123688
+ -0.0151128 0.00214354 -0.00810219 -0.00538188 0.00631382 0.020771 0.0356498 0.0295531
+ 0.0242797 0.0124296 0.00445127 -0.013062 -0.0387178 -0.0527783 -0.0685511 -0.076575
+ -0.0846335 1.24521)))
+
+(defun noise-vocal (lpcdata dur)
+ (allpoles-from-lpc (noise dur) lpcdata))
+
+(defun ex-5 ()
+ (play
+ (seq (noise-vocal a-lpcdata 1)
+ (noise-vocal e-lpcdata 1)
+ (noise-vocal i-lpcdata 1))))
+
+(defun buzz-vocal (lpcdata dur)
+ (allpoles-from-lpc (buzz 16 e2 (const 0.0 dur))
+ lpcdata))
+
+(defun ex-6 ()
+ (play
+ (seq (buzz-vocal a-lpcdata 1)
+ (buzz-vocal e-lpcdata 1)
+ (buzz-vocal i-lpcdata 1))))
+
+
+; ---- LPRESON ------------------------------------------------------------
+;
+(defun ex-7a ()
+ ;; parameters are sound, lpc-iterator, skiptime
+ (lpreson (noise 6.5) (make-lpc-file-iterator *lpc-data*) 0.04))
+
+(defun ex-7 ()
+ (play (ex-7a)))
+
+(defun ex-8a (p dur)
+ (lpreson (buzz 16 p (scale 1.5 (lfo 3.0 dur)))
+ (make-lpc-file-iterator *lpc-data*)
+ 0.04))
+
+(defun ex-8 ()
+ (play
+ (sim (seq (ex-8a c4 1) (ex-8a g3 1) (ex-8a a3 1) (ex-8a b3 1) (ex-8a c4 1))
+ (seq (ex-8a c2 2) (ex-8a f2 1) (ex-8a g2 1) (ex-8a e2 1)))))
+
+(defun noalias-buzz (p nmax)
+ (min
+ (round (/ *sound-srate* (* 2.0 (step-to-hz p))))
+ nmax))
+
+(defun ex-9a (p dur skiptime)
+ (mult (env 0.01 0.01 0.1 1.0 1.0 1.0 dur)
+ (lpreson (buzz (noalias-buzz p 16) p (scale 1.5 (lfo 3.0 dur)))
+ (make-lpc-file-iterator *lpc-data*)
+ skiptime)))
+
+
+(defun ex-9b (stretch skiptime)
+ (play
+ (sim (seq (ex-9a c4 (* 1 stretch) skiptime)
+ (ex-9a g3 (* 1 stretch) skiptime)
+ (ex-9a a3 (* 1 stretch) skiptime)
+ (ex-9a b3 (* 1 stretch) skiptime)
+ (ex-9a c4 (* 1 stretch) skiptime))
+ (seq (ex-9a c2 (* 2 stretch) skiptime)
+ (ex-9a f2 (* 1 stretch) skiptime)
+ (ex-9a g2 (* 1 stretch) skiptime)
+ (ex-9a e2 (* 1 stretch) skiptime)))))
+
+
+(defun ex-9 ()
+ (ex-9b 1.0 0.04))
+
+(defun ex-10 ()
+ (ex-9b 1.0 0.02))
+
+(defun ex-11 ()
+ (ex-9b 2.0 0.04))
+
+(defun ex-12 ()
+ (ex-9b 0.5 0.02))
+
+(defun ex-13 ()
+ (ex-9b 4 0.02))
+
+(defun ex-14a (p dur skiptime)
+ (mult (env 0.01 0.01 0.1 1.0 1.0 1.0 dur)
+ (lpreson (osc-saw (sim (step-to-hz (+ p 0)) (scale 1.5 (lfo 3.0 dur))))
+ (make-lpc-file-iterator *lpc-data*)
+ skiptime)))
+
+(defun ex-14b (stretch skiptime)
+ (play
+ (sim (seq (ex-14a c4 (* 1 stretch) skiptime)
+ (ex-14a g3 (* 1 stretch) skiptime)
+ (ex-14a a3 (* 1 stretch) skiptime)
+ (ex-14a b3 (* 1 stretch) skiptime)
+ (ex-14a c4 (* 1 stretch) skiptime))
+ (seq (ex-14a c2 (* 2 stretch) skiptime)
+ (ex-14a f2 (* 1 stretch) skiptime)
+ (ex-14a g2 (* 1 stretch) skiptime)
+ (ex-14a e2 (* 1 stretch) skiptime)))))
+
+
+(defun ex-14 ()
+ (ex-14b 1 0.04))
+
+(defun ex-15 ()
+ (ex-14b 4 0.02))
+
+(defun ex-16 ()
+ (ex-14b 8 0.08))
+
+
+
+
+
+
+
+