From 7aa5d3d6852a4256e878bd8e14a7c1de1e61ebb1 Mon Sep 17 00:00:00 2001 From: iggy <iggy@muc.ccc.de> Date: Wed, 24 May 2023 05:03:24 +0200 Subject: [PATCH] basic sequencer and popcorn --- python_payload/demo_sparabo.py | 46 ++++++++++++++++++++++++++++++++++ python_payload/event.py | 23 ++++++++++++++++- 2 files changed, 68 insertions(+), 1 deletion(-) create mode 100644 python_payload/demo_sparabo.py diff --git a/python_payload/demo_sparabo.py b/python_payload/demo_sparabo.py new file mode 100644 index 0000000000..691f26559d --- /dev/null +++ b/python_payload/demo_sparabo.py @@ -0,0 +1,46 @@ +import event +import hardware +from synth import tinysynth +import math + +def xy_from_polar(r,deg): + #rad = deg/180*math.pi + + return( ( + r * math.sin(deg), #x + r * math.cos(deg) #y + ) ) + +ctx = hardware.get_ctx() +ctx.text_align = ctx.CENTER +ctx.text_baseline = ctx.MIDDLE + +synth = tinysynth(440,1) +synth.decay(25) + +popcorn = [9,7,9,5,0,5,-3,999] + +def on_step(data): + note = popcorn[data["step"]] + if note != 999: + synth.tone(note) + synth.start() + + + ctx.rgb(1,1,0).rectangle(-120,-120,240,240).fill() + (x,y) = xy_from_polar(90,-2*math.pi/8*data["step"]+math.pi) + size=180 + ctx.rgb(0.8,0.8,0) + ctx.round_rectangle( + x-size/2, + y-size/2, + size,size,size//2 + ).fill() + ctx.move_to(x,y).rgb(0.5,0.5,0).text("{}".format(data["step"])) + hardware.display_update() + + + + +event.Sequence(bpm=160, steps=8, action=on_step, loop=True) +event.the_engine.eventloop() diff --git a/python_payload/event.py b/python_payload/event.py index 6a39ff4890..3e8e9dac10 100644 --- a/python_payload/event.py +++ b/python_payload/event.py @@ -126,6 +126,22 @@ class EventTimed(Event): def __repr__(self): return ("event on tick {} ({})".format(self.deadline,self.name)) + +class Sequence(): + def __init__(self,bpm=60,loop=True,steps=16,action=None): + self.bpm = bpm + if not action: + self.action = lambda data: print("step {}".format(data.get("step"))) + else: + self.action = action + stepsize_ms = int(60*1000/bpm) + for i in range(steps): + EventTimed(stepsize_ms*i,name="seq{}".format(i),action=self.action, data={'step':i}) + + if loop: + EventTimed(stepsize_ms*steps,name="loop",action=lambda data: Sequence(bpm=bpm,loop=loop,steps=steps,action=action)) + + global the_engine the_engine = Engine() @@ -136,5 +152,10 @@ Event(name="baz", condition=lambda data: data.get('type')=="captouch" ) + + +#Sequence(action=axelf) + print (the_engine.events_timed) -#e.eventloop() +#the_engine.eventloop() + -- GitLab