Waveguides can be used to model acoustical oscillators, such as strings, pipes or drumheads.
The theory of digital waveguides is covered in the sound synthesis introduction.
The WaveGuide Class
The WaveGuide class implements all necessary components for a waveguide string emulation.
Inside the class, the actual waveguide-buffers are realized as pointers to double arrays.
/// length of the delay lines
/// leftward delay line
/// rightward delay line
The pointer arrays need to be initialized in the constructor of the WaveGuide class.
dl_l = new double[l_delayLine];
dl_r = new double[l_delayLine];
for (int i=0; i<l_delayLine-1; i++)
dl_l[i] = 0.0;
dl_r[i] = 0.0;
Plucking the String
void WaveGuide::excite(double pos, double shift) is called for plucking the string, respectively exciting it.
It receives a plucking position and a shift parameter. In two loops, the method fills the two waveguides with the excitation function. In this example, a simple triangular function is chosen.
// set positive slope until plucking index
for (int i=0; i<idx; i++)
dl_l[i] = 0.5* ((double) i / (double)(idx));
dl_r[i] = 0.5* ((double) i / (double)(idx));
// set negative slope from plucking index to end
for (int i=idx; i<l_delayLine; i++)
dl_l[i] = 0.5*(1.0 - ((double) i / (double) (l_delayLine-idx)));
dl_r[i] = 0.5*(1.0 - ((double) i / (double) (l_delayLine-idx)));