danceflow-stemlab 1.0.0__py3-none-any.whl

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 (56) hide show
  1. danceflow_stemlab-1.0.0.dist-info/METADATA +347 -0
  2. danceflow_stemlab-1.0.0.dist-info/RECORD +56 -0
  3. danceflow_stemlab-1.0.0.dist-info/WHEEL +5 -0
  4. danceflow_stemlab-1.0.0.dist-info/entry_points.txt +2 -0
  5. danceflow_stemlab-1.0.0.dist-info/licenses/LICENSE +21 -0
  6. danceflow_stemlab-1.0.0.dist-info/top_level.txt +1 -0
  7. stemlab/__init__.py +10 -0
  8. stemlab/__main__.py +4 -0
  9. stemlab/analysis/__init__.py +5 -0
  10. stemlab/analysis/harmony.py +375 -0
  11. stemlab/analysis/lyrics.py +293 -0
  12. stemlab/analysis/registry.py +111 -0
  13. stemlab/analysis/rhythm.py +235 -0
  14. stemlab/analysis/runner.py +187 -0
  15. stemlab/analysis/semantic_audio.py +119 -0
  16. stemlab/analysis/semantic_text.py +117 -0
  17. stemlab/analysis/song_map.py +220 -0
  18. stemlab/analysis/sonic.py +192 -0
  19. stemlab/analysis/structure.py +104 -0
  20. stemlab/analysis/transcription.py +98 -0
  21. stemlab/audio.py +161 -0
  22. stemlab/beats/__init__.py +5 -0
  23. stemlab/beats/base.py +12 -0
  24. stemlab/beats/beatnet.py +103 -0
  25. stemlab/beats/beatthis.py +25 -0
  26. stemlab/beats/beattransformer.py +157 -0
  27. stemlab/beats/common.py +123 -0
  28. stemlab/bootstrap.py +133 -0
  29. stemlab/branding.py +57 -0
  30. stemlab/canonical.py +188 -0
  31. stemlab/cli.py +188 -0
  32. stemlab/manifest.py +35 -0
  33. stemlab/models.py +114 -0
  34. stemlab/pipeline.py +398 -0
  35. stemlab/separators/__init__.py +18 -0
  36. stemlab/separators/base.py +12 -0
  37. stemlab/separators/bsroformer.py +71 -0
  38. stemlab/separators/common.py +30 -0
  39. stemlab/separators/demucs.py +46 -0
  40. stemlab/separators/openunmix.py +46 -0
  41. stemlab/separators/scnet.py +57 -0
  42. stemlab/server.py +1162 -0
  43. stemlab/sonic_visualiser.py +1125 -0
  44. stemlab/spectrogram.py +92 -0
  45. stemlab/speech.py +109 -0
  46. stemlab/types.py +71 -0
  47. stemlab/util.py +62 -0
  48. stemlab/vamp.py +411 -0
  49. stemlab/vamp_runtime.py +253 -0
  50. stemlab/web/app.js +844 -0
  51. stemlab/web/arcadians-cover.jpg +0 -0
  52. stemlab/web/arcadians-reference.json +338 -0
  53. stemlab/web/canonical.js +423 -0
  54. stemlab/web/index.html +148 -0
  55. stemlab/web/style.css +272 -0
  56. stemlab/webui.py +409 -0
