framerudiments 0.4.0__tar.gz → 0.4.2__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 (259) hide show
  1. {framerudiments-0.4.0 → framerudiments-0.4.2}/AGENTS.md +4 -0
  2. {framerudiments-0.4.0 → framerudiments-0.4.2}/MANIFEST.in +1 -0
  3. {framerudiments-0.4.0/src/framerudiments.egg-info → framerudiments-0.4.2}/PKG-INFO +317 -234
  4. {framerudiments-0.4.0 → framerudiments-0.4.2}/README.md +313 -233
  5. {framerudiments-0.4.0 → framerudiments-0.4.2}/RELEASE_NOTES.md +28 -0
  6. framerudiments-0.4.2/docs/ECOSYSTEM.md +32 -0
  7. framerudiments-0.4.2/docs/controlled-audio-response.md +110 -0
  8. framerudiments-0.4.2/docs/hybrid-preset-analysis.md +119 -0
  9. framerudiments-0.4.2/docs/media/natural-materials.mp4 +0 -0
  10. framerudiments-0.4.2/docs/media/natural-materials.png +0 -0
  11. framerudiments-0.4.2/docs/media/rangoli-transcript.md +12 -0
  12. framerudiments-0.4.2/docs/media/rangoli.mp4 +0 -0
  13. framerudiments-0.4.2/docs/media/rangoli.png +0 -0
  14. framerudiments-0.4.2/docs/natural-materials.md +189 -0
  15. {framerudiments-0.4.0 → framerudiments-0.4.2}/docs/project-format.md +1 -0
  16. framerudiments-0.4.2/docs/rangoli.md +69 -0
  17. framerudiments-0.4.2/integration/test_fire_volume_gpu.py +20 -0
  18. {framerudiments-0.4.0 → framerudiments-0.4.2}/pyproject.toml +4 -3
  19. framerudiments-0.4.2/scripts/Run-ControlledPresetAnalysis.ps1 +41 -0
  20. {framerudiments-0.4.0 → framerudiments-0.4.2}/scripts/Run-FullPresetAnalysis.ps1 +41 -3
  21. framerudiments-0.4.2/scripts/Run-HybridPresetAnalysis.ps1 +92 -0
  22. framerudiments-0.4.2/scripts/bake_mantaflow_fire.py +158 -0
  23. framerudiments-0.4.2/scripts/controlled_preset_analysis.py +291 -0
  24. {framerudiments-0.4.0 → framerudiments-0.4.2}/scripts/generate_visualisation_gallery.py +1 -1
  25. framerudiments-0.4.2/scripts/prepare_fire_atlas.py +38 -0
  26. framerudiments-0.4.2/scripts/render_natural_material_demo.py +100 -0
  27. {framerudiments-0.4.0 → framerudiments-0.4.2}/src/framerudiments/__init__.py +5 -1
  28. framerudiments-0.4.2/src/framerudiments/audio_probes.py +132 -0
  29. {framerudiments-0.4.0 → framerudiments-0.4.2}/src/framerudiments/cli.py +5 -2
  30. {framerudiments-0.4.0 → framerudiments-0.4.2}/src/framerudiments/compositor.py +19 -1
  31. framerudiments-0.4.2/src/framerudiments/controlled_profiling.py +177 -0
  32. {framerudiments-0.4.0 → framerudiments-0.4.2}/src/framerudiments/demo.py +28 -0
  33. framerudiments-0.4.2/src/framerudiments/fire_assets/mantaflow/NOTICE.md +12 -0
  34. framerudiments-0.4.2/src/framerudiments/fire_assets/mantaflow/atlas.json +161 -0
  35. framerudiments-0.4.2/src/framerudiments/fire_assets/mantaflow/flames.png +0 -0
  36. framerudiments-0.4.2/src/framerudiments/fire_assets/marburg/NOTICE.md +16 -0
  37. framerudiments-0.4.2/src/framerudiments/fire_assets/marburg/atlas.json +47 -0
  38. framerudiments-0.4.2/src/framerudiments/fire_assets/marburg/flames.png +0 -0
  39. framerudiments-0.4.2/src/framerudiments/fire_assets.py +349 -0
  40. framerudiments-0.4.2/src/framerudiments/fire_fluid.py +163 -0
  41. framerudiments-0.4.2/src/framerudiments/fire_renderer.py +246 -0
  42. framerudiments-0.4.2/src/framerudiments/fire_volume.py +109 -0
  43. framerudiments-0.4.2/src/framerudiments/natural_materials.py +334 -0
  44. {framerudiments-0.4.0 → framerudiments-0.4.2}/src/framerudiments/particle_engine.py +26 -5
  45. framerudiments-0.4.2/src/framerudiments/rangoli_renderer.py +88 -0
  46. {framerudiments-0.4.0 → framerudiments-0.4.2}/src/framerudiments/render.py +51 -24
  47. {framerudiments-0.4.0 → framerudiments-0.4.2}/src/framerudiments/rudiment_renderers.py +3 -0
  48. {framerudiments-0.4.0 → framerudiments-0.4.2}/src/framerudiments/visualisation_catalogue.py +5 -1
  49. framerudiments-0.4.2/src/framerudiments/visualiser_assets/rangoli-background.milk +26 -0
  50. {framerudiments-0.4.0 → framerudiments-0.4.2/src/framerudiments.egg-info}/PKG-INFO +317 -234
  51. {framerudiments-0.4.0 → framerudiments-0.4.2}/src/framerudiments.egg-info/SOURCES.txt +38 -0
  52. {framerudiments-0.4.0 → framerudiments-0.4.2}/src/framerudiments.egg-info/requires.txt +4 -0
  53. {framerudiments-0.4.0 → framerudiments-0.4.2}/tests/test_advanced_renderers.py +1 -0
  54. framerudiments-0.4.2/tests/test_checkpoint_batches.py +32 -0
  55. framerudiments-0.4.2/tests/test_controlled_audio.py +137 -0
  56. framerudiments-0.4.2/tests/test_fire_methods.py +160 -0
  57. framerudiments-0.4.2/tests/test_hybrid_launcher.py +56 -0
  58. framerudiments-0.4.2/tests/test_natural_materials.py +133 -0
  59. framerudiments-0.4.2/tests/test_rangoli_renderer.py +47 -0
  60. {framerudiments-0.4.0 → framerudiments-0.4.2}/LICENSE +0 -0
  61. {framerudiments-0.4.0 → framerudiments-0.4.2}/analysis-releases.json +0 -0
  62. {framerudiments-0.4.0 → framerudiments-0.4.2}/docs/FrameRudiments-PATCH_WORKFLOW.md +0 -0
  63. {framerudiments-0.4.0 → framerudiments-0.4.2}/docs/annular-modulation.md +0 -0
  64. {framerudiments-0.4.0 → framerudiments-0.4.2}/docs/authoring-workspace.md +0 -0
  65. {framerudiments-0.4.0 → framerudiments-0.4.2}/docs/beat-alignment.md +0 -0
  66. {framerudiments-0.4.0 → framerudiments-0.4.2}/docs/expanded-effects.md +0 -0
  67. {framerudiments-0.4.0 → framerudiments-0.4.2}/docs/extraction.md +0 -0
  68. {framerudiments-0.4.0 → framerudiments-0.4.2}/docs/full-preset-analysis.md +0 -0
  69. {framerudiments-0.4.0 → framerudiments-0.4.2}/docs/keyframed-mattes.md +0 -0
  70. {framerudiments-0.4.0 → framerudiments-0.4.2}/docs/media/beat-alignment-evidence.json +0 -0
  71. {framerudiments-0.4.0 → framerudiments-0.4.2}/docs/media/beat-alignment.mp4 +0 -0
  72. {framerudiments-0.4.0 → framerudiments-0.4.2}/docs/media/beat-alignment.png +0 -0
  73. {framerudiments-0.4.0 → framerudiments-0.4.2}/docs/media/demo-transcript.md +0 -0
  74. {framerudiments-0.4.0 → framerudiments-0.4.2}/docs/media/effects-pipeline.svg +0 -0
  75. {framerudiments-0.4.0 → framerudiments-0.4.2}/docs/media/full-frame-comparison.png +0 -0
  76. {framerudiments-0.4.0 → framerudiments-0.4.2}/docs/media/full-frame-demo.mp4 +0 -0
  77. {framerudiments-0.4.0 → framerudiments-0.4.2}/docs/media/media-evidence.json +0 -0
  78. {framerudiments-0.4.0 → framerudiments-0.4.2}/docs/media/preset-test-cards.png +0 -0
  79. {framerudiments-0.4.0 → framerudiments-0.4.2}/docs/media/test-card-inputs/colour-bars.png +0 -0
  80. {framerudiments-0.4.0 → framerudiments-0.4.2}/docs/media/test-card-inputs/grid-rings.png +0 -0
  81. {framerudiments-0.4.0 → framerudiments-0.4.2}/docs/media/test-card-inputs/text-card.png +0 -0
  82. {framerudiments-0.4.0 → framerudiments-0.4.2}/docs/multi-stem-modulation.md +0 -0
  83. {framerudiments-0.4.0 → framerudiments-0.4.2}/docs/music-reactive-3d.md +0 -0
  84. {framerudiments-0.4.0 → framerudiments-0.4.2}/docs/particle-smoke.md +0 -0
  85. {framerudiments-0.4.0 → framerudiments-0.4.2}/docs/phase3-compositing.md +0 -0
  86. {framerudiments-0.4.0 → framerudiments-0.4.2}/docs/preset-behaviour.md +0 -0
  87. {framerudiments-0.4.0 → framerudiments-0.4.2}/docs/preset-profiling.md +0 -0
  88. {framerudiments-0.4.0 → framerudiments-0.4.2}/docs/projectm-local-runtime.md +0 -0
  89. {framerudiments-0.4.0 → framerudiments-0.4.2}/docs/quality-effects.md +0 -0
  90. {framerudiments-0.4.0 → framerudiments-0.4.2}/docs/rich-lyric-effects.md +0 -0
  91. {framerudiments-0.4.0 → framerudiments-0.4.2}/docs/rudiment-renderers.md +0 -0
  92. {framerudiments-0.4.0 → framerudiments-0.4.2}/docs/scoped-post-effects.md +0 -0
  93. {framerudiments-0.4.0 → framerudiments-0.4.2}/docs/solid-spatial-renderers.md +0 -0
  94. {framerudiments-0.4.0 → framerudiments-0.4.2}/docs/spatial-renderers.md +0 -0
  95. {framerudiments-0.4.0 → framerudiments-0.4.2}/docs/spatiotemporal-supersampling.md +0 -0
  96. {framerudiments-0.4.0 → framerudiments-0.4.2}/docs/spectrum.md +0 -0
  97. {framerudiments-0.4.0 → framerudiments-0.4.2}/docs/sprite-visualisations.md +0 -0
  98. {framerudiments-0.4.0 → framerudiments-0.4.2}/docs/stem-sources-and-masks.md +0 -0
  99. {framerudiments-0.4.0 → framerudiments-0.4.2}/docs/variable-bpm-word-subtitles.md +0 -0
  100. {framerudiments-0.4.0 → framerudiments-0.4.2}/docs/visualisation-atlas.md +0 -0
  101. {framerudiments-0.4.0 → framerudiments-0.4.2}/docs/visualisation-coverage-matrix.md +0 -0
  102. {framerudiments-0.4.0 → framerudiments-0.4.2}/docs/visualiser-routing.md +0 -0
  103. {framerudiments-0.4.0 → framerudiments-0.4.2}/docs/visualisers.md +0 -0
  104. {framerudiments-0.4.0 → framerudiments-0.4.2}/docs/workflow-media.md +0 -0
  105. {framerudiments-0.4.0 → framerudiments-0.4.2}/integration/test_music_spatial_gpu.py +0 -0
  106. {framerudiments-0.4.0 → framerudiments-0.4.2}/integration/test_preset_analysis.py +0 -0
  107. {framerudiments-0.4.0 → framerudiments-0.4.2}/integration/test_released_preset_analysis.py +0 -0
  108. {framerudiments-0.4.0 → framerudiments-0.4.2}/integration/test_visualisers_gpu.py +0 -0
  109. {framerudiments-0.4.0 → framerudiments-0.4.2}/scripts/Run-PresetBehaviourAnalysis.ps1 +0 -0
  110. {framerudiments-0.4.0 → framerudiments-0.4.2}/scripts/authoring_preview.py +0 -0
  111. {framerudiments-0.4.0 → framerudiments-0.4.2}/scripts/build_sprite_assets.py +0 -0
  112. {framerudiments-0.4.0 → framerudiments-0.4.2}/scripts/check_projectm_runtime.py +0 -0
  113. {framerudiments-0.4.0 → framerudiments-0.4.2}/scripts/check_release_packages.py +0 -0
  114. {framerudiments-0.4.0 → framerudiments-0.4.2}/scripts/ensure_projectm_runtime.py +0 -0
  115. {framerudiments-0.4.0 → framerudiments-0.4.2}/scripts/full_preset_analysis.py +0 -0
  116. {framerudiments-0.4.0 → framerudiments-0.4.2}/scripts/generate_particle_gallery.py +0 -0
  117. {framerudiments-0.4.0 → framerudiments-0.4.2}/scripts/generate_post_effect_gallery.py +0 -0
  118. {framerudiments-0.4.0 → framerudiments-0.4.2}/scripts/generate_quality_gallery.py +0 -0
  119. {framerudiments-0.4.0 → framerudiments-0.4.2}/scripts/generate_rich_lyric_gallery.py +0 -0
  120. {framerudiments-0.4.0 → framerudiments-0.4.2}/scripts/generate_sprite_gallery.py +0 -0
  121. {framerudiments-0.4.0 → framerudiments-0.4.2}/scripts/generate_supersampling_gallery.py +0 -0
  122. {framerudiments-0.4.0 → framerudiments-0.4.2}/scripts/generate_timing_gallery.py +0 -0
  123. {framerudiments-0.4.0 → framerudiments-0.4.2}/scripts/generate_visualiser_routing_gallery.py +0 -0
  124. {framerudiments-0.4.0 → framerudiments-0.4.2}/scripts/install_analysis_releases.py +0 -0
  125. {framerudiments-0.4.0 → framerudiments-0.4.2}/scripts/prepare_pixelcue_taggers.py +0 -0
  126. {framerudiments-0.4.0 → framerudiments-0.4.2}/scripts/preset_behaviour_pipeline.py +0 -0
  127. {framerudiments-0.4.0 → framerudiments-0.4.2}/scripts/profile_visualisation_coverage.py +0 -0
  128. {framerudiments-0.4.0 → framerudiments-0.4.2}/scripts/profile_visualisers.py +0 -0
  129. {framerudiments-0.4.0 → framerudiments-0.4.2}/scripts/projectm_dll_diagnostics.py +0 -0
  130. {framerudiments-0.4.0 → framerudiments-0.4.2}/scripts/repair_projectm_mingw.py +0 -0
  131. {framerudiments-0.4.0 → framerudiments-0.4.2}/scripts/select_projectm_generator.py +0 -0
  132. {framerudiments-0.4.0 → framerudiments-0.4.2}/scripts/validate_patch.py +0 -0
  133. {framerudiments-0.4.0 → framerudiments-0.4.2}/setup.cfg +0 -0
  134. {framerudiments-0.4.0 → framerudiments-0.4.2}/src/framerudiments/__main__.py +0 -0
  135. {framerudiments-0.4.0 → framerudiments-0.4.2}/src/framerudiments/advanced_renderers.py +0 -0
  136. {framerudiments-0.4.0 → framerudiments-0.4.2}/src/framerudiments/atlas.py +0 -0
  137. {framerudiments-0.4.0 → framerudiments-0.4.2}/src/framerudiments/beat_alignment.py +0 -0
  138. {framerudiments-0.4.0 → framerudiments-0.4.2}/src/framerudiments/beat_timeline.py +0 -0
  139. {framerudiments-0.4.0 → framerudiments-0.4.2}/src/framerudiments/choreography.py +0 -0
  140. {framerudiments-0.4.0 → framerudiments-0.4.2}/src/framerudiments/circular_renderers.py +0 -0
  141. {framerudiments-0.4.0 → framerudiments-0.4.2}/src/framerudiments/effect_catalogue.py +0 -0
  142. {framerudiments-0.4.0 → framerudiments-0.4.2}/src/framerudiments/effect_renderers.py +0 -0
  143. {framerudiments-0.4.0 → framerudiments-0.4.2}/src/framerudiments/effects.py +0 -0
  144. {framerudiments-0.4.0 → framerudiments-0.4.2}/src/framerudiments/encoding.py +0 -0
  145. {framerudiments-0.4.0 → framerudiments-0.4.2}/src/framerudiments/flight.py +0 -0
  146. {framerudiments-0.4.0 → framerudiments-0.4.2}/src/framerudiments/gpu_spatial_backend.py +0 -0
  147. {framerudiments-0.4.0 → framerudiments-0.4.2}/src/framerudiments/io.py +0 -0
  148. {framerudiments-0.4.0 → framerudiments-0.4.2}/src/framerudiments/keyframes.py +0 -0
  149. {framerudiments-0.4.0 → framerudiments-0.4.2}/src/framerudiments/layer_animation.py +0 -0
  150. {framerudiments-0.4.0 → framerudiments-0.4.2}/src/framerudiments/layer_displacement.py +0 -0
  151. {framerudiments-0.4.0 → framerudiments-0.4.2}/src/framerudiments/layer_masks.py +0 -0
  152. {framerudiments-0.4.0 → framerudiments-0.4.2}/src/framerudiments/lyric_indicator.py +0 -0
  153. {framerudiments-0.4.0 → framerudiments-0.4.2}/src/framerudiments/modulation.py +0 -0
  154. {framerudiments-0.4.0 → framerudiments-0.4.2}/src/framerudiments/motion.py +0 -0
  155. {framerudiments-0.4.0 → framerudiments-0.4.2}/src/framerudiments/music_spatial_renderers.py +0 -0
  156. {framerudiments-0.4.0 → framerudiments-0.4.2}/src/framerudiments/output_quality.py +0 -0
  157. {framerudiments-0.4.0 → framerudiments-0.4.2}/src/framerudiments/post_effects.py +0 -0
  158. {framerudiments-0.4.0 → framerudiments-0.4.2}/src/framerudiments/preset_library.py +0 -0
  159. {framerudiments-0.4.0 → framerudiments-0.4.2}/src/framerudiments/preset_profiling.py +0 -0
  160. {framerudiments-0.4.0 → framerudiments-0.4.2}/src/framerudiments/profile_analysis.py +0 -0
  161. {framerudiments-0.4.0 → framerudiments-0.4.2}/src/framerudiments/project.py +0 -0
  162. {framerudiments-0.4.0 → framerudiments-0.4.2}/src/framerudiments/projectm_backend.py +0 -0
  163. {framerudiments-0.4.0 → framerudiments-0.4.2}/src/framerudiments/quality_effects.py +0 -0
  164. {framerudiments-0.4.0 → framerudiments-0.4.2}/src/framerudiments/rich_subtitles.py +0 -0
  165. {framerudiments-0.4.0 → framerudiments-0.4.2}/src/framerudiments/scoped_effects.py +0 -0
  166. {framerudiments-0.4.0 → framerudiments-0.4.2}/src/framerudiments/solid_spatial_renderers.py +0 -0
  167. {framerudiments-0.4.0 → framerudiments-0.4.2}/src/framerudiments/spatial_renderers.py +0 -0
  168. {framerudiments-0.4.0 → framerudiments-0.4.2}/src/framerudiments/spectrum.py +0 -0
  169. {framerudiments-0.4.0 → framerudiments-0.4.2}/src/framerudiments/sprite_assets/arcade.png +0 -0
  170. {framerudiments-0.4.0 → framerudiments-0.4.2}/src/framerudiments/sprite_assets/crystal.png +0 -0
  171. {framerudiments-0.4.0 → framerudiments-0.4.2}/src/framerudiments/sprite_assets/fire.png +0 -0
  172. {framerudiments-0.4.0 → framerudiments-0.4.2}/src/framerudiments/sprite_assets/generated-neon.png +0 -0
  173. {framerudiments-0.4.0 → framerudiments-0.4.2}/src/framerudiments/sprite_assets/glass.png +0 -0
  174. {framerudiments-0.4.0 → framerudiments-0.4.2}/src/framerudiments/sprite_assets/hud.png +0 -0
  175. {framerudiments-0.4.0 → framerudiments-0.4.2}/src/framerudiments/sprite_assets/ice.png +0 -0
  176. {framerudiments-0.4.0 → framerudiments-0.4.2}/src/framerudiments/sprite_assets/lcd-amber.png +0 -0
  177. {framerudiments-0.4.0 → framerudiments-0.4.2}/src/framerudiments/sprite_assets/lcd-green.png +0 -0
  178. {framerudiments-0.4.0 → framerudiments-0.4.2}/src/framerudiments/sprite_assets/lcd.png +0 -0
  179. {framerudiments-0.4.0 → framerudiments-0.4.2}/src/framerudiments/sprite_assets/led.png +0 -0
  180. {framerudiments-0.4.0 → framerudiments-0.4.2}/src/framerudiments/sprite_assets/manifest.json +0 -0
  181. {framerudiments-0.4.0 → framerudiments-0.4.2}/src/framerudiments/sprite_assets/metal.png +0 -0
  182. {framerudiments-0.4.0 → framerudiments-0.4.2}/src/framerudiments/sprite_assets/mono.png +0 -0
  183. {framerudiments-0.4.0 → framerudiments-0.4.2}/src/framerudiments/sprite_assets/neon.png +0 -0
  184. {framerudiments-0.4.0 → framerudiments-0.4.2}/src/framerudiments/sprite_assets/pixel.png +0 -0
  185. {framerudiments-0.4.0 → framerudiments-0.4.2}/src/framerudiments/sprite_assets/plasma.png +0 -0
  186. {framerudiments-0.4.0 → framerudiments-0.4.2}/src/framerudiments/sprite_assets/vfd.png +0 -0
  187. {framerudiments-0.4.0 → framerudiments-0.4.2}/src/framerudiments/sprite_catalogue.py +0 -0
  188. {framerudiments-0.4.0 → framerudiments-0.4.2}/src/framerudiments/sprite_renderers.py +0 -0
  189. {framerudiments-0.4.0 → framerudiments-0.4.2}/src/framerudiments/stem_blend.py +0 -0
  190. {framerudiments-0.4.0 → framerudiments-0.4.2}/src/framerudiments/stemlab.py +0 -0
  191. {framerudiments-0.4.0 → framerudiments-0.4.2}/src/framerudiments/subtitles.py +0 -0
  192. {framerudiments-0.4.0 → framerudiments-0.4.2}/src/framerudiments/super_sampling.py +0 -0
  193. {framerudiments-0.4.0 → framerudiments-0.4.2}/src/framerudiments/terrain_field.py +0 -0
  194. {framerudiments-0.4.0 → framerudiments-0.4.2}/src/framerudiments/timeline.py +0 -0
  195. {framerudiments-0.4.0 → framerudiments-0.4.2}/src/framerudiments/visual_style.py +0 -0
  196. {framerudiments-0.4.0 → framerudiments-0.4.2}/src/framerudiments/visualiser_assets/butterchurn-page.js +0 -0
  197. {framerudiments-0.4.0 → framerudiments-0.4.2}/src/framerudiments/visualiser_assets/butterchurn-worker.mjs +0 -0
  198. {framerudiments-0.4.0 → framerudiments-0.4.2}/src/framerudiments/visualiser_assets/feedback.json +0 -0
  199. {framerudiments-0.4.0 → framerudiments-0.4.2}/src/framerudiments/visualiser_assets/feedback.milk +0 -0
  200. {framerudiments-0.4.0 → framerudiments-0.4.2}/src/framerudiments/visualiser_assets/julia.json +0 -0
  201. {framerudiments-0.4.0 → framerudiments-0.4.2}/src/framerudiments/visualiser_assets/julia.milk +0 -0
  202. {framerudiments-0.4.0 → framerudiments-0.4.2}/src/framerudiments/visualiser_assets/kaleidoscope.json +0 -0
  203. {framerudiments-0.4.0 → framerudiments-0.4.2}/src/framerudiments/visualiser_assets/kaleidoscope.milk +0 -0
  204. {framerudiments-0.4.0 → framerudiments-0.4.2}/src/framerudiments/visualiser_assets/package-lock.json +0 -0
  205. {framerudiments-0.4.0 → framerudiments-0.4.2}/src/framerudiments/visualiser_assets/package.json +0 -0
  206. {framerudiments-0.4.0 → framerudiments-0.4.2}/src/framerudiments/visualiser_routing.py +0 -0
  207. {framerudiments-0.4.0 → framerudiments-0.4.2}/src/framerudiments/visualiser_setup.py +0 -0
  208. {framerudiments-0.4.0 → framerudiments-0.4.2}/src/framerudiments/visualisers.py +0 -0
  209. {framerudiments-0.4.0 → framerudiments-0.4.2}/src/framerudiments/word_timing.py +0 -0
  210. {framerudiments-0.4.0 → framerudiments-0.4.2}/src/framerudiments.egg-info/dependency_links.txt +0 -0
  211. {framerudiments-0.4.0 → framerudiments-0.4.2}/src/framerudiments.egg-info/entry_points.txt +0 -0
  212. {framerudiments-0.4.0 → framerudiments-0.4.2}/src/framerudiments.egg-info/top_level.txt +0 -0
  213. {framerudiments-0.4.0 → framerudiments-0.4.2}/tests/conftest.py +0 -0
  214. {framerudiments-0.4.0 → framerudiments-0.4.2}/tests/test_adapters.py +0 -0
  215. {framerudiments-0.4.0 → framerudiments-0.4.2}/tests/test_authoring_preview.py +0 -0
  216. {framerudiments-0.4.0 → framerudiments-0.4.2}/tests/test_beat_alignment.py +0 -0
  217. {framerudiments-0.4.0 → framerudiments-0.4.2}/tests/test_behaviour_pipeline.py +0 -0
  218. {framerudiments-0.4.0 → framerudiments-0.4.2}/tests/test_coverage_matrix.py +0 -0
  219. {framerudiments-0.4.0 → framerudiments-0.4.2}/tests/test_default_antialias.py +0 -0
  220. {framerudiments-0.4.0 → framerudiments-0.4.2}/tests/test_effect_batch.py +0 -0
  221. {framerudiments-0.4.0 → framerudiments-0.4.2}/tests/test_extracted_helpers.py +0 -0
  222. {framerudiments-0.4.0 → framerudiments-0.4.2}/tests/test_flight.py +0 -0
  223. {framerudiments-0.4.0 → framerudiments-0.4.2}/tests/test_full_preset_analysis.py +0 -0
  224. {framerudiments-0.4.0 → framerudiments-0.4.2}/tests/test_gpu_ci_isolation.py +0 -0
  225. {framerudiments-0.4.0 → framerudiments-0.4.2}/tests/test_keyframes.py +0 -0
  226. {framerudiments-0.4.0 → framerudiments-0.4.2}/tests/test_layer_masks.py +0 -0
  227. {framerudiments-0.4.0 → framerudiments-0.4.2}/tests/test_lyrics.py +0 -0
  228. {framerudiments-0.4.0 → framerudiments-0.4.2}/tests/test_music_spatial_pipeline.py +0 -0
  229. {framerudiments-0.4.0 → framerudiments-0.4.2}/tests/test_music_spatial_renderers.py +0 -0
  230. {framerudiments-0.4.0 → framerudiments-0.4.2}/tests/test_particle_engine.py +0 -0
  231. {framerudiments-0.4.0 → framerudiments-0.4.2}/tests/test_patch_validation.py +0 -0
  232. {framerudiments-0.4.0 → framerudiments-0.4.2}/tests/test_phase3_animation.py +0 -0
  233. {framerudiments-0.4.0 → framerudiments-0.4.2}/tests/test_phase3_gpu_injection.py +0 -0
  234. {framerudiments-0.4.0 → framerudiments-0.4.2}/tests/test_pipeline.py +0 -0
  235. {framerudiments-0.4.0 → framerudiments-0.4.2}/tests/test_preset_profiling.py +0 -0
  236. {framerudiments-0.4.0 → framerudiments-0.4.2}/tests/test_projectm_dll_diagnostics.py +0 -0
  237. {framerudiments-0.4.0 → framerudiments-0.4.2}/tests/test_projectm_generator.py +0 -0
  238. {framerudiments-0.4.0 → framerudiments-0.4.2}/tests/test_projectm_runtime_preflight.py +0 -0
  239. {framerudiments-0.4.0 → framerudiments-0.4.2}/tests/test_pytest_temp_isolation.py +0 -0
  240. {framerudiments-0.4.0 → framerudiments-0.4.2}/tests/test_quality_effects.py +0 -0
  241. {framerudiments-0.4.0 → framerudiments-0.4.2}/tests/test_release_metadata.py +0 -0
  242. {framerudiments-0.4.0 → framerudiments-0.4.2}/tests/test_repair_projectm_mingw.py +0 -0
  243. {framerudiments-0.4.0 → framerudiments-0.4.2}/tests/test_rich_subtitles.py +0 -0
  244. {framerudiments-0.4.0 → framerudiments-0.4.2}/tests/test_rudiment_renderers.py +0 -0
  245. {framerudiments-0.4.0 → framerudiments-0.4.2}/tests/test_scoped_effects.py +0 -0
  246. {framerudiments-0.4.0 → framerudiments-0.4.2}/tests/test_solid_spatial_integration.py +0 -0
  247. {framerudiments-0.4.0 → framerudiments-0.4.2}/tests/test_solid_spatial_renderers.py +0 -0
  248. {framerudiments-0.4.0 → framerudiments-0.4.2}/tests/test_spatial_renderers.py +0 -0
  249. {framerudiments-0.4.0 → framerudiments-0.4.2}/tests/test_spectrum.py +0 -0
  250. {framerudiments-0.4.0 → framerudiments-0.4.2}/tests/test_sprite_renderers.py +0 -0
  251. {framerudiments-0.4.0 → framerudiments-0.4.2}/tests/test_stem_blend.py +0 -0
  252. {framerudiments-0.4.0 → framerudiments-0.4.2}/tests/test_stem_source_integration.py +0 -0
  253. {framerudiments-0.4.0 → framerudiments-0.4.2}/tests/test_supersampling.py +0 -0
  254. {framerudiments-0.4.0 → framerudiments-0.4.2}/tests/test_timeline.py +0 -0
  255. {framerudiments-0.4.0 → framerudiments-0.4.2}/tests/test_variable_bpm_words.py +0 -0
  256. {framerudiments-0.4.0 → framerudiments-0.4.2}/tests/test_visualisation_modulation.py +0 -0
  257. {framerudiments-0.4.0 → framerudiments-0.4.2}/tests/test_visualiser_routing.py +0 -0
  258. {framerudiments-0.4.0 → framerudiments-0.4.2}/tests/test_visualisers.py +0 -0
  259. {framerudiments-0.4.0 → framerudiments-0.4.2}/tests/test_windows_launcher_splitpath.py +0 -0
