Skip to content
Snippets Groups Projects
Commit 756cbbf4 authored by iggy's avatar iggy Committed by q3k
Browse files

mpy: slide control, control rework, flower icons, pitch bend in tinysynth menu

parent 97aca129
No related branches found
No related tags found
No related merge requests found
import ui import ui
class ControlKnob(): class Control():
def __init__(self,name,action=None,default=0.5): def __init__(self,name, default=0, on_set=None):
#TODO inheritance from Control() #TODO inheritance from Control()
self.name=name self.name=name
self.action=action self.on_set = on_set
self.value = default self._value = default
self.ui = ui.IconValue(label=self.name,size=60, value=self.value) self.ui = ui.IconValue(label=self.name,size=60, value=self.get_value())
def draw(self): def draw(self):
self.ui.draw() self.ui.draw()
def enter(self,data={}): def get_value(self):
self.value = 0.8 return self._value
self.ui.value = self.value
if self.action: def set_value(self, value, do_trigger=True):
self.action(self.value) self._value = value
self.ui.value = value
if do_trigger:
if self.on_set:
self.on_set(value)
def enter(self):
pass
def scroll(self,delta): def scroll(self,delta):
self.value = max(0,min(1,self.value+delta*0.05)) pass
self.ui.value = self.value
print (self.value)
self.draw()
if self.action:
self.action(self.value)
class ControlSwitch():
def __init__(self,name,action,default):
#TODO inheritance from Control()
self.name=name
self.action=action
self.value = default
self.ui = ui.IconValue(label=self.name,size=60, value=self.value)
def draw(self): def touch_1d(self,x,z):
self.ui.draw() pass
class ControlSwitch(Control):
def enter(self): def enter(self):
self.value = not self.value self.set_value(not self.get_value())
self.ui.value = self.value
if self.action: class ControlFloat(Control):
self.action(self.value) def __init__(self, min=0.0,max=1.0,step=0.1, *args, **kwargs):
self.min=min
self.max=max
self.step=step
super().__init__(*args, **kwargs)
class ControlKnob(ControlFloat):
def enter(self):
#repeat action with current value
self.set_value(self.get_value())
def scroll(self,delta): def scroll(self,delta):
pass v = self.get_value()
v_new = max(self.min,min(self.max,v+delta*self.step))
self.set_value(v_new)
class ControlSlide(ControlFloat):
def __init__(self, do_reset=True, *args, **kwargs):
self.do_reset=do_reset
super().__init__(*args, **kwargs)
def touch_1d(self,x,z):
if z>0: #Inital Contact
self._saved_value = self.get_value()
if z==0: #Continous contact
v = (self.max-self.min)*x
self.set_value(v)
if z<0: #Release
if self.do_reset:
self.set_value(self._saved_value)
\ No newline at end of file
...@@ -5,7 +5,7 @@ import control ...@@ -5,7 +5,7 @@ import control
import audio import audio
import application import application
import demo_worms,demo_sparabo,cap_touch_demo, melodic_demo, harmonic_demo #import demo_worms,demo_sparabo,cap_touch_demo, melodic_demo, harmonic_demo
import menu_settings,menu_tinysynth import menu_settings,menu_tinysynth
import time import time
...@@ -13,12 +13,17 @@ import time ...@@ -13,12 +13,17 @@ import time
hardware.captouch_autocalib() hardware.captouch_autocalib()
audio.set_volume_dB(0) audio.set_volume_dB(0)
menu_main = menu.Menu("flow3r",has_back=False)
menu_badge = menu.Menu("badge")
menu_apps = menu.Menu("apps")
menu_music = menu.Menu("music")
menu_demo = menu.Menu("demo")
for app_module in [demo_worms,demo_sparabo,cap_touch_demo,melodic_demo,harmonic_demo]: #for app_module in [demo_sparabo,melodic_demo,harmonic_demo]:
menu_demo.add(menu.MenuItemApp(app_module.app)) # menu_music.add(menu.MenuItemApp(app_module.app))
#for app_module in [demo_worms,cap_touch_demo,]:
# menu_apps.add(menu.MenuItemApp(app_module.app))
testmenu = menu.Menu("test") testmenu = menu.Menu("test")
...@@ -33,11 +38,16 @@ testmenu.add(item_foo) ...@@ -33,11 +38,16 @@ testmenu.add(item_foo)
testmenu.add(item_sub) testmenu.add(item_sub)
testmenu.add(item_add) testmenu.add(item_add)
menu_main = menu.Menu("flow3r",has_back=False)
menu_main.add(menu.MenuItemSubmenu(testmenu)) menu_badge.add(menu.MenuItemSubmenu(testmenu))
menu_main.add(menu.MenuItemSubmenu(menu_demo)) menu_badge.add(menu.MenuItemSubmenu(menu_settings.get_menu()))
menu_main.add(menu.MenuItemSubmenu(menu_settings.get_menu()))
menu_main.add(menu.MenuItemSubmenu(menu_tinysynth.get_menu())) menu_main.add(menu.MenuItemSubmenu(menu_badge))
menu_main.add(menu.MenuItemSubmenu(menu_apps))
menu_main.add(menu.MenuItemSubmenu(menu_music))
menu_music.add(menu.MenuItemSubmenu(menu_tinysynth.get_menu()))
menu.set_active_menu(menu_main) menu.set_active_menu(menu_main)
menu.render() menu.render()
......
...@@ -48,6 +48,9 @@ class Menu(): ...@@ -48,6 +48,9 @@ class Menu():
def rotate_to(self, angle): def rotate_to(self, angle):
self.angle = angle%(math.pi*2) self.angle = angle%(math.pi*2)
self.ui.angle_offset = self.angle self.ui.angle_offset = self.angle
#for child in self.ui.children:
# child.angle_offset = self.angle*2
self.icon.phi_offset = self.angle self.icon.phi_offset = self.angle
def rotate_steps(self, steps=1): def rotate_steps(self, steps=1):
...@@ -142,6 +145,9 @@ class MenuItemControl(MenuItem): ...@@ -142,6 +145,9 @@ class MenuItemControl(MenuItem):
def scroll(self,delta): def scroll(self,delta):
self.control.scroll(delta) self.control.scroll(delta)
def touch_1d(self,x,z):
self.control.touch_1d(x,z)
def on_scroll(d): def on_scroll(d):
if active_menu is None: if active_menu is None:
return return
...@@ -149,6 +155,7 @@ def on_scroll(d): ...@@ -149,6 +155,7 @@ def on_scroll(d):
if d["index"]==0:#right button if d["index"]==0:#right button
hovered=active_menu.get_hovered_item() hovered=active_menu.get_hovered_item()
if hasattr(hovered, "scroll"): if hasattr(hovered, "scroll"):
print("has_scroll")
hovered.scroll(d["value"]) hovered.scroll(d["value"])
else: #index=1, #left button else: #index=1, #left button
...@@ -162,8 +169,12 @@ def on_scroll(d): ...@@ -162,8 +169,12 @@ def on_scroll(d):
render() render()
def on_scroll_captouch(d): def on_scroll_captouch(d):
if active_menu is None: if active_menu is None:
return return
render()
return
if abs(d["radius"]) < 10000: if abs(d["radius"]) < 10000:
return return
print(d["angle"]) print(d["angle"])
...@@ -177,6 +188,24 @@ def on_release(d): ...@@ -177,6 +188,24 @@ def on_release(d):
active_menu.angle_step = 0.2 active_menu.angle_step = 0.2
render() render()
def on_touch_1d(d):
if active_menu is None:
return
v = min(1.0,max(0.0,((d["radius"]+25000.0)/50000.0)))
z = 0
if d["change"]:
if d["value"] == 1: z=1
else: z=-1
print("menu: touch_1d",v,z)
hovered=active_menu.get_hovered_item()
if hasattr(hovered, "touch_1d"):
print("hastouch")
hovered.touch_1d(v,z)
render()
def on_enter(d): def on_enter(d):
if active_menu is None: if active_menu is None:
...@@ -199,14 +228,20 @@ event.Event(name="menu rotation button",group_id="menu", ...@@ -199,14 +228,20 @@ event.Event(name="menu rotation button",group_id="menu",
event.Event(name="menu rotation captouch",group_id="menu", event.Event(name="menu rotation captouch",group_id="menu",
condition=lambda e: e["type"] =="captouch" and not e["change"] and abs(e["value"])==1 and e["index"]==2, condition=lambda e: e["type"] =="captouch" and not e["change"] and abs(e["value"])==1 and e["index"]==2,
action=on_scroll_captouch, enabled=False action=on_scroll_captouch, enabled=True
) )
event.Event(name="menu rotation button release",group_id="menu", event.Event(name="menu rotation button release",group_id="menu",
condition=lambda e: e["type"] =="button" and e["change"] and e["value"] ==0, condition=lambda e: e["type"] =="button" and e["change"] and e["value"] ==0,
action=on_release, enabled=True action=on_release, enabled=True
) )
event.Event(name="menu 1d captouch",group_id="menu",
condition=lambda e: e["type"] =="captouch" and (e["value"]==1 or e["change"]) and e["index"]==9,
action=on_touch_1d, enabled=True
)
event.Event(name="menu button enter",group_id="menu", event.Event(name="menu button enter",group_id="menu",
condition=lambda e: e["type"] =="button" and e["change"] and e["from"] == 2, condition=lambda e: e["type"] =="button" and e["change"] and e["from"] == 2,
action=on_enter, enabled=True action=on_enter, enabled=True
...@@ -217,7 +252,7 @@ def render(): ...@@ -217,7 +252,7 @@ def render():
if active_menu is None: if active_menu is None:
return return
ui.the_ctx.rectangle(-120,-120,240,240).rgb(0,0,0).fill() ui.the_ctx.rectangle(-120,-120,240,240).rgb(*ui.GO_GREEN).fill()
active_menu.draw() active_menu.draw()
#hardware.display_update() #hardware.display_update()
......
...@@ -37,14 +37,14 @@ def get_menu(): ...@@ -37,14 +37,14 @@ def get_menu():
control_debug_input=control.ControlSwitch( control_debug_input=control.ControlSwitch(
name="show inputs", name="show inputs",
action=set_controls_overlay, on_set=set_controls_overlay,
default=False default=False
) )
item_input_overlay = menu.MenuItemControl("input overlay", control_debug_input) item_input_overlay = menu.MenuItemControl("input overlay", control_debug_input)
m.add(item_input_overlay) m.add(item_input_overlay)
c = control.ControlKnob(name="Volume",default=0.5,action=set_volume) c = control.ControlKnob(name="Volume",default=0.5,on_set=set_volume)
m.add(menu.MenuItemControl("volume",c)) m.add(menu.MenuItemControl("volume",c))
return m return m
......
...@@ -27,18 +27,27 @@ def set_frequency(value): ...@@ -27,18 +27,27 @@ def set_frequency(value):
f = 440+value*440 f = 440+value*440
synth.freq(f) synth.freq(f)
def set_pitch(value):
p = 440
print("p:",p)
synth.freq(value)
def get_menu(): def get_menu():
m = menu.Menu("tinysynth") m = menu.Menu("tinysynth")
freq=control.ControlKnob(name="freq",action=set_frequency,default=0.0) freq=control.ControlKnob(name="freq",on_set=set_frequency,default=0.0)
m.add(menu.MenuItemControl("freq",freq)) m.add(menu.MenuItemControl("freq",freq))
vol = control.ControlKnob(name="vol",action=set_volume,default=0.0) pitch = control.ControlSlide(name="pitch",on_set=set_frequency,default=0)
m.add(menu.MenuItemControl("pitch",pitch))
vol = control.ControlKnob(name="vol",on_set=set_volume,default=0.0)
m.add(menu.MenuItemControl("volume",vol)) m.add(menu.MenuItemControl("volume",vol))
play = control.ControlSwitch(name="play",action=set_play,default=False) play = control.ControlSwitch(name="play",on_set=set_play,default=False)
m.add(menu.MenuItemControl("play",play)) m.add(menu.MenuItemControl("play",play))
return m return m
synth = tinysynth(440,0) synth = tinysynth(440,0)
......
...@@ -118,31 +118,36 @@ class Icon(UIElement): ...@@ -118,31 +118,36 @@ class Icon(UIElement):
class IconFlower(Icon): class IconFlower(Icon):
def __init__(self, *args, **kwargs): def __init__(self, *args, **kwargs):
super().__init__(*args, **kwargs) super().__init__(*args, **kwargs)
self.petal_count= random.randint(4,8) self.petal_count= 0 #random.randint(4,8)
self.petal_color = (random.random(),random.random(),random.random()) self.petal_color = (random.random(),random.random(),random.random())
self.phi_offset = random.random() self.phi_offset = random.random()
self.size_offset = random.randint(0,20) self.size_offset = random.randint(0,20)
#self.bg=PUSH_RED
def _draw(self,pos): def _draw(self,pos):
self.ctx.text_align = self.ctx.CENTER
self.ctx.text_baseline = self.ctx.MIDDLE
(x,y)=pos (x,y)=pos
petal_size=0
if self.petal_count:
petal_size=2.3*self.size/self.petal_count+self.size_offset petal_size=2.3*self.size/self.petal_count+self.size_offset
self.ctx.font_size=self.size/3 self.ctx.font_size=self.size/3
hs = 3 hs = 3
for i in range(self.petal_count): for i in range(self.petal_count):
phi = math.pi*2 / self.petal_count * i + self.phi_offset phi = math.pi*2 / self.petal_count * i + self.phi_offset
r = self.size/2 r = self.size/2
(x_,y_) = xy_from_polar(r, phi) (x_,y_) = xy_from_polar(r, phi)
size_rnd = random.randint(-3,3)
if self.has_highlight: if self.has_highlight:
self.ctx.move_to(x+x_,y+y_).rgb(1,1,1).arc(x+x_,y+y_, petal_size/2+hs,-math.pi,math.pi,True).fill() self.ctx.move_to(x+x_,y+y_).rgb(1,1,1).arc(x+x_,y+y_, petal_size/2+hs+size_rnd,-math.pi,math.pi,True).fill()
self.ctx.move_to(x+x_,y+y_).rgb(*self.petal_color).arc(x+x_,y+y_, petal_size/2,-math.pi,math.pi,True).fill() self.ctx.move_to(x+x_,y+y_).rgb(*self.petal_color).arc(x+x_,y+y_, petal_size/2+size_rnd,-math.pi,math.pi,True).fill()
#if self.has_highlight: #if self.has_highlight:
# self.ctx.rgb(1,1,1).arc(x,y, self.size/2+hs,-math.pi,math.pi,True).fill() # self.ctx.rgb(1,1,1).arc(x,y, self.size/2+hs,-math.pi,math.pi,True).fill()
self.ctx.move_to(x,y).rgb(*self.bg).arc(x,y,self.size/2,-math.pi,math.pi,True).fill() self.ctx.move_to(x,y).rgb(*self.bg).arc(x,y,self.size/2,-math.pi,math.pi,True).fill()
self.ctx.rgb(*GO_GREEN).move_to(x,y).text(self.label) self.ctx.rgb(*WHITE).move_to(x,y).text(self.label)
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment