Soundless Beatbox

A playful rhythm-composition SPA where users build beat patterns using a grid-based step sequencer with visual “instruments” (kick, snare, hat, clap) and optional Web Audio playback. Create multiple looping patterns, adjust tempo/swing, and export/share a compact text code that recreates the beat (also saved to localStorage). The UI is split into clear components: sequencer grid, transport controls, instrument panel, pattern library, and share/export modal.

To Do30
Scaffold app

Run: npm create vite@latest . -- --template react-ts && npm i && npm i -D tailwindcss postcss autoprefixer && npx tailwindcss init -p && npm i class-variance-authority clsx tailwind-merge lucide-react && npx shadcn@latest init.

by system

Add Tailwind config

Configure tailwind.config.ts and src/index.css with Tailwind layers and shadcn color variables.

by system

Add shadcn utilities

Create src/lib/utils.ts with cn() helper for Tailwind class merging.

by system

Create app layout

Implement src/App.tsx with the main split layout regions (grid, controls, panel, library).

by system

Add base styling shell

Create src/components/AppShell.tsx to provide page padding, max-width, and section framing.

by system

Define domain types

Create src/types/sequencer.ts defining InstrumentId, StepState, Pattern, and ProjectState types.

by system

Default instruments list

Create src/data/instruments.ts exporting kick/snare/hat/clap metadata (name, color, icon).

by system

Create state store

Create src/state/useSequencerStore.ts using React context + reducer to hold patterns, transport, and settings.

by system

Add state provider

Create src/state/SequencerProvider.tsx to expose store and actions to the app.

by system

Hook up provider

Wrap App in src/main.tsx with SequencerProvider.

by system

Build sequencer grid

Create src/components/SequencerGrid.tsx rendering instrument rows and 16-step columns.

by system

Grid step cell

Create src/components/StepCell.tsx as a clickable toggle button with active/hover styles.

by system

Grid row header

Create src/components/InstrumentRowHeader.tsx showing instrument icon/name and row color.

by system

Toggle step action

Add reducer action to toggle a cell (instrumentId, stepIndex) in useSequencerStore.ts.

by system

Playhead highlighting

Add playhead index to state and highlight current column in SequencerGrid.tsx.

by system

Transport controls UI

Create src/components/TransportControls.tsx with play/pause, stop, and current pattern label.

by system

Tempo control

Create src/components/TempoControl.tsx using a slider/input to edit BPM in state.

by system

Swing control

Create src/components/SwingControl.tsx using a slider to edit swing percentage in state.

by system

Playback scheduler

Create src/audio/scheduler.ts implementing a timer-driven step clock (no audio yet) that advances playhead.

by system

Wire transport to clock

Connect TransportControls actions to start/stop the scheduler and update playhead in store.

by system

Web Audio engine

Create src/audio/engine.ts with simple synthesized drum sounds for kick/snare/hat/clap via Web Audio.

by system

Trigger audio on steps

On each scheduler tick, trigger engine.ts sounds for active steps of the current pattern.

by system

Instrument panel UI

Create src/components/InstrumentPanel.tsx to display instruments and per-instrument mute toggles.

by system

Mute instrument logic

Add per-instrument mute state and reducer actions to useSequencerStore.ts.

by system

Pattern library UI

Create src/components/PatternLibrary.tsx listing patterns with select, add, duplicate, and delete buttons.

by system

Pattern CRUD actions

Implement reducer actions for add/select/rename/duplicate/delete patterns in useSequencerStore.ts.

by system

Share code codec

Create src/share/codec.ts to encode/decode the full project state into a compact URL-safe text code.

by system

Share modal UI

Create src/components/ShareModal.tsx (shadcn Dialog) showing export code, copy button, and import field.

by system

LocalStorage persistence

Create src/state/persistence.ts to save/load project state to localStorage and hydrate on startup.

by system

Import export wiring

Wire ShareModal to codec.ts and store actions so importing code replaces state and exporting reflects current state.

by system

In Progress0
In Review0
Done0