Semitone — karaoke key control
Overview
Change the key of any karaoke track, live. Transpose up or down by semitones on YouTube, Smule or a local file.
Semitone changes the key of a karaoke track while it plays, so a singer can perform in a key that suits their voice. It does one job and has no account, no sign-in, and no telemetry. WHAT IT DOES • Transposes up or down by whole semitones, up to three either way • Fine tunes by cents, for older recordings that were not cut at concert pitch • Works on YouTube, Smule, and local audio or video files opened in a tab • Shows the current key on the page itself, readable from across a room • Clears the key whenever the track changes, so nothing carries into the next song HOW TO USE IT Open the karaoke track, start it playing, then click the Semitone icon in the toolbar. Key down / up the − and + buttons, or Alt+Shift+Down / Alt+Shift+Up Back to original key the Reset button, or Alt+Shift+0 Fine tune Fine tune & display → the cents slider The keyboard shortcuts work with the popup closed, which is the point — you can change key from across the room without looking at the screen. They can be rebound at chrome://extensions/shortcuts if they clash with something else. The toolbar badge shows the current key whenever one is applied, so a stray transposition is visible even when the popup is shut. WHY ONLY THREE SEMITONES Because past that a backing track stops sounding like the record. Three semitones is a minor third — a large move for a singer already. If someone needs more, they usually need a different backing track rather than a different key. SEMITONES VERSUS CENTS They answer different questions, which is why they are separate controls. Semitones (±3, whole steps) Which key the singer performs in. Changes every song. Cents (±50, 5-cent steps) Whether the recording itself is at concert pitch. A cent is one hundredth of a semitone. Older recordings — anything cut to tape, and plenty of film music from the 1950s and 60s — often sit tens of cents away from A=440, because tape machines did not run at exactly the same speed everywhere. A singer with a good ear, or one tuning against a harmonium or a keyboard, will feel that even when the semitone is right. Fine tune fixes the recording. Semitones choose the key. If you have never needed the fine tune slider, leave it at zero. THE KEY CLEARS ITSELF BETWEEN SONGS This is the reason Semitone exists. You drop a song two semitones for one singer, and the next singer gets the same two semitones because nobody remembered to undo it. That is a bad moment in front of a room. Semitone resets whenever the track changes. Not only on a page reload — also when YouTube advances to the next video without reloading, when a playlist moves on, and when a player swaps its source underneath you. All three are detected. A key belongs to one performance and never carries into the next. The on-screen readout flashes "Reset — new track" when this happens, so you can see it work. THE ON-SCREEN READOUT Because the projector shows the karaoke tab, not your laptop, Semitone can paint the current key onto the page itself. Fine tune & display → On-screen readout Only when a key is applied (default) appears when there is something to report Always (stage mode) always visible, including a plain 0 Off never Stage mode always shows a number, including zero, so "nothing is applied" is something you can read rather than something you have to infer. Position it in any corner. REMEMBERING KEYS Off by default. A key belongs to a performance, not to a URL, so opening the same video tomorrow plays it as recorded. Turn on "Remember keys per video" and a key you set by hand comes back the next time you open that video. Turning it back off clears everything it kept, because a stale key you have forgotten about is exactly the surprise this extension exists to prevent. WHERE IT WORKS Automatically, with no clicking: YouTube, youtu.be, Smule, and pages served from localhost. Anywhere else: click the Semitone icon on that tab and it works there too, for that tab, for as long as it stays open. Nothing is granted permanently. For local files opened with a file:// address, switch on "Allow access to file URLs" on the Semitone card in chrome://extensions first — Chrome blocks all extensions from local files until you do. IT TRANSPOSES THE TRACK, NOT YOUR VOICE There is no vocal correction here and none is planned. Semitone never touches your microphone. If you are looking for Auto-Tune, this is not that. WHY IT ASKS FOR THESE PERMISSIONS Chrome will say Semitone can read and change your data on YouTube, youtu.be, Smule and localhost. Here is exactly what that is for. To change the key before the first note, Semitone has to attach to the audio while the page is loading. A tab opened by a setlist app receives no click, so there is no other moment to act on. Chrome offers no narrower permission for this. What it actually does with that access: finds the audio or video element on the page and routes its sound through a pitch shifter. It does not read page content, does not track what you watch, and sends nothing anywhere. WHEN IT WILL NOT WORK Stated plainly, because discovering these mid-show is worse than reading them now. • Some sites serve audio in a way browsers refuse to let extensions process. Semitone tells you instead of silently muting the track. • Copy-protected streams — Netflix, Spotify and similar — cannot be processed at all. • If a page swaps its media player after Semitone has attached, reload the tab. • Chrome sometimes refuses to start audio processing until you have clicked the page. Click the video once and try again. • There is no tempo or speed control. Karaoke tracks are played at written tempo. IF SOMETHING SEEMS WRONG Right-click the Semitone icon and choose Options. That page lists exactly what the extension believes: which sites it can reach, whether it is watching, and every key it holds. It is read-only and answers "why did my key not apply" faster than guessing. FOR EVENT HOSTS AND DEVELOPERS A web app running on localhost can set a key per song in advance, and Semitone applies it the moment that tab opens. Useful if you run karaoke nights from a setlist app: the host sets the key while preparing, and nobody touches the extension during the show. Integration needs no extension ID and no build step. Post a window message; Semitone replies. DETECTING IT const version = document.documentElement.dataset.semitone; // e.g. "1.0.0", or undefined window.addEventListener("semitone-ready", e => console.log(e.detail.version)); TALKING TO IT let seq = 0; const semitone = (message) => new Promise((resolve) => { const id = ++seq; const onReply = (e) => { if (e.source !== window || !e.data?.__semitoneReply || e.data.id !== id) return; window.removeEventListener("message", onReply); resolve(e.data.result); }; window.addEventListener("message", onReply); window.postMessage({ __semitone: true, id, ...message }, location.origin); setTimeout(() => { window.removeEventListener("message", onReply); resolve(null); }, 1500); }); MESSAGES { type: "status" } → { ok, name, version, presetCount, grantedOrigins } { type: "presets", presets: [ ... ] } → { ok, presetCount } Replaces the ENTIRE set. Not a merge — removing a key in your app removes it here, which is what stops a song transposing after you thought you had cleared it. { type: "arm", semitone, cents, label } → { ok } Applies once to the active tab. For "set the key on what is already playing". A PRESET { key: "yt:AzN4PKgPg-4", semitone: -2, cents: 0, label: "Slot 7 - Prerana" } key identifies the track (below). Required. semitone whole semitones, clamped to -3..+3. cents fine trim, clamped to -50..+50. Use for a recording not cut at concert pitch. label up to 80 chars, shown in the on-screen readout. Optional. TRACK KEYS YouTube "yt:" + video ID yt:AzN4PKgPg-4 Anything else "url:" + origin + pathname, no query, no trailing slash url:https://www.smule.com/song/abc Use the video ID, not the watch URL. YouTube appends &list=, &start_radio= and &t= as a session goes on, so full-URL matching silently stops matching. EXAMPLE — arm a key, then open the tab await semitone({ type: "presets", presets: [ { key: "yt:AzN4PKgPg-4", semitone: -2, cents: 0, label: "Slot 7 - Prerana" }, ]}); window.open("https://www.youtube.com/watch?v=AzN4PKgPg-4", "_blank"); PRECEDENCE A preset from your app wins. Then a key the user set by hand, if they have turned on "Remember keys per video". Otherwise the track plays in its original key. A key never carries from one track to the next. SCOPE The bridge exists only on localhost, 127.0.0.1, [::1] and *.localhost, because any script on a page can post these messages. On youtube.com there is no bridge, so no website can change what a singer hears. Only the four message types above are relayed; anything else is ignored. If you would rather use an extension ID, chrome.runtime.sendMessage(EXTENSION_ID, message) accepts the same messages from any localhost page. PRIVACY Semitone collects nothing, sends nothing, and has no account or server. Settings and keys are stored on your own machine using Chrome's local storage. The audio never leaves your computer — all processing happens in the browser tab. CREDITS Pitch shifting by Signalsmith Stretch (MIT licence), running as a WebAssembly audio worklet. All code ships inside the extension; nothing is downloaded at runtime.
0 out of 5No ratings
Details
- Version1.0.0
- UpdatedAugust 18, 2026
- Offered byShobhit Gupta
- Size128KiB
- LanguagesEnglish
- Developer
Email
shobhitgupta12@gmail.com - Non-traderThis developer has not identified itself as a trader. For consumers in the European Union, please note that consumer rights do not apply to contracts between you and this developer.
Privacy
This developer declares that your data is
- Not being sold to third parties, outside of the approved use cases
- Not being used or transferred for purposes that are unrelated to the item's core functionality
- Not being used or transferred to determine creditworthiness or for lending purposes