尚未检测到更新。GitHub 发布版本后会显示在这里。
个人 GitHub 账号下公开仓库的所有者可以登录并验证所有权,自行管理介绍,无需管理员批准。
登录并生成验证文件,在 30 分钟内将其提交到此仓库的默认分支。其他分支或分叉仓库中的文件无效。然后在下方检查文件,即可无需管理员批准直接管理项目。请保留文件以维持管理权限。
如需登录,将前往登录页面。登录后请回到此处,再次点击所选的验证按钮。
在项目文件夹中运行 /nomorevibe verify,即可验证所有权并自行管理介绍。
一分钟完成验证制作者的介绍仅有上面的一句话。 更多详情请阅读仓库 README。 仓库 README ↗
正在加载完整 README。
查看完整 README ↗"I play a riff and the tabs just show up."
I've played guitar for six years, mostly technical metal and instrumental stuff. When I improvise I find riffs I want to keep, but stopping to write them down by hand kills the flow. Riff Boi listens while I play, writes the tab as I go, and saves the riff so I don't lose it.
I made it for the Beginner's Paradise – FirstCommit hackathon (2026).
Try it: https://riffboi.com (allow the mic when your browser asks)
7b9 for a bend, 7b9r7 for a bend and release, 7pb9r7 for a pre-bend.<12>), or delete it.The quickest way is the live version at https://riffboi.com. To run it on your own computer instead, you'll need Chrome (other modern browsers should work too), Python 3 for a small local server (Macs usually have it already), a mic or an audio interface, and internet the first time the page loads, because it downloads the pitch detection library.
git clone https://github.com/riff-boi/riff-boi.git
cd riff-boi
python3 -m http.server 8000
On Windows, try py -m http.server 8000 if python3 doesn't work. No git? Click Code, then Download ZIP on GitHub, unzip it and open a terminal in that folder.
Then open http://localhost:8000 in Chrome, click New Riff, allow the mic and play some single notes. Click Stop to save the riff. On a computer, Space starts and stops recording too.
The server is needed because browsers block the mic and JavaScript modules on a page opened straight from a file. On localhost they're allowed.
No guitar around? A piano or keyboard app playing single notes should work too, or upload a recording of single notes.
If it can't hear your guitar, add ?debug to the address (like https://riffboi.com/?debug). The Recording and Tuner screens then show what the mic is picking up: how loud and how clear the sound is, its pitch, and whether the browser's sound is running. After a recording, ?debug can also save its readings (JSON) and its raw sound (WAV), for testing.
The browser's Web Audio API listens to the mic 60 times a second, and Pitchy works out the pitch of each slice of sound and how clear it is. js/notes.js turns those pitches into notes. It decides when a new note starts (a pick, a pitch change, a hammer-on) and ignores harmonics and background noise. It also follows the pitch closely to hear bends: a bend glides smoothly through the pitches in between, while a hammer-on or slide jumps from fret to fret. js/tab.js picks a string and fret for each note. The sound can't tell you which string you played, so it goes with the spot that needs the least hand movement, and it keeps bends away from the nut, where they're hard to play. js/rhythm.js turns when each note started into note values (quarter, eighth and so on) using your tempo and time signature, and it can work out the tempo from your playing when Auto is on. js/tabsvg.js draws the tab picture. js/confidence.js scores how clear, in tune, quiet and steady the notes were, and js/editor.js turns a tab you write by hand into the same kind of riff, js/playback.js plays a tab back with a plucked-string sound made from noise (the Karplus-Strong trick), js/upload.js reads a recording with the same steps as listening live, just all at once, js/musicxml.js reads the melody from sheet music saved as MusicXML, js/scale.js works out the key and scale, js/share.js packs a riff into a link, js/storage.js saves riffs in the browser's localStorage and js/sounds.js keeps each riff's real sound in IndexedDB, so there's no server and no accounts. For the camera beta, js/camera.js sends camera frames to MediaPipe's hand tracking, which runs in a background worker (js/hand-worker.js) so listening never has to wait for it, and js/neck.js works out where the frets are from the 2-note setup and which string fits where your hand was.
The full plan is in devpost/spec.md.
Plain HTML, CSS and JavaScript (no framework), the Web Audio API, Pitchy 4.1.0 from the jsDelivr CDN, localStorage, IndexedDB and the MediaRecorder API (for Your sound), MediaPipe's Hand Landmarker (tasks-vision) in a Web Worker for the camera beta, and the UnifrakturCook and Oswald fonts from Google Fonts. It's hosted on Vercel. Node.js is only used for the test scripts.
With Node.js 18 or newer:
node tools/check.mjs
node tools/score.mjs
check.mjs runs 244 checks on the note, bend, rhythm, time signature, tempo, tab, confidence, mic, saving, tab editor, playback, upload, scale finder and share link logic, no guitar needed. score.mjs scores Riff Boi against recordings of me playing, where I wrote down exactly what I played. Right now it gets 116 of 118 notes right (98%), including all 3 test bends, and puts all 87 checked notes on the right string.
It only hears single notes, so no chords or power chords yet. It assumes standard tuning. The string and fret are a best guess, because the sound doesn't say which string you played (drag a note on a saved riff to move it, or try the camera beta). A really soft first note can get missed. A pre-bend only shows up once you release it, since until then it sounds just like a normal note, and a very slow bend (slower than about 0.4 seconds for a whole step) can come out as separate notes. Auto tempo can come out at double or half speed (the same notes written twice as long or half as long), and with no steady beat it's only a guess (it says "not sure"). It doesn't write triplets yet. On an iPhone, the silent switch can mute playback. Uploaded recordings can be up to 5 minutes long.
My planning docs and learning log are in devpost/: the scope, the product plan, the tech spec, the build checklist and notes on what I learned along the way.
I built Riff Boi with Claude Code as a coding partner. The idea, the features and the design choices were mine, and I recorded and labeled the test riffs and tested everything on my guitar. Claude Code wrote most of the code and tests and explained it to me as we went. It also helped write the docs, like this README and my Devpost story, from my notes.
Made by KoderNinja.