summaryrefslogtreecommitdiff
path: root/tools
diff options
context:
space:
mode:
Diffstat (limited to 'tools')
-rw-r--r--tools/spectral_editor/script.js29
1 files changed, 13 insertions, 16 deletions
diff --git a/tools/spectral_editor/script.js b/tools/spectral_editor/script.js
index 024005e..7c424f9 100644
--- a/tools/spectral_editor/script.js
+++ b/tools/spectral_editor/script.js
@@ -867,28 +867,20 @@ function onCanvasWheel(e) {
// Zoom mode: Ctrl/Cmd + wheel
if (e.ctrlKey || e.metaKey) {
- // Calculate frame and frequency under cursor BEFORE zoom
+ // Calculate frame under cursor BEFORE zoom
const frameUnderCursor = (mouseX + state.viewportOffsetX) / state.pixelsPerFrame;
- const freqUnderCursor = (mouseY + state.viewportOffsetY) / state.pixelsPerBin;
- // Calculate new zoom level
+ // Calculate new zoom level (horizontal only - logarithmic frequency axis doesn't zoom)
const zoomFactor = e.deltaY > 0 ? 0.9 : 1.1; // Wheel down = zoom out, wheel up = zoom in
- const oldPixelsPerFrame = state.pixelsPerFrame;
- const oldPixelsPerBin = state.pixelsPerBin;
-
state.pixelsPerFrame = Math.max(0.5, Math.min(20.0, state.pixelsPerFrame * zoomFactor));
- state.pixelsPerBin = Math.max(0.1, Math.min(5.0, state.pixelsPerBin * zoomFactor));
- // Adjust viewport offset so frame/freq under cursor stays in same screen position
+ // Adjust viewport offset so frame under cursor stays in same screen position
// After zoom: new_offset = frame * newPixelsPerFrame - mouseX
state.viewportOffsetX = frameUnderCursor * state.pixelsPerFrame - mouseX;
- state.viewportOffsetY = freqUnderCursor * state.pixelsPerBin - mouseY;
// Clamp viewport offset to valid range
const maxOffsetX = Math.max(0, state.referenceNumFrames * state.pixelsPerFrame - state.canvasWidth);
- const maxOffsetY = Math.max(0, DCT_SIZE * state.pixelsPerBin - state.canvasHeight);
state.viewportOffsetX = Math.max(0, Math.min(maxOffsetX, state.viewportOffsetX));
- state.viewportOffsetY = Math.max(0, Math.min(maxOffsetY, state.viewportOffsetY));
render();
return;
@@ -903,11 +895,16 @@ function onCanvasWheel(e) {
return;
}
- // Normal mode: pan vertically
- state.viewportOffsetY += e.deltaY;
- const maxOffsetY = Math.max(0, DCT_SIZE * state.pixelsPerBin - state.canvasHeight);
- state.viewportOffsetY = Math.max(0, Math.min(maxOffsetY, state.viewportOffsetY));
- render();
+ // Normal mode: pan vertically (disabled for logarithmic frequency axis)
+ // Note: With logarithmic frequency scale, vertical pan doesn't make sense
+ // because the frequency range (FREQ_MIN to FREQ_MAX) is always scaled to fit canvas height.
+ // Vertical pan only works in linear frequency mode.
+ if (!USE_LOG_SCALE) {
+ state.viewportOffsetY += e.deltaY;
+ const maxOffsetY = Math.max(0, DCT_SIZE * state.pixelsPerBin - state.canvasHeight);
+ state.viewportOffsetY = Math.max(0, Math.min(maxOffsetY, state.viewportOffsetY));
+ render();
+ }
}
// ============================================================================