A cross-platform desktop app for loading a folder of audio files, arranging them in any order, and joining them into a single WAV file with a short click sound between each file — useful for creating stimulus lists, demos, and audio databases.
- Load a folder of audio files (WAV, MP3, FLAC, AIFF, OGG, M4A)
- Drag-and-drop reordering with multi-select (Shift+Click, Ctrl/Cmd+Click)
- Simple sort mode — sort by name, numerical order, date created/modified/accessed
- Suffix Order — sub-sort files that share a base name by an ordered list of substring/regex patterns (designed for Dekereke databases where each stimulus has multiple tagged variants)
- Advanced (Regex) sort mode — multi-layer regex sort with configurable capture groups, sort-as modes (natural text, numeric, alphabetical), and per-layer direction
- Output bit depth: 16-bit (default), 24-bit, or 32-bit WAV
- Non-blocking join (runs on a background thread)
- Works as a plain Python script or as a PyInstaller portable app (Windows, macOS, Linux)
- Python 3.10+
- PySide6
- pydub
- numpy
- ffmpeg — system-wide install, or drop a static binary into
bin/ffmpeg(seebin/README.md)
pip install PySide6 pydub numpy
python app.pypip install pyinstaller
pyinstaller --onefile app.pyPlace ffmpeg (and optionally ffprobe) binaries inside bin/ before
packaging so they are bundled automatically. See bin/README.md
for the .spec snippet and where to download static builds.
app.py Main GUI (PySide6)
joiner.py Audio join worker (pydub, numpy)
ffmpeg_utils.py ffmpeg/ffprobe binary discovery
bin/ Placeholder for bundled ffmpeg binaries
docs/ GitHub Pages documentation site
GNU Affero General Public License v3.0 — see LICENSE.
Copyright 2026 Seth Johnston.
Built with assistance from Claude by Anthropic.