sam.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 Functions for reading sample files
function
(sam:read filename [:time-offset][:dur][:nchans][:transpose][:base][:r]) Read sound file filename - string. The fully qualified sound file name. :time-offset - flonum. Time offset in seconds from start of file. Default 0 NOTE: The time offset is applied *BEFORE* stretching. :dur - flonum. The duration in seconds to be read. Default 10000 NOTE: The duration is *BEFORE* stretching. :nchans - integer. The number of channels to return. If nchans is 1, return a mono sound, stereo channels files are mixed If nchans is 2, return 2 channel array, mono signals are promoted For any other nchans value, return the sound as is. Default NIL :transpose - integer. Number of half-steps to transpose the sound. The transposition value is summed with the Nyquist transpose environment. The step size ratio may be changed for alternative tunings. See base argument below. Default 0 :base - flonum. The transposition step size ratio, Default +12ROOT2+ :r - flonum. A direct stretch factor. Default 1 return - SOUND or sound vector.
function
(sam:loop filename hz [:tune][:sr][:loop-as-time][:start][:end][:fm][:dur][:phase][:refkey]) Generate sound by extracting wave table from sound file filename - string. hz - flonum. The frequency in Hertz of the result. :tune - flonum. An additional tuning factor may be used to nudge the pitch. :sr - integer. The sample rate of the file. Default *sound-srate* :loop-as-time - bool. A flag which indicates how loop start/end points are interpreted. If true the loop position is set a time offset in seconds from start of the file. If false the loop points are treated as sample numbers. Default t :start - flonum. Loop start point either as time or sample number. Default 0 :end - flonum. Loop end point either as time or sample number. end > start, default end = start + 1 (second) :refkey - flonum. Set reference pitch (as MIDI key number). If not specified the tones reference frequency is set implicitly from the loop duration. This is appropriate when the loop contains a single cycle. If however the loop contains multiple cycles of the fundamental it is necessary to set the reference pitch explicitly. Default NIL :fm - sound. An FM modulation source. If specified the duration of the modulation sources determines the duration of the resulting tone. Default (s-rest) :dur - flonum. The tones duration, if and only if the FM option is not used. Default 1 second. :phase - any. See phase function in utilities.lsp return - sound.
;; sam.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 ;; ;; Functions for reading sample files ;; (require 'efx) (provide 'sam) (current-file "sam") ;; @doc function sam:read ;; (sam:read filename [:time-offset][:dur][:nchans][:transpose][:base][:r]) ;; Read sound file ;; ;; filename - string. The fully qualified sound file name. ;; ;; :time-offset - flonum. Time offset in seconds from start of file. ;; Default 0 ;; NOTE: The time offset is applied *BEFORE* stretching. ;; ;; :dur - flonum. The duration in seconds to be read. ;; Default 10000 ;; NOTE: The duration is *BEFORE* stretching. ;; ;; :nchans - integer. The number of channels to return. ;; If nchans is 1, return a mono sound, stereo channels files are mixed ;; If nchans is 2, return 2 channel array, mono signals are promoted ;; For any other nchans value, return the sound as is. Default NIL ;; ;; :transpose - integer. Number of half-steps to transpose the sound. The ;; transposition value is summed with the Nyquist transpose environment. The ;; step size ratio may be changed for alternative tunings. See base argument ;; below. Default 0 ;; ;; :base - flonum. The transposition step size ratio, Default +12ROOT2+ ;; ;; :r - flonum. A direct stretch factor. Default 1 ;; ;; return - SOUND or sound vector. ;; (defun sam:read (filename &key time-offset dur nchans transpose base r) (let* ((sig-a (s-read filename :time-offset (or time-offset 0) :dur (or dur 10000) :nchans (or nchans 1))) (transpose (or transpose 0)) (base (or base +12ROOT2+)) (r (or r 1)) (chans (second *rslt*)) (sig-b (efx:transpose sig-a :transpose transpose :base base :r r))) (cond ((null nchans) sig-b) ((numberp nchans) (cond ((= nchans 1)(->mono sig-b)) ((= nchans 2)(->asound sig-b)) (t sig-b))) (t sig-b)))) ;; @doc function sam:loop ;; (sam:loop filename hz [:tune][:sr][:loop-as-time][:start][:end][:fm][:dur][:phase][:refkey]) ;; Generate sound by extracting wave table from sound file ;; ;; filename - string. ;; ;; hz - flonum. The frequency in Hertz of the result. ;; ;; :tune - flonum. An additional tuning factor may be used to nudge the pitch. ;; ;; :sr - integer. The sample rate of the file. Default *sound-srate* ;; ;; :loop-as-time - bool. A flag which indicates how loop start/end points ;; are interpreted. If true the loop position is set a time offset in seconds ;; from start of the file. If false the loop points are treated as sample ;; numbers. Default t ;; ;; :start - flonum. Loop start point either as time or sample number. ;; Default 0 ;; ;; :end - flonum. Loop end point either as time or sample number. ;; end > start, default end = start + 1 (second) ;; ;; :refkey - flonum. Set reference pitch (as MIDI key number). If not ;; specified the tones reference frequency is set implicitly from the loop ;; duration. This is appropriate when the loop contains a single cycle. If ;; however the loop contains multiple cycles of the fundamental it is ;; necessary to set the reference pitch explicitly. Default NIL ;; ;; :fm - sound. An FM modulation source. If specified the duration of the ;; modulation sources determines the duration of the resulting tone. ;; Default (s-rest) ;; ;; :dur - flonum. The tones duration, if and only if the FM option is not ;; used. Default 1 second. ;; ;; :phase - any. See phase function in utilities.lsp ;; ;; return - sound. ;; (defun sam:loop (filename hz &key (tune 1) sr (loop-as-time 't) start end refkey fm (dur 1)(phase 0)) ;(here "sam:loop hz = " hz " refkey = " refkey) ;;; DEBUG (let* (loop1 loop2 loop-dur tab refhz) (setf sr (float (or sr *sound-srate*))) (setf start (or start 0)) (setf end (or end (+ start 1))) (if loop-as-time (setf loop1 start loop2 end) (setf loop1 (/ start sr) loop2 (/ end sr))) (setf loop-dur (- loop2 loop1)) (setf refhz (if refkey (step-to-hz refkey) (/ loop-dur))) ;(here "sam:loop refkey = " refkey " refhz = " refhz) ;;; DEBUG (setf fm (or fm (s-rest dur))) (setf tab (list (s-read filename :time-offset loop1 :dur loop-dur :nchans 1) (hz-to-step refhz) t)) (fmosc (hz-to-step (* hz tune)) fm tab (phase phase))))