Conversation
…_playing. Signed-off-by: BuffMcBigHuge <[email protected]>
Signed-off-by: BuffMcBigHuge <[email protected]>
…_playing. Signed-off-by: BuffMcBigHuge <[email protected]>
Signed-off-by: BuffMcBigHuge <[email protected]>
Signed-off-by: RyanOnTheInside <[email protected]> Signed-off-by: BuffMcBigHuge <[email protected]>
Signed-off-by: BuffMcBigHuge <[email protected]>
…steps and others. Signed-off-by: BuffMcBigHuge <[email protected]>
Signed-off-by: BuffMcBigHuge <[email protected]>
Signed-off-by: BuffMcBigHuge <[email protected]>
Signed-off-by: BuffMcBigHuge <[email protected]>
Signed-off-by: BuffMcBigHuge <[email protected]>
Signed-off-by: BuffMcBigHuge <[email protected]>
Signed-off-by: BuffMcBigHuge <[email protected]>
…odulation-2 Signed-off-by: BuffMcBigHuge <[email protected]>
Signed-off-by: BuffMcBigHuge <[email protected]>
Signed-off-by: BuffMcBigHuge <[email protected]>
Signed-off-by: BuffMcBigHuge <[email protected]>
Resolve conflicts in pyproject.toml, frame_processor.py, pipeline_processor.py, and uv.lock. Thread tempo_sync and modulation_engine through the new graph executor. Co-Authored-By: Claude Opus 4.6 <[email protected]> Signed-off-by: Rafał Leszko <[email protected]>
…ockerfiles MIDI requires local hardware access so libasound2 is not useful in containers. Also corrects uv sync --group to --extra across docs. Co-Authored-By: Claude Opus 4.6 <[email protected]> Signed-off-by: Rafal Leszko <[email protected]>
Remove isCloudMode and onOpenLoRAsSettings props that were added to DownloadDialog solely to suppress TypeScript errors in StreamPage, but were never actually used by the component. Co-Authored-By: Claude Opus 4.6 <[email protected]> Signed-off-by: Rafał Leszko <[email protected]>
transition (object) and denoising_step_list (array) were not caught by the typeof === "boolean" / "string" checks, so they bypassed beat quantization. Use a DISCRETE_PARAM_KEYS allowlist for key-based detection of known discrete parameters. Co-Authored-By: Claude Opus 4.6 <[email protected]> Signed-off-by: Rafał Leszko <[email protected]>
Co-Authored-By: Claude Opus 4.6 <[email protected]> Signed-off-by: Rafał Leszko <[email protected]>
Moves the 5 tempo endpoints from app.py into tempo_router.py, following the same APIRouter pattern as mcp_router.py. Co-Authored-By: Claude Opus 4.6 <[email protected]> Signed-off-by: Rafał Leszko <[email protected]>
mcp>=1.0.0 is already in core dependencies, so the optional-dependencies entry was unnecessary. Co-Authored-By: Claude Opus 4.6 <[email protected]> Signed-off-by: Rafał Leszko <[email protected]>
Make TempoSource an ABC with abstract methods, add _enabled_lock for thread-safe access, prune dead notification senders, unify install hints to use `uv sync --extra`, and clean up redundant .get() fallbacks. Co-Authored-By: Claude Opus 4.6 <[email protected]> Signed-off-by: Rafał Leszko <[email protected]>
Signed-off-by: Rafał Leszko <[email protected]>
Extract beat boundary calculation to a standalone get_beat_boundary() in tempo_sync.py and consolidate inline beat state handling into a dedicated _apply_tempo_sync() method. Co-Authored-By: Claude Opus 4.6 (1M context) <[email protected]> Signed-off-by: Rafał Leszko <[email protected]>
… warnings - Use `self.enabled` property (with lock) in `get_status()` instead of bare `self._enabled` - Add `PipelineProcessor.set_beat_cache_reset_rate()` to encapsulate private attribute access - Downgrade noisy per-frame "Extra params" log from info to debug - Convert f-string logger calls to %-style lazy formatting across tempo sync modules - Fix ESLint exhaustive-deps warnings in StreamPage prompt cycle effect Co-Authored-By: Claude Opus 4.6 (1M context) <[email protected]> Signed-off-by: Rafał Leszko <[email protected]>
Signed-off-by: BuffMcBigHuge <[email protected]>
Signed-off-by: BuffMcBigHuge <[email protected]>
|
Important Review skippedAuto reviews are disabled on this repository. Please check the settings in the CodeRabbit UI or the ⚙️ Run configurationConfiguration used: Organization UI Review profile: CHILL Plan: Pro Run ID: You can disable this status message by setting the Use the checkbox below for a quick retry:
✨ Finishing Touches🧪 Generate unit tests (beta)
📝 Coding Plan
Comment Tip You can disable sequence diagrams in the walkthrough.Disable the |
Signed-off-by: BuffMcBigHuge <[email protected]>
🚀 fal.ai Preview Deployment
TestingConnect to this preview deployment by running this on your branch: 🧪 E2E tests will run automatically against this deployment. |
✅ E2E Tests passed
Test ArtifactsCheck the workflow run for screenshots. |
The OSC SSE EventSource subscription was accidentally deleted when the tempo sync useEffect was added, breaking OSC parameter control. The dmx_server variable was also dropped from the global declaration in lifespan(), causing get_dmx_server() to always return None. Co-Authored-By: Claude Opus 4.6 (1M context) <[email protected]> Signed-off-by: Rafał Leszko <[email protected]>
…ck race - Use 2**31-1 as upper bound for random seed to stay within signed 32-bit range - Add forward pass in modulate_step_list to fix strictly descending invariant when values are clamped to hi; fall back to clamped original if range is too narrow for distinct values - Unify _source_lock and _enabled_lock into a single _state_lock in TempoSync so enable/disable/get_beat_state see consistent _source + _enabled state Co-Authored-By: Claude Opus 4.6 (1M context) <[email protected]> Signed-off-by: Rafał Leszko <[email protected]>
Wrap `import mido` in try/except like the Link adapter does, preventing ImportError when the module is imported without mido installed. Also move _quantize_mode and _lookahead_ms reads/writes under the scheduler lock to eliminate a TOCTOU race where the mode could change between the initial check and delay computation. Co-Authored-By: Claude Opus 4.6 (1M context) <[email protected]> Signed-off-by: Rafał Leszko <[email protected]>
Move overflow scrolling from InputAndControlsPanel to the parent container so Tempo Sync and Outputs scroll with Input & Controls instead of pushing it off-screen. Co-Authored-By: Claude Opus 4.6 (1M context) <[email protected]> Signed-off-by: Rafał Leszko <[email protected]>
Add --extra link to uv sync in all three platform setup paths so aalink is installed automatically in the desktop app. Co-Authored-By: Claude Opus 4.6 (1M context) <[email protected]> Signed-off-by: Rafał Leszko <[email protected]>
uv run performs its own sync before executing, which can remove aalink installed during setup. Pass --extra link to uv run as well. Co-Authored-By: Claude Opus 4.6 (1M context) <[email protected]> Signed-off-by: Rafał Leszko <[email protected]>
Tempo Sync & Modulation
Summary
Adds tempo synchronization and beat-synced parameter modulation to Scope. Pipelines can lock to Ableton Link or MIDI clock, quantize discrete parameter changes to beat boundaries, and continuously modulate parameters (e.g.
noise_scale,denoising_steps) in sync with the beat. Target users are VDJs running Scope alongside Ableton Live, Resolume, or similar applications.What's in this PR
Core
aalink,mido/python-rtmidi). When neither is installed, the UI shows install hints and the feature degrades gracefully.Frontend
ui.modulatablefields), wave shape (sine, cosine, triangle, saw, square, pulse decay), rate (½ beat → 4 bars), depth.Modulatable pipelines
LongLive, Krea, MemFlow, RewardForcing, StreamDiffusionV2 expose
denoising_stepsand (LongLive)noise_scaleas modulatable viaui_field_config(modulatable=True, ...).Architecture
bpm,beat_phase,bar_position,beat_count,is_playinginjected into every pipeline call.modulationsin parameter updates; Pydantic-validated on receipt.REST API
/api/v1/tempo/status/api/v1/tempo/enable/api/v1/tempo/disable/api/v1/tempo/set_tempo/api/v1/tempo/sourcesModulation: No dedicated REST API. Config is sent as
modulationsin WebRTC parameter updates.How to try it
Install optional deps (for Link or MIDI):
Run Scope and start a stream.
Open the Tempo Sync panel in the sidebar. Enable tempo sync, choose Link or MIDI, set BPM.
Quantize mode: Set to "Beat" or "Bar" so changes like prompt switches land on the beat. Adjust lookahead if latency is visible.
Modulation: In the modulation section, pick a target (e.g. Noise Scale), choose shape/rate/depth, and toggle ON.
Prompt cycling: Add multiple prompts to the timeline, set
promptCycleRateto "Bar" or "Beat", and prompts will advance automatically.Demo pipelines: Use
metronometo test lookahead ormod-scopeto visualize modulation.Testing
tests/test_parameter_scheduler.py— adversarial tests for boundary math, concurrency, lookahead, and edge cases.Optional dependencies
Breaking changes
None. Tempo sync and modulation are additive. Pipelines that don't use beat kwargs are unaffected.
Documentation
docs/tempo-sync-review.md— Implementation review, architecture, API, edge cases, and future work.Summary by CodeRabbit
New Features
Bug Fixes