Soundless Synth

A playful browser-based "silent music" sequencer that lets users compose looping patterns using shapes and colors instead of audio, generating animated visual rhythms on a grid. Users can place, move, and toggle steps, assign each track a visual instrument (shape, color, motion style), control tempo/loop length, and export/share compositions as a compact JSON string or PNG snapshot. Everything runs client-side with localStorage saves, plus a small gallery of preset patterns to remix.

To Do30
Scaffold app stack

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 globals

Create/replace src/index.css with Tailwind directives and basic CSS variables for shadcn/ui theme.

by system

Setup app layout shell

Implement src/App.tsx with a header/main layout and placeholder panels for grid, controls, and presets.

by system

Add router-less view

Create src/pages/SequencerPage.tsx and render it from App as the single SPA page.

by system

Define core types

Create src/lib/types.ts defining Pattern, Track, Step, InstrumentStyle, and ExportPayload types.

by system

Seed preset patterns

Create src/lib/presets.ts exporting a small array of preset Pattern objects.

by system

LocalStorage utilities

Create src/lib/storage.ts with load/save helpers (with versioning) for the current Pattern.

by system

Pattern serialization

Create src/lib/codec.ts to encode/decode patterns to a compact JSON string for share/export.

by system

Pattern reducer logic

Create src/state/patternReducer.ts with actions for toggleStep, moveStep, setTempo, setLoopLength, setTrackInstrument, and loadPattern.

by system

Pattern context provider

Create src/state/PatternProvider.tsx providing state/dispatch and persisting to localStorage on changes.

by system

Playback clock hook

Create src/hooks/usePlaybackClock.ts to tick the current step using requestAnimationFrame with BPM and loop length.

by system

Transport controls UI

Create src/components/TransportControls.tsx with play/pause, stop, and current-step display.

by system

Tempo control UI

Create src/components/TempoControl.tsx using shadcn Slider/Input to set BPM.

by system

Loop length control UI

Create src/components/LoopLengthControl.tsx with a select/slider to set steps per loop.

by system

Track list panel

Create src/components/TrackList.tsx rendering track rows with name and instrument preview.

by system

Instrument picker UI

Create src/components/InstrumentPicker.tsx to choose shape, color, and motion style for a track.

by system

Grid rendering component

Create src/components/SequencerGrid.tsx to render a tracks x steps grid with clickable cells.

by system

Grid cell component

Create src/components/GridCell.tsx handling visual active/inactive states and click-to-toggle.

by system

Playhead overlay

Create src/components/Playhead.tsx that highlights the current column based on playback step.

by system

Visual instrument renderer

Create src/components/InstrumentGlyph.tsx that draws shape/color variants (circle/square/triangle) for active steps.

by system

Motion style CSS

Create src/styles/motion.css defining Tailwind-friendly keyframes/classes for pulse, bounce, rotate, and shimmer.

by system

Apply motion to glyph

Update InstrumentGlyph to apply motion classes based on track motion style and playhead hits.

by system

Drag step move UX

Enhance SequencerGrid to support click-drag moving an active step within the same track.

by system

Pattern reset action

Create src/components/ResetPatternButton.tsx to confirm and reset to an empty pattern.

by system

Preset gallery panel

Create src/components/PresetGallery.tsx listing presets with preview and one-click load.

by system

Preset preview thumbnail

Create src/components/PresetThumbnail.tsx rendering a tiny read-only mini-grid preview.

by system

Share/export dialog UI

Create src/components/ExportDialog.tsx with tabs for JSON string and PNG snapshot actions.

by system

Copy share string action

Implement src/lib/clipboard.ts to copy the encoded JSON string to clipboard with fallback.

by system

Import share string UI

Create src/components/ImportDialog.tsx to paste a JSON string, decode it, validate, and load the pattern.

by system

PNG snapshot export

Create src/lib/snapshot.ts to rasterize the grid DOM to a PNG using SVG foreignObject/canvas and trigger download.

by system

In Progress0
In Review0
Done0