Go to file
Skyler Lehmkuhl c62164c365 Cycle recording: MIDI separate-takes mode, and append to existing folders
Completes the cycle-recording spec. Three related pieces:

MIDI separate takes (Preferences > Audio > "Cycle MIDI recording"):
- Each pass becomes its own MIDI clip, folded into a take folder — the same
  shape audio always gets — instead of merging into one clip. Merge stays
  the default.
- Notes are bucketed by the pass they were played in. The pass counter bumps
  BETWEEN close_active_notes and the re-note_on at a wrap, so a key held
  across the boundary has its sounding half filed under the pass that's
  ending and its re-opened half under the pass that's beginning. Put the bump
  on either side of that pair and the whole note lands in one pass; there's a
  test named for exactly that.
- A silent INTERIOR pass still yields an empty take, so take N is always pass
  N — otherwise the numbering silently shifts and "take 3" stops meaning "the
  third time round". A TRAILING empty pass is dropped: that's what hitting
  stop shortly after a wrap gives you, a stop artifact rather than a take you
  played. (Audio already behaved this way via its short-final-take rule.)
- Still triggers on the wrap: stop inside the first pass and it's an ordinary
  single recording, whatever the preference says.

Append to an existing take folder (AppendTakesAction):
- Cycle-recording over a region that already holds a take folder now ADDS to
  that folder rather than dropping a second clip on top of it, which stranded
  the new takes in an overlapping clip you couldn't audition against the old.
- "Same region" means same start AND same loop length: resize the cycle region
  and you get a fresh folder, rather than takes of a different length appended
  to an existing one, which would break the uniform-take invariant that
  comping-via-split depends on.
- The recording's own clip/instance are throwaway scaffolding here (the takes
  already live in the backend pools), so they're discarded; the single
  AppendTakesAction is the whole undoable step.

Don't play the region you're recording over:
- While recording into a MIDI track, every clip on that track is silenced
  EXCEPT the one being recorded into. A take folder already sitting in the
  cycle region was otherwise playing its active take underneath you on every
  pass, fighting the part you were trying to record.
- The recording clip itself is exempt, because in merge mode that's precisely
  what you want to hear: the overdub you've been building up. Other tracks are
  untouched.
2026-07-14 12:10:08 -04:00
.github/workflows ci: enable VAAPI in the from-source ffmpeg build 2026-06-25 21:27:06 -04:00
daw-backend Cycle recording: MIDI separate-takes mode, and append to existing folders 2026-07-14 12:10:08 -04:00
docs note nam build requirements 2026-03-01 10:47:13 -05:00
ffmpeg-blob-io Pack video into .beam and stream frames + audio from the blob 2026-06-22 09:17:10 -04:00
lightningbeam-core improve detection 2025-01-31 07:12:12 -05:00
lightningbeam-ui Cycle recording: MIDI separate-takes mode, and append to existing folders 2026-07-14 12:10:08 -04:00
nam-ffi Fix NAM runtime errors on linux 2026-03-06 06:37:25 -05:00
packaging ci: enable VAAPI in the from-source ffmpeg build 2026-06-25 21:27:06 -04:00
screenshots Update readme 2025-11-23 21:58:34 -05:00
scripts release scripts: push the release branch to both forges 2026-06-21 18:38:33 -04:00
src Add automatable volume and pan control to default instruments 2026-03-23 23:27:05 -04:00
tests work on tests 2025-11-12 08:52:16 -05:00
vendor deduplicate node list 2026-02-21 09:42:05 -05:00
.gitignore Stop tracking TODO.md; remove completed plan docs 2026-07-12 09:19:59 -04:00
.gitmodules deduplicate node list 2026-02-21 09:42:05 -05:00
ARCHITECTURE.md docs: correct branch references to main (not master) 2026-06-21 21:19:53 -04:00
BEAM_FILE_FORMAT.md Pack video into .beam and stream frames + audio from the blob 2026-06-22 09:17:10 -04:00
CONTRIBUTING.md docs: correct branch references to main (not master) 2026-06-21 21:19:53 -04:00
Changelog.md Bump version to 1.0.9-alpha 2026-07-12 09:09:17 -04:00
LICENSE License under GPLv3 2026-02-25 00:52:06 -05:00
README.md README: update status + add prebuilt-release run instructions 2026-07-12 09:39:17 -04:00
beam_inspector.py Document the .beam SQLite format and port the inspector 2026-06-21 23:08:15 -04:00
beam_inspector_README.md Document the .beam SQLite format and port the inspector 2026-06-21 23:08:15 -04:00
create_release.sh release scripts: push the release branch to both forges 2026-06-21 18:38:33 -04:00
package.json Remove the legacy Tauri backend (src-tauri) 2026-06-21 18:25:39 -04:00
phone-ui-sketches.html P6a: mobile music surface (keyboard-primary instrument pane) 2026-07-02 07:50:37 -04:00
pnpm-lock.yaml Record audio tracks 2025-10-23 01:08:45 -04:00

