Substractive Synthesis and Filters, Granular Synthesis
A series of gif images of the lecture slides (filters)...
A series of gif images of the lecture slides (granular synthesis)...
Note: the fm-violin and dlocsig
Here's a mutated version of v.ins (dv.ins) that uses dlocsig instead of locsig to localize the samples in space. You'll have to compile and load dlocsig to be able to use this version of the fm-violin...
(definstrument onepole(start-time duration amplitude &key (b1 '(0 0.5 1 0.5))) (multiple-value-bind (beg end) (get-beg-end start-time duration) (let* ((noise (make-randh :frequency (* 0.49 sampling-rate) :amplitude amplitude)) (b1-env (make-env :envelope b1)) (opfilt (make-one-pole :a0 1.0 :b1 0.5))) (Run (loop for i from beg to end do (setf (smpflt-b1 opfilt) (env b1-env)) (outa i (one-pole opfilt (randh noise))))))))
(definstrument onezero(start-time duration amplitude &key (a1 '(0 0.5 1 0.5))) (multiple-value-bind (beg end) (get-beg-end start-time duration) (let* ((noise (make-randh :frequency (* 0.49 sampling-rate) :amplitude amplitude)) (a1-env (make-env :envelope a1)) (ozfilt (make-one-zero :a0 1.0 :a1 0.5))) (Run (loop for i from beg to end do (setf (smpflt-a1 ozfilt) (env a1-env)) (outa i (one-zero ozfilt (randh noise))))))))
(defmacro b1-from-r-freq (r freq) `(- (* 2.0 ,r (cos (in-hz ,freq))))) (defmacro b2-from-r (r) `(* ,r ,r)) (definstrument twopole(start-time duration amplitude &key (freq '(0 20 1 10000)) (r '(0 0.5 1 0.5))) (multiple-value-bind (beg end) (get-beg-end start-time duration) (let* ((noise (make-randh :frequency (* 0.49 sampling-rate) :amplitude amplitude)) (freq-env (make-env :envelope freq)) (r-env (make-env :envelope r)) (ppfilt (make-ppolar :r 0.5 :frequency 440.0))) (Run (loop for i from beg to end do (let* ((freq0 (env freq-env)) (r0 (env r-env))) (setf (smpflt-b1 ppfilt) (b1-from-r-freq r0 freq0)) (setf (smpflt-b2 ppfilt) (b2-from-r r0)) (outa i (ppolar ppfilt (randh noise)))))))))
(defmacro set-formnt(filter freq r) `(let* ((freq ,freq) (r ,r)) (setf (smpflt-a2 (frmnt-tz ,filter)) (- r) (smpflt-b1 (frmnt-tp ,filter)) (- (* 2.0 r (cos (in-hz freq)))) (smpflt-b2 (frmnt-tp ,filter)) (* r r)))) (definstrument simp-formnt(start-time duration amplitude &key (freq '(0 20 1 10000)) (r '(0 0.707 1 0.707))) (multiple-value-bind (beg end) (get-beg-end start-time duration) (let* ((noise (make-randh :frequency (* 0.5 sampling-rate) :amplitude amplitude)) (freq-env (make-env :envelope freq :start-time start-time :duration duration)) (r-env (make-env :envelope r :start-time start-time :duration duration)) (fmfilt (make-formnt :frequency 440 :r 0.99))) (Run (loop for i from beg to end do (set-formnt fmfilt (env freq-env) (env r-env)) (outa i (formnt fmfilt (randh noise))))))))All of these example instrument do some internal contortions to move through envelopes the center frequency, resonance and or assorted internal coefficients. Hope you can figure things out. Believe it or not everything that's being done is documented in the clm manual... :-)
In the first one we modified the code of the original v.ins (Bill's fm-violin) and added a moog filter based of Tim Stilson's moog filter. Needless to say, for this to work we have to first compile and load the moog filter code moog.ins. After that, compiling and loading the modified vmoog.ins fm violin file will generate a mutant fm-violin that understands two additional parameters, freq-env: the frequency envelope for the cutoff frequency of the moog filter and res-env: an envelope that controls the resonance of the filter.
We can also create a general purpose moog filter instrument that processes a soundfile. The code can be found in moog-filter.ins. One way to use this instrument to process arbitrary clm instrument output is to use a sound-let to create a temporary soundfile that holds the notes that are to be filtered. Better still, we can create a custom macro that adds some syntactic sugar and makes things look better. See the "with-moog" macro in the previous file plus an example on how to use it.
Here is the header of the instrument and a short description of its parameters (see the source code for the parameter defaults):
(definstrument grani (start-time duration amplitude file &key (grains grani-grains) (amp-envelope grani-amp-envelope) (grain-envelope grani-grain-envelope) (grain-envelope-end grani-grain-envelope-end) (grain-envelope-transition grani-grain-envelope-transition) (grain-duration grani-grain-duration) (grain-duration-spread grani-grain-duration-spread) (grain-duration-limit grani-grain-duration-limit) (srate grani-srate) (srate-spread grani-srate-spread) (srate-linear grani-srate-linear) (srate-base grani-srate-base) (srate-error grani-srate-error) (grain-start grani-grain-start) (grain-start-spread grani-grain-start-spread) (grain-density grani-grain-density) (grain-density-spread grani-grain-density-spread) (reverb-amount grani-reverb-amount) (reverse grani-reverse) (where-to grani-where-to) (where-bins grani-where-bins) (grain-distance grani-grain-distance) (grain-distance-spread grani-grain-distance-spread) (grain-degree grani-grain-degree) (grain-degree-spread grani-grain-degree-spread))
(with-sound()(grani 0 8 2 "/usr/ccrma/web/CCRMA/Courses/220b/Lectures/9/Sounds/small-gong.snd"))
(with-sound()(grani 0 8 3 "/usr/ccrma/web/CCRMA/Courses/220b/Lectures/9/Sounds/small-gong.snd" :grain-duration 0.06 :grain-density 40 :grain-density-spread 5 :grain-start '(0 0.3 1 0.4)))
(with-sound()(grani 0 8 3 "/usr/ccrma/web/CCRMA/Courses/220b/Lectures/9/Sounds/small-gong.snd" :grain-duration 0.06 :grain-density 40 :grain-density-spread 5 :grain-start '(0 0.1 1 0.22) :srate -12))
(with-sound()(grani 0 8 3 "/usr/ccrma/web/CCRMA/Courses/220b/Lectures/9/Sounds/small-gong.snd" :grain-duration 0.06 :grain-density 40 :grain-density-spread 5 :grain-start '(0 0.1 1 0.22) :grain-start-spread 0.2 :srate -12))
(with-sound(:channels 2 :statistics t) (grani 0 8 0.4 "/usr/ccrma/web/CCRMA/Courses/220b/Lectures/9/Sounds/tubular-bell.snd" :grain-duration 0.06 :grain-density 20 :grain-density-spread 2 :srate 0) (grani 0 8 0.4 "/usr/ccrma/web/CCRMA/Courses/220b/Lectures/9/Sounds/tubular-bell.snd" :grain-duration 0.08 :grain-density 20 :grain-density-spread 2 :srate 5 :grain-degree 0) (grani 0 8 0.4 "/usr/ccrma/web/CCRMA/Courses/220b/Lectures/9/Sounds/tubular-bell.snd" :grain-duration 0.05 :grain-density 35 :grain-density-spread 3 :srate -5 :grain-degree 90))Try replacing the turkish-cymbal-1.snd soundfile instead of the tubular-bell...
Use dlocsig and/or the hrtf instrument to locate in space a musical phrase built notes rendered with the grani instrument (hint: for grani you will have to use move-sound to wrap the notes you want to spatialize - can you figure out why it's not possible to use dlocsig inside grani?). Submit, as usual, to unjung@ccrma...
This assignment is due by March 7th 2000.
©2000 Fernando Lopez-Lezcano. All Rights Reserved. nando@ccrma.stanford.edu
|