psynth.lsp Version 1.00 31 October 2004 Author Steven Jones Contact jones57@swbell.net include the word "nyquist" in subject line The contents of this file are released under the terms of the GNU General Public License. See the file LICENSE.txt psynth is a duel modulator single carrier FM instrument with portamento and delayed vibrato
function
(psynth prtlst [:gate][:vel][:pos][:rc][:r1][:mi1][:r2][:mi2][:vib][:vfrq][:vdelay][:vtab]) A two modulator fm instrument with portamento prtlst - List of portamento break points. See port.lsp :gate - flonum. Normally the tones duration is determined by the "duration" of prtlst. The gate parameter may be used to terminate the sound prematurely. Default nil :vel - flonum. Velocity 0<= vel <= 127. Default 64 :pos - flonum or sound. Pan position. 0 <= pos <= 1, default 0.5 :rc - flonum. Relative carrier frequency, defualt 1.0 :r1 - flonum. Relative frequency of modulator 1, default 1.0 :mi1 - flonum. Modulation index for modulator 1, default 4.00 :r2 - flonum. Relative frequency for modulator 2, default 3.003 :mi2 - flonum. Modulation index for modulator 2, default 4.00 :vib - flonum. Vibrato depth, 0 <= vib < 128, default 1 :vfrq - flonum. Vibrato frequency, default 7.0 Hz :vdelay - flonum. Vibrato delay, default 0 seconds :vtab - table. Vibrato wave table, default *tri-table* return - sound vector
;; psynth.lsp ;; Version 1.00 31 October 2004 ;; Author Steven Jones ;; ;; Contact jones57@swbell.net include the word "nyquist" in subject line ;; ;; The contents of this file are released under the terms of the GNU General ;; Public License. See the file LICENSE.txt ;; ;; psynth is a duel modulator single carrier FM instrument with portamento ;; and delayed vibrato ;; (require 'map) (require 'map-psynth) (require 'port) (require 'linfn) (provide 'psynth) (current-file "psynth.lsp") (deflin2 psynth:v-mi-map 0 0.5 127 2) (setq psynth:*v-db-map* map:*vel6*) ;; penv - Portamento envelope ;; dur - duration ;; r - frequency ratio ;; mi - modulation index ;; fm - fm signal ;; env - envelope parameter list ;; envfn - envelope function ;; (defun psynth:mop (penv dur r mi fm env envfn) (port:fm-mop penv dur r mi :fm fm :tab *sine-table* :am (apply envfn (flatten (list env dur))))) ;; @doc function psynth ;; (psynth prtlst [:gate][:vel][:pos][:rc][:r1][:mi1][:r2][:mi2][:vib][:vfrq][:vdelay][:vtab]) ;; A two modulator fm instrument with portamento ;; ;; prtlst - List of portamento break points. See port.lsp ;; :gate - flonum. Normally the tones duration is determined by the ;; "duration" of prtlst. The gate parameter may be used to ;; terminate the sound prematurely. Default nil ;; :vel - flonum. Velocity 0<= vel <= 127. Default 64 ;; :pos - flonum or sound. Pan position. 0 <= pos <= 1, default 0.5 ;; :rc - flonum. Relative carrier frequency, defualt 1.0 ;; :r1 - flonum. Relative frequency of modulator 1, default 1.0 ;; :mi1 - flonum. Modulation index for modulator 1, default 4.00 ;; :r2 - flonum. Relative frequency for modulator 2, default 3.003 ;; :mi2 - flonum. Modulation index for modulator 2, default 4.00 ;; :vib - flonum. Vibrato depth, 0 <= vib < 128, default 1 ;; :vfrq - flonum. Vibrato frequency, default 7.0 Hz ;; :vdelay - flonum. Vibrato delay, default 0 seconds ;; :vtab - table. Vibrato wave table, default *tri-table* ;; ;; return - sound vector ;; (defun psynth (prtlst &key gate vel pos rc ;carrier r1 mi1 ;modulator 1 r2 mi2 ;modulator 2 vib vfrq vdelay vtab);vibrato (let* ((dur (port:get-bplist-duration prtlst)) (gate (or gate dur)) (dur (min dur gate)) (penv (port prtlst)) (vel (or vel 64)) (vscale (psynth:v-mi-map vel)) (pos (or pos 0.5)) (rc (or rc 1.000)) (envc (list 0 1 0.25 0.5 dur)) (envfnc #'adsr) (r1 (or r1 1.00)) (mi1 (* vscale (or mi1 4.00))) (env1 (list 0 1 0.25 0.5 dur)) (envfn1 #'adsr) (r2 (or r2 3.003)) (mi2 (* vscale (or mi2 4.00))) (env2 (list 1 0.5 0.5 0.8 dur)) (envfn2 #'adsr) (vibamp (* (or vib 1) 0.0005)) (vfrq (or vfrq 7.00)) (vdelay (or vdelay 0.5)) (vattack (* vdelay 0.25)) (vsig (port:lfo vfrq penv dur :mi vibamp :tab (or vtab *tri-table*) :delay vdelay :attack vattack))) (pan (scale-db (send psynth:*v-db-map* :get vel) (port:fm-cop penv dur :r rc :am (apply envfnc (flatten (list envc dur))) :fm (sum vsig (port:fm-mop penv dur r1 mi1 :fm vsig :am (apply envfn1 (flatten (list env1 dur)))) (port:fm-mop penv dur r2 mi2 :fm vsig :am (apply envfn2 (flatten (list env2 dur)))) ))) pos)))