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..
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.