README.md

Lightningbeam

A free and open-source 2D multimedia editor combining vector animation, audio production, and video editing in a single application.

Screenshots

Animation View

Music Editing View

Video Editing View

Features

Vector Animation

  • GPU-accelerated vector rendering with Vello
  • Draw and animate vector shapes with keyframe-based timeline
  • Non-destructive editing workflow
  • Paint bucket tool for automatic fill detection

Audio Production

  • Real-time multi-track audio recording and playback
  • Node graph-based effects processing
  • MIDI sequencing with synthesizers and samplers
  • Comprehensive effects library (reverb, delay, EQ, compression, distortion, etc.)
  • Custom audio engine with lock-free design for glitch-free playback

Video Editing

  • Video timeline and editing with FFmpeg-based decoding
  • GPU-accelerated waveform rendering with mipmaps
  • Audio integration from video soundtracks

Technical Stack

Current Implementation (Rust UI)

  • UI Framework: egui (immediate-mode GUI)
  • GPU Rendering: Vello + wgpu (Vulkan/Metal/DirectX 12)
  • Audio Engine: Custom real-time engine (daw-backend)
    • cpal for cross-platform audio I/O
    • symphonia for audio decoding
    • dasp for node graph processing
  • Video: FFmpeg 8 for encode/decode
  • Platform: Cross-platform (Linux, macOS, Windows)

Legacy Implementation (Deprecated)

  • Frontend: Vanilla JavaScript
  • Backend: Rust (Tauri framework)

Project Status

Lightningbeam is developed on the main branch. The project has been rewritten from a Tauri/JavaScript prototype to a pure Rust application to eliminate IPC bottlenecks and achieve better performance for real-time video and audio processing.

Current Status:

  • Core UI panes (Stage, Timeline, Asset Library, Info Panel, Toolbar)
  • Drawing tools (Select, Draw, Rectangle, Ellipse, Paint Bucket, Transform)
  • Undo/redo system
  • GPU-accelerated vector rendering
  • Audio engine with node graph processing
  • GPU waveform rendering with mipmaps
  • Video decoding integration
  • Export system (video, image, audio, animated GIF, SVG)
  • Node editor UI
  • 🚧 Piano roll editor (in progress)

Getting Started

Download a prebuilt release

If you don't want to build from source, prebuilt binaries for each release are on the GitHub releases page. Download the build for your platform and run it directly.

Building from source

Prerequisites

  • Rust (stable toolchain via rustup)
  • System dependencies:
    • Linux: ALSA development files, FFmpeg 8
    • macOS: FFmpeg (via Homebrew)
    • Windows: FFmpeg 8, Visual Studio with C++ tools

See docs/BUILDING.md for detailed setup instructions.

Building and Running

# Clone the repository
git clone https://github.com/skykooler/lightningbeam.git
# Or from Gitea
git clone https://git.skyler.io/skyler/lightningbeam.git

cd lightningbeam/lightningbeam-ui

# Build and run
cargo run

# Or build optimized release version
cargo build --release

Documentation

Project History

Lightningbeam evolved from earlier multimedia editing projects I've worked on since 2010, including the FreeJam DAW. The JavaScript/Tauri prototype began in November 2023, and the Rust UI rewrite started in late 2024 to eliminate performance bottlenecks and provide a more integrated native experience.

Goals

Create a comprehensive FOSS alternative for 2D-focused multimedia work, integrating animation, audio, and video editing in a unified workflow. Lightningbeam aims to be:

  • Fast: GPU-accelerated rendering and real-time audio processing
  • Flexible: Node graph-based audio routing and modular synthesis
  • Integrated: Seamless workflow across animation, audio, and video
  • Open: Free and open-source, built on open standards

Contributing

Contributions are welcome! Please see CONTRIBUTING.md for guidelines.

License

[License information to be added]