@@ -0,0 +1,347 @@
1
+ Metadata-Version: 2.4
2
+ Name: danceflow-stemlab
3
+ Version: 1.0.0
4
+ Summary: StemLab audio analysis for DanceFlow BPM and motion-response workflows, including WordPress DanceMoves
5
+ Author: Kieran Simkin
6
+ Maintainer: Kieran Simkin
7
+ License-Expression: MIT
8
+ Project-URL: Homepage, https://kieransimkin.co.uk/
9
+ Project-URL: My Songs, https://kieransimkin.co.uk/my-songs/
10
+ Project-URL: Arcadians showcase, https://kieransimkin.co.uk/arcadians/
11
+ Project-URL: Repository, https://github.com/kieransimkin/stemlab
12
+ Project-URL: Issues, https://github.com/kieransimkin/stemlab/issues
13
+ Project-URL: Documentation, https://github.com/kieransimkin/stemlab/tree/main/docs
14
+ Project-URL: Changelog, https://github.com/kieransimkin/stemlab/blob/main/CHANGELOG.md
15
+ Project-URL: About Kieran, https://kieransimkin.co.uk/about-me/
16
+ Project-URL: Contact, https://kieransimkin.co.uk/contact/
17
+ Keywords: music,audio,MIR,source separation,BPM,rhythm,harmony,DanceFlow,DanceMoves,motion response,WordPress
18
+ Classifier: Development Status :: 5 - Production/Stable
19
+ Classifier: Programming Language :: Python :: 3
20
+ Classifier: Programming Language :: Python :: 3.10
21
+ Classifier: Programming Language :: Python :: 3.11
22
+ Classifier: Programming Language :: Python :: 3.12
23
+ Classifier: Programming Language :: Python :: 3.13
24
+ Classifier: Topic :: Multimedia :: Sound/Audio :: Analysis
25
+ Requires-Python: >=3.10
26
+ Description-Content-Type: text/markdown
27
+ License-File: LICENSE
28
+ Requires-Dist: numpy
29
+ Requires-Dist: scipy
30
+ Requires-Dist: torch>=2.4
31
+ Requires-Dist: torchaudio>=2.4
32
+ Requires-Dist: soundfile>=0.12
33
+ Requires-Dist: matplotlib
34
+ Requires-Dist: typer>=0.12
35
+ Requires-Dist: rich>=13.7
36
+ Requires-Dist: platformdirs>=4.2
37
+ Requires-Dist: librosa>=0.11
38
+ Requires-Dist: pyloudnorm>=0.2
39
+ Requires-Dist: cmudict>=1.1.3
40
+ Provides-Extra: separation
41
+ Requires-Dist: demucs>=4.0.1; extra == "separation"
42
+ Requires-Dist: openunmix>=1.3.0; extra == "separation"
43
+ Requires-Dist: bs-roformer-infer>=0.1.5; extra == "separation"
44
+ Provides-Extra: speech
45
+ Requires-Dist: faster-whisper; extra == "speech"
46
+ Provides-Extra: beats
47
+ Requires-Dist: beat-this>=1.1.0; extra == "beats"
48
+ Requires-Dist: BeatNet; extra == "beats"
49
+ Provides-Extra: deep
50
+ Requires-Dist: sentence-transformers<7,>=6.1; extra == "deep"
51
+ Requires-Dist: all-in-one-infer>=3.1; extra == "deep"
52
+ Provides-Extra: semantic-nc
53
+ Requires-Dist: muq; extra == "semantic-nc"
54
+ Provides-Extra: amt
55
+ Requires-Dist: basic-pitch<0.5,>=0.4; python_version < "3.12" and extra == "amt"
56
+ Provides-Extra: server
57
+ Requires-Dist: fastapi<1,>=0.115; extra == "server"
58
+ Requires-Dist: uvicorn[standard]<1,>=0.34; extra == "server"
59
+ Requires-Dist: python-socketio<6,>=5.12; extra == "server"
60
+ Provides-Extra: dev
61
+ Requires-Dist: pytest>=8.0; extra == "dev"
62
+ Requires-Dist: ruff>=0.6; extra == "dev"
63
+ Requires-Dist: build>=1.2; extra == "dev"
64
+ Requires-Dist: tomli>=2; python_version < "3.11" and extra == "dev"
65
+ Provides-Extra: binary
66
+ Requires-Dist: nuitka>=2.7; extra == "binary"
67
+ Requires-Dist: ordered-set>=4.1; extra == "binary"
68
+ Requires-Dist: zstandard>=0.23; extra == "binary"
69
+ Requires-Dist: lazy-loader==0.4; extra == "binary"
70
+ Provides-Extra: all
71
+ Requires-Dist: demucs>=4.0.1; extra == "all"
72
+ Requires-Dist: openunmix>=1.3.0; extra == "all"
73
+ Requires-Dist: bs-roformer-infer>=0.1.5; extra == "all"
74
+ Requires-Dist: faster-whisper; extra == "all"
75
+ Requires-Dist: beat-this>=1.1.0; extra == "all"
76
+ Requires-Dist: BeatNet; extra == "all"
77
+ Requires-Dist: sentence-transformers<7,>=6.1; extra == "all"
78
+ Requires-Dist: all-in-one-infer>=3.1; extra == "all"
79
+ Requires-Dist: fastapi<1,>=0.115; extra == "all"
80
+ Requires-Dist: uvicorn[standard]<1,>=0.34; extra == "all"
81
+ Requires-Dist: python-socketio<6,>=5.12; extra == "all"
82
+ Dynamic: license-file
83
+
84
+ # StemLab
85
+
86
+ > **StemLab by [Kieran Simkin](https://kieransimkin.co.uk/)** · [My Songs](https://kieransimkin.co.uk/my-songs/) · [Arcadians EPK](https://kieransimkin.co.uk/arcadians/) · [Source](https://github.com/kieransimkin/stemlab)
87
+
88
+ > **Packaging identity:** the canonical project name is **StemLab**. StemLab is part of the **Dance Flow** project. The PyPI distribution is named `danceflow-stemlab` solely because Python package-registry names are globally unique. The Python import, CLI, GitHub repository and container image remain `stemlab`.
89
+
90
+ StemLab is the audio-analysis engine in Kieran Simkin's **DanceFlow** BPM and motion-response workflow. It separates and interprets a master track into synchronised stem, BPM/beat, structure, harmony, timbre, speech/lyric and semantic data. Those outputs can drive downstream motion-aware experiences, including the WordPress **DanceMoves** plugin, while StemLab remains usable as a standalone CLI, Python library, web service and container.
91
+
92
+ > **Model weights are not redistributed by this project.** They are fetched from their upstream registries/releases on first use. This avoids silently republishing checkpoints whose licensing may differ from the source code license, and lets upstream integrity metadata be used where available.
93
+
94
+ ## DanceFlow and DanceMoves
95
+
96
+ DanceFlow is the wider BPM and motion-response workflow. **StemLab** is its
97
+ music-understanding layer; the WordPress **DanceMoves** plugin is a related
98
+ downstream motion-response component. StemLab has no WordPress dependency and
99
+ communicates through normal analysis artifacts and service APIs, so it remains
100
+ independently useful and reproducible.
101
+
102
+ See [docs/danceflow.md](docs/danceflow.md) for the component boundary.
103
+
104
+ ## Curated default model set (September 2026)
105
+
106
+ | StemLab id | Role | Outputs | Why it is included |
107
+ |---|---|---|---|
108
+ | `bs_roformer_sw` | high-capacity | vocals, drums, bass, guitar, piano, other (+ upstream instrumental) | Current production-oriented BS-RoFormer inference package recommends this six-stem checkpoint. |
109
+ | `mvsep_mega53` | high-capacity / broad taxonomy | 53 raw stems (discovered dynamically) | Extremely broad one-checkpoint stem inventory for later assessment. Upstream warns it is memory-heavy and recommends at least 16 GB VRAM. |
110
+ | `scnet_xl_ihf` | high-capacity | vocals, drums, bass, other | The MSST published checkpoint table reports a 10.08 dB average MUSDB test SDR and 9.92 dB Multisong average for this model. |
111
+ | `htdemucs_ft` | high-capacity established baseline | drums, bass, other, vocals | Fine-tuned HTDemucs remains a useful independent architecture/baseline rather than another RoFormer variant. |
112
+ | `openunmix_umxhq` | compact / low-latency candidate | vocals, drums, bass, other | Compact PyTorch/Open-Unmix baseline. StemLab runs `niter=0` to favour latency. “Realtime” is hardware- and buffer-dependent: benchmark it on the intended target. |
113
+
114
+ An optional `htdemucs_6s` model is registered for guitar/piano comparison but is not part of the default top-four group.
115
+
116
+ Relevant upstreams:
117
+
118
+ - https://github.com/openmirlab/bs-roformer-infer
119
+ - https://github.com/ZFTurbo/Music-Source-Separation-Training
120
+ - https://github.com/adefossez/demucs
121
+ - https://github.com/sigsep/open-unmix-pytorch
122
+
123
+ ## Analysis performed
124
+
125
+ For every successful separator, **every WAV it emits** is retained. Stem names are discovered from files rather than truncated to a hard-coded four-stem schema, which is important for MVSep Mega 53. For the master and every stem, StemLab writes both a PNG spectrogram and compressed `.npz` spectrogram data (time axis, frequency axis, dB matrix, FFT metadata).
126
+
127
+ The preferred vocal stem is passed through the Silero VAD implementation bundled with `faster-whisper`. Speech regions are used to create a timeline-preserving `spoken_word.wav` (non-speech is zeroed rather than concatenated), then Whisper is run with word timestamps. Outputs include `whisper.json`, `speech_regions.json`, `transcript.txt`, `transcript.srt`, and `words.tsv`.
128
+
129
+ Beat analysis runs:
130
+
131
+ - **BeatNet** in offline/DBN mode.
132
+ - **Beat This!** using the `final0` checkpoint and its minimal postprocessor.
133
+ - **Beat Transformer**, using the original released model code/checkpoints. The model was trained on five demixed mel streams, so StemLab maps BS-RoFormer-SW to vocals, drums, bass, piano, and `other + guitar`, makes 128-bin mel-power spectrograms at the original 44.1 kHz / 4096 FFT / 1024-hop settings, and averages all eight released fold checkpoints by default. It uses the original madmom DBN decoder if madmom is importable, otherwise a documented SciPy peak-picking fallback.
134
+
135
+ Beat outputs are stored as JSON, TSV, and (for Beat Transformer) activation NPZ data.
136
+
137
+ StemLab also supports the official **Vamp Plugin Pack**, executed through
138
+ **Sonic Annotator**. The curated Vamp pass focuses on musically useful outputs:
139
+ Chordino chord transcription and harmonic-change likelihood; NNLS chroma and
140
+ bass chroma; Queen Mary key and tonal-change detection; concert-pitch tuning;
141
+ pYIN melody/F0 and monophonic note transcription on the preferred separated
142
+ vocal stem; Silvet polyphonic note transcription; Segmentino song-structure
143
+ segmentation; and the Queen Mary Vamp beat/bar tracker. Raw CSV, pinned
144
+ transform files, JSON, NPZ and plots are retained under `vamp/`, with the most
145
+ useful melody/harmony layers also embedded in the Sonic Visualiser session.
146
+
147
+ ## Comprehensive sonic, harmonic, rhythmic and semantic analysis
148
+
149
+ StemLab 1.0 consolidates a higher-level evidence-fusion pass without discarding any of the
150
+ existing low-level outputs. The default deep pass now includes:
151
+
152
+ | Action | Evidence / model | Main output |
153
+ |---|---|---|
154
+ | Sonic profile | `pyloudnorm` BS.1770 + librosa DSP | LUFS, dynamics, true-peak estimate, timbre and stereo |
155
+ | Groove / meter | all successful beat grids + onset analysis | tempo stability, meter, swing, offbeat energy and quantisation error |
156
+ | Harmony | Chordino + NNLS chroma + QM key/tuning | chord progression, harmonic rhythm, key evidence and tonal changes |
157
+ | Functional structure | All-In-One-Infer 3.1 | BPM, beats/downbeats and intro/verse/chorus/bridge/outro-style sections |
158
+ | Rhyme / prosody | CMU Pronouncing Dictionary + timing | rhyme scheme, internal rhyme, syllables, repetitions and delivery rate |
159
+ | Lyric semantics | SentenceTransformers | theme similarity, continuity and unsupervised line clusters |
160
+ | Song map | StemLab evidence fusion | section-level sonic/rhythm/chord/lyric summaries on one timeline |
161
+
162
+ Optional actions include **Basic Pitch** polyphonic MIDI/note transcription on isolated
163
+ instrument stems and **MuQ-MuLan** zero-shot audio/text semantics. MuQ-MuLan's released
164
+ weights are CC-BY-NC 4.0, so that route is deliberately opt-in and its licence is embedded
165
+ in every result. Embedding similarities are labelled as similarities, never probabilities.
166
+
167
+ Inspect the routes and their dependencies with:
168
+
169
+ ```bash
170
+ stemlab analysis-actions
171
+ ```
172
+
173
+ Useful switches include `--no-structure`, `--no-text-semantics`, `--audio-semantics`,
174
+ `--basic-pitch`, and `--all-in-one-embeddings`.
175
+
176
+ The derived artifacts live under `deep/` (`sonic/`, `rhythm/`, `harmony/`, `structure/`,
177
+ `lyrics/`, `semantic_text/`, optional `semantic_audio/` and `basic_pitch/`, plus
178
+ `song_map/song_map.json` and `summary.json`).
179
+
180
+ ## Install
181
+
182
+ Python 3.10 or 3.11 is recommended because the legacy BeatNet/madmom ecosystem is less predictable on newer Python versions.
183
+
184
+ From PyPI, install the released StemLab distribution with:
185
+
186
+ ```bash
187
+ pip install danceflow-stemlab
188
+ ```
189
+
190
+ The installed Python package and command remain `stemlab`. For development from a source checkout:
191
+
192
+ ```bash
193
+ python -m venv .venv
194
+ . .venv/bin/activate # Windows: .venv\Scripts\activate
195
+ python -m pip install -U pip
196
+ pip install -e ".[all]"
197
+ ```
198
+
199
+ SCNet and Beat Transformer are research repositories rather than stable pip inference APIs. They are isolated/downloaded on demand. To prepare everything in advance:
200
+
201
+ ```bash
202
+ stemlab bootstrap all
203
+ ```
204
+
205
+ For only the Vamp analysis stack:
206
+
207
+ ```bash
208
+ stemlab bootstrap vamp
209
+ ```
210
+
211
+ `bootstrap vamp` downloads the pinned Sonic Annotator runtime and launches the
212
+ official Vamp Plugin Pack installer. Complete the installer once, then rerun the
213
+ command if needed to verify that the requested plugin outputs are visible.
214
+
215
+ ## CLI
216
+
217
+ Full requested analysis:
218
+
219
+ ```bash
220
+ stemlab analyze master.wav --output ./analysis-master --profile full --device auto
221
+ ```
222
+
223
+ Useful alternatives:
224
+
225
+ ```bash
226
+ # Skip the 53-stem model for a materially lighter run
227
+ stemlab analyze master.wav -o ./analysis-master --profile practical
228
+
229
+ # Run only selected separators
230
+ stemlab analyze master.wav -o ./analysis-master \
231
+ --model bs_roformer_sw --model scnet_xl_ihf --model openunmix_umxhq
232
+
233
+ # Fail immediately rather than recording a backend failure and continuing
234
+ stemlab analyze master.wav -o ./analysis-master --strict
235
+
236
+ # Skip Vamp if the plugin pack is intentionally not installed
237
+ stemlab analyze master.wav -o ./analysis-master --no-vamp
238
+
239
+ stemlab models
240
+ stemlab doctor
241
+ ```
242
+
243
+ By default model weights and external research code are cached outside the output folder; all **generated analysis artifacts and datasets** are written inside the output folder. The copied master is also placed in `input/` so the Sonic Visualiser session is portable as one directory.
244
+
245
+ ## Output layout
246
+
247
+ ```text
248
+ analysis-master/
249
+ input/master.wav
250
+ stems/
251
+ bs_roformer_sw/*.wav
252
+ mvsep_mega53/*.wav
253
+ scnet_xl_ihf/*.wav
254
+ htdemucs_ft/*.wav
255
+ openunmix_umxhq/*.wav
256
+ spectrograms/
257
+ master.png
258
+ master.npz
259
+ <model>/<stem>.png
260
+ <model>/<stem>.npz
261
+ speech/spoken_word.png
262
+ speech/spoken_word.npz
263
+ speech/
264
+ spoken_word.wav
265
+ speech_regions.json
266
+ whisper.json
267
+ transcript.txt
268
+ transcript.srt
269
+ words.tsv
270
+ beats/
271
+ beatnet.json / beatnet.tsv
272
+ beat_this.json / beat_this.tsv
273
+ beat_transformer.json / beat_transformer.tsv
274
+ beat_transformer_activations.npz
275
+ vamp/
276
+ report.json
277
+ transforms/*.n3
278
+ raw/*.csv
279
+ data/*.json
280
+ data/*.npz
281
+ plots/*.png
282
+ deep/
283
+ sonic/
284
+ rhythm/
285
+ harmony/
286
+ structure/
287
+ lyrics/
288
+ semantic_text/
289
+ song_map/
290
+ summary.json
291
+ sonic_visualiser/
292
+ session.sv
293
+ session.xml
294
+ open_sonic_visualiser.bat
295
+ open_sonic_visualiser.sh
296
+ analysis.json
297
+ manifest.json
298
+ ```
299
+
300
+ `session.sv` is genuine Sonic Visualiser bzip2-compressed session XML. It contains a master pane with beat/downbeat/Whisper time-instant layers and one synchronized waveform + Sonic Visualiser spectrogram pane for every separated stem. The uncompressed `session.xml` is retained for inspection/debugging. The Windows `.bat` looks on `PATH` and in the usual Program Files locations.
301
+
302
+ ## Web service
303
+
304
+ StemLab includes an upload/timeline web UI plus HTTP and Socket.IO APIs for
305
+ content-addressed analysis jobs. See [docs/web.md](docs/web.md) for launchers,
306
+ endpoints, events and the Arcadians reference workflow.
307
+
308
+ ## Documentation
309
+
310
+ - [DanceFlow workflow and DanceMoves relationship](docs/danceflow.md)
311
+ - [Web service](docs/web.md)
312
+ - [Containers](docs/containers.md)
313
+ - [Publishing and releases](docs/publishing.md)
314
+ - [Changelog](CHANGELOG.md)
315
+
316
+ ## Python API
317
+
318
+ ```python
319
+ from pathlib import Path
320
+ from stemlab.models import FULL_PROFILE
321
+ from stemlab.pipeline import run_pipeline
322
+ from stemlab.types import PipelineConfig
323
+
324
+ result = run_pipeline(PipelineConfig(
325
+ input_wav=Path("master.wav"),
326
+ output_dir=Path("analysis-master"),
327
+ models=FULL_PROFILE,
328
+ device="auto",
329
+ ))
330
+ ```
331
+
332
+ ## External runtime/cache details
333
+
334
+ The BS-RoFormer adapter uses `bs-roformer-infer`, which manages its own checkpoint registry and SHA-256 verification. SCNet is pinned to the v1.0.15 `SCNet XL IHF` release asset URLs; StemLab records computed hashes after download. Beat Transformer is cloned from its original upstream and consumes the released fold checkpoints from that repository. Set `STEMLAB_CACHE=/some/path` to relocate StemLab's external cache.
335
+
336
+ The full run is intentionally expensive. Mega-53 is the dominant VRAM/storage pass and dozens of stems mean dozens of additional spectrogram files and Sonic Visualiser panes. Use `--profile practical` while iterating and `--profile full` for exhaustive analysis.
337
+
338
+ ## Releases
339
+
340
+ Version tags publish StemLab to GitHub Releases, PyPI (`danceflow-stemlab`),
341
+ GHCR and Docker Hub after validation. See
342
+ [docs/publishing.md](docs/publishing.md) for the release contract and Trusted
343
+ Publishing setup.
344
+
345
+ ## Reproducibility and licensing
346
+
347
+ `analysis.json` records model/backend metadata and errors; `manifest.json` hashes every output artifact. Model checkpoints, research code and datasets retain their upstream terms. In particular, do not assume that an MIT-licensed inference wrapper automatically grants redistribution rights for every checkpoint it can download.
@@ -0,0 +1,56 @@
1
+ danceflow_stemlab-1.0.0.dist-info/licenses/LICENSE,sha256=LPD2FFuqoDfCWcmG8_wrcFOzf9uun0jOyYdREcl8ArA,1077
2
+ stemlab/__init__.py,sha256=8GvZqf9_9prjePHZvvq9BX7LJ359uP1gwxQ73d4GdSY,359
3
+ stemlab/__main__.py,sha256=Qd-f8z2Q2vpiEP2x6PBFsJrpACWDVxFKQk820MhFmHo,59
4
+ stemlab/audio.py,sha256=jfHp0YnmNaULC5tBN_KLNt64q2Mp7ujn6dydcqevp7U,5960
5
+ stemlab/bootstrap.py,sha256=LNFECUFYGQHbVQkngwksII30HOaI1MhrmfysyZbUfvk,5054
6
+ stemlab/branding.py,sha256=W0z2xpNcPJceu36rsZjCGaKW7dY_bxZcgNauQQ4Xpo4,1958
7
+ stemlab/canonical.py,sha256=Q9777m72_dXwDNtgRPH4wy3ngWtKGTdZY8w_H1j6Bxc,6829
8
+ stemlab/cli.py,sha256=MFa1lKXq97nNciWq0yD3_Ty__NKaqcytjRMAlbJjHfU,9324
9
+ stemlab/manifest.py,sha256=-zy8aUEGsOGIv7fcdvdatgzL0pRVBWJr-fEMoWiVQps,903
10
+ stemlab/models.py,sha256=Sph8omyF59i-_NthsH0Rj-8RAfwrgXBqxwSnty2K770,4169
11
+ stemlab/pipeline.py,sha256=Sg35vG_A7-Reyao9qvnQ8rDwciApUYOKBJjM_9EPm5I,16446
12
+ stemlab/server.py,sha256=sRiXpdLjhTplET-s4A-6Ubpo01DK1EaZALIARIRMVWk,37233
13
+ stemlab/sonic_visualiser.py,sha256=ogVOKO0swyhyZ2lZKiUHtjv_eSVSBJtjSL1hlIviK5s,41796
14
+ stemlab/spectrogram.py,sha256=XuXWRfMa1fvIYUxiTwML8HSgw0LPV7OY1hER7driQnU,2602
15
+ stemlab/speech.py,sha256=zM7wfsfQsDqdy10L1KX7boVrRYaCNF1nSHFWlNbztR8,4416
16
+ stemlab/types.py,sha256=WzYK_mO10jMKVXLzBXApqaPWD_J2a18gLNVXeJNCoX8,1912
17
+ stemlab/util.py,sha256=nTltGBhzSRapUqnthW-SC97VZL-is6_zgCF7_mIFsy0,1556
18
+ stemlab/vamp.py,sha256=CKBVRLXJpgKtJ41xAg7gGKlaqOtO10nIkXP9gCCaGOk,12064
19
+ stemlab/vamp_runtime.py,sha256=_pwRccBYisfj5iYVG3a5EtOoUuRUzksXV8x7KFVFcYs,9181
20
+ stemlab/webui.py,sha256=5wLtKqBQno_hqZGV-g9cmqv02p6BcXi8udHlGgB5XAg,14984
21
+ stemlab/analysis/__init__.py,sha256=61X0tC9vFNaZzHT-cmH33PWaylDvjOsLzdA2akLH_q8,169
22
+ stemlab/analysis/harmony.py,sha256=Y8y59h8tAgjt_-Xy48q2aKs-rU038BRY5AB5N8yT7Lo,14232
23
+ stemlab/analysis/lyrics.py,sha256=-kf-6_YxCtHCQPV1DZkViDNhPb98VPXVd5R5B7kpVhQ,11009
24
+ stemlab/analysis/registry.py,sha256=4s2Kv9WoFFn26WKqGSmKiP9xZ42S5KnANIHEPxV83bY,4117
25
+ stemlab/analysis/rhythm.py,sha256=XmnP1kGorBwLEYnXp50jEr6DAlu3M-1yJ0HhquIHpWw,8768
26
+ stemlab/analysis/runner.py,sha256=df21UI4E_od_Ci7DKogb5p07edag-fZV8DII4Iw4ANM,6414
27
+ stemlab/analysis/semantic_audio.py,sha256=N6kopNv8AjZBYJ2P9EbXg2MgHiDd9bkBcE4aNKs9Gpo,4024
28
+ stemlab/analysis/semantic_text.py,sha256=gdzXaGOPikqNpNI-PfwcdCsw3GLs7vqVKlYQZe1iiX0,4383
29
+ stemlab/analysis/song_map.py,sha256=KYuy-7BqXQBn-p2-9TOZJQoDKUtAohUC4iL68RsT3qg,9115
30
+ stemlab/analysis/sonic.py,sha256=ok-ZaHTcdOYoCNbVklHnN-vEHEx12etCcuDKy5b2C3Q,7416
31
+ stemlab/analysis/structure.py,sha256=WQ1UauNoWbnpdrXibzIaJX9tDMCzIzh-w5KIHj7Xzp0,3742
32
+ stemlab/analysis/transcription.py,sha256=2RC45SQlXxhGJ3flcbYy9zjX917Sp-KsXCVCxSDXvvc,3823
33
+ stemlab/beats/__init__.py,sha256=iiwERMYfDQwaLRVxk-yR_iGRCo88ovjzLvAvFeKiXpM,201
34
+ stemlab/beats/base.py,sha256=5YHcr3MVcwBCwVoGAXhpLQS-lgClYXSrHJNIKDfnT7E,343
35
+ stemlab/beats/beatnet.py,sha256=i4Cds2QgsERBpUwzZoat2I1_OSn--ZPyz__PBhiPXw8,3347
36
+ stemlab/beats/beatthis.py,sha256=pKeOSScWG5SjFcWQLvdhxe5gWAtL5_zunQEEhWEU6jA,890
37
+ stemlab/beats/beattransformer.py,sha256=zwK2Yd5YRWqa3zDxF3m1JF1pZMyBYmnKsKZq4SvnZBA,7151
38
+ stemlab/beats/common.py,sha256=HdnyIsEgrfYK2Vqa5hnhLyyAWeprw5Kgpvwx6jsrHl8,4362
39
+ stemlab/separators/__init__.py,sha256=GoMjT0Au-KPM06QKa_tHi4qnmUGDlgOJKAFVRZBhBgM,547
40
+ stemlab/separators/base.py,sha256=Q1cHraGSJnU5zJwVVBoxSQke3orbOFi4FskMyNt2CH0,335
41
+ stemlab/separators/bsroformer.py,sha256=NO6xaMdDDqhV9DssbATlnDP3c-lUpCICP7W5xwm80cE,2903
42
+ stemlab/separators/common.py,sha256=nsPszsO-w-_HFaHa0g-j_ATa9iKrzmvujxTtehumbUk,1114
43
+ stemlab/separators/demucs.py,sha256=yHI3EvKO6xZUaqcfgdzRwatfYLNufdbBsE434IMQZ9Y,2085
44
+ stemlab/separators/openunmix.py,sha256=tJXHkT7Nx0KiJGLdaZ7qr19XkYyec-MS4QM5y5D6tJw,1878
45
+ stemlab/separators/scnet.py,sha256=l8SuhOkWLe8nldxN0DxkO_H5SWxFfn2gHw6z0nV-9JY,2474
46
+ stemlab/web/app.js,sha256=HgFba_DqEryw2Il8y3jvtX5oNiR2MySgzq2IDCW8NVk,33832
47
+ stemlab/web/arcadians-cover.jpg,sha256=i_7_k5wf_Lp1KWFCY-BdTxu1mkbmwTUB2_EjSe2wR-4,745386
48
+ stemlab/web/arcadians-reference.json,sha256=wJz5PXQ9eFGVZrMi-ST6QJlaorEIz_HXJ7uCm4lvD2o,8601
49
+ stemlab/web/canonical.js,sha256=jKPGAZrmsbvmwMY286GFZcqfAACidZRrYKw1lxeeCfE,14417
50
+ stemlab/web/index.html,sha256=kBwqJq47y_nb9mCpBkQNmc8Ch--yuVCrgWi9cU9B6Xs,7268
51
+ stemlab/web/style.css,sha256=2ARj4QWCoRosKiPlJ0wIWCSjTeC2sKNAYxloZp96KRw,15166
52
+ danceflow_stemlab-1.0.0.dist-info/METADATA,sha256=-gkG6WbS8bkX0D70ehT6fx993ooKuZmihzvS-nocPU4,16509
53
+ danceflow_stemlab-1.0.0.dist-info/WHEEL,sha256=YVMoNqKzERt-wjUZwJ33xBGAwnFl-4cqbYkTtWa4itE,91
54
+ danceflow_stemlab-1.0.0.dist-info/entry_points.txt,sha256=rVHBHWZPCVoH5bw3D82bRHx_U0TY26XYo36qchl6Kvg,44
55
+ danceflow_stemlab-1.0.0.dist-info/top_level.txt,sha256=pT2NYpLC01yTrISYKKr0uoXJjOX32J9sX4X1MrYeYg4,8
56
+ danceflow_stemlab-1.0.0.dist-info/RECORD,,
@@ -0,0 +1,5 @@
1
+ Wheel-Version: 1.0
2
+ Generator: setuptools (84.0.0)
3
+ Root-Is-Purelib: true
4
+ Tag: py3-none-any
5
+
@@ -0,0 +1,2 @@
1
+ [console_scripts]
2
+ stemlab = stemlab.cli:app
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2026 StemLab contributors
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
@@ -0,0 +1 @@
1
+ stemlab
stemlab/__init__.py ADDED
@@ -0,0 +1,10 @@
1
+ """StemLab — audio analysis for the DanceFlow BPM and motion-response workflow.
2
+
3
+ StemLab is the canonical project name. The PyPI distribution is
4
+ ``danceflow-stemlab``; the Python package and CLI remain ``stemlab``.
5
+
6
+ Created by Kieran Simkin — https://kieransimkin.co.uk/
7
+ Music catalogue — https://kieransimkin.co.uk/my-songs/
8
+ """
9
+
10
+ __version__ = "1.0.0"
stemlab/__main__.py ADDED
@@ -0,0 +1,4 @@
1
+ from .cli import app
2
+
3
+ if __name__ == "__main__":
4
+ app()
@@ -0,0 +1,5 @@
1
+ """High-level musical analysis built on StemLab's existing evidence layers."""
2
+
3
+ from .runner import run_comprehensive_analysis
4
+
5
+ __all__ = ["run_comprehensive_analysis"]