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.
Files changed (37) hide show
  1. {drumscript-0.1.5 → drumscript-0.2.0}/MANIFEST.in +1 -7
  2. {drumscript-0.1.5/DrumScript.egg-info → drumscript-0.2.0}/PKG-INFO +204 -74
  3. {drumscript-0.1.5 → drumscript-0.2.0}/README.md +201 -74
  4. {drumscript-0.1.5 → drumscript-0.2.0}/drumscript/__init__.py +180 -29
  5. drumscript-0.2.0/drumscript/datasets/base.py +17 -0
  6. drumscript-0.2.0/drumscript/datasets/idmt.py +243 -0
  7. drumscript-0.2.0/drumscript/main.py +435 -0
  8. {drumscript-0.1.5 → drumscript-0.2.0}/drumscript/notation_generator/score_builder.py +27 -1
  9. drumscript-0.2.0/drumscript/utils/__init__.py +0 -0
  10. {drumscript-0.1.5 → drumscript-0.2.0/drumscript.egg-info}/PKG-INFO +204 -74
  11. {drumscript-0.1.5/DrumScript.egg-info → drumscript-0.2.0/drumscript.egg-info}/SOURCES.txt +3 -6
  12. drumscript-0.2.0/drumscript.egg-info/entry_points.txt +2 -0
  13. {drumscript-0.1.5/DrumScript.egg-info → drumscript-0.2.0/drumscript.egg-info}/requires.txt +3 -0
  14. {drumscript-0.1.5 → drumscript-0.2.0}/pyproject.toml +13 -10
  15. drumscript-0.1.5/DrumScript.egg-info/entry_points.txt +0 -2
  16. drumscript-0.1.5/drumscript/main.py +0 -297
  17. {drumscript-0.1.5 → drumscript-0.2.0}/LICENSE +0 -0
  18. {drumscript-0.1.5 → drumscript-0.2.0}/drumscript/audio_processor/__init__.py +0 -0
  19. {drumscript-0.1.5 → drumscript-0.2.0}/drumscript/audio_processor/audio_loader.py +0 -0
  20. {drumscript-0.1.5 → drumscript-0.2.0}/drumscript/audio_processor/feature_extractor.py +0 -0
  21. {drumscript-0.1.5 → drumscript-0.2.0}/drumscript/audio_processor/onset_detector.py +0 -0
  22. {drumscript-0.1.5 → drumscript-0.2.0}/drumscript/audio_processor/stem_splitter.py +0 -0
  23. {drumscript-0.1.5 → drumscript-0.2.0}/drumscript/audio_processor/tempo_detector.py +0 -0
  24. {drumscript-0.1.5 → drumscript-0.2.0}/drumscript/audio_processor/tempogram.py +0 -0
  25. {drumscript-0.1.5/drumscript/drum_classifier → drumscript-0.2.0/drumscript/datasets}/__init__.py +0 -0
  26. {drumscript-0.1.5/drumscript/notation_generator → drumscript-0.2.0/drumscript/drum_classifier}/__init__.py +0 -0
  27. {drumscript-0.1.5 → drumscript-0.2.0}/drumscript/drum_classifier/classify.py +0 -0
  28. {drumscript-0.1.5/drumscript/utils → drumscript-0.2.0/drumscript/notation_generator}/__init__.py +0 -0
  29. {drumscript-0.1.5 → drumscript-0.2.0}/drumscript/notation_generator/constants.py +0 -0
  30. {drumscript-0.1.5 → drumscript-0.2.0}/drumscript/notation_generator/helpers.py +0 -0
  31. {drumscript-0.1.5 → drumscript-0.2.0}/drumscript/notation_generator/midi_exporter.py +0 -0
  32. {drumscript-0.1.5 → drumscript-0.2.0}/drumscript/notation_generator/pdf_exporter.py +0 -0
  33. {drumscript-0.1.5 → drumscript-0.2.0}/drumscript/notation_generator/xml_exporter.py +0 -0
  34. {drumscript-0.1.5 → drumscript-0.2.0}/drumscript/utils/ffmpeg_installer.py +0 -0
  35. {drumscript-0.1.5/DrumScript.egg-info → drumscript-0.2.0/drumscript.egg-info}/dependency_links.txt +0 -0
  36. {drumscript-0.1.5/DrumScript.egg-info → drumscript-0.2.0/drumscript.egg-info}/top_level.txt +0 -0
  37. {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 terraform
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.1.5
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: sat-22-may-2026--->
67
+ <!--date_edited: weds-19-august-2026--->
65
68
 
66
- **Workflow Status**
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
- [![Run Tests](https://github.com/DrumScript/DrumScript/actions/workflows/tests.yml/badge.svg?branch=main)](https://github.com/DrumScript/DrumScript/actions/workflows/tests.yml)
71
+ > **Python >=3.9**
69
72
 
70
- **Demo Notebooks**
73
+ **Workflow Status**
74
+ >
75
+ [![Run Tests](https://github.com/DrumScript/DrumScript/actions/workflows/tests.yml/badge.svg?branch=main)](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
- [![Try DrumScript in Colab](https://colab.research.google.com/assets/colab-badge.svg)](https://colab.research.google.com/drive/1eDVXc3d6ezmorxINOjzldRPSC3emTl2I)
73
83
 
74
- **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.
75
-
76
- > **Python >=3.9**
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
- > **[Documentation](https://drumscript.github.io/DrumScript/)**
99
+ ---
79
100
 
80
- **Public Alpha (v0.1.4) — June to August 2026**
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 if you have one -->
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
- ![DrumScript transcription output](docs/_static/transcription.png)
117
+ **Example 1: Simple groove**
97
118
 
98
- ---
119
+ ![DrumScript transcription output](./docs/_static/test_wav.png)
99
120
 
100
- - **[Features](#features)**
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
- ## Features
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
+ ![DrumScript transcription output](./docs/_static/iron_man_1.png)
124
+ ![DrumScript transcription output](./docs/_static/iron_man_2.png)
125
+ ![DrumScript transcription output](./docs/_static/iron_man_3.png)
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
- ```bash
178
+ ```zsh
150
179
  pip install drumscript
151
180
  ```
152
181
 
153
182
  **For developers:**
154
183
 
155
- ```bash
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
- pdf_path = ds.transcribe("drum_audio.wav")
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
- pdf_path = ds.transcribe("full_song.mp3", full_song=True)
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", full=True)
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
- audio_file = ds.load_audio("drum_audio.wav")
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
- drum_path = ds.extract_stems("full_song.mp3")
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
- # Create a drumless backing track in MP3
222
- results = ds.extract_stems(
223
- "full_song.mp3",
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
- output_format="mp3",
226
- full=True,
283
+ verbose=True,
227
284
  )
228
- print(f"Backing track: {results['mix']}")
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
- ```bash
298
+ ```zsh
240
299
  drumscript drum_audio.wav
241
300
  ```
242
301
 
243
302
  ### Full song transcription (auto-separates drums)
244
303
 
245
- ```bash
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
- ```bash
310
+ ```zsh
252
311
  drumscript full_song.mp3 --drumless
253
312
  ```
254
313
 
255
314
  ### All options
256
315
 
257
- ```bash
316
+ ```zsh
258
317
  drumscript <audio_file> [OPTIONS]
259
318
 
260
319
  Options:
261
- --full Transcribe a full song (isolates drums first via Demucs)
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
- ```bash
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.1 v0.2)
297
- The alpha phase runs between 01 June and 31 August 2026
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
- ## License
466
+ *[back](#drumscript)*
346
467
 
347
- [Apache License 2.0](LICENSE)
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
- No affiliation as yet, however.
479
+ ## License
480
+ *[back](#drumscript)*
481
+
482
+ **[Apache License 2.0](LICENSE)**
483
+
484
+ **Copyright 2026 DrumScript**
353
485
 
354
- **[librosa](https://librosa.org/)** — The spectral analysis library that powers DrumScript's onset detection and feature extraction.
355
- **[Demucs](https://github.com/adefossez/demucs)** The stem separation model we use for isolating drums from full mixes.
356
- **[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)
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-->