In this post, we'll have a look at the kinematics of the Floyd Rose tremolo.
For those that have never heard about it, this is a tremolo system that allows electric guitars to produce interesting vibrato-like sounds. For instance, you can sound like a motorbike:
from IPython.display import YouTubeVideo
YouTubeVideo("2rUzwv7hZTI")
The way the tremolo works is simple: the strings are not fixed directly to the body of the guitar but to a spring that is fixed to the body of the guitar. A good illustration can be found on wikipedia:
from IPython.display import Image
Image(url="https://upload.wikimedia.org/wikipedia/commons/thumb/0/05/Floyd_Rose.svg/1000px-Floyd_Rose.svg.png")
One of the key things to understand when trying to think about this tremolo is the way it changes shape when tuning.
%matplotlib inline
import matplotlib.pyplot as plt
import numpy as np
from IPython.html.widgets import interact, fixed
Let's consider the following case: we rotate a vector $\vec{OM}$ defined by its length, $l$, and an angle, $\alpha$.
The coordinates of the point $M = (x, y)$ are computed as follows: $$x = l \cos{\alpha}$$ $$y = l \sin{\alpha}$$
We can plot this using the following interactive function:
def plot_vector(alpha, l=1):
x = l * np.cos(alpha)
y = l * np.sin(alpha)
ax = plt.gca()
ax.add_artist(plt.Circle((0, 0), l, fill='False', fc='white'))
ax.arrow(0, 0, x, y, head_width=0.05, head_length=0.1, fc='r', ec='k')
plt.xlim(-l*1.1, l*1.1)
plt.ylim(-l*1.1, l*1.1)
plt.title("alpha = {} rad".format(alpha))
interact(plot_vector,
alpha=(0, 6.28, 0.1),
l=fixed(1))
We can do an animated version of this using JSAnimation:
from JSAnimation import IPython_display
from matplotlib import animation
# create a simple animation
fig = plt.figure()
ax = plt.axes(xlim=(0, 10), ylim=(-2, 2))
arrow = ax.arrow(0, 0, 1, 0, head_width=0.05, head_length=0.1, fc='k', ec='k')
ax.set_xlim(-1.1, 1.1)
ax.set_ylim(-1.1, 1.1)
def init():
pass
def animate(i):
ax.cla()
alpha = 6.28 * i / 20.
x = 1 * np.cos(alpha)
y = 1 * np.sin(alpha)
ax.arrow(0, 0, x, y, head_width=0.05, head_length=0.1, fc='r', ec='k')
ax.set_title("alpha = {:.2f} rad".format(alpha))
animation.FuncAnimation(fig, animate, init_func=init,
frames=20, interval=100, blit=False)
In this section: analyze what happens around theta - alpha when theta becomes small.
Here putting it all together around the small theta variation and showing a working model.