No description
  • Python 44.3%
  • C++ 22.2%
  • Svelte 11.4%
  • JavaScript 6.5%
  • CSS 5.5%
  • Other 10%
Find a file
Repository files (latest commit first)
Filename Latest commit message Latest commit date
2026-10-24 03:59:47 +03:00
app Validate restored float audio and late cancellation before publication 2026-10-24 03:54:48 +03:00
MixApp-Design-Concepts Polish transition levels, transport footer and notifications 2026-10-18 01:21:52 +03:00
native/rubberband Add current MixApp source 2026-09-25 12:15:36 +03:00
protocol Polish transition levels, transport footer and notifications 2026-10-18 01:21:52 +03:00
release-notes Preserve UTF-8 across Windows engine and analysis IPC 2026-10-17 00:40:47 +03:00
tests Make cached PCM fixture independent of worker start timing 2026-10-17 03:42:54 +03:00
tools Use production timing services in realtime profiling scenarios 2026-10-19 05:16:12 +03:00
ui-v2 Reset filtered Library range anchors on a new Shift selection 2026-10-24 03:57:12 +03:00
updates Publish MixApp 0.1.0 updater manifest 2026-10-17 00:50:37 +03:00
.gitignore Prepare MixApp 0.1.0 with parallel export and live editing 2026-10-17 00:35:26 +03:00
.node-version Pin build inputs and verify packaged engine identity 2026-09-30 01:51:33 +03:00
AGENTS.md Document test policy and automatic commit and push workflow 2026-10-18 01:23:59 +03:00
ENGINE_PROTOCOL.md Record regression acceptance and current protocol behavior 2026-10-24 03:59:47 +03:00
GRAPHITE_IMPLEMENTATION_PLAN.md Document staged Graphite interface migration and feature parity 2026-10-17 10:10:14 +03:00
LICENSE Release MixApp 0.0.1 for Windows 2026-09-27 16:01:14 +03:00
MixApp-Full-Audit-and-Implementation-Roadmap.md Prepare MixApp 0.1.0 with parallel export and live editing 2026-10-17 00:35:26 +03:00
MIXAPP_EXPORT_AUDIT.md Preserve UTF-8 across Windows engine and analysis IPC 2026-10-17 00:40:47 +03:00
MIXAPP_REFACTOR_PROGRESS.md Record regression acceptance and current protocol behavior 2026-10-24 03:59:47 +03:00
MIXAPP_UI_UX_AUDIT_AND_ROADMAP.md Prepare MixApp 0.1.0 with parallel export and live editing 2026-10-17 00:35:26 +03:00
model-windows.lock.json Pin build inputs and verify packaged engine identity 2026-09-30 01:51:33 +03:00
native-windows.lock.json Normalize track levels and improve timeline automation editing 2026-10-17 02:46:43 +03:00
README.md Prepare MixApp 0.1.0 with parallel export and live editing 2026-10-17 00:35:26 +03:00
requirements-build.txt Sync current MixApp source and branding 2026-09-27 15:00:50 +03:00
requirements-windows-py312.lock Pin build inputs and verify packaged engine identity 2026-09-30 01:51:33 +03:00
requirements.txt Improve track analysis speed and beat-grid accuracy 2026-09-30 13:25:45 +03:00
rust-toolchain.toml Pin build inputs and verify packaged engine identity 2026-09-30 01:51:33 +03:00
THIRD-PARTY-NOTICES.md Arrange Graphite workspace with resizable persistent panels 2026-10-17 10:31:21 +03:00
TIMING_CONTRACT.md Align realtime EQ with bypass and export timing 2026-09-29 22:13:08 +03:00

MixApp

MixApp is a desktop application for preparing timeline-based DJ mixes. The primary desktop UI is Tauri 2, Svelte, TypeScript, and PixiJS. Python owns project, analysis, and audio behavior through the versioned stdio engine bridge.

Run from source

Install Python 3.12+, Node.js, Rust, and the platform prerequisites for Tauri. Then run:

python -m pip install -r requirements.txt
cd ui-v2
pnpm install --frozen-lockfile
pnpm run tauri dev

Build the desktop application with:

cd ui-v2
pnpm run tauri build

The Tauri bridge uses the system Python only in development. Production builds launch a packaged mixapp-engine sidecar from Tauri's resources/engine/ directory. Build the engine with Python 3.12 and the reviewed Windows dependency lock, then stage the pinned FFmpeg and Rubber Band binaries alongside it:

./tools/build_engine.ps1 -FfmpegPath C:/path/to/ffmpeg.exe -RubberBandPath C:/path/to/rubberband-3.dll -NonCommercialDistribution

Then build the desktop app from ui-v2/ with pnpm run tauri build. The packaged engine is platform-specific; build it separately on each target OS. The Windows Rubber Band runtime can be built with tools/build_rubberband.ps1 (Git, Meson, and Visual Studio C++ Build Tools required). For development, pnpm run tauri dev continues to use Python from PATH or MIXAPP_PYTHON_EXECUTABLE. Madmom track analysis uses up to four process workers on larger machines for tracks at least three minutes long. The process count (1, 2, 4 or 8) is selected in Application settings and saved for later sessions; an existing MIXAPP_MADMOM_WORKERS environment value is still honored when no app preference has been saved.

