pkd.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 An instrument named, for no particular reason, after Philip K Dick.
function
(pkd:block hz dur env filter [wtab]) env >----------------------------------------| | | filter >------->[2^filter]---| | | | | | hz >------->[* 0.5]---->[*]-->[*]---| | | | | |------| | | | | | tab >------->[osc]-------------->[filter]-->[*]--->
function
(pkd:voice pitch dur [:vel][:env1][:env2][:env3][:r1][:r2][:r3][:a1][:a2][:a3]) Composite sound created by sum of three filtered waveforms 1,2 and 3. Wave 1 provides the fundamental and first 4 octaves above it; 1 2 4 8 16. Wave 2 provides harmonics which are multiples of 3; 3 6 9 12 ... Wave 3 provides harmonics which are multiples of 5; 5 10 15 20 ... Each wave has an associated envelope and non-resonant low pass filter. The envelope drives both the filter cutoff and the overall amplitude. The MIDI velocity controls how much the filters open at peak amplitude. pitch - FLONUM. MIDI key number dur - FLONUM. Duration :vel - FLONUM. MIDI velocity :env1 - SOUND. Wave 1 envelope, default percussion :env2 - SOUND. Wave 2 envelope, default percussion * 0.8 dur :env3 - SOUND. Wave 3 envelope, default percussion * 0.6 dur :r1 - FLONUM. Relative frequency, wave 1, default 1.000 :r2 - FLONUM. Relative frequency, wave 2, default 3.001 :r3 - FLONUM. Relative frequency, wave 3, default 5.010 :a1 - FLONUM. Linear amplitude, wave 1, default 1.000 :a2 - FLONUM. Linear amplitude, wave 2, default 0.333 :a3 - FLONUM. Linear amplitude, wave 3, default 0.200 return - SOUND.
wrapper
(pkd plist dur [:vel][:arpeg][:pos][:env1][:env2][:env3][:r1][:r2][:r3][:a1][:a2][:a3]) Polyphonic Version of pkd:voice plist - LIST or FLONUM. MIDI note(s) to be played. :vel - FLONUM. MIDI velocity :arpeg - FLONUM. Arpeggio intervasl, default 0 :pos - FLONUM or SOUND. Pan position, default 0.5 :env1 - SOUND. Wave 1 envelope, default percussion :env2 - SOUND. Wave 2 envelope, default percussion * 0.8 dur :env3 - SOUND. Wave 3 envelope, default percussion * 0.6 dur :r1 - FLONUM. Relative frequency, wave 1, default 1.000 :r2 - FLONUM. Relative frequency, wave 2, default 3.001 :r3 - FLONUM. Relative frequency, wave 3, default 5.010 :a1 - FLONUM. Linear amplitude, wave 1, default 1.000 :a2 - FLONUM. Linear amplitude, wave 2, default 0.333 :a3 - FLONUM. Linear amplitude, wave 3, default 0.200 return - SOUND VECTOR
;; pkd.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 ;; ;; An instrument named, for no particular reason, after Philip K Dick. ;; (require 'wtab) (require 'saw-16) (require 'definst) (require 'map) (provide 'pkd) (current-file "pkd") (setq pkd:*oct* (wtab:make '((1 1.000)(2 0.500)(4 0.250)(8 0.125)(16 0.063)))) ;; @doc function pkd:block ;; (pkd:block hz dur env filter [wtab]) ;; ;; env >----------------------------------------| ;; | | ;; filter >------->[2^filter]---| | | ;; | | | ;; hz >------->[* 0.5]---->[*]-->[*]---| | ;; | | | ;; |------| | | ;; | | | ;; tab >------->[osc]-------------->[filter]-->[*]---> ;; (defun pkd:block (hz dur env filter &optional (tab *saw-16*)) (let ((ff (min 10000 (* hz 0.5 (expt 2.0 filter))))) (mult (lp (osc (hz-to-step hz) dur tab) (scale ff env)) env))) ;; @doc function pkd:voice ;; (pkd:voice pitch dur [:vel][:env1][:env2][:env3][:r1][:r2][:r3][:a1][:a2][:a3]) ;; Composite sound created by sum of three filtered waveforms 1,2 and 3. ;; Wave 1 provides the fundamental and first 4 octaves above it; 1 2 4 8 16. ;; Wave 2 provides harmonics which are multiples of 3; 3 6 9 12 ... ;; Wave 3 provides harmonics which are multiples of 5; 5 10 15 20 ... ;; Each wave has an associated envelope and non-resonant low pass filter. The ;; envelope drives both the filter cutoff and the overall amplitude. ;; The MIDI velocity controls how much the filters open at peak amplitude. ;; ;; pitch - FLONUM. MIDI key number ;; dur - FLONUM. Duration ;; :vel - FLONUM. MIDI velocity ;; :env1 - SOUND. Wave 1 envelope, default percussion ;; :env2 - SOUND. Wave 2 envelope, default percussion * 0.8 dur ;; :env3 - SOUND. Wave 3 envelope, default percussion * 0.6 dur ;; :r1 - FLONUM. Relative frequency, wave 1, default 1.000 ;; :r2 - FLONUM. Relative frequency, wave 2, default 3.001 ;; :r3 - FLONUM. Relative frequency, wave 3, default 5.010 ;; :a1 - FLONUM. Linear amplitude, wave 1, default 1.000 ;; :a2 - FLONUM. Linear amplitude, wave 2, default 0.333 ;; :a3 - FLONUM. Linear amplitude, wave 3, default 0.200 ;; return - SOUND. ;; (defun pkd:voice (pitch dur &key vel env1 env2 env3 r1 r2 r3 a1 a2 a3) (let* ((hz (step-to-hz pitch)) (vel (or vel 64)) (env1 (or env1 (percussion dur))) (env2 (or env2 (percussion (* 0.8 dur)))) (env3 (or env3 (percussion (* 0.6 dur)))) (r1 (or r1 1.000)) (r2 (or r2 3.001)) (r3 (or r3 5.010)) (a1 (or a1 1.000)) (a2 (or a2 0.333)) (a3 (or a3 0.200)) (filter (map:ctrl 8 vel 0))) (sum (scale a1 (pkd:block (* r1 hz) dur env1 filter pkd:*oct*)) (scale a2 (pkd:block (* r2 hz) dur env1 filter *saw-16*)) (scale a3 (pkd:block (* r3 hz) dur env1 filter *saw-16*)) ))) ;; @doc wrapper pkd ;; (pkd plist dur [:vel][:arpeg][:pos][:env1][:env2][:env3][:r1][:r2][:r3][:a1][:a2][:a3]) ;; Polyphonic Version of pkd:voice ;; ;; plist - LIST or FLONUM. MIDI note(s) to be played. ;; :vel - FLONUM. MIDI velocity ;; :arpeg - FLONUM. Arpeggio intervasl, default 0 ;; :pos - FLONUM or SOUND. Pan position, default 0.5 ;; :env1 - SOUND. Wave 1 envelope, default percussion ;; :env2 - SOUND. Wave 2 envelope, default percussion * 0.8 dur ;; :env3 - SOUND. Wave 3 envelope, default percussion * 0.6 dur ;; :r1 - FLONUM. Relative frequency, wave 1, default 1.000 ;; :r2 - FLONUM. Relative frequency, wave 2, default 3.001 ;; :r3 - FLONUM. Relative frequency, wave 3, default 5.010 ;; :a1 - FLONUM. Linear amplitude, wave 1, default 1.000 ;; :a2 - FLONUM. Linear amplitude, wave 2, default 0.333 ;; :a3 - FLONUM. Linear amplitude, wave 3, default 0.200 ;; return - SOUND VECTOR ;; (defwrapper pkd #'pkd:voice)