Skip to content

RFC-018: Recipe morphing — continuous interpolation between recipes #110

Description

@chipi

Summary

Continuous morph between two (or more) full recipes across a video's duration. The Absynth wavetable primitive applied at the recipe level. Lets long-form pieces drift through compositional space rather than holding one state. Highest-cost RFC in the arc.

RFC

RFC-018 — Recipe morphing

Scope

  • New top-level `morph:` block — declares `sources: [...]` + `schedule:` weight curve
  • Schedule weight is polymorphic — scalar / envelope / clock / macro
  • Two sources at v1; schema generalises to N for v2
  • Per-parameter morph rules:
    • numeric — lerp
    • enum — hard snap at midpoint (default); opt-in crossfade for sample-bank refs
    • envelope — morph the expanded per-frame arrays (universal regardless of breakpoint topology)
    • clock — morph expanded per-frame arrays
    • macro value — morph per its type
    • macro targets — union, weighted by source contribution
    • color — channel-wise lerp
  • Audio sample crossfade: both source audio engines run in parallel during transition zones, mixed by morph weight
  • Outside transition zones (w == 0 or w == 1), only the active source renders — no parallel cost
  • Payload v3 extension: both source payloads + morphed result arrays + schedule for editor introspection
  • Editor: new Morph mode with side-by-side source preview, schedule editor (looks like envelope editor), per-param rule overrides
  • TS ↔ Py cross-validation (~20 fixtures)

Dependencies

Requires RFC-014 (envelope morph operates on expanded arrays); benefits from RFC-017 (macros morph well via target-list union). Should ship after the rest of the arc is stable — highest cost, highest schema complexity.

Closes into

  • ADR-042 — Recipe morphing: schedule + interpolation
  • ADR-043 — Per-parameter morph rules + sample crossfade

Implementation task

`RFC-018 implementation: recipe morphing` in the task list.

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions