Inspiration
Streamers constantly lose their VODs and risk strikes for playing copyrighted music. Silence kills energy. We wanted to solve both problems: give every stream a live, original soundtrack that the audience actually creates together.
What it does
Chorus turns Twitch chat into a live band. Every message plays a synthesized note snapped to the C major pentatonic scale on a 120 BPM grid, so a hundred people typing at once always sound musical. Each chatter gets a consistent instrument and color. Commands like !drum kick, !drum snare, and !drum hat let viewers play percussion. Follows trigger a bell arpeggio. Raids trigger a fanfare. A transparent OBS browser-source overlay shows notes falling with chatter names in their colors. The streamer controls everything from a dashboard: tempo, volume, per-instrument mute, and a panic stop. Everything is synthesized with Web Audio oscillators, no samples, no copyright risk.
How we built it
Node.js and TypeScript. Twitch EventSub over WebSocket for real-time chat, follows, and raids — with session reconnect, keepalive, and duplicate message handling. A pure deterministic music engine with a 16th-note quantizer and scale snapper (4 Vitest unit tests, all passing). Timestamped note events fan out over WebSocket to the overlay, which schedules audio on the Web Audio clock with a lookahead scheduler. Built with OpenAI Codex CLI in a single session.
Challenges
Getting the Twitch OAuth flow and EventSub WebSocket reconnect logic right under time pressure. Scheduling Web Audio precisely against the BPM grid so notes land on the beat regardless of network jitter.
Accomplishments
A fully working, DMCA-safe live band that runs in OBS in minutes. Real Twitch chat producing real music in under a second of latency. 4 unit tests passing.
What's next
Vibe voting (!vibe chill|hype|spooky), solo spotlight for one viewer per phrase, and a !hits export that renders the last 30 seconds as a downloadable WAV clip.
Built With
- api
- audio
- eventsub
- express.js
- node.js
- openai
- twitch
- typescript
- vitest
- web
Log in or sign up for Devpost to join the conversation.