diff --git a/python_payload/apps/tiny_sampler/__init__.py b/python_payload/apps/tiny_sampler/__init__.py
index 0cf22743a0dd4ccf125c2b22f1a573ec481cfc32..22fc0c3defac740ed965d0ac07d90807aca01d78 100644
--- a/python_payload/apps/tiny_sampler/__init__.py
+++ b/python_payload/apps/tiny_sampler/__init__.py
@@ -9,6 +9,41 @@ from st3m.goose import Tuple, Iterator, Optional, Callable, List, Any, TYPE_CHEC
 from ctx import Context
 from st3m.ui.view import View, ViewManager
 
+import math
+
+
+class Pictograms:
+    @classmethod
+    def two_petal_group(
+        cls, ctx, start=0, stop=5, outer_rad=110, inner_rad=50, offset=10
+    ):
+        cos72 = 0.31
+        sin72 = 0.95
+        cos36 = 0.81
+        sin36 = 0.59
+        ctx.save()
+        ctx.rotate(start * math.tau / 5 - math.tau / 20)
+        curve = 1.15
+        for x in range(stop - start):
+            ctx.move_to(offset, -inner_rad)
+            ctx.line_to(offset, -outer_rad)
+            ctx.quad_to(
+                sin36 * outer_rad * curve,
+                -cos36 * outer_rad * curve,
+                sin72 * outer_rad - cos72 * offset,
+                -cos72 * outer_rad - sin72 * offset,
+            )
+            ctx.rotate(math.tau / 5)
+            ctx.line_to(-offset, -inner_rad)
+            ctx.quad_to(
+                -sin36 * inner_rad * curve,
+                -cos36 * inner_rad * curve,
+                -sin72 * inner_rad + cos72 * offset,
+                -cos72 * inner_rad - sin72 * offset,
+            )
+            ctx.stroke()
+        ctx.restore()
+
 
 class TinySampler(Application):
     def __init__(self, app_ctx: ApplicationContext) -> None:
@@ -17,16 +52,16 @@ class TinySampler(Application):
 
         self.samplers: List[bl00mbox.patches._Patch | Any] = [None] * 5
         self.line_in = self.blm.new(bl00mbox.plugins.bl00mbox_line_in)
-        self.blm.volume = (
-            30000  # TODO: increase onboard mic line in gain and remove this
-        )
-        self.line_in.signals.gain = 30000
+        self.line_in.signals.gain = 32000
         for i in range(5):
             self.samplers[i] = self.blm.new(bl00mbox.patches.sampler, 1000)
             self.samplers[i].signals.output = self.blm.mixer
             self.samplers[i].signals.rec_in = self.line_in.signals.right
         self.is_recording = [False] * 5
-        audio.input_set_source(audio.INPUT_SOURCE_ONBOARD_MIC)
+        self.is_playing = [False] * 5
+        self.has_data = [False] * 5
+        if audio.input_get_source() == audio.INPUT_SOURCE_NONE:
+            audio.input_set_source(audio.INPUT_SOURCE_ONBOARD_MIC)
 
         self.ct_prev = captouch.read()
 
@@ -38,21 +73,42 @@ class TinySampler(Application):
         dist = 90
         ctx.rgb(0, 0, 0).rectangle(-120, -120, 240, 240).fill()
 
+        ctx.rgb(0.1, 0.5, 0.6)
+        ctx.line_width = 6
+        Pictograms.two_petal_group(ctx, stop=5)
+
+        ctx.save()
+        ctx.line_width = 4
         ctx.font = ctx.get_font_name(0)
         ctx.text_align = ctx.MIDDLE
         ctx.font_size = 24
         for i in range(5):
-            ctx.rgb(0.8, 0.8, 0.8)
+            if self.is_playing[i]:
+                ctx.rgb(0.2, 0.9, 0.2)
+            elif self.has_data[i]:
+                ctx.rgb(0.8, 0.8, 0.8)
+            else:
+                ctx.rgb(0.5, 0.5, 0.5)
             ctx.move_to(0, -dist)
-            ctx.text("play" + str(i))
-            ctx.move_to(0, 0)
+            ctx.rel_line_to(0, -8)
+            ctx.rel_line_to(11, 8)
+            ctx.rel_line_to(-11, 8)
+            ctx.rel_line_to(0, -8)
+
+            ctx.fill()
             ctx.rotate(6.28 / 10)
-            ctx.move_to(0, -dist)
+            ctx.rgb(1, 0, 0)
             if self.is_recording[i]:
-                ctx.rgb(1, 0, 0)
-            ctx.text("rec" + str(i))
+                ctx.arc(0, -dist, 8, 0, math.tau, 1)
+                ctx.stroke()
+                ctx.arc(0, -dist, 5, 0, math.tau, 1)
+                ctx.fill()
+            else:
+                ctx.arc(0, -dist, 7, 0, math.tau, 1)
+                ctx.fill()
             ctx.move_to(0, 0)
             ctx.rotate(6.28 / 10)
+        ctx.restore()
 
     def think(self, ins: InputState, delta_ms: int) -> None:
         super().think(ins, delta_ms)
@@ -67,9 +123,13 @@ class TinySampler(Application):
 
         ct = captouch.read()
         for i in range(5):
-            if ct.petals[i * 2].pressed and not self.ct_prev.petals[i * 2].pressed:
-                if not self.is_recording[i]:
+            if not self.is_recording[i]:
+                if ct.petals[i * 2].pressed and not self.ct_prev.petals[i * 2].pressed:
                     self.samplers[i].signals.trigger.start()
+                    self.is_playing[i] = True
+                if not ct.petals[i * 2].pressed and self.ct_prev.petals[i * 2].pressed:
+                    self.samplers[i].signals.trigger.stop()
+                    self.is_playing[i] = False
 
         for i in range(5):
             if (
@@ -86,6 +146,7 @@ class TinySampler(Application):
                 if self.is_recording[i]:
                     self.samplers[i].signals.rec_trigger.stop()
                     self.is_recording[i] = False
+                    self.has_data[i] = True
 
         self.ct_prev = ct
 
@@ -101,3 +162,10 @@ class TinySampler(Application):
                 self.is_recording[i] = False
         audio.input_set_source(audio.INPUT_SOURCE_NONE)
         self.blm.foreground = False
+
+
+# For running with `mpremote run`:
+if __name__ == "__main__":
+    import st3m.run
+
+    st3m.run.run_view(TinySampler(ApplicationContext()))