README from GitHub, MIT
marisko
custom firmware for the teenage engineering sp-1 stem player.

named after the marisko flower
originally forked from softmodded/marisko
status: work in progress. the firmware has been fixed with ai help but is not finished yet. flashing instructions will be added here once it is stable — for now i'd hold off flashing production hardware. see releases.
rome
rome is the companion cli — flash firmware, enter the bootloader, and manage stems on the device over USB. it is required to use marisko.
install it with a one-liner:
macOS / Linux (sh):
curl -sSL https://raw.githubusercontent.com/jackiscool123123121/rome/main/install.sh | sh
Windows (PowerShell):
irm https://raw.githubusercontent.com/jackiscool123123121/rome/main/install.ps1 | iex
on a fresh device you must run rome format before loading any music —
it writes the disk header (v3) that stems get stored against:
rome format --yes
then upload songs:
rome song add "my song" drums.wav vocals.wav bass.wav other.wav
features
this project is in the very early stages of development, so as of now pretty much anything could pass as a "feature"
- hold function for 3s to power on/off — symmetric with a progressive power-on/power-off LED animation across both led rows; a brief tap or bump no longer toggles power (it used to fire instantly on any press)
- boot animation — a light bounces across the 4 playback leds on every boot
- upload progress indicator — the 4 playback leds blink in quarters
(1 lit in the first quarter of the transfer, up to all 4 near the end)
while
rome song addis streaming - volume persists across boots — saved to the disk header on release of a vol +/- press, restored at boot
- debounced buttons — play/pause, the prev/next rocker, vol +/-, and track-button solo/mute all require 2 consecutive stable ladder reads before registering a press; a single noisy ADC sample used to be enough to fire an edge twice ("one click registers as two"), which on the rocker meant an occasional single push skipped two tracks instead of one
- reliable large stem uploads — the eMMC write busy-wait was ~1s, too short for an occasional NAND garbage-collection pause on real hardware; widened to ~5s so a large upload (tens of thousands of blocks) doesn't fail partway through
- function button powers off device (
SYSTEM_OFF) and returns it to the bootloader - watchdog is fed preventing bootloops
- audio playback — IMA-ADPCM stems decoded from eMMC and streamed to the CS42L42 / TAS2505 codecs via I2S
- stem management over USB CDC-ACM — songs uploaded, listed, and removed via rome at ~390 KB/s
- HW stack protection — stack overflows surface as faults instead of silent corruption
hardware
- nRF52840 (runs a stripped Zephyr RTOS app at flash
0x20000, max0xdefff) - eMMC storage for stems (eMMC protocol via
emmc.c/disk.c) - CS42L42 (headphone codec) + TAS2505 (speaker amp) over I2C/I2S
- saadc / pwm for the volume & transport ladder and playback leds
power on / off
hold function for 3 seconds to turn the device off — both led rows fill progressively over the hold as feedback, and releasing early cancels it (no power-off, no accidental trigger from a bump or brief tap).
while off, hold function for 3 seconds to turn it back on — same animation in reverse. a touch shorter than 3s is ignored and the device goes straight back to sleep without ever spinning up audio/storage for it.
return to bootloader
the sp-1 has no hard reset so to get back:
- hold function for 3s and wait for the leds go dark, this means device shut off
- press any button (or plug in usb) — bootloader opens
- use the solderless firmware utility or
rome flashto flash new firmware
you can also trigger step 1 from the host:
rome bootloaderpowers the device off (SYSTEM_OFF), then pressing function wakes it into the bootloader. this path is per the documented mechanism in the sp-1 dev wiki (SYSTEM_OFF+ a clearedRESETREAS) — it has not been independently verified against every possible bootloader build, so if it doesn't land you in the bootloader on your unit, fall back to the physical function-button hold above.
building
see building.md for setup, compilation, and flashing instructions.
contributing
see contributing.md for rules & guidelines.
credits
- zephyr rtos + nrf connect sdk — the foundation this firmware runs on
- sp-1 developer wiki by tim knapen — hardware documentation, pinouts, and bootloader specs
- solderless — the web-based firmware and stem loader that makes all of this possible without opening the device
- original marisko the original version this was forked from
project structure
app/— firmware source (main.c+ modularaudio/codec/emmc/disk/usb/leds/saadc/pwm)boards/arm/sp1/— custom zephyr board definition for the sp-1patches/— required zephyr tree patches (i2s ratio + fast cdc-acm upload)
prebuilt firmware
marisko.bin is the built firmware binary (see releases / build/). this is a wip build — do not flash production hardware yet. once stable, flashing instructions land here.