Skip to content
Projects

canbmaj7/openstand has 9 GitHub stars and 4 forks. GitHot measured 0 stars in 24 hours. Last checked 2026-11-09 18:44 UTC. Last push 2026-11-01.

How these counts are measured

Open-source play-along band in your browser. Import iReal Pro links and practice over generated bass, piano and drums.

Measured star growth

in 24h
0
in 7 days
Collecting history
in 15 days
Collecting history
in 1 month
Collecting history

Net star changes over overlapping periods, not daily totals. Missing measurements are left blank. Stars measure attention, not software quality.

README.md

Original

OpenStand

Open OpenStand CI License: AGPL v3+

An open-source band that lives in your browser. Pick a tune, set the key and tempo, and practice over a rhythm section — bass, piano and drums — generated live from a chord chart.

An open music stand: put a chart on it and the band starts playing.

No install, no account, no subscription. Just open the page and play.

Open OpenStand

OpenStand playing a jazz blues: the current bar is highlighted, and changing the key re-spells every chord

The chart editor: chords typed as text, with section, repeat and ending options below OpenStand on a phone in dark mode
Type chords the way you say them On a phone, in dark mode

The style lab: drum hits added on a grid while the band plays, then groove B, the fill, a written bass line and the chord rhythm

The style lab: change a groove on a grid and hear it while the band plays.


Status

OpenStand is an early but usable practice tool. What works today:

  • Import from iReal Pro. Paste an irealb:// link or a whole playlist (or choose an iReal Pro HTML export) and the tunes land in your library. Sections, repeats, first and second endings, D.C./D.S. al Coda/Fine, time signatures and N.C. bars are all read and played in the right order. Tested against public playlists of almost 2,000 tunes.
  • Write your own charts. Type chords the way you would say them (Dm7 G7, Cmaj7, Bø, F#dim7) and press Enter for the next bar. Add sections, repeats, endings, segno and coda, D.C./D.S. jumps, time signature, key, style and tempo. Edit any tune in the library the same way.
  • Export to iReal Pro. Any chart, imported or written here, can be copied as an irealb:// link that opens in iReal Pro. All ~2,000 test tunes come back unchanged after going out and in again.
  • A tune library in your browser. It starts with fifteen example tunes in 4/4, 3/4, 6/8, 12/8 and 5/4. Search by title or composer, filter by playlist. Everything is stored locally (IndexedDB); there is no server and no account.
  • Share a tune as a link. The whole chart is compressed into the URL, so whoever opens it sees and hears the same tune.
  • Eight styles: Medium Swing, Ballad (brushes), Jazz Waltz (3/4), Bossa Nova (nylon guitar), Samba, Pop Rock, Funk (electric piano, sixteenth-note groove) and Shuffle (boogie bass). Imported tunes get the closest style automatically, and you can switch styles while the band is playing.
  • Every style in every meter. In 3/4, 5/4 or 6/4 a style's 4/4 patterns are rearranged so the accents stay right (a rock beat in 3/4 becomes boom-chick-chick). 6/8 and 12/8 are felt in dotted quarters with straight eighths, with their own grooves for jazz, Latin and pop styles.
  • Generated accompaniment:
    • Bass walks through chord tones in swing, or plays style patterns (bossa root–fifth, rock eighths), always approaching the next chord smoothly
    • Piano / guitar comps with rootless jazz voicings or close-position chords, choosing the shape whose notes move least from the previous one (voice leading); ballad and pop piano use the sustain pedal so chords ring into each other
    • Drums pick grooves by position in the form: a set-up on the first bar, two-bar figures in the middle, a fill on the last bar
    • Every chorus is played a little differently
  • A real-looking lead sheet. Chord symbols in a handwritten jazz hand (Petaluma), rehearsal marks, repeat signs, endings, segno and coda, correct flat/sharp spelling in every key, and the current bar marked with a highlighter stroke as it plays.
  • Practice controls: tempo (40–300 BPM, changes instantly), transpose to any key while playing, number of choruses, and a count-in in the tune's meter (4/4 "1 . 2 . 1 2 3 4", 6/8 two pulses then six eighths). Keyboard shortcuts: Space to play/stop, ↑/↓ for ±5 BPM, →/← to transpose by a half step, and L to clear the loop. Shortcuts are inactive while editing a chart or focusing a form control.
  • Practice modes: loop any bars or a rehearsal section, go round all 12 keys (or step up a half or whole tone each chorus), and speed up a few BPM every chorus.
  • Style lab: change a style's drums (a main groove, a variation the band switches to, and a fill for the end of the form), bass line and chord rhythm on a grid (each with an optional second pattern the band switches to) and hear it while the band plays. Save your styles and pick them from the style menu, share one as a link, or send it to the project as a new style.
  • Mixer with per-instrument volume and mute, a master volume and an output level meter.
  • Light and dark themes that follow your system setting, and a layout that works on phones.
  • Small download, works offline. The sound bank is trimmed to the instruments OpenStand uses and compressed to 4.5 MB. After the first visit the app works without a connection and can be installed on a phone's home screen.

Quick start

Requires Node.js 22+.

git clone https://github.com/canbmaj7/openstand.git
cd openstand
npm install
npm run dev

Open http://localhost:5173 and press play. The first load downloads a 4.5 MB sound bank.

Command What it does
npm run dev Start the dev server
npm run build Type-check and build for production into dist/
npm run preview Serve the production build locally
npm run lint Lint with oxlint
npm test Run the unit tests (Vitest)
npm run soundbank Rebuild public/soundfonts/openstand.sf3 from the source bank (needs ffmpeg)

How it works

chord chart + style ──▶ timeline ──▶ bass / comp / drums generators ──▶ Standard MIDI file ──▶ SoundFont synth ──▶ audio
  1. Timeline (src/engine/timeline.ts) — follows the chart's repeats, endings and jumps, and expands it into chord slots (count-in, N choruses, final resolution to the tonic). Charts use the OpenStand chart format.
  2. Generators (src/engine/bass.ts, comp.ts, drums.ts) — read the selected style and turn each slot or bar into note events, with light humanization of timing and velocity.
  3. MIDI writer (src/engine/midiWriter.ts) — writes a format-1 Standard MIDI File in memory.
  4. Player (src/audio/player.ts) — plays it through SpessaSynth, a SoundFont synthesizer running in an AudioWorklet. Tempo changes adjust the playback rate, so nothing is regenerated.

Everything runs client-side. There is no server.

Project structure

src/
├── audio/      Sound bank loading, playback, mixer
├── engine/     Accompaniment engine (timeline, generators, MIDI writer)
├── formats/    iReal Pro links in and out, share links
├── library/    Tune library stored in the browser (IndexedDB)
├── music/      Chart format, chord parsing, voicings, example tunes
├── styles/     Style format and the style library
├── ui/         Chart, editor, transport, library, practice and mixer components
└── App.tsx     App state and playback wiring
docs/           Chart format reference, README images
scripts/        Sound bank build script
soundbank-src/  Full GeneralUser GS bank the app's sound bank is built from
tests/          Unit tests

The engine (src/engine, src/music, src/styles, src/formats) does not touch the DOM, so it can be split into its own package for other projects.

Styles

A style is data, not code. Each one lives in src/styles/library/ and describes three parts. The engine handles transposition, voice leading and fitting patterns to the chords.

Part What you describe
bass walking (rule-based) or pattern: notes as chord degrees — R, 3, 5, 6, 5- (fifth below), 7, 8 (octave), app (approach to the next chord)
comp Voicing type (rootless or close), rhythms per chord length, and pedal for a legato piano
drums Kit, count-in, grooves for the first / middle / last bar of the form (1 or 2 bars long; beats: 3 for a waltz), ending

Positions are in beats from the start of the bar or chord. Off-beat eighths are written as x.5 and are swung automatically when the style has swing above 0.5. A drum hit can carry a probability, so a groove varies on every pass. A style is written for 4/4 (or 3/4 for a waltz); the engine fits it to other meters (src/engine/meter.ts), and the 6/8 and 12/8 patterns live in src/styles/compound.ts.

// A bossa bass: root on 1, fifth below on the "and" of 2 and on 3, root on the "and" of 4
'4': [[
  { at: 0,   dur: 1.4,  tone: 'R'  },
  { at: 1.5, dur: 0.45, tone: '5-' },
  { at: 2,   dur: 1.4,  tone: '5-' },
  { at: 3.5, dur: 0.45, tone: 'R'  },
]]

Adding a style: copy one of the existing files, change the patterns, and register it in src/styles/index.ts. Types in src/styles/types.ts describe every field.

Roadmap

  • Style format with eight styles: swing, ballad, jazz waltz, bossa nova, samba, pop rock, funk, shuffle
  • Import iReal Pro links and playlists
  • Tune library in the browser, share links
  • Trimmed, compressed sound bank
  • Works offline after the first visit (PWA), installable on phones
  • Every style in 3/4, 6/8, 12/8, 5/4 and 6/4, with a count-in in the tune's meter
  • More styles: up-tempo swing, Afro-Cuban, reggae — and beyond (Balkan, Turkish usul, Afrobeat…)
  • A style lab: edit a groove in the browser and hear it right away
  • Chart editor, and export back to iReal Pro
  • Practice modes: tempo ramp per chorus, loop a section, cycle through all 12 keys
  • Export to ChordPro and MusicXML
  • Chord helper: piano keyboard, guitar diagrams, scale suggestions
  • Export to WAV / MIDI / PDF
  • Engine published as a standalone package

Contributing

OpenStand is meant to grow as a community project, and musicians are as welcome as developers.

  • Musicians: tell us where the band sounds stiff or wrong with a sound feedback issue. No code needed. New styles are the most valuable contribution, and they are data files, not code.
  • Developers: issues labelled good first issue are small and say where to start.

CONTRIBUTING.md explains the setup, how to write a style, and what a pull request needs.

Privacy

Your tunes, settings and library stay in your browser. There is no account and no server that stores them, and a shared tune travels inside the link itself.

The live site counts visitors with Vercel Web Analytics, so we can tell whether people find and use it. It uses no cookies and stores nothing on your device, and the counts are anonymous totals: pages viewed, country, browser and device type. Before anything is sent, the address is cut at ? and #, so the tunes in share links never leave your browser. When something breaks in your browser, the live site sends an error report to Sentry so it can be fixed without you having to tell us. A report holds the error message, where in the code it happened, your browser and the page address, cut at ? and # like above. It holds no cookies, no user details and nothing you typed, and the code that sends it is only downloaded once an error happens.

Copies of OpenStand that others run from this code send us nothing; on your own computer (npm run dev) nothing is counted or reported at all.

Credits

  • SpessaSynth by spessasus — SoundFont synthesizer and MIDI sequencer (Apache-2.0)
  • Petaluma by Steinberg — handwritten music font used for the chart (SIL Open Font License 1.1, see src/assets/fonts/Petaluma-OFL.txt)
  • IBM Plex Sans and Plex Mono — interface typefaces (SIL Open Font License 1.1)
  • GeneralUser GS by S. Christian Collins — sound bank, trimmed and compressed for OpenStand (see public/soundfonts/GeneralUser-GS-LICENSE.txt)
  • The iReal Pro format notes in ireal-musicxml and ireal-reader helped with the link reader, which is written from scratch

iReal Pro is a trademark of its owner. OpenStand is not affiliated with it; it reads the share links users already have so they can practice with their own charts.

License

GNU Affero General Public License v3.0 or later.

You are free to use, study, modify and share OpenStand. If you run a modified version as a web service, you must make its source code available to its users.

The accompaniment engine and the styles (src/engine, src/music, src/styles, src/formats) will also be offered under the Mozilla Public License 2.0 when they are published as a separate package, so other apps can use them. Contributions to those folders are accepted under both licences; see CONTRIBUTING.md.

Explore related projects