summaryrefslogtreecommitdiff
path: root/tools/spectral_editor/script.js
AgeCommit message (Collapse)Author
6 hoursfix(audio): Remove Hamming window from synthesis (before IDCT)skal
Removed incorrect windowing before IDCT in both C++ and JavaScript. The Hamming window is ONLY for analysis (before DCT), not synthesis. Changes: - synth.cc: Removed windowing before IDCT (direct spectral → IDCT) - spectral_editor/script.js: Removed spectrum windowing, kept time-domain window for overlap-add - editor/script.js: Removed spectrum windowing, kept time-domain window for smooth transitions Windowing Strategy (Correct): - ANALYSIS (spectool.cc, gen.cc): Apply window BEFORE DCT - SYNTHESIS (synth.cc, editors): NO window before IDCT Why: - Analysis window reduces spectral leakage during DCT - Synthesis needs raw IDCT output for accurate reconstruction - Time-domain window after IDCT is OK for overlap-add smoothing Result: - Correct audio synthesis without spectral distortion - Spectrograms reconstruct properly - C++ and JavaScript now match correct approach All 23 tests pass. Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
6 hoursfix(editor): Apply window to spectrum before IDCT, not afterskal
Fixed comb-like pattern in web editor playback by matching the C++ synth windowing strategy. Root Cause: - C++ synth (synth.cc): Applies window to SPECTRUM before IDCT - JavaScript editors: Applied window to TIME DOMAIN after IDCT - This mismatch caused phase/amplitude distortion (comb pattern) Solution: - Updated spectral_editor/script.js: Window spectrum before IDCT - Updated editor/script.js: Window spectrum before IDCT - Removed redundant time-domain windowing after IDCT - JavaScript now matches C++ approach exactly Result: - Clean frequency spectrum (no comb pattern) - Correct audio playback matching C++ synth output - Generated Gaussian curves sound proper Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
6 hoursfeat(audio): Integrate FFT-based DCT/IDCT into audio engine and toolsskal
Replaced O(N²) DCT/IDCT implementations with fast O(N log N) FFT-based versions throughout the codebase. **Audio Engine:** - Updated `idct_512()` in `idct.cc` to use `idct_fft()` - Updated `fdct_512()` in `fdct.cc` to use `dct_fft()` - Synth now uses FFT-based IDCT for real-time synthesis - Spectool uses FFT-based DCT for spectrogram analysis **JavaScript Tools:** - Updated `tools/spectral_editor/dct.js` with reordering method - Updated `tools/editor/dct.js` with full FFT implementation - Both editors now use fast O(N log N) DCT/IDCT - JavaScript implementation matches C++ exactly **Performance Impact:** - Synth: ~50x faster IDCT (512-point: O(N²)→O(N log N)) - Spectool: ~50x faster DCT analysis - Web editors: Instant spectrogram computation **Compatibility:** - All existing APIs unchanged (drop-in replacement) - All 23 tests pass - Spectrograms remain bit-compatible with existing assets Ready for production use. Significant performance improvement for both runtime synthesis and offline analysis tools. Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
9 hoursfeat(spectral_editor): Complete Phase 2 milestone - Full-featured web editorskal
MILESTONE: Spectral Brush Editor Phase 2 Complete (February 6, 2026) Phase 2 delivers a production-ready web-based editor for creating procedural audio by tracing spectrograms with parametric Bezier curves. This tool enables replacing 5KB .spec binary assets with ~100 bytes of C++ code (50-100× compression). Core Features Implemented: ======================== Audio I/O: - Load .wav and .spec files as reference spectrograms - Real-time audio preview (procedural vs original) - Live volume control with GainNode (updates during playback) - Export to procedural_params.txt (human-readable, re-editable format) - Generate C++ code (copy-paste ready for demo integration) Curve Editing: - Multi-curve support with individual colors and volumes - Bezier curve control points (frame, frequency, amplitude) - Drag-and-drop control point editing - Per-curve volume control (0-100%) - Right-click to delete control points - Curves only render within control point range (no spill) Profile System (All 3 types implemented): - Gaussian: exp(-(dist² / σ²)) - smooth harmonic falloff - Decaying Sinusoid: exp(-decay × dist) × cos(ω × dist) - metallic resonance - Noise: noise × exp(-(dist² / decay²)) - textured grit with decay envelope Visualization: - Log-scale frequency axis (20 Hz to 16 kHz) for better bass visibility - Logarithmic dB-scale intensity mapping (-60 dB to +40 dB range) - Reference opacity slider (0-100%) for mixing original/procedural views - Playhead indicator (red dashed line) during playback - Mouse crosshair with tooltip (frame number, frequency) - Control point info panel (frame, frequency, amplitude) Real-time Spectrum Viewer (NEW): - Always-visible bottom-right overlay (200×100px) - Shows frequency spectrum for frame under mouse (hover mode) - Shows current playback frame spectrum (playback mode) - Dual display: Reference (green) + Procedural (red) overlaid - dB-scale bar heights for accurate visualization - Frame number label (red during playback, gray when hovering) Rendering Architecture: - Destination-to-source pixel mapping (prevents gaps in log-scale) - Offscreen canvas compositing for proper alpha blending - Alpha channel for procedural intensity (pure colors, not dimmed) - Steeper dB falloff for procedural curves (-40 dB floor vs -60 dB reference) UI/UX: - Undo/Redo system (50-action history) - Keyboard shortcuts (1/2/Space for playback, Ctrl+Z/Ctrl+Shift+Z, Delete, Esc) - File load confirmation (warns about unsaved curves) - Automatic curve reset on new file load Technical Details: - DCT/IDCT implementation (JavaScript port matching C++ runtime) - Overlap-add synthesis with Hanning window - Web Audio API integration (32 kHz sample rate) - Zero external dependencies (pure HTML/CSS/JS) Files Modified: - tools/spectral_editor/script.js (~1730 lines, main implementation) - tools/spectral_editor/index.html (UI structure, spectrum viewer) - tools/spectral_editor/style.css (VSCode dark theme styling) - tools/spectral_editor/README.md (updated features, roadmap) Phase 3 TODO (Next): =================== - Effect combination system (noise + Gaussian modulation, layer compositing) - Improved C++ code testing (validation, edge cases) - Better frequency scale (mu-law or perceptual scale, less bass-heavy) - Pre-defined shape library (kick, snare, hi-hat templates) - Load procedural_params.txt back into editor (re-editing) - FFT-based DCT optimization (O(N log N) vs O(N²)) Integration: - Generate C++ code → Copy to src/audio/procedural_samples.cc - Add PROC() entry to assets/final/demo_assets.txt - Rebuild demo → Use AssetId::SOUND_PROC handoff(Claude): Phase 2 complete. Next: FFT implementation task for performance optimization. Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
11 hoursfix(spectral_editor): Fix procedural audio and add color-coded curvesskal
Fixed three issues reported during testing: 1. Procedural audio now audible: - Added AMPLITUDE_SCALE=10.0 to match DCT coefficient magnitudes - Amplitude range 0-1 from Y-position now scaled to proper spectral levels 2. Procedural spectrogram now visible: - Each curve rendered separately with its own color - Normalized intensity calculation (specValue / 10.0) - Only draw pixels with intensity > 0.01 for performance 3. Color-coded curves: - Each curve assigned unique color from palette (8 colors cycling) - Colors: Blue, Green, Orange, Purple, Cyan, Brown, Pink, Gold - Control points and paths use curve color - Curve list shows color indicator dot - Procedural spectrogram uses curve colors for easy tracking Visual improvements: - Selected curves have thicker stroke (3px vs 2px) - Each curve contribution visible in separate color - Color dots in sidebar for quick identification Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
11 hoursfix(spectral_editor): Resolve variable name conflict in playAudioskal
Fixed 'Identifier source has already been declared' error at line 935. Bug: Function parameter 'source' (string: 'procedural' or 'original') conflicted with local AudioBufferSourceNode variable. Fix: Renamed local variable to 'bufferSource' for clarity. Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
11 hoursfeat(tools): Add Spectral Brush Editor UI (Phase 2 of Task #5)skal
Implement web-based editor for procedural audio tracing. New Files: - tools/spectral_editor/index.html - Main UI structure - tools/spectral_editor/style.css - VSCode-inspired dark theme - tools/spectral_editor/script.js - Editor logic (~1200 lines) - tools/spectral_editor/dct.js - IDCT/DCT implementation (reused) - tools/spectral_editor/README.md - Complete user guide Features: - Dual-layer canvas (reference + procedural spectrograms) - Bezier curve editor (click to place, drag to adjust, right-click to delete) - Profile controls (Gaussian sigma slider) - Real-time audio playback (Key 1=procedural, Key 2=original, Space=stop) - Undo/Redo system (50-action history with snapshots) - File I/O: - Load .wav/.spec files (FFT/STFT or binary parser) - Save procedural_params.txt (human-readable, re-editable) - Generate C++ code (copy-paste ready for runtime) - Keyboard shortcuts (Ctrl+Z/Shift+Z, Ctrl+S/Shift+S, Ctrl+O, ?) - Help modal with shortcut reference Technical: - Pure HTML/CSS/JS (no dependencies) - Web Audio API for playback (32 kHz sample rate) - Canvas 2D for visualization (log-scale frequency) - Linear Bezier interpolation matching C++ runtime - IDCT with overlap-add synthesis Next: Phase 3 (currently integrated in Phase 2) - File loading already implemented - Export already implemented - Ready for user testing! Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>