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. |
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. |
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.6.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.6.0.tar.gz | 17.2 MB | Details |
Built distributions (wheels)
| File | Reset | |||
|---|---|---|---|---|
| chordsketch-0.6.0-py3-none-win_amd64.whl | Python 3 | none | Windows x86-64 | Details |
| chordsketch-0.6.0-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl | Python 3 | none | Linux glibc 2.17+ x86-64 | Details |
| chordsketch-0.6.0-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl | Python 3 | none | Linux glibc 2.17+ ARM64 | Details |
| chordsketch-0.6.0-py3-none-macosx_11_0_arm64.whl | Python 3 | none | macOS 11.0+ ARM64 | Details |
| chordsketch-0.6.0-py3-none-macosx_10_12_x86_64.whl | Python 3 | none | macOS 10.12+ x86-64 | Details |
Total release size: 54.7 MB
Release files / chordsketch-0.6.0.tar.gz
| Download URL | chordsketch-0.6.0.tar.gz |
|---|---|
| Size | 17.2 MB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
2d7abd5eda605e2a4f66cf952eeb1b379a6412e6ae02e3bb0ac97bb32a13b7b3
|
|
BLAKE2b-256 checksum How to use checksums |
c4a1213c28e7eabf2721d9c55e0908e3bc770ffb15aa46a3cc677f35d74df20a
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
maturin/1.15.0
|
Release files / chordsketch-0.6.0-py3-none-win_amd64.whl
| Download URL | chordsketch-0.6.0-py3-none-win_amd64.whl |
|---|---|
| Size | 7.3 MB |
| Tags | Python 3 Windows x86-64 |
|
SHA-256 checksum How to use checksums |
05b3e4ff8edaf2863da5acb8c3f3f2c6b4c4a1dbe5d70910afa98a84fd820535
|
|
BLAKE2b-256 checksum How to use checksums |
50198fab70a882c1daa4d1055c40a97f08419183226c1d410384ffdb6a89fcfe
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
maturin/1.15.0
|
Release files / chordsketch-0.6.0-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
| Download URL | chordsketch-0.6.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 |
1d1593dc5de7475718bc2d495e58351f723308d6e103b48f9c2c13fbbe7391a1
|
|
BLAKE2b-256 checksum How to use checksums |
a3540711cb1df36b0ef1f1959abdc9ec46eb0701e18d01bdf3cd904a27e7479d
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
maturin/1.15.0
|
Release files / chordsketch-0.6.0-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
| Download URL | chordsketch-0.6.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 |
b656b01ea53f984884122e653c0623850c248babc94e6a5081a7e952da928fab
|
|
BLAKE2b-256 checksum How to use checksums |
b264ab18c9d878230fdafa7c519518c09531e3fb5048909753c3b88dcad0b3e2
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
maturin/1.15.0
|
Release files / chordsketch-0.6.0-py3-none-macosx_11_0_arm64.whl
| Download URL | chordsketch-0.6.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 |
c5e24bb098d03bb6ab18d804230586ec19b3e8d973061ee2784fee847d7c8bf5
|
|
BLAKE2b-256 checksum How to use checksums |
76dade1d0a4ef8ec32a00b1a052b189115ef490f48e01f2053a335235fe45941
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
maturin/1.15.0
|
Release files / chordsketch-0.6.0-py3-none-macosx_10_12_x86_64.whl
| Download URL | chordsketch-0.6.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 |
845830d377a4715b0766ace0d2c2a2e66d4b0cf19100d2323f322399901db880
|
|
BLAKE2b-256 checksum How to use checksums |
bfc357db107e8a0a5228e4b3872c5dca15e11711520bdbf684f242c4b5bfd770
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
maturin/1.15.0
|