The current packager uses PyInstaller one-folder mode: it avoids unpacking the complete scientific stack at every engine launch and keeps native dependencies inspectable. Nuitka standalone is a viable later comparison, but adds C compiler/toolchain requirements; one-file modes for either tool trade simpler delivery for extraction/startup behavior and are not the current target.

Audio-only Windows FFmpeg

tools/build_ffmpeg_audio.sh cross-compiles a standalone Windows x64 FFmpeg from the same pinned source commit as the current full build. It retains audio decoding for existing Library imports, MP3/WAV encoding and canonical float PCM output; video codecs, network access and capture devices are disabled. Runtime CPU detection and x86 SIMD remain enabled. LAME is statically linked.

Run on an x86_64 Linux/WSL host with Bash, curl, tar/xz, GNU make, GCC, Perl and sha256sum. The script downloads hash-pinned LLVM-MinGW, NASM, FFmpeg and LAME archives into its work directory; it does not install system packages. Prefer a Linux filesystem for the work directory when using WSL:

bash /path/to/mix-app/tools/build_ffmpeg_audio.sh /path/to/linux-build-directory

The binary is written to <work-directory>/dist/ffmpeg.exe, with licenses and the exact configuration. Copy the entire dist directory to Windows before verification. In the Windows checkout:

python tools/verify_ffmpeg_audio.py --reference ui-v2/src-tauri/resources/engine/ffmpeg.exe --candidate build/ffmpeg-audio/candidate/ffmpeg.exe --output build/ffmpeg-audio/validation

This checks generated fixtures through MixApp's actual decode/encode service, including MP3 artwork, AAC audio inside an MP4 video, mono/multichannel input, all export variants and 120-second decode comparisons. It writes report.json. The native Windows lock now pins this audio-only build. Copy the verified binary to app/native/ffmpeg.exe for source development; FFmpegService prefers it over the system FFmpeg. Frozen engines prefer the binary beside the sidecar. Explicit executable arguments still take precedence, and PATH remains a fallback if the local binary is absent. Rebuild the engine with the verified dist/ffmpeg.exe and its sibling licenses/ directory using tools/build_engine.ps1. The build and verification tools do not modify an installed app or publish releases.

Signed Windows releases

Python engine packaging uses tools/mixapp_engine.spec. It retains the audio analysis paths and runtime data, excluding unused librosa decomposition, segmentation, effects and display modules and their scikit-learn dependency. The development lock still installs scikit-learn as a librosa dependency. Foreign PortAudio binaries are excluded on Windows x64. Both x64 PortAudio variants (normal and ASIO) remain. Each build writes its exclusion inventory to build/pyinstaller/mixapp_engine/engine-package-report.json.

Synchronized offline export uses the bundled Rubber Band R3 CLI, separate from the realtime preview library. tools/build_engine.ps1 prepares its hash-pinned official Windows archive automatically. For source runs, execute tools/prepare_rubberband_cli.ps1 once. The resolver honors explicit paths and RUBBERBAND_PATH, then checks the bundle before system/user tools. The CLI and its libsndfile dependency live together under rubberband-cli/.

Create the Tauri updater signing key once with pnpm exec tauri signer generate --ci --write-keys "$HOME/.tauri/mixapp-updater.key" from ui-v2/; keep the private key outside Git and back it up securely. For a noncommercial release using the bundled madmom weights, prepare version 0.1.0 with tools/release.ps1 -Version 0.1.0 -NonCommercialDistribution. It verifies the staged engine against the reviewed source and resource manifest (or rebuilds it when both native binary paths are supplied), builds the signed NSIS installer, and writes the installer, .sig, checksums, and updates/latest.json to the ignored release/ directory. Add release-notes/v0.1.0.md first, then commit/push the generated public metadata and publish the prepared assets under the matching Forgejo tag. Commercial distribution requires separate permission for the model weights.

Checks

python -m unittest discover -s tests -q
cd ui-v2
pnpm run check
pnpm run test:ui
pnpm run build
cd src-tauri
cargo test

License

MixApp source is licensed under GPL-3.0-or-later. Bundled third-party software and model weights retain their separate licenses; see THIRD-PARTY-NOTICES.md and the licenses/ folder in the installed application.

Project layout

  • ui-v2/ — Tauri/Svelte/PixiJS desktop application
  • app/ — Python application, domain, project persistence, analysis, and audio engine
  • native/rubberband/ — Rubber Band source and license
  • tests/ — Python and UI tests
  • tools/ — native build and audio verification scripts

Runtime architecture

The Svelte/PixiJS UI is a presentation client. Tauri's Rust bridge exchanges versioned JSON envelopes with the Python engine, which owns the project model, analysis, transport, timing, and audio rules. UI views refresh bounded snapshots when their domain revisions advance; waveform IPC contains reduced display peaks only, never PCM.

Realtime preview uses Rubber Band's realtime path by default. A Tempo Map or sync edit publishes a completed immutable render snapshot for the next audio block, so a currently rendering block remains internally consistent. Set MIXAPP_PREVIEW_SYNC_MODE=prepared only when deliberately selecting the prepared clip-local compatibility path.

Export captures that same completed render snapshot at the start of the job and creates its own renderer, source resolver, readers, and DSP state. Edits made after export begins cannot alter the rendered audio. PCM and prepared media caches may be reused as immutable resources. Export readiness still checks required media and tempo assets before it writes a temporary file and atomically replaces the destination on success.