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); + }); });