drumscript 0.1.6__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.6 → drumscript-0.2.0}/MANIFEST.in +1 -7
  2. {drumscript-0.1.6/DrumScript.egg-info → drumscript-0.2.0}/PKG-INFO +161 -77
  3. {drumscript-0.1.6 → drumscript-0.2.0}/README.md +159 -77
  4. {drumscript-0.1.6 → drumscript-0.2.0}/drumscript/__init__.py +91 -17
  5. drumscript-0.2.0/drumscript/main.py +435 -0
  6. {drumscript-0.1.6 → drumscript-0.2.0}/drumscript/notation_generator/score_builder.py +27 -1
  7. {drumscript-0.1.6 → drumscript-0.2.0/drumscript.egg-info}/PKG-INFO +161 -77
  8. {drumscript-0.1.6/DrumScript.egg-info → drumscript-0.2.0/drumscript.egg-info}/SOURCES.txt +0 -6
  9. drumscript-0.2.0/drumscript.egg-info/entry_points.txt +2 -0
  10. {drumscript-0.1.6/DrumScript.egg-info → drumscript-0.2.0/drumscript.egg-info}/requires.txt +2 -0
  11. {drumscript-0.1.6 → drumscript-0.2.0}/pyproject.toml +12 -10
  12. drumscript-0.1.6/DrumScript.egg-info/entry_points.txt +0 -2
  13. drumscript-0.1.6/drumscript/main.py +0 -307
  14. {drumscript-0.1.6 → drumscript-0.2.0}/LICENSE +0 -0
  15. {drumscript-0.1.6 → drumscript-0.2.0}/drumscript/audio_processor/__init__.py +0 -0
  16. {drumscript-0.1.6 → drumscript-0.2.0}/drumscript/audio_processor/audio_loader.py +0 -0
  17. {drumscript-0.1.6 → drumscript-0.2.0}/drumscript/audio_processor/feature_extractor.py +0 -0
  18. {drumscript-0.1.6 → drumscript-0.2.0}/drumscript/audio_processor/onset_detector.py +0 -0
  19. {drumscript-0.1.6 → drumscript-0.2.0}/drumscript/audio_processor/stem_splitter.py +0 -0
  20. {drumscript-0.1.6 → drumscript-0.2.0}/drumscript/audio_processor/tempo_detector.py +0 -0
  21. {drumscript-0.1.6 → drumscript-0.2.0}/drumscript/audio_processor/tempogram.py +0 -0
  22. {drumscript-0.1.6 → drumscript-0.2.0}/drumscript/datasets/__init__.py +0 -0
  23. {drumscript-0.1.6 → drumscript-0.2.0}/drumscript/datasets/base.py +0 -0
  24. {drumscript-0.1.6 → drumscript-0.2.0}/drumscript/datasets/idmt.py +0 -0
  25. {drumscript-0.1.6 → drumscript-0.2.0}/drumscript/drum_classifier/__init__.py +0 -0
  26. {drumscript-0.1.6 → drumscript-0.2.0}/drumscript/drum_classifier/classify.py +0 -0
  27. {drumscript-0.1.6 → drumscript-0.2.0}/drumscript/notation_generator/__init__.py +0 -0
  28. {drumscript-0.1.6 → drumscript-0.2.0}/drumscript/notation_generator/constants.py +0 -0
  29. {drumscript-0.1.6 → drumscript-0.2.0}/drumscript/notation_generator/helpers.py +0 -0
  30. {drumscript-0.1.6 → drumscript-0.2.0}/drumscript/notation_generator/midi_exporter.py +0 -0
  31. {drumscript-0.1.6 → drumscript-0.2.0}/drumscript/notation_generator/pdf_exporter.py +0 -0
  32. {drumscript-0.1.6 → drumscript-0.2.0}/drumscript/notation_generator/xml_exporter.py +0 -0
  33. {drumscript-0.1.6 → drumscript-0.2.0}/drumscript/utils/__init__.py +0 -0
  34. {drumscript-0.1.6 → drumscript-0.2.0}/drumscript/utils/ffmpeg_installer.py +0 -0
  35. {drumscript-0.1.6/DrumScript.egg-info → drumscript-0.2.0/drumscript.egg-info}/dependency_links.txt +0 -0
  36. {drumscript-0.1.6/DrumScript.egg-info → drumscript-0.2.0/drumscript.egg-info}/top_level.txt +0 -0
  37. {drumscript-0.1.6 → 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.6
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
@@ -57,28 +57,48 @@ Requires-Dist: shibuya>=2025.10.21; extra == "dev"
57
57
  Requires-Dist: ipywidgets>=8.1.8; extra == "dev"
58
58
  Requires-Dist: requests>=2.32.5; extra == "dev"
59
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"
60
62
  Dynamic: license-file
61
63
 
62
64
  # **`DrumScript`**
63
65
 
64
66
  <!--date_created: sun-15-june-2025-->
65
- <!--date_edited: thurs-18-june-2026--->
67
+ <!--date_edited: weds-19-august-2026--->
66
68
 
67
- **Workflow Status**
68
-
69
- [![Run Tests](https://github.com/DrumScript/DrumScript/actions/workflows/tests.yml/badge.svg?branch=main)](https://github.com/DrumScript/DrumScript/actions/workflows/tests.yml)
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.
70
70
 
71
- **Demo Notebooks**
71
+ > **Python >=3.9**
72
72
 
73
- [![Try DrumScript in Colab](https://colab.research.google.com/assets/colab-badge.svg)](https://colab.research.google.com/github/DrumScript/DrumScript/blob/main/docs/guide/interactive/drumscript_interactive_notebook.ipynb)
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>
74
82
 
75
- **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.
76
83
 
77
- > **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)**
78
98
 
79
- > **[Documentation](https://drumscript.github.io/DrumScript/)**
99
+ ---
80
100
 
81
- **Public Alpha (v0.1.4+) — June to August 2026**
101
+ #### **Public Alpha (v0.1.4+) — ongoing since June 2026**
82
102
 
83
103
  - We're looking for early adopters and feedback
84
104
  - [Feedback on the classification model](https://github.com/DrumScript/DrumScript/issues), and help shape v1.0.0.
@@ -87,7 +107,7 @@ Dynamic: license-file
87
107
 
88
108
  > See the **[Roadmap](https://drumscript.github.io/DrumScript/guide/roadmap.html)** for what's planned.
89
109
 
90
- **What it looks like**
110
+ #### **What it looks like**
91
111
 
92
112
  <!-- TODO: Replace with a GIF showing terminal output-->
93
113
  <!-- For now, this shows the PDF transcription output -->
@@ -106,36 +126,15 @@ Dynamic: license-file
106
126
 
107
127
  ---
108
128
 
109
- - **[Features](#features)**
110
- - **[Installation](#installation)**
111
- - **[Quick Start](#quick-start)**
112
- - **[CLI Usage](#cli-usage)**
113
- - **[Contributing](#contributing)**
114
- - **[FAQs](#faqs)**
115
- - **[Similar projects](#similar-projects)**
116
-
117
- ---
118
-
119
- ## Features
120
-
121
- - **Automatic Drum Transcription:** Detects kicks, snares, hi-hats, toms, and cymbals using a deterministic, rule-based classification engine — no machine learning required.
122
- - **Tempo Detection:** Automatically estimates BPM using a voting-system algorithm tuned for percussive audio.
123
- - **Onset Detection:** Onset detection method tuned to the physics of percussion audio rather than polyphonic instruments (piano, guitar, etc.).
124
- - **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.
125
- - **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.
126
- - **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.).
127
- - **Deterministic Classification:** DrumScript's core classification engine uses physics-based rules derived from acoustic analysis of real drum samples, not probabilistic AI/ML models.
128
-
129
- > **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.
130
-
131
- ---
132
129
 
133
130
  ## Project Structure
131
+ *[back](#drumscript)*
134
132
 
135
133
  See [`repository_structure.md`](repository_structure.md) for the full project layout.
136
134
 
137
135
  ```
138
136
  DrumScript/
137
+ ├── benchmarks/ # mir_eval scripts for benchmarking DrumScript
139
138
  ├── drumscript/ # Main source package
140
139
  │ ├── __init__.py # Public API (transcribe, load_audio, etc.)
141
140
  │ ├── main.py # CLI entry point
@@ -146,14 +145,33 @@ DrumScript/
146
145
  │ └── utils/ # Helpers (ffmpeg installer, research scripts)
147
146
  ├── benchmarks/ # Evaluation runners (see benchmarks/README.md)
148
147
  ├── docs/ # Sphinx documentation
149
- ├── tests/ # pytest test suite (131 unit + 8 integration)
148
+ ├── tests/ # pytest test suite (138 unit + 23 integration)
150
149
  ├── .github/workflows/ # CI/CD (tests, build, publish, docs)
151
150
  ├── pyproject.toml # Package metadata and dependencies
152
151
  └── uv.lock # Pinned dependency versions
153
152
  ```
154
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
+
155
172
 
156
173
  ## Installation
174
+ *[back](#drumscript)*
157
175
 
158
176
  **For users:**
159
177
 
@@ -195,6 +213,7 @@ DrumScript manages all dependencies via [`pyproject.toml`](pyproject.toml) using
195
213
  ---
196
214
 
197
215
  ## Quick Start
216
+ *[back](#drumscript)*
198
217
 
199
218
  > Please note: DrumScript assumes you are providing **drum audio-only inputs by default**
200
219
 
@@ -205,27 +224,35 @@ DrumScript manages all dependencies via [`pyproject.toml`](pyproject.toml) using
205
224
  ```python
206
225
  import drumscript as ds
207
226
 
208
- # Transcribe an isolated drum stem → PDF
209
- 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
210
232
 
211
233
  # Transcribe a full song (separates drums automatically)
212
- pdf_path = ds.transcribe("full_song.mp3") # drum only audio
213
- pdf_path = ds.transcribe("full_song.mp3", full_song=True) # full song, tells DrumScript to extract the drums first and then transcribe
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
214
236
 
215
- # Get all intermediate results
237
+ # Get all intermediate results (tempo, onsets, events, etc.)
216
238
  result = ds.transcribe("drum_audio.wav", verbose=True)
217
239
  print(f"Tempo: {result['tempo']:.1f} BPM")
218
240
  print(f"Events: {len(result['events'])}")
241
+ print(f"PDF: {result['pdf_path']}")
242
+ print(f"MIDI: {result['midi_path']}")
219
243
  ```
220
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
+
221
247
  ### Load and explore audio
222
248
 
223
249
  ```python
224
250
  import drumscript as ds
225
251
 
226
252
  # Load at native sample rate (for notebooks / exploration)
227
- audio_file = ds.load_audio("drum_audio.wav")
228
- 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")
229
256
 
230
257
  # Detect tempo
231
258
  bpm = ds.detect_tempo("drum_audio.wav")
@@ -237,45 +264,32 @@ print(f"Tempo: {bpm:.1f} BPM")
237
264
  ```python
238
265
  import drumscript as ds
239
266
 
240
- # Extract just the drum stem
241
- 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")
242
270
 
243
- # Create a drumless backing track in MP3
244
- results = ds.extract_stems(
245
- "full_song.mp3",
246
- drumless=True,
247
- output_format="mp3",
248
- verbose=True,
249
- )
250
- print(f"Backing track: {results['mix']}")
251
271
  ```
252
272
 
253
- ---
254
-
255
- ## Benchmarking
256
-
257
- 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.
273
+ ### Create drumless backing track to your favourite songs
258
274
 
259
- ```zsh
260
- # Install dev dependencies (includes mir_eval)
261
- uv sync --extra dev
275
+ ```python
276
+ import drumscript as ds
262
277
 
263
- # Run the IDMT benchmark
264
- uv run --extra dev python benchmarks/run.py idmt \
265
- --root /path/to/IDMT-SMT-DRUMS-V2
278
+ # Remember to use mp3 flag if using mp3 audio
279
+ # default input format is .wav
266
280
 
267
- # Run on a single subset with a limit
268
- uv run --extra dev python benchmarks/run.py idmt \
269
- --root /path/to/IDMT-SMT-DRUMS-V2 \
270
- --subset RealDrum --limit 5
281
+ remove_drums = ds.extract_stems("full_song.wav",
282
+ drumless=True,
283
+ verbose=True,
284
+ )
285
+ print(f"Files written to: {remove_drums['output_directory']}")
286
+ # The backing track is saved as <input>_no_drums.wav in that directory.
271
287
  ```
272
288
 
273
- 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.
274
-
275
-
276
289
  ---
277
290
 
278
291
  ## CLI Usage
292
+ *[back](#drumscript)*
279
293
 
280
294
  DrumScript also provides a command-line interface.
281
295
 
@@ -324,11 +338,13 @@ drumscript full_song.mp3 --all-stems --format mp3
324
338
  # Classify rudiments
325
339
  drumscript snare_hit.wav --rudiment
326
340
  ```
341
+
327
342
  ---
328
343
 
329
344
  ## Contributing
345
+ *[back](#drumscript)*
330
346
 
331
- 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)**
332
348
 
333
349
  - **[Open an Issue](https://github.com/DrumScript/DrumScript/issues/new)** for bugs or feature requests.
334
350
  - **[Submit a Pull Request](https://github.com/DrumScript/DrumScript/pulls)** for code changes.
@@ -339,7 +355,7 @@ We welcome contributions! DrumScript is intended to be a community-owned project
339
355
  **[hello.drumscript@gmail.com](mailto:hello.drumscript@gmail.com)**
340
356
 
341
357
  ## Alpha Priorities (v0.0.4 < v1.0.0)
342
- The alpha phase runs between 01 June and 31 August 2026
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.
343
359
 
344
360
  **What works today:**
345
361
 
@@ -357,10 +373,65 @@ The alpha phase runs between 01 June and 31 August 2026
357
373
  - Stabilising the public API ahead of the beta freeze
358
374
  - Community feedback collection
359
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-->
360
430
 
361
431
  ---
362
432
 
363
433
  ## FAQs
434
+ *[back](#drumscript)*
364
435
 
365
436
  ### Why doesn't DrumScript include `ffmpeg` as a dependency?
366
437
 
@@ -381,20 +452,19 @@ DrumScript's own classification engine is **fully deterministic** — it uses ph
381
452
  ---
382
453
 
383
454
  ## Acknowledgements
455
+ *[back](#drumscript)*
384
456
 
385
457
  1. **[Demucs](https://github.com/adefossez/demucs)** — The stem splitting functionality is built upon the work of [@adefossez](https://github.com/adefossez).
386
458
  2. **[librosa](https://librosa.org/)** — For foundational audio processing tools.
387
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)).
388
460
 
389
- ---
390
-
391
- ## License
392
461
 
393
- [Apache License 2.0](LICENSE)
394
462
 
395
463
  ---
396
464
  ## Similar Projects
397
465
 
466
+ *[back](#drumscript)*
467
+
398
468
  DrumScript has no affiliation with any of the projects below. They are listed for context and reference.
399
469
 
400
470
  * **[librosa](https://librosa.org/)** — The spectral analysis library that powers DrumScript's onset detection and feature extraction.
@@ -406,4 +476,18 @@ DrumScript has no affiliation with any of the projects below. They are listed fo
406
476
 
407
477
  ---
408
478
 
479
+ ## License
480
+ *[back](#drumscript)*
481
+
482
+ **[Apache License 2.0](LICENSE)**
483
+
484
+ **Copyright 2026 DrumScript**
485
+
486
+ Apache License
487
+ Version 2.0, January 2004
488
+ http://www.apache.org/licenses/
489
+
490
+ ---
491
+
492
+
409
493
  <!--END-->