@waveform-playlist/browser
The browser package is the main entry point for using Waveform Playlist in web applications. It provides a complete React-based solution with components, hooks, and effects for building multitrack audio editors.Installation
Peer Dependencies
React 18.2.0+ or 19.0.0+
React DOM 18.2.0+ or 19.0.0+
Styled Components 6.0.0+
DnD Kit 6.0.0+ for drag-and-drop functionality
DnD Kit modifiers 9.0.0+
Tone.js 15.0.0+ for audio playback
Optional Peer Dependencies
Add annotation support (optional)
Add recording capabilities (optional)
Package Contents
This package bundles and re-exports functionality from multiple packages:@waveform-playlist/core- Core types and utilities@waveform-playlist/engine- Audio playback engine@waveform-playlist/loaders- Audio file loaders@waveform-playlist/media-element-playout- HTML5 Audio playback@waveform-playlist/playout- Tone.js playback adapter@waveform-playlist/ui-components- Base React components
Main Exports
Providers
Main provider for Tone.js-based multitrack playback with full editing capabilities
Alternative provider for single-track playback using HTML5 Audio with playback rate control
Provider for optional annotation support
Provider for optional spectrogram visualization
React Hooks
Playlist State & Controls
| Hook | Description |
|---|---|
usePlaybackAnimation() | Access current playback time with 60fps updates |
usePlaylistState() | Access playback state (isPlaying, duration, etc.) |
usePlaylistControls() | Control functions (play, pause, stop, seek, etc.) |
usePlaylistData() | Track data and loading state |
useMediaElementAnimation() | Playback animation for MediaElement provider |
useMediaElementState() | State for MediaElement provider |
useMediaElementControls() | Controls for MediaElement provider |
useMediaElementData() | Data for MediaElement provider |
Audio Loading & Management
| Hook | Description |
|---|---|
useAudioTracks() | Load audio files from URLs with AbortController cleanup |
useDynamicTracks() | Runtime track addition with placeholder-then-replace pattern |
User Interaction
| Hook | Description |
|---|---|
useClipDragHandlers() | Drag-to-move and boundary trimming for clips |
useAnnotationDragHandlers() | Drag handlers for annotations |
useAnnotationKeyboardControls() | Annotation navigation, editing, and auto-scroll |
useDragSensors() | Drag sensors configuration for @dnd-kit |
useClipSplitting() | Split clips at playhead position |
useKeyboardShortcuts() | Flexible keyboard shortcut system |
usePlaybackShortcuts() | Default playback shortcuts (Space, 0, Arrow keys) |
Audio Effects
| Hook | Description |
|---|---|
useDynamicEffects() | Master effects chain with 20 Tone.js effects |
useTrackDynamicEffects() | Per-track effects management |
State Management
| Hook | Description |
|---|---|
useSelectionState() | Selection state (start/end) with engine delegation |
useLoopState() | Loop state (enabled, start, end) with engine delegation |
useSelectedTrack() | Selected track ID with engine delegation |
useZoomControls() | Zoom state (samplesPerPixel, canZoomIn/Out) |
useMasterVolume() | Master volume control (0.0-1.0) |
useMasterAnalyser() | Real-time audio analysis |
useTimeFormat() | Time format state (seconds, hh:mm:ss, samples) |
useExportWav() | Export mixed audio as WAV file |
UI Components
Playback Controls
| Component | Description |
|---|---|
PlayButton | Play button |
PauseButton | Pause button |
StopButton | Stop button |
RewindButton | Skip backward |
FastForwardButton | Skip forward |
SkipBackwardButton | Skip backward by interval |
SkipForwardButton | Skip forward by interval |
Editing Controls
| Component | Description |
|---|---|
LoopButton | Toggle loop mode |
SetLoopRegionButton | Set loop region from selection |
ZoomInButton | Zoom in |
ZoomOutButton | Zoom out |
ExportWavButton | Export mixed audio as WAV |
Display Components
| Component | Description |
|---|---|
AudioPosition | Current playback time display |
SelectionTimeInputs | Editable selection start/end inputs |
MasterVolumeControl | Master volume slider |
TimeFormatSelect | Time format selector dropdown |
Settings
| Component | Description |
|---|---|
AutomaticScrollCheckbox | Toggle auto-scroll during playback |
ContinuousPlayCheckbox | Toggle continuous play for annotations |
LinkEndpointsCheckbox | Link annotation endpoints |
EditableCheckbox | Toggle annotation editing |
DownloadAnnotationsButton | Download annotations as JSON/Aeneas |
Visualization
| Component | Description |
|---|---|
Waveform | Single track waveform visualization |
MediaElementWaveform | Waveform for MediaElement provider |
MediaElementPlaylist | Complete playlist UI for MediaElement |
MediaElementAnnotationList | Annotations for MediaElement |
PlaylistVisualization | Complete multitrack playlist UI |
PlaylistAnnotationList | Annotations for multitrack playlist |
Audio Effects
Effect Definitions
Array of 20 Tone.js effect definitions organized by category
Categories: Reverb, Delay, Modulation, Filter, Distortion, Dynamics, Spatial
Get effect definition by ID
Get effects grouped by category
Effect Factory
Create Tone.js effect instance from definition
Create series-chained effect graph
Utilities
Waveform Data Loading
| Function | Description |
|---|---|
loadWaveformData(url) | Load pre-computed peaks from waveform-data.js format |
waveformDataToPeaks(waveformData) | Convert WaveformData to peaks array |
loadPeaksFromWaveformData(waveformData, options) | Extract peaks for specific zoom level |
getWaveformDataMetadata(waveformData) | Get sample rate, duration, channels |
Re-exported Types
For convenience, this package re-exports common types:Usage Example
Key Architectural Patterns
Context-Based Architecture
The browser package uses React Context to manage state and provide hooks. All audio state lives in the provider, and hooks access it via context.Engine State Subscription
Engine-owned state (selection, loop, zoom, volume) uses a subscription pattern:- Engine owns state and emits
statechangeevents - Hooks mirror state into React via
onEngineState()callbacks - Changes are seeded back to engine when it’s rebuilt
Smooth Playback Animation
Playback usesrequestAnimationFrame with direct DOM manipulation to achieve 60fps updates without React re-renders:
getPlaybackTime()reads fromTransport.secondsfor audio sync- No
setStatein animation loop - Perfect sync with Tone.js Transport loop boundaries
Web Worker Peak Generation
WaveformData is generated in a web worker at load time, then resample() provides near-instant zoom changes. This keeps the UI responsive even with large audio files.
Related Packages
- Core - Core types and utilities
- UI Components - Base React components
- Playout - Tone.js playback engine
- Annotations - Annotation support (optional)
- Recording - Recording capabilities (optional)