chordsketch
ChordSketch Python bindings — parse and render ChordPro and iReal Pro chord charts from Python via native Rust extensions generated by UniFFI.
Native extension — no pure-Python fallback. The library compiles to a platform wheel; prebuilt wheels for common platforms are published to PyPI so no Rust toolchain is needed to install.
Installation
pip install chordsketch
Requires Python 3.8+ (CPython or PyPy).
Quick Start
import chordsketch
source = """{title: Amazing Grace}
{key: G}
[G]Amazing [G7]grace, how [C]sweet the [G]sound"""
html = chordsketch.parse_and_render_html(source)
text = chordsketch.parse_and_render_text(source)
pdf = chordsketch.parse_and_render_pdf(source) # bytes
print(chordsketch.version())
API
The tables below cover every function in
crates/ffi/src/chordsketch.udl (UniFFI's
namespace chordsketch { ... } block is the authoritative export
surface for all language bindings).
Render-function parameters
parse_and_render_* functions all accept the same three arguments:
| Parameter | Type | Description |
|---|---|---|
input |
str |
ChordPro source text |
config_json |
str | None |
Preset name ("guitar", "ukulele") or inline RRJSON; None for defaults |
transpose |
int | None |
Semitone offset; must fit in i8 (-128..=127). Out-of-range values raise ChordSketchError.InvalidConfig. None defaults to 0. |
Basic rendering
| Function | Returns | Description |
|---|---|---|
parse_and_render_text(input, config_json, transpose) |
str |
Plain text output |
parse_and_render_html(input, config_json, transpose) |
str |
Full HTML document |
parse_and_render_pdf(input, config_json, transpose) |
bytes |
Raw PDF bytes |
Body-only HTML and stylesheet
| Function | Returns | Description |
|---|---|---|
parse_and_render_html_body(input, config_json, transpose) |
str |
Body-only <div class="song">…</div> HTML fragment with no <!DOCTYPE> / <html> / <head> / <title> / embedded <style> — pair with render_html_css when the host supplies its own document envelope |
render_html_css() |
str |
Canonical chord-over-lyrics CSS that parse_and_render_html embeds inside <style> (byte-stable; safe to hash for cache-busting) |
render_html_css_with_config_json(config_json) |
str |
Variant of render_html_css that honours settings.wraplines from the supplied config (when wraplines is false, .line emits flex-wrap: nowrap) |
Captured warnings
| Function | Returns | Description |
|---|---|---|
parse_and_render_text_with_warnings(input, config_json, transpose) |
TextRenderWithWarnings { output: str, warnings: list[str] } |
Plain text + captured warnings |
parse_and_render_html_with_warnings(input, config_json, transpose) |
TextRenderWithWarnings { output: str, warnings: list[str] } |
HTML + captured warnings |
parse_and_render_pdf_with_warnings(input, config_json, transpose) |
PdfRenderWithWarnings { output: bytes, warnings: list[str] } |
PDF + captured warnings |
parse_and_render_html_body_with_warnings(input, config_json, transpose) |
TextRenderWithWarnings { output: str, warnings: list[str] } |
Body-only HTML fragment + captured warnings (body counterpart to parse_and_render_html_with_warnings) |
iReal Pro conversion
| Function | Returns | Description |
|---|---|---|
convert_chordpro_to_irealb(input) |
ConversionWithWarnings { output: str, warnings: list[str] } |
Convert ChordPro source to an irealb:// URL (lossy — drops lyrics, fonts, capo) |
convert_irealb_to_chordpro_text(input) |
ConversionWithWarnings { output: str, warnings: list[str] } |
Convert an irealb:// URL to rendered ChordPro text |
render_ireal_svg(input) |
str (SVG document) |
Render an irealb:// URL as an iReal Pro-style SVG chart |
render_ireal_png(input) |
bytes (PNG byte stream) |
Render an irealb:// URL as a PNG image (300 DPI default, A4-equivalent canvas) |
render_ireal_pdf(input) |
bytes (PDF byte stream) |
Render an irealb:// URL as a single-page A4 PDF document |
parse_irealb(input) |
str (JSON) |
Parse an irealb:// URL into AST-shaped JSON (mirrors IrealSong) |
serialize_irealb(input) |
str (URL) |
Serialize an AST-shaped JSON string back into an irealb:// URL (round-trips with parse_irealb) |
output of convert_irealb_to_chordpro_text is the rendered text
representation of the converted song (chordsketch-render-text
output), not raw ChordPro source. Each warnings entry is a
"<kind>: <message>" string (kind is lossy-drop,
approximated, or unsupported).
result = chordsketch.convert_chordpro_to_irealb("{title: Test}\n[C]Hello")
print(result.output) # "irealb://..."
print(result.warnings) # ["lossy-drop: lyrics are dropped", ...]
text = chordsketch.convert_irealb_to_chordpro_text(result.output)
print(text.output)
The *_with_warnings variants return the render warnings (transpose
saturation, chorus recall limits, {columns} clamp, etc.) as a list
alongside the output instead of forwarding them to sys.stderr /
NSLog / System.err / $stderr. Use them when embedding ChordSketch
in an app that needs to surface warnings in the UI or aggregate them.
See #1827.
Validation
| Function | Returns | Description |
|---|---|---|
validate(input) |
list[ValidationError] ({ line: int, column: int, message: str }, line / column one-based) |
Validate ChordPro input and return any parse errors as structured records (empty list if clean). Mirrors the WASM validate shape and the NAPI ValidationError[] interface. |
errors = chordsketch.validate(source) # list[ValidationError] — empty if clean
for e in errors:
print(f"line {e.line}, column {e.column}: {e.message}")
Chord diagrams
| Function | Returns | Description |
|---|---|---|
chord_diagram_svg(chord, instrument) |
str | None (SVG markup) |
Render a chord diagram as inline SVG. instrument is case-insensitive: "guitar", "ukulele" (alias "uke"), or "piano" (aliases "keyboard", "keys"). Returns None when the chord is not in the built-in voicing database; raises ChordSketchError.InvalidConfig on unknown instrument. |
chord_diagram_svg_with_defines(chord, instrument, defines) |
str | None |
Same as chord_diagram_svg but consults song-level {define} voicings first. defines is a list of (name, raw) tuples. |
chord_diagram_svg_with_orientation(chord, instrument, orientation=None) |
str | None |
Orientation-aware variant. orientation: "vertical" (default) or "horizontal" (nut on the left, Japanese tablature convention). Horizontal mode is reader-view only (high pitch on top, matches tablature stave order); see ADR-0026. Unrecognised strings fall back to vertical. |
chord_diagram_svg_with_defines_orientation(chord, instrument, defines, orientation=None) |
str | None |
Combined surface — accepts both song-level {define} voicings and the orientation knob. |
chord_pitches(chord) |
list[int] | None |
Constituent pitches of a chord as MIDI note numbers, for driving an audio synth. Returns a block voicing (root, third, fifth, plus any extension / altered / added tones, with a slash bass an octave below); None when the chord is not parseable. |
diagram_pitches(chord, instrument, defines) |
list[int] | None |
MIDI note numbers sounded by the chord diagram drawn for (chord, instrument) — for auditioning a diagram as exactly the shape it depicts, rather than the name-based block voicing chord_pitches returns. Fretted instruments return one pitch per non-muted string in string order; keyboard instruments return the highlighted keys. defines is the same ChordDefine list chord_diagram_svg_with_defines consults. None when no diagram is available. |
chord_staff_notes(chord) |
list[StaffNote] | None |
Constituent tones of a chord spelled for staff notation, ascending by pitch (a slash bass sorts first). Each tone is spelled diatonically from the chord's structure so it lands on its conventional staff line (e.g. Ebm7 → E♭ G♭ B♭ D♭, not D♯ F♯ A♯ C♯). None when the chord is not parseable. |
key_scale_pitches(key) |
list[int] | None |
Ascending one-octave scale of a musical key as MIDI note numbers — the movable-do "do re mi fa sol la ti do". Major keys yield the major scale; minor keys the natural-minor scale. Eight notes; None when the key is not parseable. |
key_tonic_triad(key) |
list[int] | None |
Tonic triad of a musical key as MIDI note numbers (the "do mi sol" chord). Major / minor per the key; extensions on the spelling are ignored. Three notes; None when the key is not parseable. |
StaffNote exposes letter: str ("A"–"G"), accidental: int
(signed semitone offset from the letter, -3..=3), octave: int
(scientific-pitch-notation octave, middle C = C4), and midi: int
(absolute MIDI note number).
Utility
| Function | Returns | Description |
|---|---|---|
version() |
str |
Library version string |
print(chordsketch.version()) # e.g. "0.3.0"
Options
# Transpose up 2 semitones with the ukulele preset
html = chordsketch.parse_and_render_html(source, "ukulele", 2)
# Inline RRJSON configuration
html = chordsketch.parse_and_render_html(
source,
'{"settings": {"notation": "solfege"}}',
None,
)
Error handling
Functions raise chordsketch.ChordSketchError on invalid configuration:
try:
html = chordsketch.parse_and_render_html(source, "{ bad json !!!", None)
except chordsketch.ChordSketchError as e:
print(e)
ChordSketchError has three variants:
NoSongsFound— the input produced no parseable songs (rare with lenient parsing)InvalidConfig(reason)— theconfig_jsonargument is not a known preset and not valid RRJSON, ortransposeis outside thei8range, orchord_diagram_svgwas called with an unsupported instrumentConversionFailed(reason)— a ChordPro ↔ iReal Pro conversion failed (convert_chordpro_to_irealb,convert_irealb_to_chordpro_text,render_ireal_*,parse_irealb,serialize_irealb)
Parse errors in the ChordPro input are not raised — the renderer is lenient
and produces a best-effort result. Call validate() to surface diagnostics.
Links
- Project: https://github.com/koedame/chordsketch
- Playground: https://chordsketch.koeda.me
- Issues: https://github.com/koedame/chordsketch/issues
License
MIT
Release files for chordsketch 0.7.0
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | |
|---|---|---|---|
| chordsketch-0.7.0.tar.gz | 6.3 MB | Details |
Built distributions (wheels)
| File | Reset | |||
|---|---|---|---|---|
| chordsketch-0.7.0-py3-none-win_amd64.whl | Python 3 | none | Windows x86-64 | Details |
| chordsketch-0.7.0-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl | Python 3 | none | Linux glibc 2.17+ x86-64 | Details |
| chordsketch-0.7.0-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl | Python 3 | none | Linux glibc 2.17+ ARM64 | Details |
| chordsketch-0.7.0-py3-none-macosx_11_0_arm64.whl | Python 3 | none | macOS 11.0+ ARM64 | Details |
| chordsketch-0.7.0-py3-none-macosx_10_12_x86_64.whl | Python 3 | none | macOS 10.12+ x86-64 | Details |
Total release size: 43.8 MB
Release files / chordsketch-0.7.0.tar.gz
| Download URL | chordsketch-0.7.0.tar.gz |
|---|---|
| Size | 6.3 MB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
efd5c63c53c429eb7d470c3805909e825dfca1d712533f933a408392aeee2150
|
|
BLAKE2b-256 checksum How to use checksums |
16d58aef466a66b47b3a5a444753c0d186df3c03216e88ebcb87c1271346fa1b
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
maturin/1.15.0
|
Release files / chordsketch-0.7.0-py3-none-win_amd64.whl
| Download URL | chordsketch-0.7.0-py3-none-win_amd64.whl |
|---|---|
| Size | 7.3 MB |
| Tags | Python 3 Windows x86-64 |
|
SHA-256 checksum How to use checksums |
1d8b5797c8c87dbe9fca4e5b65287c233af920dc11c5ab2494ad486659db2d94
|
|
BLAKE2b-256 checksum How to use checksums |
968c80f2981b292f52c81cec36e27e2d5446d2254f6aab548c9cbfbfa883b679
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
maturin/1.15.0
|
Release files / chordsketch-0.7.0-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
| Download URL | chordsketch-0.7.0-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl |
|---|---|
| Size | 7.5 MB |
| Tags | Linux glibc 2.17+ x86-64 Python 3 |
|
SHA-256 checksum How to use checksums |
b4bd11569cb5eedf11a72134b3afa30fd560236ed8ef34c7e129b2eaa4d46447
|
|
BLAKE2b-256 checksum How to use checksums |
c97bf0c8145f6d570a17aae85ee54e326e10ef3ff460864e9e6bf9cf1aad687e
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
maturin/1.15.0
|
Release files / chordsketch-0.7.0-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
| Download URL | chordsketch-0.7.0-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl |
|---|---|
| Size | 7.7 MB |
| Tags | Linux glibc 2.17+ ARM64 Python 3 |
|
SHA-256 checksum How to use checksums |
a7b4a37cd8430ee826fb9d45c09972d807a156e28dfb06f0b5e446860c2119cf
|
|
BLAKE2b-256 checksum How to use checksums |
43fb28d765774f5ecbc7a78c0650a1dbd3085e2dc501d8a11401853d6f26162e
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
maturin/1.15.0
|
Release files / chordsketch-0.7.0-py3-none-macosx_11_0_arm64.whl
| Download URL | chordsketch-0.7.0-py3-none-macosx_11_0_arm64.whl |
|---|---|
| Size | 7.5 MB |
| Tags | Python 3 macOS 11.0+ ARM64 |
|
SHA-256 checksum How to use checksums |
ca8d873f0fd64133322b77befbef57a33a2086e8cc606d9e12dfde3c06a1e0a4
|
|
BLAKE2b-256 checksum How to use checksums |
0a2cb4e3f08551d4b188da6e213dc9157e4824195f23b62a806baa64ade0b8f7
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
maturin/1.15.0
|
Release files / chordsketch-0.7.0-py3-none-macosx_10_12_x86_64.whl
| Download URL | chordsketch-0.7.0-py3-none-macosx_10_12_x86_64.whl |
|---|---|
| Size | 7.4 MB |
| Tags | Python 3 macOS 10.12+ x86-64 |
|
SHA-256 checksum How to use checksums |
06baf6159b420f28fc43fa60a6db5d62c34662b50f09d2b7eab0fce49634e95b
|
|
BLAKE2b-256 checksum How to use checksums |
aca18e41cb08661a125cbfeef472f3faef771b9ff68156e9ff0d48879b5f216e
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
maturin/1.15.0
|