pgtr.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 A plucked string instrument with clipping and portamento
function
(pgtr bplst [:dur][:vel][:bright][:detune][:pos][:vib][:vfrq][:vtab][:vdelay][:vattack])
Clipped plucked string sound with portamento. The sound is composed of two
basic components; An additive sound with percussive decay and an FM
generated sound.
pgtr - list. Portamento break points of the form
((L0 D0 [T0])(L1 D1 [T1])...(Ln Dn [Tn]))
See port.lsp
:dur - flonum. Maximum duration of tone. By default the duration is
determined by the sum D0+D1+...+Dn break point durations.
The dur argument may be used to set a shorter (but not lengthen)
duration. Default: NIL
:bright - flonum. The bright argument is used to scale the modulation
indexes of the FM component. 0 <= bright 127. Default 0
:detune - flonum. Set the relative frequency between the FM and additive
components. Default: 1.00
:pos - flonum. The pan position of the result. May either be a
fixed value or a control signal. Default: 0.5
:vib - flonum. Vibrato depth. This is not a true vibrato since the LFO
signal is only applied to one of the 2 FM modulators.
0<=vib<=127, Default 8
:vfrq - flonum. Vibrato frequency. Default: 7 Hertz
:vtab - table. Vibrato wave table. Default: *sine-table*
:vdelay - flonum. Vibrato delay time. Default: 0.50 seconds
:vattack - flonum. Vibrato attack time. Default 0.50 seconds
return - sound.
;; pgtr.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
;;
;; A plucked string instrument with clipping and portamento
;;
(require 'wtab)
(require 'port)
(require 'linfn)
(require 'map)
(require 'map-vel6)
(require 'map-vibrato)
(provide 'pgtr)
(current-file "pgtr")
(deflin2 pgtr:*bright-map* 0 1 128 16)
(setq pgtr:*vmap* map:*vel6*)
(setq pgtr:*wav1* (wtab:make '(( 1 1.0000)( 3 0.5000)( 5 0.2500)))
pgtr:*wav2* (wtab:make '(( 2 1.0000)( 4 0.5000)( 6 0.2500)))
pgtr:*wav3* (wtab:make '(( 7 0.1429)( 8 0.1250)( 9 0.1111)
(10 0.1000)(11 0.0909)(12 0.8333)
(13 0.0770)(14 0.0714)(15 0.0667)
(16 0.0625)(17 0.5882)(18 0.0556)
(19 0.0526)(20 0.0500)))
)
(defun pgtr:clipper (snd dur)
(highpass2
(let ((epsilon 0.1))
(mult
(s-max snd (mult (percussion dur)(soft-gate dur)))
(asd 0 (- dur epsilon) epsilon)))
50))
(defun pgtr:pluck (penv dur)
(sim (scale 1.0000 (port:fm-cop penv dur :am (percussion dur) :tab pgtr:*wav1*))
(scale 0.2500 (port:fm-cop penv dur :am (percussion (/ dur 2.0)) :tab pgtr:*wav2*))
(scale 0.0125 (port:fm-cop penv dur :am (percussion (/ dur 3.0)) :tab pgtr:*wav3*))
))
(defun pgtr:fm (penv dur &key detune bright vfrq vib vdelay vattack vtab sl)
(let (att dec hold rel ;Carrier
r1 i1 a1 dec1 ;Modulator 1
r2 i2 a2 att2 hold2 dec2 ;Modulator 2
vibamp) ;Vibrato
;; Vibrato
(setf vfrq (or vfrq 7.00)
;vibamp (or vib 0.01)
vibamp (map:vibrato 1 (or vib 8))
vdelay (or vdelay 0.50)
vattack (or vattack 0.50))
;; Carrier
(setf detune (or detune 1.00)
bright-scale (pgtr:*bright-map* (or bright 0))
att 0.00
dec 0.50
rel 0.50
sl (or sl 0.75) ;ADSR sustain level
hold (max 0 (- dur att dec rel)))
;; Modulator 1
(setf r1 (* detune 1.00)
i1 (* bright-scale 3.00)
dec1 dur)
;; Modulator 2
(setf r2 (* detune 3.003)
i2 (* bright-scale 8.0)
att2 2.00
dec2 0.10
hold2 (- dur att2 dec2))
(port:fm-cop penv dur
:am (adsr att dec hold rel sl dur )
:fm (sum
(port:fm-mop penv dur r1 i1 :am (percussion dec1))
(port:fm-mop penv dur r2 i2
:am (asd att2 hold2 dec2)
:fm (port:lfo vfrq penv dur
:mi vibamp
:delay vdelay
:attack vattack
:tab vtab))
)
)))
;; @doc function pgtr
;; (pgtr bplst [:dur][:vel][:bright][:detune][:pos][:vib][:vfrq][:vtab][:vdelay][:vattack])
;;
;; Clipped plucked string sound with portamento. The sound is composed of two
;; basic components; An additive sound with percussive decay and an FM
;; generated sound.
;;
;; pgtr - list. Portamento break points of the form
;; ((L0 D0 [T0])(L1 D1 [T1])...(Ln Dn [Tn]))
;; See port.lsp
;;
;; :dur - flonum. Maximum duration of tone. By default the duration is
;; determined by the sum D0+D1+...+Dn break point durations.
;; The dur argument may be used to set a shorter (but not lengthen)
;; duration. Default: NIL
;;
;; :bright - flonum. The bright argument is used to scale the modulation
;; indexes of the FM component. 0 <= bright 127. Default 0
;;
;; :detune - flonum. Set the relative frequency between the FM and additive
;; components. Default: 1.00
;;
;; :pos - flonum. The pan position of the result. May either be a
;; fixed value or a control signal. Default: 0.5
;;
;; :vib - flonum. Vibrato depth. This is not a true vibrato since the LFO
;; signal is only applied to one of the 2 FM modulators.
;; 0<=vib<=127, Default 8
;;
;; :vfrq - flonum. Vibrato frequency. Default: 7 Hertz
;;
;; :vtab - table. Vibrato wave table. Default: *sine-table*
;;
;; :vdelay - flonum. Vibrato delay time. Default: 0.50 seconds
;;
;; :vattack - flonum. Vibrato attack time. Default 0.50 seconds
;;
;; return - sound.
;;
(defun pgtr (bplst &key dur vel bright detune pos vib vfrq vtab vdelay vattack)
(let ((pos (or pos 0.5))
(dur (or dur (port:get-bplist-duration bplst)))
(penv (port bplst)))
(scale-db (send pgtr:*vmap* :get (or vel 64))
(pan (pgtr:clipper
(sum (pgtr:pluck penv dur)
(pgtr:fm penv dur :detune detune :bright bright
:vib vib :vfrq vfrq :vtab vtab
:vdelay vdelay :vattack vattack ))
dur )
pos ))))