# Spectrogram Viewer (C/Raylib) A real-time spectrogram viewer ported from the Unity Audio-Experiments project, with interactive region selection and audio playback. ## Features - **Spectrogram Visualization**: Displays frequency content of audio over time using STFT - **Time & Frequency Selection**: Select both time regions AND frequency ranges - **Audio Playback**: Play back only the selected time region - **Multiple Colormaps**: 6 different heat map styles - **Adjustable Threshold**: Control the dB floor for visualization - **Drag & Drop**: Load files by dragging them onto the window ## Building ### Linux ```bash cd rspektrum/build ./premake5 gmake cd .. make ``` ## Running ```bash cd rspektrum/bin/Debug ./rspektrum ``` ## Controls | Key | Action | |-----|--------| | **O** | Open file dialog | | **Drag & drop** | Load WAV file | | **LMB Drag** | Select time region | | **Shift+LMB Drag** | Select frequency range | | **SPACE** | Play selected time region | | **M** | Cycle colormap | | **W/S** | Adjust dB floor (up/down) | | **G** | Toggle grid overlay | | **R** | Reset all selections to full range | | **ESC** | Stop playback / Cancel dialog | ## File Loading Two ways to load a WAV file: 1. **Drag & Drop**: Simply drag a `.wav` file onto the application window 2. **File Dialog**: Press **O** to open a file path input dialog ## Selection Modes ### Time Selection (Left Mouse Button) - Click and drag horizontally to select a time range - The non-selected areas are greyed out - Yellow borders indicate the selection boundaries ### Frequency Selection (Shift + Left Mouse Button) - Hold **Shift** and drag vertically to select a frequency range - Cyan borders indicate the frequency selection - Useful for isolating specific frequency bands ## Colormaps Press **M** to cycle through available colormaps: 1. **Grays** - Classic grayscale 2. **Inferno** - Dark purple to bright yellow (default) 3. **Viridis** - Purple to yellow (perceptually uniform) 4. **Plasma** - Purple to yellow-orange 5. **Hot** - Black to red to yellow to white 6. **Cool** - Cyan to magenta ## Threshold Control Use **W** and **S** keys to adjust the amplitude floor: - **W**: Raise the floor (show only louder signals) - **S**: Lower the floor (show quieter signals too) The current dB floor is displayed in the bottom right corner. ## Technical Details ### STFT Parameters - **FFT Size**: 2048 samples - **Hop Size**: 1024 samples (50% overlap) - **Window**: Hann window - **Frequency Resolution**: `sampleRate / 2048` Hz per bin ### Audio Format Support - WAV files (any sample rate) - Automatically detected sample rate (displayed in info panel) - 8-bit, 16-bit PCM, and 32-bit float supported - Stereo files are converted to mono ### Display - X-axis: Time (seconds) - Y-axis: Frequency (Hz), scaled to actual sample rate - Color/brightness: Amplitude in dB ## Project Structure ``` rspektrum/ ├── src/ │ ├── spectrogram.c # Main application (~1000 lines) │ └── icon.ico # Windows icon ├── libs/ │ └── ... # Optional external libraries ├── build/ │ ├── premake5.lua # Build configuration │ └── external/ # Downloaded dependencies (raylib) └── bin/ ├── Debug/ # Debug build └── Release/ # Release build ``` ## Comparison: Unity vs C/Raylib | Aspect | Unity Original | C/Raylib Port | |--------|---------------|---------------| | Lines of Code | ~2000+ (multiple files) | ~1000 (single file) | | Build Time | Minutes | Seconds | | Dependencies | Unity Editor, .NET | raylib only | | GPU Acceleration | Compute shaders | CPU-based | | Colormaps | Single gradient | 6 presets | | Freq Selection | No | Yes | | Startup Time | Slow | Fast | ## Tips 1. **For 16kHz audio**: The max frequency will show as 8kHz (Nyquist) 2. **Better visibility**: Use Inferno or Viridis colormap for better contrast 3. **Quiet signals**: Lower the dB floor with 'S' to see quieter content 4. **Isolate frequencies**: Use Shift+drag to focus on specific frequency bands 5. **Playback**: Only the time selection is played, full frequency range ## Future Improvements - [ ] Logarithmic frequency scale option - [ ] Zoom in/out on frequency axis - [ ] Real-time microphone input - [ ] Export selection as WAV - [ ] Faster FFT (pffft/kissfft) - [ ] Save/load presets ## License Based on Unity Audio-Experiments by Sebastian Lague (Coding Adventure series) C/Raylib port created for educational purposes.