danceflow-stemlab 1.4.2__tar.gz → 1.6.1__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 (233) hide show
  1. danceflow_stemlab-1.6.1/.github/dancerudiments-recording-ref +1 -0
  2. danceflow_stemlab-1.6.1/.github/workflows/arcadians-demo.yml +230 -0
  3. danceflow_stemlab-1.6.1/.github/workflows/arcadians-pages.yml +111 -0
  4. danceflow_stemlab-1.6.1/.github/workflows/arcadians-timeline.yml +94 -0
  5. danceflow_stemlab-1.6.1/.github/workflows/recordings.yml +72 -0
  6. {danceflow_stemlab-1.4.2 → danceflow_stemlab-1.6.1}/.github/workflows/release.yml +90 -36
  7. danceflow_stemlab-1.6.1/AGENTS.md +54 -0
  8. danceflow_stemlab-1.6.1/MANIFEST.in +61 -0
  9. {danceflow_stemlab-1.4.2 → danceflow_stemlab-1.6.1}/PKG-INFO +312 -6
  10. {danceflow_stemlab-1.4.2 → danceflow_stemlab-1.6.1}/README.md +308 -0
  11. danceflow_stemlab-1.6.1/docs/arcadians-release-demo.md +318 -0
  12. danceflow_stemlab-1.6.1/docs/arcadians-timeline.md +213 -0
  13. danceflow_stemlab-1.6.1/docs/beat-inputs.md +58 -0
  14. danceflow_stemlab-1.6.1/docs/recording-pairs.md +161 -0
  15. danceflow_stemlab-1.6.1/docs/released-viewers.md +214 -0
  16. danceflow_stemlab-1.6.1/docs/rudiment-recordings.md +336 -0
  17. danceflow_stemlab-1.6.1/docs/screenshots/recording-comparison.png +0 -0
  18. danceflow_stemlab-1.6.1/docs/viewer-controls.md +100 -0
  19. danceflow_stemlab-1.6.1/examples/recordings/generate_demo.py +68 -0
  20. danceflow_stemlab-1.6.1/examples/recordings/generate_frequency_demo.py +35 -0
  21. {danceflow_stemlab-1.4.2 → danceflow_stemlab-1.6.1}/mcp-registry/server.json +2 -2
  22. {danceflow_stemlab-1.4.2 → danceflow_stemlab-1.6.1}/plugins/stemlab/.codex-plugin/plugin.json +1 -1
  23. {danceflow_stemlab-1.4.2 → danceflow_stemlab-1.6.1}/plugins/stemlab/plugin.json +1 -1
  24. {danceflow_stemlab-1.4.2 → danceflow_stemlab-1.6.1}/pyproject.toml +3 -3
  25. danceflow_stemlab-1.6.1/scripts/Release-DanceFlow.ps1 +57 -0
  26. danceflow_stemlab-1.6.1/scripts/arcadians_http.py +140 -0
  27. danceflow_stemlab-1.6.1/scripts/assemble_arcadians_site.py +94 -0
  28. danceflow_stemlab-1.6.1/scripts/build_arcadians_demo.py +358 -0
  29. danceflow_stemlab-1.6.1/scripts/build_arcadians_pair_demos.py +309 -0
  30. danceflow_stemlab-1.6.1/scripts/build_arcadians_timeline.py +221 -0
  31. danceflow_stemlab-1.6.1/scripts/check_arcadians_audio.py +376 -0
  32. danceflow_stemlab-1.6.1/scripts/check_arcadians_timeline.py +223 -0
  33. danceflow_stemlab-1.6.1/scripts/check_semantic_runtime.py +80 -0
  34. danceflow_stemlab-1.6.1/scripts/check_torchaudio_decode.py +97 -0
  35. danceflow_stemlab-1.6.1/scripts/check_viewer_build.py +8 -0
  36. danceflow_stemlab-1.6.1/scripts/configure_viewer_build.py +12 -0
  37. danceflow_stemlab-1.6.1/scripts/publish_arcadians_pages.py +305 -0
  38. danceflow_stemlab-1.6.1/scripts/release_suite.py +525 -0
  39. danceflow_stemlab-1.6.1/scripts/timeline_display_checks.py +141 -0
  40. danceflow_stemlab-1.6.1/scripts/viewer_releases.py +314 -0
  41. {danceflow_stemlab-1.4.2 → danceflow_stemlab-1.6.1}/src/danceflow_stemlab.egg-info/PKG-INFO +312 -6
  42. {danceflow_stemlab-1.4.2 → danceflow_stemlab-1.6.1}/src/danceflow_stemlab.egg-info/SOURCES.txt +55 -0
  43. {danceflow_stemlab-1.4.2 → danceflow_stemlab-1.6.1}/src/danceflow_stemlab.egg-info/requires.txt +3 -5
  44. {danceflow_stemlab-1.4.2 → danceflow_stemlab-1.6.1}/src/stemlab/__init__.py +1 -1
  45. danceflow_stemlab-1.6.1/src/stemlab/analysis/frequency_bands.py +103 -0
  46. danceflow_stemlab-1.6.1/src/stemlab/analysis/rudiment_batch.py +253 -0
  47. danceflow_stemlab-1.6.1/src/stemlab/analysis/rudiment_pairs.py +276 -0
  48. danceflow_stemlab-1.6.1/src/stemlab/analysis/rudiment_recordings.py +476 -0
  49. {danceflow_stemlab-1.4.2 → danceflow_stemlab-1.6.1}/src/stemlab/beats/beattransformer.py +2 -0
  50. {danceflow_stemlab-1.4.2 → danceflow_stemlab-1.6.1}/src/stemlab/beats/common.py +13 -5
  51. danceflow_stemlab-1.6.1/src/stemlab/beats/inputs.py +85 -0
  52. {danceflow_stemlab-1.4.2 → danceflow_stemlab-1.6.1}/src/stemlab/cli.py +17 -0
  53. {danceflow_stemlab-1.4.2 → danceflow_stemlab-1.6.1}/src/stemlab/pipeline.py +52 -15
  54. danceflow_stemlab-1.6.1/src/stemlab/recording_cli.py +268 -0
  55. danceflow_stemlab-1.6.1/src/stemlab/static_timeline.py +332 -0
  56. {danceflow_stemlab-1.4.2 → danceflow_stemlab-1.6.1}/src/stemlab/web/app.js +5022 -4836
  57. danceflow_stemlab-1.6.1/src/stemlab/web/static-timeline.js +34 -0
  58. {danceflow_stemlab-1.4.2 → danceflow_stemlab-1.6.1}/src/stemlab/web/timeline.css +1 -1
  59. danceflow_stemlab-1.6.1/tests/test_arcadians_fourier_demo.py +165 -0
  60. danceflow_stemlab-1.6.1/tests/test_arcadians_http.py +210 -0
  61. danceflow_stemlab-1.6.1/tests/test_arcadians_pages_publish.py +225 -0
  62. danceflow_stemlab-1.6.1/tests/test_arcadians_pair_demos.py +225 -0
  63. danceflow_stemlab-1.6.1/tests/test_arcadians_release_demo.py +198 -0
  64. danceflow_stemlab-1.6.1/tests/test_arcadians_runtime.py +314 -0
  65. danceflow_stemlab-1.6.1/tests/test_arcadians_timeline.py +325 -0
  66. danceflow_stemlab-1.6.1/tests/test_beat_inputs.py +160 -0
  67. {danceflow_stemlab-1.4.2 → danceflow_stemlab-1.6.1}/tests/test_codex_release.py +2 -1
  68. danceflow_stemlab-1.6.1/tests/test_frequency_bands.py +220 -0
  69. danceflow_stemlab-1.6.1/tests/test_onefile_build.py +168 -0
  70. danceflow_stemlab-1.6.1/tests/test_release_suite.py +385 -0
  71. danceflow_stemlab-1.6.1/tests/test_rudiment_pairs.py +238 -0
  72. danceflow_stemlab-1.6.1/tests/test_rudiment_recordings.py +276 -0
  73. danceflow_stemlab-1.6.1/tests/test_static_timeline.py +231 -0
  74. danceflow_stemlab-1.6.1/tests/test_viewer_controls.py +35 -0
  75. danceflow_stemlab-1.6.1/tests/test_viewer_releases.py +242 -0
  76. {danceflow_stemlab-1.4.2 → danceflow_stemlab-1.6.1}/tests/test_web_frontend.py +5 -1
  77. danceflow_stemlab-1.4.2/AGENTS.md +0 -15
  78. danceflow_stemlab-1.4.2/MANIFEST.in +0 -24
  79. {danceflow_stemlab-1.4.2 → danceflow_stemlab-1.6.1}/.agents/plugins/marketplace.json +0 -0
  80. {danceflow_stemlab-1.4.2 → danceflow_stemlab-1.6.1}/.github/workflows/codex-plugin.yml +0 -0
  81. {danceflow_stemlab-1.4.2 → danceflow_stemlab-1.6.1}/CONTRIBUTING.md +0 -0
  82. {danceflow_stemlab-1.4.2 → danceflow_stemlab-1.6.1}/LICENSE +0 -0
  83. {danceflow_stemlab-1.4.2 → danceflow_stemlab-1.6.1}/docs/branding/README.md +0 -0
  84. {danceflow_stemlab-1.4.2 → danceflow_stemlab-1.6.1}/docs/branding/logo-monochrome.svg +0 -0
  85. {danceflow_stemlab-1.4.2 → danceflow_stemlab-1.6.1}/docs/branding/logo.png +0 -0
  86. {danceflow_stemlab-1.4.2 → danceflow_stemlab-1.6.1}/docs/branding/logo.svg +0 -0
  87. {danceflow_stemlab-1.4.2 → danceflow_stemlab-1.6.1}/docs/codex-plugin.md +0 -0
  88. {danceflow_stemlab-1.4.2 → danceflow_stemlab-1.6.1}/docs/codex-publishing.md +0 -0
  89. {danceflow_stemlab-1.4.2 → danceflow_stemlab-1.6.1}/docs/cue-alignment.md +0 -0
  90. {danceflow_stemlab-1.4.2 → danceflow_stemlab-1.6.1}/docs/evidence-models.md +0 -0
  91. {danceflow_stemlab-1.4.2 → danceflow_stemlab-1.6.1}/docs/midi.md +0 -0
  92. {danceflow_stemlab-1.4.2 → danceflow_stemlab-1.6.1}/plugins/stemlab/.mcp.json +0 -0
  93. {danceflow_stemlab-1.4.2 → danceflow_stemlab-1.6.1}/plugins/stemlab/README.md +0 -0
  94. {danceflow_stemlab-1.4.2 → danceflow_stemlab-1.6.1}/plugins/stemlab/branding/logo-monochrome.svg +0 -0
  95. {danceflow_stemlab-1.4.2 → danceflow_stemlab-1.6.1}/plugins/stemlab/branding/logo.png +0 -0
  96. {danceflow_stemlab-1.4.2 → danceflow_stemlab-1.6.1}/plugins/stemlab/branding/logo.svg +0 -0
  97. {danceflow_stemlab-1.4.2 → danceflow_stemlab-1.6.1}/plugins/stemlab/mcp.json +0 -0
  98. {danceflow_stemlab-1.4.2 → danceflow_stemlab-1.6.1}/plugins/stemlab/skills/stemlab/SKILL.md +0 -0
  99. {danceflow_stemlab-1.4.2 → danceflow_stemlab-1.6.1}/plugins/stemlab/skills/stemlab/references/tools.md +0 -0
  100. {danceflow_stemlab-1.4.2 → danceflow_stemlab-1.6.1}/scripts/benchmark_evidence_corpus.py +0 -0
  101. {danceflow_stemlab-1.4.2 → danceflow_stemlab-1.6.1}/scripts/build_codex_plugin.py +0 -0
  102. {danceflow_stemlab-1.4.2 → danceflow_stemlab-1.6.1}/scripts/capture_loop_workflow.py +0 -0
  103. {danceflow_stemlab-1.4.2 → danceflow_stemlab-1.6.1}/scripts/check_codex_timeline.py +0 -0
  104. {danceflow_stemlab-1.4.2 → danceflow_stemlab-1.6.1}/scripts/loop_demo.py +0 -0
  105. {danceflow_stemlab-1.4.2 → danceflow_stemlab-1.6.1}/scripts/prepare_codex_marketplace.py +0 -0
  106. {danceflow_stemlab-1.4.2 → danceflow_stemlab-1.6.1}/scripts/publish_mcp_registry.py +0 -0
  107. {danceflow_stemlab-1.4.2 → danceflow_stemlab-1.6.1}/scripts/smoke_midi.py +0 -0
  108. {danceflow_stemlab-1.4.2 → danceflow_stemlab-1.6.1}/setup.cfg +0 -0
  109. {danceflow_stemlab-1.4.2 → danceflow_stemlab-1.6.1}/src/danceflow_stemlab.egg-info/dependency_links.txt +0 -0
  110. {danceflow_stemlab-1.4.2 → danceflow_stemlab-1.6.1}/src/danceflow_stemlab.egg-info/entry_points.txt +0 -0
  111. {danceflow_stemlab-1.4.2 → danceflow_stemlab-1.6.1}/src/danceflow_stemlab.egg-info/top_level.txt +0 -0
  112. {danceflow_stemlab-1.4.2 → danceflow_stemlab-1.6.1}/src/stemlab/__main__.py +0 -0
  113. {danceflow_stemlab-1.4.2 → danceflow_stemlab-1.6.1}/src/stemlab/analysis/__init__.py +0 -0
  114. {danceflow_stemlab-1.4.2 → danceflow_stemlab-1.6.1}/src/stemlab/analysis/evidence/__init__.py +0 -0
  115. {danceflow_stemlab-1.4.2 → danceflow_stemlab-1.6.1}/src/stemlab/analysis/evidence/adapters.py +0 -0
  116. {danceflow_stemlab-1.4.2 → danceflow_stemlab-1.6.1}/src/stemlab/analysis/evidence/registry.py +0 -0
  117. {danceflow_stemlab-1.4.2 → danceflow_stemlab-1.6.1}/src/stemlab/analysis/evidence/runner.py +0 -0
  118. {danceflow_stemlab-1.4.2 → danceflow_stemlab-1.6.1}/src/stemlab/analysis/evidence/worker.py +0 -0
  119. {danceflow_stemlab-1.4.2 → danceflow_stemlab-1.6.1}/src/stemlab/analysis/harmony.py +0 -0
  120. {danceflow_stemlab-1.4.2 → danceflow_stemlab-1.6.1}/src/stemlab/analysis/loops.py +0 -0
  121. {danceflow_stemlab-1.4.2 → danceflow_stemlab-1.6.1}/src/stemlab/analysis/lyrics.py +0 -0
  122. {danceflow_stemlab-1.4.2 → danceflow_stemlab-1.6.1}/src/stemlab/analysis/midi/__init__.py +0 -0
  123. {danceflow_stemlab-1.4.2 → danceflow_stemlab-1.6.1}/src/stemlab/analysis/midi/adapters.py +0 -0
  124. {danceflow_stemlab-1.4.2 → danceflow_stemlab-1.6.1}/src/stemlab/analysis/midi/artifacts.py +0 -0
  125. {danceflow_stemlab-1.4.2 → danceflow_stemlab-1.6.1}/src/stemlab/analysis/midi/registry.py +0 -0
  126. {danceflow_stemlab-1.4.2 → danceflow_stemlab-1.6.1}/src/stemlab/analysis/midi/runner.py +0 -0
  127. {danceflow_stemlab-1.4.2 → danceflow_stemlab-1.6.1}/src/stemlab/analysis/midi/worker.py +0 -0
  128. {danceflow_stemlab-1.4.2 → danceflow_stemlab-1.6.1}/src/stemlab/analysis/phrase_loops.py +0 -0
  129. {danceflow_stemlab-1.4.2 → danceflow_stemlab-1.6.1}/src/stemlab/analysis/registry.py +0 -0
  130. {danceflow_stemlab-1.4.2 → danceflow_stemlab-1.6.1}/src/stemlab/analysis/rhythm.py +0 -0
  131. {danceflow_stemlab-1.4.2 → danceflow_stemlab-1.6.1}/src/stemlab/analysis/rudiment_matches.py +0 -0
  132. {danceflow_stemlab-1.4.2 → danceflow_stemlab-1.6.1}/src/stemlab/analysis/runner.py +0 -0
  133. {danceflow_stemlab-1.4.2 → danceflow_stemlab-1.6.1}/src/stemlab/analysis/semantic_audio.py +0 -0
  134. {danceflow_stemlab-1.4.2 → danceflow_stemlab-1.6.1}/src/stemlab/analysis/semantic_text.py +0 -0
  135. {danceflow_stemlab-1.4.2 → danceflow_stemlab-1.6.1}/src/stemlab/analysis/song_map.py +0 -0
  136. {danceflow_stemlab-1.4.2 → danceflow_stemlab-1.6.1}/src/stemlab/analysis/sonic.py +0 -0
  137. {danceflow_stemlab-1.4.2 → danceflow_stemlab-1.6.1}/src/stemlab/analysis/structure.py +0 -0
  138. {danceflow_stemlab-1.4.2 → danceflow_stemlab-1.6.1}/src/stemlab/analysis/tempo_regimes.py +0 -0
  139. {danceflow_stemlab-1.4.2 → danceflow_stemlab-1.6.1}/src/stemlab/analysis/transcription.py +0 -0
  140. {danceflow_stemlab-1.4.2 → danceflow_stemlab-1.6.1}/src/stemlab/audio.py +0 -0
  141. {danceflow_stemlab-1.4.2 → danceflow_stemlab-1.6.1}/src/stemlab/beats/__init__.py +0 -0
  142. {danceflow_stemlab-1.4.2 → danceflow_stemlab-1.6.1}/src/stemlab/beats/base.py +0 -0
  143. {danceflow_stemlab-1.4.2 → danceflow_stemlab-1.6.1}/src/stemlab/beats/beatnet.py +0 -0
  144. {danceflow_stemlab-1.4.2 → danceflow_stemlab-1.6.1}/src/stemlab/beats/beatthis.py +0 -0
  145. {danceflow_stemlab-1.4.2 → danceflow_stemlab-1.6.1}/src/stemlab/bootstrap.py +0 -0
  146. {danceflow_stemlab-1.4.2 → danceflow_stemlab-1.6.1}/src/stemlab/branding.py +0 -0
  147. {danceflow_stemlab-1.4.2 → danceflow_stemlab-1.6.1}/src/stemlab/canonical.py +0 -0
  148. {danceflow_stemlab-1.4.2 → danceflow_stemlab-1.6.1}/src/stemlab/clip_cli.py +0 -0
  149. {danceflow_stemlab-1.4.2 → danceflow_stemlab-1.6.1}/src/stemlab/clip_match.py +0 -0
  150. {danceflow_stemlab-1.4.2 → danceflow_stemlab-1.6.1}/src/stemlab/codex/__init__.py +0 -0
  151. {danceflow_stemlab-1.4.2 → danceflow_stemlab-1.6.1}/src/stemlab/codex/__main__.py +0 -0
  152. {danceflow_stemlab-1.4.2 → danceflow_stemlab-1.6.1}/src/stemlab/codex/bridge.py +0 -0
  153. {danceflow_stemlab-1.4.2 → danceflow_stemlab-1.6.1}/src/stemlab/codex/jobs.py +0 -0
  154. {danceflow_stemlab-1.4.2 → danceflow_stemlab-1.6.1}/src/stemlab/codex/paths.py +0 -0
  155. {danceflow_stemlab-1.4.2 → danceflow_stemlab-1.6.1}/src/stemlab/codex/server.py +0 -0
  156. {danceflow_stemlab-1.4.2 → danceflow_stemlab-1.6.1}/src/stemlab/codex/tasks.py +0 -0
  157. {danceflow_stemlab-1.4.2 → danceflow_stemlab-1.6.1}/src/stemlab/codex/timeline.py +0 -0
  158. {danceflow_stemlab-1.4.2 → danceflow_stemlab-1.6.1}/src/stemlab/codex/worker.py +0 -0
  159. {danceflow_stemlab-1.4.2 → danceflow_stemlab-1.6.1}/src/stemlab/cue_cli.py +0 -0
  160. {danceflow_stemlab-1.4.2 → danceflow_stemlab-1.6.1}/src/stemlab/cues.py +0 -0
  161. {danceflow_stemlab-1.4.2 → danceflow_stemlab-1.6.1}/src/stemlab/lyric_lrc.py +0 -0
  162. {danceflow_stemlab-1.4.2 → danceflow_stemlab-1.6.1}/src/stemlab/manifest.py +0 -0
  163. {danceflow_stemlab-1.4.2 → danceflow_stemlab-1.6.1}/src/stemlab/models.py +0 -0
  164. {danceflow_stemlab-1.4.2 → danceflow_stemlab-1.6.1}/src/stemlab/separators/__init__.py +0 -0
  165. {danceflow_stemlab-1.4.2 → danceflow_stemlab-1.6.1}/src/stemlab/separators/base.py +0 -0
  166. {danceflow_stemlab-1.4.2 → danceflow_stemlab-1.6.1}/src/stemlab/separators/bsroformer.py +0 -0
  167. {danceflow_stemlab-1.4.2 → danceflow_stemlab-1.6.1}/src/stemlab/separators/common.py +0 -0
  168. {danceflow_stemlab-1.4.2 → danceflow_stemlab-1.6.1}/src/stemlab/separators/demucs.py +0 -0
  169. {danceflow_stemlab-1.4.2 → danceflow_stemlab-1.6.1}/src/stemlab/separators/openunmix.py +0 -0
  170. {danceflow_stemlab-1.4.2 → danceflow_stemlab-1.6.1}/src/stemlab/separators/scnet.py +0 -0
  171. {danceflow_stemlab-1.4.2 → danceflow_stemlab-1.6.1}/src/stemlab/server.py +0 -0
  172. {danceflow_stemlab-1.4.2 → danceflow_stemlab-1.6.1}/src/stemlab/sonic_visualiser.py +0 -0
  173. {danceflow_stemlab-1.4.2 → danceflow_stemlab-1.6.1}/src/stemlab/spectrogram.py +0 -0
  174. {danceflow_stemlab-1.4.2 → danceflow_stemlab-1.6.1}/src/stemlab/spectrogram_repair.py +0 -0
  175. {danceflow_stemlab-1.4.2 → danceflow_stemlab-1.6.1}/src/stemlab/speech.py +0 -0
  176. {danceflow_stemlab-1.4.2 → danceflow_stemlab-1.6.1}/src/stemlab/types.py +0 -0
  177. {danceflow_stemlab-1.4.2 → danceflow_stemlab-1.6.1}/src/stemlab/util.py +0 -0
  178. {danceflow_stemlab-1.4.2 → danceflow_stemlab-1.6.1}/src/stemlab/vamp.py +0 -0
  179. {danceflow_stemlab-1.4.2 → danceflow_stemlab-1.6.1}/src/stemlab/vamp_runtime.py +0 -0
  180. {danceflow_stemlab-1.4.2 → danceflow_stemlab-1.6.1}/src/stemlab/web/arcadians-cover.jpg +0 -0
  181. {danceflow_stemlab-1.4.2 → danceflow_stemlab-1.6.1}/src/stemlab/web/arcadians-reference.json +0 -0
  182. {danceflow_stemlab-1.4.2 → danceflow_stemlab-1.6.1}/src/stemlab/web/index.html +0 -0
  183. {danceflow_stemlab-1.4.2 → danceflow_stemlab-1.6.1}/src/stemlab/web/style.css +0 -0
  184. {danceflow_stemlab-1.4.2 → danceflow_stemlab-1.6.1}/src/stemlab/webui.py +0 -0
  185. {danceflow_stemlab-1.4.2 → danceflow_stemlab-1.6.1}/src/stemlab/word_alignment.py +0 -0
  186. {danceflow_stemlab-1.4.2 → danceflow_stemlab-1.6.1}/tests/test_analysis_registry.py +0 -0
  187. {danceflow_stemlab-1.4.2 → danceflow_stemlab-1.6.1}/tests/test_arcadians_fixture.py +0 -0
  188. {danceflow_stemlab-1.4.2 → danceflow_stemlab-1.6.1}/tests/test_arcadians_rudiments.py +0 -0
  189. {danceflow_stemlab-1.4.2 → danceflow_stemlab-1.6.1}/tests/test_audio_normalization.py +0 -0
  190. {danceflow_stemlab-1.4.2 → danceflow_stemlab-1.6.1}/tests/test_bar_phase.py +0 -0
  191. {danceflow_stemlab-1.4.2 → danceflow_stemlab-1.6.1}/tests/test_beat_consensus.py +0 -0
  192. {danceflow_stemlab-1.4.2 → danceflow_stemlab-1.6.1}/tests/test_beat_this_bootstrap.py +0 -0
  193. {danceflow_stemlab-1.4.2 → danceflow_stemlab-1.6.1}/tests/test_beatnet_bootstrap.py +0 -0
  194. {danceflow_stemlab-1.4.2 → danceflow_stemlab-1.6.1}/tests/test_beatnet_compat.py +0 -0
  195. {danceflow_stemlab-1.4.2 → danceflow_stemlab-1.6.1}/tests/test_branding.py +0 -0
  196. {danceflow_stemlab-1.4.2 → danceflow_stemlab-1.6.1}/tests/test_bsroformer_adapter.py +0 -0
  197. {danceflow_stemlab-1.4.2 → danceflow_stemlab-1.6.1}/tests/test_canonical.py +0 -0
  198. {danceflow_stemlab-1.4.2 → danceflow_stemlab-1.6.1}/tests/test_canonical_extended.py +0 -0
  199. {danceflow_stemlab-1.4.2 → danceflow_stemlab-1.6.1}/tests/test_clip_match.py +0 -0
  200. {danceflow_stemlab-1.4.2 → danceflow_stemlab-1.6.1}/tests/test_codex_bridge.py +0 -0
  201. {danceflow_stemlab-1.4.2 → danceflow_stemlab-1.6.1}/tests/test_codex_jobs.py +0 -0
  202. {danceflow_stemlab-1.4.2 → danceflow_stemlab-1.6.1}/tests/test_codex_package.py +0 -0
  203. {danceflow_stemlab-1.4.2 → danceflow_stemlab-1.6.1}/tests/test_codex_protocol.py +0 -0
  204. {danceflow_stemlab-1.4.2 → danceflow_stemlab-1.6.1}/tests/test_codex_timeline.py +0 -0
  205. {danceflow_stemlab-1.4.2 → danceflow_stemlab-1.6.1}/tests/test_cue_integration.py +0 -0
  206. {danceflow_stemlab-1.4.2 → danceflow_stemlab-1.6.1}/tests/test_cues.py +0 -0
  207. {danceflow_stemlab-1.4.2 → danceflow_stemlab-1.6.1}/tests/test_deep_harmony.py +0 -0
  208. {danceflow_stemlab-1.4.2 → danceflow_stemlab-1.6.1}/tests/test_deep_lyrics.py +0 -0
  209. {danceflow_stemlab-1.4.2 → danceflow_stemlab-1.6.1}/tests/test_deep_sonic_rhythm.py +0 -0
  210. {danceflow_stemlab-1.4.2 → danceflow_stemlab-1.6.1}/tests/test_distribution_identity.py +0 -0
  211. {danceflow_stemlab-1.4.2 → danceflow_stemlab-1.6.1}/tests/test_docker_contract.py +0 -0
  212. {danceflow_stemlab-1.4.2 → danceflow_stemlab-1.6.1}/tests/test_evidence_models.py +0 -0
  213. {danceflow_stemlab-1.4.2 → danceflow_stemlab-1.6.1}/tests/test_loop_integration.py +0 -0
  214. {danceflow_stemlab-1.4.2 → danceflow_stemlab-1.6.1}/tests/test_loops.py +0 -0
  215. {danceflow_stemlab-1.4.2 → danceflow_stemlab-1.6.1}/tests/test_lyric_lrc.py +0 -0
  216. {danceflow_stemlab-1.4.2 → danceflow_stemlab-1.6.1}/tests/test_manifest.py +0 -0
  217. {danceflow_stemlab-1.4.2 → danceflow_stemlab-1.6.1}/tests/test_midi_adapters.py +0 -0
  218. {danceflow_stemlab-1.4.2 → danceflow_stemlab-1.6.1}/tests/test_midi_extraction.py +0 -0
  219. {danceflow_stemlab-1.4.2 → danceflow_stemlab-1.6.1}/tests/test_midi_integration.py +0 -0
  220. {danceflow_stemlab-1.4.2 → danceflow_stemlab-1.6.1}/tests/test_midi_registry.py +0 -0
  221. {danceflow_stemlab-1.4.2 → danceflow_stemlab-1.6.1}/tests/test_models.py +0 -0
  222. {danceflow_stemlab-1.4.2 → danceflow_stemlab-1.6.1}/tests/test_phrase_loops.py +0 -0
  223. {danceflow_stemlab-1.4.2 → danceflow_stemlab-1.6.1}/tests/test_repository_hygiene.py +0 -0
  224. {danceflow_stemlab-1.4.2 → danceflow_stemlab-1.6.1}/tests/test_rudiment_matches.py +0 -0
  225. {danceflow_stemlab-1.4.2 → danceflow_stemlab-1.6.1}/tests/test_server.py +0 -0
  226. {danceflow_stemlab-1.4.2 → danceflow_stemlab-1.6.1}/tests/test_song_map.py +0 -0
  227. {danceflow_stemlab-1.4.2 → danceflow_stemlab-1.6.1}/tests/test_sonic_visualiser.py +0 -0
  228. {danceflow_stemlab-1.4.2 → danceflow_stemlab-1.6.1}/tests/test_sonic_visualiser_workspace.py +0 -0
  229. {danceflow_stemlab-1.4.2 → danceflow_stemlab-1.6.1}/tests/test_spectrogram.py +0 -0
  230. {danceflow_stemlab-1.4.2 → danceflow_stemlab-1.6.1}/tests/test_speech_repetition.py +0 -0
  231. {danceflow_stemlab-1.4.2 → danceflow_stemlab-1.6.1}/tests/test_vamp.py +0 -0
  232. {danceflow_stemlab-1.4.2 → danceflow_stemlab-1.6.1}/tests/test_vamp_runtime.py +0 -0
  233. {danceflow_stemlab-1.4.2 → danceflow_stemlab-1.6.1}/tests/test_word_alignment.py +0 -0
