# Coupling two resonant bandpass filters? (To simulate guitar/piano string effects)

A major part of the sound of a guitar or piano string comes from the coupling of the horizontal and vertical string vibrations. This concept is described in terms of transfer functions here.

This article describes how the interactions between the horizontal and vertical vibrations can be modeled as two strings coupled by an ideal transformer:

The transformation ratio is estimated for vertical > horizontal transfer to be 5:1:

The transformation ratio n:1 of the vertical to horizontal string velocities at the bridge, which determines the coupling degree, is assumed to be n=5, the value for a grand piano measured by Mori et al.[9].

Mori et al. states here:

The amplitude of the horizontal reflected wave is approximately 1/10 of the vertical input amplitude. From this result, it can be considered that the transform ratio of reflection is 5:1, because the observed wave consists of the direct component and the component reflected by the bridge; The ratio of input impulse, the vertical reflection and the horizontal reflection is 5:4:1.

I am modeling strings using arrays of resonant bandpass filters. I intend to have one array for the horizontal and one array for the vertical vibrations in this manner and couple them as described.

I am wondering in a very basic sense - how do you couple bandpasses like this? In the simplest case, let's just imagine one bandpass for the horizontal and one bandpass for the vertical. I excite them both. Would I then just feed a small percent of the output of one (delayed by one sample) into the input of the other and vice versa? Would I attenuate each bandpass a bit to compensate for the loss of energy from coupling so they don't become infinitely sustaining?

Eg. Here is what I am thinking in C++:

bandpass1.setQ(1/((1/bandpass1Q) + (1/couplingQ)));
bandpass2.setQ(1/((1/bandpass2Q) + (1/couplingQ)));

double bandpass1Output = bandpass1.nextSample(exciter + bandpass2Output_z1);
double bandpass2Output = bandpass2.nextSample(exciter + bandpass1Output_z1);

double bandpass1Output_z1 = bandpass1Output * 0.1;
double bandpass2Output_z1 = bandpass2Output * 0.1;


Does that make sense? In principle, I am adding a bit of damping (couplingQ) to compensate for the energy lost from coupling. Then I am taking some fraction of the prior sample's output from each bandpass and feeding it into the other bandpass.

Is this the correct principle? If so, what percent of each would I be feeding from one to the other at each sample to simulate a 5:1 transformation ratio as described? How would I calculate the couplingQ from this as well?

Any guidance would be appreciated. Thanks.

• i'm not gonna offer an answer to this question. i would suggest to just follow Julius Smith's model shown on Figure 6.20 (but the delay $N$ might need a fractional component to tune the pitch of the string). i dunno exactly what to use for transfer functions but i would suggest starting with simple 1-pole digital filters with less gain for the cross-coupling filters. take into account the phase delay (evaluated at the fundamental frequency of the note) of the direct (not cross-coupled) filters in the feedback loop to determine exactly the loop delay amount. – robert bristow-johnson Nov 5 '19 at 18:05
• Thanks Robert, but I've already designed the entire synthesizer with resonant bandpasses and they work well for everything else. To do it with waveguides would require a completely different approach and would make me have to throw everything I've done out and start again. I'm sure there is some way to couple the bandpasses properly. In effect, coupling is just energy being transferred from one to the other and vice versa right? That can be done by feeding the output of one bandpass into the other and attenuating where necessary. So I don't see why I shouldn't be able to do this. – mike Nov 6 '19 at 4:16