summaryrefslogtreecommitdiff
path: root/tools/spectral_editor/index.html
diff options
context:
space:
mode:
authorskal <pascal.massimino@gmail.com>2026-02-06 11:22:01 +0100
committerskal <pascal.massimino@gmail.com>2026-02-06 11:22:01 +0100
commitcf0775046c059fed1a4ed04d500f26397002667d (patch)
tree00e643a38e601114e755ec77c8b4901b5d045ff8 /tools/spectral_editor/index.html
parent5a1adde097e489c259bd052971546e95683c3596 (diff)
feat(tools): Add Spectral Brush Editor UI (Phase 2 of Task #5)
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>
Diffstat (limited to 'tools/spectral_editor/index.html')
-rw-r--r--tools/spectral_editor/index.html143
1 files changed, 143 insertions, 0 deletions
diff --git a/tools/spectral_editor/index.html b/tools/spectral_editor/index.html
new file mode 100644
index 0000000..52f1d8f
--- /dev/null
+++ b/tools/spectral_editor/index.html
@@ -0,0 +1,143 @@
+<!DOCTYPE html>
+<html lang="en">
+<head>
+ <meta charset="UTF-8">
+ <meta name="viewport" content="width=device-width, initial-scale=1.0">
+ <title>Spectral Brush Editor</title>
+ <link rel="stylesheet" href="style.css">
+</head>
+<body>
+ <div id="app">
+ <!-- Header -->
+ <header>
+ <h1>Spectral Brush Editor</h1>
+ <div class="header-controls">
+ <button id="loadWavBtn" class="btn-primary">Load .wav/.spec</button>
+ <input type="file" id="fileInput" accept=".wav,.spec" style="display:none">
+ <span id="fileInfo" class="file-info"></span>
+ </div>
+ </header>
+
+ <!-- Main content area -->
+ <div class="main-content">
+ <!-- Canvas area (left side, 80% width) -->
+ <div class="canvas-container">
+ <canvas id="spectrogramCanvas"></canvas>
+ <div id="canvasOverlay" class="canvas-overlay">
+ <p>Load a .wav or .spec file to begin</p>
+ <p class="hint">Click "Load .wav/.spec" button or press Ctrl+O</p>
+ </div>
+ </div>
+
+ <!-- Toolbar (right side, 20% width) -->
+ <div class="toolbar">
+ <h3>Curves</h3>
+ <button id="addCurveBtn" class="btn-toolbar" title="Add new curve">
+ <span class="icon">+</span> Add Curve
+ </button>
+ <button id="deleteCurveBtn" class="btn-toolbar btn-danger" title="Delete selected curve" disabled>
+ <span class="icon">×</span> Delete
+ </button>
+ <div id="curveList" class="curve-list"></div>
+ </div>
+ </div>
+
+ <!-- Control panel (bottom) -->
+ <div class="control-panel">
+ <!-- Left section: Profile controls -->
+ <div class="control-section">
+ <label for="profileType">Profile:</label>
+ <select id="profileType" class="select-input">
+ <option value="gaussian">Gaussian</option>
+ <option value="decaying_sinusoid">Decaying Sinusoid</option>
+ <option value="noise">Noise</option>
+ </select>
+
+ <label for="sigmaSlider" id="sigmaLabel">Sigma:</label>
+ <input type="range" id="sigmaSlider" class="slider" min="1" max="100" value="30" step="0.1">
+ <input type="number" id="sigmaValue" class="number-input" min="1" max="100" value="30" step="0.1">
+ </div>
+
+ <!-- Middle section: Curve selection -->
+ <div class="control-section">
+ <label for="curveSelect">Active Curve:</label>
+ <select id="curveSelect" class="select-input">
+ <option value="-1">No curves</option>
+ </select>
+ </div>
+
+ <!-- Right section: Playback controls -->
+ <div class="control-section playback-controls">
+ <button id="playProceduralBtn" class="btn-playback" title="Play procedural sound (Key 1)">
+ <span class="icon">▶</span> <kbd>1</kbd> Procedural
+ </button>
+ <button id="playOriginalBtn" class="btn-playback" title="Play original .wav (Key 2)" disabled>
+ <span class="icon">▶</span> <kbd>2</kbd> Original
+ </button>
+ <button id="stopBtn" class="btn-playback" title="Stop playback (Space)">
+ <span class="icon">■</span> <kbd>Space</kbd> Stop
+ </button>
+ </div>
+ </div>
+
+ <!-- Bottom action bar -->
+ <div class="action-bar">
+ <div class="action-group">
+ <button id="undoBtn" class="btn-action" title="Undo (Ctrl+Z)" disabled>
+ <span class="icon">↶</span> Undo
+ </button>
+ <button id="redoBtn" class="btn-action" title="Redo (Ctrl+Shift+Z)" disabled>
+ <span class="icon">↷</span> Redo
+ </button>
+ </div>
+
+ <div class="action-group">
+ <button id="saveParamsBtn" class="btn-action" title="Save procedural_params.txt (Ctrl+S)">
+ <span class="icon">💾</span> Save Params
+ </button>
+ <button id="generateCodeBtn" class="btn-action" title="Generate C++ code (Ctrl+Shift+S)">
+ <span class="icon">📝</span> Generate C++
+ </button>
+ </div>
+
+ <div class="action-group">
+ <button id="helpBtn" class="btn-action" title="Show keyboard shortcuts (?)">
+ <span class="icon">?</span> Help
+ </button>
+ </div>
+ </div>
+ </div>
+
+ <!-- Help modal (hidden by default) -->
+ <div id="helpModal" class="modal" style="display:none">
+ <div class="modal-content">
+ <span class="modal-close" id="closeHelpModal">&times;</span>
+ <h2>Keyboard Shortcuts</h2>
+ <table class="shortcuts-table">
+ <tr><th>Key</th><th>Action</th></tr>
+ <tr><td><kbd>1</kbd></td><td>Play procedural sound</td></tr>
+ <tr><td><kbd>2</kbd></td><td>Play original .wav</td></tr>
+ <tr><td><kbd>Space</kbd></td><td>Stop playback</td></tr>
+ <tr><td><kbd>Delete</kbd></td><td>Delete selected control point</td></tr>
+ <tr><td><kbd>Esc</kbd></td><td>Deselect all</td></tr>
+ <tr><td><kbd>Ctrl+Z</kbd></td><td>Undo</td></tr>
+ <tr><td><kbd>Ctrl+Shift+Z</kbd></td><td>Redo</td></tr>
+ <tr><td><kbd>Ctrl+S</kbd></td><td>Save procedural_params.txt</td></tr>
+ <tr><td><kbd>Ctrl+Shift+S</kbd></td><td>Generate C++ code</td></tr>
+ <tr><td><kbd>Ctrl+O</kbd></td><td>Open file</td></tr>
+ <tr><td><kbd>?</kbd></td><td>Show this help</td></tr>
+ </table>
+ <h3>Mouse Controls</h3>
+ <ul>
+ <li><strong>Click</strong> on canvas: Place control point</li>
+ <li><strong>Drag</strong> control point: Adjust position (frame, frequency, amplitude)</li>
+ <li><strong>Right-click</strong> control point: Delete</li>
+ </ul>
+ </div>
+ </div>
+
+ <!-- Scripts -->
+ <script src="dct.js"></script>
+ <script src="script.js"></script>
+</body>
+</html>