A compact TUI for converting between BPM, note values, milliseconds, samples, Hz, MIDI notes and tempo shifts.
- Editable BPM, sample rate, and A4 reference frequency
- Note division table for
1/1through1/64 - BPM-dependent note-value duration table in milliseconds
- Pitch table from MIDI notes to frequencies
- Normal, dotted, triplet, and quintuplet values
- MIDI note to Hz conversion
- Hz to nearest MIDI note with cents offset
- Tempo transposition by semitone shift
- Old/new BPM to semitone and cents difference
- FM sideband table from carrier frequency, modulator ratio or free modulator frequency, and sideband order
- Harmonic, near-harmonic, and inharmonic FM sideband relation labels
- Copy-friendly tab-separated table output
Recommended:
uv tool install git+https://github.com/oikoaudio/beatwright.gitOr with pipx:
pipx install git+https://github.com/oikoaudio/beatwright.gitpython3.12 -m venv .venv
source .venv/bin/activate
python -m pip install -e ".[test]"beatwrightor:
python -m beatwright.appPress q to quit.
Press c on a table tab to copy the selected row as tab-separated text.
The app shows mode-specific shortcut hints above the footer.
The app has four main tabs:
Timing: note value, duration in milliseconds, equivalent Hz, and samplesPitch: MIDI/Hz conversion plus a note-frequency tableTempo: tempo transposition and old/new BPM pitch differenceFM: carrier/modulator sidebands, folded lower bands, nearest note, cents, harmonic grid, and harmonic/near/inharmonic relation
Useful shortcuts:
1/2/3/4orF1/F2/F3/F4: switch to Timing, Pitch, Tempo, FMb,s,a: focus BPM, sample rate, A4p,m,h: focus note name, MIDI, or Hz on the Pitch tabt,o,n: focus semitone shift, old BPM, new BPM on the Tempo tabg,f,u,v,x,y: focus carrier note, carrier Hz, mod note, mod Hz, mod ratio, orders on the FM tabc: copy the selected table rowEscape: leave the current input and return focus to the active tab
When an input is focused:
Up/Down: normal stepShift+Up/Shift+Down: fine stepAlt+Up/Alt+DownorPageUp/PageDown: coarse step
uv run --extra test python -m pytestMIT. Copyright (c) 2026 David Fredman