Problem
When an uploaded MP3 is selected in the practice workspace, the app does not expose the same practice controls that YouTube gets. This breaks the core use case: quickly upload a track, slow it down, and work out a part.
This was hit in real use: the user needed to upload an MP3 quickly and slow it down, but the MP3 path felt clunky and the slowdown capability was missing.
Current behaviour
In frontend/next-app/src/components/studio/PracticeMedia.tsx:
- YouTube media renders
PlaybackSpeedControl and ABLoopControl.
- Uploaded audio renders
LocalAudioPlayer only.
In frontend/next-app/src/app/practice-timer/page.tsx, handleSpeedChange() already calls:
player.setPlaybackRate(speed) for YouTube
audioPlayerRef.current?.setPlaybackRate(speed) for local audio
So the audio player has some technical support, but the UI does not expose it for MP3 uploads.
Expected behaviour
Uploaded MP3s should behave like serious practice material:
- User can upload an MP3 and immediately slow it down.
- Speed control is visible for MP3/audio media, not just YouTube.
- Speed changes apply immediately to the uploaded audio.
- AB loop controls work for uploaded audio if supported by the current
LocalAudioPlayerHandle.
- The user can scrub, loop, and slow down without having to switch media modes or restart a session.
Acceptance criteria
Why this matters
The app should be useful in the moment of practice. If the user sits down needing to work out a track, MP3 upload + slowdown must be fast and obvious. This is core workflow, not polish.
Problem
When an uploaded MP3 is selected in the practice workspace, the app does not expose the same practice controls that YouTube gets. This breaks the core use case: quickly upload a track, slow it down, and work out a part.
This was hit in real use: the user needed to upload an MP3 quickly and slow it down, but the MP3 path felt clunky and the slowdown capability was missing.
Current behaviour
In
frontend/next-app/src/components/studio/PracticeMedia.tsx:PlaybackSpeedControlandABLoopControl.LocalAudioPlayeronly.In
frontend/next-app/src/app/practice-timer/page.tsx,handleSpeedChange()already calls:player.setPlaybackRate(speed)for YouTubeaudioPlayerRef.current?.setPlaybackRate(speed)for local audioSo the audio player has some technical support, but the UI does not expose it for MP3 uploads.
Expected behaviour
Uploaded MP3s should behave like serious practice material:
LocalAudioPlayerHandle.Acceptance criteria
PlaybackSpeedControl.ABLoopControlusing the existing audio loop controller path.LocalAudioPlayerimmediately.PracticeMediaso both YouTube and audio paths expose practice controls.Why this matters
The app should be useful in the moment of practice. If the user sits down needing to work out a track, MP3 upload + slowdown must be fast and obvious. This is core workflow, not polish.