diff --git a/README.md b/README.md
index 6ec0964f02c0ff9ecaf5709d1c37fd5b3ed87d5e..5bd5c7a37572692fff64a7a979a184d1ddc44fae 100644
--- a/README.md
+++ b/README.md
@@ -3,9 +3,9 @@ micropython repl hooked up, hw functionality partly broken
 
 some fun commands to try:
 ```
-import badge_audio
+import hardware
 #turn on sound
-badge_audio.set_global_volume_dB(-10)
+hardware.set_global_volume_dB(-10)
 
 from synth import tinysynth
 a=tinysynth(440,1); # enters decay phase without stop signal
@@ -15,20 +15,20 @@ b.start();
 b.stop();
 
 #tiny issue with garbage collect:
-badge_audio.count_sources();
+hardware.count_sources();
 a.__del__();
-badge_audio.count_sources();
+hardware.count_sources();
 import gc
 del b
 gc.collect()
-badge_audio.count_sources();
+hardware.count_sources();
 #...don't know how to hook up gc to __del__, maybe wrong approach
 ```
 
 files can be transferred with mpremote, such as:
 ```
 mpremote fs cp python_payload/boot.py :boot.py
-mpremote fs cp python_payload/boot_button_demo.py :boot_button_demo.py
+mpremote fs cp python_payload/cap_touch_demo.py :cap_touch_demo.py
 ```
 
 ## how to build
@@ -66,7 +66,7 @@ flash + build: (put badge into bootloader mode*)
 ```
 $ make deploy PORT=/dev/ttyACM0
 ```
