From 35630afae7973f2d20a00059928b5b0a58191de8 Mon Sep 17 00:00:00 2001 From: Claude Date: Sat, 3 Oct 2026 09:10:16 +0000 Subject: [PATCH] =?UTF-8?q?Add=20the=20complete=20Gymnop=C3=A9die=20No.=20?= =?UTF-8?q?1=20to=20the=20built-in=20library?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The library card is now "Gymnopédie No. 1" with a Full version: all 78 bars, written out as in Satie's original. Notes, dynamics, hairpins and slurs come from the public-domain Mutopia Project edition (Evin Robertson); the left-hand chords sit on the bass staff so they count as left hand, and OpenKeys adds fingering for both hands, pedalling and an opening pp for the left hand (CC0). Co-Authored-By: Claude Opus 5.5 (1M context) Claude-Session: https://claude.ai/code/session_014oVTjqwWe51bFsyUnDqaeJ --- CREDITS.md | 7 +- README.md | 4 +- .../content/scores/gymnopedie-1-full.musicxml | 1084 +++++++++++++++++ src/core/content/songs.ts | 7 +- tests/score/songs-musicxml.test.ts | 12 + 5 files changed, 1109 insertions(+), 5 deletions(-) create mode 100644 src/core/content/scores/gymnopedie-1-full.musicxml diff --git a/CREDITS.md b/CREDITS.md index 34718b7..e077203 100644 --- a/CREDITS.md +++ b/CREDITS.md @@ -43,9 +43,14 @@ ## Music The built-in songs are public-domain compositions (Beethoven, Bach, Petzold, Satie, Pachelbel, Pierpont and -traditional melodies) **arranged by the OpenKeys project** and released under CC0, with one exception: +traditional melodies) **arranged by the OpenKeys project** and released under CC0, with these exceptions: - **Für Elise, full version** (`src/core/content/scores/fur-elise-full.musicxml`): fingered arrangement by Verona ([pianolessenassen.nl/bladmuziek](https://pianolessenassen.nl/bladmuziek)), published on [MuseScore](https://musescore.com/user/2423821/scores/6647035). Added by the maintainer as free to use; the file is bundled unchanged and is not covered by the CC0 dedication above. +- **Gymnopédie No. 1, full version** (`src/core/content/scores/gymnopedie-1-full.musicxml`): notes, dynamics, + hairpins and slurs from the [Mutopia Project](https://www.mutopiaproject.org/cgibin/piece-info.cgi?id=37) edition + typeset by Evin Robertson from the original (Mutopia-2014/12/14-37), placed in the public domain. OpenKeys wrote + it out in full as in Satie's original, moved the left-hand chords to the bass staff, and added fingering, + pedalling and a starting dynamic for the left hand; those additions are CC0. diff --git a/README.md b/README.md index cc395e2..a3fbd9d 100644 --- a/README.md +++ b/README.md @@ -28,8 +28,8 @@ No account, no server, no tracking: **audio never leaves your device.** It insta by drag-and-drop. Repeats, voltas and D.C./D.S. are unrolled for judging while the sheet keeps its written layout. Write your own exercises in the built-in **ABC script editor**. - **15 built-in pieces** (public-domain compositions, mostly arranged by the project): Ode to Joy, Für Elise - (the opening, plus the complete piece with fingering), Bach's Prelude in C, Gymnopédie No. 1, Minuet in G, - Canon in D, Greensleeves and more, each in graded versions. + and Gymnopédie No. 1 (each the opening, plus the complete piece with fingering), Bach's Prelude in C, Minuet in + G, Canon in D, Greensleeves and more, each in graded versions. - **Free play** with a live piano roll; record a take and transcribe it, chords included, with Spotify's **Basic Pitch** running locally; save it as a score or download MIDI. diff --git a/src/core/content/scores/gymnopedie-1-full.musicxml b/src/core/content/scores/gymnopedie-1-full.musicxml new file mode 100644 index 0000000..e00ea26 --- /dev/null +++ b/src/core/content/scores/gymnopedie-1-full.musicxml @@ -0,0 +1,1084 @@ + + + +Gymnopédie No. 1 +Erik SatiePublic domain. Notes and markings from the Mutopia Project edition (Evin Robertson); fingering and pedalling by OpenKeys contributors, CC0.OpenKeys2026-10-03https://www.mutopiaproject.org/cgibin/piece-info.cgi?id=37 +Piano + + +12major2G2F4 +Lent et douloureux1 +311 +3 +2 +2 +G235halfdown52 +3 +B316quarter2 +B326halfup52 +D426halfup32 +F1426halfup12 +2 + + +311 +3 +2 +D235halfdown52 +3 +B316quarter2 +A326halfup52 +C1426halfup32 +F1426halfup12 +2 + + +311 +3 +2 +G235halfdown2 +3 +B316quarter2 +B326halfup2 +D426halfup2 +F1426halfup2 +2 + + +311 +3 +2 +D235halfdown2 +3 +B316quarter2 +A326halfup2 +C1426halfup2 +F1426halfup2 +2 + + +11quarter1 +1 +1 +F1511quarter31 +A511quarter51 +3 +2 +G235halfdown2 +3 +B316quarter2 +B326halfup2 +D426halfup2 +F1426halfup2 +2 + + +G511quarter41 +F1511quarter31 +C1511quarter11 +3 +2 +D235halfdown2 +3 +B316quarter2 +A326halfup2 +C1426halfup2 +F1426halfup2 +2 + + +B411quarter21 +1 +C1511quarter31 +1 +D511quarter41 +3 +2 +G235halfdown2 +3 +B316quarter2 +B326halfup2 +D426halfup2 +F1426halfup2 +2 + + +A431half11 +3 +2 +D235halfdown2 +3 +B316quarter2 +A326halfup2 +C1426halfup2 +F1426halfup2 +2 + + +1 +F1431half21 +3 +2 +G235halfdown2 +3 +B316quarter2 +2 +B326halfup2 +D426halfup2 +F1426halfup2 +2 + + +F1431half1 +3 +2 +D235halfdown2 +3 +B316quarter2 +A326halfup2 +C1426halfup2 +F1426halfup2 +2 + + +F1431half1 +3 +2 +G235halfdown2 +3 +B316quarter2 +B326halfup2 +D426halfup2 +F1426halfup2 +2 + + +F1431half1 +3 +2 +D235halfdown2 +3 +B316quarter2 +A326halfup2 +C1426halfup2 +F1426halfup2 +2 + + +11quarter1 +1 +F1511quarter31 +A511quarter51 +3 +2 +G235halfdown2 +3 +B316quarter2 +2 +B326halfup2 +D426halfup2 +F1426halfup2 +2 + + +G511quarter41 +F1511quarter31 +C1511quarter11 +3 +2 +D235halfdown2 +3 +B316quarter2 +A326halfup2 +C1426halfup2 +F1426halfup2 +2 + + +B411quarter21 +C1511quarter31 +1 +D511quarter41 +3 +2 +G235halfdown2 +3 +B316quarter2 +B326halfup2 +D426halfup2 +F1426halfup2 +2 + + +1 +A431half11 +3 +2 +D235halfdown2 +3 +B316quarter2 +A326halfup2 +C1426halfup2 +F1426halfup2 +2 + + +C1531half21 +3 +2 +F1235halfdown52 +3 +B316quarter2 +A326halfup52 +C1426halfup32 +F1426halfup12 +2 + + +F1531half51 +3 +2 +B135halfdown52 +3 +B316quarter2 +B326halfup52 +D426halfup32 +F1426halfup12 +2 + + +1 +E431half11 +3 +2 +E235halfdown52 +3 +B316quarter2 +G326halfup32 +B326halfup12 +2 + + +E431half1 +3 +2 +E235halfdown52 +3 +B316quarter2 +B326halfup52 +D426halfup32 +G426halfup12 +2 + + +E431half1 +3 +2 +D235halfdown52 +3 +B316quarter2 +F326halfnaturalup52 +A326halfup32 +D426halfup12 +2 + + +1 +A411quarter11 +B411quarter21 +C511quarternatural31 +3 +2 +A135halfdown52 +3 +B316quarter2 +

