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.
- danceflow_stemlab-1.6.1/.github/dancerudiments-recording-ref +1 -0
- danceflow_stemlab-1.6.1/.github/workflows/arcadians-demo.yml +230 -0
- danceflow_stemlab-1.6.1/.github/workflows/arcadians-pages.yml +111 -0
- danceflow_stemlab-1.6.1/.github/workflows/arcadians-timeline.yml +94 -0
- danceflow_stemlab-1.6.1/.github/workflows/recordings.yml +72 -0
- {danceflow_stemlab-1.4.2 → danceflow_stemlab-1.6.1}/.github/workflows/release.yml +90 -36
- danceflow_stemlab-1.6.1/AGENTS.md +54 -0
- danceflow_stemlab-1.6.1/MANIFEST.in +61 -0
- {danceflow_stemlab-1.4.2 → danceflow_stemlab-1.6.1}/PKG-INFO +312 -6
- {danceflow_stemlab-1.4.2 → danceflow_stemlab-1.6.1}/README.md +308 -0
- danceflow_stemlab-1.6.1/docs/arcadians-release-demo.md +318 -0
- danceflow_stemlab-1.6.1/docs/arcadians-timeline.md +213 -0
- danceflow_stemlab-1.6.1/docs/beat-inputs.md +58 -0
- danceflow_stemlab-1.6.1/docs/recording-pairs.md +161 -0
- danceflow_stemlab-1.6.1/docs/released-viewers.md +214 -0
- danceflow_stemlab-1.6.1/docs/rudiment-recordings.md +336 -0
- danceflow_stemlab-1.6.1/docs/screenshots/recording-comparison.png +0 -0
- danceflow_stemlab-1.6.1/docs/viewer-controls.md +100 -0
- danceflow_stemlab-1.6.1/examples/recordings/generate_demo.py +68 -0
- danceflow_stemlab-1.6.1/examples/recordings/generate_frequency_demo.py +35 -0
- {danceflow_stemlab-1.4.2 → danceflow_stemlab-1.6.1}/mcp-registry/server.json +2 -2
- {danceflow_stemlab-1.4.2 → danceflow_stemlab-1.6.1}/plugins/stemlab/.codex-plugin/plugin.json +1 -1
- {danceflow_stemlab-1.4.2 → danceflow_stemlab-1.6.1}/plugins/stemlab/plugin.json +1 -1
- {danceflow_stemlab-1.4.2 → danceflow_stemlab-1.6.1}/pyproject.toml +3 -3
- danceflow_stemlab-1.6.1/scripts/Release-DanceFlow.ps1 +57 -0
- danceflow_stemlab-1.6.1/scripts/arcadians_http.py +140 -0
- danceflow_stemlab-1.6.1/scripts/assemble_arcadians_site.py +94 -0
- danceflow_stemlab-1.6.1/scripts/build_arcadians_demo.py +358 -0
- danceflow_stemlab-1.6.1/scripts/build_arcadians_pair_demos.py +309 -0
- danceflow_stemlab-1.6.1/scripts/build_arcadians_timeline.py +221 -0
- danceflow_stemlab-1.6.1/scripts/check_arcadians_audio.py +376 -0
- danceflow_stemlab-1.6.1/scripts/check_arcadians_timeline.py +223 -0
- danceflow_stemlab-1.6.1/scripts/check_semantic_runtime.py +80 -0
- danceflow_stemlab-1.6.1/scripts/check_torchaudio_decode.py +97 -0
- danceflow_stemlab-1.6.1/scripts/check_viewer_build.py +8 -0
- danceflow_stemlab-1.6.1/scripts/configure_viewer_build.py +12 -0
- danceflow_stemlab-1.6.1/scripts/publish_arcadians_pages.py +305 -0
- danceflow_stemlab-1.6.1/scripts/release_suite.py +525 -0
- danceflow_stemlab-1.6.1/scripts/timeline_display_checks.py +141 -0
- danceflow_stemlab-1.6.1/scripts/viewer_releases.py +314 -0
- {danceflow_stemlab-1.4.2 → danceflow_stemlab-1.6.1}/src/danceflow_stemlab.egg-info/PKG-INFO +312 -6
- {danceflow_stemlab-1.4.2 → danceflow_stemlab-1.6.1}/src/danceflow_stemlab.egg-info/SOURCES.txt +55 -0
- {danceflow_stemlab-1.4.2 → danceflow_stemlab-1.6.1}/src/danceflow_stemlab.egg-info/requires.txt +3 -5
- {danceflow_stemlab-1.4.2 → danceflow_stemlab-1.6.1}/src/stemlab/__init__.py +1 -1
- danceflow_stemlab-1.6.1/src/stemlab/analysis/frequency_bands.py +103 -0
- danceflow_stemlab-1.6.1/src/stemlab/analysis/rudiment_batch.py +253 -0
- danceflow_stemlab-1.6.1/src/stemlab/analysis/rudiment_pairs.py +276 -0
- danceflow_stemlab-1.6.1/src/stemlab/analysis/rudiment_recordings.py +476 -0
- {danceflow_stemlab-1.4.2 → danceflow_stemlab-1.6.1}/src/stemlab/beats/beattransformer.py +2 -0
- {danceflow_stemlab-1.4.2 → danceflow_stemlab-1.6.1}/src/stemlab/beats/common.py +13 -5
- danceflow_stemlab-1.6.1/src/stemlab/beats/inputs.py +85 -0
- {danceflow_stemlab-1.4.2 → danceflow_stemlab-1.6.1}/src/stemlab/cli.py +17 -0
- {danceflow_stemlab-1.4.2 → danceflow_stemlab-1.6.1}/src/stemlab/pipeline.py +52 -15
- danceflow_stemlab-1.6.1/src/stemlab/recording_cli.py +268 -0
- danceflow_stemlab-1.6.1/src/stemlab/static_timeline.py +332 -0
- {danceflow_stemlab-1.4.2 → danceflow_stemlab-1.6.1}/src/stemlab/web/app.js +5022 -4836
- danceflow_stemlab-1.6.1/src/stemlab/web/static-timeline.js +34 -0
- {danceflow_stemlab-1.4.2 → danceflow_stemlab-1.6.1}/src/stemlab/web/timeline.css +1 -1
- danceflow_stemlab-1.6.1/tests/test_arcadians_fourier_demo.py +165 -0
- danceflow_stemlab-1.6.1/tests/test_arcadians_http.py +210 -0
- danceflow_stemlab-1.6.1/tests/test_arcadians_pages_publish.py +225 -0
- danceflow_stemlab-1.6.1/tests/test_arcadians_pair_demos.py +225 -0
- danceflow_stemlab-1.6.1/tests/test_arcadians_release_demo.py +198 -0
- danceflow_stemlab-1.6.1/tests/test_arcadians_runtime.py +314 -0
- danceflow_stemlab-1.6.1/tests/test_arcadians_timeline.py +325 -0
- danceflow_stemlab-1.6.1/tests/test_beat_inputs.py +160 -0
- {danceflow_stemlab-1.4.2 → danceflow_stemlab-1.6.1}/tests/test_codex_release.py +2 -1
- danceflow_stemlab-1.6.1/tests/test_frequency_bands.py +220 -0
- danceflow_stemlab-1.6.1/tests/test_onefile_build.py +168 -0
- danceflow_stemlab-1.6.1/tests/test_release_suite.py +385 -0
- danceflow_stemlab-1.6.1/tests/test_rudiment_pairs.py +238 -0
- danceflow_stemlab-1.6.1/tests/test_rudiment_recordings.py +276 -0
- danceflow_stemlab-1.6.1/tests/test_static_timeline.py +231 -0
- danceflow_stemlab-1.6.1/tests/test_viewer_controls.py +35 -0
- danceflow_stemlab-1.6.1/tests/test_viewer_releases.py +242 -0
- {danceflow_stemlab-1.4.2 → danceflow_stemlab-1.6.1}/tests/test_web_frontend.py +5 -1
- danceflow_stemlab-1.4.2/AGENTS.md +0 -15
- danceflow_stemlab-1.4.2/MANIFEST.in +0 -24
- {danceflow_stemlab-1.4.2 → danceflow_stemlab-1.6.1}/.agents/plugins/marketplace.json +0 -0
- {danceflow_stemlab-1.4.2 → danceflow_stemlab-1.6.1}/.github/workflows/codex-plugin.yml +0 -0
- {danceflow_stemlab-1.4.2 → danceflow_stemlab-1.6.1}/CONTRIBUTING.md +0 -0
- {danceflow_stemlab-1.4.2 → danceflow_stemlab-1.6.1}/LICENSE +0 -0
- {danceflow_stemlab-1.4.2 → danceflow_stemlab-1.6.1}/docs/branding/README.md +0 -0
- {danceflow_stemlab-1.4.2 → danceflow_stemlab-1.6.1}/docs/branding/logo-monochrome.svg +0 -0
- {danceflow_stemlab-1.4.2 → danceflow_stemlab-1.6.1}/docs/branding/logo.png +0 -0
- {danceflow_stemlab-1.4.2 → danceflow_stemlab-1.6.1}/docs/branding/logo.svg +0 -0
- {danceflow_stemlab-1.4.2 → danceflow_stemlab-1.6.1}/docs/codex-plugin.md +0 -0
- {danceflow_stemlab-1.4.2 → danceflow_stemlab-1.6.1}/docs/codex-publishing.md +0 -0
- {danceflow_stemlab-1.4.2 → danceflow_stemlab-1.6.1}/docs/cue-alignment.md +0 -0
- {danceflow_stemlab-1.4.2 → danceflow_stemlab-1.6.1}/docs/evidence-models.md +0 -0
- {danceflow_stemlab-1.4.2 → danceflow_stemlab-1.6.1}/docs/midi.md +0 -0
- {danceflow_stemlab-1.4.2 → danceflow_stemlab-1.6.1}/plugins/stemlab/.mcp.json +0 -0
- {danceflow_stemlab-1.4.2 → danceflow_stemlab-1.6.1}/plugins/stemlab/README.md +0 -0
- {danceflow_stemlab-1.4.2 → danceflow_stemlab-1.6.1}/plugins/stemlab/branding/logo-monochrome.svg +0 -0
- {danceflow_stemlab-1.4.2 → danceflow_stemlab-1.6.1}/plugins/stemlab/branding/logo.png +0 -0
- {danceflow_stemlab-1.4.2 → danceflow_stemlab-1.6.1}/plugins/stemlab/branding/logo.svg +0 -0
- {danceflow_stemlab-1.4.2 → danceflow_stemlab-1.6.1}/plugins/stemlab/mcp.json +0 -0
- {danceflow_stemlab-1.4.2 → danceflow_stemlab-1.6.1}/plugins/stemlab/skills/stemlab/SKILL.md +0 -0
- {danceflow_stemlab-1.4.2 → danceflow_stemlab-1.6.1}/plugins/stemlab/skills/stemlab/references/tools.md +0 -0
- {danceflow_stemlab-1.4.2 → danceflow_stemlab-1.6.1}/scripts/benchmark_evidence_corpus.py +0 -0
- {danceflow_stemlab-1.4.2 → danceflow_stemlab-1.6.1}/scripts/build_codex_plugin.py +0 -0
- {danceflow_stemlab-1.4.2 → danceflow_stemlab-1.6.1}/scripts/capture_loop_workflow.py +0 -0
- {danceflow_stemlab-1.4.2 → danceflow_stemlab-1.6.1}/scripts/check_codex_timeline.py +0 -0
- {danceflow_stemlab-1.4.2 → danceflow_stemlab-1.6.1}/scripts/loop_demo.py +0 -0
- {danceflow_stemlab-1.4.2 → danceflow_stemlab-1.6.1}/scripts/prepare_codex_marketplace.py +0 -0
- {danceflow_stemlab-1.4.2 → danceflow_stemlab-1.6.1}/scripts/publish_mcp_registry.py +0 -0
- {danceflow_stemlab-1.4.2 → danceflow_stemlab-1.6.1}/scripts/smoke_midi.py +0 -0
- {danceflow_stemlab-1.4.2 → danceflow_stemlab-1.6.1}/setup.cfg +0 -0
- {danceflow_stemlab-1.4.2 → danceflow_stemlab-1.6.1}/src/danceflow_stemlab.egg-info/dependency_links.txt +0 -0
- {danceflow_stemlab-1.4.2 → danceflow_stemlab-1.6.1}/src/danceflow_stemlab.egg-info/entry_points.txt +0 -0
- {danceflow_stemlab-1.4.2 → danceflow_stemlab-1.6.1}/src/danceflow_stemlab.egg-info/top_level.txt +0 -0
- {danceflow_stemlab-1.4.2 → danceflow_stemlab-1.6.1}/src/stemlab/__main__.py +0 -0
- {danceflow_stemlab-1.4.2 → danceflow_stemlab-1.6.1}/src/stemlab/analysis/__init__.py +0 -0
- {danceflow_stemlab-1.4.2 → danceflow_stemlab-1.6.1}/src/stemlab/analysis/evidence/__init__.py +0 -0
- {danceflow_stemlab-1.4.2 → danceflow_stemlab-1.6.1}/src/stemlab/analysis/evidence/adapters.py +0 -0
- {danceflow_stemlab-1.4.2 → danceflow_stemlab-1.6.1}/src/stemlab/analysis/evidence/registry.py +0 -0
- {danceflow_stemlab-1.4.2 → danceflow_stemlab-1.6.1}/src/stemlab/analysis/evidence/runner.py +0 -0
- {danceflow_stemlab-1.4.2 → danceflow_stemlab-1.6.1}/src/stemlab/analysis/evidence/worker.py +0 -0
- {danceflow_stemlab-1.4.2 → danceflow_stemlab-1.6.1}/src/stemlab/analysis/harmony.py +0 -0
- {danceflow_stemlab-1.4.2 → danceflow_stemlab-1.6.1}/src/stemlab/analysis/loops.py +0 -0
- {danceflow_stemlab-1.4.2 → danceflow_stemlab-1.6.1}/src/stemlab/analysis/lyrics.py +0 -0
- {danceflow_stemlab-1.4.2 → danceflow_stemlab-1.6.1}/src/stemlab/analysis/midi/__init__.py +0 -0
- {danceflow_stemlab-1.4.2 → danceflow_stemlab-1.6.1}/src/stemlab/analysis/midi/adapters.py +0 -0
- {danceflow_stemlab-1.4.2 → danceflow_stemlab-1.6.1}/src/stemlab/analysis/midi/artifacts.py +0 -0
- {danceflow_stemlab-1.4.2 → danceflow_stemlab-1.6.1}/src/stemlab/analysis/midi/registry.py +0 -0
- {danceflow_stemlab-1.4.2 → danceflow_stemlab-1.6.1}/src/stemlab/analysis/midi/runner.py +0 -0
- {danceflow_stemlab-1.4.2 → danceflow_stemlab-1.6.1}/src/stemlab/analysis/midi/worker.py +0 -0
- {danceflow_stemlab-1.4.2 → danceflow_stemlab-1.6.1}/src/stemlab/analysis/phrase_loops.py +0 -0
- {danceflow_stemlab-1.4.2 → danceflow_stemlab-1.6.1}/src/stemlab/analysis/registry.py +0 -0
- {danceflow_stemlab-1.4.2 → danceflow_stemlab-1.6.1}/src/stemlab/analysis/rhythm.py +0 -0
- {danceflow_stemlab-1.4.2 → danceflow_stemlab-1.6.1}/src/stemlab/analysis/rudiment_matches.py +0 -0
- {danceflow_stemlab-1.4.2 → danceflow_stemlab-1.6.1}/src/stemlab/analysis/runner.py +0 -0
- {danceflow_stemlab-1.4.2 → danceflow_stemlab-1.6.1}/src/stemlab/analysis/semantic_audio.py +0 -0
- {danceflow_stemlab-1.4.2 → danceflow_stemlab-1.6.1}/src/stemlab/analysis/semantic_text.py +0 -0
- {danceflow_stemlab-1.4.2 → danceflow_stemlab-1.6.1}/src/stemlab/analysis/song_map.py +0 -0
- {danceflow_stemlab-1.4.2 → danceflow_stemlab-1.6.1}/src/stemlab/analysis/sonic.py +0 -0
- {danceflow_stemlab-1.4.2 → danceflow_stemlab-1.6.1}/src/stemlab/analysis/structure.py +0 -0
- {danceflow_stemlab-1.4.2 → danceflow_stemlab-1.6.1}/src/stemlab/analysis/tempo_regimes.py +0 -0
- {danceflow_stemlab-1.4.2 → danceflow_stemlab-1.6.1}/src/stemlab/analysis/transcription.py +0 -0
- {danceflow_stemlab-1.4.2 → danceflow_stemlab-1.6.1}/src/stemlab/audio.py +0 -0
- {danceflow_stemlab-1.4.2 → danceflow_stemlab-1.6.1}/src/stemlab/beats/__init__.py +0 -0
- {danceflow_stemlab-1.4.2 → danceflow_stemlab-1.6.1}/src/stemlab/beats/base.py +0 -0
- {danceflow_stemlab-1.4.2 → danceflow_stemlab-1.6.1}/src/stemlab/beats/beatnet.py +0 -0
- {danceflow_stemlab-1.4.2 → danceflow_stemlab-1.6.1}/src/stemlab/beats/beatthis.py +0 -0
- {danceflow_stemlab-1.4.2 → danceflow_stemlab-1.6.1}/src/stemlab/bootstrap.py +0 -0
- {danceflow_stemlab-1.4.2 → danceflow_stemlab-1.6.1}/src/stemlab/branding.py +0 -0
- {danceflow_stemlab-1.4.2 → danceflow_stemlab-1.6.1}/src/stemlab/canonical.py +0 -0
- {danceflow_stemlab-1.4.2 → danceflow_stemlab-1.6.1}/src/stemlab/clip_cli.py +0 -0
- {danceflow_stemlab-1.4.2 → danceflow_stemlab-1.6.1}/src/stemlab/clip_match.py +0 -0
- {danceflow_stemlab-1.4.2 → danceflow_stemlab-1.6.1}/src/stemlab/codex/__init__.py +0 -0
- {danceflow_stemlab-1.4.2 → danceflow_stemlab-1.6.1}/src/stemlab/codex/__main__.py +0 -0
- {danceflow_stemlab-1.4.2 → danceflow_stemlab-1.6.1}/src/stemlab/codex/bridge.py +0 -0
- {danceflow_stemlab-1.4.2 → danceflow_stemlab-1.6.1}/src/stemlab/codex/jobs.py +0 -0
- {danceflow_stemlab-1.4.2 → danceflow_stemlab-1.6.1}/src/stemlab/codex/paths.py +0 -0
- {danceflow_stemlab-1.4.2 → danceflow_stemlab-1.6.1}/src/stemlab/codex/server.py +0 -0
- {danceflow_stemlab-1.4.2 → danceflow_stemlab-1.6.1}/src/stemlab/codex/tasks.py +0 -0
- {danceflow_stemlab-1.4.2 → danceflow_stemlab-1.6.1}/src/stemlab/codex/timeline.py +0 -0
- {danceflow_stemlab-1.4.2 → danceflow_stemlab-1.6.1}/src/stemlab/codex/worker.py +0 -0
- {danceflow_stemlab-1.4.2 → danceflow_stemlab-1.6.1}/src/stemlab/cue_cli.py +0 -0
- {danceflow_stemlab-1.4.2 → danceflow_stemlab-1.6.1}/src/stemlab/cues.py +0 -0
- {danceflow_stemlab-1.4.2 → danceflow_stemlab-1.6.1}/src/stemlab/lyric_lrc.py +0 -0
- {danceflow_stemlab-1.4.2 → danceflow_stemlab-1.6.1}/src/stemlab/manifest.py +0 -0
- {danceflow_stemlab-1.4.2 → danceflow_stemlab-1.6.1}/src/stemlab/models.py +0 -0
- {danceflow_stemlab-1.4.2 → danceflow_stemlab-1.6.1}/src/stemlab/separators/__init__.py +0 -0
- {danceflow_stemlab-1.4.2 → danceflow_stemlab-1.6.1}/src/stemlab/separators/base.py +0 -0
- {danceflow_stemlab-1.4.2 → danceflow_stemlab-1.6.1}/src/stemlab/separators/bsroformer.py +0 -0
- {danceflow_stemlab-1.4.2 → danceflow_stemlab-1.6.1}/src/stemlab/separators/common.py +0 -0
- {danceflow_stemlab-1.4.2 → danceflow_stemlab-1.6.1}/src/stemlab/separators/demucs.py +0 -0
- {danceflow_stemlab-1.4.2 → danceflow_stemlab-1.6.1}/src/stemlab/separators/openunmix.py +0 -0
- {danceflow_stemlab-1.4.2 → danceflow_stemlab-1.6.1}/src/stemlab/separators/scnet.py +0 -0
- {danceflow_stemlab-1.4.2 → danceflow_stemlab-1.6.1}/src/stemlab/server.py +0 -0
- {danceflow_stemlab-1.4.2 → danceflow_stemlab-1.6.1}/src/stemlab/sonic_visualiser.py +0 -0
- {danceflow_stemlab-1.4.2 → danceflow_stemlab-1.6.1}/src/stemlab/spectrogram.py +0 -0
- {danceflow_stemlab-1.4.2 → danceflow_stemlab-1.6.1}/src/stemlab/spectrogram_repair.py +0 -0
- {danceflow_stemlab-1.4.2 → danceflow_stemlab-1.6.1}/src/stemlab/speech.py +0 -0
- {danceflow_stemlab-1.4.2 → danceflow_stemlab-1.6.1}/src/stemlab/types.py +0 -0
- {danceflow_stemlab-1.4.2 → danceflow_stemlab-1.6.1}/src/stemlab/util.py +0 -0
- {danceflow_stemlab-1.4.2 → danceflow_stemlab-1.6.1}/src/stemlab/vamp.py +0 -0
- {danceflow_stemlab-1.4.2 → danceflow_stemlab-1.6.1}/src/stemlab/vamp_runtime.py +0 -0
- {danceflow_stemlab-1.4.2 → danceflow_stemlab-1.6.1}/src/stemlab/web/arcadians-cover.jpg +0 -0
- {danceflow_stemlab-1.4.2 → danceflow_stemlab-1.6.1}/src/stemlab/web/arcadians-reference.json +0 -0
- {danceflow_stemlab-1.4.2 → danceflow_stemlab-1.6.1}/src/stemlab/web/index.html +0 -0
- {danceflow_stemlab-1.4.2 → danceflow_stemlab-1.6.1}/src/stemlab/web/style.css +0 -0
- {danceflow_stemlab-1.4.2 → danceflow_stemlab-1.6.1}/src/stemlab/webui.py +0 -0
- {danceflow_stemlab-1.4.2 → danceflow_stemlab-1.6.1}/src/stemlab/word_alignment.py +0 -0
- {danceflow_stemlab-1.4.2 → danceflow_stemlab-1.6.1}/tests/test_analysis_registry.py +0 -0
- {danceflow_stemlab-1.4.2 → danceflow_stemlab-1.6.1}/tests/test_arcadians_fixture.py +0 -0
- {danceflow_stemlab-1.4.2 → danceflow_stemlab-1.6.1}/tests/test_arcadians_rudiments.py +0 -0
- {danceflow_stemlab-1.4.2 → danceflow_stemlab-1.6.1}/tests/test_audio_normalization.py +0 -0
- {danceflow_stemlab-1.4.2 → danceflow_stemlab-1.6.1}/tests/test_bar_phase.py +0 -0
- {danceflow_stemlab-1.4.2 → danceflow_stemlab-1.6.1}/tests/test_beat_consensus.py +0 -0
- {danceflow_stemlab-1.4.2 → danceflow_stemlab-1.6.1}/tests/test_beat_this_bootstrap.py +0 -0
- {danceflow_stemlab-1.4.2 → danceflow_stemlab-1.6.1}/tests/test_beatnet_bootstrap.py +0 -0
- {danceflow_stemlab-1.4.2 → danceflow_stemlab-1.6.1}/tests/test_beatnet_compat.py +0 -0
- {danceflow_stemlab-1.4.2 → danceflow_stemlab-1.6.1}/tests/test_branding.py +0 -0
- {danceflow_stemlab-1.4.2 → danceflow_stemlab-1.6.1}/tests/test_bsroformer_adapter.py +0 -0
- {danceflow_stemlab-1.4.2 → danceflow_stemlab-1.6.1}/tests/test_canonical.py +0 -0
- {danceflow_stemlab-1.4.2 → danceflow_stemlab-1.6.1}/tests/test_canonical_extended.py +0 -0
- {danceflow_stemlab-1.4.2 → danceflow_stemlab-1.6.1}/tests/test_clip_match.py +0 -0
- {danceflow_stemlab-1.4.2 → danceflow_stemlab-1.6.1}/tests/test_codex_bridge.py +0 -0
- {danceflow_stemlab-1.4.2 → danceflow_stemlab-1.6.1}/tests/test_codex_jobs.py +0 -0
- {danceflow_stemlab-1.4.2 → danceflow_stemlab-1.6.1}/tests/test_codex_package.py +0 -0
- {danceflow_stemlab-1.4.2 → danceflow_stemlab-1.6.1}/tests/test_codex_protocol.py +0 -0
- {danceflow_stemlab-1.4.2 → danceflow_stemlab-1.6.1}/tests/test_codex_timeline.py +0 -0
- {danceflow_stemlab-1.4.2 → danceflow_stemlab-1.6.1}/tests/test_cue_integration.py +0 -0
- {danceflow_stemlab-1.4.2 → danceflow_stemlab-1.6.1}/tests/test_cues.py +0 -0
- {danceflow_stemlab-1.4.2 → danceflow_stemlab-1.6.1}/tests/test_deep_harmony.py +0 -0
- {danceflow_stemlab-1.4.2 → danceflow_stemlab-1.6.1}/tests/test_deep_lyrics.py +0 -0
- {danceflow_stemlab-1.4.2 → danceflow_stemlab-1.6.1}/tests/test_deep_sonic_rhythm.py +0 -0
- {danceflow_stemlab-1.4.2 → danceflow_stemlab-1.6.1}/tests/test_distribution_identity.py +0 -0
- {danceflow_stemlab-1.4.2 → danceflow_stemlab-1.6.1}/tests/test_docker_contract.py +0 -0
- {danceflow_stemlab-1.4.2 → danceflow_stemlab-1.6.1}/tests/test_evidence_models.py +0 -0
- {danceflow_stemlab-1.4.2 → danceflow_stemlab-1.6.1}/tests/test_loop_integration.py +0 -0
- {danceflow_stemlab-1.4.2 → danceflow_stemlab-1.6.1}/tests/test_loops.py +0 -0
- {danceflow_stemlab-1.4.2 → danceflow_stemlab-1.6.1}/tests/test_lyric_lrc.py +0 -0
- {danceflow_stemlab-1.4.2 → danceflow_stemlab-1.6.1}/tests/test_manifest.py +0 -0
- {danceflow_stemlab-1.4.2 → danceflow_stemlab-1.6.1}/tests/test_midi_adapters.py +0 -0
- {danceflow_stemlab-1.4.2 → danceflow_stemlab-1.6.1}/tests/test_midi_extraction.py +0 -0
- {danceflow_stemlab-1.4.2 → danceflow_stemlab-1.6.1}/tests/test_midi_integration.py +0 -0
- {danceflow_stemlab-1.4.2 → danceflow_stemlab-1.6.1}/tests/test_midi_registry.py +0 -0
- {danceflow_stemlab-1.4.2 → danceflow_stemlab-1.6.1}/tests/test_models.py +0 -0
- {danceflow_stemlab-1.4.2 → danceflow_stemlab-1.6.1}/tests/test_phrase_loops.py +0 -0
- {danceflow_stemlab-1.4.2 → danceflow_stemlab-1.6.1}/tests/test_repository_hygiene.py +0 -0
- {danceflow_stemlab-1.4.2 → danceflow_stemlab-1.6.1}/tests/test_rudiment_matches.py +0 -0
- {danceflow_stemlab-1.4.2 → danceflow_stemlab-1.6.1}/tests/test_server.py +0 -0
- {danceflow_stemlab-1.4.2 → danceflow_stemlab-1.6.1}/tests/test_song_map.py +0 -0
- {danceflow_stemlab-1.4.2 → danceflow_stemlab-1.6.1}/tests/test_sonic_visualiser.py +0 -0
- {danceflow_stemlab-1.4.2 → danceflow_stemlab-1.6.1}/tests/test_sonic_visualiser_workspace.py +0 -0
- {danceflow_stemlab-1.4.2 → danceflow_stemlab-1.6.1}/tests/test_spectrogram.py +0 -0
- {danceflow_stemlab-1.4.2 → danceflow_stemlab-1.6.1}/tests/test_speech_repetition.py +0 -0
- {danceflow_stemlab-1.4.2 → danceflow_stemlab-1.6.1}/tests/test_vamp.py +0 -0
- {danceflow_stemlab-1.4.2 → danceflow_stemlab-1.6.1}/tests/test_vamp_runtime.py +0 -0
- {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
|