framerudiments 0.3.0__tar.gz → 0.4.1__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (247) hide show
  1. framerudiments-0.4.1/MANIFEST.in +11 -0
  2. framerudiments-0.4.1/PKG-INFO +508 -0
  3. framerudiments-0.4.1/README.md +480 -0
  4. framerudiments-0.4.1/RELEASE_NOTES.md +49 -0
  5. framerudiments-0.4.1/analysis-releases.json +26 -0
  6. framerudiments-0.4.1/docs/FrameRudiments-PATCH_WORKFLOW.md +164 -0
  7. framerudiments-0.4.1/docs/annular-modulation.md +351 -0
  8. framerudiments-0.4.1/docs/authoring-workspace.md +112 -0
  9. framerudiments-0.4.1/docs/controlled-audio-response.md +105 -0
  10. framerudiments-0.4.1/docs/expanded-effects.md +251 -0
  11. framerudiments-0.4.1/docs/full-preset-analysis.md +336 -0
  12. framerudiments-0.4.1/docs/keyframed-mattes.md +20 -0
  13. framerudiments-0.4.1/docs/media/rangoli-transcript.md +12 -0
  14. framerudiments-0.4.1/docs/media/rangoli.mp4 +0 -0
  15. framerudiments-0.4.1/docs/media/rangoli.png +0 -0
  16. framerudiments-0.4.1/docs/multi-stem-modulation.md +28 -0
  17. framerudiments-0.4.1/docs/music-reactive-3d.md +164 -0
  18. framerudiments-0.4.1/docs/particle-smoke.md +172 -0
  19. framerudiments-0.4.1/docs/phase3-compositing.md +45 -0
  20. framerudiments-0.4.1/docs/preset-behaviour.md +62 -0
  21. {framerudiments-0.3.0 → framerudiments-0.4.1}/docs/project-format.md +70 -3
  22. framerudiments-0.4.1/docs/projectm-local-runtime.md +29 -0
  23. framerudiments-0.4.1/docs/quality-effects.md +138 -0
  24. framerudiments-0.4.1/docs/rangoli.md +69 -0
  25. framerudiments-0.4.1/docs/rich-lyric-effects.md +200 -0
  26. {framerudiments-0.3.0 → framerudiments-0.4.1}/docs/rudiment-renderers.md +24 -2
  27. framerudiments-0.4.1/docs/scoped-post-effects.md +155 -0
  28. framerudiments-0.4.1/docs/solid-spatial-renderers.md +83 -0
  29. framerudiments-0.4.1/docs/spatial-renderers.md +32 -0
  30. framerudiments-0.4.1/docs/spatiotemporal-supersampling.md +92 -0
  31. framerudiments-0.4.1/docs/sprite-visualisations.md +193 -0
  32. framerudiments-0.4.1/docs/stem-sources-and-masks.md +46 -0
  33. framerudiments-0.4.1/docs/variable-bpm-word-subtitles.md +160 -0
  34. framerudiments-0.4.1/docs/visualisation-atlas.md +180 -0
  35. framerudiments-0.4.1/docs/visualisation-coverage-matrix.md +42 -0
  36. framerudiments-0.4.1/docs/visualiser-routing.md +142 -0
  37. {framerudiments-0.3.0 → framerudiments-0.4.1}/docs/visualisers.md +12 -0
  38. framerudiments-0.4.1/integration/test_music_spatial_gpu.py +55 -0
  39. framerudiments-0.4.1/integration/test_preset_analysis.py +69 -0
  40. framerudiments-0.4.1/integration/test_released_preset_analysis.py +41 -0
  41. {framerudiments-0.3.0 → framerudiments-0.4.1}/integration/test_visualisers_gpu.py +90 -43
  42. {framerudiments-0.3.0 → framerudiments-0.4.1}/pyproject.toml +3 -2
  43. framerudiments-0.4.1/scripts/Run-ControlledPresetAnalysis.ps1 +58 -0
  44. framerudiments-0.4.1/scripts/Run-FullPresetAnalysis.ps1 +409 -0
  45. framerudiments-0.4.1/scripts/Run-PresetBehaviourAnalysis.ps1 +72 -0
  46. framerudiments-0.4.1/scripts/authoring_preview.py +322 -0
  47. framerudiments-0.4.1/scripts/build_sprite_assets.py +217 -0
  48. framerudiments-0.4.1/scripts/check_projectm_runtime.py +80 -0
  49. framerudiments-0.4.1/scripts/check_release_packages.py +132 -0
  50. framerudiments-0.4.1/scripts/controlled_preset_analysis.py +274 -0
  51. framerudiments-0.4.1/scripts/ensure_projectm_runtime.py +58 -0
  52. framerudiments-0.4.1/scripts/full_preset_analysis.py +1619 -0
  53. framerudiments-0.4.1/scripts/generate_particle_gallery.py +222 -0
  54. framerudiments-0.4.1/scripts/generate_post_effect_gallery.py +189 -0
  55. framerudiments-0.4.1/scripts/generate_quality_gallery.py +270 -0
  56. framerudiments-0.4.1/scripts/generate_rich_lyric_gallery.py +315 -0
  57. framerudiments-0.4.1/scripts/generate_sprite_gallery.py +414 -0
  58. framerudiments-0.4.1/scripts/generate_supersampling_gallery.py +149 -0
  59. framerudiments-0.4.1/scripts/generate_timing_gallery.py +250 -0
  60. framerudiments-0.4.1/scripts/generate_visualisation_gallery.py +359 -0
  61. framerudiments-0.4.1/scripts/generate_visualiser_routing_gallery.py +275 -0
  62. framerudiments-0.4.1/scripts/install_analysis_releases.py +150 -0
  63. framerudiments-0.4.1/scripts/prepare_pixelcue_taggers.py +67 -0
  64. framerudiments-0.4.1/scripts/preset_behaviour_pipeline.py +337 -0
  65. framerudiments-0.4.1/scripts/profile_visualisation_coverage.py +69 -0
  66. {framerudiments-0.3.0 → framerudiments-0.4.1}/scripts/profile_visualisers.py +1 -0
  67. framerudiments-0.4.1/scripts/projectm_dll_diagnostics.py +314 -0
  68. framerudiments-0.4.1/scripts/repair_projectm_mingw.py +437 -0
  69. framerudiments-0.4.1/scripts/select_projectm_generator.py +180 -0
  70. framerudiments-0.4.1/scripts/validate_patch.py +88 -0
  71. framerudiments-0.4.1/src/framerudiments/__init__.py +26 -0
  72. framerudiments-0.4.1/src/framerudiments/advanced_renderers.py +459 -0
  73. {framerudiments-0.3.0 → framerudiments-0.4.1}/src/framerudiments/atlas.py +3 -0
  74. framerudiments-0.4.1/src/framerudiments/audio_probes.py +132 -0
  75. framerudiments-0.4.1/src/framerudiments/beat_timeline.py +217 -0
  76. {framerudiments-0.3.0 → framerudiments-0.4.1}/src/framerudiments/choreography.py +5 -3
  77. framerudiments-0.4.1/src/framerudiments/circular_renderers.py +594 -0
  78. {framerudiments-0.3.0 → framerudiments-0.4.1}/src/framerudiments/cli.py +70 -16
  79. framerudiments-0.4.1/src/framerudiments/compositor.py +689 -0
  80. framerudiments-0.4.1/src/framerudiments/controlled_profiling.py +177 -0
  81. framerudiments-0.4.1/src/framerudiments/demo.py +316 -0
  82. framerudiments-0.4.1/src/framerudiments/effect_catalogue.py +90 -0
  83. framerudiments-0.4.1/src/framerudiments/effect_renderers.py +652 -0
  84. {framerudiments-0.3.0 → framerudiments-0.4.1}/src/framerudiments/effects.py +9 -5
  85. {framerudiments-0.3.0 → framerudiments-0.4.1}/src/framerudiments/encoding.py +98 -25
  86. {framerudiments-0.3.0 → framerudiments-0.4.1}/src/framerudiments/flight.py +27 -14
  87. framerudiments-0.4.1/src/framerudiments/gpu_spatial_backend.py +395 -0
  88. {framerudiments-0.3.0 → framerudiments-0.4.1}/src/framerudiments/io.py +11 -3
  89. framerudiments-0.4.1/src/framerudiments/keyframes.py +56 -0
  90. framerudiments-0.4.1/src/framerudiments/layer_animation.py +140 -0
  91. framerudiments-0.4.1/src/framerudiments/layer_displacement.py +57 -0
  92. framerudiments-0.4.1/src/framerudiments/layer_masks.py +70 -0
  93. framerudiments-0.4.1/src/framerudiments/lyric_indicator.py +547 -0
  94. framerudiments-0.4.1/src/framerudiments/modulation.py +256 -0
  95. {framerudiments-0.3.0 → framerudiments-0.4.1}/src/framerudiments/motion.py +44 -9
  96. framerudiments-0.4.1/src/framerudiments/music_spatial_renderers.py +314 -0
  97. framerudiments-0.4.1/src/framerudiments/output_quality.py +107 -0
  98. framerudiments-0.4.1/src/framerudiments/particle_engine.py +753 -0
  99. framerudiments-0.4.1/src/framerudiments/post_effects.py +121 -0
  100. {framerudiments-0.3.0 → framerudiments-0.4.1}/src/framerudiments/preset_library.py +69 -24
  101. {framerudiments-0.3.0 → framerudiments-0.4.1}/src/framerudiments/preset_profiling.py +207 -70
  102. framerudiments-0.4.1/src/framerudiments/profile_analysis.py +354 -0
  103. framerudiments-0.4.1/src/framerudiments/project.py +317 -0
  104. {framerudiments-0.3.0 → framerudiments-0.4.1}/src/framerudiments/projectm_backend.py +63 -27
  105. framerudiments-0.4.1/src/framerudiments/quality_effects.py +297 -0
  106. framerudiments-0.4.1/src/framerudiments/rangoli_renderer.py +88 -0
  107. {framerudiments-0.3.0 → framerudiments-0.4.1}/src/framerudiments/render.py +125 -25
  108. framerudiments-0.4.1/src/framerudiments/rich_subtitles.py +294 -0
  109. {framerudiments-0.3.0 → framerudiments-0.4.1}/src/framerudiments/rudiment_renderers.py +331 -63
  110. framerudiments-0.4.1/src/framerudiments/scoped_effects.py +319 -0
  111. framerudiments-0.4.1/src/framerudiments/solid_spatial_renderers.py +304 -0
  112. framerudiments-0.4.1/src/framerudiments/spatial_renderers.py +141 -0
  113. {framerudiments-0.3.0 → framerudiments-0.4.1}/src/framerudiments/spectrum.py +67 -21
  114. framerudiments-0.4.1/src/framerudiments/sprite_assets/arcade.png +0 -0
  115. framerudiments-0.4.1/src/framerudiments/sprite_assets/crystal.png +0 -0
  116. framerudiments-0.4.1/src/framerudiments/sprite_assets/fire.png +0 -0
  117. framerudiments-0.4.1/src/framerudiments/sprite_assets/generated-neon.png +0 -0
  118. framerudiments-0.4.1/src/framerudiments/sprite_assets/glass.png +0 -0
  119. framerudiments-0.4.1/src/framerudiments/sprite_assets/hud.png +0 -0
  120. framerudiments-0.4.1/src/framerudiments/sprite_assets/ice.png +0 -0
  121. framerudiments-0.4.1/src/framerudiments/sprite_assets/lcd-amber.png +0 -0
  122. framerudiments-0.4.1/src/framerudiments/sprite_assets/lcd-green.png +0 -0
  123. framerudiments-0.4.1/src/framerudiments/sprite_assets/lcd.png +0 -0
  124. framerudiments-0.4.1/src/framerudiments/sprite_assets/led.png +0 -0
  125. framerudiments-0.4.1/src/framerudiments/sprite_assets/manifest.json +104 -0
  126. framerudiments-0.4.1/src/framerudiments/sprite_assets/metal.png +0 -0
  127. framerudiments-0.4.1/src/framerudiments/sprite_assets/mono.png +0 -0
  128. framerudiments-0.4.1/src/framerudiments/sprite_assets/neon.png +0 -0
  129. framerudiments-0.4.1/src/framerudiments/sprite_assets/pixel.png +0 -0
  130. framerudiments-0.4.1/src/framerudiments/sprite_assets/plasma.png +0 -0
  131. framerudiments-0.4.1/src/framerudiments/sprite_assets/vfd.png +0 -0
  132. framerudiments-0.4.1/src/framerudiments/sprite_catalogue.py +92 -0
  133. framerudiments-0.4.1/src/framerudiments/sprite_renderers.py +1207 -0
  134. framerudiments-0.4.1/src/framerudiments/stem_blend.py +57 -0
  135. {framerudiments-0.3.0 → framerudiments-0.4.1}/src/framerudiments/stemlab.py +13 -4
  136. framerudiments-0.4.1/src/framerudiments/subtitles.py +57 -0
  137. framerudiments-0.4.1/src/framerudiments/super_sampling.py +399 -0
  138. framerudiments-0.4.1/src/framerudiments/terrain_field.py +225 -0
  139. {framerudiments-0.3.0 → framerudiments-0.4.1}/src/framerudiments/timeline.py +21 -9
  140. framerudiments-0.4.1/src/framerudiments/visual_style.py +302 -0
  141. framerudiments-0.4.1/src/framerudiments/visualisation_catalogue.py +290 -0
  142. {framerudiments-0.3.0 → framerudiments-0.4.1}/src/framerudiments/visualiser_assets/butterchurn-page.js +1 -1
  143. framerudiments-0.4.1/src/framerudiments/visualiser_assets/rangoli-background.milk +26 -0
  144. framerudiments-0.4.1/src/framerudiments/visualiser_routing.py +163 -0
  145. {framerudiments-0.3.0 → framerudiments-0.4.1}/src/framerudiments/visualiser_setup.py +74 -20
  146. {framerudiments-0.3.0 → framerudiments-0.4.1}/src/framerudiments/visualisers.py +173 -36
  147. framerudiments-0.4.1/src/framerudiments/word_timing.py +279 -0
  148. framerudiments-0.4.1/src/framerudiments.egg-info/PKG-INFO +508 -0
  149. framerudiments-0.4.1/src/framerudiments.egg-info/SOURCES.txt +232 -0
  150. {framerudiments-0.3.0 → framerudiments-0.4.1}/src/framerudiments.egg-info/requires.txt +4 -0
  151. framerudiments-0.4.1/tests/conftest.py +35 -0
  152. {framerudiments-0.3.0 → framerudiments-0.4.1}/tests/test_adapters.py +42 -15
  153. framerudiments-0.4.1/tests/test_advanced_renderers.py +72 -0
  154. framerudiments-0.4.1/tests/test_authoring_preview.py +116 -0
  155. framerudiments-0.4.1/tests/test_behaviour_pipeline.py +81 -0
  156. framerudiments-0.4.1/tests/test_controlled_audio.py +134 -0
  157. framerudiments-0.4.1/tests/test_coverage_matrix.py +71 -0
  158. framerudiments-0.4.1/tests/test_default_antialias.py +112 -0
  159. framerudiments-0.4.1/tests/test_effect_batch.py +154 -0
  160. framerudiments-0.4.1/tests/test_full_preset_analysis.py +809 -0
  161. framerudiments-0.4.1/tests/test_gpu_ci_isolation.py +47 -0
  162. framerudiments-0.4.1/tests/test_keyframes.py +60 -0
  163. framerudiments-0.4.1/tests/test_layer_masks.py +52 -0
  164. {framerudiments-0.3.0 → framerudiments-0.4.1}/tests/test_lyrics.py +5 -2
  165. framerudiments-0.4.1/tests/test_music_spatial_pipeline.py +48 -0
  166. framerudiments-0.4.1/tests/test_music_spatial_renderers.py +173 -0
  167. framerudiments-0.4.1/tests/test_particle_engine.py +289 -0
  168. framerudiments-0.4.1/tests/test_patch_validation.py +63 -0
  169. framerudiments-0.4.1/tests/test_phase3_animation.py +90 -0
  170. framerudiments-0.4.1/tests/test_phase3_gpu_injection.py +79 -0
  171. {framerudiments-0.3.0 → framerudiments-0.4.1}/tests/test_pipeline.py +18 -8
  172. framerudiments-0.4.1/tests/test_preset_profiling.py +157 -0
  173. framerudiments-0.4.1/tests/test_projectm_dll_diagnostics.py +290 -0
  174. framerudiments-0.4.1/tests/test_projectm_generator.py +142 -0
  175. framerudiments-0.4.1/tests/test_projectm_runtime_preflight.py +64 -0
  176. framerudiments-0.4.1/tests/test_pytest_temp_isolation.py +34 -0
  177. framerudiments-0.4.1/tests/test_quality_effects.py +241 -0
  178. framerudiments-0.4.1/tests/test_rangoli_renderer.py +47 -0
  179. framerudiments-0.4.1/tests/test_release_metadata.py +39 -0
  180. framerudiments-0.4.1/tests/test_repair_projectm_mingw.py +392 -0
  181. framerudiments-0.4.1/tests/test_rich_subtitles.py +325 -0
  182. {framerudiments-0.3.0 → framerudiments-0.4.1}/tests/test_rudiment_renderers.py +48 -12
  183. framerudiments-0.4.1/tests/test_scoped_effects.py +294 -0
  184. framerudiments-0.4.1/tests/test_solid_spatial_integration.py +49 -0
  185. framerudiments-0.4.1/tests/test_solid_spatial_renderers.py +113 -0
  186. framerudiments-0.4.1/tests/test_spatial_renderers.py +57 -0
  187. {framerudiments-0.3.0 → framerudiments-0.4.1}/tests/test_spectrum.py +61 -21
  188. framerudiments-0.4.1/tests/test_sprite_renderers.py +411 -0
  189. framerudiments-0.4.1/tests/test_stem_blend.py +57 -0
  190. framerudiments-0.4.1/tests/test_stem_source_integration.py +80 -0
  191. framerudiments-0.4.1/tests/test_supersampling.py +162 -0
  192. {framerudiments-0.3.0 → framerudiments-0.4.1}/tests/test_timeline.py +15 -7
  193. framerudiments-0.4.1/tests/test_variable_bpm_words.py +302 -0
  194. framerudiments-0.4.1/tests/test_visualisation_modulation.py +300 -0
  195. framerudiments-0.4.1/tests/test_visualiser_routing.py +236 -0
  196. {framerudiments-0.3.0 → framerudiments-0.4.1}/tests/test_visualisers.py +45 -14
  197. framerudiments-0.4.1/tests/test_windows_launcher_splitpath.py +39 -0
  198. framerudiments-0.3.0/MANIFEST.in +0 -9
  199. framerudiments-0.3.0/PKG-INFO +0 -266
  200. framerudiments-0.3.0/README.md +0 -241
  201. framerudiments-0.3.0/integration/test_preset_analysis.py +0 -42
  202. framerudiments-0.3.0/src/framerudiments/__init__.py +0 -10
  203. framerudiments-0.3.0/src/framerudiments/compositor.py +0 -283
  204. framerudiments-0.3.0/src/framerudiments/demo.py +0 -167
  205. framerudiments-0.3.0/src/framerudiments/profile_analysis.py +0 -212
  206. framerudiments-0.3.0/src/framerudiments/project.py +0 -141
  207. framerudiments-0.3.0/src/framerudiments/subtitles.py +0 -45
  208. framerudiments-0.3.0/src/framerudiments.egg-info/PKG-INFO +0 -266
  209. framerudiments-0.3.0/src/framerudiments.egg-info/SOURCES.txt +0 -81
  210. framerudiments-0.3.0/tests/test_preset_profiling.py +0 -123
  211. {framerudiments-0.3.0 → framerudiments-0.4.1}/AGENTS.md +0 -0
  212. {framerudiments-0.3.0 → framerudiments-0.4.1}/LICENSE +0 -0
  213. {framerudiments-0.3.0 → framerudiments-0.4.1}/docs/beat-alignment.md +0 -0
  214. {framerudiments-0.3.0 → framerudiments-0.4.1}/docs/extraction.md +0 -0
  215. {framerudiments-0.3.0 → framerudiments-0.4.1}/docs/media/beat-alignment-evidence.json +0 -0
  216. {framerudiments-0.3.0 → framerudiments-0.4.1}/docs/media/beat-alignment.mp4 +0 -0
  217. {framerudiments-0.3.0 → framerudiments-0.4.1}/docs/media/beat-alignment.png +0 -0
  218. {framerudiments-0.3.0 → framerudiments-0.4.1}/docs/media/demo-transcript.md +0 -0
  219. {framerudiments-0.3.0 → framerudiments-0.4.1}/docs/media/effects-pipeline.svg +0 -0
  220. {framerudiments-0.3.0 → framerudiments-0.4.1}/docs/media/full-frame-comparison.png +0 -0
  221. {framerudiments-0.3.0 → framerudiments-0.4.1}/docs/media/full-frame-demo.mp4 +0 -0
  222. {framerudiments-0.3.0 → framerudiments-0.4.1}/docs/media/media-evidence.json +0 -0
  223. {framerudiments-0.3.0 → framerudiments-0.4.1}/docs/media/preset-test-cards.png +0 -0
  224. {framerudiments-0.3.0 → framerudiments-0.4.1}/docs/media/test-card-inputs/colour-bars.png +0 -0
  225. {framerudiments-0.3.0 → framerudiments-0.4.1}/docs/media/test-card-inputs/grid-rings.png +0 -0
  226. {framerudiments-0.3.0 → framerudiments-0.4.1}/docs/media/test-card-inputs/text-card.png +0 -0
  227. {framerudiments-0.3.0 → framerudiments-0.4.1}/docs/preset-profiling.md +0 -0
  228. {framerudiments-0.3.0 → framerudiments-0.4.1}/docs/spectrum.md +0 -0
  229. {framerudiments-0.3.0 → framerudiments-0.4.1}/docs/workflow-media.md +0 -0
  230. {framerudiments-0.3.0 → framerudiments-0.4.1}/setup.cfg +0 -0
  231. {framerudiments-0.3.0 → framerudiments-0.4.1}/src/framerudiments/__main__.py +0 -0
  232. {framerudiments-0.3.0 → framerudiments-0.4.1}/src/framerudiments/beat_alignment.py +0 -0
  233. {framerudiments-0.3.0 → framerudiments-0.4.1}/src/framerudiments/visualiser_assets/butterchurn-worker.mjs +0 -0
  234. {framerudiments-0.3.0 → framerudiments-0.4.1}/src/framerudiments/visualiser_assets/feedback.json +0 -0
  235. {framerudiments-0.3.0 → framerudiments-0.4.1}/src/framerudiments/visualiser_assets/feedback.milk +0 -0
  236. {framerudiments-0.3.0 → framerudiments-0.4.1}/src/framerudiments/visualiser_assets/julia.json +0 -0
  237. {framerudiments-0.3.0 → framerudiments-0.4.1}/src/framerudiments/visualiser_assets/julia.milk +0 -0
  238. {framerudiments-0.3.0 → framerudiments-0.4.1}/src/framerudiments/visualiser_assets/kaleidoscope.json +0 -0
  239. {framerudiments-0.3.0 → framerudiments-0.4.1}/src/framerudiments/visualiser_assets/kaleidoscope.milk +0 -0
  240. {framerudiments-0.3.0 → framerudiments-0.4.1}/src/framerudiments/visualiser_assets/package-lock.json +0 -0
  241. {framerudiments-0.3.0 → framerudiments-0.4.1}/src/framerudiments/visualiser_assets/package.json +0 -0
  242. {framerudiments-0.3.0 → framerudiments-0.4.1}/src/framerudiments.egg-info/dependency_links.txt +0 -0
  243. {framerudiments-0.3.0 → framerudiments-0.4.1}/src/framerudiments.egg-info/entry_points.txt +0 -0
  244. {framerudiments-0.3.0 → framerudiments-0.4.1}/src/framerudiments.egg-info/top_level.txt +0 -0
  245. {framerudiments-0.3.0 → framerudiments-0.4.1}/tests/test_beat_alignment.py +0 -0
  246. {framerudiments-0.3.0 → framerudiments-0.4.1}/tests/test_extracted_helpers.py +0 -0
  247. {framerudiments-0.3.0 → framerudiments-0.4.1}/tests/test_flight.py +0 -0
