Skip to main content

ChordSketch

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) — the config_json argument is not a known preset and not valid RRJSON, or transpose is outside the i8 range, or chord_diagram_svg was called with an unsupported instrument
  • ConversionFailed(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.

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)

Source distribution for chordsketch 0.7.0
File Size Uploaded
chordsketch-0.7.0.tar.gz 6.3 MB Details

Built distributions (wheels)

Table of built distributions (wheels) for chordsketch 0.7.0
File
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

Release history Release notifications | RSS feed

This release

0.7.0 This release

6 release files

0.6.0

6 release files

0.5.0

6 release files

0.4.0

6 release files

0.3.0

6 release files

0.2.2

6 release files

0.2.1

6 release files

0.2.0

6 release files

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page