Skip to content

Repository files navigation

Seraph

A desktop chiptune tracker / DAW for the Sega Genesis / Mega Drive sound hardware. Compose music against emulation of the console's actual sound chips, then export it to a format that plays back on real hardware (or in a ROM).

Built with Tauri v2 (Rust core) and React 19 + TypeScript (UI).

What it does

  • Real-time playback through emulation of the Yamaha YM2612 FM synth chip (via the Nuked-OPN2 core) and the SN76489 PSG (pure-Rust emulator). The sequencer runs inside the audio callback, so timing is sample-accurate.
  • Compose from scratch, or import an existing song. A new project is seeded with one track per hardware channel (FM1FM6/DAC, PSG1PSG3, PSG Noise, DAC); from there you place regions on the arrangement timeline (with a draggable loop bracket on its ruler), and enter notes in the piano roll.
  • Three instrument types matching the hardware: FM, PSG, and DAC (PCM samples) — each with a dedicated editor: FM operator/algorithm knobs, drawable PSG volume envelopes, WAV/raw DAC import.
  • Piano roll with a Draw Mode (B) for one-gesture note painting and right-click erase, plus marquee/click selection, group drag, keyboard transpose, grid nudge, copy/paste and undo/redo. Every note carries its own velocity, pan, detune and modulation, and can override its track's voice.
  • Edits stay audible while the loop runs — adding, moving or deleting notes and tweaking instrument parameters reload the running sequence instead of stopping it.
  • A bundled instrument library of ~600 FM voices and PSG envelopes ripped from Sonic 2, Sonic 3 & Knuckles (including its Universal Voice Bank) and The Adventures of Batman & Robin. Search, tag and favorite entries, audition them, and drag one onto a track header or onto notes in the piano roll. Your own library roots can be added from the app, and .tfi/.vgi/.y12/.gyb files imported into them.
  • Live spectrum analyzer + per-track level meters for visual feedback while playing.

Import / Export

Direction Formats
Import SMPS (Sega's sound-driver assembly, .asm text), VGM/VGZ, Zyrinx song data out of a Genesis ROM (Batman & Robin), FM instrument files (.tfi, .vgi, .y12, .gyb)
Export Flamedriver SMPS assemblyMus - <name>.asm + Voices - <name>.asm plus a dac/ folder, assembling straight into a ROM — and a rendered WAV. VGM export exists in the Rust core but has no UI button yet.

This makes Seraph a companion to the SMPS-based ROM-hacking projects in the parent workspace: compose here, export SMPS, drop it into the Z80 Flamedriver sound driver.

Tech stack

  • Core: Rust, cpal audio output, rtrb lock-free ring buffer
  • Sound chips: Nuked-OPN2 (YM2612, vendored C + FFI), custom Rust SN76489
  • UI: React 19, TypeScript 5.8, HTML5 Canvas rendering, CSS Modules
  • Shell: Tauri v2; IPC commands and their TypeScript types are generated by tauri-specta into src/bindings.ts

Development

Prerequisites: a Rust toolchain, Node.js, and the Tauri v2 system dependencies for your platform.

npm install            # install frontend dependencies
npm run tauri dev      # run the app (Vite dev server + Tauri window)
npm run tauri build    # produce a release build

Frontend-only commands:

npm run dev            # Vite dev server (no Tauri window)
npm run build          # type-check + build frontend
npm test               # Vitest suite
npm run gen:theme      # regenerate CSS theme tokens from tokens.json

Rust core, from src-tauri/:

cargo test             # Rust test suite

# rebuild a bundled library pack from a disassembly / ROM
# (subcommands: smps | gyb | zyrinx | psg-table | uvb — see the file header)
cargo run --bin extract_library -- psg-table --out ../library/smps-psg

Project layout

src/                       React + TypeScript UI
  components/              arrangement, piano roll, instrument editors, library panel
  widgets/  hooks/  utils/ knobs, envelope/waveform views, editing + grid helpers
  api/                     typed wrappers over the generated Tauri bindings
  theme/                   design tokens + generated CSS
src-tauri/src/            Rust core
  audio/                  real-time engine, mixing, spectrum analysis
  ym2612/  sn76489/       chip emulation (Nuked-OPN2 wrapper; native PSG)
  dac/                    PCM import + playback pipeline
  sequencer/              tick-based sequencer + snapshots
  driver/                 Flamedriver SMPS profile (channel layout, voice packing)
  import/  export/        SMPS / VGM / Zyrinx / FM format parsers and writers
  library/                instrument library index, store and extraction
  ipc/                    Tauri command surface
  model/  project/        data model + project file management
src-tauri/vendor/         vendored Nuked-OPN2 C source
library/                   bundled instrument packs (shipped as a Tauri resource)
docs/                      design specs and implementation plans

Status

Early development (0.1.0). The audio engine, instrument editors, arrangement and piano-roll editing, the instrument library, and SMPS/WAV export are functional; expect rough edges. Playback is a preview model rather than a hardware-exact one — most visibly, the DAC is mixed alongside FM6 instead of stealing it the way the real chip does.

About

No description, website, or topics provided.

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages