Pitchnode is a browser extension tuner built with Plasmo, React, and TypeScript. It listens to a live microphone input, detects pitch in real time, resolves the nearest musical note, and shows whether the signal is flat, sharp, or in tune.
The extension currently ships with two entry points:
popup.tsxfor the compact popup tunersidepanel.tsxfor the full-height side panel tuner
- Real-time chromatic tuning using microphone input
- Live frequency readout in Hz
- Nearest-note detection with cents offset
- Visual flat / sharp / in-tune meter
- Audio input selection when multiple microphones are available
- Persisted preferred input device between sessions
- Popup and side panel UIs powered by the same tuner component
- Plasmo
- React 18
- TypeScript
- Tailwind CSS
pitchfinderwith the YIN detector
Install dependencies:
npm installStart development:
npm run devBuild a production bundle:
npm run buildCreate a packaged build:
npm run packageAfter starting dev or creating a build, load the generated extension directory in your browser.
For Chrome:
- Open
chrome://extensions - Enable Developer mode
- Click
Load unpacked - Select the generated build folder, typically
build/chrome-mv3-devfor development
Once loaded, open the extension popup or the side panel and allow microphone access when prompted.
Pitchnode currently requests:
microphoneto analyze incoming audiosidePanelto expose the tuner in the browser side panelhttps://*/*host permission, as currently declared inpackage.json
.
├── popup.tsx # Popup entry
├── sidepanel.tsx # Side panel entry
├── src/components/TunerUI.tsx
├── src/hooks/useTuner.ts
├── src/utils/noteResolver.ts
└── src/style.css
useTuner handles microphone access, audio device enumeration, pitch detection, smoothing, and tuner lifecycle state.
noteResolver converts a detected frequency into:
- nearest note name
- octave
- target frequency
- cents deviation from the target pitch
TunerUI renders the pedal-inspired tuner interface used by both the popup and the side panel.
- Detection is constrained to roughly
40 Hzto2000 Hz - The tuner briefly holds the last valid reading when the input fades to reduce flicker
- If microphone access is denied or no device is available, the UI surfaces an error message
Built by pierres.dev.