@@ -0,0 +1,11 @@
1
+ include README.md LICENSE AGENTS.md RELEASE_NOTES.md analysis-releases.json
2
+ recursive-include docs *.md *.png *.svg *.json *.mp4
3
+ recursive-include tests *.py
4
+
5
+ recursive-include integration *.py
6
+
7
+ prune models
8
+ prune visualiser-analysis
9
+
10
+ recursive-include scripts *.py *.ps1
11
+ recursive-include src/framerudiments/sprite_assets *.png *.json
@@ -0,0 +1,508 @@
1
+ Metadata-Version: 2.4
2
+ Name: framerudiments
3
+ Version: 0.4.1
4
+ Summary: Deterministic Shorts and lyric visualisers using DanceRudiments and StemLab evidence.
5
+ Author: Kieran Simkin
6
+ License-Expression: MIT
7
+ Project-URL: Homepage, https://kieransimkin.co.uk/danceflow/
8
+ Project-URL: Repository, https://github.com/kieransimkin/FrameRudiments
9
+ Project-URL: Issues, https://github.com/kieransimkin/FrameRudiments/issues
10
+ Project-URL: Documentation, https://github.com/kieransimkin/FrameRudiments#readme
11
+ Requires-Python: >=3.11
12
+ Description-Content-Type: text/markdown
13
+ License-File: LICENSE
14
+ Requires-Dist: Pillow>=10
15
+ Requires-Dist: dancerudiments<0.4,>=0.3.0
16
+ Provides-Extra: projectm
17
+ Requires-Dist: glfw==2.10.2; extra == "projectm"
18
+ Requires-Dist: PyOpenGL==3.1.10; extra == "projectm"
19
+ Provides-Extra: gpu
20
+ Requires-Dist: moderngl<6,>=5.11; extra == "gpu"
21
+ Requires-Dist: numpy>=1.26; extra == "gpu"
22
+ Provides-Extra: dev
23
+ Requires-Dist: pytest>=8; extra == "dev"
24
+ Requires-Dist: build>=1.2; extra == "dev"
25
+ Requires-Dist: ruff>=0.9; extra == "dev"
26
+ Requires-Dist: twine>=6; extra == "dev"
27
+ Dynamic: license-file
28
+
29
+ # FrameRudiments
30
+
31
+ ## Native rangoli drawing and clean projectM backgrounds
32
+
33
+ Stack independent `rangoli` Bezier-petal rings over retained native bass/treble
34
+ recordings. Smooth floating-point geometry uses the existing high-quality font
35
+ and vector rasterizer; the established projectM routing keeps petals and lyrics
36
+ clean above an audio-reactive background. No private song assets are bundled.
37
+ See [configuration, limits and actual video](docs/rangoli.md).
38
+
39
+ ![Actual synthetic FrameRudiments rangoli and font example](docs/media/rangoli.png)
40
+
41
+ ## Controlled sound-response analysis
42
+
43
+ The new `scripts/Run-ControlledPresetAnalysis.ps1` tests **zero image feed**, silence,
44
+ level-matched low/mid/high probes and rhythmic test music across independent render
45
+ trials. Temporal measurements run without neural models. Summaries exclude all
46
+ reference-fed conditions; optional texture-transfer results stay separate.
47
+ See [controlled audio responses](docs/controlled-audio-response.md) for setup,
48
+ protocol limits, supplied-music tests, repeat controls and safe resume.
49
+ The pilot uses a separate project-local analysis environment and does not alter the
50
+ stable releases pinned below or previous catalogue results.
51
+
52
+ ## Pinned visual-analysis releases
53
+
54
+ PixelCue **0.9.1** and PrismMoves **0.2.0** are pinned by final release URL,
55
+ source commit and wheel SHA-256 in `analysis-releases.json`. Both analysis
56
+ launchers install these coordinated wheels into the project-local analysis
57
+ environment; neither can silently restore the old development/API pair.
58
+ Run `scripts/install_analysis_releases.py --python PATH_TO_ANALYSIS_PYTHON
59
+ --with-sequence` to reinstall the pinned pair without downloading model weights.
60
+ The native CI job tests the actual released sequence/description APIs with
61
+ synthetic frames and no neural inference. OpenCV and other runtime dependencies
62
+ remain separately constrained; this is not a whole-environment lock.
63
+
64
+ ## Efficient preset descriptions (new recommended analysis entry point)
65
+
66
+ Run `./scripts/Run-PresetBehaviourAnalysis.ps1 -Limit 2` after installing the
67
+ coordinated PixelCue/PrismMoves update. It captures 15 fps over 3 seconds (46
68
+ frames per condition; 368 for the default four inputs and two audio controls),
69
+ measures motion **before** semantic inference, and selects at most 24 unique
70
+ non-blank images for CLIP and BLIP. Generated fixtures render at 384 x 384
71
+ instead of the legacy 160-pixel pilot. The native render/audio clock is unchanged.
72
+
73
+ One paragraph per preset describes supported movement, appearance and artefacts.
74
+ The searchable gallery rebuilds from completed per-preset records at each job,
75
+ not from an occasionally checkpointed index. Raw dense frames and attempts stay
76
+ in ignored `_work/`; the compact reports and compressed evidence are under
77
+ `visualiser-analysis/behaviour-catalogue/`. The old full-catalogue is preserved.
78
+
79
+ `./scripts/Run-PresetBehaviourAnalysis.ps1 -DescribeExisting` produces a separate
80
+ atlas from the saved analysis receipts without rerunning models. Sparse legacy
81
+ stills never acquire invented temporal measurements. An authored `-Suite` or an
82
+ explicit `-ArtworkDirectory` supplies real material; defaults use synthetic audio.
83
+ See [the efficient workflow and its limitations](docs/preset-behaviour.md).
84
+
85
+ Windows setup also gains checked project-local MinGW runtime bundling. Missing
86
+ compiler DLLs come from the recorded, matching compiler installation and are
87
+ verified in a fresh process; arbitrary DLL downloads and global PATH changes
88
+ are not used. See [projectM local runtime bundle](docs/projectm-local-runtime.md).
89
+
90
+ FrameRudiments renders Shorts, Canvas-style clips and full lyric visualisers
91
+ from one traceable timeline. It is the offline Python renderer in the
92
+ [DanceFlow ecosystem](https://kieransimkin.co.uk/danceflow/).
93
+
94
+ ## Full visualiser preset analysis — PrismMoves and PixelCue
95
+
96
+ Run `./scripts/Run-FullPresetAnalysis.ps1` in Windows PowerShell for a **single
97
+ resumable entry point** that installs the optional visual-analysis dependencies,
98
+ captures every available Butterchurn/projectM preset, and produces searchable
99
+ per-preset metrics, caption and tag hypotheses, summaries and previews.
100
+ A quick pilot is `./scripts/Run-FullPresetAnalysis.ps1 -Limit 5`; rerun without
101
+ `-Limit` to continue all remaining presets. The complete catalogue includes
102
+ explicit partial/failure receipts for presets that cannot render.
103
+
104
+ The full analysis evaluates all four image families (album/lyric input, colour
105
+ bars, grid/rings and text card), music and silence, and frames at 0, 0.5, 1.5
106
+ and 3 seconds. PixelCue and PrismMoves examine every captured output by
107
+ default, and each preset gets labelled contact sheets plus an evidence-linked
108
+ summary across the input conditions and time points. The processing queue
109
+ alternates randomly selected projectM and Butterchurn presets, using a fresh
110
+ shuffle of unprocessed entries each invocation. `-OrderSeed 20261018` optionally
111
+ reproduces the order; receipts are saved under ignored `_work/schedules/`.
112
+ Existing five-preset pilots using the older, narrower protocol need an explicit
113
+ `-UpgradeCoverage` to archive earlier results before rerunning the fuller test.
114
+
115
+ All model weights, runtimes and caches live in **project-local `models/`**
116
+ (Git ignored). All generated results live under
117
+ **`visualiser-analysis/full-catalogue/`** (commit the curated reports when ready;
118
+ raw intermediate images in `_work/` stay local and ignored). No private music
119
+ is required: a synthetic, checksum-pinned fixture is generated by default.
120
+ See the [complete setup, resume, model, verification and Git guide](docs/full-preset-analysis.md).
121
+
122
+ **0.2.0** accepts source-bound StemLab BPM/first-beat readings through
123
+ `clock.beat_alignment`. Procedural motion follows the fractional beat phase
124
+ after excerpt/repeat mapping. Audio, lyric/cue timestamps and captured
125
+ recordings retain their original source clock. See [beat alignment](docs/beat-alignment.md).
126
+
127
+ ![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)
128
+
129
+ [Play the four-second demonstration](docs/media/beat-alignment.mp4): original
130
+ 120 BPM clicks start at 0.125 seconds; the right movement uses the -16 pip
131
+ reading. Text and recorded bands keep source time. This synthetic example
132
+ demonstrates clock composition; it does not establish song-analysis accuracy.
133
+ [Encoded-frame verification and hashes](docs/media/beat-alignment-evidence.json).
134
+
135
+ It consolidates the shared Python/Pillow/FFmpeg mechanisms developed across
136
+ the existing Gilt Trip, Blame Putin, Clay, Paper Dreams, Free Danny Tommo,
137
+ Silly Sausage Britain and Moderate or Good renderers. Release-specific artwork,
138
+ scene layouts and creative decisions belong in project files or Python scene
139
+ hooks. Historical render scripts and approved outputs remain preserved.
140
+
141
+ ## Particle and smoke emitters
142
+
143
+ A new deterministic `type: "emitter"` layer provides continuous smoke,
144
+ sparks, embers, snow, rain, confetti and cue-triggered bursts, driven by
145
+ independent DanceRudiments. Pinned DanceMoves/StemLab `.lrc`, `.cue`, or
146
+ versioned `.json` timing files can trigger one-shot explosions; `hybrid`
147
+ mode combines these with constant emission. Every parameter in the engine's
148
+ numeric style table supports native `style.*` modulation. Pinned transparent
149
+ PNG particles are optional, and the existing element- and frame-level post
150
+ passes remain available. See [particle and smoke reference](docs/particle-smoke.md)
151
+ and the [CI-generated synthetic gallery](https://kieransimkin.github.io/FrameRudiments/particles/).
152
+
153
+ ## Variable-tempo synchronisation and word subtitles
154
+
155
+ FrameRudiments accepts a checksum-pinned `stemlab.beat-timeline.v1` in
156
+ `clock.beat_timeline` for true piecewise BPM/beat phase at sample-frame anchors,
157
+ matching StemLab and the opt-in DanceMoves variable-tempo API. Nominal/fixed
158
+ BPM, beat grids, and fixed-tempo `beat_alignment` remain supported independently.
159
+ Lyrics, cue timing and recorded Rudiments retain their source audio clock.
160
+ A separate pinned `word_lyrics` LRC supports enhanced timestamps, per-word
161
+ karaoke highlighting, progressive word colour and a distinct `word_captions`
162
+ lane; line captions remain available through `lyrics`. Both per-line and
163
+ per-word subtitle exports are generated with the same encoded frame ledger.
164
+ See [variable-tempo and word LRC guide](docs/variable-bpm-word-subtitles.md)
165
+ and the [synthetic public demo](https://kieransimkin.github.io/FrameRudiments/timing/).
166
+
167
+ ## Rich lyric typography and word-following particle sprites
168
+
169
+ Caption blocks and identity titles optionally accept checksum-pinned `font` overrides and
170
+ `effects` for stroked, bevelled, embossed, multi-stop gradient, inner/outer glow, and shadowed
171
+ text. Existing plain text remains untouched unless configured. Set `word_indicator` for a
172
+ native 1-dimensional DanceRudiment-driven bouncing sprite that tracks the active word of
173
+ the full line. Its particle field can be continuous, word/cue-triggered, or hybrid;
174
+ trigger windows independently change colour, density, size, glow and burst count.
175
+ See [rich lyric reference](docs/rich-lyric-effects.md) and the
176
+ [CI-generated demo](https://kieransimkin.github.io/FrameRudiments/rich-lyrics/).
177
+
178
+ ## Maximum-quality rendering enabled by default
179
+
180
+ FrameRudiments now redraws pinned text outlines and procedural vector Rudiment
181
+ views at **4× linear pixel resolution** before Lanczos reduction. It also
182
+ renders **eight different source-clock subframes per output frame**,
183
+ averaging them in linear light for true temporal supersampling. A final
184
+ three-pass edge-aware AA filter runs after the optional GPU effect chain.
185
+ These are the maximum supported preset settings and require no project changes.
186
+ Explicitly lower them with `render_quality.spatial_scale` (1–4),
187
+ `render_quality.temporal_samples` (1–8), or
188
+ `render_quality.enabled: false` for deliberate pixel art or legacy output.
189
+ Full-quality rendering can be much slower; read the
190
+ [spatiotemporal sampling guide](docs/spatiotemporal-supersampling.md).
191
+
192
+ ## Layer-selective Butterchurn/projectM feedback
193
+
194
+ Each composited element can feed the GPU visualisers continuously, only
195
+ during a bounded window measured in **64-pip source-clock beats**, or not at
196
+ all. Independently, an element can render cleanly over the last stage.
197
+ Word captions, lyric sprites, particle emitters, backgrounds and normal
198
+ Rudiment layers use the same routing policy. Existing projects remain
199
+ unchanged. [Configuration and examples](docs/visualiser-routing.md) ·
200
+ [CI comparisons](https://kieransimkin.github.io/FrameRudiments/routing/).
201
+
202
+ ## Solid 3D meshes and atmospheric rendering
203
+
204
+ Three additional `spatial-solid-*` viewport modes (torus, sphere and terrain)
205
+ provide per-pixel Z-buffered geometry, roughness/metallic direct lighting and
206
+ depth-terminated procedural fog. They use the normal StemLab/DanceRudiments
207
+ motion paths and can feed existing Butterchurn/projectM compositing chains.
208
+ They are CPU rasterisers, not GPU mesh engines.
209
+ See the [3D rendering guide](docs/solid-spatial-renderers.md).
210
+
211
+ Three opt-in `spatial-music-*` modes add music-reactive mesh deformation,
212
+ procedural rock/ice materials, erosion, normal/bump effects, and an optional
213
+ ModernGL offscreen rasteriser with depth-tested shadows and single-scattering
214
+ volumetric lighting. `spatial-music-terrain` can generate new rows from a
215
+ checksum-pinned calibrated StemLab Fourier recording's history with
216
+ `style.terrain_source: "fft"`. Existing DanceRudiments drivers can modulate
217
+ mesh, camera, material, lighting and atmospheric properties. The CPU path
218
+ remains deterministic and works without GPU dependencies.
219
+ See [music-reactive 3D](docs/music-reactive-3d.md) for integration and limits.
220
+
221
+ ## Install and run
222
+
223
+ Python 3.11+ and FFmpeg with libx264/AAC are required. Install the package into
224
+ its own virtual environment. Published packages use `python -m pip install framerudiments`;
225
+ from a source checkout use `python -m pip install .`:
226
+
227
+ ```sh
228
+ python -m pip install .
229
+ framerudiments --version
230
+ framerudiments demo demo --font /path/to/a/font.ttf
231
+ framerudiments plan demo/project.json --output demo-plan.json
232
+ framerudiments preflight demo/project.json --output preflight --ffmpeg /path/to/ffmpeg
233
+ framerudiments render demo/project.json --output render --ffmpeg /path/to/ffmpeg
234
+ ```
235
+
236
+ Use a new output directory each time. `--ffprobe` overrides FFmpeg's sibling
237
+ ffprobe. Environment alternatives are `FRAMERUDIMENTS_FFMPEG` and
238
+ `FRAMERUDIMENTS_FFPROBE`. Fonts are explicit hashed inputs; no platform-specific
239
+ font or FFmpeg location is hardcoded into the engine. The synthetic demo creates
240
+ its own tone, sprite, LRC, CUE and four-dimensional recording.
241
+
242
+ ## Capabilities
243
+
244
+ * Portrait, landscape and square frame-addressed Pillow composition, at native
245
+ constant 60 fps by default. Other frame rates require a recorded reason.
246
+ * Sample-addressed source excerpts and exact repetitions; no time-stretch,
247
+ resampling, normalization or remix. The master is never changed. Short
248
+ derivatives default to 120 ms quarter-sine endpoint fades; set
249
+ `audio.fade_seconds: 0` to preserve an approved raw seam. Visualisers and
250
+ Canvas-style projects default to no fades. AAC encoding is lossy.
251
+ * One caption/cue ledger for actual raster transitions, JSON, SRT and ASS.
252
+ Retains signed frame error, same-frame ordering, explicit clears, carry-in
253
+ lyrics and repeat boundaries. Accepts UTF-8 LRC with offsets/multiple stamps
254
+ and CD CUE INDEX 01 at 75 subframes/s. Section labels never become lyrics.
255
+ * Canonical lyric text comparison, exact input hashes, inert text, bounded text
256
+ wrapping and fit-or-fail behavior. Optional previous/current/next captions
257
+ and exact-text-associated lyric artwork (planes, tablets, signs, etc.).
258
+ * Native DanceRudiments catalogue sampling at integer pips; optional explicit
259
+ interpolation of adjacent native samples for legacy compositor parity.
260
+ Preserves the distinction between 64 pips/beat and 16 DanceMoves ticks/beat.
261
+ * Saved StemLab beat grids, accepted `stemlab.loops.v1` selections, explicitly
262
+ selected `stemlab.dancerudiments.candidates.v1` matches, and native
263
+ `dancerudiments.recording` files. No model execution or copied DSP.
264
+ Match-window extrapolation needs an explicit choice. N-dimensional
265
+ recordings retain their own source clock and never wrap outside capture.
266
+ * Transparent sprites, atlas cycles in musical ticks, cue/time-gated layers,
267
+ position/rotation/scale mappings with selectable axes, same-pose directional
268
+ trails, masks, background contain/cover and N-dimensional signed bars.
269
+ Independent composite motion channels preserve separate bounce/sway/tilt.
270
+ All transformed sprite alpha extents are checked against declared bounds
271
+ on every frame. Custom scene drawing has its own review obligations.
272
+ * Modular rudiment views: seeded moving particles and trails, signed bar graphs,
273
+ scrolling multi-dimensional waveform traces, XY paths and calibrated Fourier
274
+ spectrum views with local peak analysis and peak holds. Any view can use
275
+ the existing native motion sources; a trusted Python registry supports more
276
+ renderers without another frame loop or clock. See
277
+ [docs/rudiment-renderers.md](docs/rudiment-renderers.md) and run
278
+ `framerudiments demo demo --rudiments --font /path/to/font.ttf`.
279
+ * The existing seeded paper-glider flight model and connected-alpha sprite
280
+ cleaner, plus a general frame-addressed lyric-art entrance/hold/exit helper.
281
+ The flight model is stylized animation; it does not simulate real aerodynamics
282
+ or establish musical synchronization by itself.
283
+ * H.264/yuv420p + AAC MP4 with fast start, full decoding, exact decoded frame
284
+ count and every decoded timestamp checked for CFR. Audio length, sample
285
+ rate and channel count are checked against the source. Includes encoded QA
286
+ stills, a poster, phone preview, input/output hashes, commands and logs.
287
+
288
+ The [spectrum guide](docs/spectrum.md) covers saved StemLab Fourier calibration,
289
+ frequency labels, peak controls and per-frame JSONL effect signals. Run
290
+ `framerudiments renderers` for the current built-in names. The optional
291
+ `demo --spectrum` generator uses StemLab 1.6+; rendering its saved recording
292
+ keeps the core package lightweight.
293
+
294
+ ## Project format
295
+
296
+ Start from `framerudiments demo` and replace its synthetic assets. Every file
297
+ reference has `path` and `sha256`; paths are relative to the project JSON unless
298
+ absolute. See [docs/project-format.md](docs/project-format.md) for all fields and
299
+ [docs/extraction.md](docs/extraction.md) for source mechanisms and boundaries.
300
+
301
+ ```python
302
+ from framerudiments import Project, render
303
+
304
+ project = Project.load("release/project.json")
305
+
306
+ def scene(image, context):
307
+ # Existing custom drawing consumes frame, source_seconds, output_seconds,
308
+ # beat, lyric and cue. Return a frame-sized RGBA image.
309
+ return image
310
+
311
+ render(project, "release/new-render", scene=scene, ffmpeg="/path/to/ffmpeg")
312
+ ```
313
+
314
+ Pin any assets used by a custom scene with `project.ref({"path": ..., "sha256": ...})`
315
+ before rendering. The hook is supplied by trusted Python code, never imported
316
+ or executed from a project JSON. Do not reproduce clock, sampling, caption,
317
+ encode or verification loops in release adapters.
318
+
319
+ ## Evidence and limits
320
+
321
+ `plan` is preparation, `preflight` checks all composed frames without encoding,
322
+ and `render` produces **technical-QA passed; creative and attended listening
323
+ review pending**. No command uploads, schedules or publishes anything.
324
+ Automatic checks cannot establish sung-word accuracy, pleasant motion, a
325
+ musical loop seam, platform preview acceptance, rights or public eligibility.
326
+ Caption boxes are composition constraints, not current official platform
327
+ safe-zone verification. Review the exact encoded file and destination preview.
328
+
329
+ Constant-BPM and saved variable-grid clocks record their authority/status;
330
+ an estimate never becomes artist confirmation. Beat grids extrapolate from
331
+ their first/last interval outside their covered extent; constrain projects to
332
+ supported intervals where that is unsuitable. A ranked match does not prove
333
+ whole-song alignment. Recording source/axis provenance is retained; the author
334
+ must select the correct master/stem association. No live WordPress timing,
335
+ sensor or plugin configuration is changed by offline rendering.
336
+
337
+ All text in `captions.ass` is a portable timing sidecar with neutral styling;
338
+ the raster compositor remains the authority for the approved layout.
339
+
340
+ ## Development
341
+
342
+ ```sh
343
+ python -m pip install -e '.[dev]'
344
+ ruff check .
345
+ pytest
346
+ python -m build
347
+ ```
348
+
349
+ Set `FRAMERUDIMENTS_TEST_FONT` and `FRAMERUDIMENTS_FFMPEG` to run all integration
350
+ tests. Without them, corresponding checks report skipped. Tests cover native
351
+ sampling, non-looping recordings, input identity, lyric clears, excerpt/repeat
352
+ boundaries, text/alpha overflow and actual encoded portrait/landscape/square
353
+ outputs. Use synthetic fixtures; never put songs, personal data or private
354
+ analysis outputs into the source distribution.
355
+
356
+ ## Source, contribution and releases
357
+
358
+ [Canonical repository](https://github.com/kieransimkin/FrameRudiments) ·
359
+ [Python package](https://pypi.org/project/framerudiments/) ·
360
+ [Issues and improvements](https://github.com/kieransimkin/FrameRudiments/issues)
361
+
362
+ Read [CONTRIBUTING.md](CONTRIBUTING.md) before changing the engine. Improvements
363
+ belong in focused pull requests to the canonical repository, with current README,
364
+ meaningful tests and reproducible synthetic examples.
365
+
366
+ The GitHub Actions CI runs the complete render suite on Linux and Windows with
367
+ Python 3.11 and 3.13. The release workflow validates the immutable `v<version>` tag,
368
+ re-runs tests, builds/checks wheel and source distribution, performs a clean wheel
369
+ render and publishes exact checksum-labelled assets. Pushing a new `v*` tag publishes
370
+ to GitHub and PyPI automatically after validation; no human reviewer or manual
371
+ publication approval is required. The `pypi` environment has no reviewer gate.
372
+ An existing release is reused only after its source commit and downloaded checksums
373
+ match; assets are never overwritten. Manual dispatch can resume a registry upload
374
+ from an existing immutable tag, preserving its exact GitHub bytes. The PyPI job
375
+ uses a separately configured trusted publisher; no API token is stored in this project.
376
+ A GitHub release and a PyPI listing are separately verified outcomes.
377
+
378
+
379
+ ## Full-frame MilkDrop effects, including lyrics and animated sprites
380
+
381
+ Use optional ordered `effects` stages with **Butterchurn 2.6.7** and **projectM
382
+ 4.2-dev pinned to 349b7cc2db312d47cef6be24c6856ced6643a385**. They process the
383
+ complete image after captions, lyric artwork and DanceRudiments-driven sprites/
384
+ atlases. Original feedback, kaleidoscope and Julia-distortion presets work in
385
+ either engine, and stages can be chained. Offline clocks and soundtrack-derived
386
+ PCM stay tied to the encoded programme. See [setup, format, provenance, GPU
387
+ acceptance and limits](docs/visualisers.md).
388
+
389
+ ```sh
390
+ framerudiments visualisers
391
+ framerudiments demo ./effect-demo --font /path/to/font.ttf --effect butterchurn --effect projectm
392
+ framerudiments render ./effect-demo/project.json --output ./effect-render
393
+ ```
394
+
395
+ Optional runtime setup is explicit; the base renderer still works without Node,
396
+ a browser or projectM. Feedback is sequential, and GPU output can vary by driver.
397
+ Inspect processed/encoded glyphs and safe zones; pre-effect text bounds cannot
398
+ prove final legibility.
399
+
400
+ Version 0.1.4 preserves portrait geometry in pinned projectM legacy presets through a recorded square overscan/crop mapping; the upstream engine remains unmodified. Neutral portrait/landscape/square mapping is tested for both backends.
401
+
402
+ ![Actual synthetic frame before and after both visualisers](https://raw.githubusercontent.com/kieransimkin/FrameRudiments/v0.1.4/docs/media/full-frame-comparison.png)
403
+
404
+ Actual FrameRudiments 0.1.4 candidate output: timed captions and native moving
405
+ sprites/atlas before composition effects (left) and after both real engines
406
+ (right). Synthetic oscillator audio and example words; this is a software demo.
407
+ [Play the four-second demonstration](https://raw.githubusercontent.com/kieransimkin/FrameRudiments/v0.1.4/docs/media/full-frame-demo.mp4)
408
+ and [read its transcript](https://github.com/kieransimkin/FrameRudiments/blob/v0.1.4/docs/media/demo-transcript.md).
409
+ Playback is user-controlled; no automatic media playback is required.
410
+
411
+ ![Generated processing-order illustration; not a screenshot](https://raw.githubusercontent.com/kieransimkin/FrameRudiments/v0.1.4/docs/media/effects-pipeline.svg)
412
+
413
+ Generated vector illustration of the processing order. The comparison above
414
+ and linked video are captured renderer output; the diagram is explanatory.
415
+
416
+ ## Explore and profile the preset library
417
+
418
+ Version 0.3.0 adds a separately installed, checksum-pinned library of **14,680
419
+ distinct upstream presets** (1,738 Butterchurn and 12,942 projectM), with source
420
+ notices, duplicate aliases and 67 shared textures. Real-engine acceptance is
421
+ recorded per preset; available catalogue entries are not claimed as tested.
422
+
423
+ Use `framerudiments presets-install`, then `framerudiments presets-profile` or
424
+ `scripts/profile_visualisers.py` to feed ordinary cover/lyric/audio projects and
425
+ three static calibration cards through each engine, replay every feedback frame,
426
+ capture chosen intervals and invoke released PrismMoves/PixelCue. Reports keep
427
+ input/output, temporal, tune/silence and same-card/different-tune comparisons
428
+ separate, with measured response ranges and explicit unknowns.
429
+
430
+ ![Generated static input cards for controlled preset experiments](https://raw.githubusercontent.com/kieransimkin/FrameRudiments/v0.3.0/docs/media/preset-test-cards.png)
431
+
432
+ Generated calibration illustrations; not preset-output evidence. The maintained
433
+ My Songs suite uses Arcadians and The Truth is a Virus with their canonical
434
+ masters, covers and timed lyrics; those private assets are not bundled.
435
+ See [the complete capture, analysis and synthesis workflow](https://github.com/kieransimkin/FrameRudiments/blob/v0.3.0/docs/preset-profiling.md)
436
+ for pinned packs, licences, runtime setup, resume and interpretation limits.
437
+
438
+ ## Visualisation Atlas and public gallery
439
+
440
+ FrameRudiments now exposes **161 deterministic built-in Rudiment renderers**,
441
+ including spectral waterfall, spectrogram heatmap (linear/log/mel/Bark/ERB
442
+ **axis remappings**, not newly computed filterbanks), radial FFT-band views,
443
+ and oscilloscope-inspired motion traces. All spectrum renderers require pinned,
444
+ calibrated StemLab Fourier evidence; motion traces are not raw PCM audio.
445
+
446
+ [Browse the CI-generated public visualisation gallery](https://kieransimkin.github.io/FrameRudiments/)
447
+ (available after the Pages workflow is enabled and deployed), and read the
448
+ [comprehensive method catalogue](docs/visualisation-atlas.md). Each PR checks
449
+ and generates every mode; main deploys an interactive searchable gallery with
450
+ four reproducible **synthetic** frames per mode. It now also publishes
451
+ **20 annotated native DanceRudiment colour/geometry modulation scenes**.
452
+
453
+ New options include continuous/inward/bipolar/segmented circular spectrum bars,
454
+ polar time-frequency heatmaps, annular and spiral waveform plots, custom gradient
455
+ stops, 16 built-in colour palettes, glow/hue/rotation/scale effects and up to
456
+ 32 independent source-clocked Rudiment modulators targeting colour *or* any
457
+ validated numeric renderer style parameter. All modulation evidence keeps its
458
+ pinned/native input identity. See [all 60 new modes, gradient controls and
459
+ modulation examples](docs/annular-modulation.md).
460
+
461
+ The next generation adds **60 additional display families**: spectrum LED matrices,
462
+ cityscapes, ridgetrails and half-circle analysers; time-frequency voxel terrain,
463
+ hexagonal mosaics and slit scans; and native-value CRT, triggered, braided and
464
+ polar oscilloscope modes. Opt-in deterministic image treatments include scanlines,
465
+ pixelation, grain, vignette, edge highlights, halftone, chromatic separation,
466
+ solarisation and glitches. All these visual controls can be driven by
467
+ source-clocked DanceRudiments. See [expanded effects reference](docs/expanded-effects.md).
468
+
469
+ ## Image-backed Rudiment renderers: 52 additional options
470
+
471
+ FrameRudiments now offers **213 built-in Rudiment renderers**: the existing 161 vector
472
+ options remain registered and unchanged, and 52 sprite-rendered spectrum,
473
+ spectrogram, waveform and movement alternatives can be selected independently.
474
+ The package bundles **17 PNG sprite atlas themes** (1,088 tiles), including 64
475
+ transparent image-generated neon motifs and 1,024 procedurally generated LCD,
476
+ LED, VFD, crystal, glass, retro-pixel, flame and other tiles. Pinned custom
477
+ PNG atlases, animated cell selection and the existing DanceRudiment geometry/
478
+ colour modulation and per-element/full-frame post effects are supported.
479
+
480
+ [Explore vector and sprite comparisons](https://kieransimkin.github.io/FrameRudiments/sprites/)
481
+ and see the [full sprite renderer reference](docs/sprite-visualisations.md).
482
+ There are also 40 new per-sprite numeric controls (including size, rotation,
483
+ colour channels, jitter, glow and animation speed) and validated native-driven
484
+ categorical theme, shape and palette choices. The 16 new modulation lab
485
+ scenes show these controls at four encoded-frame moments.
486
+
487
+ The demo images are synthetic, not measured audio.
488
+
489
+ Enable Settings → Pages → GitHub Actions as the repository publication source.
490
+
491
+ ## Per-element and full-frame post-render effects
492
+
493
+ The new `post_effects` project field supports isolated effects for **each**
494
+ background, scene, sprite, legacy bars, Rudiment layer, identity caption or
495
+ lyric-art element, and separate passes over the **finished frame**. All 161
496
+ renderers and the shared gradients/CRT/colour post effects are supported. Numeric
497
+ parameters use native DanceRudiment modulation; palettes, colour-stop sets and
498
+ gradient modes can switch between validated alternatives. Independent layer
499
+ passes cannot recolour already composited neighbours, while a frame pass can
500
+ act on everything. These stages run before the existing optional
501
+ Butterchurn/projectM feedback chain. See the [compositor effects reference](docs/scoped-post-effects.md)
502
+ and the [public scopes gallery](https://kieransimkin.github.io/FrameRudiments/scopes/).
503
+
504
+ ## High-quality antialiasing and motion blur
505
+
506
+ 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.
507
+
508
+ 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).