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
class ControlKnob():
def __init__(self,name,action=None,default=0.5):
class Control():
def __init__(self,name, default=0, on_set=None):
#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)
self.on_set = on_set
self._value = default
self.ui = ui.IconValue(label=self.name,size=60, value=self.get_value())
def draw(self):
self.ui.draw()
def enter(self,data={}):
self.value = 0.8
self.ui.value = self.value
if self.action:
self.action(self.value)
def get_value(self):
return self._value
def set_value(self, value, do_trigger=True):
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):
self.value = max(0,min(1,self.value+delta*0.05))
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)
pass
def touch_1d(self,x,z):
pass
def draw(self):
self.ui.draw()
class ControlSwitch(Control):
def enter(self):
self.set_value(not self.get_value())
class ControlFloat(Control):
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):
self.value = not self.value
self.ui.value = self.value
if self.action:
self.action(self.value)
#repeat action with current value
self.set_value(self.get_value())
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
import audio
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 time
......@@ -13,12 +13,17 @@ import time
hardware.captouch_autocalib()
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]:
menu_demo.add(menu.MenuItemApp(app_module.app))
#for app_module in [demo_sparabo,melodic_demo,harmonic_demo]:
# 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")
......@@ -33,11 +38,16 @@ testmenu.add(item_foo)
testmenu.add(item_sub)
testmenu.add(item_add)
menu_main = menu.Menu("flow3r",has_back=False)
menu_main.add(menu.MenuItemSubmenu(testmenu))
menu_main.add(menu.MenuItemSubmenu(menu_demo))
menu_main.add(menu.MenuItemSubmenu(menu_settings.get_menu()))
menu_main.add(menu.MenuItemSubmenu(menu_tinysynth.get_menu()))
menu_badge.add(menu.MenuItemSubmenu(testmenu))
menu_badge.add(menu.MenuItemSubmenu(menu_settings.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.render()
......
......@@ -48,6 +48,9 @@ class Menu():
def rotate_to(self, angle):
self.angle = angle%(math.pi*2)
self.ui.angle_offset = self.angle
#for child in self.ui.children:
# child.angle_offset = self.angle*2
self.icon.phi_offset = self.angle
def rotate_steps(self, steps=1):
......@@ -142,6 +145,9 @@ class MenuItemControl(MenuItem):
def scroll(self,delta):
self.control.scroll(delta)
def touch_1d(self,x,z):
self.control.touch_1d(x,z)
def on_scroll(d):
if active_menu is None:
return
......@@ -149,6 +155,7 @@ def on_scroll(d):
if d["index"]==0:#right button
hovered=active_menu.get_hovered_item()
if hasattr(hovered, "scroll"):
print("has_scroll")
hovered.scroll(d["value"])
else: #index=1, #left button
......@@ -162,8 +169,12 @@ def on_scroll(d):
render()
def on_scroll_captouch(d):
if active_menu is None:
return
render()
return
if abs(d["radius"]) < 10000:
return
print(d["angle"])
......@@ -177,6 +188,24 @@ def on_release(d):
active_menu.angle_step = 0.2
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):
if active_menu is None:
......@@ -199,14 +228,20 @@ event.Event(name="menu rotation button",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,
action=on_scroll_captouch, enabled=False
action=on_scroll_captouch, enabled=True
)
event.Event(name="menu rotation button release",group_id="menu",
condition=lambda e: e["type"] =="button" and e["change"] and e["value"] ==0,
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",
condition=lambda e: e["type"] =="button" and e["change"] and e["from"] == 2,
action=on_enter, enabled=True
......@@ -217,7 +252,7 @@ def render():
if active_menu is None:
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()
#hardware.display_update()
......
......@@ -37,14 +37,14 @@ def get_menu():
control_debug_input=control.ControlSwitch(
name="show inputs",
action=set_controls_overlay,
on_set=set_controls_overlay,
default=False
)
item_input_overlay = menu.MenuItemControl("input overlay", control_debug_input)
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))
return m
......
......@@ -27,18 +27,27 @@ def set_frequency(value):
f = 440+value*440
synth.freq(f)
def set_pitch(value):
p = 440
print("p:",p)
synth.freq(value)
def get_menu():
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))
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))
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))
return m
synth = tinysynth(440,0)
......
......@@ -118,31 +118,36 @@ class Icon(UIElement):
class IconFlower(Icon):
def __init__(self, *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.phi_offset = random.random()
self.size_offset = random.randint(0,20)
#self.bg=PUSH_RED
def _draw(self,pos):
self.ctx.text_align = self.ctx.CENTER
self.ctx.text_baseline = self.ctx.MIDDLE
(x,y)=pos
petal_size=2.3*self.size/self.petal_count+self.size_offset
petal_size=0
if self.petal_count:
petal_size=2.3*self.size/self.petal_count+self.size_offset
self.ctx.font_size=self.size/3
hs = 3
for i in range(self.petal_count):
phi = math.pi*2 / self.petal_count * i + self.phi_offset
r = self.size/2
(x_,y_) = xy_from_polar(r, phi)
size_rnd = random.randint(-3,3)
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(*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(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+size_rnd,-math.pi,math.pi,True).fill()
#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.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.
Finish editing this message first!
Please register or to comment