@@ -0,0 +1 @@
1
+ b89d1b80fcd8a8d8e02394ec718b6f4debd97b94
@@ -0,0 +1,230 @@
1
+ name: Arcadians release demo
2
+
3
+ on:
4
+ workflow_call:
5
+ workflow_dispatch:
6
+ pull_request:
7
+ paths:
8
+ - '.github/workflows/arcadians-demo.yml'
9
+ - '.github/workflows/release.yml'
10
+ - '.github/dancerudiments-recording-ref'
11
+ - 'scripts/build_arcadians_demo.py'
12
+ - 'scripts/check_arcadians_audio.py'
13
+ - 'scripts/arcadians_http.py'
14
+ - '.github/workflows/arcadians-timeline.yml'
15
+ - 'scripts/build_arcadians_timeline.py'
16
+ - 'scripts/build_arcadians_pair_demos.py'
17
+ - 'scripts/build_arcadians_fourier_demo.py'
18
+ - 'scripts/recording_downloads.py'
19
+ - 'src/stemlab/analysis/frequency_bands.py'
20
+ - 'tests/test_arcadians_fourier_demo.py'
21
+ - 'scripts/check_viewer_build.py'
22
+ - 'scripts/timeline_display_checks.py'
23
+ - 'web-client/**'
24
+ - '.github/viewer-*.json'
25
+ - 'scripts/viewer_releases.py'
26
+ - 'package*.json'
27
+ - 'src/stemlab/analysis/rudiment_pairs.py'
28
+ - 'src/stemlab/recording_cli.py'
29
+ - 'tests/test_rudiment_pairs.py'
30
+ - 'tests/test_arcadians_pair_demos.py'
31
+ - 'scripts/check_torchaudio_decode.py'
32
+ - 'scripts/check_semantic_runtime.py'
33
+ - 'tests/test_arcadians_runtime.py'
34
+ - 'docker/**'
35
+ - 'scripts/check_arcadians_timeline.py'
36
+ - 'scripts/assemble_arcadians_site.py'
37
+ - 'src/stemlab/static_timeline.py'
38
+ - 'src/stemlab/web/**'
39
+ - 'tests/test_static_timeline.py'
40
+ - 'tests/test_arcadians_timeline.py'
41
+ - 'tests/test_arcadians_http.py'
42
+ - 'src/stemlab/analysis/rudiment_recordings.py'
43
+ - 'src/stemlab/analysis/rudiment_batch.py'
44
+ - 'src/stemlab/beats/**'
45
+ - 'src/stemlab/pipeline.py'
46
+ - 'tests/test_beat_inputs.py'
47
+ - 'tests/test_arcadians_release_demo.py'
48
+ - 'examples/arcadians/**'
49
+
50
+ permissions:
51
+ contents: read
52
+
53
+ jobs:
54
+ static-regressions:
55
+ name: Check timeline export and combined publication contracts
56
+ runs-on: ubuntu-24.04
57
+ timeout-minutes: 15
58
+ steps:
59
+ - uses: actions/checkout@v7
60
+ with:
61
+ persist-credentials: false
62
+ - uses: actions/setup-python@v7
63
+ with:
64
+ python-version: '3.11'
65
+ - name: Install lightweight test dependencies, without model downloads
66
+ run: |
67
+ python -m pip install numpy scipy soundfile matplotlib fastapi rich 'typer>=0.12' platformdirs pytest pyyaml ruff
68
+ python -m pip install --no-deps -e .
69
+ - name: Require latest stable released viewers and rebuilt controls before inference
70
+ env:
71
+ GH_TOKEN: ${{ github.token }}
72
+ run: python scripts/check_viewer_build.py --latest
73
+ - name: Lint before expensive analysis
74
+ run: python -m ruff check src tests scripts
75
+ - name: Test static timeline, completeness validation, HTTP and publication
76
+ run: |
77
+ python -m pytest tests/test_static_timeline.py tests/test_arcadians_timeline.py tests/test_arcadians_http.py tests/test_arcadians_pages_publish.py tests/test_arcadians_runtime.py tests/test_beat_inputs.py tests/test_beat_consensus.py tests/test_viewer_controls.py
78
+
79
+ timeline:
80
+ if: github.event_name != 'pull_request'
81
+ needs: static-regressions
82
+ name: Complete Arcadians analysis and static timeline
83
+ uses: ./.github/workflows/arcadians-timeline.yml
84
+ permissions:
85
+ contents: read
86
+
87
+ build:
88
+ needs: timeline
89
+ name: Generate and audition full Arcadians batch
90
+ runs-on: ubuntu-24.04
91
+ timeout-minutes: 30
92
+ env:
93
+ STEMLAB_REQUIRE_RECORDINGS: '1'
94
+ DANCERUDIMENTS_REQUIRE_NATIVE: '1'
95
+ PYTHONUNBUFFERED: '1'
96
+ steps:
97
+ - uses: actions/checkout@v7
98
+ with:
99
+ persist-credentials: false
100
+ - uses: actions/setup-python@v7
101
+ with:
102
+ python-version: '3.11'
103
+ - name: Read the same verified release snapshot used by the timeline
104
+ id: companion
105
+ shell: bash
106
+ run: python scripts/check_viewer_build.py --outputs "$GITHUB_OUTPUT"
107
+ - uses: actions/checkout@v7
108
+ with:
109
+ repository: kieransimkin/DanceRudiments
110
+ ref: ${{ steps.companion.outputs.ref }}
111
+ path: .recording-dancerudiments
112
+ persist-credentials: false
113
+ - name: Install published native companion and lightweight recording dependencies
114
+ run: |
115
+ sudo apt-get update
116
+ sudo apt-get install --yes libsndfile1 ffmpeg
117
+ python -m pip install numpy scipy 'soundfile>=0.12' matplotlib rich 'typer>=0.12' platformdirs pytest pyyaml playwright
118
+ python scripts/viewer_releases.py install
119
+ python -m pip install --no-deps -e .
120
+ python -c "from dancerudiments import SampledRecording; from dancerudiments_authoring.harness import build_recording_harness, HARNESS_DISPLAY_API_VERSION; assert HARNESS_DISPLAY_API_VERSION == 1"
121
+ - name: Run release-demo and recording regression tests
122
+ run: python -m pytest tests/test_arcadians_http.py tests/test_arcadians_release_demo.py tests/test_rudiment_recordings.py tests/test_frequency_bands.py tests/test_rudiment_matches.py tests/test_rudiment_pairs.py tests/test_arcadians_pair_demos.py tests/test_arcadians_fourier_demo.py
123
+ - name: Generate 48 full-song movements with the original MP3 included
124
+ env:
125
+ RELEASE_LABEL: ${{ github.ref_name }}
126
+ COMPANION_SHA: ${{ steps.companion.outputs.ref }}
127
+ shell: bash
128
+ run: |
129
+ # PR refs contain slashes; preview labels are not release claims.
130
+ LABEL="$RELEASE_LABEL"
131
+ if [[ "$GITHUB_EVENT_NAME" == 'pull_request' ]]; then LABEL="pr-${{ github.event.number }}"; fi
132
+ python scripts/build_arcadians_demo.py build \
133
+ --output dist/arcadians-pages \
134
+ --source-commit "$(git rev-parse HEAD)" \
135
+ --companion-commit "$COMPANION_SHA" \
136
+ --companion-license .recording-dancerudiments/LICENSE \
137
+ --release-tag "$LABEL"
138
+ - name: Install Chromium
139
+ run: python -m playwright install --with-deps chromium
140
+ - name: Run companion native recording and shared harness regressions
141
+ run: python -m unittest discover -s .recording-dancerudiments/tests/python -p test_recording.py -v
142
+ - name: Require audible source data and synchronized playback under the Pages URL prefix
143
+ run: |
144
+ python scripts/check_arcadians_audio.py dist/arcadians-pages \
145
+ --report dist/arcadians-audio-browser.json --screenshot dist/arcadians-comparison.png
146
+ python scripts/build_arcadians_demo.py verify dist/arcadians-pages
147
+ - name: Retrieve the same analysis run's exact float stems, outside the public site
148
+ uses: actions/download-artifact@v5
149
+ with:
150
+ name: stemlab-arcadians-recording-sources
151
+ path: recording-sources
152
+ - name: Generate stem-pair and average-comparison pages without rerunning separation
153
+ env:
154
+ COMPANION_SHA: ${{ steps.companion.outputs.ref }}
155
+ run: |
156
+ python scripts/build_arcadians_pair_demos.py --sources recording-sources \
157
+ --site dist/arcadians-pages --source-commit "$GITHUB_SHA" \
158
+ --companion-commit "$COMPANION_SHA" --companion-license .recording-dancerudiments/LICENSE
159
+ - name: Verify both additional galleries with original audio and native samples
160
+ run: |
161
+ python scripts/check_arcadians_audio.py dist/arcadians-pages --gallery arcadians-stems \
162
+ --report dist/arcadians-stems-audio-browser.json --screenshot dist/arcadians-stems-comparison.png
163
+ python scripts/check_arcadians_audio.py dist/arcadians-pages --gallery arcadians-averages \
164
+ --report dist/arcadians-averages-audio-browser.json --screenshot dist/arcadians-averages-comparison.png
165
+ - name: Retrieve the complete browser-validated timeline
166
+ uses: actions/download-artifact@v5
167
+ with:
168
+ name: stemlab-arcadians-timeline-pages
169
+ path: timeline-site
170
+ - name: Generate all six full-master Fourier resolutions through the shared recording API
171
+ env:
172
+ COMPANION_SHA: ${{ steps.companion.outputs.ref }}
173
+ run: |
174
+ python scripts/build_arcadians_fourier_demo.py --site dist/arcadians-pages \
175
+ --source-commit "$GITHUB_SHA" --companion-commit "$COMPANION_SHA" \
176
+ --companion-license .recording-dancerudiments/LICENSE
177
+ - name: Verify every Fourier resolution, full-dimensional native samples, bars and audio transport
178
+ shell: bash
179
+ run: |
180
+ for BANDS in 4 8 16 32 64 128; do
181
+ python scripts/check_arcadians_audio.py dist/arcadians-pages --gallery arcadians-fourier --channels "$BANDS" \
182
+ --report "dist/arcadians-fourier-${BANDS}-audio-browser.json" --screenshot "dist/arcadians-fourier-${BANDS}.png"
183
+ done
184
+ - name: Retrieve timeline QA separately, never into the public site
185
+ uses: actions/download-artifact@v5
186
+ with:
187
+ name: stemlab-arcadians-timeline-qa
188
+ path: dist/timeline-qa
189
+ - name: Assemble all five verified viewers into one Pages site
190
+ run: |
191
+ python scripts/assemble_arcadians_site.py --site dist/arcadians-pages \
192
+ --timeline timeline-site --qa dist/timeline-qa/arcadians-timeline-browser.json \
193
+ --source-sha "$GITHUB_SHA"
194
+ cp dist/timeline-qa/arcadians-timeline-browser.json dist/arcadians-timeline-browser.json
195
+ - name: Require matching HTTP QA for the complete five-viewer site
196
+ run: |
197
+ python scripts/publish_arcadians_pages.py verify --site dist/arcadians-pages \
198
+ --qa dist/arcadians-audio-browser.json --source-sha "$GITHUB_SHA"
199
+ - name: Freeze the tested public site as release assets
200
+ run: |
201
+ python scripts/build_arcadians_demo.py package dist/arcadians-pages --output dist/arcadians-release
202
+ - name: Upload only the verified public site
203
+ uses: actions/upload-artifact@v7
204
+ with:
205
+ name: stemlab-arcadians-pages
206
+ path: dist/arcadians-pages/
207
+ include-hidden-files: true
208
+ if-no-files-found: error
209
+ - name: Upload Arcadians release archive and provenance
210
+ uses: actions/upload-artifact@v7
211
+ with:
212
+ name: stemlab-arcadians-release-assets
213
+ path: dist/arcadians-release/*
214
+ if-no-files-found: error
215
+ - name: Retain browser validation evidence separately from the public site
216
+ if: always()
217
+ uses: actions/upload-artifact@v7
218
+ with:
219
+ name: stemlab-arcadians-browser-qa
220
+ path: |
221
+ dist/arcadians-comparison.png
222
+ dist/arcadians-audio-browser.json
223
+ dist/arcadians-timeline-browser.json
224
+ dist/arcadians-stems-audio-browser.json
225
+ dist/arcadians-averages-audio-browser.json
226
+ dist/arcadians-stems-comparison.png
227
+ dist/arcadians-averages-comparison.png
228
+ dist/arcadians-fourier-*-audio-browser.json
229
+ dist/arcadians-fourier-*.png
230
+ if-no-files-found: warn
@@ -0,0 +1,111 @@
1
+ name: Publish Arcadians demo to Pages
2
+
3
+ on:
4
+ workflow_dispatch:
5
+ inputs:
6
+ demo_run_id:
7
+ description: 'Successful Arcadians demo run ID; blank selects the latest on main'
8
+ type: string
9
+ required: false
10
+ default: ''
11
+ workflow_run:
12
+ workflows: ['Arcadians release demo']
13
+ branches: [main]
14
+ types: [completed]
15
+
16
+ permissions:
17
+ contents: read
18
+
19
+ jobs:
20
+ publish:
21
+ # Explicit manual publication needs no package release or opt-in variable.
22
+ # Automatic publication retains the existing Pages opt-in. Never publish PRs.
23
+ if: >-
24
+ github.repository == 'kieransimkin/stemlab' &&
25
+ ((github.event_name == 'workflow_dispatch' && github.ref == 'refs/heads/main') ||
26
+ (github.event_name == 'workflow_run' && vars.STEMLAB_PAGES_ENABLED == 'true' &&
27
+ github.event.workflow_run.conclusion == 'success' &&
28
+ github.event.workflow_run.event == 'workflow_dispatch' &&
29
+ github.event.workflow_run.head_branch == 'main' &&
30
+ github.event.workflow_run.head_repository.full_name == 'kieransimkin/stemlab'))
31
+ runs-on: ubuntu-24.04
32
+ timeout-minutes: 15
33
+ concurrency:
34
+ group: stemlab-pages
35
+ cancel-in-progress: false
36
+ permissions:
37
+ contents: read
38
+ actions: read
39
+ pages: write
40
+ id-token: write
41
+ environment:
42
+ name: github-pages
43
+ url: ${{ steps.deployment.outputs.page_url }}
44
+ steps:
45
+ # On workflow_run, github.sha is the trusted default-branch revision,
46
+ # not the triggering run's code. Artifacts are data, never executed.
47
+ - uses: actions/checkout@v7
48
+ with:
49
+ ref: ${{ github.sha }}
50
+ persist-credentials: false
51
+ - uses: actions/setup-python@v7
52
+ with:
53
+ python-version: '3.11'
54
+ - name: Check Pages is enabled and configured for Actions
55
+ id: pages
56
+ uses: actions/configure-pages@v5
57
+ continue-on-error: true
58
+ - name: Explain missing Pages configuration
59
+ if: steps.pages.outcome == 'failure'
60
+ run: |
61
+ echo '::error::Enable Settings > Pages > Source > GitHub Actions, then run this workflow again. The github-pages environment must permit main. No package release is required.'
62
+ exit 1
63
+ - name: Select successful same-repository demo and its exact artifacts
64
+ id: source
65
+ env:
66
+ GH_TOKEN: ${{ github.token }}
67
+ DEMO_RUN_ID: ${{ github.event_name == 'workflow_run' && github.event.workflow_run.id || inputs.demo_run_id }}
68
+ run: python scripts/publish_arcadians_pages.py select --run-id "$DEMO_RUN_ID"
69
+ - name: Download verified public site from selected run
70
+ uses: actions/download-artifact@v5
71
+ with:
72
+ artifact-ids: ${{ steps.source.outputs.site_artifact_id }}
73
+ merge-multiple: true
74
+ run-id: ${{ steps.source.outputs.run_id }}
75
+ github-token: ${{ github.token }}
76
+ path: public-site
77
+ - name: Download that run's browser evidence separately
78
+ uses: actions/download-artifact@v5
79
+ with:
80
+ artifact-ids: ${{ steps.source.outputs.qa_artifact_id }}
81
+ merge-multiple: true
82
+ run-id: ${{ steps.source.outputs.run_id }}
83
+ github-token: ${{ github.token }}
84
+ path: browser-qa
85
+ - name: Verify source commit, real MP3, public allowlist and successful HTTP browser QA
86
+ env:
87
+ SOURCE_SHA: ${{ steps.source.outputs.source_sha }}
88
+ run: |
89
+ python scripts/publish_arcadians_pages.py verify \
90
+ --site public-site --qa browser-qa/arcadians-audio-browser.json --source-sha "$SOURCE_SHA"
91
+ - name: Upload only the verified public directory to Pages
92
+ uses: actions/upload-pages-artifact@v4
93
+ with:
94
+ path: public-site
95
+ - name: Deploy Arcadians visualizer and original MP3
96
+ id: deployment
97
+ uses: actions/deploy-pages@v4
98
+ - name: Require the public URL to serve this build and seekable audio
99
+ env:
100
+ PAGE_URL: ${{ steps.deployment.outputs.page_url }}
101
+ SOURCE_SHA: ${{ steps.source.outputs.source_sha }}
102
+ run: |
103
+ python scripts/publish_arcadians_pages.py live --url "$PAGE_URL" \
104
+ --site public-site --source-sha "$SOURCE_SHA"
105
+ echo "### Published Arcadians timeline and movement demos" >> "$GITHUB_STEP_SUMMARY"
106
+ echo "${PAGE_URL%/}/timeline/arcadians/" >> "$GITHUB_STEP_SUMMARY"
107
+ echo "${PAGE_URL%/}/arcadians-stems/" >> "$GITHUB_STEP_SUMMARY"
108
+ echo "${PAGE_URL%/}/arcadians-averages/" >> "$GITHUB_STEP_SUMMARY"
109
+ echo "${PAGE_URL%/}/arcadians/" >> "$GITHUB_STEP_SUMMARY"
110
+ echo "${PAGE_URL%/}/arcadians-fourier/" >> "$GITHUB_STEP_SUMMARY"
111
+ echo "Source: $SOURCE_SHA. Public HTML and audio range request verified." >> "$GITHUB_STEP_SUMMARY"
@@ -0,0 +1,94 @@
1
+ name: Arcadians complete analysis timeline
2
+
3
+ on:
4
+ workflow_call:
5
+ workflow_dispatch:
6
+
7
+ permissions:
8
+ contents: read
9
+
10
+ jobs:
11
+ build:
12
+ name: Analyse the full song and test the static React timeline
13
+ runs-on: ubuntu-24.04
14
+ timeout-minutes: 330
15
+ env:
16
+ PYTHONUNBUFFERED: '1'
17
+ steps:
18
+ - uses: actions/checkout@v7
19
+ with:
20
+ persist-credentials: false
21
+ - uses: actions/setup-python@v7
22
+ with:
23
+ python-version: '3.11'
24
+ - name: Require the latest released-viewer build before Docker
25
+ env:
26
+ GH_TOKEN: ${{ github.token }}
27
+ run: python scripts/check_viewer_build.py --latest
28
+ - name: Build the existing locked StemLab analysis environment for CPU
29
+ # The existing Dockerfile installs the verified Sonic Annotator/Vamp stack.
30
+ # No interactive installers, host GPU or non-commercial MuQ inference.
31
+ run: |
32
+ docker build -f docker/Dockerfile \
33
+ --build-arg TORCH_INDEX_URL=https://download.pytorch.org/whl/cpu \
34
+ --build-arg STEMLAB_BUILD_REF="$GITHUB_SHA" \
35
+ -t stemlab-timeline:ci .
36
+ - name: Run the complete core recipe on the original Arcadians MP3
37
+ # Model downloads use upstream registries, as in the normal local pipeline.
38
+ # Music is mounted because .dockerignore intentionally excludes audio.
39
+ run: |
40
+ mkdir -p "$RUNNER_TEMP/arcadians-timeline"
41
+ docker run --rm --entrypoint python \
42
+ -e OMP_NUM_THREADS=2 -e MKL_NUM_THREADS=2 \
43
+ -v "$RUNNER_TEMP/arcadians-timeline:/work" \
44
+ -v "$GITHUB_WORKSPACE/examples/arcadians:/opt/stemlab/examples/arcadians:ro" \
45
+ stemlab-timeline:ci /opt/stemlab/scripts/build_arcadians_timeline.py \
46
+ --results /work/analysis --output /work/site --source-commit "$GITHUB_SHA" \
47
+ --recording-sources /work/recording-sources
48
+ - name: Restore runner ownership of generated files
49
+ # Atomic JSON writes use 0600. Docker runs as root; transfer ownership,
50
+ # not world-readable permissions, even if analysis failed part-way.
51
+ if: always()
52
+ shell: bash
53
+ run: |
54
+ output="$RUNNER_TEMP/arcadians-timeline"
55
+ if [ -d "$output" ] && [ ! -L "$output" ]; then
56
+ sudo chown -R --no-dereference "$(id -u):$(id -g)" "$output"
57
+ fi
58
+ - name: Install browser verification tools only
59
+ run: |
60
+ python -m pip install numpy scipy soundfile matplotlib fastapi rich 'typer>=0.12' platformdirs pytest playwright
61
+ python -m pip install --no-deps -e .
62
+ python -m playwright install --with-deps chromium
63
+ - name: Require working static lanes, audio clock, seeking, zoom and saved-loop playback
64
+ run: |
65
+ python scripts/check_arcadians_timeline.py "$RUNNER_TEMP/arcadians-timeline/site" \
66
+ --require-core --report "$RUNNER_TEMP/arcadians-timeline/qa/arcadians-timeline-browser.json"
67
+ - name: Upload the tested timeline for the combined Pages build
68
+ uses: actions/upload-artifact@v7
69
+ with:
70
+ name: stemlab-arcadians-timeline-pages
71
+ path: ${{ runner.temp }}/arcadians-timeline/site/
72
+ if-no-files-found: error
73
+ - name: Share exact master and six float stems with the pair-demo job
74
+ uses: actions/upload-artifact@v7
75
+ with:
76
+ name: stemlab-arcadians-recording-sources
77
+ path: ${{ runner.temp }}/arcadians-timeline/recording-sources/
78
+ retention-days: 7
79
+ if-no-files-found: error
80
+ - name: Upload separate timeline browser evidence
81
+ if: always()
82
+ uses: actions/upload-artifact@v7
83
+ with:
84
+ name: stemlab-arcadians-timeline-qa
85
+ path: ${{ runner.temp }}/arcadians-timeline/qa/
86
+ if-no-files-found: warn
87
+ - name: Retain original analysis artifacts, not models or runtime caches
88
+ if: always()
89
+ uses: actions/upload-artifact@v7
90
+ with:
91
+ name: stemlab-arcadians-complete-analysis
92
+ path: ${{ runner.temp }}/arcadians-timeline/analysis/
93
+ retention-days: 7
94
+ if-no-files-found: warn
@@ -0,0 +1,72 @@
1
+ name: Recording batch and shared visualizer
2
+ on:
3
+ pull_request:
4
+ push:
5
+ branches: [main]
6
+ workflow_dispatch:
7
+ permissions:
8
+ contents: read
9
+ jobs:
10
+ recordings:
11
+ runs-on: ${{ matrix.os }}
12
+ timeout-minutes: 25
13
+ strategy:
14
+ fail-fast: false
15
+ matrix:
16
+ include:
17
+ - os: ubuntu-latest
18
+ python: '3.10'
19
+ - os: windows-latest
20
+ python: '3.13'
21
+ env:
22
+ STEMLAB_REQUIRE_RECORDINGS: '1'
23
+ DANCERUDIMENTS_REQUIRE_NATIVE: '1'
24
+ defaults:
25
+ run:
26
+ shell: bash
27
+ steps:
28
+ - uses: actions/checkout@v7
29
+ - uses: actions/setup-python@v7
30
+ with:
31
+ python-version: ${{ matrix.python }}
32
+ - name: Require the latest stable published companion releases
33
+ id: companion
34
+ env:
35
+ GH_TOKEN: ${{ github.token }}
36
+ run: python scripts/check_viewer_build.py --latest --outputs "$GITHUB_OUTPUT"
37
+ - uses: actions/checkout@v7
38
+ with:
39
+ repository: kieransimkin/DanceRudiments
40
+ ref: ${{ steps.companion.outputs.ref }}
41
+ path: .recording-dancerudiments
42
+ - name: Report exact companion revision
43
+ run: git -C .recording-dancerudiments rev-parse HEAD
44
+ - name: Install the verified published wheel and lightweight test dependencies
45
+ run: |
46
+ python -m pip install numpy scipy soundfile matplotlib rich "typer>=0.12" platformdirs pytest pyyaml playwright
47
+ python scripts/viewer_releases.py install
48
+ python -m pip install --no-deps -e .
49
+ - name: Require new shared APIs and native class; no fallback/skip
50
+ run: python -c "from dancerudiments_authoring.harness import build_recording_harness, HARNESS_DISPLAY_API_VERSION; assert HARNESS_DISPLAY_API_VERSION == 1; from dancerudiments import SampledRecording"
51
+ - name: DSP, routing, mandatory BPM, native playback and matching regressions
52
+ run: python -m pytest tests/test_rudiment_recordings.py tests/test_frequency_bands.py tests/test_rudiment_matches.py tests/test_rudiment_pairs.py tests/test_arcadians_pair_demos.py tests/test_arcadians_fourier_demo.py
53
+ - name: Generate master/stem synthetic examples and a 48-candidate batch
54
+ run: python examples/recordings/generate_demo.py --output recording-demo
55
+ - name: Install Chromium
56
+ run: python -m playwright install --with-deps chromium
57
+ - name: Verify real local-file comparison, native samples, audio clock and reviews
58
+ run: python .recording-dancerudiments/tools/test_recording_harness.py recording-demo/batch/index.html --screenshot recording-comparison.png
59
+ - name: Verify new stem-pair and smoothing comparison harnesses
60
+ run: |
61
+ python .recording-dancerudiments/tools/test_recording_harness.py recording-demo/stem-pairs/index.html --screenshot stem-pairs-comparison.png
62
+ python .recording-dancerudiments/tools/test_recording_harness.py recording-demo/averages/index.html --screenshot averages-comparison.png
63
+ - uses: actions/upload-artifact@v7
64
+ if: always()
65
+ with:
66
+ name: recordings-${{ matrix.os }}-${{ matrix.python }}
67
+ path: |
68
+ recording-demo/
69
+ recording-comparison.png
70
+ stem-pairs-comparison.png
71
+ averages-comparison.png
72
+ if-no-files-found: warn