Tap-tone analysis for luthiers, in your browser — capture a tap, run an FFT, and reveal guitar resonant modes and tonewood stiffness. Installable PWA with guitar, plate, and brace modes.
翻訳待ち
Loading the full README. The saved excerpt is shown below.
Tap-tone spectrum analysis for luthiers, running entirely in the browser. Tap a
guitar, tonewood plate, or brace; Guitar Tap captures the sound, runs a
high-resolution FFT, and reveals the resonant peaks and material properties that
guide bracing, mass distribution, and plate thickness — the methodology from
Contemporary Acoustic Guitar Design and Build by Trevor Gore and Gerard Gilet.Read the full README ↗Tap-tone spectrum analysis for luthiers, running entirely in the browser. Tap a guitar, tonewood plate, or brace; Guitar Tap captures the sound, runs a high-resolution FFT, and reveals the resonant peaks and material properties that guide bracing, mass distribution, and plate thickness — the methodology from Contemporary Acoustic Guitar Design and Build by Trevor Gore and Gerard Gilet.
This is the web edition of Guitar Tap. It is a long-term parallel port of the Apple edition (GuitarTap, Swift — the canonical reference for both algorithm and UX), alongside the desktop edition (guitar_tap, Python). All three are kept at numeric and behavioural parity (see Parity below) and are open source under the GNU GPL v3.
Everything runs client-side: the DSP happens in the browser, and your saved measurement library lives in the browser's IndexedDB — no server, no accounts, no tracking. It installs as a Progressive Web App for an app window, offline use, and durable storage.
.guitartap export, and a saved library.src/dsp (no DOM/audio), unit-tested against a shared oracle.public/spectrum-processor.js)..guitartap JSON format.eslint-plugin-react-hooks — a focused lint for React Hook
dependency arrays (types/unused are covered by the strict TypeScript check).src/
dsp/ Pure DSP core — FFT, gated capture, peak finding, classify,
material properties, pitch, calibration. No DOM/audio; oracle-tested.
audio/ AudioWorklet-driven engine: mic capture, tap detection, playback.
components/ React UI — spectrum chart, peak cards, panels, sheets, settings.
measurement/ .guitartap read/write + the IndexedDB library store.
presentation/ Rendering/export helpers (PDF report, spectrum image, mode colours).
hooks/ format/ Small shared utilities.
App.tsx Top-level app: toolbar, live view, results, state.
public/
spectrum-processor.js AudioWorklet (microphone → FFT frames).
icons/ PWA + favicon assets.
test/ Vitest oracle-driven parity tests (g0–g11 + regressions).
fixtures/parity-oracle.json Expected values, generated from the Swift reference.
tooling/sync-oracle.sh Maintainer script: refresh the vendored oracle.
All commands run in bash: Terminal on macOS, a shell on Linux, Cygwin bash (or Git Bash) on Windows. Every
repo has its own Python environment, .venv, made from its own requirements files; nothing uses another repo's
Python or the system's. The repo's scripts find .venv themselves (.venv/bin, or .venv/Scripts on Windows) and
stop if it is missing; PYTHON=… names another interpreter.
.nvmrc (pinned: other versions have broken the build —
nvm install / nvm use reads it), Python 3.14, and git.cmd.exe on Windows, and ours are bash
(npm run build stops with "'.' is not recognized…"). Once per machine, from any folder:
npm config set script-shell "$(cygpath -w "$(which bash)")"
It is saved in your user ~/.npmrc, so it holds for every project; npm config get script-shell shows it.git clone https://github.com/dwsdolce/GuitarTapWeb.git
cd GuitarTapWeb
npm ci # exact, lockfile-pinned install
npx playwright install chromium # the browser the end-to-end and export tests drive
tooling/export-check/), run by npm run test:exports:
python3.14 -m venv .venv
.venv/bin/pip install -r requirements-dev.txt # on Windows: .venv/Scripts/pip
.venv as the Python interpreter.npm run test:fast.Day to day:
npm run dev # start the dev server (http://localhost:5173)
npm test # run the Vitest parity suite
npm run typecheck # strict TypeScript check (no emit)
npm run lint # ESLint — React Hook dependency-array checks
Grant microphone permission when prompted — audio is analysed locally and never leaves the browser.
tooling/soak.sh is an on-demand dev tool (not CI) that loops the fast Vitest
suite many times to surface nondeterministic teardown/async races (React
effect-cleanup) that a single run hides:
./tooling/soak.sh 200 # 200 runs; exits non-zero on any failure or hang
./tooling/soak.sh 200 15000 # …with a 15 s per-test timeout (default 10 s)
Runs under bash on macOS, Linux, and Windows (Cygwin / Git-Bash). A green soak is confidence, not proof — use a few hundred to ~1000 runs. Why it works the way it does, and what it detects, is in the script's own header.
npm run build # tsc --noEmit && vite build → dist/
npm run preview # serve the production build locally to smoke-test it
This is the beginning of the README. Read the rest at the original. Read the full README ↗