{"slug": "show-hn-claude-plays-the-piano-from-braille", "title": "Show HN: Claude Plays the Piano from Braille", "summary": "A developer released a Show HN project that decodes Hu Haipeng's North American ASCII music braille transcription of Nicolás Ruiz Espadero's 1874 piano transcription of Gottschalk's Grande Tarantelle (IMSLP #933069, CC BY-SA 4.0) into a full expressive MIDI and audio performance. The Python decoder, brf.py, reads the braille into timed notes and handles octave marks, in-accord, repeats, triplets and quintuplets, grace notes and key changes across all 539 bars, with six places corrected against the Ditson print (IMSLP #07731), including a left-hand A major chord in bars 2, 3, 5, 440, 444 and 446 and a stray '5k' in bar 489. perform.py layers tempo at dotted-quarter = 158, rubato, dynamics and pedal, and render.swift plays the MIDI through the macOS sampler offline into an .m4a, since AVAudioUnitSampler cannot load GarageBand's EXS24 Steinway instrument (error -10868).", "body_md": "## gottschalk-tarantelle-espadero.mp4\n\nAn expressive MIDI performance, decoded from the braille transcription of the score. The piece is Nicolás Ruiz Espadero's transcription for piano alone, Boston: Oliver Ditson, 1874.\n\n| File | What it is | \n|---|---|\n| `espadero.brf` | The score in North American ASCII music braille, bar-over-bar: Hu Haipeng's transcription for the Braille Orchestra and Open Braille Music projects ( [IMSLP #933069](https://imslp.org/wiki/Grande_Tarantelle%2C_Op.67_%28Gottschalk%2C_Louis_Moreau%29) , CC BY-SA 4.0) | \n| `brf.py` | Reads the braille into timed notes (the subset of the BANA Music Braille Code the file uses); prints the decoded notes bar by bar | \n| `perform.py` | Turns the notes into the performance: tempo, rubato, dynamics, voicing, articulation, pedal | \n| `render.swift` | Plays a MIDI file through the macOS sampler, offline, into an `.m4a` | \n| `gottschalk-tarantelle-espadero.mid` | The performance | \n| `gottschalk-tarantelle-espadero.m4a` | The performance as audio | \n| `LICENSE-MIT` | The MIT license, for the code | \n| `LICENSE-CC-BY-SA-4.0` | Creative Commons Attribution-ShareAlike 4.0 International, for the braille, the performances and the rest | \n\nThe Python needs only the standard library (3.11 or later); `render.swift` needs macOS and\nSwift (the Xcode command-line tools).\n\n```\npython3 perform.py espadero.brf -o gottschalk-tarantelle-espadero.mid\nswift render.swift gottschalk-tarantelle-espadero.mid gottschalk-tarantelle-espadero.m4a\npython3 brf.py espadero.brf 1 12      # the decoded notes of bars 1-12\n```\n\n`perform.py --report` prints the tempo, loudness and markings of every bar; `--tempo` sets the\ndotted-quarter tempo (158), `--no-repeats` skips the two repeats.\n\nFor a better piano, open the `.mid` in GarageBand: **File › Open**, or drag it into an empty\nproject. When GarageBand asks *Also import tempo information?*, click **Import Tempo**: the\nrubato lives in the tempo map, and without it the piece plays metronomically. If the track\ndoes not come up as a piano, pick **Piano › Steinway Grand Piano** in the Library. Bars and\nkey changes line up with the score, so it reads correctly in a DAW or notation program too.\n\n`render.swift` cannot use GarageBand's Steinway itself: it is an EXS24 instrument over one\nconsolidated `.caf`, which `AVAudioUnitSampler` will not load (error -10868).\n\nThe braille gives every pitch and duration exactly, so no optical reading of the 1874 scan was\nneeded. The decoder handles the code as this file uses it: octave marks and BANA's rules for\nunmarked octaves, intervals read down in the right hand and up in the left, interval doubling\n(`--`), full- and part-measure in-accord, measure and part-measure repeats (whose extent comes\nfrom the bar's length), 16th-note grouping, triplets and quintuplets, stem signs, grace and\ncue-size notes, cautionary accidentals (in parentheses in print, `,'` … `,'` in the braille),\nties, slurs, fingered tremolos, hand changes within a line, first and second\nendings, and key changes. Every voice of all 539 bars (and the two second endings) adds up to\nexactly 6/8.\n\nBars were compared with the Ditson print (IMSLP #07731) in every section. Six places in the\nbraille differ from the print and are corrected in `brf.py` (`CORRECTIONS`):\n\n| Bars | Braille |  | \n|---|---|---|\n| 2, 3, 5, 440, 444, 446 | Left-hand A major chord as A2 C♯3 E3 | A2 E3 C♯4 (the tenth needs an octave mark the braille lacks) | \n| 489 | A stray `5k` after the third note | Nothing; without it the bar is exactly 6/8 | \n\nThe braille leaves out the print's *ossia* and *Facilité* staves, so they are not played. The\ncue-size notes the score marks *avec les petites notes ad lib.* (bars 309–322) are played,\nsoftly.\n\nEverything beyond the notes is an interpretation layered over the score's own markings:\n\n- **Tempo** :*Tempo di Tarantella* at ♩. = 158, with a light lilt on each beat. Each four-bar\nphrase presses forward a little and eases at its cadence. The music broadens into double bars\nand key changes and takes a breath after them.*animando* presses about 7% into its climax,\nrides it, then settles.*dolce* and*pesante* are a shade slower.*Più mosso* (bar 498) is\nabout 11% faster to the end. Fermatas are held about twice their length, and the last line is\nbroad.\n- **Dynamics** : the printed levels,*fp* ,*sf* /*rfz* ,*cresc.* /*dim.* (ramping to the next\nprinted level) and hairpins (as swells). Where the print gives none, the orchestral*Tutti* enters at least*f* , and an unmarked*Solo* after it steps down to*f* . On top of that, the\nmelody grows as it rises above its surroundings, beat 1 of each bar (and beat 2, less) is\nstressed, and eight-bar arcs give it shape.*legg.* ,*scherz.* and*scintillante* are lighter;*martellato* ,*pesante* and*con impeto* heavier.\n- **Voicing** : the top of each right-hand chord is louder, inner notes recede, and the bass\nis firm.\n- **Chords** : no chord lands all at once. Each hand places its chord separately, the left\nhand usually a few milliseconds ahead. Within a hand the notes fan out, mostly from the bottom\nup, over about 10 ms for an octave to 20–40 ms for a big chord, wider the more notes and the\nwider the stretch. The melody note leads in the right hand and the bass in the left. A chord\nnever fans out over more than a third of the time to that hand's next one, so fast repeated\nchords stay crisp. Printed arpeggios roll from the bottom at about 30 ms a note.\n- **Touch** : staccato and staccatissimo are short, slurs and held stems legato, accents,\nmarcato and tenuto as printed, and unmarked notes slightly detached.\n- **Pedal** : as the braille marks it, each*Ped.* lifting and catching again just after the\nbeat.\n- **Ornaments** : grace notes come just before the beat, and the final D1–D2 tremolo is played\nout in sixteenths.\n- **Variation** : the timing wanders slowly by a few milliseconds, and velocities and releases\nvary a little from note to note. The randomness is seeded, so every build is the same.\n- **Repeats** : both are taken (bars 141–172 and 391–422), with their first and second endings:\n603 bars, about 7½ minutes.\n\nThe code (`brf.py`, `perform.py`, `render.swift`) is under the [MIT license](https://github.com/chris-mccoy/gottschalk-tarantelle/blob/main/LICENSE-MIT).\n\nThe braille transcription in `espadero.brf` is by Hu Haipeng, for the Braille Orchestra and\nOpen Braille Music projects ([brailleorch.org](http://www.brailleorch.org)), published on\n[IMSLP](https://imslp.org/wiki/Grande_Tarantelle%2C_Op.67_%28Gottschalk%2C_Louis_Moreau%29)\n(#933069) under the Creative Commons Attribution-ShareAlike 4.0 license. The MIDI and audio\nperformances are adaptations of it, and they and the rest of the repository (this README\nincluded) are shared under the same license: [CC BY-SA 4.0](https://github.com/chris-mccoy/gottschalk-tarantelle/blob/main/LICENSE-CC-BY-SA-4.0). The Ditson\nprint of 1874 that the transcription follows, and Gottschalk's and Espadero's music, are in\nthe public domain.", "url": "https://wpnews.pro/news/show-hn-claude-plays-the-piano-from-braille", "canonical_source": "https://github.com/chris-mccoy/gottschalk-tarantelle", "published_at": "2026-10-26 20:00:14+00:00", "updated_at": "2026-10-26 20:11:22.877626+00:00", "lang": "en", "topics": ["artificial-intelligence", "ai-tools", "developer-tools"], "entities": ["Claude", "Nicolás Ruiz Espadero", "Louis Moreau Gottschalk", "Hu Haipeng", "IMSLP", "Braille Orchestra", "Open Braille Music", "GarageBand"], "also_reported_by": [], "alternates": {"html": "https://wpnews.pro/news/show-hn-claude-plays-the-piano-from-braille", "markdown": "https://wpnews.pro/news/show-hn-claude-plays-the-piano-from-braille.md", "text": "https://wpnews.pro/news/show-hn-claude-plays-the-piano-from-braille.txt", "jsonld": "https://wpnews.pro/news/show-hn-claude-plays-the-piano-from-braille.jsonld"}}