Free, browser-based Standard MIDI → Polyend Tracker+ converter. Import .mid / .midi, preview and edit patterns on the grid, validate exports with @polyend/tracker-lib, and download a full Tracker+ project ZIP — no server, no account, data stays in your browser.
Community tool — not affiliated with or endorsed by Polyend.
App shell — Load · Edit · Export with built-in sample pattern
Tracker musicians often rebuild MIDI parts by hand in the grid. MidiTracker follows one Load → Edit → Export workflow in the browser: convert, tweak, validate, download.
- Tracker+ owners — turn game rips, DAW exports, or legacy
.midinto.mtppatterns andproject.mt - Chiptune / retro composers — quantize to 4 rows per beat, map CC and program changes to FX slots
- Offline or air-gapped use — run locally; nothing leaves the machine unless you save a file
- No backend — MIDI bytes and patterns never leave the browser unless you export
- Source MIDI preserved — re-download the original file from MIDI → Source after import
- Local dev —
npm run devserves the app on your machine only
| Step | Purpose |
|---|---|
| Load | Drop or browse .mid / .midi, try Sample, or enter notes on a blank grid |
| Edit | Grid keyboard entry, undo/redo, song order, BPM, pattern length, GM SoundFont preview |
| Export | Tracker+ project ZIP, individual .mtp files, MIDI reference for hardware A/B |
Blank start · Session import report after MIDI conversion
- 8-track mapping — busiest MIDI channels → Tracker tracks; instrument slots 49–64 (hardware 48–63)
- Tempo map —
TFX on track 1, pattern splits at BPM changes - MIDI FX — CC and program changes mapped to Tracker FX columns (a–f)
- GM preview — FluidR3_GM SoundFont audition in-browser (export remains authoritative for hardware)
- Export validation — tracker-lib round-trip on patterns,
project.mt, and metadata before download - MIDI reference export — grid-as-MIDI for A/B against the Tracker+ hardware
- Keyboard grid — Z–M note entry, undo/redo,
?for help
Try the demo: david9up.github.io/miditracker → Sample for a demo pattern
Run locally:
git clone https://github.com/david9up/miditracker.git
cd miditracker
npm install
npm run devnpm run test:all # unit + smoke + expert (402 tests)
npm run test:expert # senior MIDI developer review suite only
npm run build # production build → dist/
npm run build:pages # GitHub Pages build (base /miditracker/)
npm run preview # serve dist/ on port 5310
npm run release # test:all + build
npm run screenshots # refresh docs/screenshots/ (see docs/screenshots/README.md)
npm run validate:export -- <path> # validate saved .mtp, .mt, or export ZIPDeploy: DEPLOY.md · Releases: CHANGELOG.md
Images in docs/screenshots/ are generated by Playwright, not hand-cropped:
npm run screenshotsCommit refreshed PNGs when the UI changes. See docs/screenshots/README.md for the file map.
src/lib/ is split into three areas:
midi/— MIDI import, tempo map, FX mapping, pattern splittingexport/— Tracker+ export, validation, save dialogs, tracker-lib I/O- root — shared types, grid editing, playback, song session
import { importMidiBuffer, exportProjectZip } from './src/lib'
const buffer = await file.arrayBuffer()
const { song, report } = importMidiBuffer(buffer)
await exportProjectZip(song)David Malcher — dmalcher@fortinet.com
Bug reports and feature ideas: GitHub Issues
MIT — LICENSE