A powerful, offline audio editing application built with React and Electron
Features β’ Installation β’ Usage β’ Contributing
Vocal Deck is a professional-grade desktop audio editor that combines the power of React with Electron to deliver a seamless offline editing experience. Perfect for podcasters, musicians, content creators, and audio enthusiasts who need precise control over their audio files.
β¨ Non-destructive editing with unlimited undo/redo
π¨ Beautiful dark/light themed UI
π Real-time waveform visualization
β‘ Offline processing - no internet required
ποΈ Professional audio effects and EQ controls
πΎ Export to WAV or MP3 formats
- Multi-format support: Load WAV, MP3, and other audio formats
- Drag & drop interface: Easy file loading from anywhere
- File history: Access recently recorded and edited files
- Smart saving: Automatic file versioning to prevent overwrites
- Real-time preview: Powered by
wavesurfer.js - Interactive timeline: Precise time markers and navigation
- Cursor dragging: Click and drag to scrub through audio
- Responsive design: Adapts to dark/light themes
- Basic trim: Remove audio from start or end
- Supports milliseconds, seconds, minutes, and hours
- Left or right direction trimming
- Advanced trim: Remove any section precisely
- Format:
hh:mm:ss.ms(e.g.,00:01:30.500) - Cut out unwanted sections while keeping the rest
- Millisecond precision for professional edits
- Format:
Adjust audio characteristics with real-time preview:
- Playback Speed: 0.5x β 2.0x (slow down or speed up)
- Bass Boost: -10dB β +10dB (enhance or reduce low frequencies)
- Pitch Shift: -12 β +12 semitones (change pitch without affecting speed)
One-click audio effects for creative transformation:
| Effect | Description | Effect | Description |
|---|---|---|---|
| π€ Robot | Mechanical voice | π½ Alien | Extraterrestrial speech |
| πΏοΈ Chipmunk | High-pitched, fast | π Helium | Squeaky, light voice |
| π¦ Deep Bass | Low, powerful tone | π Demon | Dark, ominous voice |
| π Echo Chamber | Spacious reverb | π Underwater | Muffled, submerged |
| π Telephone | Lo-fi, band-limited | βͺ Cathedral | Large reverb space |
| π€« Whisper | Quiet, airy voice | πΈ Distorted | Overdriven guitar-like |
| π’ Megaphone | Compressed, loud | π€ Cyborg | Futuristic hybrid |
| πΌ Old Tape | Vintage, degraded |
- Unlimited history: Every edit is tracked
- Non-destructive workflow: Safely experiment with effects
- Smart state management: Consistent across all editing operations
- Visual feedback: Buttons enable/disable based on history
- Direct recording: Record audio straight into the editor
- One-click save: Instantly start editing your recordings
- Automatic storage: Files saved to local VocalDeckData folder
- WAV format: Lossless, high-quality audio
- MP3 format: Compressed, smaller file size (requires FFmpeg)
- Smart naming: Automatic version suffixes prevent overwrites
- Quick access: Files saved to organized folders
Before you begin, ensure you have the following installed:
-
Clone the repository
git clone https://github.com/Nayan993/VocalDeck.git cd VocalDeck -
Install dependencies
npm install
-
Run in development mode
# Terminal 1: Start React dev server npm start # Terminal 2: Start Electron wrapper npm run electron-dev
-
Build for production
npm run build npm run electron
To enable MP3 export, install FFmpeg:
Windows:
npm install ffmpeg-staticmacOS:
brew install ffmpegLinux:
sudo apt-get install ffmpegMethod 1: Drag & Drop
- Drag any audio file directly into the center upload area
Method 2: Browse Files
- Click the "Browse" button and select your audio file
Method 3: Load from History
- Click on any file from the "Recorded Files" or "Updated Files" sidebar
- Select trim direction (Left or Right)
- Choose trim unit (milliseconds, seconds, minutes, hours)
- Enter the amount to trim
- Click Trim to apply
Example: Remove first 5 seconds
- Direction: Left
- Unit: Seconds
- Amount: 5
- Enter start time in format
hh:mm:ss.ms - Enter end time in the same format
- Click Apply to remove the section between start and end
Example: Remove 10 seconds starting at 1:30
- Start Time:
00:01:30.000 - End Time:
00:01:40.000
- Adjust the Speed slider (0.5x - 2.0x)
- Modify Bass levels (-10dB to +10dB)
- Change Pitch (-12 to +12 semitones)
- Click Apply EQ to process
Tip: Preview changes before applying by playing the audio
Simply click any preset button to instantly apply the effect:
- Effects are processed offline for quality
- Changes are added to undo/redo history
- Waveform updates automatically
Save as WAV (Lossless)
- Click the first "Save" button
- Original quality preserved
Save as MP3 (Compressed)
- Click the second "Save" button
- Smaller file size, good for sharing
Note: Save buttons only activate after making edits
- Undo: Revert to previous state
- Redo: Reapply reverted changes
- Reset: Delete current file and start fresh
VocalDeck/
β
βββ public/ # Static assets
β βββ index.html
β
βββ src/
β βββ assets/ # Images, icons, audio samples
β β βββ microphone.png
β β βββ play-button.png
β β βββ ...
β β
β βββ components/ # React components
β β βββ EditorNavbar.jsx # Top navigation bar
β β βββ FileCard.jsx # File history sidebar
β β βββ CenterCard.jsx # Main waveform editor
β β βββ ButtonCard.jsx # Playback controls
β β βββ AdvanceTrimCard.jsx # Precision trimming
β β βββ EqualizerCard.jsx # EQ controls
β β βββ PresetsCard.jsx # Voice effect presets
β β
β βββ pages/
β β βββ EditorPage.jsx # Main editor layout
β β
β βββ styles/ # CSS modules
β β βββ EditorPage.css
β β βββ CenterCard.css
β β βββ ...
β β
β βββ App.jsx # Root component
β βββ index.js # Entry point
β
βββ electron/ # Electron main process
β βββ main.js
β
βββ package.json
βββ README.md
- File Loading: Files are read as
ArrayBufferand converted toBlob - Waveform Rendering:
wavesurfer.jscreates visual representation - Audio Processing:
- Uses Web Audio API's
AudioContext - Offline rendering with
OfflineAudioContext - Custom DSP for EQ and effects
- Uses Web Audio API's
- WAV Encoding: Custom
bufferToWavefunction creates valid WAV files - MP3 Encoding: FFmpeg converts WAV to MP3 (optional)
Global State (EditorPage.jsx)
uploadedFile: Currently loaded audio filehistory: Array of all file states for undo/redohistoryIndex: Current position in historyhasUnsavedChanges: Boolean flag for save button
Component Communication
- Props drilling for shared state
wavesurferReffor waveform access across components- Consistent
pushHistoryfunction pattern
// Every edit follows this pattern:
const pushHistory = (file, markUnsaved = true) => {
const newHistory = history.slice(0, historyIndex + 1);
newHistory.push(file);
setHistory(newHistory);
setHistoryIndex(newHistory.length - 1);
setUploadedFile(file);
if (markUnsaved) setHasUnsavedChanges(true);
};Rules:
- Initial uploads:
markUnsaved = false - Edits (trim, EQ, presets):
markUnsaved = true - Undo/redo: Navigate history without adding new states
Edit theme colors in component CSS files:
/* Dark theme */
.component.dark {
background-color: #1e1e1e;
color: #ffffff;
}
/* Light theme */
.component.light {
background-color: #f0f0f0;
color: #121212;
}In PresetsCard.jsx, add to the applyPreset function:
case "YourEffect":
// Apply custom audio processing
const processed = customEffect(buffer);
return processed;Solution: Install FFmpeg (see Optional Setup above)
Solution: Ensure file format is supported (WAV, MP3, OGG)
Solution: Check console for history state logs, ensure all edit functions use pushHistory
Solution: Reduce EQ intensity or try different presets
We welcome contributions! Here's how to get started:
-
Fork the repository
git fork https://github.com/Nayan993/VocalDeck.git
-
Create a feature branch
git checkout -b feature/amazing-feature
-
Make your changes
- Follow existing code style
- Add comments for complex logic
- Test thoroughly
-
Commit your changes
git commit -m "Add amazing feature" -
Push to your branch
git push origin feature/amazing-feature
-
Open a Pull Request
- Describe your changes clearly
- Reference any related issues
- β Write clean, readable code
- β Test all features before submitting
- β Update documentation if needed
- β Follow the existing project structure
- β Use meaningful commit messages
- WaveSurfer.js - Waveform visualization library
- React - UI framework
- Electron - Desktop app framework
- Web Audio API - Audio processing capabilities
- FFmpeg - Audio format conversion
- GitHub Issues: Report bugs or request features
