Our goal: plot the equilibrium state of the vibrato bridge in the linearized spring model.
Guitar part:
When a guitar is tuned the zero frequencies are:
329,6 Hz 246,9 Hz 196 Hz 146,8 Hz 110,0 Hz 82,4 Hz
Material properties can be found here, for example.
from pylab import *
%matplotlib inline
from IPython.display import SVG
SVG(filename='files/guitar_string_spring.svg')
In this section, we're going to compute the linear weights of each individual string using the factory data that can be found on the string package.
In my case, I'm using a d'Addario EXL116 (medium top, heavy bottom) string set, whose information can be found here. It looks like this:
from IPython.display import Image
Image(url="http://www.daddario.com/resources/jdcdad/images/products/da_prod_exl116_detail2_1.jpg")
The classical formula relating the fundamental parameters of a vibrating string is:
$$ f = \frac{1}{2 L} \sqrt{\frac{T}{\mu}} $$From this formula, we can compute the value of $\mu$ as:
$$ \mu = \frac{T}{4 L^2 f^2} $$Using the frequencies found on Wikipedia and the data on the package, we can compute $\mu$:
freqs = array([82.4, 110., 146.8, 196., 246.9, 329.6]) # frequencies of the guitar strings, from low E to high E, in Hz
calibration_T = array([9.59, 11.61, 11.22, 8.43, 8.09, 8.9]) * 9.81 # calibration tensions found on package (in kg) converted to N
mu = calibration_T / (4 * 0.648**2 * freqs**2)
mu
array([ 0.00824942, 0.0056041 , 0.00304088, 0.00128166, 0.00077511, 0.00047849])
We can plot these linear masses as a function of string number:
plot(arange(1, 7), mu * 1000, 'o')
xlabel('string number')
ylabel('linear mass (g/m)')
grid(True)
xlim(0.5, 6.5)
(0.5, 6.5)
From here, we can proceed to write an analysis toolkit allowing us to measure the frequencies of the strings and finally compute the tensions they produce on the vibrato bridge.
From the above steps, we know the linear masses and the frequencies of our strings. Assuming I'm tuned from low to high (which I am), we can derive the tensions and compute the total tension on the guitar neck from our data:
$$ T = 4 \mu L^2 f^2 $$def compute_tensions(freqs, linear_masses, l):
return 4 * linear_masses * l**2 * freqs ** 2
compute_tensions(array(fundamentals), mu, 0.7)
--------------------------------------------------------------------------- NameError Traceback (most recent call last) <ipython-input-11-581b48399fc5> in <module>() ----> 1 compute_tensions(array(fundamentals), mu, 0.7) NameError: name 'fundamentals' is not defined
I chose 0.7 m as the string length, while in reality I hadn't screwed my neck tight so strings have in fact different lengths (the shortest being the lowest E string).
The tensions are, of course, in Newtons. So if we want something more tangible, we can convert it to kg with the following code:
T_kg = compute_tensions(array(fundamentals), mu, 0.7) / 9.81
T_kg
--------------------------------------------------------------------------- NameError Traceback (most recent call last) <ipython-input-15-5af8d394468a> in <module>() ----> 1 T_kg = compute_tensions(array(fundamentals), mu, 0.7) / 9.81 2 T_kg NameError: name 'fundamentals' is not defined
The total tension in my case is:
sum(T_kg)
--------------------------------------------------------------------------- NameError Traceback (most recent call last) <ipython-input-14-3a86ca6a47bc> in <module>() ----> 1 sum(T_kg) NameError: name 'T_kg' is not defined