diff --git a/python_payload/control.py b/python_payload/control.py
index 897f1bc03f9474eef6e5a8c3043b1c86b9394d4f..c3660aa77cccdd47907cd68d7428e8eb636975d8 100644
--- a/python_payload/control.py
+++ b/python_payload/control.py
@@ -1,46 +1,70 @@
 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
diff --git a/python_payload/demo_menu.py b/python_payload/demo_menu.py
index 133b0fff52a8ffb6005d5e99f7c4337eee3b14a0..b72d86be4de015c671adf35310b2edf00916838a 100644
--- a/python_payload/demo_menu.py
+++ b/python_payload/demo_menu.py
@@ -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()
diff --git a/python_payload/menu.py b/python_payload/menu.py
index 1125267c41198d3b25cb565eaae0d4ef3d4e7266..a5aafda48386a4aaa484f8a92d4ce80ea886a697 100644
--- a/python_payload/menu.py
+++ b/python_payload/menu.py
@@ -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()
 
diff --git a/python_payload/menu_settings.py b/python_payload/menu_settings.py
index 6e4b9857241a1f44ffd620b82172684ff5d10bda..c99e3c80c3f41bbf54e0dffbcc67f264fbbac058 100644
--- a/python_payload/menu_settings.py
+++ b/python_payload/menu_settings.py
@@ -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
diff --git a/python_payload/menu_tinysynth.py b/python_payload/menu_tinysynth.py
index a77d1388968551418196625e57715c87951834e9..3f2d95b418b18f480adea3ed5976009b60f7088b 100644
--- a/python_payload/menu_tinysynth.py
+++ b/python_payload/menu_tinysynth.py
@@ -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)
diff --git a/python_payload/ui.py b/python_payload/ui.py
index cd1c451c536928d17b0f404005f122c3037900c7..36616f789576f41f9cd695f786f6507cb6162486 100644
--- a/python_payload/ui.py
+++ b/python_payload/ui.py
@@ -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)