-__*press right shoulder button down during boot (on modified "last gen" prototypes)__
+_*press right shoulder button down during boot (on modified "last gen" prototypes)_
 
 empty build cache (useful when moving files around):
 ```
diff --git a/badge23/captouch.c b/badge23/captouch.c
index b84205da74bf274cfb1190b9cc79123b2755b388..94e4dca54f84ea26c9ef2adf5368d24ffb458dbf 100644
--- a/badge23/captouch.c
+++ b/badge23/captouch.c
@@ -157,7 +157,7 @@ static void IRAM_ATTR gpio_isr_handler(void* arg)
 void manual_captouch_readout(uint8_t top)
 {
     struct ad714x_chip* chip = top ? (&chip_top) : (&chip_bot);
-    xQueueSendFromISR(gpio_evt_queue, &chip, NULL);
+    xQueueSend(gpio_evt_queue, &chip, NULL);
 }
 
 void espan_handle_captouch(uint16_t pressed_top, uint16_t pressed_bot);
@@ -182,6 +182,27 @@ void gpio_event_handler(void* arg)
     }
 }
 
+static uint8_t top_map[] = {2, 2, 2, 0, 0, 8, 8, 8, 6, 6, 4, 4};
+static uint8_t bot_map[] = {1, 1, 3, 3, 5, 5, 7, 7, 9, 9};
+
+uint16_t read_captouch(){
+
+    uint16_t petals = 0;
+    for(int i=0; i<12; i++) {
+        if(pressed_top  & (1 << i)) {
+            petals |= (1<<top_map[i]);
+        }
+    }
+
+    for(int i=0; i<10; i++) {
+        if(pressed_bot  & (1 << i)) {
+            petals |= (1<<bot_map[i]);
+        }
+    }
+
+    return petals;
+}
+
 static void captouch_init_chip(const struct ad714x_chip* chip, const struct ad7147_device_config device_config)
 {
     uint16_t data;
diff --git a/badge23/captouch.h b/badge23/captouch.h
index 6a4ef88db4027ba41a0681b3cef5a2373da81adf..46275f47bf2b99b72553e613aaa9472b8c2f6f0b 100644
--- a/badge23/captouch.h
+++ b/badge23/captouch.h
@@ -6,3 +6,4 @@ void captouch_print_debug_info(void);
 void gpio_event_handler(void * arg);
 void manual_captouch_readout(uint8_t top);
 void captouch_get_cross(int paddle, int * x, int * y);
+uint16_t read_captouch();
diff --git a/badge23/espan.c b/badge23/espan.c
index 36f6c60bd22894894a6c7b7ffc78e7abd9f3b4bd..53343f85e87951d4d7bc88343c9a0f7e856fbef1 100644
--- a/badge23/espan.c
+++ b/badge23/espan.c
@@ -116,9 +116,9 @@ void os_app_main(void)
     void * asdasd = &i;
     while(1) {
         manual_captouch_readout(1);
-        vTaskDelay(10 / portTICK_PERIOD_MS);
+        vTaskDelay(3 / portTICK_PERIOD_MS);
         manual_captouch_readout(0);
-        vTaskDelay(10 / portTICK_PERIOD_MS);
+        vTaskDelay(3 / portTICK_PERIOD_MS);
 
         continue;
         i = (i + 1) % 10;
diff --git a/micropython/ports/esp32/badge23_mp_audio.c b/micropython/ports/esp32/badge23_mp_hardware.c
similarity index 67%
rename from micropython/ports/esp32/badge23_mp_audio.c
rename to micropython/ports/esp32/badge23_mp_hardware.c
index c6aa49277e3249c7db9739d0c7cbab3f43fda2fa..0497a391b6051c44ca45d2a07a9f34cdad31a01a 100644
--- a/micropython/ports/esp32/badge23_mp_audio.c
+++ b/micropython/ports/esp32/badge23_mp_hardware.c
@@ -11,6 +11,16 @@
 #include "py/builtin.h"
 #include "py/runtime.h"
 #include "../badge23/audio.h"
+#include "../badge23/captouch.h"
+
+STATIC mp_obj_t mp_get_captouch(size_t n_args, const mp_obj_t *args) {
+    uint16_t captouch = read_captouch();
+    uint8_t pad = mp_obj_get_int(args[0]);
+    uint8_t output = (captouch >> pad) & 1;
+
+    return mp_obj_new_int(output);
+}
+STATIC MP_DEFINE_CONST_FUN_OBJ_VAR_BETWEEN(mp_get_captouch_obj, 1, 2, mp_get_captouch);
 
 STATIC mp_obj_t mp_set_global_volume_dB(size_t n_args, const mp_obj_t *args) {
     mp_float_t x = mp_obj_get_float(args[0]);
@@ -36,19 +46,20 @@ STATIC mp_obj_t mp_dump_all_sources(size_t n_args, const mp_obj_t *args) {
 }
 STATIC MP_DEFINE_CONST_FUN_OBJ_VAR_BETWEEN(mp_dump_all_sources_obj, 0, 2, mp_dump_all_sources);
 
-STATIC const mp_rom_map_elem_t mp_module_badge_audio_globals_table[] = {
+STATIC const mp_rom_map_elem_t mp_module_hardware_globals_table[] = {
     { MP_ROM_QSTR(MP_QSTR___name__), MP_ROM_QSTR(MP_QSTR_badge_audio) },
+    { MP_ROM_QSTR(MP_QSTR_get_captouch), MP_ROM_PTR(&mp_get_captouch_obj) },
     { MP_ROM_QSTR(MP_QSTR_set_global_volume_dB), MP_ROM_PTR(&mp_set_global_volume_dB_obj) },
     { MP_ROM_QSTR(MP_QSTR_count_sources), MP_ROM_PTR(&mp_count_sources_obj) },
     { MP_ROM_QSTR(MP_QSTR_dump_all_sources), MP_ROM_PTR(&mp_dump_all_sources_obj) },
 };
 
-STATIC MP_DEFINE_CONST_DICT(mp_module_badge_audio_globals, mp_module_badge_audio_globals_table);
+STATIC MP_DEFINE_CONST_DICT(mp_module_hardware_globals, mp_module_hardware_globals_table);
 
-const mp_obj_module_t mp_module_badge_audio = {
+const mp_obj_module_t mp_module_hardware = {
     .base = { &mp_type_module },
-    .globals = (mp_obj_dict_t *)&mp_module_badge_audio_globals,
+    .globals = (mp_obj_dict_t *)&mp_module_hardware_globals,
 };
 
-MP_REGISTER_MODULE(MP_QSTR_badge_audio, mp_module_badge_audio);
+MP_REGISTER_MODULE(MP_QSTR_hardware, mp_module_hardware);
 
diff --git a/micropython/ports/esp32/badge23_mp_tinysynth.c b/micropython/ports/esp32/badge23_mp_synth.c
similarity index 100%
rename from micropython/ports/esp32/badge23_mp_tinysynth.c
rename to micropython/ports/esp32/badge23_mp_synth.c
diff --git a/micropython/ports/esp32/main/CMakeLists.txt b/micropython/ports/esp32/main/CMakeLists.txt
index d518187e1dd7702489f23f4a3348b27c78f16b40..4a5a7ede1eacf13ddb1c8ace7088522a4cb8c7f6 100644
--- a/micropython/ports/esp32/main/CMakeLists.txt
+++ b/micropython/ports/esp32/main/CMakeLists.txt
@@ -60,8 +60,8 @@ set(MICROPY_SOURCE_DRIVERS
 )
 
 set(MICROPY_SOURCE_PORT
-    ${PROJECT_DIR}/badge23_mp_audio.c
-    ${PROJECT_DIR}/badge23_mp_tinysynth.c
+    ${PROJECT_DIR}/badge23_mp_hardware.c
+    ${PROJECT_DIR}/badge23_mp_synth.c
     ${PROJECT_DIR}/main.c
     ${PROJECT_DIR}/uart.c
     ${PROJECT_DIR}/usb.c
diff --git a/python_payload/boot.py b/python_payload/boot.py
index fbfb2c769a112f46554ef473582c320f02a5fc04..8d9d516c9536facc123700d30d3fdb0409394e6b 100644
--- a/python_payload/boot.py
+++ b/python_payload/boot.py
@@ -3,4 +3,4 @@
 #esp.osdebug(None)
 #import webrepl
 #webrepl.start()
-import boot_button_demo
+import cap_touch_demo
diff --git a/python_payload/cap_touch_demo.py b/python_payload/cap_touch_demo.py
new file mode 100644
index 0000000000000000000000000000000000000000..404d7f11cf1affa03f15469dad95b1b4bc074395
--- /dev/null
+++ b/python_payload/cap_touch_demo.py
@@ -0,0 +1,24 @@
+from synth import tinysynth
+from hardware import *
+
+set_global_volume_dB(0)
+synths = []
+for i in range(10):
+    synths += [tinysynth(440+50*i,1)]
+
+chords = [[0,3,7,10,12],[-2,2,5,8,10],[i-2,3,7,10,14],[-4,0,3,8,12],[-1,2,5,7,11]]
+
+def tune_guitar_to_chord(chord):
+    for j in range(5):
+        frq = 440 * (2**(chord[j]/12))
+        synths[j].freq(int(frq))
+
+tune_guitar_to_chord(chords[2])
+
+while True:
+    for i in range(10):
+        if(get_captouch(i)):
+            if(i%2):
+                tune_guitar_to_chord(chords[int((i-1)/2)])
+            else:
+                synths[int(i/2)].start()