Modeling the Cello’s Wooden Body


Tutorial home




Up until now, the model hasn’t sounded much like a cello, or a violin, or anything else.  The reason is that we’ve only modeled the bow and string.  That’s just not enough.  The resonances in the wooden body are what make these instruments so interesting.




Resonances in instruments


Most instruments have some kind of unique and characteristic frequency response.  Brass instruments, for example, have a bandpass response, where the size of the bell determines the cutoff frequencies: larger bells = lower frequencies.


Wooden instruments, such as violins, cellos, and acoustic guitars, have among the most complicated resonance patterns of all.  The frequency response of a cello or violin body, for example, may have hundreds of peaks and troughs.  And, no two instruments are identical.


Below is the frequency response of a particular violin.





What are our options?


Sheesh!  How are we ever gonna model that?


The only way to precisely match a response like that is to use a finite-impulse-response filter, or FIR filter.  It’s like a convolution circuit:  a long series of multiply-by-a-constant-and-accumulate-the-results kind of thing.  We’ll need thousands of stages to successfully model something like this.


But the G2 doesn’t have one of these, and probably never will.  Unfortunately, that means we won’t be able to precisely model that response.  Instead, we’ll have to settle for an approximation.  So then, what options are available to us, given the modules we’ve got?  Three possibilities jump out:


  1. A large number of parametric filters, arranged in series.


  1. A large number of bandpass filters, arranged in parallel.


  1. A large number of comb filters.


In theory, all three can approximate the above response, at least to some degree.  In a decision that may be surprising, we’re going to choose the bandpass filters.  This is the same architecture that was created by Max Mathews and once manufactured by Bob Moog (and sold as the Moog String Filter).  But we’re going to add a new wrinkle.




Why not use parametric filters?


The parametric filters on the G2 have one weakness that’s going to disqualify them:  their slopes are just not steep enough.




Why not use comb filters?


Because they’re difficult to precisely control.  Also, their peaks tend to be harmonically related, and we want to avoid that.




Which type of bandpass filter?


OK, so we’ve settled on a parallel array of bandpass filters.  But which kind?  The G2 has three different ones:


  1. The 2-pole/4-pole Nord filter.
  2. The 2-pole multi-output filter.
  3. The 2-pole fixed-frequency static filter.


The third one is disqualified because the center frequency is fixed at semitone intervals.  The remaining choice is tough.  Do we need the first filter’s 4-pole response, or its voltage-controlled resonance?


Well, we’ll bite the bullet and choose the first one, the Nord filter, even though it uses more DSP cycles.  Why?  Because voltage-controlled resonance is cool.  If we tie all of the resonance inputs together and wire them to a single Constant module, and then assign the Constant module to the front panel, we can control the “peaky-ness” of the entire patch with a single knob.




Our strategy


We’re going to make an array of 48 parallel bandpass filters.  This array will have the following features.









But it’s still not enough


Although a filter array like this is a real improvement, it still doesn’t sound truly authentic.  There are two problems:






Our new wrinkle


Our solution will be to add a VCA to the output of each filter, so that the filter’s amplitude can be adjusted.  Each VCA will be driven by SeqCtr-based lookup table, which will be addressed by the note number, and will be adjustable at every third note, just like the tuning system we built on an earlier page.


This means that each filter in the array can have a completely different amplitude characteristic at every third note (and interpolated in the two notes in between).  So, we can simulate an individual cello note by playing a sample of it into a spectrum analyzer, and modifying the appropriate SeqCtr level controls of the appropriate filters until we match the sample’s spectrum.


We’ll choose to simulate every C#, E, G, and A#, beginning with C#2 and ending with G4.  Our reference cello will be the one included in the McGill University Master Samples, called “Cello Vibrato”.


As an added feature, the amplitudes of the VCAs will also be controllable by a vibrato signal received from the main string patch.  Each band will have a separate knob controlling the amount and polarity of the modulation.   This means that the vibrato depth and phase of each frequency band can be individually specified.



The patch


The patches are below.  They’re combined with the string model into a performance, where they’ll remain for the rest of the tutorial.  Below is a fragment of one of the filter patches, which shows the input signals coming from the string model:



Also shown are two of the filters.  The filters themselves are straightforward bandpass filters.  Each one goes through a Note Scaler module which is used as an exponential VCA.  The output level of the Note Scaler is controlled by a SeqCtr, which is addressed from the note number.  The vibrato signal is attenuated and used to control the VCA, as well.  The filters are summed in mixers and sent to the audio output.


<picture and patch>




Customizing the cello


No two cellos sound exactly alike.  We can mimic this behavior by simply changing the body size slightly.  For example, just tuning the filter up or down a single semitone will produce a quite different sound.  This is useful when laying down multiple tracks.  Each track can have its own character, even when playing the same notes.  Slightly modifying the resonance will also change the sound.  Remember to change the resonance in all three patches.




Simulating other instruments


Later, we’ll use this same patch as a springboard to simulate violins, violas, and contrabasses.