drumscript 0.1.5__tar.gz → 0.2.0__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {drumscript-0.1.5 → drumscript-0.2.0}/MANIFEST.in +1 -7
- {drumscript-0.1.5/DrumScript.egg-info → drumscript-0.2.0}/PKG-INFO +204 -74
- {drumscript-0.1.5 → drumscript-0.2.0}/README.md +201 -74
- {drumscript-0.1.5 → drumscript-0.2.0}/drumscript/__init__.py +180 -29
- drumscript-0.2.0/drumscript/datasets/base.py +17 -0
- drumscript-0.2.0/drumscript/datasets/idmt.py +243 -0
- drumscript-0.2.0/drumscript/main.py +435 -0
- {drumscript-0.1.5 → drumscript-0.2.0}/drumscript/notation_generator/score_builder.py +27 -1
- drumscript-0.2.0/drumscript/utils/__init__.py +0 -0
- {drumscript-0.1.5 → drumscript-0.2.0/drumscript.egg-info}/PKG-INFO +204 -74
- {drumscript-0.1.5/DrumScript.egg-info → drumscript-0.2.0/drumscript.egg-info}/SOURCES.txt +3 -6
- drumscript-0.2.0/drumscript.egg-info/entry_points.txt +2 -0
- {drumscript-0.1.5/DrumScript.egg-info → drumscript-0.2.0/drumscript.egg-info}/requires.txt +3 -0
- {drumscript-0.1.5 → drumscript-0.2.0}/pyproject.toml +13 -10
- drumscript-0.1.5/DrumScript.egg-info/entry_points.txt +0 -2
- drumscript-0.1.5/drumscript/main.py +0 -297
- {drumscript-0.1.5 → drumscript-0.2.0}/LICENSE +0 -0
- {drumscript-0.1.5 → drumscript-0.2.0}/drumscript/audio_processor/__init__.py +0 -0
- {drumscript-0.1.5 → drumscript-0.2.0}/drumscript/audio_processor/audio_loader.py +0 -0
- {drumscript-0.1.5 → drumscript-0.2.0}/drumscript/audio_processor/feature_extractor.py +0 -0
- {drumscript-0.1.5 → drumscript-0.2.0}/drumscript/audio_processor/onset_detector.py +0 -0
- {drumscript-0.1.5 → drumscript-0.2.0}/drumscript/audio_processor/stem_splitter.py +0 -0
- {drumscript-0.1.5 → drumscript-0.2.0}/drumscript/audio_processor/tempo_detector.py +0 -0
- {drumscript-0.1.5 → drumscript-0.2.0}/drumscript/audio_processor/tempogram.py +0 -0
- {drumscript-0.1.5/drumscript/drum_classifier → drumscript-0.2.0/drumscript/datasets}/__init__.py +0 -0
- {drumscript-0.1.5/drumscript/notation_generator → drumscript-0.2.0/drumscript/drum_classifier}/__init__.py +0 -0
- {drumscript-0.1.5 → drumscript-0.2.0}/drumscript/drum_classifier/classify.py +0 -0
- {drumscript-0.1.5/drumscript/utils → drumscript-0.2.0/drumscript/notation_generator}/__init__.py +0 -0
- {drumscript-0.1.5 → drumscript-0.2.0}/drumscript/notation_generator/constants.py +0 -0
- {drumscript-0.1.5 → drumscript-0.2.0}/drumscript/notation_generator/helpers.py +0 -0
- {drumscript-0.1.5 → drumscript-0.2.0}/drumscript/notation_generator/midi_exporter.py +0 -0
- {drumscript-0.1.5 → drumscript-0.2.0}/drumscript/notation_generator/pdf_exporter.py +0 -0
- {drumscript-0.1.5 → drumscript-0.2.0}/drumscript/notation_generator/xml_exporter.py +0 -0
- {drumscript-0.1.5 → drumscript-0.2.0}/drumscript/utils/ffmpeg_installer.py +0 -0
- {drumscript-0.1.5/DrumScript.egg-info → drumscript-0.2.0/drumscript.egg-info}/dependency_links.txt +0 -0
- {drumscript-0.1.5/DrumScript.egg-info → drumscript-0.2.0/drumscript.egg-info}/top_level.txt +0 -0
- {drumscript-0.1.5 → drumscript-0.2.0}/setup.cfg +0 -0
|
@@ -14,14 +14,8 @@ prune docs
|
|
|
14
14
|
prune local_tests
|
|
15
15
|
prune tests
|
|
16
16
|
prune test_audio
|
|
17
|
-
prune machine-learning
|
|
18
|
-
prune labeled_datasets
|
|
19
17
|
prune .archive
|
|
20
18
|
prune .development
|
|
21
19
|
prune logs
|
|
22
20
|
prune outputs
|
|
23
|
-
prune
|
|
24
|
-
prune visuals
|
|
25
|
-
prune .testing
|
|
26
|
-
prune branch_note
|
|
27
|
-
exclude Makefile
|
|
21
|
+
prune visuals
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: drumscript
|
|
3
|
-
Version: 0.
|
|
3
|
+
Version: 0.2.0
|
|
4
4
|
Summary: A Python package to convert drum audio to sheet music.
|
|
5
5
|
Author-email: drumscript-admin <hello.drumscript@gmail.com>
|
|
6
6
|
License-Expression: Apache-2.0
|
|
@@ -50,109 +50,138 @@ Provides-Extra: dev
|
|
|
50
50
|
Requires-Dist: ipykernel; extra == "dev"
|
|
51
51
|
Requires-Dist: myst-parser; extra == "dev"
|
|
52
52
|
Requires-Dist: myst-nb>=1.3.0; extra == "dev"
|
|
53
|
+
Requires-Dist: mir-eval>=0.8.2; extra == "dev"
|
|
53
54
|
Requires-Dist: pytest; extra == "dev"
|
|
54
55
|
Requires-Dist: pytest-cov>=7.1.0; extra == "dev"
|
|
55
56
|
Requires-Dist: shibuya>=2025.10.21; extra == "dev"
|
|
56
57
|
Requires-Dist: ipywidgets>=8.1.8; extra == "dev"
|
|
57
58
|
Requires-Dist: requests>=2.32.5; extra == "dev"
|
|
58
59
|
Requires-Dist: ruff>=0.15.11; extra == "dev"
|
|
60
|
+
Requires-Dist: twine>=6.2.0; extra == "dev"
|
|
61
|
+
Requires-Dist: nbstripout>=0.8.2; extra == "dev"
|
|
59
62
|
Dynamic: license-file
|
|
60
63
|
|
|
61
64
|
# **`DrumScript`**
|
|
62
65
|
|
|
63
66
|
<!--date_created: sun-15-june-2025-->
|
|
64
|
-
<!--date_edited:
|
|
67
|
+
<!--date_edited: weds-19-august-2026--->
|
|
65
68
|
|
|
66
|
-
**
|
|
69
|
+
**DrumScript** is an open-source Python library and CLI tool for drum audio analysis and transcription. Give it a recording — a full mix or an isolated drum stem — and it will generate PDF sheet music, MIDI files, and MusicXML output. The `DrumScript` model is a **deterministic classifier**, and doesn't use AI/machine learning. Built for drummers and by drummers, it is - and always will be - an open-source community tool.
|
|
67
70
|
|
|
68
|
-
|
|
71
|
+
> **Python >=3.9**
|
|
69
72
|
|
|
70
|
-
**
|
|
73
|
+
**Workflow Status**
|
|
74
|
+
>
|
|
75
|
+
[](https://github.com/DrumScript/DrumScript/actions/workflows/tests.yml)
|
|
76
|
+
>
|
|
77
|
+
**[Documentation](https://drumscript.github.io/DrumScript/)**
|
|
78
|
+
>
|
|
79
|
+
> **[Try DrumScript In Colab](https://colab.research.google.com/drive/15yBGu6WURPyiH-sEQ82g_2T2wKqiIPsq)**
|
|
80
|
+
>
|
|
81
|
+
> <a href="https://colab.research.google.com/drive/15yBGu6WURPyiH-sEQ82g_2T2wKqiIPsq" target="_parent"><img src="https://colab.research.google.com/assets/colab-badge.svg" alt="Open In Colab"/></a>
|
|
71
82
|
|
|
72
|
-
[](https://colab.research.google.com/drive/1eDVXc3d6ezmorxINOjzldRPSC3emTl2I)
|
|
73
83
|
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
84
|
+
- **[Features](#features)**
|
|
85
|
+
- **[Project Structure](#project-structure)**
|
|
86
|
+
- **[Installation](#installation)**
|
|
87
|
+
- **[Quick Start](#quick-start)**
|
|
88
|
+
- **[CLI Usage](#cli-usage)**
|
|
89
|
+
- **[Contributing](#contributing)**
|
|
90
|
+
- **[Testing](#testing)**
|
|
91
|
+
- **[Benchmarking](#benchmarking)**
|
|
92
|
+
- **[Traffic](#traffic)**
|
|
93
|
+
- **[FAQs](#faqs)**
|
|
94
|
+
- **[Changelog](CHANGELOG.md)**
|
|
95
|
+
- **[Acknowledgements](#acknowledgements)**
|
|
96
|
+
- **[Similar projects](#similar-projects)**
|
|
97
|
+
- **[License](#license)**
|
|
77
98
|
|
|
78
|
-
|
|
99
|
+
---
|
|
79
100
|
|
|
80
|
-
**Public Alpha (v0.1.4) —
|
|
101
|
+
#### **Public Alpha (v0.1.4+) — ongoing since June 2026**
|
|
81
102
|
|
|
82
103
|
- We're looking for early adopters and feedback
|
|
83
|
-
- [Feedback on the classification model](https://github.com/DrumScript/DrumScript/issues), and help shape v1.0.
|
|
104
|
+
- [Feedback on the classification model](https://github.com/DrumScript/DrumScript/issues), and help shape v1.0.0.
|
|
84
105
|
- In particular we are interested in hearing from everyone:: drummers (coding not required!), sound engineers and academics in Music Information Retrieval with an interest in deterministic drum/percussion classifications.
|
|
85
106
|
- For beta release, we are planning to (amongst other things) improve the classification model, fix any user-suggested bugs, implement user-suggested feature requests and **most importantly** build a **WebGPU/ONNX/WASM UI** that will be free to use for all.
|
|
86
107
|
|
|
87
108
|
> See the **[Roadmap](https://drumscript.github.io/DrumScript/guide/roadmap.html)** for what's planned.
|
|
88
109
|
|
|
89
|
-
**What it looks like**
|
|
110
|
+
#### **What it looks like**
|
|
90
111
|
|
|
91
|
-
<!-- TODO: Replace with a GIF showing terminal output
|
|
112
|
+
<!-- TODO: Replace with a GIF showing terminal output-->
|
|
92
113
|
<!-- For now, this shows the PDF transcription output -->
|
|
93
114
|
|
|
94
115
|
*Input: audio recording → Output: drum notation (PDF).
|
|
95
116
|
|
|
96
|
-
|
|
117
|
+
**Example 1: Simple groove**
|
|
97
118
|
|
|
98
|
-
|
|
119
|
+

|
|
99
120
|
|
|
100
|
-
- **
|
|
101
|
-
- **[Installation](#installation)**
|
|
102
|
-
- **[Quick Start](#quick-start)**
|
|
103
|
-
- **[CLI Usage](#cli-usage)**
|
|
104
|
-
- **[Contributing](#contributing)**
|
|
105
|
-
- **[FAQs](#faqs)**
|
|
106
|
-
- **[Similar projects](#similar-projects)**
|
|
121
|
+
**Example 2: A well-known Sabbath song**
|
|
107
122
|
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
- **Automatic Drum Transcription:** Detects kicks, snares, hi-hats, toms, and cymbals using a deterministic, rule-based classification engine — no machine learning required.
|
|
113
|
-
- **Tempo Detection:** Automatically estimates BPM using a voting-system algorithm tuned for percussive audio.
|
|
114
|
-
- **Onset Detection:** Onset detection method tuned to the physics of percussion audio rather than polyphonic instruments (piano, guitar, etc.).
|
|
115
|
-
- **Stem Separation:** Uses the state-of-the-art [Demucs](https://github.com/adefossez/demucs) source separation model to isolate drums, bass, vocals, and other instruments from a full mix.
|
|
116
|
-
- **Backing Track Generator:** Automatically remove the drums from any `.mp3` or `.wav` to create a drumless play-along track. Bass-only and vocal-only extraction also supported.
|
|
117
|
-
- **Multiple Output Formats:** Export transcriptions to PDF sheet music, MIDI (`.mid`), and MusicXML (`.xml`) for import into DAWs and notation software (Logic Pro, Cubase, Ableton, MuseScore, Sibelius, etc.).
|
|
118
|
-
- **Deterministic Classification:** DrumScript's core classification engine uses physics-based rules derived from acoustic analysis of real drum samples, not probabilistic AI/ML models.
|
|
119
|
-
|
|
120
|
-
> **Note:** Some dependencies used by DrumScript (e.g. [Demucs](https://github.com/adefossez/demucs), [librosa](https://librosa.org/)) may internally use probabilistic methods. DrumScript's own classification engine is fully deterministic.
|
|
123
|
+

|
|
124
|
+

|
|
125
|
+

|
|
121
126
|
|
|
122
127
|
---
|
|
123
128
|
|
|
129
|
+
|
|
124
130
|
## Project Structure
|
|
131
|
+
*[back](#drumscript)*
|
|
125
132
|
|
|
126
133
|
See [`repository_structure.md`](repository_structure.md) for the full project layout.
|
|
127
134
|
|
|
128
135
|
```
|
|
129
136
|
DrumScript/
|
|
137
|
+
├── benchmarks/ # mir_eval scripts for benchmarking DrumScript
|
|
130
138
|
├── drumscript/ # Main source package
|
|
131
139
|
│ ├── __init__.py # Public API (transcribe, load_audio, etc.)
|
|
132
140
|
│ ├── main.py # CLI entry point
|
|
133
141
|
│ ├── audio_processor/ # Audio loading, DSP, stem splitting
|
|
134
142
|
│ ├── drum_classifier/ # Rule-based classification engine
|
|
135
143
|
│ ├── notation_generator/ # Score building, PDF/MIDI/XML export
|
|
144
|
+
│ ├── datasets/ # Benchmark dataset adapters (IDMT, etc.)
|
|
136
145
|
│ └── utils/ # Helpers (ffmpeg installer, research scripts)
|
|
146
|
+
├── benchmarks/ # Evaluation runners (see benchmarks/README.md)
|
|
137
147
|
├── docs/ # Sphinx documentation
|
|
138
|
-
├── tests/ # pytest test suite
|
|
148
|
+
├── tests/ # pytest test suite (138 unit + 23 integration)
|
|
139
149
|
├── .github/workflows/ # CI/CD (tests, build, publish, docs)
|
|
140
150
|
├── pyproject.toml # Package metadata and dependencies
|
|
141
151
|
└── uv.lock # Pinned dependency versions
|
|
142
152
|
```
|
|
143
153
|
|
|
154
|
+
---
|
|
155
|
+
|
|
156
|
+
## Features
|
|
157
|
+
*[back](#drumscript)*
|
|
158
|
+
|
|
159
|
+
- **Automatic Drum Transcription:** Detects kicks, snares, hi-hats, toms, and cymbals using a deterministic, rule-based classification engine — no machine learning required.
|
|
160
|
+
- **Tempo Detection:** Automatically estimates BPM using a voting-system algorithm tuned for percussive audio.
|
|
161
|
+
- **Onset Detection:** Onset detection method tuned to the physics of percussion audio rather than polyphonic instruments (piano, guitar, etc.).
|
|
162
|
+
- **Stem Separation:** Uses the state-of-the-art [Demucs](https://github.com/adefossez/demucs) source separation model to isolate drums, bass, vocals, and other instruments from a full mix.
|
|
163
|
+
- **Backing Track Generator:** Automatically remove the drums from any `.mp3` or `.wav` to create a drumless play-along track. Bass-only and vocal-only extraction also supported.
|
|
164
|
+
- **Multiple Output Formats:** Export transcriptions to PDF sheet music, MIDI (`.mid`), and MusicXML (`.xml`) for import into DAWs and notation software (Logic Pro, Cubase, Ableton, MuseScore, Sibelius, etc.).
|
|
165
|
+
- **Deterministic Classification:** DrumScript's core classification engine uses physics-based rules derived from acoustic analysis of real drum samples, not probabilistic AI/ML models.
|
|
166
|
+
|
|
167
|
+
> **Note:** Some dependencies used by DrumScript (e.g. [Demucs](https://github.com/adefossez/demucs), [librosa](https://librosa.org/)) may internally use probabilistic methods. DrumScript's own classification engine is fully deterministic.
|
|
168
|
+
|
|
169
|
+
---
|
|
170
|
+
|
|
171
|
+
|
|
144
172
|
|
|
145
173
|
## Installation
|
|
174
|
+
*[back](#drumscript)*
|
|
146
175
|
|
|
147
176
|
**For users:**
|
|
148
177
|
|
|
149
|
-
```
|
|
178
|
+
```zsh
|
|
150
179
|
pip install drumscript
|
|
151
180
|
```
|
|
152
181
|
|
|
153
182
|
**For developers:**
|
|
154
183
|
|
|
155
|
-
```
|
|
184
|
+
```zsh
|
|
156
185
|
git clone https://github.com/DrumScript/DrumScript.git
|
|
157
186
|
cd DrumScript
|
|
158
187
|
uv sync # this will create a .venv
|
|
@@ -175,35 +204,55 @@ DrumScript manages all dependencies via [`pyproject.toml`](pyproject.toml) using
|
|
|
175
204
|
- Ubuntu/Debian: `sudo apt-get install libportaudio2`
|
|
176
205
|
- Windows: Usually bundled with the `sounddevice` wheel.
|
|
177
206
|
|
|
207
|
+
- **git-lfs** is **only** required if you want to run the documentation notebooks locally or rebuild the docs site. Some example audio files in `docs/guide/interactive/audio/` are tracked via Git LFS to keep the main repo lightweight. `pip install drumscript` and ordinary use of the package do **not** need it. If you skip this step, `git clone` will still succeed — you'll just get small LFS pointer files in place of the example audio.
|
|
208
|
+
- macOS: `brew install git-lfs`
|
|
209
|
+
- Ubuntu/Debian: `sudo apt-get install git-lfs`
|
|
210
|
+
- Windows: [Download from git-lfs.com](https://git-lfs.com/) or install via `winget install GitHub.GitLFS`.
|
|
211
|
+
- After installing, run `git lfs install` once, then `git lfs pull` inside the cloned repo to fetch the audio.
|
|
212
|
+
|
|
178
213
|
---
|
|
179
214
|
|
|
180
215
|
## Quick Start
|
|
216
|
+
*[back](#drumscript)*
|
|
217
|
+
|
|
218
|
+
> Please note: DrumScript assumes you are providing **drum audio-only inputs by default**
|
|
219
|
+
|
|
220
|
+
> If you are using transcription with full song use the `full_song=True` flag, ie
|
|
181
221
|
|
|
182
222
|
### End-to-end transcription
|
|
183
223
|
|
|
184
224
|
```python
|
|
185
225
|
import drumscript as ds
|
|
186
226
|
|
|
187
|
-
# Transcribe an isolated drum stem → PDF
|
|
188
|
-
|
|
227
|
+
# Transcribe an isolated drum stem → PDF + JSON + MIDI
|
|
228
|
+
result = ds.transcribe("drum_audio.wav")
|
|
229
|
+
print(result["pdf_path"]) # PDF sheet music
|
|
230
|
+
print(result["json_path"]) # raw transcription data (JSON)
|
|
231
|
+
print(result["midi_path"]) # MIDI file for DAW import
|
|
189
232
|
|
|
190
233
|
# Transcribe a full song (separates drums automatically)
|
|
191
|
-
|
|
234
|
+
result = ds.transcribe("full_song.mp3") # drum only audio
|
|
235
|
+
result = ds.transcribe("full_song.mp3", full_song=True) # full song, tells DrumScript to extract the drums first and then transcribe
|
|
192
236
|
|
|
193
|
-
# Get all intermediate results
|
|
194
|
-
result = ds.transcribe("drum_audio.wav",
|
|
237
|
+
# Get all intermediate results (tempo, onsets, events, etc.)
|
|
238
|
+
result = ds.transcribe("drum_audio.wav", verbose=True)
|
|
195
239
|
print(f"Tempo: {result['tempo']:.1f} BPM")
|
|
196
240
|
print(f"Events: {len(result['events'])}")
|
|
241
|
+
print(f"PDF: {result['pdf_path']}")
|
|
242
|
+
print(f"MIDI: {result['midi_path']}")
|
|
197
243
|
```
|
|
198
244
|
|
|
245
|
+
> **Note (v0.2.0):** `transcribe()` now returns a dict with `pdf_path`, `json_path`, and `midi_path` keys. Using the return value as a plain string (e.g. `pdf = ds.transcribe(...)`) still works but is deprecated and will be removed in v1.0.0. Use `result["pdf_path"]` instead.
|
|
246
|
+
|
|
199
247
|
### Load and explore audio
|
|
200
248
|
|
|
201
249
|
```python
|
|
202
250
|
import drumscript as ds
|
|
203
251
|
|
|
204
252
|
# Load at native sample rate (for notebooks / exploration)
|
|
205
|
-
|
|
206
|
-
print(f"Sample rate: {sr} Hz, Duration: {len(audio)/sr:.1f}s")
|
|
253
|
+
audio, sr = ds.load_audio("drum_audio.wav")
|
|
254
|
+
# print(f"Sample rate: {sr} Hz, Duration: {len(audio)/sr:.1f}s")
|
|
255
|
+
print(f"Sample rate: {audio_file[1]} Hz, Duration: {len(audio_file[0])/audio_file[1]:.1f}s")
|
|
207
256
|
|
|
208
257
|
# Detect tempo
|
|
209
258
|
bpm = ds.detect_tempo("drum_audio.wav")
|
|
@@ -215,50 +264,60 @@ print(f"Tempo: {bpm:.1f} BPM")
|
|
|
215
264
|
```python
|
|
216
265
|
import drumscript as ds
|
|
217
266
|
|
|
218
|
-
# Extract just the drum stem
|
|
219
|
-
|
|
267
|
+
# Extract just the drum stem from full polyphonic audio (let's call it "full_song.wav")
|
|
268
|
+
# Not to be confused with "full_song" flag used in transcribe(), which is for when you want to extract stems before transcribing
|
|
269
|
+
stem_split = ds.extract_stems("full_song.wav")
|
|
270
|
+
|
|
271
|
+
```
|
|
272
|
+
|
|
273
|
+
### Create drumless backing track to your favourite songs
|
|
220
274
|
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
|
|
275
|
+
```python
|
|
276
|
+
import drumscript as ds
|
|
277
|
+
|
|
278
|
+
# Remember to use mp3 flag if using mp3 audio
|
|
279
|
+
# default input format is .wav
|
|
280
|
+
|
|
281
|
+
remove_drums = ds.extract_stems("full_song.wav",
|
|
224
282
|
drumless=True,
|
|
225
|
-
|
|
226
|
-
full=True,
|
|
283
|
+
verbose=True,
|
|
227
284
|
)
|
|
228
|
-
print(f"
|
|
285
|
+
print(f"Files written to: {remove_drums['output_directory']}")
|
|
286
|
+
# The backing track is saved as <input>_no_drums.wav in that directory.
|
|
229
287
|
```
|
|
230
288
|
|
|
231
289
|
---
|
|
232
290
|
|
|
233
291
|
## CLI Usage
|
|
292
|
+
*[back](#drumscript)*
|
|
234
293
|
|
|
235
294
|
DrumScript also provides a command-line interface.
|
|
236
295
|
|
|
237
296
|
### Basic transcription (isolated drum stem)
|
|
238
297
|
|
|
239
|
-
```
|
|
298
|
+
```zsh
|
|
240
299
|
drumscript drum_audio.wav
|
|
241
300
|
```
|
|
242
301
|
|
|
243
302
|
### Full song transcription (auto-separates drums)
|
|
244
303
|
|
|
245
|
-
```
|
|
246
|
-
drumscript full_song.mp3 --full
|
|
304
|
+
```zsh
|
|
305
|
+
drumscript full_song.mp3 --full-song
|
|
247
306
|
```
|
|
248
307
|
|
|
249
308
|
### Extract a drumless backing track
|
|
250
309
|
|
|
251
|
-
```
|
|
310
|
+
```zsh
|
|
252
311
|
drumscript full_song.mp3 --drumless
|
|
253
312
|
```
|
|
254
313
|
|
|
255
314
|
### All options
|
|
256
315
|
|
|
257
|
-
```
|
|
316
|
+
```zsh
|
|
258
317
|
drumscript <audio_file> [OPTIONS]
|
|
259
318
|
|
|
260
319
|
Options:
|
|
261
|
-
--full
|
|
320
|
+
--full-song Transcribe a full song (isolates drums first via Demucs)
|
|
262
321
|
--drumless Extract a drumless backing track
|
|
263
322
|
--mute STEM Mute a specific stem (e.g. --mute bass). Repeatable.
|
|
264
323
|
--all-stems Export all individual stems (drums, bass, vocals, other)
|
|
@@ -269,7 +328,7 @@ Options:
|
|
|
269
328
|
|
|
270
329
|
### Examples
|
|
271
330
|
|
|
272
|
-
```
|
|
331
|
+
```zsh
|
|
273
332
|
# Transcribe with 6/8 time signature
|
|
274
333
|
drumscript drum_audio.wav --ts 6/8
|
|
275
334
|
|
|
@@ -279,11 +338,13 @@ drumscript full_song.mp3 --all-stems --format mp3
|
|
|
279
338
|
# Classify rudiments
|
|
280
339
|
drumscript snare_hit.wav --rudiment
|
|
281
340
|
```
|
|
341
|
+
|
|
282
342
|
---
|
|
283
343
|
|
|
284
344
|
## Contributing
|
|
345
|
+
*[back](#drumscript)*
|
|
285
346
|
|
|
286
|
-
We welcome contributions! DrumScript is intended to be a community-owned project.
|
|
347
|
+
We welcome contributions! DrumScript is intended to be a community-owned project. You can also refer to detailed contributor guidance **[here](./docs/development/contributor_guidance.md)**
|
|
287
348
|
|
|
288
349
|
- **[Open an Issue](https://github.com/DrumScript/DrumScript/issues/new)** for bugs or feature requests.
|
|
289
350
|
- **[Submit a Pull Request](https://github.com/DrumScript/DrumScript/pulls)** for code changes.
|
|
@@ -293,8 +354,8 @@ We welcome contributions! DrumScript is intended to be a community-owned project
|
|
|
293
354
|
|
|
294
355
|
**[hello.drumscript@gmail.com](mailto:hello.drumscript@gmail.com)**
|
|
295
356
|
|
|
296
|
-
## Alpha Priorities (v0.
|
|
297
|
-
The alpha phase
|
|
357
|
+
## Alpha Priorities (v0.0.4 < v1.0.0)
|
|
358
|
+
The alpha phase began June 2026. We expect it to run through late 2026 and into 2027 — beta is targeted on API stability and benchmark validation rather than a fixed calendar date.
|
|
298
359
|
|
|
299
360
|
**What works today:**
|
|
300
361
|
|
|
@@ -312,10 +373,65 @@ The alpha phase runs between 01 June and 31 August 2026
|
|
|
312
373
|
- Stabilising the public API ahead of the beta freeze
|
|
313
374
|
- Community feedback collection
|
|
314
375
|
|
|
376
|
+
---
|
|
377
|
+
|
|
378
|
+
### Publishing a new release
|
|
379
|
+
*[back](#drumscript)*
|
|
380
|
+
|
|
381
|
+
We use an automated pipeline to publish new versions to PyPI. All releases must use a specific tag format: `vX.Y.Z` (for example, `v0.2.0`).
|
|
382
|
+
|
|
383
|
+
**To publish a release via GitHub Actions (Recommended):**
|
|
384
|
+
1. Go to the **Actions** tab in this repository.
|
|
385
|
+
2. Click on **Create Release** on the left menu.
|
|
386
|
+
3. Click **Run workflow** on the right.
|
|
387
|
+
4. Type in your new version number (e.g., `0.2.0`) and click **Run workflow**. GitHub will handle the rest!
|
|
388
|
+
|
|
389
|
+
---
|
|
390
|
+
|
|
391
|
+
## Testing
|
|
392
|
+
*[back](#drumscript)*
|
|
393
|
+
|
|
394
|
+
For detailed instructions on testing and publishing via the command line, please see our **[Testing Guidance](tests/README.md).**
|
|
395
|
+
|
|
396
|
+
---
|
|
397
|
+
|
|
398
|
+
## Benchmarking
|
|
399
|
+
*[back](#drumscript)*
|
|
400
|
+
|
|
401
|
+
DrumScript includes a benchmarking framework for evaluating the classifier against standard ADT datasets using [`mir_eval`](https://github.com/mir-evaluation/mir_eval). Currently supports IDMT-SMT-Drums V2.
|
|
402
|
+
|
|
403
|
+
```zsh
|
|
404
|
+
# Install dev dependencies (includes mir_eval)
|
|
405
|
+
uv sync --extra dev
|
|
406
|
+
|
|
407
|
+
# Run the IDMT benchmark
|
|
408
|
+
uv run --extra dev python benchmarks/run.py idmt \
|
|
409
|
+
--root /path/to/IDMT-SMT-DRUMS-V2
|
|
410
|
+
|
|
411
|
+
# Run on a single subset with a limit
|
|
412
|
+
uv run --extra dev python benchmarks/run.py idmt \
|
|
413
|
+
--root /path/to/IDMT-SMT-DRUMS-V2 \
|
|
414
|
+
--subset RealDrum --limit 5
|
|
415
|
+
```
|
|
416
|
+
|
|
417
|
+
Results are archived to `outputs/benchmarks/idmt/` with per-file metrics, summary statistics, and git commit tracking for reproducibility. See [`benchmarks/README.md`](benchmarks/README.md) for dataset setup and full usage.
|
|
418
|
+
|
|
419
|
+
---
|
|
420
|
+
|
|
421
|
+
## Traffic
|
|
422
|
+
*[back](#drumscript)*
|
|
423
|
+
|
|
424
|
+
We collate usage over time for performance-monitoring. Live repository statistics — updated daily:
|
|
425
|
+
|
|
426
|
+
- [**View Report (PDF)**](https://github.com/DrumScript/DrumScript/blob/github-repo-stats/DrumScript/DrumScript/latest-report/report.pdf)
|
|
427
|
+
<!--- [**View Report (HTML)**](https://github.com/DrumScript/DrumScript/blob/github-repo-stats/DrumScript/DrumScript/latest-report/report.html)
|
|
428
|
+
|
|
429
|
+
> Views, clones, stars, forks, top referrers and popular paths. Data collected automatically via [github-repo-stats](https://github.com/jgehrcke/github-repo-stats). Defaults to last 14 days in outputs. Raw data available on **[github-repo-stats](https://github.com/DrumScript/DrumScript/tree/github-repo-stats/DrumScript/DrumScript/ghrs-data**) branch-->
|
|
315
430
|
|
|
316
431
|
---
|
|
317
432
|
|
|
318
433
|
## FAQs
|
|
434
|
+
*[back](#drumscript)*
|
|
319
435
|
|
|
320
436
|
### Why doesn't DrumScript include `ffmpeg` as a dependency?
|
|
321
437
|
|
|
@@ -336,28 +452,42 @@ DrumScript's own classification engine is **fully deterministic** — it uses ph
|
|
|
336
452
|
---
|
|
337
453
|
|
|
338
454
|
## Acknowledgements
|
|
455
|
+
*[back](#drumscript)*
|
|
339
456
|
|
|
340
457
|
1. **[Demucs](https://github.com/adefossez/demucs)** — The stem splitting functionality is built upon the work of [@adefossez](https://github.com/adefossez).
|
|
341
458
|
2. **[librosa](https://librosa.org/)** — For foundational audio processing tools.
|
|
459
|
+
3. **[@nanaoto](https://github.com/nanaoto)** — For building the `mir_eval` benchmarking infrastructure and IDMT-SMT-Drums V2 adapter (PR [#273](https://github.com/DrumScript/DrumScript/pull/273)).
|
|
460
|
+
|
|
461
|
+
|
|
342
462
|
|
|
343
463
|
---
|
|
464
|
+
## Similar Projects
|
|
344
465
|
|
|
345
|
-
|
|
466
|
+
*[back](#drumscript)*
|
|
346
467
|
|
|
347
|
-
|
|
468
|
+
DrumScript has no affiliation with any of the projects below. They are listed for context and reference.
|
|
469
|
+
|
|
470
|
+
* **[librosa](https://librosa.org/)** — The spectral analysis library that powers DrumScript's onset detection and feature extraction.
|
|
471
|
+
* **[Demucs](https://github.com/adefossez/demucs)** — The stem separation model we use for isolating drums from full mixes.
|
|
472
|
+
* **[tepreece/drumscript (Golang)](https://github.com/tepreece/drumscript)** — A `(Go)lang` MIDI drum pattern scripting language by Tom Preece. Different use case (composing drum patterns via script), different technology (MIDI output rather than audio transcription). If you're looking to *write* drum patterns programmatically, check it out. Maintained by [@tepreece](https://github.com/tepreece)
|
|
473
|
+
* **[basic-pitch](https://github.com/spotify/basic-pitch)** — A lightweight yet powerful audio-to-MIDI converter with pitch bend detection (better for non-percussive audio). Maintained by Spotify.
|
|
474
|
+
* **[mir_eval](https://github.com/mir-evaluation/mir_eval)** — Standard evaluation metrics for music information retrieval tasks.
|
|
475
|
+
* **[onset_db](https://github.com/CPJKU/onset_db)** - Provides a dataset of annotated musical onsets for tuning and evaluating audio detection algorithms. Maintained by JKU Linz.
|
|
348
476
|
|
|
349
477
|
---
|
|
350
|
-
## Similar Projects
|
|
351
478
|
|
|
352
|
-
|
|
479
|
+
## License
|
|
480
|
+
*[back](#drumscript)*
|
|
481
|
+
|
|
482
|
+
**[Apache License 2.0](LICENSE)**
|
|
483
|
+
|
|
484
|
+
**Copyright 2026 DrumScript**
|
|
353
485
|
|
|
354
|
-
|
|
355
|
-
|
|
356
|
-
|
|
357
|
-
**[basic-pitch][**https://github.com/spotify/basic-pitch]** - A lightweight yet powerful audio-to-MIDI converter with pitch bend detection (better for non-percussive audio)
|
|
358
|
-
**[mir_eval](https://github.com/mir-evaluation/mir_eval)** — Standard evaluation metrics for music information retrieval tasks.
|
|
359
|
-
**[onset_db](https://github.com/CPJKU/onset_db)** - Provides a dataset of annotated musical onsets for tuning and evaluating audio detection algorithms. Maintained by JKU Linz.
|
|
486
|
+
Apache License
|
|
487
|
+
Version 2.0, January 2004
|
|
488
|
+
http://www.apache.org/licenses/
|
|
360
489
|
|
|
361
490
|
---
|
|
362
491
|
|
|
492
|
+
|
|
363
493
|
<!--END-->
|