Beat Bento

A playful micro music studio where users build short loops by dragging “sound tiles” (kick, snare, hat, bass, synth) into a 16-step grid and hitting play. The app includes a tiny mixer (mute/solo/volume per track), tempo control, and a randomizer that generates new grooves with one click. Loops can be saved as named presets in localStorage and shared via a compact export/import text code.

To Do30
Scaffold Vite + Tailwind

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 styles

Configure tailwind.config and src/index.css with Tailwind directives and a minimal app theme.

by system

Set up routing

Add React Router and define routes for Studio and Presets pages in a single router file.

by system

Create app layout

Build a responsive AppLayout component with header, main, and footer slots.

by system

Add header nav

Implement a Header component with app title and navigation links.

by system

Define audio types

Create a types module for Track, Step, Pattern, Preset, and ExportCode shapes.

by system

Seed default tracks

Add a constants module that defines the 5 default tracks (kick/snare/hat/bass/synth).

by system

Audio engine hook

Implement a useAudioEngine hook using Web Audio API to schedule 16-step playback at a given BPM.

by system

Create sound generators

Implement simple synth/drum sound functions (kick/snare/hat/bass/synth) using oscillators/noise/envelopes.

by system

Global studio store

Create a small state store hook (useReducer) for BPM, playing, currentStep, pattern grid, and mixer settings.

by system

Transport controls UI

Build Play/Stop and current step indicator component wired to the studio store.

by system

Tempo control UI

Create a BPM slider/input component that updates the store and reconfigures playback.

by system

Step grid component

Render a 5x16 grid component with clickable steps to toggle on/off per track.

by system

Grid playhead highlight

Add visual playhead highlighting for the active step column based on currentStep.

by system

Sound tile palette

Create a tile palette component listing draggable tiles for each track sound.

by system

Enable drag to grid

Implement HTML5 drag/drop so dragging a tile onto a grid cell turns that step on for that track.

by system

Drag preview styling

Add minimal visual feedback for drag-over cells and active drop targets.

by system

Mixer strip component

Build a MixerStrip component with volume slider and Mute/Solo toggles for one track.

by system

Mixer panel layout

Render a MixerPanel that lists one MixerStrip per track in a compact layout.

by system

Apply mute/solo logic

Implement solo priority and mute behavior in the audio engine scheduling.

by system

Apply volume scaling

Route each track through a GainNode and apply per-track volume from the mixer state.

by system

Randomizer action

Implement a randomizePattern function that generates musical-ish probabilities per track.

by system

Randomizer UI button

Add a Randomize button component that dispatches the randomize action.

by system

Preset model helpers

Create helper functions to serialize/deserialize presets and validate schema.

by system

LocalStorage preset service

Implement a presets storage module (list/add/update/delete) backed by localStorage.

by system

Save preset dialog

Add a SavePresetDialog (shadcn/ui) to name and save the current loop to localStorage.

by system

Presets page list

Create a PresetsPage that lists saved presets with load and delete actions.

by system

Export/import code

Implement compact export/import code functions (base64 JSON + version prefix) for patterns and mixer/BPM.

by system

Export/import modal

Add an ExportImportModal to copy an export code and paste an import code to load a loop.

by system

Studio page compose

Create the StudioPage that composes transport, tempo, tiles, grid, mixer, randomizer, and save/export UI.

by system

In Progress0
In Review0
Done0