Portfolio / Python lane / Tunerize
PY

Tunerize

Audio → chiptune or SoundFont, locally

Python
Delivery
Source-first
Browse code, README, and release notes on GitHub.
Primary lane
Python lane
The clearest adjacent context for this project inside the portfolio.
Freshness
Updated Apr 26, 2026
Latest release
No tag yet
README is the clearest project overview right now.

Preview

Using the generated project card as a clean fallback until a live capture is available.

Tunerize card

Source at github.com/SysAdminDoc/Tunerize.

README

Cached at build time, cleaned up for in-site reading, and linked back to the canonical GitHub source.

Tunerize

![Version](https://img.shields.io/badge/version-0.3.0-blue?style=flat-square) ![License: MIT](https://img.shields.io/badge/license-MIT-green?style=flat-square) ![Platform: Windows](https://img.shields.io/badge/platform-Windows-0078D6?style=flat-square&logo=windows) ![Python 3.11+](https://img.shields.io/badge/python-3.11%2B-3776AB?style=flat-square&logo=python&logoColor=white) ![Built with PySide6](https://img.shields.io/badge/UI-PySide6-41CD52?style=flat-square&logo=qt&logoColor=white)

Re-render any audio as chiptune — or through any SoundFont you choose. Drop in an MP3 or WAV, pick Chiptune Mode (built-in retro synths, zero setup) or any .sf2 (piano, brass, SC-55, anything), and get back a WAV in that style.

Tunerize does the full pipeline locally: audio → MIDI (via Spotify Basic Pitch) → cleaned MIDI → render. Two render paths:

  • Chiptune engine (built-in) — three chip models: NES APU-style (2 pulse + triangle + noise), Game Boy DMG (2 pulse + 4-bit wave + noise), and SNES SPC700-style (8 voices with multi-harmonic waveforms, Gaussian warmth filter, and echo). No SoundFont needed.
  • SoundFont engine (FluidSynth) — anything .sf2 you can find.

One window, one button, no cloud.

Tunerize banner


Features

  • Built-in chiptune engines — NES-style (2 pulse + triangle + noise) and Game Boy DMG-style (2 pulse + custom wave + noise) synths ship in the app. Zero install, instant retro.
  • Online SoundFont browser — search and install SF2s from public libraries (musical-artifacts.com, GitHub topic:soundfont, and Reddit r/soundfonts leads) without leaving the app. License + author shown for every result.
  • Bring-your-own SoundFonts — Drop .sf2 / .sf3 into soundfonts/; Tunerize scans, validates, lists them, and keeps your recent picks at the top.
  • Preset-aware SoundFont workflow — Tunerize reads bank/program names from .sf2 / .sf3 files, lets you choose a preset, and can render a short preview before conversion.
  • Drag-and-drop input — Drop supported audio files directly on the window, or use the file picker.
  • One-click conversion — Open audio, pick mode, hit Convert. WAV out.
  • Stem separation (optional) — Pre-split mixed tracks with Demucs for cleaner transcription on full songs.
  • MIDI export — Keep the intermediate .mid for use elsewhere.
  • MIDI cleanup — Quantize, remove tiny artifacts, normalize velocity, transpose. All defaults sane; tweak in Advanced.
  • Chiptune voice mixer — Pick the chip engine, then adjust, mute, or solo the built-in pulse, triangle/wave, and noise voices before rendering.
  • Force-preset mode — For non-GM SoundFonts, force every note through one preset.
  • Background worker — UI never freezes during long conversions.
  • Dark by default — Catppuccin Mocha theme.

Install (from source)

Prerequisites

  • Python 3.11 or 3.12 (3.13 may work but is not yet validated against basic-pitch ONNX)
  • FluidSynthonly required for SoundFont mode; Chiptune Mode works without it.
    • Windows: winget install FluidSynth.FluidSynth or download from fluidsynth.org and put fluidsynth.exe on PATH
    • macOS: brew install fluid-synth
    • Linux: sudo apt install fluidsynth (or distro equivalent)
  • FFmpeg (MP3 decoding) — bundled via imageio-ffmpeg; no separate install needed

Setup

git clone https://github.com/SysAdminDoc/Tunerize.git
cd Tunerize
python -m venv .venv
.venv\Scripts\activate          # Windows
# source .venv/bin/activate     # macOS/Linux
pip install -r requirements.txt
python -m app.main

Get some SoundFonts

Three options:

  1. Use the built-in browser (easiest) — Open Tunerize, switch to SoundFont mode, click Browse Online…. Searches musical-artifacts.com, GitHub topic:soundfont, and Reddit r/soundfonts leads. Direct .sf2 / .sf3 / archive links download in one click; GitHub repositories are saved as ZIP bundles; Reddit discussion-only results open in your browser for review.
  2. Drop your own into soundfonts/ (.sf2 / .sf3). Restart or hit ↻ to re-scan.
  3. Recommended grabs:
    • FluidR3 GM (MIT, the FluidSynth default, ~140MB) — search the browser for "FluidR3"
    • GeneralUser GS (CC BY-SA, full GM bank, ~30MB) — search "GeneralUser"
    • 8-bit / NES — search "NES" or "chiptune"
    • SC-55 / SC-88 — Roland synth recreations

Usage

  1. Open Audio — pick or drop an MP3, WAV, FLAC, OGG, M4A, AIFF, or AIF.
  2. Choose render mode:
    • Chiptune Mode — uses the built-in NES-style synth. No SoundFont required.
    • SoundFont Mode — pick a .sf2 from the dropdown, click Add… to import one from disk, or click Browse Online… to grab one from a public library. Recently installed or used SoundFonts appear first.
  3. (Optional) In Advanced, choose a SoundFont preset and click Preview to audition a five-second phrase. Enable Force all notes to selected preset for non-GM banks.
  4. (Optional) Toggle Stem separation if your input is a mixed song.
  5. (Optional) Open Advanced for transpose, quantize grid, chip engine, chiptune voice mix, force-preset mode, output folder.
  6. Convert. Watch the progress bar and log panel.
  7. Output lands at <input_dir>/<song>__chiptune.wav (or __<soundfont>.wav), plus .mid if you opted in.

Limitations

  • Basic Pitch is best on monophonic / lightly polyphonic audio. Single instruments, melodies, vocals: great. Full mixed songs: messy without stem separation.
  • Stem separation adds 1–3 minutes per song (Demucs is heavy). It's opt-in for that reason.
  • Chiptune Mode is 4-voice polyphonic (NES-style). Dense polyphonic input gets thinned via voice-stealing. That's the retro authenticity, not a bug.
  • General MIDI assumption (SoundFont mode): Tunerize starts from the selected SoundFont preset. For GM-compatible SoundFonts this is usually bank 0, preset 0: "Acoustic Grand Piano." Use Force all notes to selected preset for non-GM banks.
  • No realtime monitoring yet — preset preview and conversion are rendered offline to WAV.

Roadmap

See ROADMAP.md. Highlights:

  • v0.2 (this release): Online SoundFont browser
  • v0.3: Bundled FluidSynth, Windows binary, FluidR3 onboarding, SNES / Genesis chiptune engines
  • v0.4: Polyphone integration (bundled SF2 editor — GPL, ships in installer)
  • v0.5: Built-in SF2 creator (sample → SF2, native, no external tool)
  • v0.6: MP3/OGG/FLAC export, batch mode, genre presets, CLI mode

Development

pip install -r requirements-dev.txt
pytest                       # run tests
python -m app.main           # run the app
ruff check .                 # lint

Build a Windows binary (after PyInstaller is installed):

python build/build_windows.py

License

MIT. Built on:

Read on GitHub → github.com/SysAdminDoc/Tunerize