@@ -18,3 +18,7 @@ https://kieransimkin.co.uk/danceflow/.
18
18
  Future v* tags publish automatically after CI. Keep the pypi environment free
19
19
  of human reviewer gates; preserve tests, source/tag identity, checksum validation
20
20
  and immutable assets. New publication destinations still require user authority.
21
+
22
+ ## Full ecosystem and release preflight
23
+
24
+ Before every new workflow run, check the latest stable official release and observe the actual runtime used by the job. Follow [the shared preflight](https://github.com/kieransimkin/DanceFlow/blob/main/docs/workflows/release-preflight.md) and this project's [people-and-agent guide](docs/ECOSYSTEM.md). Review the complete relevant capability inventory rather than only a familiar command. Consider every DanceFlow component against the actual task; use and compose all applicable supported capabilities, and improve a concrete reusable gap in its canonical repository. Record why existing capabilities suffice when no change is justified. No catalogue checklist expands the task, authorises model downloads/training, or proves integration. Preserve exact source/package identity, clocks, model-local storage, privacy, costs, immutable releases and separate deployment gates.
@@ -9,3 +9,4 @@ prune visualiser-analysis
9
9
 
10
10
  recursive-include scripts *.py *.ps1
11
11
  recursive-include src/framerudiments/sprite_assets *.png *.json
12
+ recursive-include src/framerudiments/fire_assets *.png *.json *.md
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: framerudiments
3
- Version: 0.4.0
3
+ Version: 0.4.2
4
4
  Summary: Deterministic Shorts and lyric visualisers using DanceRudiments and StemLab evidence.
5
5
  Author: Kieran Simkin
6
6
  License-Expression: MIT
@@ -19,15 +19,52 @@ Requires-Dist: PyOpenGL==3.1.10; extra == "projectm"
19
19
  Provides-Extra: gpu
20
20
  Requires-Dist: moderngl<6,>=5.11; extra == "gpu"
21
21
  Requires-Dist: numpy>=1.26; extra == "gpu"
22
+ Provides-Extra: materials
23
+ Requires-Dist: numpy>=1.26; extra == "materials"
22
24
  Provides-Extra: dev
23
25
  Requires-Dist: pytest>=8; extra == "dev"
24
26
  Requires-Dist: build>=1.2; extra == "dev"
25
27
  Requires-Dist: ruff>=0.9; extra == "dev"
26
28
  Requires-Dist: twine>=6; extra == "dev"
29
+ Requires-Dist: numpy>=1.26; extra == "dev"
27
30
  Dynamic: license-file
28
31
 
29
32
  # FrameRudiments
30
33
 
34
+ ## Five fire methods and ice
35
+
36
+ Version 0.4.2 adds filmed flame, animated flame sprites, a bounded 2D fluid
37
+ solver, GPU volumetric rays, Blender/Mantaflow bake playback, scorched artwork burn-away,
38
+ fractured ice and frost. Use ordinary material layers or the reusable
39
+ `FireRenderer` and `NaturalMaterial` APIs. Source clocks, clean text, transparent edges and
40
+ seek-safe rendering remain explicit. See [natural materials](docs/natural-materials.md).
41
+
42
+ ![Actual synthetic fire and ice render](docs/media/natural-materials.png)
43
+
44
+ [Play the actual four-second demonstration](docs/media/natural-materials.mp4).
45
+ Synthetic tone and labelled paper effects; no private campaign media or models.
46
+
47
+ ## Complete preset portraits and contact sheets (development)
48
+
49
+ The hybrid workflow combines reference-free style, colour, shape and movement
50
+ observations with controlled silence/music and sound-probe comparisons in **one
51
+ paragraph**. Numerical analysis runs first; at most 24 distinct output images
52
+ receive appearance inference. Labelled contact sheets and exact original
53
+ keyframes are retained for comparison with the paragraph.
54
+ See [hybrid preset analysis](docs/hybrid-preset-analysis.md) for the unified
55
+ launcher, no-rerender reanalysis, model policy, data retention and limitations.
56
+
57
+ ## Controlled sound-response analysis
58
+
59
+ The new `scripts/Run-ControlledPresetAnalysis.ps1` tests **zero image feed**, silence,
60
+ level-matched low/mid/high probes and rhythmic test music across independent render
61
+ trials. Temporal measurements precede sparse appearance inference. Summaries exclude all
62
+ reference-fed conditions; optional texture-transfer results stay separate.
63
+ See [controlled audio responses](docs/controlled-audio-response.md) for setup,
64
+ protocol limits, supplied-music tests, repeat controls and safe resume.
65
+ The pilot uses a separate project-local analysis environment and does not alter the
66
+ stable releases pinned below or previous catalogue results.
67
+
31
68
  ## Pinned visual-analysis releases
32
69
 
33
70
  PixelCue **0.9.1** and PrismMoves **0.2.0** are pinned by final release URL,
@@ -40,162 +77,11 @@ The native CI job tests the actual released sequence/description APIs with
40
77
  synthetic frames and no neural inference. OpenCV and other runtime dependencies
41
78
  remain separately constrained; this is not a whole-environment lock.
42
79
 
43
- ## Efficient preset descriptions (new recommended analysis entry point)
44
-
45
- Run `./scripts/Run-PresetBehaviourAnalysis.ps1 -Limit 2` after installing the
46
- coordinated PixelCue/PrismMoves update. It captures 15 fps over 3 seconds (46
47
- frames per condition; 368 for the default four inputs and two audio controls),
48
- measures motion **before** semantic inference, and selects at most 24 unique
49
- non-blank images for CLIP and BLIP. Generated fixtures render at 384 x 384
50
- instead of the legacy 160-pixel pilot. The native render/audio clock is unchanged.
51
-
52
- One paragraph per preset describes supported movement, appearance and artefacts.
53
- The searchable gallery rebuilds from completed per-preset records at each job,
54
- not from an occasionally checkpointed index. Raw dense frames and attempts stay
55
- in ignored `_work/`; the compact reports and compressed evidence are under
56
- `visualiser-analysis/behaviour-catalogue/`. The old full-catalogue is preserved.
57
-
58
- `./scripts/Run-PresetBehaviourAnalysis.ps1 -DescribeExisting` produces a separate
59
- atlas from the saved analysis receipts without rerunning models. Sparse legacy
60
- stills never acquire invented temporal measurements. An authored `-Suite` or an
61
- explicit `-ArtworkDirectory` supplies real material; defaults use synthetic audio.
62
- See [the efficient workflow and its limitations](docs/preset-behaviour.md).
80
+ ## Before every new workflow
63
81
 
64
- Windows setup also gains checked project-local MinGW runtime bundling. Missing
65
- compiler DLLs come from the recorded, matching compiler installation and are
66
- verified in a fresh process; arbitrary DLL downloads and global PATH changes
67
- are not used. See [projectM local runtime bundle](docs/projectm-local-runtime.md).
82
+ Check the latest stable official release and the actual installed/imported version before starting; do not infer currency from a directory name or a development checkout. Read the current release notes, tagged capability documentation and relevant Potential problems. Use the [DanceFlow release preflight](https://github.com/kieransimkin/DanceFlow/blob/main/docs/workflows/release-preflight.md) and [complete capability references](https://github.com/kieransimkin/DanceFlow/blob/main/docs/capabilities/index.md).
68
83
 
69
- FrameRudiments renders Shorts, Canvas-style clips and full lyric visualisers
70
- from one traceable timeline. It is the offline Python renderer in the
71
- [DanceFlow ecosystem](https://kieransimkin.co.uk/danceflow/).
72
-
73
- ## Full visualiser preset analysis — PrismMoves and PixelCue
74
-
75
- Run `./scripts/Run-FullPresetAnalysis.ps1` in Windows PowerShell for a **single
76
- resumable entry point** that installs the optional visual-analysis dependencies,
77
- captures every available Butterchurn/projectM preset, and produces searchable
78
- per-preset metrics, caption and tag hypotheses, summaries and previews.
79
- A quick pilot is `./scripts/Run-FullPresetAnalysis.ps1 -Limit 5`; rerun without
80
- `-Limit` to continue all remaining presets. The complete catalogue includes
81
- explicit partial/failure receipts for presets that cannot render.
82
-
83
- The full analysis evaluates all four image families (album/lyric input, colour
84
- bars, grid/rings and text card), music and silence, and frames at 0, 0.5, 1.5
85
- and 3 seconds. PixelCue and PrismMoves examine every captured output by
86
- default, and each preset gets labelled contact sheets plus an evidence-linked
87
- summary across the input conditions and time points. The processing queue
88
- alternates randomly selected projectM and Butterchurn presets, using a fresh
89
- shuffle of unprocessed entries each invocation. `-OrderSeed 20261018` optionally
90
- reproduces the order; receipts are saved under ignored `_work/schedules/`.
91
- Existing five-preset pilots using the older, narrower protocol need an explicit
92
- `-UpgradeCoverage` to archive earlier results before rerunning the fuller test.
93
-
94
- All model weights, runtimes and caches live in **project-local `models/`**
95
- (Git ignored). All generated results live under
96
- **`visualiser-analysis/full-catalogue/`** (commit the curated reports when ready;
97
- raw intermediate images in `_work/` stay local and ignored). No private music
98
- is required: a synthetic, checksum-pinned fixture is generated by default.
99
- See the [complete setup, resume, model, verification and Git guide](docs/full-preset-analysis.md).
100
-
101
- **0.2.0** accepts source-bound StemLab BPM/first-beat readings through
102
- `clock.beat_alignment`. Procedural motion follows the fractional beat phase
103
- after excerpt/repeat mapping. Audio, lyric/cue timestamps and captured
104
- recordings retain their original source clock. See [beat alignment](docs/beat-alignment.md).
105
-
106
- ![Actual encoded FrameRudiments 0.2.0 synthetic example with original and aligned movement side by side, source-timed captions and recorded bands](docs/media/beat-alignment.png)
107
-
108
- [Play the four-second demonstration](docs/media/beat-alignment.mp4): original
109
- 120 BPM clicks start at 0.125 seconds; the right movement uses the -16 pip
110
- reading. Text and recorded bands keep source time. This synthetic example
111
- demonstrates clock composition; it does not establish song-analysis accuracy.
112
- [Encoded-frame verification and hashes](docs/media/beat-alignment-evidence.json).
113
-
114
- It consolidates the shared Python/Pillow/FFmpeg mechanisms developed across
115
- the existing Gilt Trip, Blame Putin, Clay, Paper Dreams, Free Danny Tommo,
116
- Silly Sausage Britain and Moderate or Good renderers. Release-specific artwork,
117
- scene layouts and creative decisions belong in project files or Python scene
118
- hooks. Historical render scripts and approved outputs remain preserved.
119
-
120
- ## Particle and smoke emitters
121
-
122
- A new deterministic `type: "emitter"` layer provides continuous smoke,
123
- sparks, embers, snow, rain, confetti and cue-triggered bursts, driven by
124
- independent DanceRudiments. Pinned DanceMoves/StemLab `.lrc`, `.cue`, or
125
- versioned `.json` timing files can trigger one-shot explosions; `hybrid`
126
- mode combines these with constant emission. Every parameter in the engine's
127
- numeric style table supports native `style.*` modulation. Pinned transparent
128
- PNG particles are optional, and the existing element- and frame-level post
129
- passes remain available. See [particle and smoke reference](docs/particle-smoke.md)
130
- and the [CI-generated synthetic gallery](https://kieransimkin.github.io/FrameRudiments/particles/).
131
-
132
- ## Variable-tempo synchronisation and word subtitles
133
-
134
- FrameRudiments accepts a checksum-pinned `stemlab.beat-timeline.v1` in
135
- `clock.beat_timeline` for true piecewise BPM/beat phase at sample-frame anchors,
136
- matching StemLab and the opt-in DanceMoves variable-tempo API. Nominal/fixed
137
- BPM, beat grids, and fixed-tempo `beat_alignment` remain supported independently.
138
- Lyrics, cue timing and recorded Rudiments retain their source audio clock.
139
- A separate pinned `word_lyrics` LRC supports enhanced timestamps, per-word
140
- karaoke highlighting, progressive word colour and a distinct `word_captions`
141
- lane; line captions remain available through `lyrics`. Both per-line and
142
- per-word subtitle exports are generated with the same encoded frame ledger.
143
- See [variable-tempo and word LRC guide](docs/variable-bpm-word-subtitles.md)
144
- and the [synthetic public demo](https://kieransimkin.github.io/FrameRudiments/timing/).
145
-
146
- ## Rich lyric typography and word-following particle sprites
147
-
148
- Caption blocks and identity titles optionally accept checksum-pinned `font` overrides and
149
- `effects` for stroked, bevelled, embossed, multi-stop gradient, inner/outer glow, and shadowed
150
- text. Existing plain text remains untouched unless configured. Set `word_indicator` for a
151
- native 1-dimensional DanceRudiment-driven bouncing sprite that tracks the active word of
152
- the full line. Its particle field can be continuous, word/cue-triggered, or hybrid;
153
- trigger windows independently change colour, density, size, glow and burst count.
154
- See [rich lyric reference](docs/rich-lyric-effects.md) and the
155
- [CI-generated demo](https://kieransimkin.github.io/FrameRudiments/rich-lyrics/).
156
-
157
- ## Maximum-quality rendering enabled by default
158
-
159
- FrameRudiments now redraws pinned text outlines and procedural vector Rudiment
160
- views at **4× linear pixel resolution** before Lanczos reduction. It also
161
- renders **eight different source-clock subframes per output frame**,
162
- averaging them in linear light for true temporal supersampling. A final
163
- three-pass edge-aware AA filter runs after the optional GPU effect chain.
164
- These are the maximum supported preset settings and require no project changes.
165
- Explicitly lower them with `render_quality.spatial_scale` (1–4),
166
- `render_quality.temporal_samples` (1–8), or
167
- `render_quality.enabled: false` for deliberate pixel art or legacy output.
168
- Full-quality rendering can be much slower; read the
169
- [spatiotemporal sampling guide](docs/spatiotemporal-supersampling.md).
170
-
171
- ## Layer-selective Butterchurn/projectM feedback
172
-
173
- Each composited element can feed the GPU visualisers continuously, only
174
- during a bounded window measured in **64-pip source-clock beats**, or not at
175
- all. Independently, an element can render cleanly over the last stage.
176
- Word captions, lyric sprites, particle emitters, backgrounds and normal
177
- Rudiment layers use the same routing policy. Existing projects remain
178
- unchanged. [Configuration and examples](docs/visualiser-routing.md) ·
179
- [CI comparisons](https://kieransimkin.github.io/FrameRudiments/routing/).
180
-
181
- ## Solid 3D meshes and atmospheric rendering
182
-
183
- Three additional `spatial-solid-*` viewport modes (torus, sphere and terrain)
184
- provide per-pixel Z-buffered geometry, roughness/metallic direct lighting and
185
- depth-terminated procedural fog. They use the normal StemLab/DanceRudiments
186
- motion paths and can feed existing Butterchurn/projectM compositing chains.
187
- They are CPU rasterisers, not GPU mesh engines.
188
- See the [3D rendering guide](docs/solid-spatial-renderers.md).
189
-
190
- Three opt-in `spatial-music-*` modes add music-reactive mesh deformation,
191
- procedural rock/ice materials, erosion, normal/bump effects, and an optional
192
- ModernGL offscreen rasteriser with depth-tested shadows and single-scattering
193
- volumetric lighting. `spatial-music-terrain` can generate new rows from a
194
- checksum-pinned calibrated StemLab Fourier recording's history with
195
- `style.terrain_source: "fft"`. Existing DanceRudiments drivers can modulate
196
- mesh, camera, material, lighting and atmospheric properties. The CPU path
197
- remains deterministic and works without GPU dependencies.
198
- See [music-reactive 3D](docs/music-reactive-3d.md) for integration and limits.
84
+ People and agents should consider the full ecosystem, use all capabilities that materially serve the task, compose supported files/APIs, and improve a demonstrated reusable gap in its canonical tool. Record why no worthwhile change is justified when that is the result. Keep independent tool identities, compatibility, source clocks, privacy, model/download costs and publication/deployment permissions intact. Store weights and model-specific caches in the owning project's ignored `models/`.
199
85
 
200
86
  ## Install and run
201
87
 
@@ -295,65 +181,126 @@ before rendering. The hook is supplied by trusted Python code, never imported
295
181
  or executed from a project JSON. Do not reproduce clock, sampling, caption,
296
182
  encode or verification loops in release adapters.
297
183
 
298
- ## Evidence and limits
184
+ ## Variable-tempo synchronisation and word subtitles
299
185
 
300
- `plan` is preparation, `preflight` checks all composed frames without encoding,
301
- and `render` produces **technical-QA passed; creative and attended listening
302
- review pending**. No command uploads, schedules or publishes anything.
303
- Automatic checks cannot establish sung-word accuracy, pleasant motion, a
304
- musical loop seam, platform preview acceptance, rights or public eligibility.
305
- Caption boxes are composition constraints, not current official platform
306
- safe-zone verification. Review the exact encoded file and destination preview.
186
+ FrameRudiments accepts a checksum-pinned `stemlab.beat-timeline.v1` in
187
+ `clock.beat_timeline` for true piecewise BPM/beat phase at sample-frame anchors,
188
+ matching StemLab and the opt-in DanceMoves variable-tempo API. Nominal/fixed
189
+ BPM, beat grids, and fixed-tempo `beat_alignment` remain supported independently.
190
+ Lyrics, cue timing and recorded Rudiments retain their source audio clock.
191
+ A separate pinned `word_lyrics` LRC supports enhanced timestamps, per-word
192
+ karaoke highlighting, progressive word colour and a distinct `word_captions`
193
+ lane; line captions remain available through `lyrics`. Both per-line and
194
+ per-word subtitle exports are generated with the same encoded frame ledger.
195
+ See [variable-tempo and word LRC guide](docs/variable-bpm-word-subtitles.md)
196
+ and the [synthetic public demo](https://kieransimkin.github.io/FrameRudiments/timing/).
307
197
 
308
- Constant-BPM and saved variable-grid clocks record their authority/status;
309
- an estimate never becomes artist confirmation. Beat grids extrapolate from
310
- their first/last interval outside their covered extent; constrain projects to
311
- supported intervals where that is unsuitable. A ranked match does not prove
312
- whole-song alignment. Recording source/axis provenance is retained; the author
313
- must select the correct master/stem association. No live WordPress timing,
314
- sensor or plugin configuration is changed by offline rendering.
198
+ ## Rich lyric typography and word-following particle sprites
315
199
 
316
- All text in `captions.ass` is a portable timing sidecar with neutral styling;
317
- the raster compositor remains the authority for the approved layout.
200
+ Caption blocks and identity titles optionally accept checksum-pinned `font` overrides and
201
+ `effects` for stroked, bevelled, embossed, multi-stop gradient, inner/outer glow, and shadowed
202
+ text. Existing plain text remains untouched unless configured. Set `word_indicator` for a
203
+ native 1-dimensional DanceRudiment-driven bouncing sprite that tracks the active word of
204
+ the full line. Its particle field can be continuous, word/cue-triggered, or hybrid;
205
+ trigger windows independently change colour, density, size, glow and burst count.
206
+ See [rich lyric reference](docs/rich-lyric-effects.md) and the
207
+ [CI-generated demo](https://kieransimkin.github.io/FrameRudiments/rich-lyrics/).
318
208
 
319
- ## Development
209
+ ## Particle and smoke emitters
320
210
 
321
- ```sh
322
- python -m pip install -e '.[dev]'
323
- ruff check .
324
- pytest
325
- python -m build
326
- ```
211
+ A new deterministic `type: "emitter"` layer provides continuous smoke,
212
+ sparks, embers, snow, rain, confetti and cue-triggered bursts, driven by
213
+ independent DanceRudiments. Pinned DanceMoves/StemLab `.lrc`, `.cue`, or
214
+ versioned `.json` timing files can trigger one-shot explosions; `hybrid`
215
+ mode combines these with constant emission. Every parameter in the engine's
216
+ numeric style table supports native `style.*` modulation. Pinned transparent
217
+ PNG particles are optional, and the existing element- and frame-level post
218
+ passes remain available. See [particle and smoke reference](docs/particle-smoke.md)
219
+ and the [CI-generated synthetic gallery](https://kieransimkin.github.io/FrameRudiments/particles/).
327
220
 
328
- Set `FRAMERUDIMENTS_TEST_FONT` and `FRAMERUDIMENTS_FFMPEG` to run all integration
329
- tests. Without them, corresponding checks report skipped. Tests cover native
330
- sampling, non-looping recordings, input identity, lyric clears, excerpt/repeat
331
- boundaries, text/alpha overflow and actual encoded portrait/landscape/square
332
- outputs. Use synthetic fixtures; never put songs, personal data or private
333
- analysis outputs into the source distribution.
221
+ ## Image-backed Rudiment renderers: 52 additional options
334
222
 
335
- ## Source, contribution and releases
223
+ FrameRudiments now offers **213 built-in Rudiment renderers**: the existing 161 vector
224
+ options remain registered and unchanged, and 52 sprite-rendered spectrum,
225
+ spectrogram, waveform and movement alternatives can be selected independently.
226
+ The package bundles **17 PNG sprite atlas themes** (1,088 tiles), including 64
227
+ transparent image-generated neon motifs and 1,024 procedurally generated LCD,
228
+ LED, VFD, crystal, glass, retro-pixel, flame and other tiles. Pinned custom
229
+ PNG atlases, animated cell selection and the existing DanceRudiment geometry/
230
+ colour modulation and per-element/full-frame post effects are supported.
336
231
 
337
- [Canonical repository](https://github.com/kieransimkin/FrameRudiments) ·
338
- [Python package](https://pypi.org/project/framerudiments/) ·
339
- [Issues and improvements](https://github.com/kieransimkin/FrameRudiments/issues)
232
+ [Explore vector and sprite comparisons](https://kieransimkin.github.io/FrameRudiments/sprites/)
233
+ and see the [full sprite renderer reference](docs/sprite-visualisations.md).
234
+ There are also 40 new per-sprite numeric controls (including size, rotation,
235
+ colour channels, jitter, glow and animation speed) and validated native-driven
236
+ categorical theme, shape and palette choices. The 16 new modulation lab
237
+ scenes show these controls at four encoded-frame moments.
340
238
 
341
- Read [CONTRIBUTING.md](CONTRIBUTING.md) before changing the engine. Improvements
342
- belong in focused pull requests to the canonical repository, with current README,
343
- meaningful tests and reproducible synthetic examples.
239
+ The demo images are synthetic, not measured audio.
344
240
 
345
- The GitHub Actions CI runs the complete render suite on Linux and Windows with
346
- Python 3.11 and 3.13. The release workflow validates the immutable `v<version>` tag,
347
- re-runs tests, builds/checks wheel and source distribution, performs a clean wheel
348
- render and publishes exact checksum-labelled assets. Pushing a new `v*` tag publishes
349
- to GitHub and PyPI automatically after validation; no human reviewer or manual
350
- publication approval is required. The `pypi` environment has no reviewer gate.
351
- An existing release is reused only after its source commit and downloaded checksums
352
- match; assets are never overwritten. Manual dispatch can resume a registry upload
353
- from an existing immutable tag, preserving its exact GitHub bytes. The PyPI job
354
- uses a separately configured trusted publisher; no API token is stored in this project.
355
- A GitHub release and a PyPI listing are separately verified outcomes.
241
+ Enable Settings → Pages → GitHub Actions as the repository publication source.
242
+
243
+ ## Solid 3D meshes and atmospheric rendering
244
+
245
+ Three additional `spatial-solid-*` viewport modes (torus, sphere and terrain)
246
+ provide per-pixel Z-buffered geometry, roughness/metallic direct lighting and
247
+ depth-terminated procedural fog. They use the normal StemLab/DanceRudiments
248
+ motion paths and can feed existing Butterchurn/projectM compositing chains.
249
+ They are CPU rasterisers, not GPU mesh engines.
250
+ See the [3D rendering guide](docs/solid-spatial-renderers.md).
251
+
252
+ Three opt-in `spatial-music-*` modes add music-reactive mesh deformation,
253
+ procedural rock/ice materials, erosion, normal/bump effects, and an optional
254
+ ModernGL offscreen rasteriser with depth-tested shadows and single-scattering
255
+ volumetric lighting. `spatial-music-terrain` can generate new rows from a
256
+ checksum-pinned calibrated StemLab Fourier recording's history with
257
+ `style.terrain_source: "fft"`. Existing DanceRudiments drivers can modulate
258
+ mesh, camera, material, lighting and atmospheric properties. The CPU path
259
+ remains deterministic and works without GPU dependencies.
260
+ See [music-reactive 3D](docs/music-reactive-3d.md) for integration and limits.
261
+
262
+ ## Layer-selective Butterchurn/projectM feedback
263
+
264
+ Each composited element can feed the GPU visualisers continuously, only
265
+ during a bounded window measured in **64-pip source-clock beats**, or not at
266
+ all. Independently, an element can render cleanly over the last stage.
267
+ Word captions, lyric sprites, particle emitters, backgrounds and normal
268
+ Rudiment layers use the same routing policy. Existing projects remain
269
+ unchanged. [Configuration and examples](docs/visualiser-routing.md) ·
270
+ [CI comparisons](https://kieransimkin.github.io/FrameRudiments/routing/).
271
+
272
+ ## Per-element and full-frame post-render effects
273
+
274
+ The new `post_effects` project field supports isolated effects for **each**
275
+ background, scene, sprite, legacy bars, Rudiment layer, identity caption or
276
+ lyric-art element, and separate passes over the **finished frame**. All 161
277
+ renderers and the shared gradients/CRT/colour post effects are supported. Numeric
278
+ parameters use native DanceRudiment modulation; palettes, colour-stop sets and
279
+ gradient modes can switch between validated alternatives. Independent layer
280
+ passes cannot recolour already composited neighbours, while a frame pass can
281
+ act on everything. These stages run before the existing optional
282
+ Butterchurn/projectM feedback chain. See the [compositor effects reference](docs/scoped-post-effects.md)
283
+ and the [public scopes gallery](https://kieransimkin.github.io/FrameRudiments/scopes/).
284
+
285
+ ## Maximum-quality rendering enabled by default
286
+
287
+ FrameRudiments now redraws pinned text outlines and procedural vector Rudiment
288
+ views at **4× linear pixel resolution** before Lanczos reduction. It also
289
+ renders **eight different source-clock subframes per output frame**,
290
+ averaging them in linear light for true temporal supersampling. A final
291
+ three-pass edge-aware AA filter runs after the optional GPU effect chain.
292
+ These are the maximum supported preset settings and require no project changes.
293
+ Explicitly lower them with `render_quality.spatial_scale` (1–4),
294
+ `render_quality.temporal_samples` (1–8), or
295
+ `render_quality.enabled: false` for deliberate pixel art or legacy output.
296
+ Full-quality rendering can be much slower; read the
297
+ [spatiotemporal sampling guide](docs/spatiotemporal-supersampling.md).
298
+
299
+ ## High-quality antialiasing and motion blur
300
+
301
+ Opt-in edge-aware antialiasing and premultiplied-alpha directional blur now work in Rudiment `visual` settings and independent per-element or whole-frame `post_effects` stages. Both accept native DanceRudiment modulation of all numeric settings, including direction, shutter distance, samples, strength, thresholds, radius and falloff. A separate `post_effects.temporal` shutter recomposes actual observed encoded frames in linear-light RGB, bounded to the current source repeat. It does not invent subframes or optical flow.
356
302
 
303
+ The [CI-generated AA and motion-blur comparison gallery](https://kieransimkin.github.io/FrameRudiments/quality/) combines four existing visualiser modes with nine quality-effect configurations, four observed moments each, and machine-readable parameters. See [the quality-effects guide](docs/quality-effects.md).
357
304
 
358
305
  ## Full-frame MilkDrop effects, including lyrics and animated sprites
359
306
 
@@ -445,43 +392,179 @@ pixelation, grain, vignette, edge highlights, halftone, chromatic separation,
445
392
  solarisation and glitches. All these visual controls can be driven by
446
393
  source-clocked DanceRudiments. See [expanded effects reference](docs/expanded-effects.md).
447
394
 
448
- ## Image-backed Rudiment renderers: 52 additional options
395
+ ## Pinned visual-analysis releases
449
396
 
450
- FrameRudiments now offers **213 built-in Rudiment renderers**: the existing 161 vector
451
- options remain registered and unchanged, and 52 sprite-rendered spectrum,
452
- spectrogram, waveform and movement alternatives can be selected independently.
453
- The package bundles **17 PNG sprite atlas themes** (1,088 tiles), including 64
454
- transparent image-generated neon motifs and 1,024 procedurally generated LCD,
455
- LED, VFD, crystal, glass, retro-pixel, flame and other tiles. Pinned custom
456
- PNG atlases, animated cell selection and the existing DanceRudiment geometry/
457
- colour modulation and per-element/full-frame post effects are supported.
397
+ PixelCue **0.9.1** and PrismMoves **0.2.0** are pinned by final release URL,
398
+ source commit and wheel SHA-256 in `analysis-releases.json`. Both analysis
399
+ launchers install these coordinated wheels into the project-local analysis
400
+ environment; neither can silently restore the old development/API pair.
401
+ Run `scripts/install_analysis_releases.py --python PATH_TO_ANALYSIS_PYTHON
402
+ --with-sequence` to reinstall the pinned pair without downloading model weights.
403
+ The native CI job tests the actual released sequence/description APIs with
404
+ synthetic frames and no neural inference. OpenCV and other runtime dependencies
405
+ remain separately constrained; this is not a whole-environment lock.
458
406
 
459
- [Explore vector and sprite comparisons](https://kieransimkin.github.io/FrameRudiments/sprites/)
460
- and see the [full sprite renderer reference](docs/sprite-visualisations.md).
461
- There are also 40 new per-sprite numeric controls (including size, rotation,
462
- colour channels, jitter, glow and animation speed) and validated native-driven
463
- categorical theme, shape and palette choices. The 16 new modulation lab
464
- scenes show these controls at four encoded-frame moments.
407
+ ## Efficient preset descriptions (new recommended analysis entry point)
465
408
 
466
- The demo images are synthetic, not measured audio.
409
+ Run `./scripts/Run-PresetBehaviourAnalysis.ps1 -Limit 2` after installing the
410
+ coordinated PixelCue/PrismMoves update. It captures 15 fps over 3 seconds (46
411
+ frames per condition; 368 for the default four inputs and two audio controls),
412
+ measures motion **before** semantic inference, and selects at most 24 unique
413
+ non-blank images for CLIP and BLIP. Generated fixtures render at 384 x 384
414
+ instead of the legacy 160-pixel pilot. The native render/audio clock is unchanged.
467
415
 
468
- Enable Settings → Pages → GitHub Actions as the repository publication source.
416
+ One paragraph per preset describes supported movement, appearance and artefacts.
417
+ The searchable gallery rebuilds from completed per-preset records at each job,
418
+ not from an occasionally checkpointed index. Raw dense frames and attempts stay
419
+ in ignored `_work/`; the compact reports and compressed evidence are under
420
+ `visualiser-analysis/behaviour-catalogue/`. The old full-catalogue is preserved.
469
421
 
470
- ## Per-element and full-frame post-render effects
422
+ `./scripts/Run-PresetBehaviourAnalysis.ps1 -DescribeExisting` produces a separate
423
+ atlas from the saved analysis receipts without rerunning models. Sparse legacy
424
+ stills never acquire invented temporal measurements. An authored `-Suite` or an
425
+ explicit `-ArtworkDirectory` supplies real material; defaults use synthetic audio.
426
+ See [the efficient workflow and its limitations](docs/preset-behaviour.md).
471
427
 
472
- The new `post_effects` project field supports isolated effects for **each**
473
- background, scene, sprite, legacy bars, Rudiment layer, identity caption or
474
- lyric-art element, and separate passes over the **finished frame**. All 161
475
- renderers and the shared gradients/CRT/colour post effects are supported. Numeric
476
- parameters use native DanceRudiment modulation; palettes, colour-stop sets and
477
- gradient modes can switch between validated alternatives. Independent layer
478
- passes cannot recolour already composited neighbours, while a frame pass can
479
- act on everything. These stages run before the existing optional
480
- Butterchurn/projectM feedback chain. See the [compositor effects reference](docs/scoped-post-effects.md)
481
- and the [public scopes gallery](https://kieransimkin.github.io/FrameRudiments/scopes/).
428
+ Windows setup also gains checked project-local MinGW runtime bundling. Missing
429
+ compiler DLLs come from the recorded, matching compiler installation and are
430
+ verified in a fresh process; arbitrary DLL downloads and global PATH changes
431
+ are not used. See [projectM local runtime bundle](docs/projectm-local-runtime.md).
482
432
 
483
- ## High-quality antialiasing and motion blur
433
+ FrameRudiments renders Shorts, Canvas-style clips and full lyric visualisers
434
+ from one traceable timeline. It is the offline Python renderer in the
435
+ [DanceFlow ecosystem](https://kieransimkin.co.uk/danceflow/).
484
436
 
485
- Opt-in edge-aware antialiasing and premultiplied-alpha directional blur now work in Rudiment `visual` settings and independent per-element or whole-frame `post_effects` stages. Both accept native DanceRudiment modulation of all numeric settings, including direction, shutter distance, samples, strength, thresholds, radius and falloff. A separate `post_effects.temporal` shutter recomposes actual observed encoded frames in linear-light RGB, bounded to the current source repeat. It does not invent subframes or optical flow.
437
+ ## Full visualiser preset analysis — PrismMoves and PixelCue
486
438
 
487
- The [CI-generated AA and motion-blur comparison gallery](https://kieransimkin.github.io/FrameRudiments/quality/) combines four existing visualiser modes with nine quality-effect configurations, four observed moments each, and machine-readable parameters. See [the quality-effects guide](docs/quality-effects.md).
439
+ Run `./scripts/Run-FullPresetAnalysis.ps1` in Windows PowerShell for a **single
440
+ resumable entry point** that installs the optional visual-analysis dependencies,
441
+ captures every available Butterchurn/projectM preset, and produces searchable
442
+ per-preset metrics, caption and tag hypotheses, summaries and previews.
443
+ A quick pilot is `./scripts/Run-FullPresetAnalysis.ps1 -Limit 5`; rerun without
444
+ `-Limit` to continue all remaining presets. The complete catalogue includes
445
+ explicit partial/failure receipts for presets that cannot render.
446
+
447
+ The full analysis evaluates all four image families (album/lyric input, colour
448
+ bars, grid/rings and text card), music and silence, and frames at 0, 0.5, 1.5
449
+ and 3 seconds. PixelCue and PrismMoves examine every captured output by
450
+ default, and each preset gets labelled contact sheets plus an evidence-linked
451
+ summary across the input conditions and time points. The processing queue
452
+ alternates randomly selected projectM and Butterchurn presets, using a fresh
453
+ shuffle of unprocessed entries each invocation. `-OrderSeed 20261018` optionally
454
+ reproduces the order; receipts are saved under ignored `_work/schedules/`.
455
+ Existing five-preset pilots using the older, narrower protocol need an explicit
456
+ `-UpgradeCoverage` to archive earlier results before rerunning the fuller test.
457
+
458
+ All model weights, runtimes and caches live in **project-local `models/`**
459
+ (Git ignored). All generated results live under
460
+ **`visualiser-analysis/full-catalogue/`** (commit the curated reports when ready;
461
+ raw intermediate images in `_work/` stay local and ignored). No private music
462
+ is required: a synthetic, checksum-pinned fixture is generated by default.
463
+ See the [complete setup, resume, model, verification and Git guide](docs/full-preset-analysis.md).
464
+
465
+ **0.2.0** accepts source-bound StemLab BPM/first-beat readings through
466
+ `clock.beat_alignment`. Procedural motion follows the fractional beat phase
467
+ after excerpt/repeat mapping. Audio, lyric/cue timestamps and captured
468
+ recordings retain their original source clock. See [beat alignment](docs/beat-alignment.md).
469
+
470
+ ![Actual encoded FrameRudiments 0.2.0 synthetic example with original and aligned movement side by side, source-timed captions and recorded bands](docs/media/beat-alignment.png)
471
+
472
+ [Play the four-second demonstration](docs/media/beat-alignment.mp4): original
473
+ 120 BPM clicks start at 0.125 seconds; the right movement uses the -16 pip
474
+ reading. Text and recorded bands keep source time. This synthetic example
475
+ demonstrates clock composition; it does not establish song-analysis accuracy.
476
+ [Encoded-frame verification and hashes](docs/media/beat-alignment-evidence.json).
477
+
478
+ It consolidates the shared Python/Pillow/FFmpeg mechanisms developed across
479
+ the existing Gilt Trip, Blame Putin, Clay, Paper Dreams, Free Danny Tommo,
480
+ Silly Sausage Britain and Moderate or Good renderers. Release-specific artwork,
481
+ scene layouts and creative decisions belong in project files or Python scene
482
+ hooks. Historical render scripts and approved outputs remain preserved.
483
+
484
+ ## Controlled sound-response analysis
485
+
486
+ The new `scripts/Run-ControlledPresetAnalysis.ps1` tests **zero image feed**, silence,
487
+ level-matched low/mid/high probes and rhythmic test music across independent render
488
+ trials. Temporal measurements run without neural models. Summaries exclude all
489
+ reference-fed conditions; optional texture-transfer results stay separate.
490
+ See [controlled audio responses](docs/controlled-audio-response.md) for setup,
491
+ protocol limits, supplied-music tests, repeat controls and safe resume.
492
+ The pilot uses a separate project-local analysis environment and does not alter the
493
+ stable releases pinned below or previous catalogue results.
494
+
495
+ ## Compositing and the authoring workspace
496
+
497
+ Use named [stem sources and alpha/luminance mattes](docs/stem-sources-and-masks.md), [weighted cross-stem motion](docs/multi-stem-modulation.md), [keyframed matte opacity](docs/keyframed-mattes.md), and [layer animation, polygon clips, displacement and intermediate GPU-stage injection](docs/phase3-compositing.md) within the existing source-clock compositor. These are presentation operations; calibrated spectral displays still require one verified Fourier source.
498
+
499
+ The [local authoring workspace](docs/authoring-workspace.md) uses released React Timeline Sequence for real transport, editable LRC/word/cue/layer lanes and keyframes, routing graphs, presets, undo/redo and export-only drafts. Its PNG preview never edits canonical files and does not replay sequential feedback. Use encoded render/preflight for final approval.
500
+
501
+ For one feature-to-configuration map, see the [full compositor workflow](https://github.com/kieransimkin/DanceFlow/blob/main/docs/workflows/framerudiments-complete.md). The registry returned by `framerudiments renderers` is authoritative; older family counts in historical examples are contextual baselines.
502
+
503
+ ## Native rangoli drawing and clean projectM backgrounds
504
+
505
+ Stack independent `rangoli` Bezier-petal rings over retained native bass/treble
506
+ recordings. Smooth floating-point geometry uses the existing high-quality font
507
+ and vector rasterizer; the established projectM routing keeps petals and lyrics
508
+ clean above an audio-reactive background. No private song assets are bundled.
509
+ See [configuration, limits and actual video](docs/rangoli.md).
510
+
511
+ ![Actual synthetic FrameRudiments rangoli and font example](docs/media/rangoli.png)
512
+
513
+ ## Evidence and limits
514
+
515
+ `plan` is preparation, `preflight` checks all composed frames without encoding,
516
+ and `render` produces **technical-QA passed; creative and attended listening
517
+ review pending**. No command uploads, schedules or publishes anything.
518
+ Automatic checks cannot establish sung-word accuracy, pleasant motion, a
519
+ musical loop seam, platform preview acceptance, rights or public eligibility.
520
+ Caption boxes are composition constraints, not current official platform
521
+ safe-zone verification. Review the exact encoded file and destination preview.
522
+
523
+ Constant-BPM and saved variable-grid clocks record their authority/status;
524
+ an estimate never becomes artist confirmation. Beat grids extrapolate from
525
+ their first/last interval outside their covered extent; constrain projects to
526
+ supported intervals where that is unsuitable. A ranked match does not prove
527
+ whole-song alignment. Recording source/axis provenance is retained; the author
528
+ must select the correct master/stem association. No live WordPress timing,
529
+ sensor or plugin configuration is changed by offline rendering.
530
+
531
+ All text in `captions.ass` is a portable timing sidecar with neutral styling;
532
+ the raster compositor remains the authority for the approved layout.
533
+
534
+ ## Development
535
+
536
+ ```sh
537
+ python -m pip install -e '.[dev]'
538
+ ruff check .
539
+ pytest
540
+ python -m build
541
+ ```
542
+
543
+ Set `FRAMERUDIMENTS_TEST_FONT` and `FRAMERUDIMENTS_FFMPEG` to run all integration
544
+ tests. Without them, corresponding checks report skipped. Tests cover native
545
+ sampling, non-looping recordings, input identity, lyric clears, excerpt/repeat
546
+ boundaries, text/alpha overflow and actual encoded portrait/landscape/square
547
+ outputs. Use synthetic fixtures; never put songs, personal data or private
548
+ analysis outputs into the source distribution.
549
+
550
+ ## Source, contribution and releases
551
+
552
+ [Canonical repository](https://github.com/kieransimkin/FrameRudiments) ·
553
+ [Python package](https://pypi.org/project/framerudiments/) ·
554
+ [Issues and improvements](https://github.com/kieransimkin/FrameRudiments/issues)
555
+
556
+ Read [CONTRIBUTING.md](CONTRIBUTING.md) before changing the engine. Improvements
557
+ belong in focused pull requests to the canonical repository, with current README,
558
+ meaningful tests and reproducible synthetic examples.
559
+
560
+ The GitHub Actions CI runs the complete render suite on Linux and Windows with
561
+ Python 3.11 and 3.13. The release workflow validates the immutable `v<version>` tag,
562
+ re-runs tests, builds/checks wheel and source distribution, performs a clean wheel
563
+ render and publishes exact checksum-labelled assets. Pushing a new `v*` tag publishes
564
+ to GitHub and PyPI automatically after validation; no human reviewer or manual
565
+ publication approval is required. The `pypi` environment has no reviewer gate.
566
+ An existing release is reused only after its source commit and downloaded checksums
567
+ match; assets are never overwritten. Manual dispatch can resume a registry upload
568
+ from an existing immutable tag, preserving its exact GitHub bytes. The PyPI job
569
+ uses a separately configured trusted publisher; no API token is stored in this project.
570
+ A GitHub release and a PyPI listing are separately verified outcomes.