jsb-synth/level4.py
2025-02-27 00:41:31 +01:00

42 lines
972 B
Python

"""
Niveau 4
Jouer des accords
Ne pas introduire le facteur d'amplitude avant d'avoir entendu le résultat sans lui
"""
import synthlib, math, sys
music = synthlib.midi()
active = {}
wait = 0
tt = 0
t = 0
loop = True
sound_encoder = synthlib.SoundEncoder()
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)
sys.stderr.write("pop "+str(event.number)+"\n")
else:
active[event.number] = event.velocity
sys.stderr.write(str(event.velocity)+" "+str(event.number)+" ("+str(len(active))+")\n")
elif event.type == synthlib.Wait:
wait = int(event.value*8000)
break
elif event.type == synthlib.End:
loop = False
break
else:
wait -= 1
sound_encoder.write_sample(sum([active[number]*math.sin(t/16000*440*2**(number/12)*2*math.pi) for number in active])/max(1,len(active)))
t += 1