An eight-track music tracker for NullPerator hardware, iPhone, iPad, Android, and the web.
NullPerator combines a compact, controller-driven workflow with a shared C++ tracker engine. Compose songs from patterns, chains, phrases, and tables; work with samples or synthesized instruments; and move compatible projects between the supported targets.
NullPerator builds on the open-source picoTracker project and is developed by 203 Systems.
- Eight song tracks with 255 chains, 255 phrases, and 32 tables
- 64 freely assignable instrument slots: Sample, MIDI, SID, OPAL, Drum, Stack, Chiptune, GB-Wave, GB-Pulse, and GB-Noise
- 44.1 kHz stereo audio engine
- Fast editing through physical controllers or on-screen controls
- Separate project autosaves, sample import, and offline local storage
- Shared 240×240 UI2 tracker interface across hardware, iOS, Android, and the web
| Target | Runtime | Platform integration |
|---|---|---|
| NullPerator for iOS | Native C++ core with a bundled Svelte presentation | Core Audio recording and playback, CoreMIDI, Bluetooth MIDI, GameController, background audio, and Files |
| NullPerator for Android (experimental) | Native C++ core with bundled Svelte controls | AAudio playback and recording, system WAV picker and Files integration, ZIP backup, USB/system MIDI routing |
| NullPerator hardware | Native C++ firmware | ESP32-S3 hardware, display, controls, audio, MIDI, and storage |
| WASM workbench | C++ core compiled to WebAssembly | Browser storage, host-folder synchronization, Web MIDI, logs, and tracing |
All targets share the application model, project format, audio engine, and UI2 renderer. Platform adapters provide audio, MIDI, input, display, and filesystem services without changing tracker behavior.
Requirements: Xcode, an iOS signing team for physical devices, and pnpm.
cd web
pnpm install --frozen-lockfile
cd ..
ios/scripts/package-web.sh
open ios/NullPeratorIOS.xcodeprojSelect the NullPeratorIOS scheme, choose an iPhone, iPad, or simulator, and
run the app. The Xcode build phase compiles and links the native C++ core.
See the iOS build and architecture guide for runtime details.
Requirements: JDK 17, pnpm, Android SDK 35 and NDK 28. The Gradle build bundles the shared Web UI and compiles the native audio/tracker core.
cd android
./gradlew :app:assembleDebugSee the Android build guide for SDK setup, installation, current limitations and device testing.
Requirements: the pinned Emscripten toolchain, Node.js, and pnpm.
cd web
pnpm install --frozen-lockfile
cd ..
tools/build-wasm.sh Release
cd web
pnpm devThe development server prints the local URL after startup. See the WASM build guide for toolchain setup and production packaging.
The hardware firmware targets ESP32-S3 and builds with ESP-IDF:
idf.py --project-dir sources -B sources/build/node -DNode=true buildSee the hardware build guide for configuration, flashing, monitoring, and troubleshooting.
cmake -S tests -B build-host -DCMAKE_BUILD_TYPE=Release
cmake --build build-host --parallel
ctest --test-dir build-host --output-on-failureShared changes should also be validated on every affected product target.
| Path | Purpose |
|---|---|
sources/ |
Shared C++ tracker engine, UI2, services, and platform adapters |
ios/ |
Swift and Objective-C++ iOS host, native bridge, resources, and packaging scripts |
android/ |
Java Android host, JNI integration, Gradle packaging and adapter tests |
web/ |
Shared Svelte presentation and the WASM workbench |
tests/ |
Host-side C++ tests |
tools/ |
Build, verification, asset, and firmware acceptance utilities |
docs/ |
Development, release, App Store, privacy, and WASM guides |
- Developer guide
- Hardware build and flashing
- Release process
- WASM storage
- WASM testing
- WASM deployment
- Privacy policy
- App Store submission checklist
Learn more about the physical NullPerator at 203 Systems.
Read the developer guide and contribution guidelines before opening a pull request.
This project is distributed under the BSD 3-Clause License. See
LICENSE for the picoTracker copyright history and the licenses of
bundled third-party components. Web distribution notices are maintained in
web/public/THIRD_PARTY_NOTICES.md.