The beginning
The seed idea — psychoacoustic presets that change how sound sits in space
"I want to somehow set up different sonic shapes... maybe I'm just defining a reverb preset, but I want dimensional fading — as the volume changes, so does its interaction with the space of the music, following psychoacoustic principles."
Producer vs seller
BrandArchitecture
The honest reckoning — heavy producer, weak seller
"I am starting to realize that any commercial effort needs two parts. A producer, and a seller. I am a heavy producer, but I am weak in selling. I need to figure out how to automate the process of selling, communicating value..."
Elijah borrows Charles' OP-1 Field
"The OP-1F tape is powerful because of what it removes."
Has to give back the OP-1, gets FOMO
"No undo anxiety — the constraint IS the instrument."
The four-hour sprint that started everything
"I want to re-create the scratchpad capabilities in REAPER, and then as a parallel effort, create a native macOS app that works as a layering audio scratchpad like the OP-1F tape recorder."
Destructive buffer
X1Architecture
Destructive buffer, no undo — the core design decision
"The buffers will be immediately written to the in-memory file, so if the user slows down or changes play rate, direction, the changes will be reflected immediately."
Ratio speeds 0.5x / 1x / 2x
"Yeah I think we should use ratio speeds? Or at least quantize the slider so it only allows for stepped speeds."
In/Out/Loop
X1Architecture
In / Out / Loop model
"I would like to add three buttons to the UI. In, Out, Loop. These set the loop points. By default, in is 0. When out is set, loop mode is active."
Tape engine → WaveLoop rename
X4 four-track born the same day as X1
macOS port begins
X1Architecture
Decision to go native — CoreAudio, Swift, 3:38 AM
"I want WaveLoop to be re-created natively for my macOS. It should use the CoreAudio system inputs and outputs. I want it to be performant."
GET TO THE CHOPPA
Choppa is born
ChoppaPivot
One-shot triggering logic splits into its own app
"Let's remove the 'play avoiding logic', I will be making a totally separate app for this... We will delegate this 'one shot' to the next window called 'Choppa'."
Choppa's signature constraint — one voice at a time
"Add a 'choke' mode to Choppa that constrains it to one sound at a time, and make that default."
The funnel
BrandArchitecture
How the product ecosystem fits together
"The macOS app should just be called 'WaveLoop', it's like the end of the funnel so to speak. The JSFX REAPER plugins are outreach tools to get people into my creative suite architecture."
Eat: combine mirror windows
"now we need an 'eat' button which combines the current and next mirrors into one, but then the user can record over that, and eat another one if they choose. a way of managing the window"
waveloop.config
X1Architecture
waveloop.config source of truth — one file drives all platforms
"Base file 'waveloop.config' — this is our source of truth for these apps. It is to be our guide when implementing the suite."
X4 mirror subdivision
X4Architecture
X4 per-track mirror subdivision
X4 A/B sides + clear hierarchy
FLAT restored, side labels
Get Off The Grid
BrandTerm
The tagline that defined the product
"I want the tagline of this software to be 'Get off the grid' — The goal of this general effort is to remove the constraints of being 'perfect' and just getting ideas out. WaveLoop is the first shippable artifact of this vision and direction."
Scratchpad philosophy
X1Architecture
The purpose of WaveLoop, in Elijah's words
"The purpose of this is to create an immediate and permanent scratchpad. Forcing the creator to consider the signal going in before they record. Training the ear."
CC 118 Choppa
ChoppaArchitecture
CC 118 export to Choppa
Choppa MIDI layout
ChoppaArchitecture
Choppa MIDI focus + pad/knob layout
"Let's figure out a way to shift the MIDI controller focus from WaveLoop to Choppa, which will re-color all the things to represent the Choppa concerns."
The Product Takes Shape
waveloop.app purchased
BrandShipped
Domain purchased, marketing site started, Lucian Labs formed
"Create a business for Lucian Labs, under which I will be publishing all my plugins, apps, etc. Basically everything revenue generating will be done under Lucian Labs."
Experimentation, not fidelity
X1Architecture
The design philosophy crystallizes
"This is a platform of experimentation, not fidelity. The only accuracy we are concerned about is accurate timing of recorded events."
Tape loss mode
X1Architecture
Deliberate degradation — cheap algorithms to deteriorate each recording pass
"I want to add a 'tape mode' which uses various cheap algorithms to deteriorate / attenuate / distort / delay / warp / mangle / etc each recording pass slightly. I understand this is all cheap, and it's intentional."
Pixel aesthetic
X1Architecture
Waveforms draw in 4-pixel blocks — the lofi visual identity
"Make it so that the waveforms draw a little bit more pixely vibe. So like in 4 pixel blocks. If that makes sense."
Origin story awareness
BrandArchitecture
Realizing the journey itself is worth documenting
"I feel like the earlier sessions are worth capturing, as they were the birthplace of the WaveLoop product. I have always struggled with going back in my mind to describe the problem I was trying to solve... now with the agentic AI, my thought process is almost directly translated here."
Choppa mouse fix
ChoppaBug
Choppa compact mouse fix
Signal log system (BRIEF + pulse)
WaveLoop.lua scaffold
Embedded 3-btn transport REC/PLAY/STOP
Choppa iOS A/B/C/D
ChoppaShipped
Choppa iOS A/B/C/D, de-click, share
Mac ship prep: entitlements, icon
ReaPack + S3 CDN zip
JUCE X1 VST3/AU
JSFXShipped
JUCE X1 VST3/AU — first cross-DAW plugin build
ReaPack publishing live
Get Off The Grid rebrand
UI lab: all platforms mockups
Choppa App Store
ChoppaWin
Choppa submitted to App Store
WaveGlyph bridge
ChoppaWin
iOS Choppa reads WaveGlyph from JSFX — cross-platform audio bridge working
"Tie WaveGlyph into iOS Choppa please. Have a 'wav' and 'png'. This is going goood."
X1 Goes Bare Metal
The pivot that changed everything
"What if it ran on a Pi?"
First boot
waveOSArchitecture
First boot: HyperPixel 4.0 + UA Volt 276 + Arturia MiniLab 3
ALSA capture
waveOSArchitecture
ALSA raw capture: S32_LE in, S16_LE out, 48kHz — bare metal audio
SDL2 KMS-DRM
waveOSArchitecture
SDL2 on KMS-DRM — no X11, no Wayland, just pixels
3 failed rotation hacks before render-to-texture worked
Portrait HyperPixel
waveOSWin
Portrait HyperPixel finally renders right-side up
Arturia LEDs
waveOSShipped
Arturia SysEx LED colors — first RGB glow on the pads
Full transport
waveOSShipped
Full tape transport: play, record, rewind, reverse, loop in/out
WAV auto-save
waveOSShipped
WAV auto-save on stop — never lose a take
INI config
waveOSArchitecture
INI config parser for every pad, knob, and CC mapping
Knob overlay
waveOSShipped
Knob overlay feedback on HyperPixel — tweak and see it move
Input routing
waveOSShipped
Input routing: stereo, mono, in1, in2
Bank B pads: overwrite, speed toggle, save loop
Pi user is 'elijah' not 'pi' — 3 min SSH identity crisis
Zero warnings on ARM. Satisfying.
Effects engine
waveOSShipped
Effects engine lands: noise gate, compressor, delay
Vinyl scrub with inertia — encoder becomes turntable
"OMG THIS DELAY IS SO FUCKING COOL" — the moment
"OMG THIS DELAY IS SO FUCKING COOL. I'm gonna play with this and brainstorm some more ideas... this is the coolest shit ever... good night. Make best guesses, worst case, we roll back in source control <3"
Delay feedback loops that self-oscillate into oblivion
Bare metal dev means no graceful exits
"I always forget I can load another terminal... I tried killing it: ^C^C^C^C^C"
9.8% CPU on Pi 4 — room for a Zero 2 W
576KB delay buffer
waveOSArchitecture
576KB delay buffer initialized — the Pi didn't flinch
Effects mega-expansion: 14 effects engine
FX send routing
waveOSArchitecture
FX send routing: input + output buses
Tape loss simulation — generation decay on every overdub
Dual FX loops
waveOSShipped
Dual independent FX loops — input + output chains
Focus system
waveOSArchitecture
Focus system: last fader touched routes knobs to that FX loop
FX param names
waveOSShipped
FX param names — "Del Time" not "FX Param 1"
Knob smoothing
waveOSShipped
Knob CC smoothing — no more steppiness on filter sweeps
Scrub retuned: slower start, faster stop, blends back to play speed
Config panel
waveOSShipped
Config panel: encoder-driven settings overlay on HyperPixel
The Mirror System
Choppa approved on the App Store
Encourage creation
X1Architecture
The UX philosophy — make overdub feel inviting, not scary
"You should be able to hear the recorded audio while you overdub. The goal is to enable creation, and encourage the desire to add to the tape."
Mirror/ref C port
JSFXShipped
JSFX mirror/ref system ported to C — canonical chew/eat/pop/flat
Chew: half-focus the mirror window, pick the half you're in
"ok when I use 'chew', it doesn't show the section repeated, it still only shows the original, i hear the repeated sections, but it shows the full loop."
Eat: duplicate current pane to next, expand ref window
Pop: drop the mirror — back to raw tape
Flat: bake mirrored view into buffer, then drop ref
"no keep the pane expanded, it's part of the workflow i want, because I want to be able to flatten back out with the same loop window if that makes sense."
map_ref_pos()
X1Architecture
All tape reads go through map_ref_pos() — waveform shows mirrored audio
24 burn effects
waveOSShipped
24 piano burn effects: C2-B3 keybed → momentary DSP destruction
Burn palette
waveOSArchitecture
Wobble, Erode, Crackle, Stutter, TapeStop, Warble, Grain, Echo + 16 more
Burn bitmask
waveOSArchitecture
Burn bitmask: hold multiple keys = stack effects in real-time
Display aligned to macOS app: reactive header, shadow waveform, clip detection
Loop markers
waveOSShipped
Green IN / Red OUT loop markers + light blue ref repeat lines
REF indicator
waveOSShipped
REF indicator with subdivision ratio — "REF 4x" on the header
Lock-free atomics
waveOSArchitecture
Lock-free atomics across 3 threads: audio (SCHED_FIFO 75), MIDI, display
Windows X1 — Feature Sprint
Full C port for Windows — ASIO + PortAudio, 89-test suite
Copy+Extend button
X1Shipped
Button 50: copy ref region (or full loop) and extend loop — enables odd timings like 5/4 from chew
Double Loop button
X1Shipped
Button 51: duplicate entire loop content, double all regions. Replaced old speed toggle buttons
Unified audio engine across WaveLoop, Choppa, and Tide
"Honestly let's just cut it over to Swift. I want to use some unified audio engine stuff between WaveLoop, Choppa, Tide, and anything to do with audio."
3 rounds of debugging left-channel-only audio. Rewrote ASIO selectors. Traced the entire signal path.
"My headphones were unscrewed. lmao"
7 new tests covering copy+extend, double loop, capacity clamping, and chew→extend odd timing workflow
Cross-machine sprint
BrandArchitecture
The moment the project outgrew one machine
"My brain is starting to feel the drain. I'm moving over to my Windows PC to finish the Windows port of WaveLoop. Gonna get it to pull context and continue."
Top-right GUI timer: starts on Record, resets only on Clear — for OBS replay buffer timing
ASIO/non-ASIO config UX
X1Shipped
Config panel hides irrelevant selectors: 'In Ch' hidden on ASIO, 'In Select' hidden on non-ASIO
Get The Suite
BrandShipped
waveloop.app updated: 'Get the Suite' branding with macOS + Windows buy buttons via Paddle
Choppa 1.1.0
Per-division sub-pages: switch 4→8→16 pads and all metadata (gain, pitch, reverse, loop, bounds) persists per layer
Live parameter control
ChoppaShipped
Change pitch, volume, reverse, or loop mode while voices are playing. Scrub region bounds mid-playback
64 tests passing
ChoppaWin
Test suite expanded: mash, safe import, normalize, soft clip, layer round-trips, export/import
Settings overlay
ChoppaShipped
Import controls panel: Safe Import (attenuate hot signals), Normalize (scale to unity), Mash (soft-clip grit), Monitor Input
Recording pre-roll
ChoppaShipped
Ring buffer captures ~43ms of audio before trigger — attack transients never lost
Start marker fix
ChoppaBug
Moving chop start no longer glitches playhead — preserves absolute sample position
Choppa v1.1.0 Build 8 submitted to App Store
Windows v1.0.0
Screensaver system
X1Shipped
4 screensavers ported from waveOS: sine drift, starfield, breathing pulse, dual wave interference. 5-min idle, auto-cycle, wake on input
"Screensavers? If it hasn't been touched for 5 mins, throw on a screensaver... even if audio is playing, but not during record. So like they can leave the looper on in the bg."
WaveLoop X1 Windows v1.0.0 — Release build uploaded to CDN. 14 days from idea to shipped product.
waveOS — The OS Experience
SD card borked, can't SSH — the recovery arc begins
"ok we gotta make the waveloop rasberry pi card happy again"
Linux dev machine
waveOSArchitecture
Ubuntu laptop declared as the waveOS development machine
"this laptop is going to be the one we are going to dev the waveos stuff with."
128GB card pivot
waveOSPivot
Switches to 128GB card for dev — overkill but pragmatic
"I have a 128gb card, but that seems ridonk overkill. lets use it to test"
Fresh start from zero
waveOSPivot
Gives up on old image, installs fresh Pi OS, near-zero rebuild
"didn't work. so i got a fresh pi os installed... we are starting from near zero."
Binary-only deploy
waveOSArchitecture
No source code on device, only compiled binaries — production rule
"when we build and deploy images, i don't want the code on the device, just the binary."
Fresh rebuild works
waveOSWin
Everything works on fresh Pi OS — suspects old imaging process was broken
"works perf. set it to autolaunch, save this state. my instinct is something went wrong during the image making process"
Display-agnostic
waveOSArchitecture
waveOS should accept any display and auto-detect resolution/rotation
"it should accept any kind of display, and use that display in it's full capacity"
Published waveOS image contained WiFi credentials
"lolll. umm disable the pi download on the site for now, it has my ssid and password lmao"
WiFi config UI
waveOSShipped
In-app WiFi selector — pick network, enter password, no SSH needed
"since this is meant to be a product, I wanted to give the user the ability to select their wifi in app."
WiFi selection working in-app with connection confirmation
"need some kind of connection confirmation, maybe the settings wifi row should show the ssid and a check or something. but yeah its great"
Tilde (~) key chosen for config — it looks like a wave
"tilde works, it's like a wave, on brand"
Boot splash vision
waveOSArchitecture
Wave animation during startup, replacing Linux boot text
"get this ready to ship to the world. One thing I want to do is get some kind of wave animation going during startup."
waveOS needs an OS-level experience, not just an app
"it's WAVEOS, so it needs to have an OS experience ya feel me"
SIGUSR1 handoff
waveOSShipped
Splash fades out, waveloop takes over via SIGUSR1 signal
"that sso sick. there were a couple lines of text on the screen during the intro... but that's fine for the first version."
Splash folder
waveOSArchitecture
Dedicated folder for splash programs — agents can contribute animations
"i want the agents to put this splash program somewhere that it will be picked up when we rebuild, basically we are gonna dream up a ton of them"
Screensavers (Pi)
waveOSShipped
Scope creep: screensavers on idle, 5 min timer, cycle every 5 min
"ok.. so just because i love scope creep. screensavers? if hasn't been touched for 5 mins, throw on a screen saver, cycles every 5 minutes"
Screensavers working on the Pi — immediate social media post
"fucking sexy my dude. ok do me a favour and reboot this. I am gonna do a social media post."
Plugin screensavers
waveOSArchitecture
User-installable .so screensaver plugins, future download marketplace
"is it possible for users to add their own screensavers? i would like to eventually have a place for people to download them on the site lol"
321 packages purged
waveOSShipped
Stripped gcc, LLVM, headers, firmware — 4.7GB to 3.4GB, kept Vulkan for future shaders
Burned card boots
waveOSWin
Spare card boots to app, crashes on record, reboots itself back — systemd restart works
"ohhh shit. it booted up to the app, everything worked, but then i started recording it and crashed."
Linux Desktop + v1.0.1
Ubuntu/Debian desktop version forked from waveOS codebase
"how far are we from an ubuntu / debian version of waveloop? if not far, make it happen"
Windows mirror/reference system (chew/eat/pop/flat/copy+extend/double) ported to Linux
MIDI auto-detect
X1Shipped
ALSA card/device enumeration, skips 'Midi Through' — MiniLab 3 found automatically
Landing pages were showing build-from-source for a private repo
"omg the pages should never show build from source instructions. my repo is private"
Free, not OSS
X1Architecture
waveOS and Linux builds are free but not open source
"ok so with waveos and linux it's not open source yet. just free"
waveos-v1.0.1
waveOSShipped
Optimized image: 118GB raw → 5.4GB shrunk → 654MB gzip. Down from 1.9GB v1.
Five parallel tasks during imaging — the chaos is the process
"omg im lost. doign 5 thigns"
waveOS v1.1 — UI Overhaul
4-band frequency analysis
waveOSShipped
Single-pole lowpass cascade: sub/bass/mid/hi band splitting in the audio thread — no FFT needed
Frequency visualizer
waveOSShipped
Color-coded band bars in bottom row: red sub, orange bass, cyan mid, white hi
Audio-reactive title
waveOSShipped
"waveloop" header glows from blue to white with output peak — the UI breathes with the audio
Bitmap font overhaul
waveOSShipped
Removed all TTF rendering from transport row — unified bitmap font at configurable scale (1-6x)
Text scale setting
waveOSShipped
Runtime-adjustable text multiplier in config panel — cycles 1-6x
Performance timer
waveOSShipped
Rolling H:MM:SS session timer at top right — matches Windows app
Responsive VU meters
waveOSShipped
Faster peak decay (0.992 vs 0.9995) — meters actually move with the music now
USB storage picker
waveOSShipped
Settings menu enumerates /proc/mounts for USB drives, creates waveloop-media/ folder, redirects WAV saves
Screenshot feedback loop
waveOSArchitecture
SIGUSR2 triggers framebuffer capture → BMP → SCP to dev machine. LLM agents can verify UI without human description
waveOS page keys fixed
waveOSBug
Web page keyboard table was entirely wrong — now matches actual Pi bindings
What's next
User-customizable webview UI layer — HTML/CSS/JS skins with a JS bridge API to the audio engine
OSC protocol
X1In Progress
Every product speaks OSC on configurable UDP — spec written, implementation next
Choppa App Store
ChoppaShipped
Choppa iOS live on App Store — $4.99
Paddle integration
BrandShipped
Paddle checkout live on waveloop.app/suite/ — $24 Suite purchase
Sales dashboard
BrandIn Progress
Unified Apple ASC + Paddle revenue dashboard in GroundControl
Windows FX port
X1In Progress
24-effect engine from waveOS → Windows X1 — currently stubs
Linux packaging
X1In Progress
WaveLoop X1 Linux — builds and runs, needs .deb / AppImage / tarball for distribution
Pi mirror backport
waveOSIn Progress
Mirror/reference system (chew/eat/pop/flat/copy+extend/double) needs porting back to waveOS
Video capture
waveOSIn Progress
ffmpeg pipe: raw frames + PCM audio → mp4 — record sessions from the Pi itself
USB media transfer
waveOSIn Progress
Two-way media folder on USB: save projects, share recordings, import audio
Splice integration
BrandIdea
Sample/loop marketplace tie-in for the WaveLoop ecosystem
WaveGlyph share
ChoppaIdea
WaveGlyph mobile share — phone-to-phone audio transfer
X4 arrangement mode → full song form from loops
Cauldron FX loop routing — creative effect chains on waveOS
WaveLoop X1 as a $100 Pi-based hardware kit — Pi Zero 2 W + Fe-Pi Audio Z V2
Shortwave radio
waveOSIdea
Lower sideband tuning artifacts as an effect preset
WaveLoop macOS on the App Store — currently notarized DMG direct only