Skip to content
Snippets Groups Projects
Commit de0f88d0 authored by iggy's avatar iggy
Browse files

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

parent 557ad9f2
Branches
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