from pylab import *
%matplotlib inline
def make_sinus(t, frequency, number_impulses, start_t):
return sin(2 * pi * frequency * (t - start_t)) * (t > start_t) * (t < start_t + 1. / frequency * number_impulses)
t = linspace(0, 10, 10000)
samples = t.size
plot(t, make_sinus(t, 1, 3, 1))
[<matplotlib.lines.Line2D at 0x109aef668>]
from IPython.html.widgets import interact
def truc(f, n, start):
plot(t, make_sinus(t, f, n, start))
interact(truc,
f=(0, 10, 0.5),
n=(1, 10),
start=(0, 10, 0.1))
from IPython.display import Audio
from IPython.display import display
def batman(f, n, start):
snd = make_sinus(t, f, n, start)
plot(t, snd)
display(Audio(data=snd, rate=samples, autoplay=True))
import mpld3
mpld3.enable_notebook()
interact(batman,
f=(10, 20, 0.5),
n=(1, 100),
start=(0, 10, 0.1))
<function __main__.batman>
Et maintenant la modulation de phase sinusoïdale.
def make_sinus_modulation(t, frequency, number_impulses, start_t,
amplitude_modulation, alpha_modulation):
modulation = 1 + amplitude_modulation * sin(2 * pi * alpha_modulation * frequency * (t - start_t))
return (sin(2 * pi * frequency * modulation \
* (t - start_t)) * (t > start_t) * (t < start_t + 1. / frequency * number_impulses),
modulation)
def batgirl(f, n, start, amplitude_modulation, alpha_modulation):
snd, modulation = make_sinus_modulation(t, f, n, start, amplitude_modulation, alpha_modulation)
subplot(211)
plot(t, snd)
subplot(212)
plot(t, modulation)
display(Audio(data=snd, rate=samples, autoplay=True))
interact(batgirl,
f=(100, 200, 0.5),
n=(1, 100),
start=(0, 10, 0.1),
amplitude_modulation=(0, 0.85, 0.1),
alpha_modulation=(0, 0.25, 0.001))
La petite symphonie...
class Bat():
def __init__(self, freq, delay, number_impulses, mod_ampl, mod_alpha):
self.freq = freq
self.delay = delay
self.number_impulses = number_impulses
self.mod_ampl = mod_ampl
self.mod_alpha = mod_alpha
def make_sound(self, t, start_t):
snd, mod = make_sinus_modulation(t, self.freq, self.number_impulses, start_t, self.mod_ampl, self.mod_alpha)
return snd
Comment fait-on une symphonie ?
bat1 = Bat(112, 4, 40, 0.1, 0.016) # femelle
bat2 = Bat(171, 0.5, 80, 0.2, 0.01) # mâle
symphonie_t = arange(0, 25, 1/samples)
symphonie = zeros_like(symphonie_t)
current_index = 0
while current_index < symphonie_t.size:
symphonie += bat1.make_sound(symphonie_t, symphonie_t[current_index])
current_index = symphonie.nonzero()[0].argmax()
# pause pour le mâle
current_index += (bat2.delay * samples) * (1 + rand())
if current_index > symphonie_t.size:
break
symphonie += bat2.make_sound(symphonie_t, symphonie_t[current_index])
current_index = symphonie.nonzero()[0].argmax()
# pause pour la femelle
current_index += bat1.delay * samples * (1 + rand())
plot(symphonie_t, symphonie)
[<matplotlib.lines.Line2D at 0x106b0a518>]
Audio(symphonie, rate=2 * samples)