Éditeur de cours de guitare en Markdown : tablatures, diagrammes d'accords, gammes, grilles, paroles, théorie et lecture audio. Un service proposé par Exostic.
Règles de confidentialité · Conditions d'utilisation · Documentation
# Guitar Markdown Studio (gms.exostic.com)
> Guitar Markdown Studio renders guitar lessons written in Markdown: tablatures, chord diagrams,
> fretboard scale diagrams, chord grids, lyrics with chords, strumming patterns, key charts,
> circle of fifths, tuner, and audio playback. The Markdown text is the only source of truth.
> This file is written for AI agents: read it, then write a complete `.md` lesson and hand the
> user a link that opens it in the editor.
The site at https://gms.exostic.com/ is a JavaScript application (two panes: Markdown on the
left, rendered lesson on the right, plus Web / Book / Poster view modes and print to PDF).
Fetching the HTML page tells you nothing about the syntax; everything you need is in this file.
## How to deliver a lesson to a user
Write the whole lesson as one Markdown document, then give the user ONE of these links:
1. `https://gms.exostic.com/?src=<URL of the .md file>` — the editor downloads the file.
The URL must serve plain text with CORS allowed: a raw GitHub file
(`https://raw.githubusercontent.com/...`), a GitHub Gist raw URL, or any public static host.
A `https://github.com/<owner>/<repo>/blob/...` URL is accepted and converted automatically.
Best option when you can create a file somewhere public: short link, editable later.
2. `https://gms.exostic.com/?b64=<base64 of the UTF-8 Markdown>` — no hosting needed.
Standard or URL-safe base64 both work. Percent-encode `+`, `/` and `=` if you use standard
base64 (or use URL-safe base64: `-` and `_`, padding optional). Links get long
(roughly 1.4 × the document size) but work for lessons of a few kilobytes. Put the parameters
after `#` rather than `?` for anything long: the fragment never reaches the server, so it escapes
GitHub Pages' 8 KB query limit (HTTP 414 beyond); the app reads both forms.
3. `https://gms.exostic.com/#doc=<lz-string compressToEncodedURIComponent(markdown)>` (or `?doc=`) —
what the app's own "Copier un lien de partage" produces (behind a short alias — the app's own
Cloud Run shortener from services/shortlink when configured, else TinyURL); shortest self-contained link, needs the `lz-string` library.
Optional extra parameters, combinable with any of the above:
- `mode=web` (default, interactive, audio playback), `mode=book` (A4 pages), `mode=poster`
(landscape, fit to page).
- `?enc=<base64url>` is a password-protected document (AES-256-GCM over the lz-string bytes, key from
PBKDF2-SHA-256; layout: version byte, 16-byte salt, 12-byte IV, ciphertext); the app asks for the
password. Produced when "Copier un lien de partage" or "Envoyer par e-mail…" is answered with a
password (both ask first: "Sans mot de passe" / "Protéger"); an agent should use `?src=`
or `?b64=` instead.
- `?state={"ids":["<Drive file id>"],"action":"open"}` is what Google Drive's "Open with" menu sends;
the app asks for a Google sign-in and reads that file (scopes drive.file + drive.install).
- `view=only` hides the Markdown editor and shows the rendered lesson only.
- `edit=hide` hides the "edit" button in view-only mode; `print=hide` hides the print buttons.
Example: `https://gms.exostic.com/?src=https://raw.githubusercontent.com/me/lessons/main/am-pentatonic.md&mode=web&view=only`
If you cannot produce a link, give the user the full Markdown in a code block and tell them to
paste it into the left pane at https://gms.exostic.com/ (or save it as `.md` and use "Ouvrir").
## Document structure
A lesson = optional YAML front matter + standard Markdown (headings, paragraphs, lists, bold,
blockquotes, links, images) + fenced code blocks with special languages listed below.
Anything that is not a special block is ordinary Markdown. The UI language is French but the
lesson content can be in any language.
### Front matter
```markdown
---
title: Amazing Grace
artist: Traditional
difficulty: Beginner
tempo: 70 BPM
time: 3/4
capo: 0
tuning: Standard
key: G
transpose: 0
sound: acoustic
sounding: false
logo: https://example.com/logo.png
logo-position: left
qr: false
---
```
- `title`, `artist`, `difficulty`, `tempo`, `time`, `capo`, `tuning` are shown as badges under
the title. Only `title` is really needed; add the others when relevant.
- `tempo`: `<number> BPM`. Drives audio playback (quarter notes) and the click-to-start metronome.
- `time`: time signature, e.g. `4/4`, `3/4`, `6/8`.
- `key`: song key (`G`, `Em`, `F# minor`, `Bb major`, French names like `Sol majeur` also work).
Used to spell transposed chord names correctly (flats vs sharps).
- `transpose`: `+2`, `-3`… shifts every chord NAME in `chords`, `grid`, `song` blocks and tab
annotations. Scale diagrams, key charts and the circle of fifths are never rewritten.
- `capo` + `sounding: true`: shows the sounding chord in parentheses, e.g. `Am (Cm)` with capo 3.
- `tuning`: `Standard`, `Drop D`, `DADGAD`, `Open G`, `Open D`, `Eb standard`, or an explicit
low-to-high list `D A D G B e`. Used by scale diagrams, the tuner and audio playback.
- `samples`: `off` to play with the synthesized string instead of the sampled guitars (a sampled
steel-string acoustic plus a General MIDI SoundFont, loaded in the background). `soundfont`: URL
of another uncompressed `.sf2` bank played first; the app's banks fill in the programs it lacks.
- `sound`: instrument used by audio playback — `acoustic` (default), `electric` (clean electric
guitar) or `distortion` (overdriven electric guitar). French words work too (`électrique`,
`saturé`). Only affects the sound, never the notation.
- `logo`: URL of an image shown in the header (none by default). `logo-position: left` or centred.
- `qr: false` hides the header QR code (shown by default in Book/Poster modes).
### Tablature — ```tab
````markdown
```tab
Em C
e|------0-------|------0-------|
B|----0---0-----|----1---1-----|
G|--0-------0---|--0-------0---|
D|--------------|2-------------|
A|2-------------|3-------------|
E|0-------------|--------------|
```
````
- Six lines, high e to low E, each starting with the string name and `|`. Keep all six lines the
same length and the bar lines `|` in the same columns.
- Notes in the same column on different strings are played together (chords).
Each `|`-separated section is one bar.
- An optional line ABOVE the six strings holds chord names / annotations aligned to the column
where they apply (like `Em` and `C` above).
- Techniques: `5h7` hammer-on, `7p5` pull-off, `5t12` tap, `5/7` slide up, `7\5` slide down,
`8b10` bend to a written note, `8b` full bend, `8br` bend and release, `10r8` release onto the
next note, `7~` vibrato, `x` muted note, `(5)` ghost note, `<12>` natural harmonic.
Playback renders them (pitch glides, legato attacks, vibrato, bell-like harmonics).
- `grid: 8` on its own line inside the block forces the rhythm grid (cells per bar). Blocks are
engraved by alphaTab from an alphaTex translation; rhythm comes from column spacing, so write
bars with a character count that is a multiple of the intended subdivision (16 chars = 16ths).
- `tempo: 120`, `time: 3/4`, `tuning: Drop D`, `capo: 2` on their own lines inside the block give it
its own playback and engraving settings (a song imported into a document with other settings).
- `staff: tab` / `staff: partition` / `staff: tab et partition` on its own line inside the block
(or as a front matter key) chooses what is drawn: tablature, staff notation, or both.
- `sound: clean` (or `acoustic`, `distortion`) on its own line inside the block overrides the
front matter `sound` for this block only — e.g. a clean intro in a distorted song.
- Rhythm is not quantised: note duration is inferred from the number of events in the bar.
Space notes evenly and keep the same number of events per bar when possible.
### Standard notation — ```partition
A block may hold several groups of six string lines (each with its own chord line above): they
are read as consecutive bars, so a long song can be written four bars per line.
Same ASCII syntax as `tab`, rendered as a music staff instead of a tablature. Both are engraved by alphaTab.
Always assumes standard tuning.
### Chord diagrams — ```chords
````markdown
```chords
Em 022000
C x32010
G 320003
D xx0232
F 133211
```
````
One chord per line: name, spaces, then six characters from low E to high e.
`x` = muted string, `0` = open string, a digit = fret. Frets 10 and above are not supported as
single characters, so keep chord shapes below the 10th fret or describe them in a `tab` block.
### Fretboard scale diagram — ```scale
Named scale (notes are computed, root highlighted, legend added):
````markdown
```scale
scale: A minor pentatonic
position: 1
labels: notes
```
````
Arpeggio (chord tones coloured by degree: root, 3rd, 5th, 7th):
````markdown
```scale
arpeggio: Am7
frets: 3-8
```
````
Manual diagram (one line per string, frets separated by `|`):
````markdown
```scale
frets: 0-12
e: 0|3|[5,A]|8|10|12
B: 1|3|[5]|8|10
G: 0|2|[5]|7|9|12
```
````
- `scale: <root> <name>`. Names (English or French): `major`, `minor`, `minor pentatonic`,
`major pentatonic`, `blues`, `major blues`, `harmonic minor`, `melodic minor`, `dorian`,
`phrygian`, `lydian`, `mixolydian`, `locrian`, `chromatic`, `whole tone`.
- `arpeggio: <chord>` (e.g. `Am7`, `G`, `Cmaj7`, `E7`). Exclusive with `scale:`.
- `position: N`: 5-fret window starting on the N-th scale note found on the low string
(position 1 starts on the lowest root). `frets: min-max` takes priority when both are present.
- `labels: notes | degrees | none` (default `notes` for a scale, `degrees` for an arpeggio).
- `tuning:` inside the block overrides the front matter tuning.
- Manual string lines: `5` plain dot, `5,A` dot with label, `[5]` or `[5,A]` highlighted dot.
They can be mixed with `scale:` to override generated dots.
### Key chart — ```key
````markdown
```key G
```
````
````markdown
```key
key: F# minor
sevenths: true
```
````
Table of diatonic chords (degree, roman numeral, chord, notes, function), relative key,
key signature, and for minor keys the harmonic-minor dominant. `sevenths: true` adds 7th chords.
### Chord grid — ```grid
````markdown
```grid
key: G
||: I | V | vi | IV :|| x2
| ii7 | V7 | I | I |
```
````
- One bar per `|` cell. `||:` … `:||` are repeat signs, `xN` after the closing repeat = play N times.
- With a `key:` line, roman numerals (`I ii iii IV V vi vii°`, `bVII`, `V7`, `IVmaj7`…) are
resolved to chord names, with the numeral shown small underneath. Plain chord names and
numerals can be mixed. In a minor key the numerals refer to the natural minor scale
(so in `Am`, `VII` is G and `VI` is F; `bVII` would give Gb). Lowercase = minor chord,
`°`/`dim`, `ø`, `+`/`aug` set the quality, suffixes like `7`, `maj7`, `sus4` are kept.
- `G/B` = slash chord (bass note), shown split diagonally. Without a `key:` line, `/` keeps
that meaning and cells are plain chord names: `| Em | C | G/B | D |`.
### Lyrics with chords — ```song
Inline chords right before the syllable:
````markdown
```song
[Em]Amazing [C]grace, how [G]sweet the [D]sound
That [Em]saved a [C]wretch like [G]me
```
````
Or chords on their own line, aligned in columns above the lyrics (both syntaxes can be mixed):
````markdown
```song
Bm F#7
On a dark desert highway Cool wind in my hair
```
````
An empty line separates verses. A line containing only `---` starts a new column.
### Strumming pattern — ```rhythm
````markdown
```rhythm
B H | B h | H B | h B
```
````
Each `|`-separated group is one beat. `B` = down stroke, `H` = up stroke, lowercase = ghost
(muted) stroke, `-` = rest. Playable in a loop with the metronome in Web mode.
### Circle of fifths — ```circle
````markdown
```circle D
```
````
Major keys outside, relative minors inside. The given key and its neighbours are highlighted.
Without an argument the circle is neutral.
### Tuner — ```tuner
````markdown
```tuner
tuning: DADGAD
```
````
Web mode: six buttons that play each open string, and a "🎤 Accorder au micro" button that
listens to the microphone and shows the detected note, the offset in cents on a needle, and the
nearest string of the tuning with tune-up/down advice. Print modes: a string / note / frequency table.
Without `tuning:` the front matter tuning is used.
### Layout blocks (empty blocks, each alone on its line)
- ```` ```pagebreak ``` ```` page break.
- ```` ```columnbreak ``` ```` column break inside a columns section.
- ```` ```landscapebreak ``` ```` page break in Poster (landscape) mode. The Poster is composed in the
Markdown: `landscapebreak` starts an A4 landscape page, `columnbreak` a column in the current
page, and each column is shrunk to the page height (no marker: one page, one column). A page
still overflowing at the smallest scale is reported in a toast. Book mode is unaffected.
- ```` ```columns ``` ```` … ```` ```column ``` ```` … ```` ```endcolumns ``` ```` multi-column
section; `column` separates columns, `endcolumns` closes the section.
- ```` ```zoom 0.8 ``` ```` … ```` ```endzoom ``` ```` scales the content in between
(factor 0.1 to 3, default 0.8). Handy to fit several chord diagrams on one row.
### Media
Standard Markdown images and links work. In Web mode a YouTube link or a link to an audio
file (`.mp3`, `.wav`, `.ogg`…) becomes an embedded player; in Book/Poster modes every link is
printed as a QR code.
### Google Drive
The site is an installable PWA (web manifest + service worker, offline-capable; Chrome shows an install icon,
"Fichier ▾ › Installer l'application" does the same). The "Fichier ▾" menu opens a document from Google Drive, saves it back to the same file or saves
it under another name; "Partager ▾" shares the Drive file with another Google account (reader or writer)
or opens the mail client (mailto, new tab) on a ready-made message with a short alias of the share link
(TinyURL, no key; full link when shortening fails and it fits, clipboard + "paste it" beyond that). Client-side OAuth only with the `drive.file` scope (the app sees only the
files it created or saved), the public OAuth client id, no API key or secret; nothing to write in
the Markdown.
### Importing Guitar Pro
The Import button also takes a Guitar Pro file (.gp3/.gp4/.gp5/.gpx/.gp): alphaTab parses it and
the app appends a new section (a heading with the song title, a note with its settings, then one
`tab` block per six-string track, bars wrapped by width (about 100 characters, at most four bars per line), with `staff: tab et partition` and its own `tempo:`, `time:`,
`tuning:`, `capo:`, `sound:` lines) at the end of the current document; an empty editor gets a
whole document with front matter instead. The "Guitar Pro" entry of the "+" insert menu inserts
the same blocks at the cursor. Rhythm is encoded in the column spacing, techniques in the ASCII
notation. Bass/percussion tracks, meter changes and secondary voices are dropped and reported;
with several usable tracks, a dialog asks which ones to import.
### Audio playback (Web mode)
A "▶ Écouter" button appears above `tab`, `partition`, `chords`, `grid` and `rhythm` blocks.
Tempo comes from `tempo`, meter from `time`, pitch from `tuning` and `capo`. Nothing is needed
in the Markdown to enable it. While a `tab`/`partition` block plays, the note or chord being
played turns pink on the engraving, the current bar is framed and a vertical cursor slides from one note to the next. Clicking a note plays it alone, parks a cursor there and selects that fret in the editor; while a
block plays the preview follows the current note (the editor does not move), and Space pauses/resumes (or restarts the last block);
the play button then starts from that cursor until playback reaches the end of the block. A speed selector next to each button (25/50/65/80/100 %) slows
that block down for practice; it is a reader-side setting, not something to write in the file.
## Writing good lessons
- Start with front matter (`title` at least, `tempo`, `time`, `key`, `tuning` when known).
- Use `##` headings to structure: goal, chords, technique, main riff / verse, exercises, tips.
- Put chord shapes in a `chords` block once, then use `grid` and `song` blocks for the form.
- For a song: `chords` → `rhythm` → `grid` (structure with repeats) → `song` (lyrics) →
`tab` for the riff/intro/solo. Keep tab bars consistent and small (2 to 4 bars per block).
- For theory: `key` chart + `grid` with roman numerals + `scale` (named scale, several
`position:` values) + `circle`. Explain in prose between the blocks.
- Do not put chord names inside `chords` diagrams above the 9th fret, do not mix `scale:` and
`arpeggio:` in one block, do not forget `key:` when a grid uses roman numerals.
- Check every `tab` block has exactly six string lines with aligned `|` characters.
## Minimal complete example
````markdown
---
title: A minor pentatonic, position 1
difficulty: Beginner
tempo: 80 BPM
time: 4/4
key: Am
tuning: Standard
---
> **Goal:** learn the first box of the minor pentatonic scale and use it over a simple progression.
## The scale
```scale
scale: A minor pentatonic
position: 1
labels: degrees
```
## Backing progression
```grid
key: Am
||: i | VII | VI | V7 :|| x4
```
## Lick
```tab
e|--------------5--8--|--5-----------------|
B|--------5--8--------|-----8--5-----------|
G|--5--7--------------|-----------7--5-----|
D|--------------------|---------------7~---|
A|--------------------|--------------------|
E|--------------------|--------------------|
```
## Chords used
```chords
Am x02210
G 320003
F 133211
E7 020100
```
````
## Links
- Editor: https://gms.exostic.com/
- Source and full French documentation: https://github.com/exostic/guitar-markdown-studio-desktop