V1.7 shipped real audio loops for the first time — actual recorded music instead of synthesized Web Audio oscillators. That was a big jump. V1.8 takes everything built in v1.7 and expands it: more genres, more loop options per genre, deeper BPM sync, and a full engine rebuild under the hood to make it all work cleanly together.
Here's what changed, why it changed, and what to try first.
V1.7 shipped with 7 genres drawing from a handful of single loops each. V1.8 restructures this entirely. Six genres, three loops each — 18 total combinations, with one selected randomly every session. Same genre, different feel every time you hit play.
The genre list was also reorganized. Percussion and Big Band Swing are out. Piano, Ambient, and Electro Wave are in. The lineup now:
| Genre | BPMs (Loop 1 / 2 / 3) | Character |
|---|---|---|
| Jazz | 100 / 100 / 129 | Walking bass, real horns, head arrangements |
| Orchestral | 115 / 135 / 120 | String sections, swelling dynamics, cinematic feel |
| Lo-Fi | 95 / 90 / 90 | Dusty drums, warm chords, background noise |
| Piano | 115 / 104 / 120 | Solo or light accompaniment, melodic, clean |
| Ambient | 108 / 105 / 120 | Wide pads, slow motion, minimal pulse |
| Electro Wave | 120 / 75 / 90 | Synth-driven, rhythmic, forward motion |
The core formula hasn't changed: BPM = WPM × 0.38. At 250 WPM you get roughly 95 BPM. At 400 WPM you're at 152 BPM. The music tempo always mirrors the reading tempo.
What's new in v1.8 is how that sync is applied to real audio files. Each loop has a native BPM — the tempo it was recorded at. The engine stores that BPM in a lookup table, then uses the Web Audio API's playbackRate to stretch or compress the audio in real time as you move the WPM slider. The music speeds up and slows down without pitch-shifting. It sounds natural because the underlying audio is real recordings, not synthesized tones.
"The rhythm anchors your attention the same way a metronome anchors a musician — except the tempo is set by how fast you read."
If a loop file isn't found — say you're running FlowRead locally without the audio folder — the engine silently falls back to the Web Audio synthesizer. You always get music. The experience degrades gracefully rather than breaking.
V1.7 introduced punctuation-aware reading delays. V1.8 adds one more rule: alphanumeric tokens — words like P90X, 401k, or Step3 — get a slight processing beat (1.1× base delay). These tokens don't read the same way regular words do, so they shouldn't pace the same way either.
The full pacing table, from longest pause to shortest:
| Pattern | Multiplier | Feel |
|---|---|---|
| … ellipsis | 3.2× | Long trailing thought |
| . ! ? | 2.8× | Full sentence breath |
| — : – | 2.0× | Strong pause, reveal |
| ; | 1.8× | Between comma and period |
| 10+ character words | 1.15× | Processing time |
| Alphanumeric tokens | 1.1× | Mixed character beat |
| , ) " ' | 1.4× | Short breath |
| ( opening quote | 1.2× | Anticipation |
| Hyphenated words | 0.9× | Linked, faster |
| Everything else | 1.0× | Base WPM pace |
The font size slider wasn't firing on mobile browsers — a known issue where touch events don't always trigger oninput. Fixed in v1.8 by adding ontouchmove and onchange events alongside it. The font size also now uses CSS clamp() so it scales proportionally to screen width before the slider is even touched.
The gold highlight letter — the Optimal Recognition Point — is now properly centered using a three-column flex layout. Text before it right-aligns to center. The ORP letter sits fixed at the midpoint. Text after it extends right. Short words and long words all anchor to the same spot. This is how the technique is supposed to work.
V1.8 is rebuilt on the same design system as spark1early.github.io — Bebas Neue, Instrument Sans, DM Mono, the same red/black/white palette, same border logic and spacing. FlowRead now feels like part of the site instead of a standalone tool bolted on.
V1.8 is in beta before the full site rollout. Try it, break it, and send feedback. What genres are you using most? What's the WPM you settle into? Any loops that feel off-tempo? The beta link is live in the repo now.
6 genres × 3 loops = 18 combinations, random per session. New genres: Piano, Ambient, Electro Wave. Removed: Percussion, Big Band Swing. BPM lookup table with live playbackRate sync. Alphanumeric pause added. Mobile font slider fixed. ORP centering rebuilt. Full theme sync with spark1early.github.io.
Replaced all synthesized instruments with real recorded loops. Jazz sounds like jazz. Lo-fi sounds like lo-fi. BPM sync via Web Audio API playbackRate. Pre-loads all genres after first play. 7 genres: Swing Jazz, Lo-Fi, Orchestral, Theta Ambient, Solo Piano, Big Band Swing, Percussion.
Returned to stateless Web Audio API after Tone.js rollback. Replaced random notes with fixed melodic sequences per genre. MELODIES, BASSLINES, and CHORDS tables. Theta Ambient fixed — faster attack so it's audible. Instant genre switching with no transport restart.
Attempted Tone.js for realistic synthesis — PolySynth piano, MembraneSynth drums, MetalSynth cymbals, Reverb/Chorus effects. Mobile AudioContext suspension caused music to stop on genre switch and WPM change. Rolled back to Web Audio.
New instrument-specific synth functions: piano(), bass(), brass(), pad(), drone(). Swing jazz hihat fix with proper triplet grid. Article page integration via ?article= URL parameter.
Expanded from 4 to 8 genres. Added Theta Ambient, Solo Piano, Big Band Swing, and Percussion. Freemium model confirmed.
Scrapped cross-origin site detection. Hardcoded all 7 site sections and Spark1Early theme directly. Deployed live at spark1early.github.io/tools/flowread.html.
Basic RSVP reader. BPM-synced generative music via Web Audio API. 4 genres: Jazz, Orchestral, Lo-Fi, Percussion. ORP highlighting. Punctuation-aware pacing. Single HTML file, zero dependencies.
V1.8 goes live to the main tools page once the beta feedback loop closes. Try the beta, use it on something real — an article, a chapter, something long — and see where the experience breaks down. That's what the beta is for.
— Spark1Early · Boston, MA · 2026