A powerful open source Chrome extension built with React that provides real-time audio effects for web audio/video and connects to MIDI controllers for hands-on control.
Download it here from the Chrome Web Store.
- ποΈ Real-time Audio Effects: Apply reverb, distortion, and filters to any audio/video on web pages
- πΉ MIDI Controller Support: Connect your MIDI keyboard/controller for hands-on control
- π MIDI Learn Mode: Click any control and move a MIDI knob/slider to create instant mappings
- πΎ Persistent Settings: All effect parameters and MIDI mappings are automatically saved
- π Per-Domain MIDI Permissions: MIDI access permissions are remembered per website
- π Auto-Restore: MIDI controllers and mappings automatically reconnect when revisiting pages
- π·οΈ Visual MIDI Links: See which controls are linked with removable chips
- β‘ Modern React UI: Beautiful, responsive popup interface built with React and TypeScript
- π Hot Module Replacement: Lightning-fast development with Vite and CRXJS
- π± Content Script Integration: Seamless integration with web pages through content scripts
- Node.js (v16 or higher)
- npm or yarn
- Chrome browser
- Clone the repository:
git clone https://github.com/JulienMeziere/sound-tools.git
cd sound-tools- Install dependencies:
npm install- Start development server:
npm run dev- Load the extension in Chrome:
- Open Chrome and go to
chrome://extensions/ - Enable "Developer mode" in the top right
- Click "Load unpacked" and select the
distfolder
- Open Chrome and go to
npm run dev- Start development server with hot reloadnpm run build- Build for productionnpm run preview- Preview production buildnpm run type-check- Run TypeScript type checkingnpm run lint:check- Check code formatting and lintingnpm run lint:fix- Fix code formatting and linting issues
src/
βββ ParameterStore/ # Centralized parameter management
β βββ BaseParameterStore.ts # Base parameter store class
β βββ ContentParameterStore.ts # Content script parameter store
β βββ PopupParameterStore.ts # Popup parameter store
βββ content/ # Content scripts
β βββ content.ts # Main content script entry point
β βββ content.css # Content script styles
β βββ ContentScriptManager.ts # Content script orchestrator
β βββ audio/ # Audio processing
β β βββ AudioEffect.ts # Base effect interface & class
β β βββ AudioProcessor.ts # Audio chain management
β β βββ effects/ # Individual effect implementations
β β βββ ReverbEffect.ts
β β βββ DistortionEffect.ts
β β βββ FilterEffect.ts
β βββ notifications/ # Notification system
β βββ NotificationManager.ts # Toast notifications
βββ midi/ # MIDI controller integration
β βββ MidiController.ts # MIDI device & mapping management
βββ storage/ # Chrome storage management
β βββ MidiStorageManager.ts # MIDI state & permissions storage
βββ logger/ # Logging system
β βββ index.ts # Logger with dev/prod modes
βββ ui/ # React UI components
β βββ components/ # React components
β β βββ Popup.tsx # Main popup container
β β βββ Header.tsx # App header component
β β βββ AudioEffect/ # Audio effect components
β β β βββ index.tsx # Effects grid container
β β β βββ EffectRow.tsx # Individual effect row
β β β βββ EffectButton.tsx # Effect toggle button
β β β βββ Slider.tsx # Parameter slider
β β β βββ MidiLinkChip.tsx # MIDI link indicator
β β β βββ SettingsButton.tsx # Settings toggle
β β βββ Midi/ # MIDI components
β β βββ index.tsx # MIDI controller container
β β βββ MidiRow.tsx # MIDI connection row
β β βββ MidiButton.tsx # MIDI action button
β βββ hooks/ # Custom React hooks
β β βββ useSoundTools.ts # Audio effects logic
β β βββ useMidiController.ts # MIDI controller logic
β βββ popup/ # Popup entry point
β βββ popup.html # Popup HTML template
β βββ popup.tsx # Popup React entry point
β βββ popup.css # Popup styles
The extension uses the Web Audio API to create real-time audio effects:
- Reverb: Convolution reverb using impulse responses
- Distortion: Waveshaper-based distortion
- Filter: Biquad filters (lowpass, highpass, etc.)
- Device Connection: Uses the Web MIDI API to connect to MIDI controllers
- Learn Mode: Click "Learn" button, then click any UI control and move a MIDI knob/slider to create mappings
- Flexible Mappings: Support for both MIDI notes and CC messages with one-to-many and many-to-one relationships
- Visual Feedback: MIDI link chips show which controls are mapped and allow easy removal
- Persistent Storage: All MIDI mappings are saved per device and automatically restored
- Per-Domain Permissions: MIDI access permissions are remembered for each website
- Auto-Reconnect: Controllers and mappings automatically restore when revisiting pages
- Popup: React-based UI with real-time parameter control and MIDI learning
- Content Script: Injected into web pages to process audio and handle MIDI events
- Parameter Store: Cross-context parameter synchronization between popup and content script
- Storage Manager: Persistent storage for MIDI mappings, device configurations, and permissions
- Message Passing: Chrome extension messaging for real-time UI updates and MIDI events
- Open the Extension: Click the Sound Tools icon in your browser toolbar
- Enable Effects: Toggle any effect (Reverb, Distortion, Filter) on or off
- Adjust Parameters: Use the sliders to fine-tune effect settings
- Real-time Processing: Effects are applied instantly to any audio/video on the page
- Connect Your MIDI Controller: Plug in your MIDI keyboard, control surface, or DJ controller
- Request MIDI Access: Click "Request MIDI Access" in the extension popup
- Select Your Device: Choose your MIDI controller from the available devices list
- Enter Learn Mode: Click the "Learn" button to start creating MIDI mappings
- Activate Learn Mode: Click "Learn" - the button will show "Learning..."
- Select a Control: Click any effect button or parameter slider in the UI
- Move MIDI Control: Turn a knob, move a slider, or press a key on your MIDI controller
- Mapping Created: A chip will appear showing the MIDI link (e.g., "CC64", "Note C4")
- Remove Mappings: Click the "Γ" on any chip to remove that MIDI link
- Multiple Mappings: One MIDI control can control multiple UI elements
- Multiple Controls: One UI element can be controlled by multiple MIDI controls
- Persistent Storage: All mappings are automatically saved per device
- Auto-Restore: Mappings automatically restore when you reconnect the same device
- Per-Domain Permissions: MIDI access is remembered separately for each website
- β Chrome: Full support (Manifest V3)
- π Firefox: Planned support (will require Manifest V2 adaptation)
- β Safari: Under consideration
- β Edge: Full support (Chromium-based)
- React 18 - UI framework
- TypeScript - Type safety
- Vite - Build tool and dev server
- CRXJS - Chrome extension build tooling
- Web Audio API - Audio processing
- Web MIDI API - MIDI controller support
- Chrome Extensions API - Browser integration
This is an open source project and contributions are welcome! π
- Fork the repository
- Create a feature branch:
git checkout -b feature/amazing-feature - Commit your changes:
git commit -m 'Add amazing feature' - Push to the branch:
git push origin feature/amazing-feature - Open a Pull Request
- π Bug Reports: Found an issue? Open an issue on GitHub
- π‘ Feature Requests: Have an idea? We'd love to hear it
- π§ Code Contributions: Fix bugs, add features, improve documentation
- π΅ Audio Effects: Add new audio effects or improve existing ones
- πΉ MIDI Features: Enhance MIDI controller support
- π Documentation: Help improve the README, add tutorials, or write guides
This project is licensed under the Apache License 2.0 - see the LICENSE file for details.
- β MIDI learn functionality - Implemented with visual feedback and persistent storage
- β Persistent parameter storage - All settings automatically saved and restored
- β Per-domain MIDI permissions - MIDI access remembered per website
- β Auto-restore MIDI state - Controllers and mappings automatically reconnect
- Firefox extension support (Manifest V2 adaptation)
- More audio effects (delay, chorus, phaser, flanger, pitch shift)
- Visual audio analyzer with real-time frequency display
- Preset management system for saving/loading effect configurations
- Audio recording capabilities with effect processing
- Advanced MIDI features (velocity sensitivity, aftertouch, pitch bend)
- Keyboard shortcuts for quick effect toggling