'use client';
import { Card, CardContent } from '@/components/ui/card';
import { Button } from '@/components/ui/button';
import {
Select,
SelectContent,
SelectItem,
SelectTrigger,
SelectValue,
} from '@/components/ui/select';
import { Slider } from '@/components/ui/slider';
import { Label } from '@/components/ui/label';
import { LayerBox } from './LayerBox';
import { Visualizer } from './Visualizer';
import { useAudioEngine } from '@/hooks/useAudioEngine';
import {
Play,
Pause,
Shuffle,
Drum,
Music,
Cloud,
Guitar,
Waves,
Piano,
} from 'lucide-react';
import { Genre, GENRE_CONFIG, INSTRUMENT_OPTIONS } from '@/types/audio';
export function LofiGenerator() {
const {
state,
currentStep,
togglePlayback,
generateNewBeat,
setMasterVolume,
setLayerVolume,
toggleMute,
setGenre,
setDuration,
setInstrument,
setBpm,
setSwing,
} = useAudioEngine();
const genres: { value: Genre; label: string }[] = [
{ value: 'hiphop', label: 'Hip Hop' },
{ value: 'classical', label: 'Classical' },
{ value: 'trap', label: 'Trap' },
{ value: 'pop', label: 'Pop' },
];
return (
{/* Modern Header */}
{/* Top Controls: Duration & Genre */}
setDuration(v)}
min={1}
max={10}
step={1}
className="flex-1"
/>
{state.duration} min
{/* Transport Controls */}
{/* Visualizer */}
{/* Master Controls */}
{Math.round(state.volumes.master * 100)}%
setMasterVolume(v)}
min={0}
max={1}
step={0.01}
/>
{state.bpm}
setBpm(v)}
min={60}
max={180}
step={1}
/>
{Math.round(state.swing * 100)}%
setSwing(v)}
min={0}
max={0.5}
step={0.01}
/>
{/* Instrument Layers */}
Instruments
}
volume={state.volumes.drums}
muted={state.muted.drums}
instrument={state.instruments.drums}
instrumentOptions={INSTRUMENT_OPTIONS.drums}
onVolumeChange={(v) => setLayerVolume('drums', v)}
onToggleMute={() => toggleMute('drums')}
onInstrumentChange={(v) => setInstrument('drums', v)}
accentColor="orange"
/>
}
volume={state.volumes.bass}
muted={state.muted.bass}
instrument={state.instruments.bass}
instrumentOptions={INSTRUMENT_OPTIONS.bass}
onVolumeChange={(v) => setLayerVolume('bass', v)}
onToggleMute={() => toggleMute('bass')}
onInstrumentChange={(v) => setInstrument('bass', v)}
accentColor="blue"
/>
}
volume={state.volumes.piano}
muted={state.muted.piano}
instrument={state.instruments.piano}
instrumentOptions={INSTRUMENT_OPTIONS.piano}
onVolumeChange={(v) => setLayerVolume('piano', v)}
onToggleMute={() => toggleMute('piano')}
onInstrumentChange={(v) => setInstrument('piano', v)}
accentColor="green"
/>
}
volume={state.volumes.brass}
muted={state.muted.brass}
instrument={state.instruments.brass}
instrumentOptions={INSTRUMENT_OPTIONS.brass}
onVolumeChange={(v) => setLayerVolume('brass', v)}
onToggleMute={() => toggleMute('brass')}
onInstrumentChange={(v) => setInstrument('brass', v)}
accentColor="yellow"
/>
}
volume={state.volumes.chords}
muted={state.muted.chords}
instrument={state.instruments.chords}
instrumentOptions={INSTRUMENT_OPTIONS.chords}
onVolumeChange={(v) => setLayerVolume('chords', v)}
onToggleMute={() => toggleMute('chords')}
onInstrumentChange={(v) => setInstrument('chords', v)}
accentColor="pink"
/>
}
volume={state.volumes.ambient}
muted={state.muted.ambient}
instrument={state.instruments.ambient}
instrumentOptions={INSTRUMENT_OPTIONS.ambient}
onVolumeChange={(v) => setLayerVolume('ambient', v)}
onToggleMute={() => toggleMute('ambient')}
onInstrumentChange={(v) => setInstrument('ambient', v)}
accentColor="purple"
/>
{/* Footer */}
Click play to initialize audio engine • Genre: {GENRE_CONFIG[state.genre].name}
);
}