sample-chopper
Chops a recording the way it would be done by hand in Ableton, driven by measured numbers rather than guesses.
Links
README
From the repo.
sample-chopper
Chops a recording the same way it would be done by hand in Ableton, and
accumulates the results into a Live project. Cut points come from the numbers
sample-reader measured; when a number is missing it skips the technique
rather than guessing.
Install
No extra packages. numpy, soundfile, librosa and scipy are already on
the machine. sample-reader is imported from the sibling directory, not
installed separately.
Usage
cd 01_AI_Tools/sample-chopper
python3 -m samplechopper chop "/path/to/recordings"
Default project: 07_Projects/ChopLab Project. Use --project for another.
# only certain techniques, at most 4 chops per source
python3 -m samplechopper chop recordings --techniques micro_chop reverse_chop --per-technique 4
# chop only what matches a sample-reader profile (the real use)
python3 -m samplereader profile "/my/own/music" --label mine --out mine.json
python3 -m samplechopper chop "/downloaded/records" --match mine.json --top 20
# watch a folder and chop new material automatically
python3 -m samplechopper watch "/path/to/recordings" --every 300
python3 -m samplechopper status # what is in the project, what was skipped
python3 -m samplechopper techniques # list the techniques
chop is safe to re-run. A source already in the ledger is not chopped twice,
and a file is recognised by its content hash even if it has been renamed.
Ten techniques
Same ids as Sensei's sample_chop_techniques.json taxonomy:
| id | what it does | needs tempo |
|---|---|---|
micro_chop | 1/16 slices | yes |
phrase_chop | 2-bar phrases | yes |
stutter_chop | 1/8 → 1/16 → 1/32 roll | yes |
filter_sweep_chop | resonant LP sweep over 1 bar (up and down) | yes |
reverse_chop | transient slice, reversed | no |
one_shot_hit | single hit, cut at the measured decay | no |
granular_spray | 4-second bed built from 40–90 ms grains | no |
texture_bed | harmonic section, 4 kHz LP, held low | no |
time_stretch_pad | harmonic layer stretched 4× | no |
vocal_chop | slices from a separated vocal stem | no |
What it will not do
- No grid cuts without a tempo. On a recording where the pulse cannot be measured, grid techniques are skipped and the reason is written to the ledger. A wrong grid is worse than no grid.
- It does not extract a vocal chop from a mix. Without a real
vocalsstem beside it (demucs layout) it saysno_vocal_stemand moves on. - No texture bed from a drum break. If the measured harmonic ratio is below the threshold, it skips.
- It does not write .als. Chops land as files; placing them on a Live timeline is separate work and needs separate evidence.
The cut itself
Every cut point is pulled to the nearest zero crossing (±5 ms) and a 3 ms fade is placed at both ends of each slice. Those two things are the only difference between a chop and a click. Files are written at the source's own sample rate and bit depth; a lossy source (mp3) drops to 24-bit.
Tests
python3 -m pytest tests -q
23 tests. They run without opening Live: each reads the written file back, confirms a reversed chop really is reversed by correlation, checks which way the sweep moved the spectrum by FFT, and verifies there is no click at the boundaries from the first and last samples. What they do not prove: that the folder behaves like a project inside Live, and that the resulting sounds are any good.
Collected info
- ★ 0 stars
- Language: Python
- Source updated: 9/18/2026
Config for your environment
Replace {MCP_ENDPOINT_URL} with this MCP’s endpoint URL (from its repo or docs above). No API key — you connect directly.
Tool
OS
Config file: ~/.cursor/mcp.json
{
"mcpServers": {
"mcp-server": {
"url": "{MCP_ENDPOINT_URL}"
}
}
}Paste into mcpServers in the config file. Restart Cursor after saving.
If this MCP is also published on mcpchannel.ai, you can subscribe from Browse and use the gateway config there instead.