Files
sideline/docs/proposals/adr-preset-scripting-language.md

7.0 KiB

ADR: Preset Scripting Language for Mainline

Status: Draft

Context

We need to evaluate whether to add a scripting language for authoring presets in Mainline, replacing or augmenting the current TOML-based preset system. The goals are:

  1. Expressiveness: More powerful than TOML for describing dynamic, procedural, or dataflow-based presets
  2. Live coding: Support hot-reloading of presets during runtime (like TidalCycles or Sonic Pi)
  3. Testing: Include assertion language to package tests alongside presets
  4. Toolchain: Consider packaging and build processes

Current State

The current preset system uses TOML files (presets.toml) with a simple structure:

[presets.demo-base]
description = "Demo: Base preset for effect hot-swapping"
source = "headlines"
display = "terminal"
camera = "feed"
effects = []  # Demo script will add/remove effects dynamically
camera_speed = 0.1
viewport_width = 80
viewport_height = 24

This is declarative and static. It cannot express:

  • Conditional logic based on runtime state
  • Dataflow between pipeline stages
  • Procedural generation of stage configurations
  • Assertions or validation of preset behavior

Problems with TOML

  • No way to express dependencies between effects or stages
  • Cannot describe temporal/animated behavior
  • No support for sensor bindings or parametric animations
  • Static configuration cannot adapt to runtime conditions
  • No built-in testing/assertion mechanism

Approaches

1. Visual Dataflow Language (PureData-style)

Inspired by Pure Data (Pd), Max/MSP, and TouchDesigner:

Pros:

  • Intuitive for creative coding and live performance
  • Strong model for real-time parameter modulation
  • Matches the "patcher" paradigm already seen in pipeline architecture
  • Rich ecosystem of visual programming tools

Cons:

  • Complex to implement from scratch
  • Requires dedicated GUI editor
  • Harder to version control (binary/graph formats)
  • Mermaid diagrams alone aren't sufficient for this

Tools to explore:

  • libpd (Pure Data bindings for other languages)
  • Node-based frameworks (node-red, various DSP tools)
  • TouchDesigner-like approaches

2. Textual DSL (TidalCycles-style)

Domain-specific language focused on pattern transformation:

Pros:

  • Lightweight, fast iteration
  • Easy to version control (text files)
  • Can express complex patterns with minimal syntax
  • Proven in livecoding community

Cons:

  • Learning curve for non-programmers
  • Less visual than PureData approach

Example (hypothetical):

preset my-show {
  source: headlines
  
  every 8s {
    effect noise: intensity = (0.5 <-> 1.0)
  }
  
  on mic.level > 0.7 {
    effect glitch: intensity += 0.2
  }
}

3. Embed Existing Language

Embed Lua, Python, or JavaScript:

Pros:

  • Full power of general-purpose language
  • Existing tooling, testing frameworks
  • Easy to integrate (many embeddable interpreters)

Cons:

  • Security concerns with running user code
  • May be overkill for simple presets
  • Testing/assertion system must be built on top

Tools:

  • Lua (lightweight, fast)
  • Python (rich ecosystem, but heavier)
  • QuickJS (small, embeddable JS)

4. Hybrid Approach

Visual editor generates textual DSL that compiles to Python:

Pros:

  • Best of both worlds
  • Can start with simple DSL and add editor later

Cons:

  • More complex initial implementation

Requirements Analysis

Must Have

  • Express pipeline stage configurations (source, effects, camera, display)
  • Support parameter bindings to sensors
  • Hot-reloading during runtime
  • Integration with existing Pipeline architecture

Should Have

  • Basic assertion language for testing
  • Ability to define custom abstractions/modules
  • Version control friendly (text-based)

Could Have

  • Visual node-based editor
  • Real-time visualization of dataflow
  • MIDI/OSC support for external controllers

User Stories (Proposed)

Spike Stories (Investigation)

Story 1: Evaluate DSL Parsing Tools

As a developer, I want to understand the available Python DSL parsing libraries (Lark, parsy, pyparsing) so that I can choose the right tool for implementing a preset DSL.

Acceptance: Document pros/cons of 3+ parsing libraries with small proof-of-concept experiments

Story 2: Research Livecoding Languages

As a developer, I want to understand how TidalCycles, Sonic Pi, and PureData handle hot-reloading and pattern generation so that I can apply similar techniques to Mainline.

Acceptance: Document key architectural patterns from 2+ livecoding systems

Story 3: Prototype Textual DSL

As a preset author, I want to write presets in a simple textual DSL that supports basic conditionals and sensor bindings.

Acceptance: Create a prototype DSL that can parse a sample preset and convert to PipelineConfig

Story 4: Investigate Assertion/Testing Approaches

As a quality engineer, I want to include assertions with presets so that preset behavior can be validated automatically.

Acceptance: Survey testing patterns in livecoding and propose assertion syntax

Implementation Stories (Future)

Story 5: Implement Core DSL Parser

As a preset author, I want to write presets in a textual DSL that supports sensors, conditionals, and parameter bindings.

Acceptance: DSL parser handles the core syntax, produces valid PipelineConfig

Story 6: Hot-Reload System

As a performer, I want to edit preset files and see changes reflected in real-time without restarting.

Acceptance: File watcher + pipeline mutation API integration works

Story 7: Assertion Language

As a preset author, I want to include assertions that validate sensor values or pipeline state.

Acceptance: Assertions can run as part of preset execution and report pass/fail

Story 8: Toolchain/Packaging

As a preset distributor, I want to package presets with dependencies for easy sharing.

Acceptance: Can create, build, and install a preset package

Decision

Recommend: Start with textual DSL approach (Option 2/4)

Rationale:

  • Lowest barrier to entry (text files, version control)
  • Can evolve to hybrid later if visual editor is needed
  • Strong precedents in livecoding community (TidalCycles, Sonic Pi)
  • Enables hot-reloading naturally
  • Assertion language can be part of the DSL syntax

Not recommending Mermaid: Mermaid is excellent for documentation and visualization, but it's a diagramming tool, not a programming language. It cannot express the logic, conditionals, and sensor bindings we need.

Next Steps

  1. Execute Spike Stories 1-4 to reduce uncertainty
  2. Create minimal viable DSL syntax
  3. Prototype hot-reloading with existing preset system
  4. Evaluate whether visual editor adds sufficient value to warrant complexity

References