70 lines
1.4 KiB
Python
70 lines
1.4 KiB
Python
"""
|
|
Niveau 5
|
|
Nouveaux instruments
|
|
"""
|
|
|
|
import synthlib, math, sys
|
|
|
|
rate = 44100
|
|
|
|
def sine(t, f):
|
|
return math.sin(t/rate*f*2*math.pi)
|
|
|
|
def cosine(t, f):
|
|
return math.cosin(t/rate*f*2*math.pi)
|
|
|
|
def sine2(t, f):
|
|
return math.atan(math.sin(t/rate*f*2*math.pi))
|
|
|
|
def sine3(t, f):
|
|
return (sine(t,f) - sine2(t,f))*math.pi
|
|
|
|
def sine4(t, f):
|
|
return (cosine(t,f) - sine3(t,f))*2
|
|
|
|
polynome = [32, 30, 8, 4, 2, 1]
|
|
lpolynome = len(polynome)
|
|
spolynome = sum(polynome)
|
|
def polynomial(t, f):
|
|
return sum(j*math.sin(t/rate*f*2*math.pi*i) for i,j in enumerate(polynome)) / spolynome
|
|
|
|
music = synthlib.midi()
|
|
|
|
active = {}
|
|
wait = 0
|
|
tt = 0
|
|
t = 0
|
|
loop = True
|
|
|
|
sound_encoder = synthlib.SoundEncoder(env={
|
|
"sampling": rate,
|
|
"signed": True,
|
|
"verbose": False,
|
|
"bits": 32,
|
|
"msbfirst": True,
|
|
"tempo": 130
|
|
})
|
|
while loop:
|
|
if wait == 0:
|
|
while True:
|
|
event = music[tt]
|
|
tt += 1
|
|
if event.type == synthlib.Note:
|
|
if event.velocity == 0:
|
|
if event.number in active:
|
|
active.pop(event.number)
|
|
else:
|
|
active[event.number] = event.velocity
|
|
#sys.stderr.write(str(event.velocity)+"\n")
|
|
elif event.type == synthlib.Wait:
|
|
wait = int(event.value*rate/2)
|
|
break
|
|
elif event.type == synthlib.End:
|
|
loop = False
|
|
break
|
|
else:
|
|
wait -= 1
|
|
|
|
sound_encoder.write_sample(sum([active[number]*polynomial(t, 440*2**(number/12)) for number in active])/max(1,len(active)))
|
|
t += 1
|
|
|