2 +A326halfup52 +C426halfnaturalup32 +E426halfup12 +2 + + +E511quarter51 +D511quarter41 +B411quarter21 +3 +2 +D235halfdown52 +3 +B316quarter2 +G326halfup52 +B326halfup32 +E426halfup12 +2 + + +D511quarter41 +C511quarternatural31 +1 +B411quarter21 +3 +2 +D235halfdown52 +3 +B316quarter2 +D326halfup52 +G326halfup32 +B326halfup22 +E426halfup12 +2 + + +1 +D531half41 +3 +2 +D235halfdown52 +3 +B316quarter2 +C326halfnaturalup52 +E326halfup42 +A326halfup22 +D426halfup12 +2 + + +1 +D521half1 +1 +D511quarter11 +3 +2 +D235halfdown52 +3 +B316quarter2 +C326halfnaturalup52 +F1326halfup32 +A326halfup22 +D426halfup12 +2 + + +E511quarter21 +F511quarternatural31 +G511quarter41 +3 +2 +D235halfdown52 +3 +B316quarter2 +A326halfup52 +C426halfnaturalup32 +F426halfnaturalup12 +2 + + +A511quarter51 +C511quarternatural11 +1 +D511quarter21 +3 +2 +D235halfdown52 +3 +B316quarter2 +A326halfup52 +C426halfnaturalup32 +E426halfup12 +2 + + +1 +E511quarter31 +D511quarter21 +B411quarter11 +3 +2 +D235halfdown52 +3 +B316quarter2 +D326halfup52 +G326halfup32 +B326halfup22 +E426halfup12 +2 + + +1 +D531half21 +3 +2 +D235halfdown52 +3 +B316quarter2 +C326halfnaturalup52 +E326halfup42 +A326halfup22 +D426halfup12 +2 + + +D521half1 +D511quarter11 +3 +2 +D235halfdown52 +3 +B316quarter2 +C326halfnaturalup52 +F1326halfup32 +A326halfup22 +D426halfup12 +2 + + +1 +G531half51 +3 +2 +E235halfdown52 +3 +B316quarter2 +B326halfup52 +E426halfup22 +G426halfup12 +2 + + +1 +F1531half41 +3 +2 +F1235halfdown52 +3 +B316quarter2 +A326halfup52 +C1426halfup32 +F1426halfup12 +2 + + +B411quarter21 +A411quarter11 +B411quarter21 +3 +2 +B135halfdown52 +3 +B316quarter2 +B326halfup52 +D426halfup32 +F1426halfup12 +2 + + +C1511quarter31 +D511quarter41 +E511quarter51 +3 +2 +E235halfdown52 +3 +B316quarter2 +C1426halfup52 +E426halfup32 +A426halfup12 +2 + + +C1511quarter31 +D511quarter41 +1 +E511quarter51 +3 +2 +E235halfdown52 +3 +B316quarter2 +A326halfup52 +C1426halfup42 +F1426halfup22 +A426halfup12 +2 + + +F1431halfup51 +3 +C412quarter1 +A312quarterup11 +D412quarterup31 +B312quarterup11 +D412quarterup21 +G412quarterup51 +3 +2 +E235halfdown52 +3 +B316quarter2 +B216quarterup22 +E316quarterup12 +2 + + +1 +C431halfnatural11 +E431half21 +A431half41 +C531halfnatural51 +3 +2 +A235half52 +G335half12 +2 + + +D431half11 +F1431half21 +A431half31 +D531half51 +3 +2 +D235half52 +A235half22 +D335half12 +2 + + +311 +3 +2 +2 +G235halfdown52 +3 +B316quarter2 +B326halfup52 +D426halfup32 +F1426halfup12 +2 + + +311 +3 +2 +D235halfdown52 +3 +B316quarter2 +A326halfup52 +C1426halfup32 +F1426halfup12 +2 + + +311 +3 +2 +G235halfdown2 +3 +B316quarter2 +B326halfup2 +D426halfup2 +F1426halfup2 +2 + + +311 +3 +2 +D235halfdown2 +3 +B316quarter2 +A326halfup2 +C1426halfup2 +F1426halfup2 +2 + + +11quarter1 +1 +1 +F1511quarter31 +A511quarter51 +3 +2 +G235halfdown2 +3 +B316quarter2 +B326halfup2 +D426halfup2 +F1426halfup2 +2 + + +G511quarter41 +F1511quarter31 +C1511quarter11 +3 +2 +D235halfdown2 +3 +B316quarter2 +A326halfup2 +C1426halfup2 +F1426halfup2 +2 + + +B411quarter21 +1 +C1511quarter31 +1 +D511quarter41 +3 +2 +G235halfdown2 +3 +B316quarter2 +B326halfup2 +D426halfup2 +F1426halfup2 +2 + + +A431half11 +3 +2 +D235halfdown2 +3 +B316quarter2 +A326halfup2 +C1426halfup2 +F1426halfup2 +2 + + +1 +F1431half21 +3 +2 +G235halfdown2 +3 +B316quarter2 +2 +B326halfup2 +D426halfup2 +F1426halfup2 +2 + + +F1431half1 +3 +2 +D235halfdown2 +3 +B316quarter2 +A326halfup2 +C1426halfup2 +F1426halfup2 +2 + + +F1431half1 +3 +2 +G235halfdown2 +3 +B316quarter2 +B326halfup2 +D426halfup2 +F1426halfup2 +2 + + +F1431half1 +3 +2 +D235halfdown2 +3 +B316quarter2 +A326halfup2 +C1426halfup2 +F1426halfup2 +2 + + +11quarter1 +1 +F1511quarter31 +A511quarter51 +3 +2 +G235halfdown2 +3 +B316quarter2 +2 +B326halfup2 +D426halfup2 +F1426halfup2 +2 + + +G511quarter41 +F1511quarter31 +C1511quarter11 +3 +2 +D235halfdown2 +3 +B316quarter2 +A326halfup2 +C1426halfup2 +F1426halfup2 +2 + + +B411quarter21 +C1511quarter31 +1 +D511quarter41 +3 +2 +G235halfdown2 +3 +B316quarter2 +B326halfup2 +D426halfup2 +F1426halfup2 +2 + + +1 +A431half11 +3 +2 +D235halfdown2 +3 +B316quarter2 +A326halfup2 +C1426halfup2 +F1426halfup2 +2 + + +C1531half21 +3 +2 +F1235halfdown52 +3 +B316quarter2 +A326halfup52 +C1426halfup32 +F1426halfup12 +2 + + +F1531half51 +3 +2 +B135halfdown52 +3 +B316quarter2 +B326halfup52 +D426halfup32 +F1426halfup12 +2 + + +1 +E431half11 +3 +2 +E235halfdown52 +3 +B316quarter2 +G326halfup32 +B326halfup12 +2 + + +E431half1 +3 +2 +E235halfdown52 +3 +B316quarter2 +B326halfup52 +D426halfup32 +G426halfup12 +2 + + +E431half1 +3 +2 +D235halfdown52 +3 +B316quarter2 +F326halfnaturalup52 +A326halfup32 +D426halfup12 +2 + + +1 +A411quarter11 +B411quarter21 +C511quarternatural31 +3 +2 +A135halfdown52 +3 +B316quarter2 +

