{"id":30856399,"url":"https://github.com/derbiter/polysplit","last_synced_at":"2026-04-16T18:03:10.448Z","repository":{"id":312316990,"uuid":"1044387816","full_name":"derbiter/PolySplit","owner":"derbiter","description":"PolySplit: a macOS tool for safely splitting polywavs into clean, labeled mono WAVs — fast, reliable, and ready for sessions.","archived":false,"fork":false,"pushed_at":"2025-08-29T18:25:38.000Z","size":8,"stargazers_count":1,"open_issues_count":0,"forks_count":0,"subscribers_count":0,"default_branch":"main","last_synced_at":"2025-10-18T21:57:55.019Z","etag":null,"topics":["audio","bash","ffmpeg","polywav","post-production","sound-engineering"],"latest_commit_sha":null,"homepage":"","language":"Shell","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/derbiter.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2025-08-25T15:53:23.000Z","updated_at":"2025-08-29T18:40:43.000Z","dependencies_parsed_at":"2026-01-05T19:06:16.624Z","dependency_job_id":null,"html_url":"https://github.com/derbiter/PolySplit","commit_stats":null,"previous_names":["derbiter/polywav-split-macos"],"tags_count":2,"template":false,"template_full_name":null,"purl":"pkg:github/derbiter/PolySplit","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/derbiter%2FPolySplit","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/derbiter%2FPolySplit/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/derbiter%2FPolySplit/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/derbiter%2FPolySplit/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/derbiter","download_url":"https://codeload.github.com/derbiter/PolySplit/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/derbiter%2FPolySplit/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":31897870,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-04-16T17:33:00.867Z","status":"ssl_error","status_checked_at":"2026-04-16T17:32:57.401Z","response_time":69,"last_error":"SSL_connect returned=1 errno=0 peeraddr=140.82.121.5:443 state=error: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["audio","bash","ffmpeg","polywav","post-production","sound-engineering"],"created_at":"2025-09-07T12:01:21.606Z","updated_at":"2026-04-16T18:03:10.442Z","avatar_url":"https://github.com/derbiter.png","language":"Shell","funding_links":[],"categories":[],"sub_categories":[],"readme":"# PolySplit\n\nPolySplit is a macOS-friendly Bash utility that splits multichannel WAV (polywav) and AIFF files into labeled mono WAVs using FFmpeg.\n\nIt is built for Behringer X32 and M32 multitrack recordings, including the common FAT32 workflow where long recordings are saved as multiple 4.31 GB segment files.\n\n## What it does\n\n- Splits each multichannel file into one mono WAV per channel\n- Names files using your channels.txt labels (comments supported)\n- Optional stitch mode that concatenates segmented recordings first (for example 00000001.WAV, 00000002.WAV, 00000003.WAV), then splits the combined stream so you get one continuous file per channel\n\n## Audio quality\n\nPolySplit does not compress audio. It writes uncompressed PCM WAV output.\n\nIf your files are large, that is normal. X32 and M32 recordings are commonly 48 kHz PCM, often 32-bit, which produces large mono files for long sets.\n\n## Requirements\n\n- macOS (works on macOS 15+)\n- Homebrew recommended\n- FFmpeg (includes ffmpeg and ffprobe)\n\nInstall FFmpeg:\n\n```bash\nbrew install ffmpeg\n```\n\n## Install\n\n```bash\ngit clone https://github.com/derbiter/PolySplit.git\ncd PolySplit\nchmod +x polysplit.sh\n```\n\n## Channel labels file (channels.txt)\n\nchannels.txt must contain one channel name per line, in the same order as your recorder’s channels.\n\nRules:\n- Blank lines are ignored\n- Lines starting with # are comments and ignored\n- Labels are sanitized for filenames (uppercase, spaces to _, unsafe characters to _)\n\nExample:\n\n```text\nKICK IN\nKICK OUT\nSNARE TOP\nSNARE BOT\nRACK TOM\nFLOOR\nHH\nBASS\nVINCE GTR\nBRANDON GTR\nBRANDON VOX\n# Unused channels can be numbers or left blank\n12\n13\n14\n```\n\nPolySplit will stop if the number of non-comment lines does not match the source file’s channel count.\n\n## Basic usage (split each polywav independently)\n\n```bash\n./polysplit.sh \\\n  --src \"/path/to/audio\" \\\n  --out \"/path/to/output\" \\\n  --channels \"/path/to/channels.txt\"\n```\n\nThis scans --src recursively for .wav, .aif, and .aiff, then splits each multichannel file into mono WAVs.\n\n## Stitch mode (recommended for X32/M32 FAT32 segments)\n\nWhen recording to FAT32, long takes are often split into segment files (commonly 8-digit names):\n- 00000001.WAV\n- 00000002.WAV\n- 00000003.WAV\n- 00000004.WAV\n\nStitch mode concatenates the segments in filename order and then splits into mono WAVs, producing one continuous per-channel file for the full recording.\n\n### Stitch a single session folder\n\n```bash\n./polysplit.sh \\\n  --src \"/Volumes/Q4 2025/KBC 2025/AUDIO/5C22B94E\" \\\n  --out \"/Volumes/Q4 2025/KBC 2025/AUDIO/5C22B94E/PolySplit_Final\" \\\n  --channels \"/Volumes/Q4 2025/KBC 2025/AUDIO/5C22B94E/channels.txt\" \\\n  --stitch dir \\\n  --mode final \\\n  --yes\n```\n\n### Stitch discovery modes\n\n--stitch dir:\n- If --src itself contains segment files named like 00000001.WAV, it treats --src as one session\n- Otherwise, it searches under --src and treats each directory containing segment files as a separate session\n\n--stitch all:\n- Treats --src as one session and attempts to stitch segment files directly under --src\n- Use with care. dir is usually safer.\n\n### Stitch validations\n\nBefore stitching, PolySplit validates that all segments in the session have the same channel count and sample rate.\n\n## Output naming\n\nDefault naming is:\n- \u003cSESSION\u003e_\u003cNN\u003e_\u003cLABEL\u003e.wav\n\nExample:\n- 5C22B94E_01_KICK_IN.wav\n- 5C22B94E_02_KICK_OUT.wav\n\n### Smart naming (default)\n\nSmart naming avoids redundant numeric labels. If your label is just the channel number, PolySplit omits it so you do not get 12_12.wav.\n\nExample with 12 in channels.txt:\n- 5C22B94E_12.wav\n\nName style options:\n- --name-style smart (default)\n- --name-style default (always include the label if present)\n\n## Layouts\n\n- --layout flat (default): all outputs go directly into --out\n- --layout folders: creates a subfolder per source file or per stitched session\n\n## Output safety modes\n\n--mode controls what happens when the output already exists:\n\n- new (default): writes to a new folder by appending _2, _3, etc\n- backup: renames the existing output folder to __backup_\u003ctimestamp\u003e and writes fresh output\n- overwrite: deletes the output folder first (requires confirmation, or --yes)\n- resume: keeps the output folder and skips files that already exist\n- final: writes to a temporary work folder, then replaces the final output folder only if everything succeeds (recommended)\n\nRecommended for clean reruns:\n- --mode final --yes\n\n## Dry run\n\nPreview without writing files:\n\n```bash\n./polysplit.sh \\\n  --src \"/in\" \\\n  --out \"/out\" \\\n  --channels \"./channels.txt\" \\\n  --stitch dir \\\n  --mode final \\\n  --dry-run\n```\n\n## Performance tuning (Apple Silicon friendly)\n\n- --workers N controls how many parallel jobs run\n- --ffmpeg-threads N controls threads per FFmpeg job (often best kept low when running multiple workers)\n\nGood starting points:\n- --workers 6 to 10 depending on your disk speed\n- --ffmpeg-threads 1 (default)\n\nExample:\n\n```bash\n./polysplit.sh --src \"/in\" --out \"/out\" --channels \"./channels.txt\" --workers 8 --ffmpeg-threads 1\n```\n\n## zsh tip\n\nAlways quote paths to avoid zsh glob expansion issues:\n\n```bash\n./polysplit.sh --src \"/Volumes/SHOW/AUDIO/5C22B94E\" --out \"/Volumes/SHOW/AUDIO/PolySplit_Final\" --channels \"/Volumes/SHOW/AUDIO/5C22B94E/channels.txt\"\n```\n\n## License\n\nMIT. See LICENSE.\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fderbiter%2Fpolysplit","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fderbiter%2Fpolysplit","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fderbiter%2Fpolysplit/lists"}