Physical Modelling and Waveshaping
Lecture Slides
A series of gif images of the lecture slides... (sorry, only accesible from within Stanford University)
Physical Modeling
Examples
Singer, Perry Cook's physical modeling instrument in clm.
And a
couple of examples by Perry Cook.
A silly vocal percussion example
by Matt Wright.
Perry's
thesis, sound examples, and a screen shot of the original GUI from the NeXT.
See paper references at the beginning of the clm instrument. This instrument was
translated by Bill from the original C code as implemented for Perry's
thesis.
Here is the (very simple!) header of the instrument and a short description of its parameters:
(definstrument singer (beg amp data)
Mandatory parameters
- beg
- starting time in seconds
- amp
- amplitude
- data
- a list of lists that contains information for each synthesis "frame". Each component list has the following components (see the examples below):
- dur: duration of the synthesis frame
- shape: shape of the vocal tract
- glot: glotal excitation
- frequency: frequency of glotal source
- glotamp: amplitude of the glotal component
- noiseamp: amplitude of the noise component
- vibramt: percentage of vibrato
The shape and glot parameters in the frame list can be a lisp variable containing a vocal tract shape or glotal excitation or can be a pointer to a file that contains it. If you compile and load the singer.ins instrument you will also load a default collection of shapes and glots. These are the available default definitions:
Glotal excitations:
- test.glt
- loud.glt
- soft.glt
- wide4.glt
- wide5.glt
- greekdefault.glt
- lowbass.glt
Vocal Tract Shapes
- aa.shp
- hh2.shp
- dhh.shp
- aah.shp
- hhh.shp
- ohh.shp
- ah.shp
- oo.shp
- ahh.shp
- ee-.shp
- hoo.shp
- ooo.shp
- ee.shp
- ih.shp
- ee2.shp
- ihh.shp
- open.shp
- thh.shp
- aw.shp
- eee.shp
- tt+.shp
- aww.shp
- eee2.shp
- jjj.shp
- ttt.shp
- bb2.shp
- eh.shp
- kk+.shp
- pipe1.shp
- tzz.shp
- bbb.shp
- ehh.shp
- kk2.shp
- pp+.shp
- uhh.shp
- big.shp
- euu.shp
- kkk.shp
- ppp.shp
- uu.shp
- fff.shp
- ll2.shp
- uuu.shp
- lll.shp
- rolledr.shp
- vvv.shp
- rolledrc.shp
- mmm.shp
- rolledro.shp
- breath.shp
- moo.shp
- rr2.shp
- chh.shp
- gg2.shp
- nng.shp
- rrr.shp
- wsp.shp
- ggg.shp
- nnn.shp
- sh2.shp
- xx2.shp
- dd2.shp
- ggg1.shp
- noisahh.shp
- shh.shp
- xxx.shp
- ddd.shp
- gxx.shp
- none.shp
- sss.shp
- zzz.shp
More definitions for both shapes and glots can be found in the following directories:
- /usr/ccrma/dist/PRCStuff/SPASM/SPASM/glots
- /usr/ccrma/dist/PRCStuff/SPASM/SPASM/shapes
- /usr/ccrma/dist/PRCStuff/SPASM/BigLibrary/glots
- /usr/ccrma/dist/PRCStuff/SPASM/BigLibrary/shapes
Some examples...
(with-sound ()
(singer 0 .1 '((.4 ehh.shp test.glt 523.0 .8 0.0 .01)
(.6 oo.shp test.glt 523.0 .7 .1 .01))))
(with-sound ()
(singer 0 .1 '((.05 ehh.shp test.glt 523.0 0.8 0.0 .01)
(.15 ehh.shp test.glt 523.0 0.8 0.0 .01)
(.05 kkk.shp test.glt 523.0 0.0 0.0 .01)
(.05 kkk.shp test.glt 523.0 0.0 0.0 .01)
(.02 kk+.shp test.glt 523.0 0.0 1.0 .01)
(.08 kk+.shp test.glt 523.0 0.0 0.2 .01)
(.05 ooo.shp test.glt 523.0 0.8 0.0 .01)
(.15 ooo.shp test.glt 523.0 0.8 0.0 .01)
(.05 eee.shp test.glt 523.0 0.8 0.0 .01)
(.15 eee.shp test.glt 523.0 0.8 0.0 .01)
(.05 ehh.shp test.glt 523.0 0.8 0.0 .01)
(.15 ehh.shp test.glt 523.0 0.8 0.0 .01)
(.05 mmm.shp test.glt 523.0 0.8 0.0 .01)
(.15 mmm.shp test.glt 523.0 0.8 0.0 .01)
(.10 mmm.shp test.glt 523.0 0.0 0.0 .01) )))
In the following example we are using a soundfile as an excitation function. In this case a gunshot would be processed by the vocal tract of the model. Highly unpleasant for the singer, I guess (you will need to find a gunshot sample if you want to run this code).
(with-sound ()
(singer 0 .1 '((.05 ehh.shp "pistol.snd" 523.0 0.8 0.0 .01)
(.15 ehh.shp "pistol.snd" 523.0 0.8 0.0 .01)
(.05 kkk.shp "pistol.snd" 523.0 0.0 0.0 .01)
(.05 kkk.shp "pistol.snd" 523.0 0.0 0.0 .01)
(.02 kk+.shp "pistol.snd" 523.0 0.0 1.0 .01)
(.08 kk+.shp "pistol.snd" 523.0 0.0 0.2 .01)
(.05 ooo.shp "pistol.snd" 523.0 0.8 0.0 .01)
(.15 ooo.shp "pistol.snd" 523.0 0.8 0.0 .01)
(.05 eee.shp "pistol.snd" 523.0 0.8 0.0 .01)
(.15 eee.shp "pistol.snd" 523.0 0.8 0.0 .01)
(.05 ehh.shp "pistol.snd" 523.0 0.8 0.0 .01)
(.15 ehh.shp "pistol.snd" 523.0 0.8 0.0 .01)
(.05 mmm.shp "pistol.snd" 523.0 0.8 0.0 .01)
(.15 mmm.shp "pistol.snd" 523.0 0.8 0.0 .01)
(.10 mmm.shp "pistol.snd" 523.0 0.0 0.0 .01) )))
Scott Van Dyne's piano physical modeling instrument in clm.
Here is the header of the instrument and a short description of some of its parameters:
(definstrument p
(&key
(start 0.0)
(duration 1.0)
(keyNum 60.0)
(strike-velocity 0.5)
(pedal-down nil)
(release-time-margin 0.75)
(amp .5)
;;slider controls
(detuningFactor 1.0)
(detuningFactor-table '())
(stiffnessFactor 1.0)
(stiffnessFactor-table '())
(pedalPresenceFactor .3)
(longitudinalMode 10.5)
(StrikePositionInvFac -0.9)
(singleStringDecayRateFactor 1.0)
;; parameter tables indexed by keyNum
;; NB: you can override the loudPole-table by directly setting :loudPole to a value
loudPole (loudPole-table default-loudPole-table)
softPole (softPole-table default-softPole-table)
loudGain (loudGain-table default-loudGain-table)
softGain (softGain-table default-softGain-table)
strikePosition (strikePosition-table default-strikePosition-table)
detuning2 (detuning2-table default-detuning2-table)
detuning3 (detuning3-table default-detuning3-table)
stiffnessCoefficient (stiffnessCoefficient-table default-stiffnessCoefficient-table)
singleStringDecayRate (singleStringDecayRate-table default-singleStringDecayRate-table)
singleStringZero (singleStringZero-table default-singleStringZero-table)
singleStringPole (singleStringPole-table default-singleStringPole-table)
releaseLoopGain (releaseLoopGain-table default-releaseLoopGain-table)
DryTapFiltCoefT60 (DryTapFiltCoefT60-table default-DryTapFiltCoefT60-table)
DryTapFiltCoefTarget (DryTapFiltCoefTarget-table default-DryTapFiltCoefTarget-table)
DryTapFiltCoefCurrent (DryTapFiltCoefCurrent-table default-DryTapFiltCoefCurrent-table)
DryTapAmpT60 (DryTapAmpT60-table default-DryTapAmpT60-table)
sustainPedalLevel (sustainPedalLevel-table default-sustainPedalLevel-table)
pedalResonancePole (pedalResonancePole-table default-pedalResonancePole-table)
pedalEnvelopeT60 (pedalEnvelopeT60-table default-pedalEnvelopeT60-table)
soundboardCutoffT60 (soundboardCutoffT60-table default-soundboardCutoffT60-table)
DryPedalResonanceFactor (DryPedalResonanceFactor-table default-DryPedalResonanceFactor-table)
unaCordaGain (unaCordaGain-table default-unaCordaGain-table))
Some key parameters
- start 0.0
- start time in seconds
- duration 1.0
- duration in seconds of the note
- keyNum 60.0
- key number; middleC=60: can use the fractional part to detune
- strike-velocity 0.5
- corresponding normalized velocities (range: 0.0 ... 1.0)
- pedal-down nil
- set to t for sustain pedal down... pedal-down-times not yet implemented
- release-time-margin 0.75
- extra compute time allowed beyond duration to allow transients to decay to cero
- amp .5
- amp scale of noise inputs
- detuningFactor-table '()
- if there is a detuning table specified interpolate the detuning factor by using hte keyNum as input (the detuning factor is used in multiple string notes to slightly detune the second and third strings).
- 1.0 is nominal detuning
- 0.0 is exactly in tune (no two stage decay...)
- > 1.0 is out of tune...
- detuningFactor 1.0
- if there is no detuning table specified then use this constant as the detuning factor
- stiffnessCoefficient-table '()
- lookup table for stiffness of strings (interpolated by keyNum). 0.0 to 1.0 is less stiff, 1.0 to 2.0 is more stiff...
- stiffnessCoefficient 1.0
- constant stiffness, used only if there is no stiffness table present
- pedalPresenceFactor .3
- longitudinalMode 10.5
- StrikePositionInvFac -0.9
- singleStringDecayRateFactor 1.0
- DryPedalResonanceFactor .25
- 0 is no open string resonance; 1.0 is about full resonance of dampers raised; can be greater than 1.0
Some examples...
Normal...
(with-sound (:srate 44100 :output "/zap/thnormal.snd")
(loop for i from 0 to 7 do
(p
(* i .5)
:duration .5
:keyNum (+ 24 (* 12 i))
:strike-velocity .5 ; 0 to 1, 0 is softest played note, 1 is loud note
:amp .4 ;overall volume level
:DryPedalResonanceFactor .25 ;0 no open string resonance
;1.0 is about full resonance of dampers raised
;can be greater than 1.0
)))
Detuning and stiffness...
(with-sound (:srate 44100 :output "/zap/thstiff.snd")
(loop for i from 0 to 7 do
(p
(* i .5)
:duration .5
:keyNum (+ 24 (* 12 i))
:strike-velocity .5 ;0 to 1, 0 is softest played note, 1 is loud note
:amp .4 ;overall volume level
:DryPedalResonanceFactor .25 ;0 no open string resonance
;1.0 is about full resonance of dampers raised
;can be greater than 1.0
;;modification to do detunedness
:detuningFactor-table '(24 5 36 7.0 48 7.5 60 12.0 72 20 84 30 96 100 108 300)
;scales the above detuning values
; so 1.0 is nominal detuning
; 0.0 is exactly in tune (no two stage decay...)
; > 1.0 is out of tune...
;;modification to do stiffness
:stiffnessFactor-table '(21 1.5 24 1.5 36 1.5 48 1.5 60 1.4 72 1.3 84 1.2 96 1.0 108 1.0)
;0.0 to 1.0 is less stiff, 1.0 to 2.0 is more stiff...
)))
Overdamped...
(with-sound (:srate 44100 :output "/zap/thdamped.snd")
(loop for i from 0 to 7 do
(p
(* i .5)
:duration .5
:keyNum (+ 24 (* 12 i))
:strike-velocity .5 ;0 to 1, 0 is softest played note, 1 is loud note
:amp .4 ;overall volume level
:DryPedalResonanceFactor .25 ;0 no open string resonance
;1.0 is about full resonance of dampers raised
;can be greater than 1.0
;;modifications to do damped sounds
:singleStringDecayRate-table '(21 -5 24.000 -5.000 36.000 -5.4 41.953 -5.867
48.173 -7.113 53.818 -8.016 59.693 -8.875 66.605 -9.434
73.056 -10.035 78.931 -10.293 84.000 -12.185)
:singleStringPole-table '(21 .8 24 0.7 36.000 .6 48 .5 60 .3 84 .1 96 .03 108 .03)
:stiffnessCoefficient-table '(21.000 -0.920 24.000 -0.900 36.000 -0.700 48.000 -0.250
60.000 -0.100 75.179 -0.040 82.986 -0.040 92.240 .3
96.000 .5 99.000 .7 108.000 .7)
;these are the actual allpass coefficients modified here
;to allow dampedness at hig freqs
)))
Perry Cook's physical modelling toolkit translated to clm.
Karplus Strong synthesis
(definstrument plucky (beg dur freq amplitude &optional (maxA 1.0))
Mandatory and optional parameters
- beg
- starting time in seconds
- dur
- duration in seconds
- freq
- frequency in hertz
- amplitude
- amplitude (from 0 to 1)
- maxA
- amplitude of the initial noise component
Bowed string
(defcinstrument bow (beg dur frq amplitude &optional (maxA 1.0))
NOTE: freq is off in this one (in PRC's original also)
Mandatory and optional parameters
- beg
- starting time in seconds
- dur
- duration in seconds
- freq
- frequency in hertz
- amplitude
- amplitude (from 0 to 1)
- maxA
- maximum velocity
Wind instruments
(defcinstrument brass (beg dur freq amplitude &optional (maxA 1.0))
(defcinstrument clarinet (beg dur freq amplitude &optional (maxA 1.0))
(defcinstrument flute (beg dur freq amplitude &optional (maxA 1.0))
Mandatory and optional parameters
- beg
- starting time in seconds
- dur
- duration in seconds
- freq
- frequency in hertz
- amplitude
- amplitude (from 0 to 1)
- maxA
- maximum velocity
The Karplus-Strong algorithm as extended by David Jaffe and Julius Smith
(definstrument pluck (start dur freq amp
&key
(weighting 0.9)
(lossfact 0.99)
(decaytime 6)
(attacktime 0.01))
Mandatory and key parameters
- start
- starting time in seconds
- dur
- duration in seconds
- freq
- frequency in hertz
- amp
- amplitude (from 0 to 1)
- weighting 0.9
- weighting is the ratio of the once-delayed to the twice-delayed samples. It defaults to .5=shortest decay. anything other than .5 = longer decay. Must be between 0 and less than 1.0.
- lossfact 0.99
- lossfact can be used to shorten decays. Most useful values are between .8 and 1.0.
A stereo flute by Nicky Hind.
Perry Cook's maraca from CMJ vol 21 no 3 (Fall 97) p 44.
Used by Juan Reyes in the piece "wadimusa or the monteria hat" (example played in class)
|