2 +A326halfup52 +C426halfnaturalup32 +E426halfup12 +2 + + +E511quarter51 +D511quarter41 +B411quarter21 +3 +2 +D235halfdown52 +3 +B316quarter2 +G326halfup52 +B326halfup32 +E426halfup12 +2 + + +D511quarter41 +C511quarternatural31 +1 +B411quarter21 +3 +2 +D235halfdown52 +3 +B316quarter2 +D326halfup52 +G326halfup32 +B326halfup22 +E426halfup12 +2 + + +1 +D531half41 +3 +2 +D235halfdown52 +3 +B316quarter2 +C326halfnaturalup52 +E326halfup42 +A326halfup22 +D426halfup12 +2 + + +1 +D521half1 +1 +D511quarter11 +3 +2 +D235halfdown52 +3 +B316quarter2 +C326halfnaturalup52 +F1326halfup32 +A326halfup22 +D426halfup12 +2 + + +E511quarter21 +F511quarternatural31 +G511quarter41 +3 +2 +D235halfdown52 +3 +B316quarter2 +A326halfup52 +C426halfnaturalup32 +F426halfnaturalup12 +2 + + +A511quarter51 +C511quarternatural11 +1 +D511quarter21 +3 +2 +D235halfdown52 +3 +B316quarter2 +A326halfup52 +C426halfnaturalup32 +E426halfup12 +2 + + +1 +E511quarter31 +D511quarter21 +B411quarter11 +3 +2 +D235halfdown52 +3 +B316quarter2 +D326halfup52 +G326halfup32 +B326halfup22 +E426halfup12 +2 + + +1 +D531half21 +3 +2 +D235halfdown52 +3 +B316quarter2 +C326halfnaturalup52 +E326halfup42 +A326halfup22 +D426halfup12 +2 + + +D521half1 +D511quarter11 +3 +2 +D235halfdown52 +3 +B316quarter2 +C326halfnaturalup52 +F1326halfup32 +A326halfup22 +D426halfup12 +2 + + +1 +G531half51 +3 +2 +E235halfdown52 +3 +B316quarter2 +B326halfup52 +E426halfup22 +G426halfup12 +2 + + +1 +F531halfnatural41 +3 +2 +E235halfdown52 +3 +B316quarter2 +A326halfup52 +D426halfup32 +F426halfnaturalup22 +A426halfup12 +2 + + +B411quarter11 +C511quarternatural21 +F511quarternatural51 +3 +2 +E235halfdown52 +3 +B316quarter2 +A326halfup52 +C426halfnaturalup32 +F426halfnaturalup12 +2 + + +E511quarter41 +D511quarter31 +C511quarternatural21 +3 +2 +E235halfdown52 +3 +B316quarter2 +C426halfnaturalup52 +E426halfup32 +A426halfup12 +2 + + +E511quarter41 +D511quarter31 +1 +C511quarternatural21 +3 +2 +E235halfdown52 +3 +B316quarter2 +A326halfup52 +C426halfnaturalup42 +F426halfnaturalup22 +A426halfup12 +2 + + +F431halfnaturalup51 +3 +C412quarter1 +A312quarterup11 +D412quarterup31 +B312quarterup11 +D412quarterup21 +G412quarterup51 +3 +2 +E235halfdown52 +3 +B316quarter2 +B216quarterup22 +E316quarterup12 +2 + + +C431halfnatural11 +E431half21 +A431half41 +C531halfnatural51 +3 +2 +A235half52 +G335half12 +2 + + +1 +D431half11 +F431halfnatural21 +A431half31 +D531half51 +3 +2 +D235half52 +A235half22 +D335half12 +2 +light-heavy + + diff --git a/src/core/content/songs.ts b/src/core/content/songs.ts index fe01d7e..3d8edcc 100644 --- a/src/core/content/songs.ts +++ b/src/core/content/songs.ts @@ -1,4 +1,5 @@ import furEliseFullXml from './scores/fur-elise-full.musicxml?raw'; +import gymnopedieFullXml from './scores/gymnopedie-1-full.musicxml?raw'; /** * Built-in songs: compositions in the public domain, arranged by the OpenKeys project @@ -170,13 +171,15 @@ export const BUILT_IN_SONGS: BuiltInSong[] = [ }, { id: 'gymnopedie', - title: 'Gymnopédie No. 1 (opening)', + title: 'Gymnopédie No. 1', composer: 'Erik Satie', - blurb: 'Slow and calm; let the chords ring.', + blurb: 'Easy is the opening; let the chords ring. Full is the whole piece, fingered and pedalled.', tags: ['intermediate', 'D major', '3/4'], easy: H('Gymnopédie No. 1 (opening)', 'C:Erik Satie\nM:3/4\nL:1/4\nQ:1/4=72\nK:D\n') + `V:1 clef=treble\nz3 | z3 | z3 | z3 | !p!z f a | g f c | B c d | A3 | F3- | F3 | z f a | g f c | B c d | A3 | c3 | e3 |]\n` + `V:2 clef=bass\nG,, [B,DF]2 | D,, [A,CF]2 | G,, [B,DF]2 | D,, [A,CF]2 | G,, [B,DF]2 | D,, [A,CF]2 | G,, [B,DF]2 | D,, [A,CF]2 | G,, [B,DF]2 | D,, [A,CF]2 | G,, [B,DF]2 | D,, [A,CF]2 | G,, [B,DF]2 | D,, [A,CF]2 | G,, [B,DF]2 | D,, [A,CF]2 |]\n`, + fullMusicXml: gymnopedieFullXml, + fullLicense: 'Public-domain composition and Mutopia Project edition; fingering and pedalling © OpenKeys contributors, CC0', }, { id: 'canon', diff --git a/tests/score/songs-musicxml.test.ts b/tests/score/songs-musicxml.test.ts index f3678d1..5932bca 100644 --- a/tests/score/songs-musicxml.test.ts +++ b/tests/score/songs-musicxml.test.ts @@ -35,4 +35,16 @@ describe('bundled MusicXML full versions', () => { expect(s.measures.length).toBeGreaterThan(100); expect(s.notes.filter((n) => n.finger).length).toBeGreaterThan(100); }); + + it('Gymnopédie No. 1 has all 78 bars, fingered and pedalled, with the chords in the left hand', () => { + const s = builtInScore(BUILT_IN_SONGS.find((x) => x.id === 'gymnopedie')!, 'full'); + expect(s.measures.length).toBe(78); + expect(s.notes.filter((n) => n.finger).length).toBeGreaterThan(300); + expect(s.pedal?.length).toBeGreaterThan(100); + // Bar 1: low G and the B–D–F♯ chord are both left hand; the melody enters in bar 5. + const bar1 = s.notes.filter((n) => n.startBeat < 3).map((n) => [n.midi, n.hand]); + expect(bar1).toEqual(expect.arrayContaining([[43, 'L'], [59, 'L'], [62, 'L'], [66, 'L']])); + expect(bar1.every(([, h]) => h === 'L')).toBe(true); + expect(s.notes.find((n) => n.hand === 'R')?.midi).toBe(78); + }); });