-
+
+
);
}
diff --git a/src/data/builtin.packed.json b/src/data/builtin.packed.json
new file mode 100644
index 0000000..a9f417a
--- /dev/null
+++ b/src/data/builtin.packed.json
@@ -0,0 +1,12374 @@
+{
+ "version": 1,
+ "notes": [
+ {
+ "degree": 1,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 1,
+ "hole": 4,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 5,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 1,
+ "hole": 6,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 6,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 1,
+ "hole": 6,
+ "breath": "draw",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 5,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 2,
+ "hole": 6,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 4,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 1,
+ "hole": 5,
+ "breath": "draw",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 3,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 1,
+ "hole": 5,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 2,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 1,
+ "hole": 4,
+ "breath": "draw",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 1,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 2,
+ "hole": 4,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 2,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 2,
+ "hole": 4,
+ "breath": "draw",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 3,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 1,
+ "dotted": true,
+ "hole": 5,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 2,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.5,
+ "hole": 4,
+ "breath": "draw",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 2,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 1,
+ "dotted": true,
+ "hole": 4,
+ "breath": "draw",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 1,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.5,
+ "hole": 4,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 3,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.5,
+ "hole": 5,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 4,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.5,
+ "hole": 5,
+ "breath": "draw",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 5,
+ "accidental": 0,
+ "octave": 0,
+ "beats": 1,
+ "hole": 3,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 3,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 1,
+ "tie": true,
+ "hole": 5,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 5,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.5,
+ "hole": 6,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 1,
+ "accidental": 0,
+ "octave": 2,
+ "beats": 2,
+ "hole": 7,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 1,
+ "accidental": 0,
+ "octave": 2,
+ "beats": 1,
+ "hole": 7,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 0,
+ "accidental": 0,
+ "octave": 0,
+ "beats": 1,
+ "hole": null,
+ "breath": null,
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 1,
+ "accidental": 0,
+ "octave": 2,
+ "beats": 1,
+ "dotted": true,
+ "hole": 7,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 7,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.5,
+ "hole": 7,
+ "breath": "draw",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 4,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 1,
+ "dotted": true,
+ "hole": 5,
+ "breath": "draw",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 7,
+ "accidental": 0,
+ "octave": 0,
+ "beats": 0.5,
+ "hole": 3,
+ "breath": "draw",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 7,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 1,
+ "hole": 7,
+ "breath": "draw",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 6,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.5,
+ "hole": 6,
+ "breath": "draw",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 1,
+ "accidental": 0,
+ "octave": 2,
+ "beats": 0.5,
+ "hole": 7,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 1,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 1,
+ "dotted": true,
+ "hole": 4,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 6,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 3,
+ "hole": 6,
+ "breath": "draw",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 5,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 1,
+ "dotted": true,
+ "hole": 6,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 6,
+ "accidental": 0,
+ "octave": 0,
+ "beats": 0.5,
+ "hole": 3,
+ "breath": "draw",
+ "bend": 2,
+ "overblow": false
+ },
+ {
+ "degree": 6,
+ "accidental": 0,
+ "octave": 0,
+ "beats": 1,
+ "hole": 3,
+ "breath": "draw",
+ "bend": 2,
+ "overblow": false
+ },
+ {
+ "degree": 1,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 3,
+ "hole": 4,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 6,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 2,
+ "hole": 6,
+ "breath": "draw",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 7,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 1,
+ "dotted": true,
+ "hole": 7,
+ "breath": "draw",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 2,
+ "accidental": 0,
+ "octave": 2,
+ "beats": 0.5,
+ "hole": 8,
+ "breath": "draw",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 1,
+ "accidental": 0,
+ "octave": 2,
+ "beats": 3,
+ "hole": 7,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 2,
+ "accidental": 0,
+ "octave": 0,
+ "beats": 0.5,
+ "hole": 3,
+ "breath": "draw",
+ "bend": 2,
+ "overblow": false
+ },
+ {
+ "degree": 3,
+ "accidental": -1,
+ "octave": 0,
+ "beats": 0.5,
+ "hole": 3,
+ "breath": "draw",
+ "bend": 1,
+ "overblow": false
+ },
+ {
+ "degree": 1,
+ "accidental": 0,
+ "octave": 0,
+ "beats": 0.5,
+ "hole": 3,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 4,
+ "accidental": 0,
+ "octave": 0,
+ "beats": 0.5,
+ "hole": 4,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 5,
+ "accidental": -1,
+ "octave": 0,
+ "beats": 0.5,
+ "hole": 4,
+ "breath": "draw",
+ "bend": 1,
+ "overblow": false
+ },
+ {
+ "degree": 1,
+ "accidental": 0,
+ "octave": 0,
+ "beats": 2,
+ "hole": 3,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 2,
+ "accidental": 0,
+ "octave": 0,
+ "beats": 2,
+ "hole": 3,
+ "breath": "draw",
+ "bend": 2,
+ "overblow": false
+ },
+ {
+ "degree": 5,
+ "accidental": 0,
+ "octave": 0,
+ "beats": 0.5,
+ "hole": 4,
+ "breath": "draw",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 3,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 2,
+ "hole": 5,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 3,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 4,
+ "hole": 5,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 4,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 2,
+ "hole": 5,
+ "breath": "draw",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 1,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 4,
+ "hole": 4,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 1,
+ "accidental": 0,
+ "octave": 0,
+ "beats": 1,
+ "hole": 1,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 2,
+ "accidental": 0,
+ "octave": 0,
+ "beats": 1,
+ "hole": 1,
+ "breath": "draw",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 3,
+ "accidental": 0,
+ "octave": 0,
+ "beats": 1,
+ "hole": 2,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 4,
+ "accidental": 0,
+ "octave": 0,
+ "beats": 1,
+ "hole": 2,
+ "breath": "draw",
+ "bend": 2,
+ "overblow": false
+ },
+ {
+ "degree": 5,
+ "accidental": 0,
+ "octave": 0,
+ "beats": 4,
+ "hole": 3,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 3,
+ "accidental": 0,
+ "octave": 0,
+ "beats": 4,
+ "hole": 2,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 2,
+ "accidental": 0,
+ "octave": 0,
+ "beats": 4,
+ "hole": 1,
+ "breath": "draw",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 1,
+ "accidental": 0,
+ "octave": 0,
+ "beats": 4,
+ "hole": 1,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 5,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 1,
+ "dotted": true,
+ "tie": true,
+ "hole": 6,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 0,
+ "accidental": 0,
+ "octave": 0,
+ "beats": 0.5,
+ "hole": null,
+ "breath": null,
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 7,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 2,
+ "hole": 7,
+ "breath": "draw",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 2,
+ "accidental": 0,
+ "octave": 2,
+ "beats": 1,
+ "hole": 8,
+ "breath": "draw",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 5,
+ "accidental": 0,
+ "octave": 2,
+ "beats": 1,
+ "hole": 9,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 3,
+ "accidental": 0,
+ "octave": 2,
+ "beats": 1,
+ "hole": 8,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 4,
+ "accidental": 0,
+ "octave": 2,
+ "beats": 0.5,
+ "hole": 9,
+ "breath": "draw",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 5,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.5,
+ "dotted": true,
+ "hole": 6,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 6,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.25,
+ "hole": 6,
+ "breath": "draw",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 2,
+ "accidental": 0,
+ "octave": 2,
+ "beats": 0.25,
+ "dotted": true,
+ "hole": 8,
+ "breath": "draw",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 7,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.125,
+ "hole": 7,
+ "breath": "draw",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 1,
+ "accidental": 0,
+ "octave": 2,
+ "beats": 0.25,
+ "hole": 7,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 5,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.25,
+ "hole": 6,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 1,
+ "accidental": 0,
+ "octave": 2,
+ "beats": 0.5,
+ "dotted": true,
+ "hole": 7,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 7,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.25,
+ "hole": 7,
+ "breath": "draw",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 4,
+ "accidental": 0,
+ "octave": 2,
+ "beats": 0.5,
+ "dotted": true,
+ "hole": 9,
+ "breath": "draw",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 2,
+ "accidental": 0,
+ "octave": 2,
+ "beats": 0.25,
+ "hole": 8,
+ "breath": "draw",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 4,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.25,
+ "hole": 5,
+ "breath": "draw",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 1,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 1,
+ "dotted": true,
+ "tie": true,
+ "hole": 4,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 5,
+ "accidental": 0,
+ "octave": 0,
+ "beats": 2,
+ "hole": 3,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 5,
+ "accidental": 0,
+ "octave": 0,
+ "beats": 1,
+ "dotted": true,
+ "hole": 3,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 5,
+ "accidental": 0,
+ "octave": 0,
+ "beats": 0.5,
+ "hole": 3,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 3,
+ "accidental": 0,
+ "octave": 2,
+ "beats": 0.5,
+ "hole": 8,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 6,
+ "accidental": 0,
+ "octave": 0,
+ "beats": 2,
+ "hole": 3,
+ "breath": "draw",
+ "bend": 2,
+ "overblow": false
+ },
+ {
+ "degree": 5,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 1,
+ "tie": true,
+ "hole": 6,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 4,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 1,
+ "tie": true,
+ "hole": 5,
+ "breath": "draw",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 1,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.25,
+ "hole": 4,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 2,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.25,
+ "hole": 4,
+ "breath": "draw",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 1,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.5,
+ "dotted": true,
+ "hole": 4,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 7,
+ "accidental": 0,
+ "octave": 0,
+ "beats": 0.25,
+ "hole": 3,
+ "breath": "draw",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 6,
+ "accidental": 0,
+ "octave": 0,
+ "beats": 0.25,
+ "hole": 3,
+ "breath": "draw",
+ "bend": 2,
+ "overblow": false
+ },
+ {
+ "degree": 0,
+ "accidental": 0,
+ "octave": 0,
+ "beats": 0.25,
+ "hole": null,
+ "breath": null,
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 5,
+ "accidental": 0,
+ "octave": 0,
+ "beats": 0.25,
+ "hole": 3,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 4,
+ "accidental": 0,
+ "octave": 0,
+ "beats": 0.25,
+ "hole": 2,
+ "breath": "draw",
+ "bend": 2,
+ "overblow": false
+ },
+ {
+ "degree": 4,
+ "accidental": 0,
+ "octave": 0,
+ "beats": 0.5,
+ "hole": 2,
+ "breath": "draw",
+ "bend": 2,
+ "overblow": false
+ },
+ {
+ "degree": 2,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.5,
+ "dotted": true,
+ "hole": 4,
+ "breath": "draw",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 6,
+ "accidental": 0,
+ "octave": 0,
+ "beats": 0.5,
+ "dotted": true,
+ "hole": 3,
+ "breath": "draw",
+ "bend": 2,
+ "overblow": false
+ },
+ {
+ "degree": 5,
+ "accidental": 0,
+ "octave": 0,
+ "beats": 0.5,
+ "dotted": true,
+ "hole": 3,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 3,
+ "accidental": 0,
+ "octave": 0,
+ "beats": 0.5,
+ "dotted": true,
+ "hole": 2,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 3,
+ "accidental": 0,
+ "octave": 0,
+ "beats": 2,
+ "tie": true,
+ "hole": 2,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 7,
+ "accidental": 0,
+ "octave": 0,
+ "beats": 1,
+ "hole": 3,
+ "breath": "draw",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 2,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 3,
+ "tie": true,
+ "hole": 4,
+ "breath": "draw",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 1,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 3,
+ "tie": true,
+ "hole": 4,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 5,
+ "accidental": 0,
+ "octave": 0,
+ "beats": 3,
+ "hole": 3,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 6,
+ "accidental": 0,
+ "octave": 0,
+ "beats": 3,
+ "hole": 3,
+ "breath": "draw",
+ "bend": 2,
+ "overblow": false
+ },
+ {
+ "degree": 3,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 3,
+ "hole": 5,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 3,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.5,
+ "dotted": true,
+ "hole": 5,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 3,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.25,
+ "hole": 5,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 2,
+ "accidental": 0,
+ "octave": 2,
+ "beats": 0.5,
+ "dotted": true,
+ "hole": 8,
+ "breath": "draw",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 4,
+ "accidental": 0,
+ "octave": 0,
+ "beats": 0.5,
+ "dotted": true,
+ "hole": 2,
+ "breath": "draw",
+ "bend": 2,
+ "overblow": false
+ },
+ {
+ "degree": 3,
+ "accidental": 0,
+ "octave": 0,
+ "beats": 0.5,
+ "hole": 2,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 4,
+ "accidental": 1,
+ "octave": 0,
+ "beats": 0.25,
+ "hole": 2,
+ "breath": "draw",
+ "bend": 1,
+ "overblow": false
+ },
+ {
+ "degree": 2,
+ "accidental": 0,
+ "octave": 0,
+ "beats": 0.5,
+ "hole": 1,
+ "breath": "draw",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 3,
+ "accidental": 0,
+ "octave": 0,
+ "beats": 0.25,
+ "hole": 2,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 1,
+ "accidental": 0,
+ "octave": 0,
+ "beats": 0.5,
+ "hole": 1,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 5,
+ "accidental": 0,
+ "octave": 0,
+ "beats": 1,
+ "dotted": true,
+ "tie": true,
+ "hole": 3,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 3,
+ "accidental": 0,
+ "octave": 0,
+ "beats": 1,
+ "dotted": true,
+ "hole": 2,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 1,
+ "accidental": 0,
+ "octave": 0,
+ "beats": 1,
+ "dotted": true,
+ "hole": 1,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 1,
+ "accidental": 1,
+ "octave": 0,
+ "beats": 0.5,
+ "hole": 1,
+ "breath": "draw",
+ "bend": 1,
+ "overblow": false
+ },
+ {
+ "degree": 4,
+ "accidental": 1,
+ "octave": 0,
+ "beats": 0.5,
+ "hole": 2,
+ "breath": "draw",
+ "bend": 1,
+ "overblow": false
+ },
+ {
+ "degree": 4,
+ "accidental": 0,
+ "octave": 0,
+ "beats": 0.5,
+ "graceNotes": [
+ {
+ "degree": 5,
+ "accidental": 0,
+ "octave": 0,
+ "beats": 0.25,
+ "hole": 3,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ }
+ ],
+ "hole": 2,
+ "breath": "draw",
+ "bend": 2,
+ "overblow": false
+ },
+ {
+ "degree": 1,
+ "accidental": 0,
+ "octave": 0,
+ "beats": 1,
+ "hole": 3,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 3,
+ "accidental": 0,
+ "octave": 0,
+ "beats": 0.5,
+ "hole": 3,
+ "breath": "draw",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 5,
+ "accidental": 0,
+ "octave": 0,
+ "beats": 1,
+ "hole": 4,
+ "breath": "draw",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 7,
+ "accidental": -1,
+ "octave": 0,
+ "beats": 1,
+ "hole": 5,
+ "breath": "draw",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 3,
+ "accidental": 0,
+ "octave": 0,
+ "beats": 1,
+ "hole": 3,
+ "breath": "draw",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 0,
+ "accidental": 0,
+ "octave": 0,
+ "beats": 2,
+ "hole": null,
+ "breath": null,
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 4,
+ "accidental": 0,
+ "octave": 0,
+ "beats": 1,
+ "hole": 4,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 7,
+ "accidental": -1,
+ "octave": 0,
+ "beats": 0.5,
+ "hole": 5,
+ "breath": "draw",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 1,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 1,
+ "hole": 6,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 4,
+ "accidental": 0,
+ "octave": 0,
+ "beats": 2,
+ "hole": 4,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 1,
+ "accidental": 0,
+ "octave": 0,
+ "beats": 3,
+ "hole": 3,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 3,
+ "accidental": -1,
+ "octave": 0,
+ "beats": 1,
+ "hole": 3,
+ "breath": "draw",
+ "bend": 1,
+ "overblow": false
+ },
+ {
+ "degree": 5,
+ "accidental": -1,
+ "octave": 0,
+ "beats": 1,
+ "hole": 4,
+ "breath": "draw",
+ "bend": 1,
+ "overblow": false
+ },
+ {
+ "degree": 1,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 2,
+ "hole": 6,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 2,
+ "accidental": 0,
+ "octave": 2,
+ "beats": 0.5,
+ "ornament": {
+ "kind": "upper-mordent",
+ "auxiliary": {
+ "degree": 3,
+ "accidental": 0,
+ "octave": 2,
+ "hole": 8,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ }
+ },
+ "hole": 8,
+ "breath": "draw",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 1,
+ "accidental": 0,
+ "octave": 2,
+ "beats": 2,
+ "graceNotes": [
+ {
+ "degree": 6,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.25,
+ "hole": 6,
+ "breath": "draw",
+ "bend": 0,
+ "overblow": false
+ }
+ ],
+ "hole": 7,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 3,
+ "accidental": 0,
+ "octave": 2,
+ "beats": 0.5,
+ "dotted": true,
+ "hole": 8,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 3,
+ "accidental": 0,
+ "octave": 2,
+ "beats": 0.25,
+ "hole": 8,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 6,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.5,
+ "dotted": true,
+ "graceNotes": [
+ {
+ "degree": 1,
+ "accidental": 0,
+ "octave": 2,
+ "beats": 0.25,
+ "hole": 7,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ }
+ ],
+ "hole": 6,
+ "breath": "draw",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 6,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.5,
+ "dotted": true,
+ "hole": 6,
+ "breath": "draw",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 7,
+ "accidental": 0,
+ "octave": 0,
+ "beats": 1,
+ "dotted": true,
+ "hole": 3,
+ "breath": "draw",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 6,
+ "accidental": 0,
+ "octave": 0,
+ "beats": 2,
+ "tie": true,
+ "hole": 3,
+ "breath": "draw",
+ "bend": 2,
+ "overblow": false
+ },
+ {
+ "degree": 3,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.25,
+ "dotted": true,
+ "hole": 5,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 5,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.125,
+ "hole": 6,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 3,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 1,
+ "graceNotes": [
+ {
+ "degree": 2,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.5,
+ "hole": 4,
+ "breath": "draw",
+ "bend": 0,
+ "overblow": false
+ }
+ ],
+ "hole": 5,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 6,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.5,
+ "tie": true,
+ "hole": 6,
+ "breath": "draw",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 5,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.25,
+ "tie": true,
+ "hole": 6,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 2,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 2,
+ "graceNotes": [
+ {
+ "degree": 3,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.5,
+ "hole": 5,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ }
+ ],
+ "hole": 4,
+ "breath": "draw",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 5,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.5,
+ "tie": true,
+ "hole": 6,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 3,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.25,
+ "tie": true,
+ "hole": 5,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 2,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.25,
+ "dotted": true,
+ "hole": 4,
+ "breath": "draw",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 3,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.125,
+ "hole": 5,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 5,
+ "accidental": 0,
+ "octave": 0,
+ "beats": 2,
+ "graceNotes": [
+ {
+ "degree": 6,
+ "accidental": 0,
+ "octave": 0,
+ "beats": 0.5,
+ "hole": 3,
+ "breath": "draw",
+ "bend": 2,
+ "overblow": false
+ }
+ ],
+ "hole": 3,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 6,
+ "accidental": 0,
+ "octave": 0,
+ "beats": 1,
+ "dotted": true,
+ "hole": 3,
+ "breath": "draw",
+ "bend": 2,
+ "overblow": false
+ },
+ {
+ "degree": 1,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.25,
+ "dotted": true,
+ "hole": 4,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 2,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.125,
+ "hole": 4,
+ "breath": "draw",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 2,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 3,
+ "hole": 4,
+ "breath": "draw",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 7,
+ "accidental": 0,
+ "octave": 0,
+ "beats": 2,
+ "hole": 3,
+ "breath": "draw",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 2,
+ "accidental": 0,
+ "octave": 2,
+ "beats": 3,
+ "hole": 8,
+ "breath": "draw",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 5,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 3,
+ "hole": 6,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 3,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 3,
+ "tie": true,
+ "hole": 5,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 4,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 1,
+ "dotted": true,
+ "tie": true,
+ "hole": 5,
+ "breath": "draw",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 6,
+ "accidental": -1,
+ "octave": 0,
+ "beats": 0.5,
+ "hole": 3,
+ "breath": "draw",
+ "bend": 3,
+ "overblow": false
+ },
+ {
+ "degree": 1,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 2,
+ "tie": true,
+ "hole": 4,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 3,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.5,
+ "tie": true,
+ "hole": 5,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 2,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.5,
+ "tie": true,
+ "hole": 4,
+ "breath": "draw",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 3,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 1,
+ "graceNotes": [
+ {
+ "degree": 6,
+ "accidental": 0,
+ "octave": 0,
+ "beats": 0.5,
+ "hole": 3,
+ "breath": "draw",
+ "bend": 2,
+ "overblow": false
+ }
+ ],
+ "hole": 5,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 6,
+ "accidental": 0,
+ "octave": 0,
+ "beats": 4,
+ "graceNotes": [
+ {
+ "degree": 1,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.25,
+ "hole": 4,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 2,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.25,
+ "hole": 4,
+ "breath": "draw",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 1,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.25,
+ "hole": 4,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ }
+ ],
+ "hole": 3,
+ "breath": "draw",
+ "bend": 2,
+ "overblow": false
+ },
+ {
+ "degree": 3,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 1,
+ "fermata": true,
+ "graceNotes": [
+ {
+ "degree": 6,
+ "accidental": 0,
+ "octave": 0,
+ "beats": 0.5,
+ "hole": 3,
+ "breath": "draw",
+ "bend": 2,
+ "overblow": false
+ }
+ ],
+ "hole": 5,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 6,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 1,
+ "dotted": true,
+ "hole": 6,
+ "breath": "draw",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 5,
+ "accidental": 0,
+ "octave": -1,
+ "beats": 1,
+ "hole": 1,
+ "breath": "draw",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 2,
+ "accidental": 0,
+ "octave": 0,
+ "beats": 1,
+ "hole": 3,
+ "breath": "draw",
+ "bend": 2,
+ "overblow": false
+ },
+ {
+ "degree": 7,
+ "accidental": 0,
+ "octave": -1,
+ "beats": 1,
+ "hole": 2,
+ "breath": "draw",
+ "bend": 1,
+ "overblow": false
+ },
+ {
+ "degree": 7,
+ "accidental": 0,
+ "octave": -1,
+ "beats": 0.5,
+ "hole": 2,
+ "breath": "draw",
+ "bend": 1,
+ "overblow": false
+ },
+ {
+ "degree": 6,
+ "accidental": 0,
+ "octave": -1,
+ "beats": 1,
+ "hole": 2,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 4,
+ "accidental": 0,
+ "octave": -1,
+ "beats": 1,
+ "hole": 1,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 6,
+ "accidental": 0,
+ "octave": 0,
+ "beats": 0.5,
+ "hole": 5,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 4,
+ "accidental": 1,
+ "octave": 0,
+ "beats": 1,
+ "hole": 4,
+ "breath": "draw",
+ "bend": 1,
+ "overblow": false
+ },
+ {
+ "degree": 5,
+ "accidental": 0,
+ "octave": 0,
+ "beats": 2,
+ "hole": 4,
+ "breath": "draw",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 6,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 2,
+ "fermata": true,
+ "hole": 6,
+ "breath": "draw",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 2,
+ "accidental": 0,
+ "octave": 2,
+ "beats": 1,
+ "dotted": true,
+ "fermata": true,
+ "hole": 8,
+ "breath": "draw",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 6,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 1,
+ "dotted": true,
+ "tie": true,
+ "hole": 6,
+ "breath": "draw",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 6,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 1,
+ "fermata": true,
+ "hole": 6,
+ "breath": "draw",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 6,
+ "accidental": 0,
+ "octave": 0,
+ "beats": 2,
+ "fermata": true,
+ "hole": 3,
+ "breath": "draw",
+ "bend": 2,
+ "overblow": false
+ },
+ {
+ "degree": 6,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 1,
+ "dotted": true,
+ "fermata": true,
+ "hole": 6,
+ "breath": "draw",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 2,
+ "accidental": 0,
+ "octave": 2,
+ "beats": 1,
+ "dotted": true,
+ "hole": 8,
+ "breath": "draw",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 6,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 4,
+ "hole": 6,
+ "breath": "draw",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 3,
+ "accidental": 0,
+ "octave": 2,
+ "beats": 2,
+ "hole": 8,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 5,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 3,
+ "tie": true,
+ "hole": 6,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 4,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 3,
+ "tie": true,
+ "hole": 5,
+ "breath": "draw",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 4,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 3,
+ "hole": 5,
+ "breath": "draw",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 1,
+ "accidental": 0,
+ "octave": 2,
+ "beats": 3,
+ "tie": true,
+ "hole": 7,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 4,
+ "accidental": 0,
+ "octave": 2,
+ "beats": 1,
+ "dotted": true,
+ "hole": 9,
+ "breath": "draw",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 3,
+ "accidental": 0,
+ "octave": 2,
+ "beats": 1,
+ "dotted": true,
+ "hole": 8,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 4,
+ "accidental": 0,
+ "octave": 2,
+ "beats": 1,
+ "hole": 9,
+ "breath": "draw",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 2,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 1,
+ "dotted": true,
+ "tie": true,
+ "hole": 4,
+ "breath": "draw",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 5,
+ "accidental": 0,
+ "octave": 0,
+ "beats": 0.25,
+ "tie": true,
+ "hole": 3,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 2,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.25,
+ "tie": true,
+ "hole": 4,
+ "breath": "draw",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 3,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 1,
+ "fermata": true,
+ "hole": 5,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 4,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.5,
+ "dotted": true,
+ "hole": 5,
+ "breath": "draw",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 3,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 1,
+ "dotted": true,
+ "tie": true,
+ "hole": 5,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 7,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.5,
+ "dotted": true,
+ "hole": 7,
+ "breath": "draw",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 1,
+ "accidental": 0,
+ "octave": 2,
+ "beats": 1,
+ "fermata": true,
+ "hole": 7,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 1,
+ "accidental": 0,
+ "octave": 2,
+ "beats": 1,
+ "dotted": true,
+ "tie": true,
+ "hole": 7,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 6,
+ "accidental": 0,
+ "octave": 0,
+ "beats": 0.5,
+ "tie": true,
+ "hole": 3,
+ "breath": "draw",
+ "bend": 2,
+ "overblow": false
+ },
+ {
+ "degree": 5,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 2,
+ "articulation": "accent",
+ "hole": 6,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 1,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 2,
+ "articulation": "accent",
+ "hole": 4,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 1,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 4,
+ "articulation": "accent",
+ "graceNotes": [
+ {
+ "degree": 2,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.5,
+ "hole": 4,
+ "breath": "draw",
+ "bend": 0,
+ "overblow": false
+ }
+ ],
+ "hole": 4,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 1,
+ "accidental": 0,
+ "octave": 2,
+ "beats": 1,
+ "articulation": "tenuto",
+ "hole": 7,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 2,
+ "accidental": 0,
+ "octave": 2,
+ "beats": 1,
+ "articulation": "tenuto",
+ "hole": 8,
+ "breath": "draw",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 6,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 1,
+ "articulation": "tenuto",
+ "hole": 6,
+ "breath": "draw",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 5,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 4,
+ "articulation": "tenuto",
+ "hole": 6,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 4,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 1,
+ "articulation": "tenuto",
+ "hole": 5,
+ "breath": "draw",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 2,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 1,
+ "articulation": "tenuto",
+ "hole": 4,
+ "breath": "draw",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 1,
+ "accidental": 0,
+ "octave": 2,
+ "beats": 1,
+ "articulation": "accent",
+ "hole": 7,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 6,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 1,
+ "articulation": "accent",
+ "hole": 6,
+ "breath": "draw",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 4,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 1,
+ "articulation": "accent",
+ "hole": 5,
+ "breath": "draw",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 5,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 3,
+ "articulation": "tenuto",
+ "hole": 6,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 1,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 4,
+ "articulation": "tenuto",
+ "hole": 4,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 1,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 1,
+ "dotted": true,
+ "articulation": "tenuto",
+ "hole": 4,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 2,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.5,
+ "articulation": "tenuto",
+ "hole": 4,
+ "breath": "draw",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 1,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 1,
+ "articulation": "tenuto",
+ "hole": 4,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 6,
+ "accidental": 0,
+ "octave": 0,
+ "beats": 1,
+ "articulation": "tenuto",
+ "hole": 3,
+ "breath": "draw",
+ "bend": 2,
+ "overblow": false
+ },
+ {
+ "degree": 6,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 4,
+ "articulation": "accent",
+ "hole": 6,
+ "breath": "draw",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 6,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 2,
+ "articulation": "accent",
+ "hole": 6,
+ "breath": "draw",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 1,
+ "accidental": 0,
+ "octave": 2,
+ "beats": 4,
+ "tie": true,
+ "fermata": true,
+ "articulation": "accent",
+ "hole": 7,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 1,
+ "accidental": 0,
+ "octave": 2,
+ "beats": 4,
+ "hole": 7,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ }
+ ],
+ "scores": [
+ {
+ "id": "twinkle",
+ "title": "小星星",
+ "subtitle": "Twinkle Twinkle Little Star",
+ "composer": "法国童谣",
+ "key": "C",
+ "harmonicaKey": "C",
+ "position": "第一把位 (1st Position)",
+ "timeSignature": "4/4",
+ "tempo": 104,
+ "difficulty": 1,
+ "tags": [
+ "儿歌",
+ "入门"
+ ],
+ "source": "黄冈师范学院音乐学院所载吉他教材,印刷第 28 页 / PDF 第 32 页《闪烁的小星星》数字简谱",
+ "sourceUrl": "https://music.hgnu.edu.cn/_upload/article/files/09/d4/faf43ffb4e08b61cf64ee0adaf16/ec5df379-7cae-4b24-9ece-880a54ee478b.pdf",
+ "sourceFormat": "jianpu-image",
+ "sourceCheckedAt": "2026-10-23",
+ "builtin": true,
+ "order": 1,
+ "notes": "完整 12 小节逐行核对,旋律与节奏未改;由原谱 1=C 整体升八度至 C5–A5。吉他指法不录入,练习速度为编辑建议。",
+ "lines": [
+ [
+ {
+ "notes": [
+ 0,
+ 0,
+ 1,
+ 1
+ ]
+ },
+ {
+ "notes": [
+ 2,
+ 2,
+ 3
+ ]
+ },
+ {
+ "notes": [
+ 4,
+ 4,
+ 5,
+ 5
+ ]
+ },
+ {
+ "notes": [
+ 6,
+ 6,
+ 7
+ ]
+ }
+ ],
+ [
+ {
+ "notes": [
+ 1,
+ 1,
+ 4,
+ 4
+ ]
+ },
+ {
+ "notes": [
+ 5,
+ 5,
+ 8
+ ]
+ },
+ {
+ "notes": [
+ 1,
+ 1,
+ 4,
+ 4
+ ]
+ },
+ {
+ "notes": [
+ 5,
+ 5,
+ 8
+ ]
+ }
+ ],
+ [
+ {
+ "notes": [
+ 0,
+ 0,
+ 1,
+ 1
+ ]
+ },
+ {
+ "notes": [
+ 2,
+ 2,
+ 3
+ ]
+ },
+ {
+ "notes": [
+ 4,
+ 4,
+ 5,
+ 5
+ ]
+ },
+ {
+ "sectionEnd": true,
+ "notes": [
+ 6,
+ 6,
+ 7
+ ]
+ }
+ ]
+ ]
+ },
+ {
+ "id": "ode-to-joy",
+ "title": "欢乐颂",
+ "subtitle": "Ode to Joy · 贝多芬第九交响曲",
+ "composer": "贝多芬 曲",
+ "key": "C",
+ "harmonicaKey": "C",
+ "position": "第一把位 (1st Position)",
+ "timeSignature": "4/4",
+ "tempo": 108,
+ "difficulty": 1,
+ "tags": [
+ "古典",
+ "入门"
+ ],
+ "source": "新宁幼儿师范高等专科学校职业技能考试简谱《欢乐颂》(题目编号 1-3-3);应用内由 1=D 移调为 1=C",
+ "sourceUrl": "https://www.xnyesz.com/uploads/1/file/public/202311/20231115213157_md3qv5o7db.pdf",
+ "sourceFormat": "jianpu-image",
+ "sourceCheckedAt": "2026-10-23",
+ "builtin": true,
+ "order": 2,
+ "notes": "重新核对职业技能考试题 1-3-3,印刷第 105 页 / PDF 第 107 页全部 16 小节;补回第 12 小节低音 sol、末音与第 13 小节首音的同音延音,以及后八小节反复。1=D 移至 1=C 后整体升八度,歌词和异音连线不录入,速度为编辑建议。",
+ "lines": [
+ [
+ {
+ "notes": [
+ 5,
+ 5,
+ 4,
+ 1
+ ]
+ },
+ {
+ "notes": [
+ 1,
+ 4,
+ 5,
+ 6
+ ]
+ },
+ {
+ "notes": [
+ 0,
+ 0,
+ 6,
+ 5
+ ]
+ },
+ {
+ "notes": [
+ 9,
+ 10,
+ 8
+ ]
+ }
+ ],
+ [
+ {
+ "notes": [
+ 5,
+ 5,
+ 4,
+ 1
+ ]
+ },
+ {
+ "notes": [
+ 1,
+ 4,
+ 5,
+ 6
+ ]
+ },
+ {
+ "notes": [
+ 0,
+ 0,
+ 6,
+ 5
+ ]
+ },
+ {
+ "notes": [
+ 11,
+ 12,
+ 7
+ ]
+ }
+ ],
+ [
+ {
+ "repeatBegin": true,
+ "notes": [
+ 6,
+ 6,
+ 5,
+ 0
+ ]
+ },
+ {
+ "notes": [
+ 6,
+ 13,
+ 14,
+ 5,
+ 0
+ ]
+ },
+ {
+ "notes": [
+ 6,
+ 13,
+ 14,
+ 5,
+ 6
+ ]
+ },
+ {
+ "notes": [
+ 0,
+ 6,
+ 15,
+ 16
+ ]
+ }
+ ],
+ [
+ {
+ "notes": [
+ 5,
+ 5,
+ 4,
+ 1
+ ]
+ },
+ {
+ "notes": [
+ 1,
+ 4,
+ 5,
+ 14,
+ 10
+ ]
+ },
+ {
+ "notes": [
+ 0,
+ 0,
+ 6,
+ 5
+ ]
+ },
+ {
+ "repeatEnd": true,
+ "notes": [
+ 11,
+ 12,
+ 7
+ ]
+ }
+ ]
+ ]
+ },
+ {
+ "id": "farewell",
+ "title": "送别",
+ "subtitle": "Dreaming of Home and Mother",
+ "composer": "J·P·奥德威 曲 / 李叔同 词",
+ "key": "C",
+ "harmonicaKey": "C",
+ "position": "第一把位 (1st Position)",
+ "timeSignature": "4/4",
+ "tempo": 72,
+ "difficulty": 2,
+ "tags": [
+ "民歌",
+ "经典"
+ ],
+ "source": "江阴市长泾实验小学所载《中国诗乐二十品》,印刷第 222 页 / PDF 第 238 页《送别》数字简谱",
+ "sourceUrl": "https://cxqx.jyc.edu.cn/__local/3/D5/71/B7A1BD225359A39D710C8C3021A_A9C90F62_167DC01.pdf",
+ "sourceFormat": "jianpu-image",
+ "sourceCheckedAt": "2026-10-23",
+ "builtin": true,
+ "order": 3,
+ "notes": "重新逐行核对完整 24 小节,全部音高与时值保持不变。原谱 1=降E(修正旧元数据误写的 E),移为 1=C 并升八度;只读数字简谱,歌词、伴奏与异音连线不录入,速度为编辑建议。",
+ "lines": [
+ [
+ {
+ "notes": [
+ 1,
+ 13,
+ 17,
+ 18
+ ]
+ },
+ {
+ "notes": [
+ 2,
+ 19,
+ 3
+ ]
+ },
+ {
+ "notes": [
+ 1,
+ 12,
+ 10,
+ 5,
+ 10,
+ 12
+ ]
+ },
+ {
+ "notes": [
+ 8,
+ 20,
+ 20
+ ]
+ }
+ ],
+ [
+ {
+ "notes": [
+ 1,
+ 13,
+ 17,
+ 21,
+ 22
+ ]
+ },
+ {
+ "notes": [
+ 2,
+ 19,
+ 3
+ ]
+ },
+ {
+ "notes": [
+ 1,
+ 10,
+ 13,
+ 23,
+ 24
+ ]
+ },
+ {
+ "notes": [
+ 7,
+ 20,
+ 20
+ ]
+ }
+ ],
+ [
+ {
+ "notes": [
+ 2,
+ 19,
+ 18
+ ]
+ },
+ {
+ "notes": [
+ 25,
+ 26,
+ 22,
+ 18
+ ]
+ },
+ {
+ "notes": [
+ 26,
+ 22,
+ 27,
+ 26,
+ 26,
+ 17,
+ 13,
+ 12
+ ]
+ },
+ {
+ "notes": [
+ 8,
+ 20,
+ 20
+ ]
+ }
+ ],
+ [
+ {
+ "notes": [
+ 1,
+ 13,
+ 17,
+ 21,
+ 22
+ ]
+ },
+ {
+ "notes": [
+ 2,
+ 19,
+ 3
+ ]
+ },
+ {
+ "notes": [
+ 1,
+ 10,
+ 13,
+ 23,
+ 24
+ ]
+ },
+ {
+ "notes": [
+ 7,
+ 20,
+ 20
+ ]
+ }
+ ],
+ [
+ {
+ "notes": [
+ 1,
+ 13,
+ 17,
+ 18
+ ]
+ },
+ {
+ "notes": [
+ 2,
+ 19,
+ 3
+ ]
+ },
+ {
+ "notes": [
+ 1,
+ 12,
+ 10,
+ 5,
+ 10,
+ 12
+ ]
+ },
+ {
+ "notes": [
+ 8,
+ 20,
+ 20
+ ]
+ }
+ ],
+ [
+ {
+ "notes": [
+ 1,
+ 13,
+ 17,
+ 21,
+ 22
+ ]
+ },
+ {
+ "notes": [
+ 2,
+ 19,
+ 3
+ ]
+ },
+ {
+ "notes": [
+ 1,
+ 10,
+ 13,
+ 23,
+ 24
+ ]
+ },
+ {
+ "sectionEnd": true,
+ "notes": [
+ 7,
+ 20,
+ 20
+ ]
+ }
+ ]
+ ]
+ },
+ {
+ "id": "auld-lang-syne",
+ "title": "友谊地久天长",
+ "subtitle": "Auld Lang Syne · 苏格兰民歌",
+ "composer": "苏格兰民歌",
+ "key": "C",
+ "harmonicaKey": "C",
+ "position": "第一把位",
+ "timeSignature": "4/4",
+ "tempo": 92,
+ "pickupBeats": 1,
+ "difficulty": 2,
+ "tags": [
+ "民歌",
+ "经典"
+ ],
+ "source": "音伴《吉他入门标准教程》简谱《友谊天长地久》;苏格兰公有领域民歌",
+ "sourceUrl": "https://www.yinban.com/a/yinban_Guitar_Course_20210412.pdf",
+ "sourceFormat": "jianpu-image",
+ "sourceCheckedAt": "2026-10-23",
+ "builtin": true,
+ "order": 4,
+ "notes": "重新核对教材 PDF 第 20 页全部 16 个完整小节及一拍弱起;移除旧版人为补入的三个休止拍,保留源谱末小节完整四拍(含末尾一拍休止)。整体升八度至 G4–C6,和弦、歌词及异音连线不录入,速度为编辑建议。",
+ "lines": [
+ [
+ {
+ "notes": [
+ 15
+ ]
+ },
+ {
+ "notes": [
+ 28,
+ 12,
+ 0,
+ 5
+ ]
+ },
+ {
+ "notes": [
+ 11,
+ 12,
+ 6,
+ 13,
+ 10
+ ]
+ },
+ {
+ "notes": [
+ 28,
+ 12,
+ 5,
+ 1
+ ]
+ },
+ {
+ "notes": [
+ 29,
+ 2
+ ]
+ }
+ ],
+ [
+ {
+ "notes": [
+ 30,
+ 13,
+ 5,
+ 0
+ ]
+ },
+ {
+ "notes": [
+ 11,
+ 12,
+ 6,
+ 13,
+ 10
+ ]
+ },
+ {
+ "notes": [
+ 28,
+ 31,
+ 32,
+ 15
+ ]
+ },
+ {
+ "notes": [
+ 33,
+ 2
+ ]
+ }
+ ],
+ [
+ {
+ "notes": [
+ 30,
+ 13,
+ 5,
+ 0
+ ]
+ },
+ {
+ "notes": [
+ 11,
+ 12,
+ 6,
+ 2
+ ]
+ },
+ {
+ "notes": [
+ 30,
+ 13,
+ 5,
+ 1
+ ]
+ },
+ {
+ "notes": [
+ 29,
+ 19
+ ]
+ }
+ ],
+ [
+ {
+ "notes": [
+ 30,
+ 13,
+ 5,
+ 0
+ ]
+ },
+ {
+ "notes": [
+ 11,
+ 12,
+ 6,
+ 13,
+ 10
+ ]
+ },
+ {
+ "notes": [
+ 28,
+ 31,
+ 32,
+ 15
+ ]
+ },
+ {
+ "sectionEnd": true,
+ "notes": [
+ 33,
+ 20
+ ]
+ }
+ ]
+ ]
+ },
+ {
+ "id": "sally-gardens",
+ "title": "爱尔兰画眉",
+ "subtitle": "Down by the Sally Gardens",
+ "composer": "爱尔兰民歌(叶芝 诗)",
+ "key": "C",
+ "harmonicaKey": "C",
+ "position": "第一把位",
+ "timeSignature": "4/4",
+ "tempo": 72,
+ "difficulty": 3,
+ "tags": [
+ "爱尔兰",
+ "民谣"
+ ],
+ "source": "Thornton Rose 的 SallyGardens.abc,第 X:2 首 Down by the Sally Gardens;John Chambers 镜像",
+ "sourceUrl": "https://trillian.mit.edu/~jc/music/abc/mirror/mindspring.com/~thornton.rose/SallyGardens.abc",
+ "sourceFormat": "music-text",
+ "sourceCheckedAt": "2026-10-23",
+ "builtin": true,
+ "order": 5,
+ "notes": "旧钢琴编配网页现不可读,改采用明确标注的传统单旋律 ABC 第 X:2 首,不拼接不同版本。17 小节含一拍弱起,三拍结尾与整曲反复保留;中间续句弱起并入前小节。D4 主音移为 C5,音域 C5–D6。与旧 25 小节钢琴展开版结构不同;和声、歌词、异音连线不录入,速度为编辑建议。",
+ "lines": [
+ [
+ {
+ "notes": [
+ 12,
+ 10
+ ]
+ },
+ {
+ "notes": [
+ 5,
+ 10,
+ 12,
+ 6,
+ 13,
+ 17
+ ]
+ },
+ {
+ "notes": [
+ 34,
+ 1,
+ 27,
+ 17
+ ]
+ },
+ {
+ "notes": [
+ 2,
+ 17,
+ 13,
+ 11,
+ 12
+ ]
+ }
+ ],
+ [
+ {
+ "notes": [
+ 33,
+ 12,
+ 10
+ ]
+ },
+ {
+ "notes": [
+ 5,
+ 10,
+ 12,
+ 6,
+ 13,
+ 17
+ ]
+ },
+ {
+ "notes": [
+ 34,
+ 1,
+ 27,
+ 17
+ ]
+ },
+ {
+ "notes": [
+ 2,
+ 17,
+ 13,
+ 11,
+ 12
+ ]
+ }
+ ],
+ [
+ {
+ "notes": [
+ 33,
+ 1
+ ]
+ },
+ {
+ "notes": [
+ 19,
+ 22,
+ 17,
+ 2,
+ 19
+ ]
+ },
+ {
+ "notes": [
+ 35,
+ 26,
+ 1,
+ 13,
+ 17
+ ]
+ },
+ {
+ "notes": [
+ 2,
+ 17,
+ 13,
+ 17,
+ 26,
+ 27,
+ 36
+ ]
+ }
+ ],
+ [
+ {
+ "notes": [
+ 37,
+ 12,
+ 10
+ ]
+ },
+ {
+ "notes": [
+ 5,
+ 10,
+ 12,
+ 6,
+ 13,
+ 17
+ ]
+ },
+ {
+ "notes": [
+ 34,
+ 1,
+ 27,
+ 17
+ ]
+ },
+ {
+ "notes": [
+ 2,
+ 17,
+ 13,
+ 11,
+ 12
+ ]
+ },
+ {
+ "repeatEnd": true,
+ "notes": [
+ 33
+ ]
+ }
+ ]
+ ]
+ },
+ {
+ "id": "blues-12bar",
+ "title": "12 小节布鲁斯练习曲",
+ "subtitle": "12-Bar Blues Etude in G",
+ "composer": "HarpScore 原创练习曲",
+ "key": "G",
+ "harmonicaKey": "C",
+ "position": "第二把位 (2nd Position / Cross Harp)",
+ "timeSignature": "4/4",
+ "tempo": 96,
+ "difficulty": 4,
+ "tags": [
+ "布鲁斯",
+ "压音",
+ "进阶"
+ ],
+ "source": "HarpScore 原创(可自由使用)",
+ "sourceFormat": "original",
+ "sourceCheckedAt": "2026-10-23",
+ "builtin": true,
+ "order": 6,
+ "notes": "C 调口琴第二把位奏 G 调的 12 小节原创单音练习,无和弦伴奏。2=A4 为 3 孔吸压全音,降3=Bb4 为 3 孔吸压半音,降5=Db5 为 4 孔吸压半音。谱面八分音符时值为等长;若按 swing/shuffle 演奏,其长短比例需另行指导,当前数据未记写三连音时值。",
+ "lines": [
+ [
+ {
+ "notes": [
+ 38,
+ 38,
+ 39,
+ 38,
+ 40,
+ 38,
+ 39,
+ 38
+ ]
+ },
+ {
+ "notes": [
+ 41,
+ 41,
+ 42,
+ 41,
+ 38,
+ 41,
+ 42,
+ 41
+ ]
+ },
+ {
+ "notes": [
+ 38,
+ 38,
+ 39,
+ 38,
+ 40,
+ 38,
+ 39,
+ 38
+ ]
+ },
+ {
+ "notes": [
+ 40,
+ 38,
+ 39,
+ 38,
+ 43
+ ]
+ }
+ ],
+ [
+ {
+ "notes": [
+ 41,
+ 41,
+ 42,
+ 41,
+ 41,
+ 41,
+ 42,
+ 41
+ ]
+ },
+ {
+ "notes": [
+ 41,
+ 41,
+ 42,
+ 41,
+ 44
+ ]
+ },
+ {
+ "notes": [
+ 38,
+ 38,
+ 39,
+ 38,
+ 40,
+ 38,
+ 39,
+ 38
+ ]
+ },
+ {
+ "notes": [
+ 40,
+ 38,
+ 39,
+ 38,
+ 43
+ ]
+ }
+ ],
+ [
+ {
+ "notes": [
+ 45,
+ 45,
+ 42,
+ 45,
+ 45,
+ 45,
+ 42,
+ 45
+ ]
+ },
+ {
+ "notes": [
+ 41,
+ 41,
+ 42,
+ 41,
+ 41,
+ 41,
+ 42,
+ 41
+ ]
+ },
+ {
+ "notes": [
+ 38,
+ 38,
+ 39,
+ 38,
+ 40,
+ 38,
+ 39,
+ 38
+ ]
+ },
+ {
+ "sectionEnd": true,
+ "notes": [
+ 45,
+ 41,
+ 39,
+ 38,
+ 43
+ ]
+ }
+ ]
+ ]
+ },
+ {
+ "id": "jingle-bells",
+ "title": "铃儿响叮当",
+ "subtitle": "Jingle Bells",
+ "composer": "James Pierpont(1857)",
+ "key": "C",
+ "harmonicaKey": "C",
+ "position": "第一把位",
+ "timeSignature": "4/4",
+ "tempo": 120,
+ "difficulty": 1,
+ "tags": [
+ "民歌",
+ "圣诞",
+ "入门"
+ ],
+ "source": "黄冈师范学院音乐学院吉他教材简谱《铃儿响叮当》;James Pierpont 公有领域旋律;印刷第 40 页 / PDF 第 44 页",
+ "sourceUrl": "https://music.hgnu.edu.cn/_upload/article/files/09/d4/faf43ffb4e08b61cf64ee0adaf16/ec5df379-7cae-4b24-9ece-880a54ee478b.pdf",
+ "sourceFormat": "jianpu-image",
+ "sourceCheckedAt": "2026-10-23",
+ "builtin": true,
+ "order": 7,
+ "notes": "逐行核对教材完整 16 小节简化副歌版,旋律、节奏不变;不是包含主歌的全曲。整体升八度,吉他指法不录入,速度为编辑建议。",
+ "lines": [
+ [
+ {
+ "notes": [
+ 5,
+ 5,
+ 46
+ ]
+ },
+ {
+ "notes": [
+ 5,
+ 5,
+ 46
+ ]
+ },
+ {
+ "notes": [
+ 5,
+ 1,
+ 0,
+ 6
+ ]
+ },
+ {
+ "notes": [
+ 47
+ ]
+ }
+ ],
+ [
+ {
+ "notes": [
+ 4,
+ 4,
+ 48
+ ]
+ },
+ {
+ "notes": [
+ 4,
+ 5,
+ 46
+ ]
+ },
+ {
+ "notes": [
+ 5,
+ 6,
+ 6,
+ 0
+ ]
+ },
+ {
+ "notes": [
+ 8,
+ 3
+ ]
+ }
+ ],
+ [
+ {
+ "notes": [
+ 5,
+ 5,
+ 46
+ ]
+ },
+ {
+ "notes": [
+ 5,
+ 5,
+ 46
+ ]
+ },
+ {
+ "notes": [
+ 5,
+ 1,
+ 0,
+ 6
+ ]
+ },
+ {
+ "notes": [
+ 47
+ ]
+ }
+ ],
+ [
+ {
+ "notes": [
+ 4,
+ 4,
+ 48
+ ]
+ },
+ {
+ "notes": [
+ 4,
+ 5,
+ 46
+ ]
+ },
+ {
+ "notes": [
+ 1,
+ 1,
+ 4,
+ 6
+ ]
+ },
+ {
+ "sectionEnd": true,
+ "notes": [
+ 49
+ ]
+ }
+ ]
+ ]
+ },
+ {
+ "id": "bend-etude",
+ "title": "压音入门练习曲",
+ "subtitle": "Bending Etude No.1",
+ "composer": "HarpScore 原创练习曲",
+ "key": "C",
+ "harmonicaKey": "C",
+ "position": "第一把位",
+ "timeSignature": "4/4",
+ "tempo": 80,
+ "difficulty": 3,
+ "tags": [
+ "练习曲",
+ "压音",
+ "原创"
+ ],
+ "source": "HarpScore 原创(可自由使用)",
+ "sourceFormat": "original",
+ "sourceCheckedAt": "2026-10-23",
+ "builtin": true,
+ "order": 8,
+ "notes": "C 调第一把位低音区练习,15 个 4/4 小节;F4 为 2 孔吸压全音,A4 为 3 孔吸压全音。全曲音域 C4–A4,按目标音高慢速练习;不包含动态压音释放的过程记谱。",
+ "lines": [
+ [
+ {
+ "notes": [
+ 50,
+ 51,
+ 52,
+ 53
+ ]
+ },
+ {
+ "notes": [
+ 15,
+ 53,
+ 52,
+ 51
+ ]
+ },
+ {
+ "notes": [
+ 50,
+ 51,
+ 52,
+ 53
+ ]
+ },
+ {
+ "notes": [
+ 54
+ ]
+ }
+ ],
+ [
+ {
+ "notes": [
+ 15,
+ 32,
+ 15,
+ 53
+ ]
+ },
+ {
+ "notes": [
+ 52,
+ 53,
+ 52,
+ 51
+ ]
+ },
+ {
+ "notes": [
+ 50,
+ 51,
+ 52,
+ 53
+ ]
+ },
+ {
+ "notes": [
+ 55
+ ]
+ }
+ ],
+ [
+ {
+ "notes": [
+ 32,
+ 15,
+ 53,
+ 52
+ ]
+ },
+ {
+ "notes": [
+ 51,
+ 52,
+ 53,
+ 15
+ ]
+ },
+ {
+ "notes": [
+ 32,
+ 15,
+ 53,
+ 52
+ ]
+ },
+ {
+ "notes": [
+ 56
+ ]
+ }
+ ],
+ [
+ {
+ "notes": [
+ 50,
+ 51,
+ 52,
+ 53
+ ]
+ },
+ {
+ "notes": [
+ 15,
+ 53,
+ 52,
+ 51
+ ]
+ },
+ {
+ "sectionEnd": true,
+ "notes": [
+ 57
+ ]
+ }
+ ]
+ ]
+ },
+ {
+ "id": "frere-jacques",
+ "title": "两只老虎",
+ "subtitle": "Frère Jacques",
+ "composer": "法国传统童谣",
+ "key": "C",
+ "harmonicaKey": "C",
+ "position": "第一把位",
+ "timeSignature": "4/4",
+ "tempo": 108,
+ "difficulty": 1,
+ "tags": [
+ "儿歌",
+ "轮唱",
+ "入门"
+ ],
+ "source": "The Everyday Song Book (1927), No.104;John Chambers ABC 转录",
+ "sourceUrl": "https://trillian.mit.edu/~jc/music/book/EverydaySongBook/104_Round_Are_You_Sleeping.abc",
+ "sourceFormat": "music-text",
+ "sourceCheckedAt": "2026-10-23",
+ "builtin": true,
+ "order": 9,
+ "notes": "原创客教材地址现返回校验网页,改按可完整读取的 ABC 版本核对。旋律音符序列不变;采用该版本两拍弱起、两拍结尾的 9 小节划分。G4 主音移为 C5,轮唱按单声部记谱,歌词与轮唱入口编号不录入,速度为编辑建议。",
+ "lines": [
+ [
+ {
+ "notes": [
+ 0,
+ 6
+ ]
+ },
+ {
+ "notes": [
+ 5,
+ 0,
+ 0,
+ 6
+ ]
+ },
+ {
+ "notes": [
+ 5,
+ 0,
+ 5,
+ 4
+ ]
+ },
+ {
+ "notes": [
+ 3,
+ 5,
+ 4
+ ]
+ }
+ ],
+ [
+ {
+ "notes": [
+ 3,
+ 17,
+ 26,
+ 17,
+ 14
+ ]
+ },
+ {
+ "notes": [
+ 5,
+ 0,
+ 17,
+ 26,
+ 17,
+ 14
+ ]
+ },
+ {
+ "notes": [
+ 5,
+ 0,
+ 0,
+ 15
+ ]
+ },
+ {
+ "notes": [
+ 7,
+ 0,
+ 15
+ ]
+ },
+ {
+ "sectionEnd": true,
+ "notes": [
+ 7
+ ]
+ }
+ ]
+ ]
+ },
+ {
+ "id": "mary-little-lamb",
+ "title": "玛丽有只小羊羔",
+ "subtitle": "Mary Had a Little Lamb",
+ "composer": "美国传统童谣",
+ "key": "C",
+ "harmonicaKey": "C",
+ "position": "第一把位",
+ "timeSignature": "4/4",
+ "tempo": 104,
+ "difficulty": 1,
+ "tags": [
+ "儿歌",
+ "入门"
+ ],
+ "source": "The Everyday Song Book (1927), No.77;John Chambers ABC 转录 (2017)",
+ "sourceUrl": "https://trillian.mit.edu/~jc/music/book/EverydaySongBook/077_Mary_Had_a_Little_Lamb.abc",
+ "sourceFormat": "music-text",
+ "sourceCheckedAt": "2026-10-23",
+ "builtin": true,
+ "order": 10,
+ "notes": "采用可核对时值的 1927 年版本替换旧无节奏文字来源。F4 主音移为 C5,半拍弱起、附点节奏、第 4 完整小节高 sol 同音延音和末尾休止均保留,9 小节含弱起。歌词不录入,速度为编辑建议。",
+ "lines": [
+ [
+ {
+ "notes": [
+ 13
+ ]
+ },
+ {
+ "notes": [
+ 9,
+ 10,
+ 0,
+ 6
+ ]
+ },
+ {
+ "notes": [
+ 5,
+ 5,
+ 46
+ ]
+ },
+ {
+ "notes": [
+ 6,
+ 6,
+ 8
+ ]
+ },
+ {
+ "notes": [
+ 5,
+ 1,
+ 58,
+ 17
+ ]
+ }
+ ],
+ [
+ {
+ "notes": [
+ 9,
+ 10,
+ 0,
+ 6
+ ]
+ },
+ {
+ "notes": [
+ 5,
+ 5,
+ 5,
+ 5
+ ]
+ },
+ {
+ "notes": [
+ 6,
+ 6,
+ 9,
+ 10
+ ]
+ },
+ {
+ "sectionEnd": true,
+ "notes": [
+ 7,
+ 20,
+ 59
+ ]
+ }
+ ]
+ ]
+ },
+ {
+ "id": "happy-birthday",
+ "title": "祝你生日快乐",
+ "subtitle": "Happy Birthday to You",
+ "composer": "Patty Hill / Mildred J. Hill 曲",
+ "key": "C",
+ "harmonicaKey": "C",
+ "position": "第一把位",
+ "timeSignature": "3/4",
+ "tempo": 92,
+ "pickupBeats": 1,
+ "difficulty": 1,
+ "tags": [
+ "生日",
+ "入门",
+ "经典"
+ ],
+ "source": "黄冈师范学院音乐学院吉他教材数字简谱《祝你生日快乐》;印刷第 28 页 / PDF 第 32 页",
+ "sourceUrl": "https://music.hgnu.edu.cn/_upload/article/files/09/d4/faf43ffb4e08b61cf64ee0adaf16/ec5df379-7cae-4b24-9ece-880a54ee478b.pdf",
+ "sourceFormat": "jianpu-image",
+ "sourceCheckedAt": "2026-10-23",
+ "builtin": true,
+ "order": 11,
+ "notes": "按教材完整反复展开为 17 小节(含一拍弱起);第一结尾末拍为再次起句的两个八分 sol,第二结尾为三拍 do。移除人为前补休止,整体升八度;吉他指法不录入,速度为编辑建议。",
+ "lines": [
+ [
+ {
+ "notes": [
+ 17,
+ 17
+ ]
+ },
+ {
+ "notes": [
+ 2,
+ 1,
+ 19
+ ]
+ },
+ {
+ "notes": [
+ 60,
+ 17,
+ 17
+ ]
+ },
+ {
+ "notes": [
+ 2,
+ 1,
+ 61
+ ]
+ },
+ {
+ "notes": [
+ 18,
+ 17,
+ 17
+ ]
+ }
+ ],
+ [
+ {
+ "notes": [
+ 62,
+ 63,
+ 19
+ ]
+ },
+ {
+ "notes": [
+ 25,
+ 2,
+ 64,
+ 64
+ ]
+ },
+ {
+ "notes": [
+ 63,
+ 19,
+ 61
+ ]
+ },
+ {
+ "notes": [
+ 18,
+ 17,
+ 17
+ ]
+ }
+ ],
+ [
+ {
+ "notes": [
+ 2,
+ 1,
+ 19
+ ]
+ },
+ {
+ "notes": [
+ 60,
+ 17,
+ 17
+ ]
+ },
+ {
+ "notes": [
+ 2,
+ 1,
+ 61
+ ]
+ },
+ {
+ "notes": [
+ 18,
+ 17,
+ 17
+ ]
+ }
+ ],
+ [
+ {
+ "notes": [
+ 62,
+ 63,
+ 19
+ ]
+ },
+ {
+ "notes": [
+ 25,
+ 2,
+ 64,
+ 64
+ ]
+ },
+ {
+ "notes": [
+ 63,
+ 19,
+ 61
+ ]
+ },
+ {
+ "sectionEnd": true,
+ "notes": [
+ 37
+ ]
+ }
+ ]
+ ]
+ },
+ {
+ "id": "spanish-rowing-song",
+ "title": "西班牙划船歌",
+ "subtitle": "划船 · 教材活动短版(8小节)",
+ "composer": "西班牙民歌",
+ "key": "C",
+ "harmonicaKey": "C",
+ "position": "第一把位",
+ "timeSignature": "2/4",
+ "tempo": 82,
+ "difficulty": 2,
+ "tags": [
+ "民歌",
+ "二八节奏",
+ "入门"
+ ],
+ "source": "湖南文艺出版社义务教育音乐一年级下册,第49页活动《随着琴声动一动》;采用西班牙民歌《划船》8小节版本,原谱1=C",
+ "sourceUrl": "https://hnwy-ecs-backup.oss-cn-beijing.aliyuncs.com/uploads/20200204/e894c036ed303450e968b59a0073ed82.pdf",
+ "sourceFormat": "jianpu-image",
+ "sourceCheckedAt": "2026-10-23",
+ "builtin": true,
+ "order": 12,
+ "notes": "采用教材活动中的8小节短版,逐音核对音高与时值,整体升高一个八度以适合C调十孔口琴。此版本不包含此前16小节编配中未能重新核对的后八小节;课堂强弱和快慢变化由演奏者自行练习。",
+ "lines": [
+ [
+ {
+ "notes": [
+ 17,
+ 13,
+ 5
+ ]
+ },
+ {
+ "notes": [
+ 14,
+ 10,
+ 6
+ ]
+ },
+ {
+ "notes": [
+ 12,
+ 10,
+ 13,
+ 14
+ ]
+ },
+ {
+ "notes": [
+ 17,
+ 17,
+ 1
+ ]
+ }
+ ],
+ [
+ {
+ "notes": [
+ 17,
+ 13,
+ 5
+ ]
+ },
+ {
+ "notes": [
+ 14,
+ 10,
+ 6
+ ]
+ },
+ {
+ "notes": [
+ 12,
+ 13,
+ 17,
+ 17
+ ]
+ },
+ {
+ "sectionEnd": true,
+ "notes": [
+ 7
+ ]
+ }
+ ]
+ ]
+ },
+ {
+ "id": "silent-night",
+ "title": "平安夜",
+ "subtitle": "Silent Night",
+ "composer": "Franz Xaver Gruber 曲",
+ "key": "C",
+ "harmonicaKey": "C",
+ "position": "第一把位",
+ "timeSignature": "6/8",
+ "tempo": 76,
+ "difficulty": 2,
+ "tags": [
+ "圣诞",
+ "赞美诗",
+ "经典"
+ ],
+ "source": "The Everyday Song Book (1927), No.57 Holy Night;John Chambers ABC 转录 (2017)",
+ "sourceUrl": "https://trillian.mit.edu/~jc/music/book/EverydaySongBook/057_Holy_Night.abc",
+ "sourceFormat": "music-text",
+ "sourceCheckedAt": "2026-10-23",
+ "builtin": true,
+ "order": 13,
+ "notes": "旧来源文字音高与现有谱不一致,改用 1927 年可逐音核对版本。保留原 6/8 拍、12 小节、四处八分休止、第三小节附点十六分与三十二分、末小节同音延音。整体升八度至 C5–F6;终止音为 C5。歌词、力度与异音连线不录入;四分拍速度为编辑建议。",
+ "lines": [
+ [
+ {
+ "notes": [
+ 65,
+ 66,
+ 17,
+ 9
+ ]
+ },
+ {
+ "notes": [
+ 65,
+ 66,
+ 17,
+ 9
+ ]
+ },
+ {
+ "notes": [
+ 61,
+ 67,
+ 68,
+ 35
+ ]
+ },
+ {
+ "notes": [
+ 19,
+ 69,
+ 70,
+ 30
+ ]
+ }
+ ],
+ [
+ {
+ "notes": [
+ 2,
+ 26,
+ 71,
+ 72,
+ 26
+ ]
+ },
+ {
+ "notes": [
+ 65,
+ 66,
+ 17,
+ 5,
+ 59
+ ]
+ },
+ {
+ "notes": [
+ 2,
+ 26,
+ 71,
+ 72,
+ 26
+ ]
+ },
+ {
+ "notes": [
+ 65,
+ 66,
+ 17,
+ 5,
+ 59
+ ]
+ }
+ ],
+ [
+ {
+ "notes": [
+ 61,
+ 36,
+ 73,
+ 74,
+ 22
+ ]
+ },
+ {
+ "notes": [
+ 21,
+ 63,
+ 59
+ ]
+ },
+ {
+ "notes": [
+ 71,
+ 70,
+ 13,
+ 65,
+ 75,
+ 10
+ ]
+ },
+ {
+ "sectionEnd": true,
+ "notes": [
+ 76,
+ 0,
+ 59
+ ]
+ }
+ ]
+ ]
+ },
+ {
+ "id": "amazing-grace",
+ "title": "奇异恩典",
+ "subtitle": "Amazing Grace",
+ "composer": "美国传统赞美诗曲调 New Britain",
+ "key": "C",
+ "harmonicaKey": "C",
+ "position": "第一把位",
+ "timeSignature": "3/4",
+ "tempo": 70,
+ "pickupBeats": 1,
+ "difficulty": 3,
+ "tags": [
+ "赞美诗",
+ "附点",
+ "经典"
+ ],
+ "source": "Wikimedia Commons 公有领域四声部数字简谱《Amazing Grace》的最高声部主旋律",
+ "sourceUrl": "https://commons.wikimedia.org/wiki/File:AmazingGraceNumberedMusicalNotation.png",
+ "sourceFormat": "jianpu-image",
+ "sourceCheckedAt": "2026-10-23",
+ "builtin": true,
+ "order": 14,
+ "notes": "逐行核对原图最高声部,保留 1=C 原音区 G4–G5、一拍弱起与两拍结尾;第 7、8 完整小节的高音 sol 保留。原图跨行的第 7 完整小节合并显示。和声与歌词不录入,练习速度为编辑建议。",
+ "lines": [
+ [
+ {
+ "notes": [
+ 15
+ ]
+ },
+ {
+ "notes": [
+ 7,
+ 13,
+ 12
+ ]
+ },
+ {
+ "notes": [
+ 46,
+ 6
+ ]
+ },
+ {
+ "notes": [
+ 7,
+ 32
+ ]
+ }
+ ],
+ [
+ {
+ "notes": [
+ 77,
+ 15
+ ]
+ },
+ {
+ "notes": [
+ 7,
+ 13,
+ 12
+ ]
+ },
+ {
+ "notes": [
+ 46,
+ 10,
+ 13
+ ]
+ },
+ {
+ "notes": [
+ 3,
+ 10,
+ 13
+ ]
+ }
+ ],
+ [
+ {
+ "notes": [
+ 3,
+ 13,
+ 12
+ ]
+ },
+ {
+ "notes": [
+ 46,
+ 13,
+ 10
+ ]
+ },
+ {
+ "notes": [
+ 7,
+ 32
+ ]
+ },
+ {
+ "notes": [
+ 77,
+ 15
+ ]
+ }
+ ],
+ [
+ {
+ "notes": [
+ 7,
+ 13,
+ 12
+ ]
+ },
+ {
+ "notes": [
+ 46,
+ 6
+ ]
+ },
+ {
+ "sectionEnd": true,
+ "notes": [
+ 7
+ ]
+ }
+ ]
+ ]
+ },
+ {
+ "id": "arirang",
+ "title": "阿里郎",
+ "subtitle": "Arirang · 教材单旋律版",
+ "composer": "朝鲜传统民歌",
+ "key": "C",
+ "harmonicaKey": "C",
+ "position": "第一把位",
+ "timeSignature": "3/4",
+ "tempo": 76,
+ "difficulty": 3,
+ "tags": [
+ "亚洲民歌",
+ "附点",
+ "压音"
+ ],
+ "source": "广东教育出版社/花城出版社《音乐三年级下册·简谱》印刷第 53 页(PDF 第 54 页),16 小节单旋律;1=F 移为 1=C,整体升八度适配 C 调口琴。",
+ "sourceUrl": "https://lywgyxx.szftedu.cn/xkjc/yinyue/202209/P020220910586729125995.pdf#page=54",
+ "sourceFormat": "jianpu-image",
+ "sourceCheckedAt": "2026-10-22",
+ "builtin": true,
+ "order": 15,
+ "notes": "保留教材音高、附点、休止和 16 小节结构;仅单旋律,省略歌词与连奏弧线。低音区 la 使用 3 孔吸气全音压音,建议先慢练音准。",
+ "lines": [
+ [
+ {
+ "notes": [
+ 78,
+ 31,
+ 79,
+ 31
+ ]
+ },
+ {
+ "notes": [
+ 28,
+ 10,
+ 12,
+ 10
+ ]
+ },
+ {
+ "notes": [
+ 5,
+ 10,
+ 13,
+ 12,
+ 31
+ ]
+ },
+ {
+ "notes": [
+ 78,
+ 31,
+ 79,
+ 31
+ ]
+ }
+ ],
+ [
+ {
+ "notes": [
+ 28,
+ 10,
+ 12,
+ 10
+ ]
+ },
+ {
+ "notes": [
+ 13,
+ 10,
+ 12,
+ 31,
+ 79,
+ 31
+ ]
+ },
+ {
+ "notes": [
+ 28,
+ 10,
+ 0
+ ]
+ },
+ {
+ "notes": [
+ 33
+ ]
+ }
+ ],
+ [
+ {
+ "notes": [
+ 1,
+ 3
+ ]
+ },
+ {
+ "notes": [
+ 1,
+ 5,
+ 6
+ ]
+ },
+ {
+ "notes": [
+ 5,
+ 10,
+ 13,
+ 12,
+ 31
+ ]
+ },
+ {
+ "notes": [
+ 78,
+ 31,
+ 79,
+ 59
+ ]
+ }
+ ],
+ [
+ {
+ "notes": [
+ 28,
+ 10,
+ 12,
+ 10
+ ]
+ },
+ {
+ "notes": [
+ 13,
+ 10,
+ 12,
+ 31,
+ 79,
+ 31
+ ]
+ },
+ {
+ "notes": [
+ 28,
+ 10,
+ 0
+ ]
+ },
+ {
+ "sectionEnd": true,
+ "notes": [
+ 7,
+ 20
+ ]
+ }
+ ]
+ ]
+ },
+ {
+ "id": "harvest-song",
+ "title": "丰收之歌",
+ "subtitle": "Marken er mejet · 丹麦传统旋律",
+ "composer": "丹麦传统民歌",
+ "key": "C",
+ "harmonicaKey": "C",
+ "position": "第一把位",
+ "timeSignature": "2/4",
+ "tempo": 108,
+ "difficulty": 2,
+ "tags": [
+ "欧美民歌",
+ "入门",
+ "跳进"
+ ],
+ "source": "广东教育出版社/花城出版社《音乐三年级下册·简谱》印刷第 50–51 页(PDF 第 51–52 页),24 小节;1=Bb 移为 1=C,整体升八度适配 C 调口琴。",
+ "sourceUrl": "https://lywgyxx.szftedu.cn/xkjc/yinyue/202209/P020220910586729125995.pdf#page=51",
+ "sourceFormat": "jianpu-image",
+ "sourceCheckedAt": "2026-10-22",
+ "builtin": true,
+ "order": 16,
+ "notes": "完整录入教材两页的传统主旋律,不含译配歌词。注意开头高 do 到中音 mi 的跳进,以及结尾每次一拍休止;高音 mi 使用 8 孔吹气。",
+ "lines": [
+ [
+ {
+ "notes": [
+ 19,
+ 17,
+ 13
+ ]
+ },
+ {
+ "notes": [
+ 0,
+ 13,
+ 17
+ ]
+ },
+ {
+ "notes": [
+ 0,
+ 13,
+ 17
+ ]
+ },
+ {
+ "notes": [
+ 19,
+ 19
+ ]
+ }
+ ],
+ [
+ {
+ "notes": [
+ 14,
+ 26,
+ 26,
+ 26
+ ]
+ },
+ {
+ "notes": [
+ 13,
+ 17,
+ 17,
+ 17
+ ]
+ },
+ {
+ "notes": [
+ 10,
+ 14,
+ 13,
+ 10
+ ]
+ },
+ {
+ "notes": [
+ 0,
+ 20
+ ]
+ }
+ ],
+ [
+ {
+ "notes": [
+ 19,
+ 17,
+ 13
+ ]
+ },
+ {
+ "notes": [
+ 0,
+ 13,
+ 17
+ ]
+ },
+ {
+ "notes": [
+ 0,
+ 13,
+ 17
+ ]
+ },
+ {
+ "notes": [
+ 19,
+ 19
+ ]
+ }
+ ],
+ [
+ {
+ "notes": [
+ 14,
+ 26,
+ 26,
+ 26
+ ]
+ },
+ {
+ "notes": [
+ 13,
+ 17,
+ 17,
+ 17
+ ]
+ },
+ {
+ "notes": [
+ 10,
+ 14,
+ 13,
+ 10
+ ]
+ },
+ {
+ "notes": [
+ 0,
+ 20
+ ]
+ }
+ ],
+ [
+ {
+ "notes": [
+ 19,
+ 19
+ ]
+ },
+ {
+ "notes": [
+ 22,
+ 36,
+ 1
+ ]
+ },
+ {
+ "notes": [
+ 61,
+ 61
+ ]
+ },
+ {
+ "notes": [
+ 27,
+ 80,
+ 1
+ ]
+ }
+ ],
+ [
+ {
+ "notes": [
+ 14,
+ 26,
+ 26,
+ 26
+ ]
+ },
+ {
+ "notes": [
+ 13,
+ 17,
+ 17,
+ 17
+ ]
+ },
+ {
+ "notes": [
+ 10,
+ 14,
+ 13,
+ 10
+ ]
+ },
+ {
+ "sectionEnd": true,
+ "notes": [
+ 0,
+ 20
+ ]
+ }
+ ]
+ ]
+ },
+ {
+ "id": "xiao-bai-cai",
+ "title": "小白菜",
+ "subtitle": "河北民歌 · 含变拍结束句",
+ "composer": "河北传统民歌",
+ "key": "C",
+ "harmonicaKey": "C",
+ "position": "第二把位",
+ "timeSignature": "5/4",
+ "tempo": 64,
+ "difficulty": 3,
+ "tags": [
+ "中国民歌",
+ "变拍",
+ "压音"
+ ],
+ "source": "郭丽萍、王立民、马志飞主编《音乐鉴赏》(新华出版社)印刷第 17 页,谱例 1-7;PDF 第 24 页。主歌 4 小节 5/4,结束句 2 小节 4/4。1=Ab 移为 1=C,升八度适配口琴。",
+ "sourceUrl": "https://backend.sjhtbook.com/upload/file/2025/04/80fb4b7923894770828045c9e613e236.pdf#page=24",
+ "sourceFormat": "jianpu-image",
+ "sourceCheckedAt": "2026-10-22",
+ "builtin": true,
+ "order": 17,
+ "notes": "保留教材主歌与结束句的反复标记;主歌可按需反复后进入结束句,结束句反复一次。省略歌词及异音连奏弧线。第 4 小节采用本版的 do–低 la,不混用其他版本的低 si–低 la。低 la 用 3 孔吸气全音压音。速度为练习建议。 把位按本版移调后的主音 G 计算,为 C 调口琴第二把位;1=C 是简谱标尺。 调式参考《基本乐理教程》修订版第 85 页例 7-3(d) 对该民歌的徵调式分类;旋律仍采用上述简谱教材版本。",
+ "lines": [
+ [
+ {
+ "notes": [
+ 1,
+ 5,
+ 5,
+ 8
+ ]
+ },
+ {
+ "notes": [
+ 1,
+ 17,
+ 13,
+ 13,
+ 10,
+ 7
+ ]
+ }
+ ],
+ [
+ {
+ "notes": [
+ 0,
+ 5,
+ 6,
+ 81
+ ]
+ },
+ {
+ "repeatEnd": true,
+ "notes": [
+ 6,
+ 0,
+ 12,
+ 31,
+ 77
+ ]
+ }
+ ],
+ [
+ {
+ "timeSignature": "4/4",
+ "repeatBegin": true,
+ "notes": [
+ 32,
+ 12,
+ 31,
+ 77
+ ]
+ },
+ {
+ "repeatEnd": true,
+ "notes": [
+ 31,
+ 10,
+ 12,
+ 31,
+ 77
+ ]
+ }
+ ]
+ ]
+ },
+ {
+ "id": "london-bridge",
+ "title": "伦敦桥",
+ "subtitle": "London Bridge · 1927 歌集版",
+ "composer": "英国传统童谣",
+ "key": "C",
+ "harmonicaKey": "C",
+ "position": "第一把位",
+ "timeSignature": "4/4",
+ "tempo": 112,
+ "difficulty": 1,
+ "tags": [
+ "西方童谣",
+ "附点",
+ "自然音"
+ ],
+ "source": "The Everyday Song Book (1927), No.18;John Chambers 2015 年 ABC 转录。取上声部 8 小节完整旋律,原 F 调移至 C 调并升八度。",
+ "sourceUrl": "https://trillian.mit.edu/~jc/music/book/EverydaySongBook/018_London_Bridge.abc",
+ "sourceFormat": "music-text",
+ "sourceCheckedAt": "2026-10-22",
+ "builtin": true,
+ "order": 18,
+ "notes": "采用该歌集的 4/4 版本:开头附点四分音符,保留同音延音线与末尾休止。不混用常见 2/4 版本的时值;省略下声部与歌词。速度为练习建议。",
+ "lines": [
+ [
+ {
+ "notes": [
+ 30,
+ 26,
+ 1,
+ 4
+ ]
+ },
+ {
+ "notes": [
+ 5,
+ 4,
+ 82,
+ 1
+ ]
+ },
+ {
+ "notes": [
+ 6,
+ 5,
+ 83,
+ 4
+ ]
+ },
+ {
+ "notes": [
+ 5,
+ 4,
+ 82,
+ 1
+ ]
+ }
+ ],
+ [
+ {
+ "notes": [
+ 30,
+ 26,
+ 1,
+ 4
+ ]
+ },
+ {
+ "notes": [
+ 5,
+ 4,
+ 82,
+ 1
+ ]
+ },
+ {
+ "notes": [
+ 8,
+ 3
+ ]
+ },
+ {
+ "sectionEnd": true,
+ "notes": [
+ 5,
+ 7,
+ 20
+ ]
+ }
+ ]
+ ]
+ },
+ {
+ "id": "oh-susanna",
+ "title": "哦,苏珊娜",
+ "subtitle": "Oh Susanna · 主歌反复展开版",
+ "composer": "Stephen C. Foster",
+ "key": "C",
+ "harmonicaKey": "C",
+ "position": "第一把位",
+ "timeSignature": "2/4",
+ "tempo": 100,
+ "difficulty": 2,
+ "tags": [
+ "西方歌曲",
+ "弱起",
+ "附点"
+ ],
+ "source": "Frank Nordberg / musicaviva 的 Oh Susanna ABC 转录,John Chambers 镜像。C 调完整旋律,主歌反复展开两遍后接副歌;音符文本的小写 c 对应本谱高音 do(C5)。",
+ "sourceUrl": "https://trillian.mit.edu/~jc/music/abc/mirror/kirby98.fsnet.co.uk/oh/Oh_Susanna_1.abc",
+ "sourceFormat": "music-text",
+ "sourceCheckedAt": "2026-10-22",
+ "builtin": true,
+ "order": 19,
+ "notes": "开头两个十六分音符为半拍弱起。第一次主歌末尾接下一遍弱起;第二次末尾接八分休止进入副歌。末小节为一拍半,与开头互补。保留原版附点八分与十六分组合,省略和弦。速度为练习建议。",
+ "lines": [
+ [
+ {
+ "notes": [
+ 84,
+ 85
+ ]
+ },
+ {
+ "notes": [
+ 13,
+ 17,
+ 65,
+ 66
+ ]
+ },
+ {
+ "notes": [
+ 17,
+ 13,
+ 86,
+ 85
+ ]
+ },
+ {
+ "notes": [
+ 13,
+ 13,
+ 10,
+ 12
+ ]
+ },
+ {
+ "notes": [
+ 11,
+ 84,
+ 85
+ ]
+ }
+ ],
+ [
+ {
+ "notes": [
+ 13,
+ 17,
+ 65,
+ 66
+ ]
+ },
+ {
+ "notes": [
+ 17,
+ 13,
+ 86,
+ 85
+ ]
+ },
+ {
+ "notes": [
+ 13,
+ 13,
+ 10,
+ 10
+ ]
+ },
+ {
+ "notes": [
+ 28,
+ 84,
+ 85
+ ]
+ }
+ ],
+ [
+ {
+ "notes": [
+ 13,
+ 17,
+ 65,
+ 66
+ ]
+ },
+ {
+ "notes": [
+ 17,
+ 13,
+ 86,
+ 85
+ ]
+ },
+ {
+ "notes": [
+ 13,
+ 13,
+ 10,
+ 12
+ ]
+ },
+ {
+ "notes": [
+ 11,
+ 84,
+ 85
+ ]
+ }
+ ],
+ [
+ {
+ "notes": [
+ 13,
+ 17,
+ 65,
+ 66
+ ]
+ },
+ {
+ "notes": [
+ 17,
+ 13,
+ 86,
+ 85
+ ]
+ },
+ {
+ "notes": [
+ 13,
+ 13,
+ 10,
+ 10
+ ]
+ },
+ {
+ "notes": [
+ 28,
+ 59
+ ]
+ }
+ ],
+ [
+ {
+ "notes": [
+ 4,
+ 4
+ ]
+ },
+ {
+ "notes": [
+ 26,
+ 2,
+ 26
+ ]
+ },
+ {
+ "notes": [
+ 17,
+ 17,
+ 13,
+ 12
+ ]
+ },
+ {
+ "notes": [
+ 11,
+ 84,
+ 85
+ ]
+ }
+ ],
+ [
+ {
+ "notes": [
+ 13,
+ 17,
+ 65,
+ 66
+ ]
+ },
+ {
+ "notes": [
+ 17,
+ 13,
+ 86,
+ 85
+ ]
+ },
+ {
+ "notes": [
+ 13,
+ 13,
+ 10,
+ 10
+ ]
+ },
+ {
+ "sectionEnd": true,
+ "notes": [
+ 28
+ ]
+ }
+ ]
+ ]
+ },
+ {
+ "id": "zou-jiang-zhou",
+ "title": "走绛州",
+ "subtitle": "山西民歌 · 教材单旋律版",
+ "composer": "山西传统民歌",
+ "key": "C",
+ "harmonicaKey": "C",
+ "position": "第二把位",
+ "timeSignature": "2/4",
+ "tempo": 88,
+ "difficulty": 3,
+ "tags": [
+ "中国民歌",
+ "十六分音符",
+ "压音"
+ ],
+ "source": "郭丽萍、王立民、马志飞主编《音乐鉴赏》(新华出版社)印刷第 6 页,谱例 1-1;PDF 第 13 页。23 小节,1=G 移为 1=C,升八度适配口琴。",
+ "sourceUrl": "https://backend.sjhtbook.com/upload/file/2025/04/80fb4b7923894770828045c9e613e236.pdf#page=13",
+ "sourceFormat": "jianpu-image",
+ "sourceCheckedAt": "2026-10-22",
+ "builtin": true,
+ "order": 20,
+ "notes": "保留 23 小节主旋律、高低音区及十六分休止;省略歌词、异音连奏弧线和第二/三段歌词的节奏变体。第 6–7 小节短音与休止交替,先慢练吐音;低 fa 为 2 孔吸气全音压音,低 la 为 3 孔吸气全音压音。速度为练习建议。 把位按本版移调后的主音 G 计算,为 C 调口琴第二把位;1=C 是简谱标尺。 所选教材第 5 页对下句落音 D 徵的分析,与原 1=G 简谱及移调关系对应。",
+ "lines": [
+ [
+ {
+ "notes": [
+ 0,
+ 15
+ ]
+ },
+ {
+ "notes": [
+ 12,
+ 87,
+ 88,
+ 15
+ ]
+ },
+ {
+ "notes": [
+ 65,
+ 69,
+ 17,
+ 14
+ ]
+ },
+ {
+ "notes": [
+ 17,
+ 6,
+ 12
+ ]
+ },
+ {
+ "notes": [
+ 8
+ ]
+ }
+ ],
+ [
+ {
+ "notes": [
+ 70,
+ 89,
+ 69,
+ 89,
+ 70,
+ 89,
+ 69,
+ 89
+ ]
+ },
+ {
+ "notes": [
+ 70,
+ 89,
+ 69,
+ 89,
+ 70,
+ 89,
+ 69,
+ 89
+ ]
+ },
+ {
+ "notes": [
+ 17,
+ 6,
+ 12
+ ]
+ },
+ {
+ "notes": [
+ 8
+ ]
+ }
+ ],
+ [
+ {
+ "notes": [
+ 1,
+ 10,
+ 10
+ ]
+ },
+ {
+ "notes": [
+ 1,
+ 6
+ ]
+ },
+ {
+ "notes": [
+ 12,
+ 24,
+ 12,
+ 85,
+ 84
+ ]
+ },
+ {
+ "notes": [
+ 77
+ ]
+ },
+ {
+ "notes": [
+ 12,
+ 24,
+ 12,
+ 10
+ ]
+ }
+ ],
+ [
+ {
+ "notes": [
+ 90,
+ 90,
+ 90,
+ 91,
+ 15
+ ]
+ },
+ {
+ "notes": [
+ 12,
+ 24,
+ 12,
+ 10
+ ]
+ },
+ {
+ "notes": [
+ 90,
+ 88,
+ 90,
+ 91,
+ 15
+ ]
+ },
+ {
+ "notes": [
+ 79,
+ 92,
+ 79,
+ 92
+ ]
+ }
+ ],
+ [
+ {
+ "notes": [
+ 85,
+ 84,
+ 85,
+ 84,
+ 10,
+ 12
+ ]
+ },
+ {
+ "notes": [
+ 12,
+ 10,
+ 17,
+ 27
+ ]
+ },
+ {
+ "notes": [
+ 30,
+ 85,
+ 85
+ ]
+ },
+ {
+ "notes": [
+ 12,
+ 24,
+ 12,
+ 85,
+ 84
+ ]
+ },
+ {
+ "sectionEnd": true,
+ "notes": [
+ 77
+ ]
+ }
+ ]
+ ]
+ },
+ {
+ "id": "yankee-doodle",
+ "title": "扬基歌",
+ "subtitle": "Yankee Doodle · 含副歌",
+ "composer": "传统曲调",
+ "key": "C",
+ "harmonicaKey": "C",
+ "position": "第一把位",
+ "timeSignature": "2/4",
+ "tempo": 100,
+ "difficulty": 3,
+ "tags": [
+ "西方民谣",
+ "弱起",
+ "压音"
+ ],
+ "source": "The Everyday Song Book (1927), No.3;John Chambers 2015 年 ABC 转录。A 调移为 C 调,主音移至 C5;保留主歌和低音区副歌。",
+ "sourceUrl": "https://trillian.mit.edu/~jc/music/book/EverydaySongBook/003_Yankee_Doodle.abc",
+ "sourceFormat": "music-text",
+ "sourceCheckedAt": "2026-10-22",
+ "builtin": true,
+ "order": 21,
+ "notes": "开头八分弱起,末尾一拍半互补;主歌后的副歌包含低 fa / la 压音,不只截取常见的前八小节。省略歌词与异音连奏线;速度为练习建议。",
+ "lines": [
+ [
+ {
+ "notes": [
+ 79
+ ]
+ },
+ {
+ "notes": [
+ 12,
+ 12,
+ 10,
+ 13
+ ]
+ },
+ {
+ "notes": [
+ 12,
+ 13,
+ 10,
+ 79
+ ]
+ },
+ {
+ "notes": [
+ 12,
+ 12,
+ 10,
+ 13
+ ]
+ },
+ {
+ "notes": [
+ 0,
+ 24,
+ 79
+ ]
+ }
+ ],
+ [
+ {
+ "notes": [
+ 12,
+ 12,
+ 10,
+ 13
+ ]
+ },
+ {
+ "notes": [
+ 14,
+ 13,
+ 93,
+ 84
+ ]
+ },
+ {
+ "notes": [
+ 24,
+ 79,
+ 31,
+ 24
+ ]
+ },
+ {
+ "notes": [
+ 0,
+ 12,
+ 59
+ ]
+ }
+ ],
+ [
+ {
+ "notes": [
+ 94,
+ 87,
+ 31,
+ 79
+ ]
+ },
+ {
+ "notes": [
+ 31,
+ 24,
+ 12,
+ 59
+ ]
+ },
+ {
+ "notes": [
+ 95,
+ 88,
+ 79,
+ 92
+ ]
+ },
+ {
+ "notes": [
+ 96,
+ 91,
+ 79,
+ 59
+ ]
+ }
+ ],
+ [
+ {
+ "notes": [
+ 94,
+ 87,
+ 31,
+ 79
+ ]
+ },
+ {
+ "notes": [
+ 31,
+ 24,
+ 12,
+ 31
+ ]
+ },
+ {
+ "notes": [
+ 79,
+ 12,
+ 24,
+ 10
+ ]
+ },
+ {
+ "sectionEnd": true,
+ "notes": [
+ 0,
+ 12
+ ]
+ }
+ ]
+ ]
+ },
+ {
+ "id": "my-bonnie",
+ "title": "我的邦妮",
+ "subtitle": "My Bonnie · 1927 歌集版",
+ "composer": "传统歌曲;歌集署 H. J. Fuller",
+ "key": "C",
+ "harmonicaKey": "C",
+ "position": "第一把位",
+ "timeSignature": "3/4",
+ "tempo": 108,
+ "difficulty": 3,
+ "tags": [
+ "西方民谣",
+ "三拍子",
+ "压音"
+ ],
+ "source": "The Everyday Song Book (1927), No.6;John Chambers 2015 年 ABC 转录,转录者说明已补足第 5 小节中音的符尾。Bb 调移为 C 调,主音移至 C5。",
+ "sourceUrl": "https://trillian.mit.edu/~jc/music/book/EverydaySongBook/006_My_Bonnie.abc",
+ "sourceFormat": "music-text",
+ "sourceCheckedAt": "2026-10-22",
+ "builtin": true,
+ "order": 22,
+ "notes": "完整主歌与副歌,共 32 个主小节加一拍弱起。前两段之间将两拍长音与下一段的一拍弱起合为一小节;保留跨小节延音。省略歌词及副歌延长记号的自由时长,按书面拍值练习;速度为练习建议。",
+ "lines": [
+ [
+ {
+ "notes": [
+ 15
+ ]
+ },
+ {
+ "notes": [
+ 9,
+ 10,
+ 0
+ ]
+ },
+ {
+ "notes": [
+ 6,
+ 0,
+ 32
+ ]
+ },
+ {
+ "notes": [
+ 15,
+ 97
+ ]
+ },
+ {
+ "notes": [
+ 52,
+ 20,
+ 15
+ ]
+ }
+ ],
+ [
+ {
+ "notes": [
+ 9,
+ 10,
+ 0
+ ]
+ },
+ {
+ "notes": [
+ 0,
+ 98,
+ 0
+ ]
+ },
+ {
+ "notes": [
+ 99
+ ]
+ },
+ {
+ "notes": [
+ 8,
+ 15
+ ]
+ }
+ ],
+ [
+ {
+ "notes": [
+ 9,
+ 10,
+ 0
+ ]
+ },
+ {
+ "notes": [
+ 6,
+ 0,
+ 32
+ ]
+ },
+ {
+ "notes": [
+ 15,
+ 97
+ ]
+ },
+ {
+ "notes": [
+ 52,
+ 20,
+ 15
+ ]
+ }
+ ],
+ [
+ {
+ "notes": [
+ 32,
+ 6,
+ 0
+ ]
+ },
+ {
+ "notes": [
+ 98,
+ 32,
+ 98
+ ]
+ },
+ {
+ "notes": [
+ 100
+ ]
+ },
+ {
+ "notes": [
+ 7,
+ 20
+ ]
+ }
+ ],
+ [
+ {
+ "notes": [
+ 101
+ ]
+ },
+ {
+ "notes": [
+ 33
+ ]
+ },
+ {
+ "notes": [
+ 102
+ ]
+ },
+ {
+ "notes": [
+ 33
+ ]
+ }
+ ],
+ [
+ {
+ "notes": [
+ 98,
+ 98,
+ 98
+ ]
+ },
+ {
+ "notes": [
+ 98,
+ 32,
+ 98
+ ]
+ },
+ {
+ "notes": [
+ 7,
+ 6
+ ]
+ },
+ {
+ "notes": [
+ 103
+ ]
+ }
+ ],
+ [
+ {
+ "notes": [
+ 101
+ ]
+ },
+ {
+ "notes": [
+ 33
+ ]
+ },
+ {
+ "notes": [
+ 102
+ ]
+ },
+ {
+ "notes": [
+ 8,
+ 0
+ ]
+ }
+ ],
+ [
+ {
+ "notes": [
+ 98,
+ 98,
+ 98
+ ]
+ },
+ {
+ "notes": [
+ 98,
+ 32,
+ 98
+ ]
+ },
+ {
+ "notes": [
+ 100
+ ]
+ },
+ {
+ "sectionEnd": true,
+ "notes": [
+ 7
+ ]
+ }
+ ]
+ ]
+ },
+ {
+ "id": "fengyang-flower-drum",
+ "title": "凤阳花鼓",
+ "subtitle": "安徽民歌 · 人教版教材旋律",
+ "composer": "安徽传统民歌",
+ "key": "C",
+ "harmonicaKey": "C",
+ "position": "第一把位",
+ "timeSignature": "4/4",
+ "tempo": 104,
+ "difficulty": 3,
+ "tags": [
+ "中国民歌",
+ "五声音阶",
+ "压音"
+ ],
+ "source": "人民教育出版社《音乐七年级下册·简谱》印刷第 31 页(PDF 第 36 页),1=C、15 小节。与广东教育/花城三年级下册的低音 la 标记交叉比对;本谱整体升八度。",
+ "sourceUrl": "https://dev98.oa.henanyuexue.com/static/szjc-resources/pdf/q/f/2/7.pdf#page=36",
+ "sourceFormat": "jianpu-image",
+ "sourceCheckedAt": "2026-10-22",
+ "builtin": true,
+ "order": 23,
+ "notes": "保留所选教材 15 小节的音区、节奏与两处八分休止;省略歌词、连奏线。第 5、10–12、15 小节的 la 按原谱低音点处理,不按其他传唱版本改写;使用 3 孔吸气全音压音。速度为练习建议。",
+ "lines": [
+ [
+ {
+ "notes": [
+ 17,
+ 13,
+ 10,
+ 13,
+ 3
+ ]
+ },
+ {
+ "notes": [
+ 13,
+ 17,
+ 26,
+ 27,
+ 3
+ ]
+ },
+ {
+ "notes": [
+ 17,
+ 1,
+ 27,
+ 2,
+ 17,
+ 13
+ ]
+ },
+ {
+ "notes": [
+ 10,
+ 17,
+ 13,
+ 10,
+ 7
+ ]
+ }
+ ],
+ [
+ {
+ "notes": [
+ 12,
+ 0,
+ 31,
+ 1,
+ 17,
+ 13
+ ]
+ },
+ {
+ "notes": [
+ 10,
+ 12,
+ 10,
+ 13,
+ 3
+ ]
+ },
+ {
+ "notes": [
+ 17,
+ 1,
+ 27,
+ 2,
+ 17,
+ 13
+ ]
+ },
+ {
+ "notes": [
+ 10,
+ 17,
+ 13,
+ 10,
+ 7
+ ]
+ }
+ ],
+ [
+ {
+ "notes": [
+ 1,
+ 13,
+ 10,
+ 12,
+ 10,
+ 13,
+ 17
+ ]
+ },
+ {
+ "notes": [
+ 10,
+ 12,
+ 31,
+ 10,
+ 7
+ ]
+ },
+ {
+ "notes": [
+ 1,
+ 13,
+ 10,
+ 12,
+ 31,
+ 0
+ ]
+ },
+ {
+ "notes": [
+ 1,
+ 13,
+ 10,
+ 12,
+ 31,
+ 0
+ ]
+ }
+ ],
+ [
+ {
+ "notes": [
+ 1,
+ 12,
+ 59,
+ 1,
+ 12,
+ 59
+ ]
+ },
+ {
+ "notes": [
+ 1,
+ 13,
+ 10,
+ 12,
+ 10,
+ 13,
+ 17
+ ]
+ },
+ {
+ "sectionEnd": true,
+ "notes": [
+ 10,
+ 12,
+ 31,
+ 10,
+ 7
+ ]
+ }
+ ]
+ ]
+ },
+ {
+ "id": "click-go-the-shears",
+ "title": "剪羊毛",
+ "subtitle": "Click Go the Shears · 教材旋律版",
+ "composer": "澳大利亚传统歌曲",
+ "key": "C",
+ "harmonicaKey": "C",
+ "position": "第一把位",
+ "timeSignature": "2/4",
+ "tempo": 92,
+ "difficulty": 2,
+ "tags": [
+ "大洋洲民歌",
+ "附点",
+ "自然音"
+ ],
+ "source": "人民教育出版社《音乐七年级下册·简谱》印刷第 46 页(PDF 第 51 页);16 小节单旋律。保留 1=C,整体升八度适配口琴。",
+ "sourceUrl": "https://dev98.oa.henanyuexue.com/static/szjc-resources/pdf/q/f/2/7.pdf#page=51",
+ "sourceFormat": "jianpu-image",
+ "sourceCheckedAt": "2026-10-22",
+ "builtin": true,
+ "order": 24,
+ "notes": "按教材所列旋律保留附点八分与十六分节奏,以及第 4、8、12、16 小节的四分休止。末句从中音 do 跳至高音 do;省略歌词与异音连奏线。速度为练习建议。",
+ "lines": [
+ [
+ {
+ "notes": [
+ 5,
+ 104,
+ 85
+ ]
+ },
+ {
+ "notes": [
+ 12,
+ 12,
+ 13,
+ 17
+ ]
+ },
+ {
+ "notes": [
+ 19,
+ 71,
+ 72
+ ]
+ },
+ {
+ "notes": [
+ 2,
+ 20
+ ]
+ }
+ ],
+ [
+ {
+ "notes": [
+ 1,
+ 65,
+ 66
+ ]
+ },
+ {
+ "notes": [
+ 1,
+ 104,
+ 84
+ ]
+ },
+ {
+ "notes": [
+ 6,
+ 93,
+ 105
+ ]
+ },
+ {
+ "notes": [
+ 6,
+ 20
+ ]
+ }
+ ],
+ [
+ {
+ "notes": [
+ 5,
+ 104,
+ 85
+ ]
+ },
+ {
+ "notes": [
+ 12,
+ 12,
+ 13,
+ 17
+ ]
+ },
+ {
+ "notes": [
+ 19,
+ 71,
+ 72
+ ]
+ },
+ {
+ "notes": [
+ 2,
+ 20
+ ]
+ }
+ ],
+ [
+ {
+ "notes": [
+ 106,
+ 69,
+ 22,
+ 26
+ ]
+ },
+ {
+ "notes": [
+ 17,
+ 14,
+ 13,
+ 10
+ ]
+ },
+ {
+ "notes": [
+ 0,
+ 71,
+ 72
+ ]
+ },
+ {
+ "sectionEnd": true,
+ "notes": [
+ 19,
+ 20
+ ]
+ }
+ ]
+ ]
+ },
+ {
+ "id": "santa-lucia",
+ "title": "桑塔·露琪亚",
+ "subtitle": "Santa Lucia · 意大利船歌",
+ "composer": "科特劳(教材署名)",
+ "key": "C",
+ "harmonicaKey": "C",
+ "position": "第一把位",
+ "timeSignature": "3/8",
+ "tempo": 66,
+ "difficulty": 3,
+ "tags": [
+ "西方民谣",
+ "三八拍",
+ "压音"
+ ],
+ "source": "人民教育出版社《音乐七年级下册·简谱》印刷第 41 页(PDF 第 46 页);保留原 1=C 音高,前段反复记号保留,后段第一/第二结尾反复展开。",
+ "sourceUrl": "https://dev98.oa.henanyuexue.com/static/szjc-resources/pdf/q/f/2/7.pdf#page=46",
+ "sourceFormat": "jianpu-image",
+ "sourceCheckedAt": "2026-10-22",
+ "builtin": true,
+ "order": 25,
+ "notes": "24 个书写小节:前 8 小节反复一次,后 16 小节已按两种结尾展开,按顺序演奏。注意第 6 小节升 fa 后还原为自然 fa,两者分别为 2 孔吸气半音/全音压音。低音区不额外升八度,避免把升 fa 移到需要超吹的音区。省略歌词与异音连奏线;速度为练习建议。",
+ "lines": [
+ [
+ {
+ "repeatBegin": true,
+ "notes": [
+ 79,
+ 95,
+ 84
+ ]
+ },
+ {
+ "notes": [
+ 84,
+ 87,
+ 98
+ ]
+ },
+ {
+ "notes": [
+ 92,
+ 107,
+ 88
+ ]
+ },
+ {
+ "notes": [
+ 88,
+ 90,
+ 15
+ ]
+ }
+ ],
+ [
+ {
+ "notes": [
+ 108,
+ 31,
+ 79
+ ]
+ },
+ {
+ "notes": [
+ 90,
+ 109,
+ 53
+ ]
+ },
+ {
+ "notes": [
+ 92,
+ 108,
+ 110
+ ]
+ },
+ {
+ "repeatEnd": true,
+ "notes": [
+ 31,
+ 15
+ ]
+ }
+ ],
+ [
+ {
+ "notes": [
+ 13,
+ 10,
+ 12
+ ]
+ },
+ {
+ "notes": [
+ 87,
+ 88,
+ 6
+ ]
+ },
+ {
+ "notes": [
+ 10,
+ 12,
+ 31
+ ]
+ },
+ {
+ "notes": [
+ 109,
+ 90,
+ 0
+ ]
+ }
+ ],
+ [
+ {
+ "notes": [
+ 105,
+ 84,
+ 84,
+ 90,
+ 90,
+ 111
+ ]
+ },
+ {
+ "notes": [
+ 75,
+ 85,
+ 6
+ ]
+ },
+ {
+ "notes": [
+ 10,
+ 94,
+ 87
+ ]
+ },
+ {
+ "notes": [
+ 10,
+ 0
+ ]
+ }
+ ],
+ [
+ {
+ "notes": [
+ 13,
+ 10,
+ 12
+ ]
+ },
+ {
+ "notes": [
+ 87,
+ 88,
+ 6
+ ]
+ },
+ {
+ "notes": [
+ 10,
+ 12,
+ 31
+ ]
+ },
+ {
+ "notes": [
+ 109,
+ 90,
+ 0
+ ]
+ }
+ ],
+ [
+ {
+ "notes": [
+ 105,
+ 84,
+ 84,
+ 90,
+ 90,
+ 111
+ ]
+ },
+ {
+ "notes": [
+ 75,
+ 85,
+ 6
+ ]
+ },
+ {
+ "notes": [
+ 10,
+ 104,
+ 85
+ ]
+ },
+ {
+ "sectionEnd": true,
+ "notes": [
+ 10,
+ 0
+ ]
+ }
+ ]
+ ]
+ },
+ {
+ "id": "longing-for-spring",
+ "title": "渴望春天",
+ "subtitle": "Sehnsucht nach dem Frühlinge · K.596",
+ "composer": "W. A. Mozart",
+ "key": "C",
+ "harmonicaKey": "C",
+ "position": "第一把位",
+ "timeSignature": "6/8",
+ "tempo": 96,
+ "difficulty": 3,
+ "tags": [
+ "古典",
+ "前倚音",
+ "六八拍",
+ "压音"
+ ],
+ "source": "人民教育出版社《音乐七年级下册·简谱》印刷第 4–5 页(PDF 第 9–10 页);完整主旋律,保留原 1=C 音区。",
+ "sourceUrl": "https://dev98.oa.henanyuexue.com/static/szjc-resources/pdf/q/f/2/7.pdf#page=9",
+ "sourceFormat": "jianpu-image",
+ "sourceCheckedAt": "2026-10-22",
+ "builtin": true,
+ "order": 26,
+ "notes": "16 个主小节加八分弱起,末小节与弱起互补;保留同音延音、升 do、升 fa 及倒数第二小节的前倚音 sol。倚音为装饰音,不增加小节时值,须快速连入主音 fa。省略歌词及异音连奏线;速度为四分音符的练习建议。保持 C4–C5 音区以使用常规压音,未整体升八度。",
+ "lines": [
+ [
+ {
+ "notes": [
+ 112
+ ]
+ },
+ {
+ "notes": [
+ 50,
+ 108,
+ 15,
+ 12
+ ]
+ },
+ {
+ "notes": [
+ 113,
+ 79,
+ 108,
+ 112
+ ]
+ },
+ {
+ "notes": [
+ 53,
+ 92,
+ 92,
+ 79,
+ 92
+ ]
+ },
+ {
+ "notes": [
+ 114,
+ 20,
+ 112
+ ]
+ }
+ ],
+ [
+ {
+ "notes": [
+ 50,
+ 108,
+ 15,
+ 12
+ ]
+ },
+ {
+ "notes": [
+ 113,
+ 79,
+ 108,
+ 112
+ ]
+ },
+ {
+ "notes": [
+ 51,
+ 110,
+ 110,
+ 108,
+ 110
+ ]
+ },
+ {
+ "notes": [
+ 115,
+ 20,
+ 108
+ ]
+ }
+ ],
+ [
+ {
+ "notes": [
+ 53,
+ 116,
+ 110,
+ 108,
+ 92
+ ]
+ },
+ {
+ "notes": [
+ 15,
+ 108,
+ 12,
+ 59,
+ 12
+ ]
+ },
+ {
+ "notes": [
+ 12,
+ 24,
+ 31,
+ 31,
+ 79,
+ 117
+ ]
+ },
+ {
+ "notes": [
+ 78,
+ 20,
+ 112
+ ]
+ }
+ ],
+ [
+ {
+ "notes": [
+ 50,
+ 108,
+ 15,
+ 12
+ ]
+ },
+ {
+ "notes": [
+ 12,
+ 31,
+ 92,
+ 51,
+ 31
+ ]
+ },
+ {
+ "notes": [
+ 79,
+ 108,
+ 79,
+ 118,
+ 108,
+ 110
+ ]
+ },
+ {
+ "sectionEnd": true,
+ "notes": [
+ 50,
+ 59,
+ 20
+ ]
+ }
+ ]
+ ]
+ },
+ {
+ "id": "cross-harp-call-response",
+ "title": "二把位呼应练习",
+ "subtitle": "Cross-Harp Call and Response",
+ "composer": "HarpScore 原创练习曲",
+ "key": "G",
+ "harmonicaKey": "C",
+ "position": "第二把位",
+ "timeSignature": "4/4",
+ "tempo": 80,
+ "difficulty": 2,
+ "tags": [
+ "布鲁斯",
+ "原创练习",
+ "呼应",
+ "自然音"
+ ],
+ "source": "HarpScore 原创:四组各四小节的呼应练习,可自由使用。",
+ "sourceFormat": "original",
+ "sourceCheckedAt": "2026-10-22",
+ "builtin": true,
+ "order": 27,
+ "notes": "C 调口琴奏 G 调,使用 G、B、C、D、F、G 高音的自然音;每组前两小节提出短句,后两小节回应,保留休止以练习呼吸。八分音符按等长演奏,不作三连音或 shuffle 标注;只写单音旋律,无伴奏。G4 按自动指法显示 3 孔吹,也可用同音高的 2 孔吸。",
+ "lines": [
+ [
+ {
+ "notes": [
+ 119,
+ 120,
+ 45,
+ 20,
+ 121
+ ]
+ },
+ {
+ "notes": [
+ 122,
+ 121,
+ 123,
+ 20
+ ]
+ },
+ {
+ "notes": [
+ 119,
+ 120,
+ 45,
+ 20,
+ 123
+ ]
+ },
+ {
+ "notes": [
+ 43,
+ 124
+ ]
+ }
+ ],
+ [
+ {
+ "notes": [
+ 125,
+ 45,
+ 126,
+ 20,
+ 122
+ ]
+ },
+ {
+ "notes": [
+ 127,
+ 122,
+ 121,
+ 20
+ ]
+ },
+ {
+ "notes": [
+ 125,
+ 45,
+ 126,
+ 20,
+ 121
+ ]
+ },
+ {
+ "notes": [
+ 128,
+ 124
+ ]
+ }
+ ],
+ [
+ {
+ "notes": [
+ 45,
+ 45,
+ 122,
+ 121,
+ 20
+ ]
+ },
+ {
+ "notes": [
+ 120,
+ 41,
+ 121,
+ 123,
+ 20
+ ]
+ },
+ {
+ "notes": [
+ 45,
+ 126,
+ 127,
+ 122,
+ 121
+ ]
+ },
+ {
+ "notes": [
+ 43,
+ 124
+ ]
+ }
+ ],
+ [
+ {
+ "notes": [
+ 119,
+ 120,
+ 45,
+ 122,
+ 20
+ ]
+ },
+ {
+ "notes": [
+ 125,
+ 45,
+ 126,
+ 127,
+ 20
+ ]
+ },
+ {
+ "notes": [
+ 126,
+ 45,
+ 41,
+ 120,
+ 119,
+ 20
+ ]
+ },
+ {
+ "sectionEnd": true,
+ "notes": [
+ 129,
+ 20
+ ]
+ }
+ ]
+ ]
+ },
+ {
+ "id": "low-blues-scale-study",
+ "title": "低音区蓝调音阶练习",
+ "subtitle": "G Blues Scale · Bend Accuracy",
+ "composer": "HarpScore 原创练习曲",
+ "key": "G",
+ "harmonicaKey": "C",
+ "position": "第二把位",
+ "timeSignature": "4/4",
+ "tempo": 72,
+ "difficulty": 3,
+ "tags": [
+ "布鲁斯",
+ "原创练习",
+ "压音",
+ "蓝调音阶"
+ ],
+ "source": "HarpScore 原创:G 蓝调六声音阶的上行、下行、半音定位和短句收束练习;可自由使用。",
+ "sourceFormat": "original",
+ "sourceCheckedAt": "2026-10-22",
+ "builtin": true,
+ "order": 28,
+ "notes": "音集 G–Bb–C–Db–D–F;Bb4 为 3 孔吸压半音,Db5 为 4 孔吸压半音。第 5–6 小节对比 C–Db–D 与 D–Db–C,先慢速分音保持音准,再连贯演奏。八分音符等长,曲末留一拍休止;全曲为 8 小节专项练习。G4 自动标为 3 孔吹,可选同音高 2 孔吸。",
+ "lines": [
+ [
+ {
+ "notes": [
+ 119,
+ 130,
+ 125,
+ 131
+ ]
+ },
+ {
+ "notes": [
+ 121,
+ 122,
+ 132
+ ]
+ },
+ {
+ "notes": [
+ 127,
+ 122,
+ 121,
+ 131
+ ]
+ },
+ {
+ "notes": [
+ 125,
+ 130,
+ 43
+ ]
+ }
+ ],
+ [
+ {
+ "notes": [
+ 41,
+ 42,
+ 121,
+ 41,
+ 42,
+ 121
+ ]
+ },
+ {
+ "notes": [
+ 45,
+ 42,
+ 125,
+ 45,
+ 42,
+ 125
+ ]
+ },
+ {
+ "notes": [
+ 39,
+ 41,
+ 42,
+ 45,
+ 122,
+ 121
+ ]
+ },
+ {
+ "sectionEnd": true,
+ "notes": [
+ 130,
+ 43,
+ 20
+ ]
+ }
+ ]
+ ]
+ },
+ {
+ "id": "wuxi-jing",
+ "title": "无锡景",
+ "subtitle": "江苏民歌 · 单顺波音与前倚音",
+ "composer": "江苏民歌",
+ "key": "C",
+ "harmonicaKey": "C",
+ "position": "第一把位",
+ "timeSignature": "2/4",
+ "tempo": 76,
+ "difficulty": 3,
+ "tags": [
+ "中国民歌",
+ "江南",
+ "前倚音",
+ "波音"
+ ],
+ "source": "郭丽萍、王立民、马志飞主编《音乐鉴赏》(新华出版社)印刷第18页/PDF第25页,谱例1-8;完整16小节主旋律。",
+ "sourceUrl": "https://backend.sjhtbook.com/upload/file/2025/04/80fb4b7923894770828045c9e613e236.pdf#page=25",
+ "sourceFormat": "jianpu-image",
+ "sourceCheckedAt": "2026-10-22",
+ "builtin": true,
+ "order": 29,
+ "notes": "原谱1=B改为1=C后整体提高八度,使用C调口琴中高音区自然音。首小节高音re为单顺波音:主音re—上方mi—re,辅助mi的孔位在谱下标为“辅 +8”;第4、8小节保留短前倚音。波音和倚音不额外增加小节拍数,应快速连贯演奏。保留原谱附点及十六分节奏,省略歌词和异音连奏线;速度为练习建议。",
+ "lines": [
+ [
+ {
+ "notes": [
+ 26,
+ 66,
+ 70,
+ 26,
+ 133
+ ]
+ },
+ {
+ "notes": [
+ 69,
+ 74,
+ 69,
+ 66,
+ 1
+ ]
+ },
+ {
+ "notes": [
+ 26,
+ 69,
+ 69,
+ 69,
+ 66,
+ 70,
+ 66
+ ]
+ },
+ {
+ "notes": [
+ 134
+ ]
+ },
+ {
+ "notes": [
+ 27,
+ 19,
+ 36
+ ]
+ }
+ ],
+ [
+ {
+ "notes": [
+ 135,
+ 74,
+ 135,
+ 74
+ ]
+ },
+ {
+ "notes": [
+ 71,
+ 136,
+ 36,
+ 27
+ ]
+ },
+ {
+ "notes": [
+ 137,
+ 69,
+ 1
+ ]
+ },
+ {
+ "notes": [
+ 66,
+ 69,
+ 66,
+ 70,
+ 5
+ ]
+ },
+ {
+ "notes": [
+ 27,
+ 19,
+ 36
+ ]
+ },
+ {
+ "notes": [
+ 138,
+ 69,
+ 1
+ ]
+ }
+ ],
+ [
+ {
+ "notes": [
+ 66,
+ 69,
+ 66,
+ 70,
+ 5
+ ]
+ },
+ {
+ "notes": [
+ 17,
+ 17,
+ 138,
+ 69
+ ]
+ },
+ {
+ "notes": [
+ 70,
+ 66,
+ 70,
+ 105,
+ 6
+ ]
+ },
+ {
+ "notes": [
+ 13,
+ 70,
+ 70,
+ 70,
+ 66,
+ 10
+ ]
+ },
+ {
+ "sectionEnd": true,
+ "notes": [
+ 105,
+ 70,
+ 105,
+ 85,
+ 0
+ ]
+ }
+ ]
+ ]
+ },
+ {
+ "id": "spring-excursion",
+ "title": "春游",
+ "subtitle": "李叔同 · 主旋律",
+ "composer": "李叔同",
+ "key": "C",
+ "harmonicaKey": "C",
+ "position": "第一把位",
+ "timeSignature": "6/8",
+ "tempo": 96,
+ "difficulty": 3,
+ "tags": [
+ "中国经典",
+ "学堂乐歌",
+ "六八拍",
+ "压音"
+ ],
+ "source": "人民教育出版社《音乐七年级下册·简谱》印刷第6–7页(PDF第11–12页);完整16小节女声I主旋律。",
+ "sourceUrl": "https://dev98.oa.henanyuexue.com/static/szjc-resources/pdf/q/f/2/7.pdf#page=11",
+ "sourceFormat": "jianpu-image",
+ "sourceCheckedAt": "2026-10-22",
+ "builtin": true,
+ "order": 30,
+ "notes": "取教材女声I的完整主旋律,不加入中、低声部;原1=C音区保留,最高音C5。桥段升fa为F#4,可用2孔吸压半音;自然fa为2孔吸压全音。保留6/8节奏及四个乐句,省略歌词、力度渐变和末段rit.,速度为四分音符的练习建议。",
+ "lines": [
+ [
+ {
+ "notes": [
+ 15,
+ 79,
+ 0,
+ 79
+ ]
+ },
+ {
+ "notes": [
+ 52,
+ 92,
+ 78
+ ]
+ },
+ {
+ "notes": [
+ 0,
+ 12,
+ 15,
+ 79
+ ]
+ },
+ {
+ "notes": [
+ 53,
+ 110,
+ 114
+ ]
+ }
+ ],
+ [
+ {
+ "notes": [
+ 15,
+ 79,
+ 0,
+ 79
+ ]
+ },
+ {
+ "notes": [
+ 52,
+ 92,
+ 78
+ ]
+ },
+ {
+ "notes": [
+ 0,
+ 12,
+ 15,
+ 79
+ ]
+ },
+ {
+ "notes": [
+ 53,
+ 110,
+ 115
+ ]
+ }
+ ],
+ [
+ {
+ "notes": [
+ 51,
+ 110,
+ 51,
+ 79
+ ]
+ },
+ {
+ "notes": [
+ 53,
+ 92,
+ 114
+ ]
+ },
+ {
+ "notes": [
+ 15,
+ 79,
+ 98,
+ 31
+ ]
+ },
+ {
+ "notes": [
+ 15,
+ 117,
+ 78
+ ]
+ }
+ ],
+ [
+ {
+ "notes": [
+ 15,
+ 79,
+ 0,
+ 79
+ ]
+ },
+ {
+ "notes": [
+ 52,
+ 92,
+ 78
+ ]
+ },
+ {
+ "notes": [
+ 0,
+ 12,
+ 15,
+ 79
+ ]
+ },
+ {
+ "sectionEnd": true,
+ "notes": [
+ 53,
+ 110,
+ 115
+ ]
+ }
+ ]
+ ]
+ },
+ {
+ "id": "cuckoo-song",
+ "title": "布谷鸟",
+ "subtitle": "Cuckoo, You Sing So Clear · 1927歌集版",
+ "composer": "德国传统曲调",
+ "key": "C",
+ "harmonicaKey": "C",
+ "position": "第一把位",
+ "timeSignature": "3/4",
+ "tempo": 108,
+ "difficulty": 1,
+ "tags": [
+ "西方歌曲",
+ "入门",
+ "自然音",
+ "三拍子"
+ ],
+ "source": "The Everyday Song Book(1927)第117首,John Chambers于2017年转录的ABC;完整12小节旋律,原Bb调移为C调(Bb4→C5)。",
+ "sourceUrl": "https://trillian.mit.edu/~jc/music/book/EverydaySongBook/117_Cuckoo_You_Sing_So_Clear.abc",
+ "sourceFormat": "music-text",
+ "sourceCheckedAt": "2026-10-22",
+ "builtin": true,
+ "order": 31,
+ "notes": "开头两次sol–mi模仿布谷声,第三拍休止不要省略;第4、12小节末同样有四分休止。中段的二分长音与三拍律动保留。仅录入所选歌集的旋律,省略歌词与mf力度,数值速度为练习建议。",
+ "lines": [
+ [
+ {
+ "notes": [
+ 1,
+ 5,
+ 20
+ ]
+ },
+ {
+ "notes": [
+ 1,
+ 5,
+ 20
+ ]
+ },
+ {
+ "notes": [
+ 6,
+ 0,
+ 6
+ ]
+ },
+ {
+ "notes": [
+ 7,
+ 20
+ ]
+ }
+ ],
+ [
+ {
+ "notes": [
+ 6,
+ 6,
+ 5
+ ]
+ },
+ {
+ "notes": [
+ 48,
+ 6
+ ]
+ },
+ {
+ "notes": [
+ 5,
+ 5,
+ 4
+ ]
+ },
+ {
+ "notes": [
+ 3,
+ 5
+ ]
+ }
+ ],
+ [
+ {
+ "notes": [
+ 3,
+ 5
+ ]
+ },
+ {
+ "notes": [
+ 3,
+ 5
+ ]
+ },
+ {
+ "notes": [
+ 4,
+ 5,
+ 6
+ ]
+ },
+ {
+ "sectionEnd": true,
+ "notes": [
+ 7,
+ 20
+ ]
+ }
+ ]
+ ]
+ },
+ {
+ "id": "rock-a-bye-baby",
+ "title": "摇篮曲",
+ "subtitle": "Rock-a-bye Baby · 1927歌集版",
+ "composer": "传统曲调",
+ "key": "C",
+ "harmonicaKey": "C",
+ "position": "第一把位",
+ "timeSignature": "6/8",
+ "tempo": 72,
+ "difficulty": 3,
+ "tags": [
+ "西方歌曲",
+ "摇篮曲",
+ "六八拍",
+ "压音"
+ ],
+ "source": "The Everyday Song Book(1927)第9首,John Chambers于2015年转录的ABC;完整8小节,原Bb调移为C调(Bb4→C5),保留原相对音区。",
+ "sourceUrl": "https://trillian.mit.edu/~jc/music/book/EverydaySongBook/009_Rock-a-bye_Baby.abc",
+ "sourceFormat": "music-text",
+ "sourceCheckedAt": "2026-10-22",
+ "builtin": true,
+ "order": 32,
+ "notes": "每小节六个八分单位;开头附点八分加十六分不是等长八分。保持E4–F5音域,低fa使用2孔吸压全音,低la使用3孔吸压全音。两次相似开头的第2小节结尾不同;最后保留八分休止。省略歌词,速度为四分音符的练习建议。",
+ "lines": [
+ [
+ {
+ "notes": [
+ 96,
+ 90,
+ 13,
+ 6,
+ 12
+ ]
+ },
+ {
+ "notes": [
+ 96,
+ 90,
+ 12,
+ 139
+ ]
+ },
+ {
+ "notes": [
+ 107,
+ 90,
+ 14,
+ 5,
+ 10
+ ]
+ },
+ {
+ "notes": [
+ 10,
+ 12,
+ 31,
+ 78
+ ]
+ }
+ ],
+ [
+ {
+ "notes": [
+ 96,
+ 90,
+ 13,
+ 6,
+ 12
+ ]
+ },
+ {
+ "notes": [
+ 96,
+ 90,
+ 12,
+ 98,
+ 31
+ ]
+ },
+ {
+ "notes": [
+ 79,
+ 12,
+ 14,
+ 13,
+ 0
+ ]
+ },
+ {
+ "sectionEnd": true,
+ "notes": [
+ 10,
+ 31,
+ 24,
+ 0,
+ 59
+ ]
+ }
+ ]
+ ]
+ },
+ {
+ "id": "pan-hong-jun",
+ "title": "盼红军",
+ "subtitle": "四川民歌 · 教材完整旋律",
+ "composer": "四川民歌",
+ "key": "C",
+ "harmonicaKey": "C",
+ "position": "第四把位",
+ "timeSignature": "2/4",
+ "tempo": 84,
+ "difficulty": 3,
+ "tags": [
+ "中国民歌",
+ "四川",
+ "压音",
+ "羽调式"
+ ],
+ "source": "粤教花城版《音乐六年级上册·简谱》印刷第47页/PDF第48页,完整12小节。原1=D改为1=C后整体提高八度。",
+ "sourceUrl": "https://lywgyxx.szftedu.cn/xkjc/yinyue/202209/P020220910588732922659.pdf#page=48",
+ "sourceFormat": "jianpu-image",
+ "sourceCheckedAt": "2026-10-22",
+ "builtin": true,
+ "order": 33,
+ "notes": "简谱1=C,旋律以低la(A4)收束,按C调口琴第四把位练习;低la为3孔吸压全音。保留附点八分、十六分和结尾跨小节延音,末音需持续四个四分拍。省略歌词及异音连奏线,速度为练习建议。",
+ "lines": [
+ [
+ {
+ "notes": [
+ 10,
+ 0,
+ 84,
+ 85
+ ]
+ },
+ {
+ "notes": [
+ 104,
+ 70,
+ 13,
+ 31
+ ]
+ },
+ {
+ "notes": [
+ 10,
+ 0,
+ 84,
+ 85
+ ]
+ },
+ {
+ "notes": [
+ 13,
+ 84,
+ 85,
+ 5
+ ]
+ }
+ ],
+ [
+ {
+ "notes": [
+ 105,
+ 70,
+ 2,
+ 27
+ ]
+ },
+ {
+ "notes": [
+ 2,
+ 17,
+ 13
+ ]
+ },
+ {
+ "notes": [
+ 26,
+ 5,
+ 85,
+ 105
+ ]
+ },
+ {
+ "notes": [
+ 0,
+ 84,
+ 85,
+ 105,
+ 70
+ ]
+ }
+ ],
+ [
+ {
+ "notes": [
+ 5,
+ 10,
+ 12
+ ]
+ },
+ {
+ "notes": [
+ 31,
+ 0,
+ 88,
+ 84
+ ]
+ },
+ {
+ "notes": [
+ 140
+ ]
+ },
+ {
+ "sectionEnd": true,
+ "notes": [
+ 81
+ ]
+ }
+ ]
+ ]
+ },
+ {
+ "id": "meng-jiang-nv",
+ "title": "孟姜女,哭长城",
+ "subtitle": "江苏民歌 · 粤教花城版",
+ "composer": "江苏民歌",
+ "key": "C",
+ "harmonicaKey": "C",
+ "timeSignature": "4/4",
+ "tempo": 64,
+ "difficulty": 4,
+ "tags": [
+ "中国民歌",
+ "江苏",
+ "前倚音",
+ "三十二分音符"
+ ],
+ "source": "粤教花城版《音乐六年级上册·简谱》印刷第49页/PDF第50页,完整8小节主旋律。原1=F改为1=C后整体提高八度。",
+ "sourceUrl": "https://lywgyxx.szftedu.cn/xkjc/yinyue/202209/P020220910588732922659.pdf#page=50",
+ "sourceFormat": "jianpu-image",
+ "sourceCheckedAt": "2026-10-22",
+ "builtin": true,
+ "order": 34,
+ "notes": "按所选教材保留繁密的加花旋律,包含五处附点十六分接三十二分、四处八分形状前倚音,以及第2、3小节的同音延音。音域E4–A5,低la为3孔吸压全音;慢练短音组,长音和休止保持原值。省略歌词及异音连奏线,速度为练习建议。",
+ "lines": [
+ [
+ {
+ "notes": [
+ 12,
+ 0,
+ 10,
+ 141,
+ 142,
+ 105,
+ 85,
+ 143
+ ]
+ },
+ {
+ "notes": [
+ 17,
+ 144,
+ 66,
+ 145,
+ 70,
+ 105,
+ 146
+ ]
+ }
+ ],
+ [
+ {
+ "notes": [
+ 10,
+ 147,
+ 70,
+ 148,
+ 105,
+ 85,
+ 84,
+ 88,
+ 84,
+ 85,
+ 105,
+ 89,
+ 70,
+ 105
+ ]
+ },
+ {
+ "notes": [
+ 149,
+ 150,
+ 85,
+ 84,
+ 88,
+ 90,
+ 84,
+ 88,
+ 151
+ ]
+ }
+ ],
+ [
+ {
+ "notes": [
+ 90,
+ 111,
+ 90,
+ 88,
+ 0,
+ 149,
+ 150,
+ 84,
+ 85,
+ 5
+ ]
+ },
+ {
+ "notes": [
+ 17,
+ 105,
+ 85,
+ 12,
+ 105,
+ 85,
+ 85,
+ 84,
+ 152
+ ]
+ }
+ ],
+ [
+ {
+ "notes": [
+ 88,
+ 84,
+ 85,
+ 105,
+ 153,
+ 154,
+ 84,
+ 88,
+ 90,
+ 111,
+ 90,
+ 88,
+ 12,
+ 70,
+ 105
+ ]
+ },
+ {
+ "sectionEnd": true,
+ "notes": [
+ 149,
+ 150,
+ 85,
+ 84,
+ 88,
+ 90,
+ 84,
+ 88,
+ 151
+ ]
+ }
+ ]
+ ]
+ },
+ {
+ "id": "did-you-ever-see-a-lassie",
+ "title": "你可曾见过小姑娘",
+ "subtitle": "Did You Ever See a Lassie? · 1927歌集版",
+ "composer": "传统曲调",
+ "key": "C",
+ "harmonicaKey": "C",
+ "position": "第一把位",
+ "timeSignature": "3/4",
+ "tempo": 96,
+ "difficulty": 1,
+ "tags": [
+ "西方歌曲",
+ "入门",
+ "自然音",
+ "弱起"
+ ],
+ "source": "The Everyday Song Book(1927)第10首,John Chambers于2015年转录的ABC;完整16小节加一拍弱起,G4主音移至C5。",
+ "sourceUrl": "https://trillian.mit.edu/~jc/music/book/EverydaySongBook/010_Did_You_Ever_See_a_Lassie.abc",
+ "sourceFormat": "music-text",
+ "sourceCheckedAt": "2026-10-22",
+ "builtin": true,
+ "order": 35,
+ "notes": "首尾一拍加两拍互补,保留中间的四分休止;所选版本含重复的动作问答段落。全自然音,音域G4–A5。省略歌词,速度为练习建议。",
+ "lines": [
+ [
+ {
+ "notes": [
+ 12,
+ 13
+ ]
+ },
+ {
+ "notes": [
+ 30,
+ 26,
+ 17,
+ 14
+ ]
+ },
+ {
+ "notes": [
+ 5,
+ 0,
+ 0
+ ]
+ },
+ {
+ "notes": [
+ 6,
+ 15,
+ 15
+ ]
+ },
+ {
+ "notes": [
+ 5,
+ 0,
+ 12,
+ 13
+ ]
+ }
+ ],
+ [
+ {
+ "notes": [
+ 30,
+ 26,
+ 17,
+ 14
+ ]
+ },
+ {
+ "notes": [
+ 5,
+ 0,
+ 0
+ ]
+ },
+ {
+ "notes": [
+ 6,
+ 15,
+ 15
+ ]
+ },
+ {
+ "notes": [
+ 0,
+ 20,
+ 0
+ ]
+ }
+ ],
+ [
+ {
+ "notes": [
+ 6,
+ 15,
+ 15
+ ]
+ },
+ {
+ "notes": [
+ 5,
+ 0,
+ 0
+ ]
+ },
+ {
+ "notes": [
+ 6,
+ 15,
+ 15
+ ]
+ },
+ {
+ "notes": [
+ 5,
+ 0,
+ 12,
+ 13
+ ]
+ }
+ ],
+ [
+ {
+ "notes": [
+ 30,
+ 26,
+ 17,
+ 14
+ ]
+ },
+ {
+ "notes": [
+ 5,
+ 0,
+ 0
+ ]
+ },
+ {
+ "notes": [
+ 6,
+ 15,
+ 15
+ ]
+ },
+ {
+ "sectionEnd": true,
+ "notes": [
+ 7
+ ]
+ }
+ ]
+ ]
+ },
+ {
+ "id": "golden-slumbers",
+ "title": "金色梦乡",
+ "subtitle": "Golden Slumbers · 传统摇篮曲",
+ "composer": "传统曲调",
+ "key": "C",
+ "harmonicaKey": "C",
+ "position": "第一把位",
+ "timeSignature": "3/4",
+ "tempo": 72,
+ "difficulty": 3,
+ "tags": [
+ "西方歌曲",
+ "摇篮曲",
+ "三拍子",
+ "压音"
+ ],
+ "source": "The Everyday Song Book(1927)第175首,John Chambers于2017年转录的ABC;16个写出小节,前8小节保留反复。原Bb4主音移至C5。",
+ "sourceUrl": "https://trillian.mit.edu/~jc/music/book/EverydaySongBook/175_Golden_Slumbers.abc",
+ "sourceFormat": "music-text",
+ "sourceCheckedAt": "2026-10-22",
+ "builtin": true,
+ "order": 36,
+ "notes": "传统旋律版本,并非同名流行歌曲。音域E4–G5,低fa为2孔吸压全音、低la为3孔吸压全音;保留三拍长音及前半段反复,异音连奏线和歌词省略。速度为练习建议。",
+ "lines": [
+ [
+ {
+ "repeatBegin": true,
+ "notes": [
+ 15,
+ 52,
+ 53
+ ]
+ },
+ {
+ "notes": [
+ 77,
+ 5
+ ]
+ },
+ {
+ "notes": [
+ 8,
+ 0
+ ]
+ },
+ {
+ "notes": [
+ 102
+ ]
+ }
+ ],
+ [
+ {
+ "notes": [
+ 15,
+ 52,
+ 53
+ ]
+ },
+ {
+ "notes": [
+ 77,
+ 5
+ ]
+ },
+ {
+ "notes": [
+ 8,
+ 0
+ ]
+ },
+ {
+ "repeatEnd": true,
+ "notes": [
+ 155
+ ]
+ }
+ ],
+ [
+ {
+ "notes": [
+ 6,
+ 5,
+ 4
+ ]
+ },
+ {
+ "notes": [
+ 1,
+ 4,
+ 5
+ ]
+ },
+ {
+ "notes": [
+ 4,
+ 5,
+ 6
+ ]
+ },
+ {
+ "notes": [
+ 0,
+ 98,
+ 15
+ ]
+ }
+ ],
+ [
+ {
+ "notes": [
+ 0,
+ 46
+ ]
+ },
+ {
+ "notes": [
+ 81,
+ 6
+ ]
+ },
+ {
+ "notes": [
+ 15,
+ 156
+ ]
+ },
+ {
+ "sectionEnd": true,
+ "notes": [
+ 33
+ ]
+ }
+ ]
+ ]
+ },
+ {
+ "id": "spotted-dove-song",
+ "title": "斑鸠调",
+ "subtitle": "江西民歌 · 演唱主旋律",
+ "composer": "江西民歌",
+ "key": "C",
+ "harmonicaKey": "C",
+ "timeSignature": "2/4",
+ "tempo": 88,
+ "difficulty": 2,
+ "tags": [
+ "中国民歌",
+ "江西",
+ "自然音",
+ "十六分音符"
+ ],
+ "source": "粤教花城《音乐六年级上册·简谱》印刷第38页/PDF第39页;从“回原速”开始的完整9小节演唱主旋律,反复保留。采用源谱1=C并整体提高八度。",
+ "sourceUrl": "https://lywgyxx.szftedu.cn/xkjc/yinyue/202209/P020220910588732922659.pdf#page=39",
+ "sourceFormat": "jianpu-image",
+ "sourceCheckedAt": "2026-10-22",
+ "builtin": true,
+ "order": 37,
+ "notes": "仅收录带歌词的演唱主旋律,前面的“鸟儿的对话”前奏/双声部段不属于本版独奏谱。音域E5–E6,全自然音;保留第8小节附点八分接十六分、末尾两拍长音与整段反复。歌词及异音连奏线省略,速度为练习建议。",
+ "lines": [
+ [
+ {
+ "repeatBegin": true,
+ "notes": [
+ 27,
+ 69,
+ 66,
+ 70,
+ 66,
+ 74,
+ 69
+ ]
+ },
+ {
+ "notes": [
+ 26,
+ 66,
+ 70,
+ 2
+ ]
+ },
+ {
+ "notes": [
+ 27,
+ 69,
+ 66,
+ 70,
+ 66,
+ 74,
+ 69
+ ]
+ },
+ {
+ "notes": [
+ 26,
+ 66,
+ 70,
+ 2
+ ]
+ }
+ ],
+ [
+ {
+ "notes": [
+ 27,
+ 19,
+ 69,
+ 74
+ ]
+ },
+ {
+ "notes": [
+ 80,
+ 80,
+ 61
+ ]
+ },
+ {
+ "notes": [
+ 66,
+ 66,
+ 66,
+ 74,
+ 69,
+ 74,
+ 66,
+ 70
+ ]
+ },
+ {
+ "notes": [
+ 104,
+ 85,
+ 105,
+ 85,
+ 105,
+ 66
+ ]
+ },
+ {
+ "repeatEnd": true,
+ "notes": [
+ 3
+ ]
+ }
+ ]
+ ]
+ },
+ {
+ "id": "flying-kites",
+ "title": "放纸鹞",
+ "subtitle": "台湾民谣《一只鸟仔》曲调",
+ "composer": "台湾民谣",
+ "key": "C",
+ "harmonicaKey": "C",
+ "timeSignature": "4/4",
+ "tempo": 96,
+ "difficulty": 3,
+ "tags": [
+ "中国民歌",
+ "台湾",
+ "自然音",
+ "反复展开"
+ ],
+ "source": "粤教花城《音乐六年级上册·简谱》印刷第15页/PDF第16页。采用台湾民谣《一只鸟仔》曲调,仅录旋律,不收录教材新填歌词。原1=A改为1=C后整体提高八度,两个反复结尾展开为24小节。",
+ "sourceUrl": "https://lywgyxx.szftedu.cn/xkjc/yinyue/202209/P020220910588732922659.pdf#page=16",
+ "sourceFormat": "jianpu-image",
+ "sourceCheckedAt": "2026-10-22",
+ "builtin": true,
+ "order": 38,
+ "notes": "音域D5–F6,全部自然音。第一遍结尾括号内re是中音,第二遍是高音,不能复制同一结尾。保留括号内器乐回应及全部休止,省略歌词和异音连奏线。速度为练习建议。",
+ "lines": [
+ [
+ {
+ "notes": [
+ 61,
+ 63,
+ 36,
+ 74,
+ 136,
+ 36,
+ 27
+ ]
+ },
+ {
+ "notes": [
+ 36,
+ 59,
+ 26,
+ 26,
+ 36,
+ 59,
+ 20
+ ]
+ },
+ {
+ "notes": [
+ 2,
+ 61,
+ 26,
+ 27,
+ 26,
+ 17
+ ]
+ }
+ ],
+ [
+ {
+ "notes": [
+ 6,
+ 17,
+ 26,
+ 17,
+ 59,
+ 20
+ ]
+ },
+ {
+ "notes": [
+ 19,
+ 61,
+ 27,
+ 69,
+ 74,
+ 27,
+ 17
+ ]
+ },
+ {
+ "notes": [
+ 27,
+ 59,
+ 17,
+ 17,
+ 27,
+ 59,
+ 20
+ ]
+ }
+ ],
+ [
+ {
+ "notes": [
+ 61,
+ 61,
+ 26,
+ 27,
+ 26,
+ 17
+ ]
+ },
+ {
+ "notes": [
+ 6,
+ 17,
+ 26,
+ 17,
+ 59,
+ 20
+ ]
+ },
+ {
+ "notes": [
+ 61,
+ 61,
+ 61,
+ 61
+ ]
+ }
+ ],
+ [
+ {
+ "notes": [
+ 27,
+ 36,
+ 64,
+ 80,
+ 36,
+ 80,
+ 19
+ ]
+ },
+ {
+ "notes": [
+ 157,
+ 26,
+ 26
+ ]
+ },
+ {
+ "notes": [
+ 61,
+ 26,
+ 26,
+ 6,
+ 20
+ ]
+ }
+ ],
+ [
+ {
+ "notes": [
+ 61,
+ 63,
+ 36,
+ 74,
+ 136,
+ 36,
+ 27
+ ]
+ },
+ {
+ "notes": [
+ 36,
+ 59,
+ 26,
+ 26,
+ 36,
+ 59,
+ 20
+ ]
+ },
+ {
+ "notes": [
+ 2,
+ 61,
+ 26,
+ 27,
+ 26,
+ 17
+ ]
+ }
+ ],
+ [
+ {
+ "notes": [
+ 6,
+ 17,
+ 26,
+ 17,
+ 59,
+ 20
+ ]
+ },
+ {
+ "notes": [
+ 19,
+ 61,
+ 27,
+ 69,
+ 74,
+ 27,
+ 17
+ ]
+ },
+ {
+ "notes": [
+ 27,
+ 59,
+ 17,
+ 17,
+ 27,
+ 59,
+ 20
+ ]
+ }
+ ],
+ [
+ {
+ "notes": [
+ 61,
+ 61,
+ 26,
+ 27,
+ 26,
+ 17
+ ]
+ },
+ {
+ "notes": [
+ 6,
+ 17,
+ 26,
+ 17,
+ 59,
+ 20
+ ]
+ },
+ {
+ "notes": [
+ 61,
+ 61,
+ 61,
+ 61
+ ]
+ }
+ ],
+ [
+ {
+ "notes": [
+ 27,
+ 36,
+ 64,
+ 80,
+ 36,
+ 80,
+ 19
+ ]
+ },
+ {
+ "notes": [
+ 157,
+ 26,
+ 26
+ ]
+ },
+ {
+ "sectionEnd": true,
+ "notes": [
+ 61,
+ 26,
+ 26,
+ 61,
+ 20
+ ]
+ }
+ ]
+ ]
+ },
+ {
+ "id": "jasmine-flower",
+ "title": "茉莉花",
+ "subtitle": "江苏民歌 · 好一朵美丽的茉莉花",
+ "composer": "江苏民歌",
+ "key": "C",
+ "harmonicaKey": "C",
+ "timeSignature": "2/4",
+ "tempo": 84,
+ "difficulty": 2,
+ "tags": [
+ "中国民歌",
+ "江苏",
+ "入门",
+ "附点节奏"
+ ],
+ "source": "粤教花城《音乐四年级下册·简谱》印刷第15页/PDF第16页,完整28小节;采用该页版本,不混合第12页加花版本。原1=D改为1=C后整体提高八度。",
+ "sourceUrl": "https://lywgyxx.szftedu.cn/xkjc/yinyue/202209/P020220910587435677420.pdf#page=16",
+ "sourceFormat": "jianpu-image",
+ "sourceCheckedAt": "2026-10-23",
+ "builtin": true,
+ "order": 39,
+ "notes": "保留全部七行、句末休止和后段低音sol/la;音域G4–C6,低la需3孔吸压全音。后半段较前半段难,先慢练附点和跳进。仅录旋律,省略歌词及异音连奏线,速度为练习建议。",
+ "lines": [
+ [
+ {
+ "notes": [
+ 5,
+ 13,
+ 17
+ ]
+ },
+ {
+ "notes": [
+ 26,
+ 27,
+ 27,
+ 26
+ ]
+ },
+ {
+ "notes": [
+ 1,
+ 17,
+ 26
+ ]
+ },
+ {
+ "notes": [
+ 1,
+ 20
+ ]
+ }
+ ],
+ [
+ {
+ "notes": [
+ 5,
+ 13,
+ 17
+ ]
+ },
+ {
+ "notes": [
+ 26,
+ 27,
+ 27,
+ 26
+ ]
+ },
+ {
+ "notes": [
+ 1,
+ 17,
+ 26
+ ]
+ },
+ {
+ "notes": [
+ 1,
+ 20
+ ]
+ }
+ ],
+ [
+ {
+ "notes": [
+ 1,
+ 1
+ ]
+ },
+ {
+ "notes": [
+ 1,
+ 13,
+ 17
+ ]
+ },
+ {
+ "notes": [
+ 2,
+ 2
+ ]
+ },
+ {
+ "notes": [
+ 1,
+ 20
+ ]
+ }
+ ],
+ [
+ {
+ "notes": [
+ 5,
+ 10,
+ 13
+ ]
+ },
+ {
+ "notes": [
+ 1,
+ 13,
+ 10
+ ]
+ },
+ {
+ "notes": [
+ 0,
+ 12,
+ 10
+ ]
+ },
+ {
+ "notes": [
+ 0,
+ 20
+ ]
+ }
+ ],
+ [
+ {
+ "notes": [
+ 13,
+ 10,
+ 12,
+ 13
+ ]
+ },
+ {
+ "notes": [
+ 11,
+ 13
+ ]
+ },
+ {
+ "notes": [
+ 1,
+ 26,
+ 27
+ ]
+ },
+ {
+ "notes": [
+ 3
+ ]
+ }
+ ],
+ [
+ {
+ "notes": [
+ 6,
+ 13,
+ 17
+ ]
+ },
+ {
+ "notes": [
+ 10,
+ 13,
+ 12,
+ 31
+ ]
+ },
+ {
+ "notes": [
+ 77
+ ]
+ },
+ {
+ "notes": [
+ 32,
+ 0
+ ]
+ }
+ ],
+ [
+ {
+ "notes": [
+ 11,
+ 13
+ ]
+ },
+ {
+ "notes": [
+ 12,
+ 10,
+ 12,
+ 31
+ ]
+ },
+ {
+ "notes": [
+ 77
+ ]
+ },
+ {
+ "sectionEnd": true,
+ "notes": [
+ 15,
+ 20
+ ]
+ }
+ ]
+ ]
+ },
+ {
+ "id": "what-boat",
+ "title": "什么船儿",
+ "subtitle": "山西民歌曲调 · 三八拍问答",
+ "composer": "山西民歌曲调",
+ "key": "C",
+ "harmonicaKey": "C",
+ "timeSignature": "3/8",
+ "tempo": 72,
+ "difficulty": 2,
+ "tags": [
+ "中国民歌",
+ "山西",
+ "三八拍",
+ "压音"
+ ],
+ "source": "粤教花城《音乐四年级下册·简谱》印刷第46页/PDF第47页,完整12小节。原1=F改为1=C后整体提高八度;只录山西民歌曲调,不收录游戏新词。",
+ "sourceUrl": "https://lywgyxx.szftedu.cn/xkjc/yinyue/202209/P020220910587435677420.pdf#page=47",
+ "sourceFormat": "jianpu-image",
+ "sourceCheckedAt": "2026-10-23",
+ "builtin": true,
+ "order": 40,
+ "notes": "每小节三个八分单位,附点四分音符占满一小节;完整问答与衬句均保留。低sol、la、si不可误作中音,低la为3孔吸压全音。省略歌词与异音连奏线,速度按四分拍给出练习建议。",
+ "lines": [
+ [
+ {
+ "notes": [
+ 17,
+ 17,
+ 26
+ ]
+ },
+ {
+ "notes": [
+ 17,
+ 14,
+ 13
+ ]
+ },
+ {
+ "notes": [
+ 17,
+ 10,
+ 17
+ ]
+ },
+ {
+ "notes": [
+ 24,
+ 31,
+ 79
+ ]
+ },
+ {
+ "notes": [
+ 0,
+ 79
+ ]
+ },
+ {
+ "notes": [
+ 12,
+ 24,
+ 31
+ ]
+ }
+ ],
+ [
+ {
+ "notes": [
+ 12,
+ 79,
+ 31
+ ]
+ },
+ {
+ "notes": [
+ 78
+ ]
+ },
+ {
+ "notes": [
+ 0,
+ 79
+ ]
+ },
+ {
+ "notes": [
+ 12,
+ 24,
+ 31
+ ]
+ },
+ {
+ "notes": [
+ 12,
+ 79,
+ 31
+ ]
+ },
+ {
+ "sectionEnd": true,
+ "notes": [
+ 78
+ ]
+ }
+ ]
+ ]
+ },
+ {
+ "id": "home-on-the-range",
+ "title": "牧场上的家",
+ "subtitle": "Home on the Range · 教材主副歌",
+ "composer": "美国传统民歌",
+ "key": "C",
+ "harmonicaKey": "C",
+ "position": "第一把位",
+ "timeSignature": "3/4",
+ "tempo": 88,
+ "difficulty": 3,
+ "tags": [
+ "西方歌曲",
+ "三拍子",
+ "弱起",
+ "延音"
+ ],
+ "source": "粤教花城《音乐四年级下册·简谱》印刷第35页/PDF第36页,完整主歌与副歌,共33个写出小节(含一拍弱起)。原1=Eb改为1=C后整体提高八度。",
+ "sourceUrl": "https://lywgyxx.szftedu.cn/xkjc/yinyue/202209/P020220910587435677420.pdf#page=36",
+ "sourceFormat": "jianpu-image",
+ "sourceCheckedAt": "2026-10-23",
+ "builtin": true,
+ "order": 41,
+ "notes": "开头一拍与结尾两拍互补。保留长音跨小节延音、主副歌过渡和低音区;音域G4–G5,低la使用3孔吸压全音。省略译词、力度和异音连奏线,速度为练习建议。",
+ "lines": [
+ [
+ {
+ "notes": [
+ 79,
+ 79
+ ]
+ },
+ {
+ "notes": [
+ 15,
+ 0,
+ 6
+ ]
+ },
+ {
+ "notes": [
+ 46,
+ 12,
+ 24
+ ]
+ },
+ {
+ "notes": [
+ 32,
+ 4,
+ 4
+ ]
+ },
+ {
+ "notes": [
+ 48,
+ 14,
+ 14
+ ]
+ },
+ {
+ "notes": [
+ 3,
+ 0
+ ]
+ }
+ ],
+ [
+ {
+ "notes": [
+ 0,
+ 98,
+ 0
+ ]
+ },
+ {
+ "notes": [
+ 99
+ ]
+ },
+ {
+ "notes": [
+ 8,
+ 79,
+ 79
+ ]
+ },
+ {
+ "notes": [
+ 15,
+ 0,
+ 6
+ ]
+ },
+ {
+ "notes": [
+ 46,
+ 12,
+ 24
+ ]
+ },
+ {
+ "notes": [
+ 32,
+ 4,
+ 4
+ ]
+ }
+ ],
+ [
+ {
+ "notes": [
+ 48,
+ 14,
+ 14
+ ]
+ },
+ {
+ "notes": [
+ 9,
+ 10,
+ 0
+ ]
+ },
+ {
+ "notes": [
+ 98,
+ 0,
+ 6
+ ]
+ },
+ {
+ "notes": [
+ 100
+ ]
+ },
+ {
+ "notes": [
+ 33
+ ]
+ },
+ {
+ "notes": [
+ 158
+ ]
+ }
+ ],
+ [
+ {
+ "notes": [
+ 4,
+ 9,
+ 10
+ ]
+ },
+ {
+ "notes": [
+ 159
+ ]
+ },
+ {
+ "notes": [
+ 46,
+ 10,
+ 10
+ ]
+ },
+ {
+ "notes": [
+ 0,
+ 0,
+ 0
+ ]
+ },
+ {
+ "notes": [
+ 0,
+ 98,
+ 0
+ ]
+ }
+ ],
+ [
+ {
+ "notes": [
+ 99
+ ]
+ },
+ {
+ "notes": [
+ 8,
+ 79,
+ 79
+ ]
+ },
+ {
+ "notes": [
+ 15,
+ 0,
+ 6
+ ]
+ },
+ {
+ "notes": [
+ 46,
+ 12,
+ 24
+ ]
+ },
+ {
+ "notes": [
+ 32,
+ 4,
+ 4
+ ]
+ }
+ ],
+ [
+ {
+ "notes": [
+ 48,
+ 14,
+ 14
+ ]
+ },
+ {
+ "notes": [
+ 9,
+ 10,
+ 0
+ ]
+ },
+ {
+ "notes": [
+ 98,
+ 0,
+ 6
+ ]
+ },
+ {
+ "notes": [
+ 100
+ ]
+ },
+ {
+ "sectionEnd": true,
+ "notes": [
+ 7
+ ]
+ }
+ ]
+ ]
+ },
+ {
+ "id": "red-river-valley",
+ "title": "红河谷",
+ "subtitle": "Red River Valley · 教材版本",
+ "composer": "加拿大民歌",
+ "key": "C",
+ "harmonicaKey": "C",
+ "position": "第一把位",
+ "timeSignature": "4/4",
+ "tempo": 88,
+ "pickupBeats": 1,
+ "difficulty": 3,
+ "tags": [
+ "西方歌曲",
+ "弱起",
+ "半音",
+ "压音"
+ ],
+ "source": "粤教花城《音乐四年级下册·简谱》印刷第39页/PDF第40页,完整8小节加一拍弱起。原1=F改为1=C后整体提高八度,明确保留教材足拍末小节。",
+ "sourceUrl": "https://lywgyxx.szftedu.cn/xkjc/yinyue/202209/P020220910587435677420.pdf#page=40",
+ "sourceFormat": "jianpu-image",
+ "sourceCheckedAt": "2026-10-23",
+ "builtin": true,
+ "order": 42,
+ "notes": "本版本首尾不作互补:首小节一拍弱起,末小节四拍;不要删掉末尾休止。第6个完整小节低la接降la,分别为3孔吸压全音与一又二分之一音。保留同音延音,省略译词及异音连奏线,速度为练习建议。",
+ "lines": [
+ [
+ {
+ "notes": [
+ 79,
+ 12
+ ]
+ },
+ {
+ "notes": [
+ 5,
+ 13,
+ 13,
+ 5,
+ 10,
+ 13
+ ]
+ },
+ {
+ "notes": [
+ 10,
+ 76,
+ 12,
+ 59,
+ 79,
+ 12
+ ]
+ }
+ ],
+ [
+ {
+ "notes": [
+ 5,
+ 12,
+ 13,
+ 1,
+ 14,
+ 13
+ ]
+ },
+ {
+ "notes": [
+ 155,
+ 17,
+ 14
+ ]
+ },
+ {
+ "notes": [
+ 5,
+ 13,
+ 10,
+ 0,
+ 10,
+ 13
+ ]
+ }
+ ],
+ [
+ {
+ "notes": [
+ 17,
+ 160,
+ 14,
+ 59,
+ 31,
+ 161
+ ]
+ },
+ {
+ "notes": [
+ 15,
+ 24,
+ 12,
+ 6,
+ 13,
+ 10
+ ]
+ },
+ {
+ "sectionEnd": true,
+ "notes": [
+ 162,
+ 0,
+ 20
+ ]
+ }
+ ]
+ ]
+ },
+ {
+ "id": "hong-yan",
+ "title": "鸿雁",
+ "subtitle": "乌拉特民歌曲调 · 教材旋律版",
+ "composer": "蒙古族民歌",
+ "key": "C",
+ "harmonicaKey": "C",
+ "position": "第四把位",
+ "timeSignature": "4/4",
+ "tempo": 64,
+ "difficulty": 3,
+ "tags": [
+ "中国民歌",
+ "蒙古族",
+ "前倚音",
+ "延长记号"
+ ],
+ "source": "粤教花城《音乐五年级上册·简谱》印刷第40页/PDF第41页,署蒙古族民歌;采用教材旋律及结束句,共16个写出小节,前8小节反复。原1=D改为1=C后整体提高八度。",
+ "sourceUrl": "https://lywgyxx.szftedu.cn/xkjc/yinyue/202209/P020220910587728087297.pdf#page=41",
+ "sourceFormat": "jianpu-image",
+ "sourceCheckedAt": "2026-10-23",
+ "builtin": true,
+ "order": 43,
+ "notes": "仅录主旋律,不收录吕燕卫歌词或张宏光伴奏编配。保留6处前倚音(单音为八分形状,三音组为十六分形状)、跨行同音延音与最后结束句mi上的自由延长记号。音域G4–C6,低la为3孔吸压全音;延长记号不固定增加拍数。省略异音连奏线,速度为练习建议。",
+ "lines": [
+ [
+ {
+ "repeatBegin": true,
+ "notes": [
+ 10,
+ 13,
+ 12,
+ 31,
+ 77
+ ]
+ },
+ {
+ "notes": [
+ 1,
+ 138,
+ 69,
+ 34
+ ]
+ },
+ {
+ "notes": [
+ 2,
+ 17,
+ 13,
+ 12,
+ 10,
+ 17,
+ 163
+ ]
+ }
+ ],
+ [
+ {
+ "notes": [
+ 13,
+ 164,
+ 155
+ ]
+ },
+ {
+ "notes": [
+ 1,
+ 138,
+ 69,
+ 34
+ ]
+ },
+ {
+ "notes": [
+ 10,
+ 13,
+ 12,
+ 31,
+ 77
+ ]
+ }
+ ],
+ [
+ {
+ "notes": [
+ 5,
+ 12,
+ 31,
+ 79,
+ 31,
+ 165
+ ]
+ },
+ {
+ "repeatEnd": true,
+ "notes": [
+ 166
+ ]
+ }
+ ],
+ [
+ {
+ "notes": [
+ 1,
+ 138,
+ 69,
+ 34
+ ]
+ },
+ {
+ "notes": [
+ 10,
+ 13,
+ 12,
+ 31,
+ 77
+ ]
+ },
+ {
+ "notes": [
+ 5,
+ 12,
+ 31,
+ 79,
+ 31,
+ 165
+ ]
+ },
+ {
+ "notes": [
+ 166
+ ]
+ }
+ ],
+ [
+ {
+ "notes": [
+ 1,
+ 138,
+ 69,
+ 34
+ ]
+ },
+ {
+ "notes": [
+ 10,
+ 13,
+ 12,
+ 31,
+ 77
+ ]
+ },
+ {
+ "notes": [
+ 5,
+ 12,
+ 31,
+ 79,
+ 31,
+ 167
+ ]
+ },
+ {
+ "sectionEnd": true,
+ "notes": [
+ 166
+ ]
+ }
+ ]
+ ]
+ },
+ {
+ "id": "mulberry-bush",
+ "title": "桑树丛",
+ "subtitle": "The Mulberry Bush · 1927歌集版",
+ "composer": "传统曲调",
+ "key": "C",
+ "harmonicaKey": "C",
+ "position": "第一把位",
+ "timeSignature": "6/8",
+ "tempo": 96,
+ "difficulty": 2,
+ "tags": [
+ "西方歌曲",
+ "六八拍",
+ "游戏歌曲",
+ "压音"
+ ],
+ "source": "The Everyday Song Book(1927)第38首,John Chambers于2017年转录的ABC;完整8小节,原A4主音改为C5,保持相对音区。",
+ "sourceUrl": "https://trillian.mit.edu/~jc/music/book/EverydaySongBook/038_the_Mulberry_Bush.abc",
+ "sourceFormat": "music-text",
+ "sourceCheckedAt": "2026-10-23",
+ "builtin": true,
+ "order": 44,
+ "notes": "保留该歌集的十六分重复短音、低音下降句和两个八分休止。音域G4–G5,低la使用3孔吸压全音。省略歌词与异音连奏线,速度为四分拍练习建议。",
+ "lines": [
+ [
+ {
+ "notes": [
+ 12,
+ 12,
+ 12,
+ 0,
+ 13
+ ]
+ },
+ {
+ "notes": [
+ 1,
+ 105,
+ 105,
+ 0,
+ 13
+ ]
+ },
+ {
+ "notes": [
+ 6,
+ 85,
+ 85,
+ 6,
+ 12
+ ]
+ },
+ {
+ "notes": [
+ 98,
+ 88,
+ 88,
+ 15,
+ 59
+ ]
+ }
+ ],
+ [
+ {
+ "notes": [
+ 12,
+ 12,
+ 12,
+ 0,
+ 13
+ ]
+ },
+ {
+ "notes": [
+ 1,
+ 105,
+ 105,
+ 0,
+ 13
+ ]
+ },
+ {
+ "notes": [
+ 6,
+ 10,
+ 79,
+ 31,
+ 24
+ ]
+ },
+ {
+ "sectionEnd": true,
+ "notes": [
+ 28,
+ 0,
+ 59
+ ]
+ }
+ ]
+ ]
+ },
+ {
+ "id": "lightly-row",
+ "title": "轻轻划",
+ "subtitle": "Lightly Row · 16 小节歌集版",
+ "composer": "传统曲调(所选歌集版本)",
+ "key": "C",
+ "harmonicaKey": "C",
+ "position": "第一把位",
+ "timeSignature": "2/4",
+ "tempo": 96,
+ "difficulty": 1,
+ "tags": [
+ "入门",
+ "儿歌"
+ ],
+ "source": "The Everyday Song Book (1927), No.97;John Chambers ABC 转录",
+ "sourceUrl": "https://trillian.mit.edu/~jc/music/book/EverydaySongBook/097_Lightly_Row.abc",
+ "sourceFormat": "music-text",
+ "sourceCheckedAt": "2026-10-23",
+ "builtin": true,
+ "order": 45,
+ "notes": "完整16小节,第二乐句和末尾停在 mi 并接四分休止,与现有《西班牙划船歌》教材短版不同,不混用两个版本。 仅录主旋律,不录歌词、伴奏及异音连奏线;速度为编辑练习建议。 原 G4 主音移为 C5,所有音符整体上移 5 个半音。",
+ "lines": [
+ [
+ {
+ "notes": [
+ 17,
+ 13,
+ 5
+ ]
+ },
+ {
+ "notes": [
+ 14,
+ 10,
+ 6
+ ]
+ },
+ {
+ "notes": [
+ 12,
+ 10,
+ 13,
+ 14
+ ]
+ },
+ {
+ "notes": [
+ 17,
+ 17,
+ 1
+ ]
+ }
+ ],
+ [
+ {
+ "notes": [
+ 17,
+ 13,
+ 5
+ ]
+ },
+ {
+ "notes": [
+ 14,
+ 10,
+ 6
+ ]
+ },
+ {
+ "notes": [
+ 12,
+ 13,
+ 17,
+ 17
+ ]
+ },
+ {
+ "notes": [
+ 5,
+ 20
+ ]
+ }
+ ],
+ [
+ {
+ "notes": [
+ 10,
+ 10,
+ 10,
+ 10
+ ]
+ },
+ {
+ "notes": [
+ 10,
+ 13,
+ 4
+ ]
+ },
+ {
+ "notes": [
+ 13,
+ 13,
+ 13,
+ 13
+ ]
+ },
+ {
+ "notes": [
+ 13,
+ 14,
+ 1
+ ]
+ }
+ ],
+ [
+ {
+ "notes": [
+ 17,
+ 13,
+ 5
+ ]
+ },
+ {
+ "notes": [
+ 14,
+ 10,
+ 6
+ ]
+ },
+ {
+ "notes": [
+ 12,
+ 13,
+ 17,
+ 17
+ ]
+ },
+ {
+ "sectionEnd": true,
+ "notes": [
+ 5,
+ 20
+ ]
+ }
+ ]
+ ]
+ },
+ {
+ "id": "hickory-dickory-dock",
+ "title": "滴答滴答钟声响",
+ "subtitle": "Dickory, Dickory Dock · Elliott 版本",
+ "composer": "Elliott(所选歌集署名)",
+ "key": "C",
+ "harmonicaKey": "C",
+ "position": "第一把位",
+ "timeSignature": "6/8",
+ "tempo": 112,
+ "difficulty": 2,
+ "tags": [
+ "入门",
+ "儿歌"
+ ],
+ "source": "The Everyday Song Book (1927), No.19;John Chambers ABC 转录",
+ "sourceUrl": "https://trillian.mit.edu/~jc/music/book/EverydaySongBook/019_Dickory_Dickory_Dock.abc",
+ "sourceFormat": "music-text",
+ "sourceCheckedAt": "2026-10-23",
+ "builtin": true,
+ "order": 46,
+ "notes": "采用歌集署名 Elliott 的旋律版本;完整8小节,保留逐个八分休止及第6小节附点四分 la。请按六八拍分组,不将休止合并成连音。 仅录主旋律,不录歌词、伴奏及异音连奏线;速度为编辑练习建议。 原 F4 主音移为 C5,所有音符整体上移 7 个半音。",
+ "lines": [
+ [
+ {
+ "notes": [
+ 13,
+ 14,
+ 17,
+ 14,
+ 17,
+ 10
+ ]
+ },
+ {
+ "notes": [
+ 13,
+ 59,
+ 59,
+ 20,
+ 13
+ ]
+ },
+ {
+ "notes": [
+ 13,
+ 59,
+ 17,
+ 14,
+ 59,
+ 10
+ ]
+ },
+ {
+ "notes": [
+ 13,
+ 59,
+ 59,
+ 20,
+ 13
+ ]
+ }
+ ],
+ [
+ {
+ "notes": [
+ 13,
+ 59,
+ 13,
+ 1,
+ 17
+ ]
+ },
+ {
+ "notes": [
+ 14,
+ 59,
+ 14,
+ 168
+ ]
+ },
+ {
+ "notes": [
+ 17,
+ 26,
+ 17,
+ 14,
+ 13,
+ 10
+ ]
+ },
+ {
+ "sectionEnd": true,
+ "notes": [
+ 12,
+ 59,
+ 59,
+ 20,
+ 59
+ ]
+ }
+ ]
+ ]
+ },
+ {
+ "id": "see-saw",
+ "title": "跷跷板",
+ "subtitle": "See-saw, Margery Daw · Elliott 版本",
+ "composer": "Elliott(所选歌集署名)",
+ "key": "C",
+ "harmonicaKey": "C",
+ "position": "第一把位",
+ "timeSignature": "6/8",
+ "tempo": 112,
+ "difficulty": 2,
+ "tags": [
+ "入门",
+ "儿歌"
+ ],
+ "source": "The Everyday Song Book (1927), No.8;John Chambers ABC 转录",
+ "sourceUrl": "https://trillian.mit.edu/~jc/music/book/EverydaySongBook/008_See-saw_Margery_Daw.abc",
+ "sourceFormat": "music-text",
+ "sourceCheckedAt": "2026-10-23",
+ "builtin": true,
+ "order": 47,
+ "notes": "完整8小节,六八拍;第5小节在原文本中跨行,已接成完整小节。保留低 sol、末小节低 si 和所有休止。 仅录主旋律,不录歌词、伴奏及异音连奏线;速度为编辑练习建议。 原 Ab4 主音移为 C5,所有音符整体上移 4 个半音。",
+ "lines": [
+ [
+ {
+ "notes": [
+ 28,
+ 78
+ ]
+ },
+ {
+ "notes": [
+ 12,
+ 12,
+ 12,
+ 78
+ ]
+ },
+ {
+ "notes": [
+ 0,
+ 12,
+ 12,
+ 12,
+ 12
+ ]
+ },
+ {
+ "notes": [
+ 9,
+ 6,
+ 59
+ ]
+ }
+ ],
+ [
+ {
+ "notes": [
+ 0,
+ 12,
+ 79,
+ 79,
+ 79
+ ]
+ },
+ {
+ "notes": [
+ 12,
+ 12,
+ 12,
+ 15,
+ 79
+ ]
+ },
+ {
+ "notes": [
+ 13,
+ 13,
+ 13,
+ 17,
+ 14,
+ 10
+ ]
+ },
+ {
+ "sectionEnd": true,
+ "notes": [
+ 139,
+ 12,
+ 59,
+ 59
+ ]
+ }
+ ]
+ ]
+ },
+ {
+ "id": "lucy-locket",
+ "title": "露西的口袋",
+ "subtitle": "Lucy Locket · 1927 歌集版本",
+ "composer": "G. M. S.(所选歌集署名)",
+ "key": "C",
+ "harmonicaKey": "C",
+ "position": "第一把位",
+ "timeSignature": "2/4",
+ "tempo": 96,
+ "difficulty": 1,
+ "tags": [
+ "入门",
+ "儿歌"
+ ],
+ "source": "The Everyday Song Book (1927), No.67;John Chambers ABC 转录",
+ "sourceUrl": "https://trillian.mit.edu/~jc/music/book/EverydaySongBook/067_Lucy_Locket.abc",
+ "sourceFormat": "music-text",
+ "sourceCheckedAt": "2026-10-23",
+ "builtin": true,
+ "order": 48,
+ "notes": "完整16小节,仅四分和二分时值;保留低 sol 跳进及第14小节低 si。采用歌集署名 G. M. S. 的版本,不等同于所有同名童谣旋律。 仅录主旋律,不录歌词、伴奏及异音连奏线;速度为编辑练习建议。 原 G4 主音移为 C5,所有音符整体上移 5 个半音。",
+ "lines": [
+ [
+ {
+ "notes": [
+ 0,
+ 15
+ ]
+ },
+ {
+ "notes": [
+ 15,
+ 0
+ ]
+ },
+ {
+ "notes": [
+ 6,
+ 15
+ ]
+ },
+ {
+ "notes": [
+ 15,
+ 6
+ ]
+ },
+ {
+ "notes": [
+ 5,
+ 0
+ ]
+ },
+ {
+ "notes": [
+ 1,
+ 5
+ ]
+ },
+ {
+ "notes": [
+ 46
+ ]
+ },
+ {
+ "notes": [
+ 8
+ ]
+ }
+ ],
+ [
+ {
+ "notes": [
+ 0,
+ 15
+ ]
+ },
+ {
+ "notes": [
+ 15,
+ 0
+ ]
+ },
+ {
+ "notes": [
+ 6,
+ 15
+ ]
+ },
+ {
+ "notes": [
+ 15,
+ 6
+ ]
+ },
+ {
+ "notes": [
+ 5,
+ 0
+ ]
+ },
+ {
+ "notes": [
+ 6,
+ 98
+ ]
+ },
+ {
+ "notes": [
+ 8
+ ]
+ },
+ {
+ "sectionEnd": true,
+ "notes": [
+ 7
+ ]
+ }
+ ]
+ ]
+ },
+ {
+ "id": "busy-bee",
+ "title": "勤劳的小蜜蜂",
+ "subtitle": "How Doth the Little Busy Bee · 英国古调",
+ "composer": "英国古调(Old English,所选歌集署名)",
+ "key": "C",
+ "harmonicaKey": "C",
+ "position": "第一把位",
+ "timeSignature": "4/4",
+ "tempo": 96,
+ "difficulty": 2,
+ "tags": [
+ "传统曲",
+ "西方民谣"
+ ],
+ "source": "The Everyday Song Book (1927), No.34;John Chambers ABC 转录",
+ "sourceUrl": "https://trillian.mit.edu/~jc/music/book/EverydaySongBook/034_How_Doth_the_Little_Busy_Bee.abc",
+ "sourceFormat": "music-text",
+ "sourceCheckedAt": "2026-10-23",
+ "builtin": true,
+ "order": 49,
+ "notes": "9个书写小节含一拍弱起,末小节三拍互补;原文末句 fa–mi 为两个八分音符。该英国古调不是常见德国童谣《小蜜蜂》的旋律。 仅录主旋律,不录歌词、伴奏及异音连奏线;速度为编辑练习建议。 原 Eb4 主音移为 C5,所有音符整体上移 9 个半音。",
+ "lines": [
+ [
+ {
+ "notes": [
+ 1
+ ]
+ },
+ {
+ "notes": [
+ 19,
+ 25,
+ 2,
+ 1
+ ]
+ },
+ {
+ "notes": [
+ 2,
+ 1,
+ 4,
+ 5
+ ]
+ },
+ {
+ "notes": [
+ 2,
+ 1,
+ 4,
+ 5
+ ]
+ },
+ {
+ "notes": [
+ 155,
+ 5
+ ]
+ }
+ ],
+ [
+ {
+ "notes": [
+ 4,
+ 5,
+ 2,
+ 1
+ ]
+ },
+ {
+ "notes": [
+ 4,
+ 5,
+ 6,
+ 2
+ ]
+ },
+ {
+ "notes": [
+ 1,
+ 5,
+ 14,
+ 13,
+ 6
+ ]
+ },
+ {
+ "sectionEnd": true,
+ "notes": [
+ 33
+ ]
+ }
+ ]
+ ]
+ },
+ {
+ "id": "jolly-miller",
+ "title": "快乐的磨坊主",
+ "subtitle": "Jolly is the Miller · 英国游戏歌",
+ "composer": "英国传统游戏歌(所选歌集署名)",
+ "key": "C",
+ "harmonicaKey": "C",
+ "position": "第一把位",
+ "timeSignature": "4/4",
+ "tempo": 96,
+ "difficulty": 3,
+ "tags": [
+ "传统曲",
+ "西方民谣",
+ "压音"
+ ],
+ "source": "The Everyday Song Book (1927), No.98;John Chambers ABC 转录",
+ "sourceUrl": "https://trillian.mit.edu/~jc/music/book/EverydaySongBook/098_Jolly_is_the_Miller.abc",
+ "sourceFormat": "music-text",
+ "sourceCheckedAt": "2026-10-23",
+ "builtin": true,
+ "order": 50,
+ "notes": "完整8小节,保留附点八分/十六分和低音区跳进。低 fa 需2孔吸气全音压音,低 la 需3孔吸气全音压音;不是无压音入门谱。 仅录主旋律,不录歌词、伴奏及异音连奏线;速度为编辑练习建议。 原 A4 主音移为 C5,所有音符整体上移 3 个半音。",
+ "lines": [
+ [
+ {
+ "notes": [
+ 12,
+ 12,
+ 12,
+ 12,
+ 0,
+ 108,
+ 92
+ ]
+ },
+ {
+ "notes": [
+ 15,
+ 95,
+ 88,
+ 78,
+ 13
+ ]
+ },
+ {
+ "notes": [
+ 5,
+ 5,
+ 5,
+ 86,
+ 85
+ ]
+ },
+ {
+ "notes": [
+ 5,
+ 6,
+ 6,
+ 13,
+ 10
+ ]
+ }
+ ],
+ [
+ {
+ "notes": [
+ 0,
+ 12,
+ 12,
+ 86,
+ 84,
+ 108,
+ 92
+ ]
+ },
+ {
+ "notes": [
+ 79,
+ 79,
+ 95,
+ 90,
+ 78,
+ 12
+ ]
+ },
+ {
+ "notes": [
+ 5,
+ 1,
+ 17,
+ 17,
+ 12,
+ 10
+ ]
+ },
+ {
+ "sectionEnd": true,
+ "notes": [
+ 5,
+ 6,
+ 0,
+ 20
+ ]
+ }
+ ]
+ ]
+ },
+ {
+ "id": "good-comrade",
+ "title": "好伙伴",
+ "subtitle": "The Good Comrade · 1927 歌集版本",
+ "composer": "民歌曲调(Folksong,所选歌集署名)",
+ "key": "C",
+ "harmonicaKey": "C",
+ "position": "第一把位",
+ "timeSignature": "4/4",
+ "tempo": 96,
+ "difficulty": 2,
+ "tags": [
+ "传统曲",
+ "西方民谣"
+ ],
+ "source": "The Everyday Song Book (1927), No.148;John Chambers ABC 转录",
+ "sourceUrl": "https://trillian.mit.edu/~jc/music/book/EverydaySongBook/148_the_Good_Comrade.abc",
+ "sourceFormat": "music-text",
+ "sourceCheckedAt": "2026-10-23",
+ "builtin": true,
+ "order": 51,
+ "notes": "13个书写小节含一拍弱起,末尾三拍互补。原文第一段末尾三拍与第二段一拍弱起接为同一完整小节;保留休止,不添加音符。 仅录主旋律,不录歌词、伴奏及异音连奏线;速度为编辑练习建议。 原 G4 主音移为 C5,所有音符整体上移 5 个半音。",
+ "lines": [
+ [
+ {
+ "notes": [
+ 15
+ ]
+ },
+ {
+ "notes": [
+ 0,
+ 5,
+ 5,
+ 6
+ ]
+ },
+ {
+ "notes": [
+ 7,
+ 15,
+ 12,
+ 10
+ ]
+ },
+ {
+ "notes": [
+ 5,
+ 1,
+ 1,
+ 4
+ ]
+ },
+ {
+ "notes": [
+ 46,
+ 20,
+ 12,
+ 10
+ ]
+ }
+ ],
+ [
+ {
+ "notes": [
+ 5,
+ 5,
+ 5,
+ 6
+ ]
+ },
+ {
+ "notes": [
+ 9,
+ 14,
+ 1,
+ 14,
+ 13
+ ]
+ },
+ {
+ "notes": [
+ 6,
+ 6,
+ 6,
+ 0
+ ]
+ },
+ {
+ "notes": [
+ 11,
+ 13,
+ 4,
+ 1
+ ]
+ }
+ ],
+ [
+ {
+ "notes": [
+ 5,
+ 5,
+ 6,
+ 6
+ ]
+ },
+ {
+ "notes": [
+ 7,
+ 8
+ ]
+ },
+ {
+ "notes": [
+ 5,
+ 1,
+ 6,
+ 10,
+ 13
+ ]
+ },
+ {
+ "sectionEnd": true,
+ "notes": [
+ 7,
+ 20
+ ]
+ }
+ ]
+ ]
+ },
+ {
+ "id": "ash-grove",
+ "title": "白蜡树林",
+ "subtitle": "The Ash Grove · 威尔士民歌",
+ "composer": "威尔士传统民歌",
+ "key": "G",
+ "harmonicaKey": "C",
+ "position": "第二把位",
+ "timeSignature": "3/4",
+ "tempo": 96,
+ "difficulty": 3,
+ "tags": [
+ "传统曲",
+ "西方民谣",
+ "压音"
+ ],
+ "source": "The Everyday Song Book (1927), No.131;John Chambers ABC 转录",
+ "sourceUrl": "https://trillian.mit.edu/~jc/music/book/EverydaySongBook/131_the_Ash_Grove.abc",
+ "sourceFormat": "music-text",
+ "sourceCheckedAt": "2026-10-23",
+ "builtin": true,
+ "order": 52,
+ "notes": "原 Ab 调整体下移半音为 G 调,C 调口琴第二把位。首段反复已展开,重复起拍与后段弱起接入前小节;33个书写小节含弱起。第24书写小节升 fa 为 C#5,需4孔吸气半音压音;低 si 为 F#4,需2孔吸气半音压音。不要把原文还原 D 错读为 D 降。 仅录主旋律,不录歌词、伴奏及异音连奏线;速度为编辑练习建议。",
+ "lines": [
+ [
+ {
+ "notes": [
+ 169
+ ]
+ },
+ {
+ "notes": [
+ 119,
+ 123,
+ 41,
+ 120
+ ]
+ },
+ {
+ "notes": [
+ 123,
+ 119,
+ 119
+ ]
+ },
+ {
+ "notes": [
+ 170,
+ 41,
+ 120,
+ 38,
+ 40
+ ]
+ },
+ {
+ "notes": [
+ 171,
+ 169,
+ 169
+ ]
+ },
+ {
+ "notes": [
+ 119,
+ 120,
+ 38,
+ 40,
+ 172
+ ]
+ },
+ {
+ "notes": [
+ 173,
+ 174,
+ 173
+ ]
+ },
+ {
+ "notes": [
+ 169,
+ 119,
+ 171
+ ]
+ },
+ {
+ "notes": [
+ 43,
+ 169
+ ]
+ }
+ ],
+ [
+ {
+ "notes": [
+ 119,
+ 123,
+ 41,
+ 120
+ ]
+ },
+ {
+ "notes": [
+ 123,
+ 119,
+ 119
+ ]
+ },
+ {
+ "notes": [
+ 170,
+ 41,
+ 120,
+ 38,
+ 40
+ ]
+ },
+ {
+ "notes": [
+ 171,
+ 169,
+ 169
+ ]
+ },
+ {
+ "notes": [
+ 119,
+ 120,
+ 38,
+ 40,
+ 172
+ ]
+ },
+ {
+ "notes": [
+ 173,
+ 174,
+ 173
+ ]
+ },
+ {
+ "notes": [
+ 169,
+ 119,
+ 171
+ ]
+ },
+ {
+ "notes": [
+ 43,
+ 120,
+ 41
+ ]
+ }
+ ],
+ [
+ {
+ "notes": [
+ 121,
+ 120,
+ 41,
+ 45,
+ 175
+ ]
+ },
+ {
+ "notes": [
+ 121,
+ 125,
+ 123
+ ]
+ },
+ {
+ "notes": [
+ 125,
+ 38,
+ 120,
+ 41,
+ 45
+ ]
+ },
+ {
+ "notes": [
+ 125,
+ 123,
+ 170
+ ]
+ },
+ {
+ "notes": [
+ 123,
+ 40,
+ 38,
+ 120,
+ 41
+ ]
+ },
+ {
+ "notes": [
+ 123,
+ 170,
+ 119
+ ]
+ },
+ {
+ "notes": [
+ 171,
+ 121,
+ 176
+ ]
+ },
+ {
+ "notes": [
+ 177,
+ 169
+ ]
+ }
+ ],
+ [
+ {
+ "notes": [
+ 119,
+ 123,
+ 45,
+ 41
+ ]
+ },
+ {
+ "notes": [
+ 123,
+ 119,
+ 119
+ ]
+ },
+ {
+ "notes": [
+ 170,
+ 41,
+ 120,
+ 38,
+ 40
+ ]
+ },
+ {
+ "notes": [
+ 171,
+ 169,
+ 169
+ ]
+ },
+ {
+ "notes": [
+ 119,
+ 41,
+ 120,
+ 40,
+ 172
+ ]
+ },
+ {
+ "notes": [
+ 173,
+ 174,
+ 173
+ ]
+ },
+ {
+ "notes": [
+ 169,
+ 119,
+ 171
+ ]
+ },
+ {
+ "sectionEnd": true,
+ "notes": [
+ 43
+ ]
+ }
+ ]
+ ]
+ },
+ {
+ "id": "clap-hands",
+ "title": "大家一起拍拍手",
+ "subtitle": "We'll All Clap Hands Together · 1927 歌集版",
+ "composer": "传统儿童动作歌(所选歌集署名)",
+ "key": "C",
+ "harmonicaKey": "C",
+ "position": "第一把位",
+ "timeSignature": "4/4",
+ "tempo": 96,
+ "difficulty": 1,
+ "tags": [
+ "入门",
+ "儿歌"
+ ],
+ "source": "The Everyday Song Book (1927), No.7;John Chambers ABC 转录 (2015)",
+ "sourceUrl": "https://trillian.mit.edu/~jc/music/book/EverydaySongBook/007_Well_all_Clap_Hands_Together.abc",
+ "sourceFormat": "music-text",
+ "sourceCheckedAt": "2026-10-23",
+ "builtin": true,
+ "order": 53,
+ "notes": "原 G4 主音移为 C5;9个书写小节含一拍弱起,三拍尾节互补。第一段三拍结束与第二段一拍起拍合为同一完整小节;保留末句两个八分音。 不收录歌词、伴奏和异音连奏线,速度为编辑练习建议。",
+ "lines": [
+ [
+ {
+ "notes": [
+ 15
+ ]
+ },
+ {
+ "notes": [
+ 0,
+ 0,
+ 0,
+ 0
+ ]
+ },
+ {
+ "notes": [
+ 7,
+ 15,
+ 15
+ ]
+ },
+ {
+ "notes": [
+ 5,
+ 5,
+ 5,
+ 5
+ ]
+ },
+ {
+ "notes": [
+ 46,
+ 0,
+ 5
+ ]
+ }
+ ],
+ [
+ {
+ "notes": [
+ 1,
+ 1,
+ 1,
+ 1
+ ]
+ },
+ {
+ "notes": [
+ 3,
+ 5,
+ 5
+ ]
+ },
+ {
+ "notes": [
+ 6,
+ 6,
+ 6,
+ 13,
+ 10
+ ]
+ },
+ {
+ "sectionEnd": true,
+ "notes": [
+ 33
+ ]
+ }
+ ]
+ ]
+ },
+ {
+ "id": "ding-dong-bell",
+ "title": "叮咚铃声",
+ "subtitle": "Ding, Dong, Bell · 1927 歌集版",
+ "composer": "鹅妈妈童谣(所选歌集署名)",
+ "key": "C",
+ "harmonicaKey": "C",
+ "position": "第一把位",
+ "timeSignature": "4/4",
+ "tempo": 96,
+ "difficulty": 2,
+ "tags": [
+ "入门",
+ "儿歌",
+ "压音"
+ ],
+ "source": "The Everyday Song Book (1927), No.32;John Chambers ABC 转录 (2017)",
+ "sourceUrl": "https://trillian.mit.edu/~jc/music/book/EverydaySongBook/032_Ding_Dong_Bell.abc",
+ "sourceFormat": "music-text",
+ "sourceCheckedAt": "2026-10-23",
+ "builtin": true,
+ "order": 54,
+ "notes": "原 F4 主音移为 C5,完整10小节及首尾反复记号保留。第6小节低 sol–la–si 句中的低 la 需要3孔吸气全音压音,因此不能按曲名将其标为无需压音。 不收录歌词、伴奏和异音连奏线,速度为编辑练习建议。",
+ "lines": [
+ [
+ {
+ "repeatBegin": true,
+ "notes": [
+ 0,
+ 5,
+ 3
+ ]
+ },
+ {
+ "notes": [
+ 17,
+ 14,
+ 13,
+ 10,
+ 7
+ ]
+ },
+ {
+ "notes": [
+ 0,
+ 13,
+ 13,
+ 3
+ ]
+ },
+ {
+ "notes": [
+ 17,
+ 14,
+ 13,
+ 10,
+ 7
+ ]
+ },
+ {
+ "notes": [
+ 2,
+ 17,
+ 14,
+ 46
+ ]
+ }
+ ],
+ [
+ {
+ "notes": [
+ 15,
+ 31,
+ 24,
+ 7
+ ]
+ },
+ {
+ "notes": [
+ 2,
+ 2,
+ 1,
+ 1
+ ]
+ },
+ {
+ "notes": [
+ 4,
+ 4,
+ 5,
+ 5
+ ]
+ },
+ {
+ "notes": [
+ 4,
+ 4,
+ 5,
+ 5
+ ]
+ },
+ {
+ "repeatEnd": true,
+ "notes": [
+ 6,
+ 6,
+ 7
+ ]
+ }
+ ]
+ ]
+ },
+ {
+ "id": "flowing-stream",
+ "title": "小河淌水",
+ "subtitle": "云南民歌 · 教材变拍版",
+ "composer": "云南民歌",
+ "key": "C",
+ "harmonicaKey": "C",
+ "position": "第四把位",
+ "timeSignature": "2/4",
+ "tempo": 72,
+ "difficulty": 3,
+ "tags": [
+ "传统曲",
+ "中国民歌",
+ "变拍",
+ "延长记号"
+ ],
+ "source": "郭丽萍、王立民、马志飞《音乐鉴赏》(新华出版社),印刷第15页/PDF第22页,谱例1-6。",
+ "sourceUrl": "https://backend.sjhtbook.com/upload/file/2025/04/80fb4b7923894770828045c9e613e236.pdf#page=22",
+ "sourceFormat": "jianpu-image",
+ "sourceCheckedAt": "2026-10-23",
+ "builtin": true,
+ "order": 55,
+ "notes": "原1=降E移为1=C并提高一八度,羽调式主音为A,C调口琴第四把位。23个书写小节,前21小节反复,后2小节尾声。按来源保留2/4、3/4、4/4变拍、9处自由延长、2处同音延音;延长记号不改变书面时值。低la为3孔吸气全音压音。 不收录歌词、伴奏和异音连奏线,速度为编辑练习建议。",
+ "lines": [
+ [
+ {
+ "repeatBegin": true,
+ "notes": [
+ 178
+ ]
+ },
+ {
+ "notes": [
+ 26,
+ 27,
+ 36,
+ 80
+ ]
+ },
+ {
+ "notes": [
+ 80,
+ 61,
+ 69,
+ 66
+ ]
+ },
+ {
+ "notes": [
+ 80,
+ 179
+ ]
+ },
+ {
+ "timeSignature": "3/4",
+ "notes": [
+ 74,
+ 69,
+ 180,
+ 181
+ ]
+ },
+ {
+ "timeSignature": "2/4",
+ "notes": [
+ 26,
+ 27,
+ 26,
+ 17
+ ]
+ }
+ ],
+ [
+ {
+ "timeSignature": "3/4",
+ "notes": [
+ 13,
+ 10,
+ 17,
+ 168
+ ]
+ },
+ {
+ "timeSignature": "2/4",
+ "notes": [
+ 26,
+ 17,
+ 13,
+ 10
+ ]
+ },
+ {
+ "notes": [
+ 182
+ ]
+ },
+ {
+ "notes": [
+ 26,
+ 36,
+ 36,
+ 26
+ ]
+ },
+ {
+ "notes": [
+ 80,
+ 61,
+ 69,
+ 66
+ ]
+ },
+ {
+ "notes": [
+ 80,
+ 179
+ ]
+ }
+ ],
+ [
+ {
+ "notes": [
+ 74,
+ 69,
+ 183
+ ]
+ },
+ {
+ "notes": [
+ 184,
+ 69,
+ 66
+ ]
+ },
+ {
+ "notes": [
+ 80,
+ 61,
+ 69,
+ 66
+ ]
+ },
+ {
+ "notes": [
+ 80,
+ 179
+ ]
+ },
+ {
+ "timeSignature": "3/4",
+ "notes": [
+ 27,
+ 180,
+ 181
+ ]
+ },
+ {
+ "timeSignature": "2/4",
+ "notes": [
+ 26,
+ 27,
+ 26,
+ 17
+ ]
+ }
+ ],
+ [
+ {
+ "timeSignature": "3/4",
+ "notes": [
+ 13,
+ 10,
+ 17,
+ 168
+ ]
+ },
+ {
+ "timeSignature": "2/4",
+ "notes": [
+ 26,
+ 17,
+ 13,
+ 10
+ ]
+ },
+ {
+ "repeatEnd": true,
+ "notes": [
+ 182
+ ]
+ },
+ {
+ "timeSignature": "4/4",
+ "notes": [
+ 46,
+ 13,
+ 10,
+ 6
+ ]
+ },
+ {
+ "sectionEnd": true,
+ "notes": [
+ 185
+ ]
+ }
+ ]
+ ]
+ },
+ {
+ "id": "polish-waltz",
+ "title": "波兰圆舞曲",
+ "subtitle": "教材主旋律 · 32 小节",
+ "composer": "波兰民歌(教材署名)",
+ "key": "C",
+ "harmonicaKey": "C",
+ "position": "第一把位",
+ "timeSignature": "3/4",
+ "tempo": 96,
+ "difficulty": 2,
+ "tags": [
+ "传统曲",
+ "西方民谣",
+ "圆舞曲"
+ ],
+ "source": "人民教育出版社《音乐七年级下册·简谱》,印刷第48页/PDF第53页,“学吹竖笛”。",
+ "sourceUrl": "https://dev98.oa.henanyuexue.com/static/szjc-resources/pdf/q/f/2/7.pdf#page=53",
+ "sourceFormat": "jianpu-image",
+ "sourceCheckedAt": "2026-10-23",
+ "builtin": true,
+ "order": 56,
+ "notes": "保留1=C,整体提高一八度,音域D5–F6,均为自然音孔位。32小节:前16小节为单旋律,后16小节只取上声部主旋律,不混入下声部伴奏。第7–8、11–12、15–16小节的同音延音保留。 不收录歌词、伴奏和异音连奏线,速度为编辑练习建议。",
+ "lines": [
+ [
+ {
+ "notes": [
+ 3,
+ 19
+ ]
+ },
+ {
+ "notes": [
+ 186,
+ 61
+ ]
+ },
+ {
+ "notes": [
+ 18,
+ 25
+ ]
+ },
+ {
+ "notes": [
+ 18,
+ 2
+ ]
+ },
+ {
+ "notes": [
+ 3,
+ 1
+ ]
+ },
+ {
+ "notes": [
+ 46,
+ 4
+ ]
+ },
+ {
+ "notes": [
+ 187
+ ]
+ },
+ {
+ "notes": [
+ 158
+ ]
+ }
+ ],
+ [
+ {
+ "notes": [
+ 48,
+ 2
+ ]
+ },
+ {
+ "notes": [
+ 8,
+ 5
+ ]
+ },
+ {
+ "notes": [
+ 188
+ ]
+ },
+ {
+ "notes": [
+ 189
+ ]
+ },
+ {
+ "notes": [
+ 3,
+ 1
+ ]
+ },
+ {
+ "notes": [
+ 186,
+ 61
+ ]
+ },
+ {
+ "notes": [
+ 190
+ ]
+ },
+ {
+ "notes": [
+ 37
+ ]
+ }
+ ],
+ [
+ {
+ "notes": [
+ 63,
+ 80,
+ 36,
+ 19
+ ]
+ },
+ {
+ "notes": [
+ 63,
+ 80,
+ 36,
+ 19
+ ]
+ },
+ {
+ "notes": [
+ 63,
+ 191,
+ 80
+ ]
+ },
+ {
+ "notes": [
+ 157
+ ]
+ },
+ {
+ "notes": [
+ 61,
+ 36,
+ 27,
+ 25
+ ]
+ },
+ {
+ "notes": [
+ 61,
+ 36,
+ 27,
+ 25
+ ]
+ },
+ {
+ "notes": [
+ 61,
+ 192,
+ 36
+ ]
+ },
+ {
+ "notes": [
+ 37
+ ]
+ }
+ ],
+ [
+ {
+ "notes": [
+ 63,
+ 80,
+ 36,
+ 19
+ ]
+ },
+ {
+ "notes": [
+ 63,
+ 80,
+ 36,
+ 19
+ ]
+ },
+ {
+ "notes": [
+ 63,
+ 191,
+ 80
+ ]
+ },
+ {
+ "notes": [
+ 157
+ ]
+ },
+ {
+ "notes": [
+ 193,
+ 63,
+ 61
+ ]
+ },
+ {
+ "notes": [
+ 19,
+ 25,
+ 2
+ ]
+ },
+ {
+ "notes": [
+ 1,
+ 2,
+ 25
+ ]
+ },
+ {
+ "sectionEnd": true,
+ "notes": [
+ 37
+ ]
+ }
+ ]
+ ]
+ },
+ {
+ "id": "left-right",
+ "title": "左右齐步走",
+ "subtitle": "Left, Right! · 1927 歌集版",
+ "composer": "所选歌集未署曲作者",
+ "key": "C",
+ "harmonicaKey": "C",
+ "position": "第一把位",
+ "timeSignature": "2/4",
+ "tempo": 96,
+ "difficulty": 1,
+ "tags": [
+ "入门",
+ "儿歌"
+ ],
+ "source": "The Everyday Song Book (1927), No.26;John Chambers ABC 转录 (2017)",
+ "sourceUrl": "https://trillian.mit.edu/~jc/music/book/EverydaySongBook/026_Left_Right.abc",
+ "sourceFormat": "music-text",
+ "sourceCheckedAt": "2026-10-23",
+ "builtin": true,
+ "order": 57,
+ "notes": "原降E4主音移为C5;保留16小节,低si至高re均有自然音孔位。适合四分音符、二分音符与跨孔练习。 不收录歌词和异音连奏线;速度为编辑练习建议,核对针对所列ABC版本。",
+ "lines": [
+ [
+ {
+ "notes": [
+ 0,
+ 5
+ ]
+ },
+ {
+ "notes": [
+ 0,
+ 5
+ ]
+ },
+ {
+ "notes": [
+ 1,
+ 19
+ ]
+ },
+ {
+ "notes": [
+ 3
+ ]
+ },
+ {
+ "notes": [
+ 4,
+ 1
+ ]
+ },
+ {
+ "notes": [
+ 5,
+ 0
+ ]
+ },
+ {
+ "notes": [
+ 98,
+ 0
+ ]
+ },
+ {
+ "notes": [
+ 8
+ ]
+ }
+ ],
+ [
+ {
+ "notes": [
+ 0,
+ 5
+ ]
+ },
+ {
+ "notes": [
+ 0,
+ 5
+ ]
+ },
+ {
+ "notes": [
+ 1,
+ 19
+ ]
+ },
+ {
+ "notes": [
+ 34
+ ]
+ },
+ {
+ "notes": [
+ 61,
+ 25
+ ]
+ },
+ {
+ "notes": [
+ 19,
+ 1
+ ]
+ },
+ {
+ "notes": [
+ 5,
+ 6
+ ]
+ },
+ {
+ "sectionEnd": true,
+ "notes": [
+ 7
+ ]
+ }
+ ]
+ ]
+ },
+ {
+ "id": "snowbirds",
+ "title": "雪鸟",
+ "subtitle": "The Snowbirds · B. J. Relemann",
+ "composer": "B. J. Relemann(歌集署名)",
+ "key": "C",
+ "harmonicaKey": "C",
+ "position": "第一把位",
+ "timeSignature": "3/4",
+ "tempo": 96,
+ "difficulty": 1,
+ "tags": [
+ "入门",
+ "儿歌"
+ ],
+ "source": "The Everyday Song Book (1927), No.29;John Chambers ABC 转录 (2017)",
+ "sourceUrl": "https://trillian.mit.edu/~jc/music/book/EverydaySongBook/029_the_Snowbirds.abc",
+ "sourceFormat": "music-text",
+ "sourceCheckedAt": "2026-10-23",
+ "builtin": true,
+ "order": 58,
+ "notes": "原E4主音移为C5;保留16小节,C5–C6均为自然音孔位。以四分、二分和附点二分音符练习三拍子。 不收录歌词和异音连奏线;速度为编辑练习建议,核对针对所列ABC版本。",
+ "lines": [
+ [
+ {
+ "notes": [
+ 0,
+ 0,
+ 0
+ ]
+ },
+ {
+ "notes": [
+ 6,
+ 6,
+ 6
+ ]
+ },
+ {
+ "notes": [
+ 5,
+ 4,
+ 1
+ ]
+ },
+ {
+ "notes": [
+ 158
+ ]
+ },
+ {
+ "notes": [
+ 0,
+ 0,
+ 0
+ ]
+ },
+ {
+ "notes": [
+ 6,
+ 6,
+ 6
+ ]
+ },
+ {
+ "notes": [
+ 5,
+ 4,
+ 1
+ ]
+ },
+ {
+ "notes": [
+ 3,
+ 1
+ ]
+ }
+ ],
+ [
+ {
+ "notes": [
+ 2,
+ 19,
+ 2
+ ]
+ },
+ {
+ "notes": [
+ 1,
+ 5,
+ 1
+ ]
+ },
+ {
+ "notes": [
+ 4,
+ 5,
+ 6
+ ]
+ },
+ {
+ "notes": [
+ 46,
+ 1
+ ]
+ },
+ {
+ "notes": [
+ 2,
+ 19,
+ 2
+ ]
+ },
+ {
+ "notes": [
+ 1,
+ 5,
+ 1
+ ]
+ },
+ {
+ "notes": [
+ 4,
+ 5,
+ 6
+ ]
+ },
+ {
+ "sectionEnd": true,
+ "notes": [
+ 33
+ ]
+ }
+ ]
+ ]
+ },
+ {
+ "id": "little-ship",
+ "title": "小小航船",
+ "subtitle": "The Little Ship · 英格兰旧歌",
+ "composer": "英格兰旧歌(歌集署名)",
+ "key": "C",
+ "harmonicaKey": "C",
+ "position": "第一把位",
+ "timeSignature": "6/8",
+ "tempo": 84,
+ "difficulty": 3,
+ "tags": [
+ "传统曲",
+ "西方民谣",
+ "压音",
+ "延长记号"
+ ],
+ "source": "The Everyday Song Book (1927), No.85;John Chambers ABC 转录 (2017)",
+ "sourceUrl": "https://trillian.mit.edu/~jc/music/book/EverydaySongBook/085_the_Little_Ship.abc",
+ "sourceFormat": "music-text",
+ "sourceCheckedAt": "2026-10-23",
+ "builtin": true,
+ "order": 59,
+ "notes": "原A4主音移为C5;17个书写小节,半拍弱起与末小节2.5拍互补(四分音符计拍)。保留6处同音延音和第13书写小节的自由延长。音域E4–G5,低fa和低la需压音;连续十六分同音仍保留各自音头及延音,不合并改写。 不收录歌词和异音连奏线;速度为编辑练习建议,核对针对所列ABC版本。",
+ "lines": [
+ [
+ {
+ "notes": [
+ 79
+ ]
+ },
+ {
+ "notes": [
+ 0,
+ 12,
+ 12,
+ 24,
+ 31
+ ]
+ },
+ {
+ "notes": [
+ 15,
+ 92,
+ 52,
+ 79
+ ]
+ },
+ {
+ "notes": [
+ 0,
+ 12,
+ 6,
+ 24
+ ]
+ },
+ {
+ "notes": [
+ 76,
+ 0,
+ 79
+ ]
+ }
+ ],
+ [
+ {
+ "notes": [
+ 0,
+ 10,
+ 5,
+ 14
+ ]
+ },
+ {
+ "notes": [
+ 1,
+ 13,
+ 0,
+ 10
+ ]
+ },
+ {
+ "notes": [
+ 5,
+ 13,
+ 13,
+ 10,
+ 12
+ ]
+ },
+ {
+ "notes": [
+ 194,
+ 6,
+ 195,
+ 90
+ ]
+ },
+ {
+ "notes": [
+ 0,
+ 10,
+ 5,
+ 14
+ ]
+ }
+ ],
+ [
+ {
+ "notes": [
+ 1,
+ 13,
+ 0,
+ 196,
+ 85
+ ]
+ },
+ {
+ "notes": [
+ 5,
+ 13,
+ 13,
+ 10,
+ 12
+ ]
+ },
+ {
+ "notes": [
+ 6,
+ 59,
+ 197,
+ 10
+ ]
+ },
+ {
+ "notes": [
+ 0,
+ 12,
+ 12,
+ 24,
+ 31
+ ]
+ },
+ {
+ "notes": [
+ 15,
+ 92,
+ 52,
+ 195,
+ 90
+ ]
+ }
+ ],
+ [
+ {
+ "notes": [
+ 0,
+ 12,
+ 6,
+ 24
+ ]
+ },
+ {
+ "sectionEnd": true,
+ "notes": [
+ 76,
+ 0
+ ]
+ }
+ ]
+ ]
+ },
+ {
+ "id": "hunting-we-will-go",
+ "title": "我们去狩猎",
+ "subtitle": "A Hunting We Will Go · 英格兰传统曲",
+ "composer": "英格兰传统曲(歌集地域署名)",
+ "key": "C",
+ "harmonicaKey": "C",
+ "position": "第一把位",
+ "timeSignature": "6/8",
+ "tempo": 96,
+ "difficulty": 2,
+ "tags": [
+ "传统曲",
+ "西方民谣",
+ "延长记号"
+ ],
+ "source": "The Everyday Song Book (1927), No.188;John Chambers ABC 转录 (2017)",
+ "sourceUrl": "https://trillian.mit.edu/~jc/music/book/EverydaySongBook/188_A_Hunting_We_Will_Go.abc",
+ "sourceFormat": "music-text",
+ "sourceCheckedAt": "2026-10-23",
+ "builtin": true,
+ "order": 60,
+ "notes": "原C4主音提高一八度至C5;21个书写小节,半拍弱起与末小节2.5拍互补。保留6处同音延音、2处自由延长及附点八分与十六分组合。C5–F6均有自然音孔位,入门后可练习复拍子与附点节奏。 不收录歌词和异音连奏线;速度为编辑练习建议,核对针对所列ABC版本。",
+ "lines": [
+ [
+ {
+ "notes": [
+ 145,
+ 70
+ ]
+ },
+ {
+ "notes": [
+ 19,
+ 27,
+ 1,
+ 17
+ ]
+ },
+ {
+ "notes": [
+ 104,
+ 85,
+ 13,
+ 0,
+ 17
+ ]
+ },
+ {
+ "notes": [
+ 2,
+ 17,
+ 198,
+ 105,
+ 14
+ ]
+ },
+ {
+ "notes": [
+ 199,
+ 5,
+ 12
+ ]
+ }
+ ],
+ [
+ {
+ "notes": [
+ 1,
+ 17,
+ 2,
+ 26
+ ]
+ },
+ {
+ "notes": [
+ 200,
+ 66,
+ 22,
+ 1,
+ 17
+ ]
+ },
+ {
+ "notes": [
+ 19,
+ 27,
+ 61,
+ 36
+ ]
+ },
+ {
+ "notes": [
+ 135,
+ 74,
+ 80,
+ 19,
+ 17
+ ]
+ },
+ {
+ "notes": [
+ 26,
+ 22,
+ 27,
+ 36,
+ 80,
+ 64
+ ]
+ }
+ ],
+ [
+ {
+ "notes": [
+ 17,
+ 26,
+ 22,
+ 201,
+ 13
+ ]
+ },
+ {
+ "notes": [
+ 198,
+ 105,
+ 14,
+ 1,
+ 17
+ ]
+ },
+ {
+ "notes": [
+ 76,
+ 12,
+ 13,
+ 12
+ ]
+ },
+ {
+ "notes": [
+ 1,
+ 17,
+ 1,
+ 17
+ ]
+ },
+ {
+ "notes": [
+ 58,
+ 1,
+ 17
+ ]
+ }
+ ],
+ [
+ {
+ "notes": [
+ 19,
+ 27,
+ 19,
+ 27
+ ]
+ },
+ {
+ "notes": [
+ 202,
+ 19,
+ 17
+ ]
+ },
+ {
+ "notes": [
+ 26,
+ 22,
+ 27,
+ 36,
+ 80,
+ 64
+ ]
+ },
+ {
+ "notes": [
+ 17,
+ 26,
+ 22,
+ 201,
+ 13
+ ]
+ },
+ {
+ "notes": [
+ 198,
+ 105,
+ 14,
+ 1,
+ 17
+ ]
+ },
+ {
+ "sectionEnd": true,
+ "notes": [
+ 76,
+ 0
+ ]
+ }
+ ]
+ ]
+ },
+ {
+ "id": "kangding-love-song",
+ "title": "康定情歌",
+ "subtitle": "四川民歌 · 香港中乐团教程版",
+ "composer": "四川民歌",
+ "key": "C",
+ "harmonicaKey": "C",
+ "position": "第四把位",
+ "timeSignature": "4/4",
+ "tempo": 84,
+ "difficulty": 3,
+ "tags": [
+ "传统曲",
+ "中国民歌",
+ "压音"
+ ],
+ "source": "香港中乐团《唢呐初级教程》,第29页《康定情歌》。",
+ "sourceUrl": "https://ynyqxg.hkco.org/uploads/docs/5bd9828a7a7201.pdf#page=29",
+ "sourceFormat": "jianpu-image",
+ "sourceCheckedAt": "2026-10-23",
+ "builtin": true,
+ "order": 61,
+ "notes": "原页按音级记谱,未单列1=调号;移写为1=C并提高一八度。羽调式主音A,C调口琴第四把位,音域A4–A5。8小节4/4,保留六处同音延音和十六分音符;低la需3孔吸气全音压音。 不收录歌词和异音连奏线;速度为编辑练习建议,核对针对所列来源版本。",
+ "lines": [
+ [
+ {
+ "notes": [
+ 13,
+ 17,
+ 26,
+ 66,
+ 70,
+ 26,
+ 13,
+ 6
+ ]
+ },
+ {
+ "notes": [
+ 13,
+ 17,
+ 26,
+ 66,
+ 70,
+ 26,
+ 163,
+ 5
+ ]
+ },
+ {
+ "notes": [
+ 13,
+ 17,
+ 26,
+ 66,
+ 70,
+ 26,
+ 13,
+ 6
+ ]
+ }
+ ],
+ [
+ {
+ "notes": [
+ 17,
+ 13,
+ 85,
+ 105,
+ 85,
+ 84,
+ 10,
+ 203,
+ 32
+ ]
+ },
+ {
+ "notes": [
+ 31,
+ 164,
+ 6,
+ 17,
+ 163,
+ 5
+ ]
+ },
+ {
+ "notes": [
+ 85,
+ 84,
+ 203,
+ 32,
+ 17,
+ 13,
+ 85,
+ 105,
+ 85,
+ 84
+ ]
+ }
+ ],
+ [
+ {
+ "notes": [
+ 10,
+ 203,
+ 32,
+ 17,
+ 70,
+ 105,
+ 85,
+ 105,
+ 85,
+ 84
+ ]
+ },
+ {
+ "sectionEnd": true,
+ "notes": [
+ 10,
+ 2,
+ 17,
+ 34
+ ]
+ }
+ ]
+ ]
+ },
+ {
+ "id": "learn-to-sing",
+ "title": "一起来学唱",
+ "subtitle": "Come, Let Us Learn to Sing · 1927 歌集版",
+ "composer": "所选歌集未署曲作者",
+ "key": "C",
+ "harmonicaKey": "C",
+ "position": "第一把位",
+ "timeSignature": "4/4",
+ "tempo": 96,
+ "difficulty": 1,
+ "tags": [
+ "入门",
+ "儿歌"
+ ],
+ "source": "The Everyday Song Book (1927), No.25;John Chambers ABC 转录 (2017)",
+ "sourceUrl": "https://trillian.mit.edu/~jc/music/book/EverydaySongBook/025_Come_Let_Us_Learn_to_Sing.abc",
+ "sourceFormat": "music-text",
+ "sourceCheckedAt": "2026-10-23",
+ "builtin": true,
+ "order": 62,
+ "notes": "原F4主音移为C5;保留来源全部15小节及三个四分休止符。音域C5–C6,均有自然音孔位,适合音阶、长短音与休止练习。中文曲名为编辑译名。 不收录歌词和异音连奏线;速度为编辑练习建议,核对针对所列来源版本。",
+ "lines": [
+ [
+ {
+ "notes": [
+ 1,
+ 17,
+ 14,
+ 5,
+ 6
+ ]
+ },
+ {
+ "notes": [
+ 33,
+ 12,
+ 10
+ ]
+ },
+ {
+ "notes": [
+ 5,
+ 14,
+ 17,
+ 2,
+ 25
+ ]
+ },
+ {
+ "notes": [
+ 37,
+ 20
+ ]
+ }
+ ],
+ [
+ {
+ "notes": [
+ 1,
+ 17,
+ 14,
+ 5,
+ 6
+ ]
+ },
+ {
+ "notes": [
+ 33,
+ 12,
+ 10
+ ]
+ },
+ {
+ "notes": [
+ 5,
+ 14,
+ 17,
+ 2,
+ 25
+ ]
+ },
+ {
+ "notes": [
+ 37,
+ 20
+ ]
+ }
+ ],
+ [
+ {
+ "notes": [
+ 1,
+ 5,
+ 1,
+ 5
+ ]
+ },
+ {
+ "notes": [
+ 19,
+ 2,
+ 3
+ ]
+ },
+ {
+ "notes": [
+ 1,
+ 5,
+ 1,
+ 5
+ ]
+ },
+ {
+ "notes": [
+ 19,
+ 2,
+ 3
+ ]
+ }
+ ],
+ [
+ {
+ "notes": [
+ 19,
+ 22,
+ 26,
+ 1,
+ 4
+ ]
+ },
+ {
+ "notes": [
+ 46,
+ 8
+ ]
+ },
+ {
+ "sectionEnd": true,
+ "notes": [
+ 33,
+ 20
+ ]
+ }
+ ]
+ ]
+ },
+ {
+ "id": "su-wu-herding-sheep",
+ "title": "苏武牧羊",
+ "subtitle": "学堂乐歌 · 香港中乐团器乐版",
+ "composer": "所选教程未署曲作者",
+ "key": "C",
+ "harmonicaKey": "C",
+ "position": "第一把位",
+ "timeSignature": "4/4",
+ "tempo": 72,
+ "difficulty": 3,
+ "tags": [
+ "传统曲",
+ "学堂乐歌",
+ "压音",
+ "重音",
+ "保持音",
+ "倚音",
+ "延长记号"
+ ],
+ "source": "香港中乐团《唢呐初级教程》,第33页。",
+ "sourceUrl": "https://ynyqxg.hkco.org/uploads/docs/5bd9828a7a7201.pdf#page=33",
+ "sourceFormat": "jianpu-image",
+ "sourceCheckedAt": "2026-10-23",
+ "builtin": true,
+ "order": 63,
+ "notes": "按原页音级移写1=C并提高八度,原页未单列1=调号。保留29个书写小节(末行5小节)、15处重音、29处保持音、3处八分前倚音及末两全音符之间的延音,前一全音符保留自由延长。音域G4–D6;低la需3孔吸气全音压音。保持音不是高八度标记,也不增加书面拍数。 不收录歌词和异音连奏线;速度为编辑练习建议,核对针对所列器乐版本。",
+ "lines": [
+ [
+ {
+ "notes": [
+ 204,
+ 205
+ ]
+ },
+ {
+ "notes": [
+ 6,
+ 1,
+ 4,
+ 6
+ ]
+ },
+ {
+ "notes": [
+ 206
+ ]
+ },
+ {
+ "notes": [
+ 207,
+ 208,
+ 207,
+ 209
+ ]
+ }
+ ],
+ [
+ {
+ "notes": [
+ 210
+ ]
+ },
+ {
+ "notes": [
+ 211,
+ 212,
+ 211,
+ 209
+ ]
+ },
+ {
+ "notes": [
+ 210
+ ]
+ },
+ {
+ "notes": [
+ 213,
+ 214,
+ 204
+ ]
+ }
+ ],
+ [
+ {
+ "notes": [
+ 215,
+ 214,
+ 204
+ ]
+ },
+ {
+ "notes": [
+ 6,
+ 1,
+ 4,
+ 6
+ ]
+ },
+ {
+ "notes": [
+ 206
+ ]
+ },
+ {
+ "notes": [
+ 212,
+ 212,
+ 212,
+ 209
+ ]
+ }
+ ],
+ [
+ {
+ "notes": [
+ 216,
+ 211
+ ]
+ },
+ {
+ "notes": [
+ 6,
+ 0,
+ 32,
+ 79,
+ 31
+ ]
+ },
+ {
+ "notes": [
+ 217
+ ]
+ },
+ {
+ "notes": [
+ 1,
+ 1,
+ 2,
+ 19
+ ]
+ }
+ ],
+ [
+ {
+ "notes": [
+ 47
+ ]
+ },
+ {
+ "notes": [
+ 1,
+ 5,
+ 10,
+ 13,
+ 1
+ ]
+ },
+ {
+ "notes": [
+ 49
+ ]
+ },
+ {
+ "notes": [
+ 218,
+ 219,
+ 211,
+ 211
+ ]
+ }
+ ],
+ [
+ {
+ "notes": [
+ 212,
+ 211,
+ 212,
+ 220
+ ]
+ },
+ {
+ "notes": [
+ 221,
+ 220,
+ 212,
+ 211
+ ]
+ },
+ {
+ "notes": [
+ 206
+ ]
+ },
+ {
+ "notes": [
+ 28,
+ 10,
+ 4,
+ 4
+ ]
+ }
+ ],
+ [
+ {
+ "notes": [
+ 6,
+ 4,
+ 6,
+ 0
+ ]
+ },
+ {
+ "notes": [
+ 222
+ ]
+ },
+ {
+ "notes": [
+ 204,
+ 223
+ ]
+ },
+ {
+ "notes": [
+ 224
+ ]
+ },
+ {
+ "sectionEnd": true,
+ "notes": [
+ 225
+ ]
+ }
+ ]
+ ]
+ },
+ {
+ "id": "little-bee",
+ "title": "小蜜蜂",
+ "subtitle": "香港中乐团教程版",
+ "composer": "所选教程未署曲作者",
+ "key": "C",
+ "harmonicaKey": "C",
+ "position": "第一把位",
+ "timeSignature": "4/4",
+ "tempo": 96,
+ "difficulty": 1,
+ "tags": [
+ "入门",
+ "儿歌"
+ ],
+ "source": "香港中乐团《唢呐初级教程》,第26页。",
+ "sourceUrl": "https://ynyqxg.hkco.org/uploads/docs/5bd9828a7a7201.pdf#page=26",
+ "sourceFormat": "jianpu-image",
+ "sourceCheckedAt": "2026-10-23",
+ "builtin": true,
+ "order": 64,
+ "notes": "按原页音级移写1=C并提高八度,原页未单列1=调号。保留8小节4/4、全部八分与四分音及两处四分休止,C5–G5均有自然音孔位。与曲库中英国旧歌《勤劳的小蜜蜂》(The Busy Bee)是不同旋律。 不收录歌词和异音连奏线;速度为编辑练习建议,核对针对所列器乐版本。",
+ "lines": [
+ [
+ {
+ "notes": [
+ 17,
+ 13,
+ 5,
+ 14,
+ 10,
+ 6
+ ]
+ },
+ {
+ "notes": [
+ 12,
+ 10,
+ 13,
+ 14,
+ 17,
+ 17,
+ 1
+ ]
+ },
+ {
+ "notes": [
+ 17,
+ 13,
+ 5,
+ 14,
+ 10,
+ 6
+ ]
+ },
+ {
+ "notes": [
+ 12,
+ 13,
+ 17,
+ 17,
+ 5,
+ 20
+ ]
+ }
+ ],
+ [
+ {
+ "notes": [
+ 10,
+ 10,
+ 10,
+ 10,
+ 10,
+ 13,
+ 4
+ ]
+ },
+ {
+ "notes": [
+ 13,
+ 13,
+ 13,
+ 13,
+ 13,
+ 14,
+ 1
+ ]
+ },
+ {
+ "notes": [
+ 17,
+ 13,
+ 5,
+ 14,
+ 10,
+ 6
+ ]
+ },
+ {
+ "sectionEnd": true,
+ "notes": [
+ 12,
+ 13,
+ 17,
+ 17,
+ 0,
+ 20
+ ]
+ }
+ ]
+ ]
+ }
+ ]
+}
diff --git a/src/data/builtin.ts b/src/data/builtin.ts
index 2efc729..ff0088f 100644
--- a/src/data/builtin.ts
+++ b/src/data/builtin.ts
@@ -1,33 +1,5 @@
// 由 npm run scores:build 自动生成,请勿手工编辑
-import type { Score } from '../types/score';
-import score_1 from './scores/twinkle.json';
-import score_2 from './scores/ode-to-joy.json';
-import score_3 from './scores/farewell.json';
-import score_4 from './scores/auld-lang-syne.json';
-import score_5 from './scores/sally-gardens.json';
-import score_6 from './scores/blues-12bar.json';
-import score_7 from './scores/jingle-bells.json';
-import score_8 from './scores/bend-etude.json';
-import score_9 from './scores/frere-jacques.json';
-import score_10 from './scores/mary-little-lamb.json';
-import score_11 from './scores/happy-birthday.json';
-import score_12 from './scores/spanish-rowing-song.json';
-import score_13 from './scores/silent-night.json';
-import score_14 from './scores/amazing-grace.json';
+import { unpackBuiltinScores, type PackedBuiltinLibrary } from '../lib/builtinCodec';
+import packed from './builtin.packed.json';
-export const BUILTIN_SCORES: Score[] = [
- score_1 as unknown as Score,
- score_2 as unknown as Score,
- score_3 as unknown as Score,
- score_4 as unknown as Score,
- score_5 as unknown as Score,
- score_6 as unknown as Score,
- score_7 as unknown as Score,
- score_8 as unknown as Score,
- score_9 as unknown as Score,
- score_10 as unknown as Score,
- score_11 as unknown as Score,
- score_12 as unknown as Score,
- score_13 as unknown as Score,
- score_14 as unknown as Score,
-];
+export const BUILTIN_SCORES = unpackBuiltinScores(packed as PackedBuiltinLibrary);
diff --git a/src/data/scores/amazing-grace.json b/src/data/scores/amazing-grace.json
index 855fab6..2fc92b1 100644
--- a/src/data/scores/amazing-grace.json
+++ b/src/data/scores/amazing-grace.json
@@ -8,6 +8,7 @@
"position": "第一把位",
"timeSignature": "3/4",
"tempo": 70,
+ "pickupBeats": 1,
"difficulty": 3,
"tags": [
"赞美诗",
@@ -17,34 +18,14 @@
"source": "Wikimedia Commons 公有领域四声部数字简谱《Amazing Grace》的最高声部主旋律",
"sourceUrl": "https://commons.wikimedia.org/wiki/File:AmazingGraceNumberedMusicalNotation.png",
"sourceFormat": "jianpu-image",
- "sourceCheckedAt": "2026-08-31",
+ "sourceCheckedAt": "2026-10-23",
"builtin": true,
"order": 14,
- "notes": "只录入公有领域简谱的最高声部单旋律;首小节用两个休止拍补足弱起,整体升八度适配 C 调口琴。",
+ "notes": "逐行核对原图最高声部,保留 1=C 原音区 G4–G5、一拍弱起与两拍结尾;第 7、8 完整小节的高音 sol 保留。原图跨行的第 7 完整小节合并显示。和声与歌词不录入,练习速度为编辑建议。",
"lines": [
[
{
"notes": [
- {
- "degree": 0,
- "accidental": 0,
- "octave": 0,
- "beats": 1,
- "hole": null,
- "breath": null,
- "bend": 0,
- "overblow": false
- },
- {
- "degree": 0,
- "accidental": 0,
- "octave": 0,
- "beats": 1,
- "hole": null,
- "breath": null,
- "bend": 0,
- "overblow": false
- },
{
"degree": 5,
"accidental": 0,
@@ -62,9 +43,9 @@
{
"degree": 1,
"accidental": 0,
- "octave": 2,
+ "octave": 1,
"beats": 2,
- "hole": 7,
+ "hole": 4,
"breath": "blow",
"bend": 0,
"overblow": false
@@ -72,9 +53,9 @@
{
"degree": 3,
"accidental": 0,
- "octave": 2,
+ "octave": 1,
"beats": 0.5,
- "hole": 8,
+ "hole": 5,
"breath": "blow",
"bend": 0,
"overblow": false
@@ -82,9 +63,9 @@
{
"degree": 1,
"accidental": 0,
- "octave": 2,
+ "octave": 1,
"beats": 0.5,
- "hole": 7,
+ "hole": 4,
"breath": "blow",
"bend": 0,
"overblow": false
@@ -96,9 +77,9 @@
{
"degree": 3,
"accidental": 0,
- "octave": 2,
+ "octave": 1,
"beats": 2,
- "hole": 8,
+ "hole": 5,
"breath": "blow",
"bend": 0,
"overblow": false
@@ -106,9 +87,9 @@
{
"degree": 2,
"accidental": 0,
- "octave": 2,
+ "octave": 1,
"beats": 1,
- "hole": 8,
+ "hole": 4,
"breath": "draw",
"bend": 0,
"overblow": false
@@ -120,9 +101,9 @@
{
"degree": 1,
"accidental": 0,
- "octave": 2,
+ "octave": 1,
"beats": 2,
- "hole": 7,
+ "hole": 4,
"breath": "blow",
"bend": 0,
"overblow": false
@@ -130,11 +111,11 @@
{
"degree": 6,
"accidental": 0,
- "octave": 1,
+ "octave": 0,
"beats": 1,
- "hole": 6,
+ "hole": 3,
"breath": "draw",
- "bend": 0,
+ "bend": 2,
"overblow": false
}
]
@@ -146,9 +127,9 @@
{
"degree": 5,
"accidental": 0,
- "octave": 1,
+ "octave": 0,
"beats": 2,
- "hole": 6,
+ "hole": 3,
"breath": "blow",
"bend": 0,
"overblow": false
@@ -156,9 +137,9 @@
{
"degree": 5,
"accidental": 0,
- "octave": 1,
+ "octave": 0,
"beats": 1,
- "hole": 6,
+ "hole": 3,
"breath": "blow",
"bend": 0,
"overblow": false
@@ -170,9 +151,9 @@
{
"degree": 1,
"accidental": 0,
- "octave": 2,
+ "octave": 1,
"beats": 2,
- "hole": 7,
+ "hole": 4,
"breath": "blow",
"bend": 0,
"overblow": false
@@ -180,9 +161,9 @@
{
"degree": 3,
"accidental": 0,
- "octave": 2,
+ "octave": 1,
"beats": 0.5,
- "hole": 8,
+ "hole": 5,
"breath": "blow",
"bend": 0,
"overblow": false
@@ -190,9 +171,9 @@
{
"degree": 1,
"accidental": 0,
- "octave": 2,
+ "octave": 1,
"beats": 0.5,
- "hole": 7,
+ "hole": 4,
"breath": "blow",
"bend": 0,
"overblow": false
@@ -204,9 +185,9 @@
{
"degree": 3,
"accidental": 0,
- "octave": 2,
+ "octave": 1,
"beats": 2,
- "hole": 8,
+ "hole": 5,
"breath": "blow",
"bend": 0,
"overblow": false
@@ -214,9 +195,9 @@
{
"degree": 2,
"accidental": 0,
- "octave": 2,
+ "octave": 1,
"beats": 0.5,
- "hole": 8,
+ "hole": 4,
"breath": "draw",
"bend": 0,
"overblow": false
@@ -224,9 +205,9 @@
{
"degree": 3,
"accidental": 0,
- "octave": 2,
+ "octave": 1,
"beats": 0.5,
- "hole": 8,
+ "hole": 5,
"breath": "blow",
"bend": 0,
"overblow": false
@@ -248,9 +229,9 @@
{
"degree": 2,
"accidental": 0,
- "octave": 2,
+ "octave": 1,
"beats": 0.5,
- "hole": 8,
+ "hole": 4,
"breath": "draw",
"bend": 0,
"overblow": false
@@ -258,9 +239,9 @@
{
"degree": 3,
"accidental": 0,
- "octave": 2,
+ "octave": 1,
"beats": 0.5,
- "hole": 8,
+ "hole": 5,
"breath": "blow",
"bend": 0,
"overblow": false
@@ -284,9 +265,9 @@
{
"degree": 3,
"accidental": 0,
- "octave": 2,
+ "octave": 1,
"beats": 0.5,
- "hole": 8,
+ "hole": 5,
"breath": "blow",
"bend": 0,
"overblow": false
@@ -294,9 +275,9 @@
{
"degree": 1,
"accidental": 0,
- "octave": 2,
+ "octave": 1,
"beats": 0.5,
- "hole": 7,
+ "hole": 4,
"breath": "blow",
"bend": 0,
"overblow": false
@@ -308,9 +289,9 @@
{
"degree": 3,
"accidental": 0,
- "octave": 2,
+ "octave": 1,
"beats": 2,
- "hole": 8,
+ "hole": 5,
"breath": "blow",
"bend": 0,
"overblow": false
@@ -318,9 +299,9 @@
{
"degree": 3,
"accidental": 0,
- "octave": 2,
+ "octave": 1,
"beats": 0.5,
- "hole": 8,
+ "hole": 5,
"breath": "blow",
"bend": 0,
"overblow": false
@@ -328,9 +309,9 @@
{
"degree": 2,
"accidental": 0,
- "octave": 2,
+ "octave": 1,
"beats": 0.5,
- "hole": 8,
+ "hole": 4,
"breath": "draw",
"bend": 0,
"overblow": false
@@ -342,9 +323,9 @@
{
"degree": 1,
"accidental": 0,
- "octave": 2,
+ "octave": 1,
"beats": 2,
- "hole": 7,
+ "hole": 4,
"breath": "blow",
"bend": 0,
"overblow": false
@@ -352,11 +333,11 @@
{
"degree": 6,
"accidental": 0,
- "octave": 1,
+ "octave": 0,
"beats": 1,
- "hole": 6,
+ "hole": 3,
"breath": "draw",
- "bend": 0,
+ "bend": 2,
"overblow": false
}
]
@@ -366,9 +347,9 @@
{
"degree": 5,
"accidental": 0,
- "octave": 1,
+ "octave": 0,
"beats": 2,
- "hole": 6,
+ "hole": 3,
"breath": "blow",
"bend": 0,
"overblow": false
@@ -376,9 +357,9 @@
{
"degree": 5,
"accidental": 0,
- "octave": 1,
+ "octave": 0,
"beats": 1,
- "hole": 6,
+ "hole": 3,
"breath": "blow",
"bend": 0,
"overblow": false
@@ -392,9 +373,9 @@
{
"degree": 1,
"accidental": 0,
- "octave": 2,
+ "octave": 1,
"beats": 2,
- "hole": 7,
+ "hole": 4,
"breath": "blow",
"bend": 0,
"overblow": false
@@ -402,9 +383,9 @@
{
"degree": 3,
"accidental": 0,
- "octave": 2,
+ "octave": 1,
"beats": 0.5,
- "hole": 8,
+ "hole": 5,
"breath": "blow",
"bend": 0,
"overblow": false
@@ -412,9 +393,9 @@
{
"degree": 1,
"accidental": 0,
- "octave": 2,
+ "octave": 1,
"beats": 0.5,
- "hole": 7,
+ "hole": 4,
"breath": "blow",
"bend": 0,
"overblow": false
@@ -426,9 +407,9 @@
{
"degree": 3,
"accidental": 0,
- "octave": 2,
+ "octave": 1,
"beats": 2,
- "hole": 8,
+ "hole": 5,
"breath": "blow",
"bend": 0,
"overblow": false
@@ -436,9 +417,9 @@
{
"degree": 2,
"accidental": 0,
- "octave": 2,
+ "octave": 1,
"beats": 1,
- "hole": 8,
+ "hole": 4,
"breath": "draw",
"bend": 0,
"overblow": false
@@ -450,9 +431,9 @@
{
"degree": 1,
"accidental": 0,
- "octave": 2,
- "beats": 3,
- "hole": 7,
+ "octave": 1,
+ "beats": 2,
+ "hole": 4,
"breath": "blow",
"bend": 0,
"overblow": false
diff --git a/src/data/scores/arirang.json b/src/data/scores/arirang.json
new file mode 100644
index 0000000..e847d0e
--- /dev/null
+++ b/src/data/scores/arirang.json
@@ -0,0 +1,707 @@
+{
+ "id": "arirang",
+ "title": "阿里郎",
+ "subtitle": "Arirang · 教材单旋律版",
+ "composer": "朝鲜传统民歌",
+ "key": "C",
+ "harmonicaKey": "C",
+ "position": "第一把位",
+ "timeSignature": "3/4",
+ "tempo": 76,
+ "difficulty": 3,
+ "tags": [
+ "亚洲民歌",
+ "附点",
+ "压音"
+ ],
+ "source": "广东教育出版社/花城出版社《音乐三年级下册·简谱》印刷第 53 页(PDF 第 54 页),16 小节单旋律;1=F 移为 1=C,整体升八度适配 C 调口琴。",
+ "sourceUrl": "https://lywgyxx.szftedu.cn/xkjc/yinyue/202209/P020220910586729125995.pdf#page=54",
+ "sourceFormat": "jianpu-image",
+ "sourceCheckedAt": "2026-10-22",
+ "builtin": true,
+ "order": 15,
+ "notes": "保留教材音高、附点、休止和 16 小节结构;仅单旋律,省略歌词与连奏弧线。低音区 la 使用 3 孔吸气全音压音,建议先慢练音准。",
+ "lines": [
+ [
+ {
+ "notes": [
+ {
+ "degree": 5,
+ "accidental": 0,
+ "octave": 0,
+ "beats": 1,
+ "dotted": true,
+ "hole": 3,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 6,
+ "accidental": 0,
+ "octave": 0,
+ "beats": 0.5,
+ "hole": 3,
+ "breath": "draw",
+ "bend": 2,
+ "overblow": false
+ },
+ {
+ "degree": 5,
+ "accidental": 0,
+ "octave": 0,
+ "beats": 0.5,
+ "hole": 3,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 6,
+ "accidental": 0,
+ "octave": 0,
+ "beats": 0.5,
+ "hole": 3,
+ "breath": "draw",
+ "bend": 2,
+ "overblow": false
+ }
+ ]
+ },
+ {
+ "notes": [
+ {
+ "degree": 1,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 1,
+ "dotted": true,
+ "hole": 4,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 2,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.5,
+ "hole": 4,
+ "breath": "draw",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 1,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.5,
+ "hole": 4,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 2,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.5,
+ "hole": 4,
+ "breath": "draw",
+ "bend": 0,
+ "overblow": false
+ }
+ ]
+ },
+ {
+ "notes": [
+ {
+ "degree": 3,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 1,
+ "hole": 5,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 2,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.5,
+ "hole": 4,
+ "breath": "draw",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 3,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.5,
+ "hole": 5,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 1,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.5,
+ "hole": 4,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 6,
+ "accidental": 0,
+ "octave": 0,
+ "beats": 0.5,
+ "hole": 3,
+ "breath": "draw",
+ "bend": 2,
+ "overblow": false
+ }
+ ]
+ },
+ {
+ "notes": [
+ {
+ "degree": 5,
+ "accidental": 0,
+ "octave": 0,
+ "beats": 1,
+ "dotted": true,
+ "hole": 3,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 6,
+ "accidental": 0,
+ "octave": 0,
+ "beats": 0.5,
+ "hole": 3,
+ "breath": "draw",
+ "bend": 2,
+ "overblow": false
+ },
+ {
+ "degree": 5,
+ "accidental": 0,
+ "octave": 0,
+ "beats": 0.5,
+ "hole": 3,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 6,
+ "accidental": 0,
+ "octave": 0,
+ "beats": 0.5,
+ "hole": 3,
+ "breath": "draw",
+ "bend": 2,
+ "overblow": false
+ }
+ ]
+ }
+ ],
+ [
+ {
+ "notes": [
+ {
+ "degree": 1,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 1,
+ "dotted": true,
+ "hole": 4,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 2,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.5,
+ "hole": 4,
+ "breath": "draw",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 1,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.5,
+ "hole": 4,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 2,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.5,
+ "hole": 4,
+ "breath": "draw",
+ "bend": 0,
+ "overblow": false
+ }
+ ]
+ },
+ {
+ "notes": [
+ {
+ "degree": 3,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.5,
+ "hole": 5,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 2,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.5,
+ "hole": 4,
+ "breath": "draw",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 1,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.5,
+ "hole": 4,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 6,
+ "accidental": 0,
+ "octave": 0,
+ "beats": 0.5,
+ "hole": 3,
+ "breath": "draw",
+ "bend": 2,
+ "overblow": false
+ },
+ {
+ "degree": 5,
+ "accidental": 0,
+ "octave": 0,
+ "beats": 0.5,
+ "hole": 3,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 6,
+ "accidental": 0,
+ "octave": 0,
+ "beats": 0.5,
+ "hole": 3,
+ "breath": "draw",
+ "bend": 2,
+ "overblow": false
+ }
+ ]
+ },
+ {
+ "notes": [
+ {
+ "degree": 1,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 1,
+ "dotted": true,
+ "hole": 4,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 2,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.5,
+ "hole": 4,
+ "breath": "draw",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 1,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 1,
+ "hole": 4,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ }
+ ]
+ },
+ {
+ "notes": [
+ {
+ "degree": 1,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 3,
+ "hole": 4,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ }
+ ]
+ }
+ ],
+ [
+ {
+ "notes": [
+ {
+ "degree": 5,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 1,
+ "hole": 6,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 5,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 2,
+ "hole": 6,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ }
+ ]
+ },
+ {
+ "notes": [
+ {
+ "degree": 5,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 1,
+ "hole": 6,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 3,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 1,
+ "hole": 5,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 2,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 1,
+ "hole": 4,
+ "breath": "draw",
+ "bend": 0,
+ "overblow": false
+ }
+ ]
+ },
+ {
+ "notes": [
+ {
+ "degree": 3,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 1,
+ "hole": 5,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 2,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.5,
+ "hole": 4,
+ "breath": "draw",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 3,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.5,
+ "hole": 5,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 1,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.5,
+ "hole": 4,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 6,
+ "accidental": 0,
+ "octave": 0,
+ "beats": 0.5,
+ "hole": 3,
+ "breath": "draw",
+ "bend": 2,
+ "overblow": false
+ }
+ ]
+ },
+ {
+ "notes": [
+ {
+ "degree": 5,
+ "accidental": 0,
+ "octave": 0,
+ "beats": 1,
+ "dotted": true,
+ "hole": 3,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 6,
+ "accidental": 0,
+ "octave": 0,
+ "beats": 0.5,
+ "hole": 3,
+ "breath": "draw",
+ "bend": 2,
+ "overblow": false
+ },
+ {
+ "degree": 5,
+ "accidental": 0,
+ "octave": 0,
+ "beats": 0.5,
+ "hole": 3,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 0,
+ "accidental": 0,
+ "octave": 0,
+ "beats": 0.5,
+ "hole": null,
+ "breath": null,
+ "bend": 0,
+ "overblow": false
+ }
+ ]
+ }
+ ],
+ [
+ {
+ "notes": [
+ {
+ "degree": 1,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 1,
+ "dotted": true,
+ "hole": 4,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 2,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.5,
+ "hole": 4,
+ "breath": "draw",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 1,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.5,
+ "hole": 4,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 2,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.5,
+ "hole": 4,
+ "breath": "draw",
+ "bend": 0,
+ "overblow": false
+ }
+ ]
+ },
+ {
+ "notes": [
+ {
+ "degree": 3,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.5,
+ "hole": 5,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 2,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.5,
+ "hole": 4,
+ "breath": "draw",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 1,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.5,
+ "hole": 4,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 6,
+ "accidental": 0,
+ "octave": 0,
+ "beats": 0.5,
+ "hole": 3,
+ "breath": "draw",
+ "bend": 2,
+ "overblow": false
+ },
+ {
+ "degree": 5,
+ "accidental": 0,
+ "octave": 0,
+ "beats": 0.5,
+ "hole": 3,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 6,
+ "accidental": 0,
+ "octave": 0,
+ "beats": 0.5,
+ "hole": 3,
+ "breath": "draw",
+ "bend": 2,
+ "overblow": false
+ }
+ ]
+ },
+ {
+ "notes": [
+ {
+ "degree": 1,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 1,
+ "dotted": true,
+ "hole": 4,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 2,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.5,
+ "hole": 4,
+ "breath": "draw",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 1,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 1,
+ "hole": 4,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ }
+ ]
+ },
+ {
+ "notes": [
+ {
+ "degree": 1,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 2,
+ "hole": 4,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 0,
+ "accidental": 0,
+ "octave": 0,
+ "beats": 1,
+ "hole": null,
+ "breath": null,
+ "bend": 0,
+ "overblow": false
+ }
+ ],
+ "sectionEnd": true
+ }
+ ]
+ ]
+}
diff --git a/src/data/scores/ash-grove.json b/src/data/scores/ash-grove.json
new file mode 100644
index 0000000..d5a2148
--- /dev/null
+++ b/src/data/scores/ash-grove.json
@@ -0,0 +1,1307 @@
+{
+ "id": "ash-grove",
+ "title": "白蜡树林",
+ "subtitle": "The Ash Grove · 威尔士民歌",
+ "composer": "威尔士传统民歌",
+ "key": "G",
+ "harmonicaKey": "C",
+ "position": "第二把位",
+ "timeSignature": "3/4",
+ "tempo": 96,
+ "difficulty": 3,
+ "tags": [
+ "传统曲",
+ "西方民谣",
+ "压音"
+ ],
+ "source": "The Everyday Song Book (1927), No.131;John Chambers ABC 转录",
+ "sourceUrl": "https://trillian.mit.edu/~jc/music/book/EverydaySongBook/131_the_Ash_Grove.abc",
+ "sourceFormat": "music-text",
+ "sourceCheckedAt": "2026-10-23",
+ "builtin": true,
+ "order": 52,
+ "notes": "原 Ab 调整体下移半音为 G 调,C 调口琴第二把位。首段反复已展开,重复起拍与后段弱起接入前小节;33个书写小节含弱起。第24书写小节升 fa 为 C#5,需4孔吸气半音压音;低 si 为 F#4,需2孔吸气半音压音。不要把原文还原 D 错读为 D 降。 仅录主旋律,不录歌词、伴奏及异音连奏线;速度为编辑练习建议。",
+ "lines": [
+ [
+ {
+ "notes": [
+ {
+ "degree": 5,
+ "accidental": 0,
+ "octave": -1,
+ "beats": 1,
+ "hole": 1,
+ "breath": "draw",
+ "bend": 0,
+ "overblow": false
+ }
+ ]
+ },
+ {
+ "notes": [
+ {
+ "degree": 1,
+ "accidental": 0,
+ "octave": 0,
+ "beats": 1,
+ "hole": 3,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 3,
+ "accidental": 0,
+ "octave": 0,
+ "beats": 1,
+ "hole": 3,
+ "breath": "draw",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 4,
+ "accidental": 0,
+ "octave": 0,
+ "beats": 0.5,
+ "hole": 4,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 3,
+ "accidental": 0,
+ "octave": 0,
+ "beats": 0.5,
+ "hole": 3,
+ "breath": "draw",
+ "bend": 0,
+ "overblow": false
+ }
+ ]
+ },
+ {
+ "notes": [
+ {
+ "degree": 3,
+ "accidental": 0,
+ "octave": 0,
+ "beats": 1,
+ "hole": 3,
+ "breath": "draw",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 1,
+ "accidental": 0,
+ "octave": 0,
+ "beats": 1,
+ "hole": 3,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 1,
+ "accidental": 0,
+ "octave": 0,
+ "beats": 1,
+ "hole": 3,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ }
+ ]
+ },
+ {
+ "notes": [
+ {
+ "degree": 2,
+ "accidental": 0,
+ "octave": 0,
+ "beats": 1,
+ "hole": 3,
+ "breath": "draw",
+ "bend": 2,
+ "overblow": false
+ },
+ {
+ "degree": 4,
+ "accidental": 0,
+ "octave": 0,
+ "beats": 0.5,
+ "hole": 4,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 3,
+ "accidental": 0,
+ "octave": 0,
+ "beats": 0.5,
+ "hole": 3,
+ "breath": "draw",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 2,
+ "accidental": 0,
+ "octave": 0,
+ "beats": 0.5,
+ "hole": 3,
+ "breath": "draw",
+ "bend": 2,
+ "overblow": false
+ },
+ {
+ "degree": 1,
+ "accidental": 0,
+ "octave": 0,
+ "beats": 0.5,
+ "hole": 3,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ }
+ ]
+ },
+ {
+ "notes": [
+ {
+ "degree": 7,
+ "accidental": 0,
+ "octave": -1,
+ "beats": 1,
+ "hole": 2,
+ "breath": "draw",
+ "bend": 1,
+ "overblow": false
+ },
+ {
+ "degree": 5,
+ "accidental": 0,
+ "octave": -1,
+ "beats": 1,
+ "hole": 1,
+ "breath": "draw",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 5,
+ "accidental": 0,
+ "octave": -1,
+ "beats": 1,
+ "hole": 1,
+ "breath": "draw",
+ "bend": 0,
+ "overblow": false
+ }
+ ]
+ },
+ {
+ "notes": [
+ {
+ "degree": 1,
+ "accidental": 0,
+ "octave": 0,
+ "beats": 1,
+ "hole": 3,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 3,
+ "accidental": 0,
+ "octave": 0,
+ "beats": 0.5,
+ "hole": 3,
+ "breath": "draw",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 2,
+ "accidental": 0,
+ "octave": 0,
+ "beats": 0.5,
+ "hole": 3,
+ "breath": "draw",
+ "bend": 2,
+ "overblow": false
+ },
+ {
+ "degree": 1,
+ "accidental": 0,
+ "octave": 0,
+ "beats": 0.5,
+ "hole": 3,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 7,
+ "accidental": 0,
+ "octave": -1,
+ "beats": 0.5,
+ "hole": 2,
+ "breath": "draw",
+ "bend": 1,
+ "overblow": false
+ }
+ ]
+ },
+ {
+ "notes": [
+ {
+ "degree": 6,
+ "accidental": 0,
+ "octave": -1,
+ "beats": 1,
+ "hole": 2,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 4,
+ "accidental": 0,
+ "octave": -1,
+ "beats": 1,
+ "hole": 1,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 6,
+ "accidental": 0,
+ "octave": -1,
+ "beats": 1,
+ "hole": 2,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ }
+ ]
+ },
+ {
+ "notes": [
+ {
+ "degree": 5,
+ "accidental": 0,
+ "octave": -1,
+ "beats": 1,
+ "hole": 1,
+ "breath": "draw",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 1,
+ "accidental": 0,
+ "octave": 0,
+ "beats": 1,
+ "hole": 3,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 7,
+ "accidental": 0,
+ "octave": -1,
+ "beats": 1,
+ "hole": 2,
+ "breath": "draw",
+ "bend": 1,
+ "overblow": false
+ }
+ ]
+ },
+ {
+ "notes": [
+ {
+ "degree": 1,
+ "accidental": 0,
+ "octave": 0,
+ "beats": 2,
+ "hole": 3,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 5,
+ "accidental": 0,
+ "octave": -1,
+ "beats": 1,
+ "hole": 1,
+ "breath": "draw",
+ "bend": 0,
+ "overblow": false
+ }
+ ]
+ }
+ ],
+ [
+ {
+ "notes": [
+ {
+ "degree": 1,
+ "accidental": 0,
+ "octave": 0,
+ "beats": 1,
+ "hole": 3,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 3,
+ "accidental": 0,
+ "octave": 0,
+ "beats": 1,
+ "hole": 3,
+ "breath": "draw",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 4,
+ "accidental": 0,
+ "octave": 0,
+ "beats": 0.5,
+ "hole": 4,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 3,
+ "accidental": 0,
+ "octave": 0,
+ "beats": 0.5,
+ "hole": 3,
+ "breath": "draw",
+ "bend": 0,
+ "overblow": false
+ }
+ ]
+ },
+ {
+ "notes": [
+ {
+ "degree": 3,
+ "accidental": 0,
+ "octave": 0,
+ "beats": 1,
+ "hole": 3,
+ "breath": "draw",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 1,
+ "accidental": 0,
+ "octave": 0,
+ "beats": 1,
+ "hole": 3,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 1,
+ "accidental": 0,
+ "octave": 0,
+ "beats": 1,
+ "hole": 3,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ }
+ ]
+ },
+ {
+ "notes": [
+ {
+ "degree": 2,
+ "accidental": 0,
+ "octave": 0,
+ "beats": 1,
+ "hole": 3,
+ "breath": "draw",
+ "bend": 2,
+ "overblow": false
+ },
+ {
+ "degree": 4,
+ "accidental": 0,
+ "octave": 0,
+ "beats": 0.5,
+ "hole": 4,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 3,
+ "accidental": 0,
+ "octave": 0,
+ "beats": 0.5,
+ "hole": 3,
+ "breath": "draw",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 2,
+ "accidental": 0,
+ "octave": 0,
+ "beats": 0.5,
+ "hole": 3,
+ "breath": "draw",
+ "bend": 2,
+ "overblow": false
+ },
+ {
+ "degree": 1,
+ "accidental": 0,
+ "octave": 0,
+ "beats": 0.5,
+ "hole": 3,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ }
+ ]
+ },
+ {
+ "notes": [
+ {
+ "degree": 7,
+ "accidental": 0,
+ "octave": -1,
+ "beats": 1,
+ "hole": 2,
+ "breath": "draw",
+ "bend": 1,
+ "overblow": false
+ },
+ {
+ "degree": 5,
+ "accidental": 0,
+ "octave": -1,
+ "beats": 1,
+ "hole": 1,
+ "breath": "draw",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 5,
+ "accidental": 0,
+ "octave": -1,
+ "beats": 1,
+ "hole": 1,
+ "breath": "draw",
+ "bend": 0,
+ "overblow": false
+ }
+ ]
+ },
+ {
+ "notes": [
+ {
+ "degree": 1,
+ "accidental": 0,
+ "octave": 0,
+ "beats": 1,
+ "hole": 3,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 3,
+ "accidental": 0,
+ "octave": 0,
+ "beats": 0.5,
+ "hole": 3,
+ "breath": "draw",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 2,
+ "accidental": 0,
+ "octave": 0,
+ "beats": 0.5,
+ "hole": 3,
+ "breath": "draw",
+ "bend": 2,
+ "overblow": false
+ },
+ {
+ "degree": 1,
+ "accidental": 0,
+ "octave": 0,
+ "beats": 0.5,
+ "hole": 3,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 7,
+ "accidental": 0,
+ "octave": -1,
+ "beats": 0.5,
+ "hole": 2,
+ "breath": "draw",
+ "bend": 1,
+ "overblow": false
+ }
+ ]
+ },
+ {
+ "notes": [
+ {
+ "degree": 6,
+ "accidental": 0,
+ "octave": -1,
+ "beats": 1,
+ "hole": 2,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 4,
+ "accidental": 0,
+ "octave": -1,
+ "beats": 1,
+ "hole": 1,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 6,
+ "accidental": 0,
+ "octave": -1,
+ "beats": 1,
+ "hole": 2,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ }
+ ]
+ },
+ {
+ "notes": [
+ {
+ "degree": 5,
+ "accidental": 0,
+ "octave": -1,
+ "beats": 1,
+ "hole": 1,
+ "breath": "draw",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 1,
+ "accidental": 0,
+ "octave": 0,
+ "beats": 1,
+ "hole": 3,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 7,
+ "accidental": 0,
+ "octave": -1,
+ "beats": 1,
+ "hole": 2,
+ "breath": "draw",
+ "bend": 1,
+ "overblow": false
+ }
+ ]
+ },
+ {
+ "notes": [
+ {
+ "degree": 1,
+ "accidental": 0,
+ "octave": 0,
+ "beats": 2,
+ "hole": 3,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 3,
+ "accidental": 0,
+ "octave": 0,
+ "beats": 0.5,
+ "hole": 3,
+ "breath": "draw",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 4,
+ "accidental": 0,
+ "octave": 0,
+ "beats": 0.5,
+ "hole": 4,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ }
+ ]
+ }
+ ],
+ [
+ {
+ "notes": [
+ {
+ "degree": 5,
+ "accidental": 0,
+ "octave": 0,
+ "beats": 1,
+ "hole": 4,
+ "breath": "draw",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 3,
+ "accidental": 0,
+ "octave": 0,
+ "beats": 0.5,
+ "hole": 3,
+ "breath": "draw",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 4,
+ "accidental": 0,
+ "octave": 0,
+ "beats": 0.5,
+ "hole": 4,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 5,
+ "accidental": 0,
+ "octave": 0,
+ "beats": 0.5,
+ "hole": 4,
+ "breath": "draw",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 6,
+ "accidental": 0,
+ "octave": 0,
+ "beats": 0.5,
+ "hole": 5,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ }
+ ]
+ },
+ {
+ "notes": [
+ {
+ "degree": 5,
+ "accidental": 0,
+ "octave": 0,
+ "beats": 1,
+ "hole": 4,
+ "breath": "draw",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 4,
+ "accidental": 0,
+ "octave": 0,
+ "beats": 1,
+ "hole": 4,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 3,
+ "accidental": 0,
+ "octave": 0,
+ "beats": 1,
+ "hole": 3,
+ "breath": "draw",
+ "bend": 0,
+ "overblow": false
+ }
+ ]
+ },
+ {
+ "notes": [
+ {
+ "degree": 4,
+ "accidental": 0,
+ "octave": 0,
+ "beats": 1,
+ "hole": 4,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 2,
+ "accidental": 0,
+ "octave": 0,
+ "beats": 0.5,
+ "hole": 3,
+ "breath": "draw",
+ "bend": 2,
+ "overblow": false
+ },
+ {
+ "degree": 3,
+ "accidental": 0,
+ "octave": 0,
+ "beats": 0.5,
+ "hole": 3,
+ "breath": "draw",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 4,
+ "accidental": 0,
+ "octave": 0,
+ "beats": 0.5,
+ "hole": 4,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 5,
+ "accidental": 0,
+ "octave": 0,
+ "beats": 0.5,
+ "hole": 4,
+ "breath": "draw",
+ "bend": 0,
+ "overblow": false
+ }
+ ]
+ },
+ {
+ "notes": [
+ {
+ "degree": 4,
+ "accidental": 0,
+ "octave": 0,
+ "beats": 1,
+ "hole": 4,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 3,
+ "accidental": 0,
+ "octave": 0,
+ "beats": 1,
+ "hole": 3,
+ "breath": "draw",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 2,
+ "accidental": 0,
+ "octave": 0,
+ "beats": 1,
+ "hole": 3,
+ "breath": "draw",
+ "bend": 2,
+ "overblow": false
+ }
+ ]
+ },
+ {
+ "notes": [
+ {
+ "degree": 3,
+ "accidental": 0,
+ "octave": 0,
+ "beats": 1,
+ "hole": 3,
+ "breath": "draw",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 1,
+ "accidental": 0,
+ "octave": 0,
+ "beats": 0.5,
+ "hole": 3,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 2,
+ "accidental": 0,
+ "octave": 0,
+ "beats": 0.5,
+ "hole": 3,
+ "breath": "draw",
+ "bend": 2,
+ "overblow": false
+ },
+ {
+ "degree": 3,
+ "accidental": 0,
+ "octave": 0,
+ "beats": 0.5,
+ "hole": 3,
+ "breath": "draw",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 4,
+ "accidental": 0,
+ "octave": 0,
+ "beats": 0.5,
+ "hole": 4,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ }
+ ]
+ },
+ {
+ "notes": [
+ {
+ "degree": 3,
+ "accidental": 0,
+ "octave": 0,
+ "beats": 1,
+ "hole": 3,
+ "breath": "draw",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 2,
+ "accidental": 0,
+ "octave": 0,
+ "beats": 1,
+ "hole": 3,
+ "breath": "draw",
+ "bend": 2,
+ "overblow": false
+ },
+ {
+ "degree": 1,
+ "accidental": 0,
+ "octave": 0,
+ "beats": 1,
+ "hole": 3,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ }
+ ]
+ },
+ {
+ "notes": [
+ {
+ "degree": 7,
+ "accidental": 0,
+ "octave": -1,
+ "beats": 1,
+ "hole": 2,
+ "breath": "draw",
+ "bend": 1,
+ "overblow": false
+ },
+ {
+ "degree": 5,
+ "accidental": 0,
+ "octave": 0,
+ "beats": 1,
+ "hole": 4,
+ "breath": "draw",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 4,
+ "accidental": 1,
+ "octave": 0,
+ "beats": 1,
+ "hole": 4,
+ "breath": "draw",
+ "bend": 1,
+ "overblow": false
+ }
+ ]
+ },
+ {
+ "notes": [
+ {
+ "degree": 5,
+ "accidental": 0,
+ "octave": 0,
+ "beats": 2,
+ "hole": 4,
+ "breath": "draw",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 5,
+ "accidental": 0,
+ "octave": -1,
+ "beats": 1,
+ "hole": 1,
+ "breath": "draw",
+ "bend": 0,
+ "overblow": false
+ }
+ ]
+ }
+ ],
+ [
+ {
+ "notes": [
+ {
+ "degree": 1,
+ "accidental": 0,
+ "octave": 0,
+ "beats": 1,
+ "hole": 3,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 3,
+ "accidental": 0,
+ "octave": 0,
+ "beats": 1,
+ "hole": 3,
+ "breath": "draw",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 5,
+ "accidental": 0,
+ "octave": 0,
+ "beats": 0.5,
+ "hole": 4,
+ "breath": "draw",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 4,
+ "accidental": 0,
+ "octave": 0,
+ "beats": 0.5,
+ "hole": 4,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ }
+ ]
+ },
+ {
+ "notes": [
+ {
+ "degree": 3,
+ "accidental": 0,
+ "octave": 0,
+ "beats": 1,
+ "hole": 3,
+ "breath": "draw",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 1,
+ "accidental": 0,
+ "octave": 0,
+ "beats": 1,
+ "hole": 3,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 1,
+ "accidental": 0,
+ "octave": 0,
+ "beats": 1,
+ "hole": 3,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ }
+ ]
+ },
+ {
+ "notes": [
+ {
+ "degree": 2,
+ "accidental": 0,
+ "octave": 0,
+ "beats": 1,
+ "hole": 3,
+ "breath": "draw",
+ "bend": 2,
+ "overblow": false
+ },
+ {
+ "degree": 4,
+ "accidental": 0,
+ "octave": 0,
+ "beats": 0.5,
+ "hole": 4,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 3,
+ "accidental": 0,
+ "octave": 0,
+ "beats": 0.5,
+ "hole": 3,
+ "breath": "draw",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 2,
+ "accidental": 0,
+ "octave": 0,
+ "beats": 0.5,
+ "hole": 3,
+ "breath": "draw",
+ "bend": 2,
+ "overblow": false
+ },
+ {
+ "degree": 1,
+ "accidental": 0,
+ "octave": 0,
+ "beats": 0.5,
+ "hole": 3,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ }
+ ]
+ },
+ {
+ "notes": [
+ {
+ "degree": 7,
+ "accidental": 0,
+ "octave": -1,
+ "beats": 1,
+ "hole": 2,
+ "breath": "draw",
+ "bend": 1,
+ "overblow": false
+ },
+ {
+ "degree": 5,
+ "accidental": 0,
+ "octave": -1,
+ "beats": 1,
+ "hole": 1,
+ "breath": "draw",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 5,
+ "accidental": 0,
+ "octave": -1,
+ "beats": 1,
+ "hole": 1,
+ "breath": "draw",
+ "bend": 0,
+ "overblow": false
+ }
+ ]
+ },
+ {
+ "notes": [
+ {
+ "degree": 1,
+ "accidental": 0,
+ "octave": 0,
+ "beats": 1,
+ "hole": 3,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 4,
+ "accidental": 0,
+ "octave": 0,
+ "beats": 0.5,
+ "hole": 4,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 3,
+ "accidental": 0,
+ "octave": 0,
+ "beats": 0.5,
+ "hole": 3,
+ "breath": "draw",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 1,
+ "accidental": 0,
+ "octave": 0,
+ "beats": 0.5,
+ "hole": 3,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 7,
+ "accidental": 0,
+ "octave": -1,
+ "beats": 0.5,
+ "hole": 2,
+ "breath": "draw",
+ "bend": 1,
+ "overblow": false
+ }
+ ]
+ },
+ {
+ "notes": [
+ {
+ "degree": 6,
+ "accidental": 0,
+ "octave": -1,
+ "beats": 1,
+ "hole": 2,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 4,
+ "accidental": 0,
+ "octave": -1,
+ "beats": 1,
+ "hole": 1,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 6,
+ "accidental": 0,
+ "octave": -1,
+ "beats": 1,
+ "hole": 2,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ }
+ ]
+ },
+ {
+ "notes": [
+ {
+ "degree": 5,
+ "accidental": 0,
+ "octave": -1,
+ "beats": 1,
+ "hole": 1,
+ "breath": "draw",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 1,
+ "accidental": 0,
+ "octave": 0,
+ "beats": 1,
+ "hole": 3,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 7,
+ "accidental": 0,
+ "octave": -1,
+ "beats": 1,
+ "hole": 2,
+ "breath": "draw",
+ "bend": 1,
+ "overblow": false
+ }
+ ]
+ },
+ {
+ "notes": [
+ {
+ "degree": 1,
+ "accidental": 0,
+ "octave": 0,
+ "beats": 2,
+ "hole": 3,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ }
+ ],
+ "sectionEnd": true
+ }
+ ]
+ ]
+}
diff --git a/src/data/scores/auld-lang-syne.json b/src/data/scores/auld-lang-syne.json
index bad1a7b..cb4d3b9 100644
--- a/src/data/scores/auld-lang-syne.json
+++ b/src/data/scores/auld-lang-syne.json
@@ -8,6 +8,7 @@
"position": "第一把位",
"timeSignature": "4/4",
"tempo": 92,
+ "pickupBeats": 1,
"difficulty": 2,
"tags": [
"民歌",
@@ -16,44 +17,14 @@
"source": "音伴《吉他入门标准教程》简谱《友谊天长地久》;苏格兰公有领域民歌",
"sourceUrl": "https://www.yinban.com/a/yinban_Guitar_Course_20210412.pdf",
"sourceFormat": "jianpu-image",
- "sourceCheckedAt": "2026-08-31",
+ "sourceCheckedAt": "2026-10-23",
"builtin": true,
"order": 4,
- "notes": "按 1=C、4/4 教材简谱逐音核对;弱起在应用内补三个休止拍,整体升八度适配 C 调十孔口琴。",
+ "notes": "重新核对教材 PDF 第 20 页全部 16 个完整小节及一拍弱起;移除旧版人为补入的三个休止拍,保留源谱末小节完整四拍(含末尾一拍休止)。整体升八度至 G4–C6,和弦、歌词及异音连线不录入,速度为编辑建议。",
"lines": [
[
{
"notes": [
- {
- "degree": 0,
- "accidental": 0,
- "octave": 0,
- "beats": 1,
- "hole": null,
- "breath": null,
- "bend": 0,
- "overblow": false
- },
- {
- "degree": 0,
- "accidental": 0,
- "octave": 0,
- "beats": 1,
- "hole": null,
- "breath": null,
- "bend": 0,
- "overblow": false
- },
- {
- "degree": 0,
- "accidental": 0,
- "octave": 0,
- "beats": 1,
- "hole": null,
- "breath": null,
- "bend": 0,
- "overblow": false
- },
{
"degree": 5,
"accidental": 0,
diff --git a/src/data/scores/bend-etude.json b/src/data/scores/bend-etude.json
index 546e981..de470df 100644
--- a/src/data/scores/bend-etude.json
+++ b/src/data/scores/bend-etude.json
@@ -16,10 +16,10 @@
],
"source": "HarpScore 原创(可自由使用)",
"sourceFormat": "original",
- "sourceCheckedAt": "2026-08-31",
+ "sourceCheckedAt": "2026-10-23",
"builtin": true,
"order": 8,
- "notes": "专门针对第一把位最容易卡住的两个音:4(2 孔吸气压全音 2'')和 6(3 孔吸气压全音 3'')。练习时先用「喝-呀」的口型把音往下带,听到音高连续下滑再收住;速度放慢,确保每个压音都到位再提速。",
+ "notes": "C 调第一把位低音区练习,15 个 4/4 小节;F4 为 2 孔吸压全音,A4 为 3 孔吸压全音。全曲音域 C4–A4,按目标音高慢速练习;不包含动态压音释放的过程记谱。",
"lines": [
[
{
diff --git a/src/data/scores/blues-12bar.json b/src/data/scores/blues-12bar.json
index 569ef60..49acbd9 100644
--- a/src/data/scores/blues-12bar.json
+++ b/src/data/scores/blues-12bar.json
@@ -16,10 +16,10 @@
],
"source": "HarpScore 原创(可自由使用)",
"sourceFormat": "original",
- "sourceCheckedAt": "2026-08-31",
+ "sourceCheckedAt": "2026-10-23",
"builtin": true,
"order": 6,
- "notes": "C 调口琴第二把位奏 G 调布鲁斯。核心音:2=3孔吸音压全音(3''),b3=3孔吸音压半音(3'),b5=4孔吸音压半音(4')。跟着 shuffle 节奏摇摆,八分音符吹成swing。",
+ "notes": "C 调口琴第二把位奏 G 调的 12 小节原创单音练习,无和弦伴奏。2=A4 为 3 孔吸压全音,降3=Bb4 为 3 孔吸压半音,降5=Db5 为 4 孔吸压半音。谱面八分音符时值为等长;若按 swing/shuffle 演奏,其长短比例需另行指导,当前数据未记写三连音时值。",
"lines": [
[
{
diff --git a/src/data/scores/busy-bee.json b/src/data/scores/busy-bee.json
new file mode 100644
index 0000000..44e38eb
--- /dev/null
+++ b/src/data/scores/busy-bee.json
@@ -0,0 +1,356 @@
+{
+ "id": "busy-bee",
+ "title": "勤劳的小蜜蜂",
+ "subtitle": "How Doth the Little Busy Bee · 英国古调",
+ "composer": "英国古调(Old English,所选歌集署名)",
+ "key": "C",
+ "harmonicaKey": "C",
+ "position": "第一把位",
+ "timeSignature": "4/4",
+ "tempo": 96,
+ "difficulty": 2,
+ "tags": [
+ "传统曲",
+ "西方民谣"
+ ],
+ "source": "The Everyday Song Book (1927), No.34;John Chambers ABC 转录",
+ "sourceUrl": "https://trillian.mit.edu/~jc/music/book/EverydaySongBook/034_How_Doth_the_Little_Busy_Bee.abc",
+ "sourceFormat": "music-text",
+ "sourceCheckedAt": "2026-10-23",
+ "builtin": true,
+ "order": 49,
+ "notes": "9个书写小节含一拍弱起,末小节三拍互补;原文末句 fa–mi 为两个八分音符。该英国古调不是常见德国童谣《小蜜蜂》的旋律。 仅录主旋律,不录歌词、伴奏及异音连奏线;速度为编辑练习建议。 原 Eb4 主音移为 C5,所有音符整体上移 9 个半音。",
+ "lines": [
+ [
+ {
+ "notes": [
+ {
+ "degree": 5,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 1,
+ "hole": 6,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ }
+ ]
+ },
+ {
+ "notes": [
+ {
+ "degree": 1,
+ "accidental": 0,
+ "octave": 2,
+ "beats": 1,
+ "hole": 7,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 7,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 1,
+ "hole": 7,
+ "breath": "draw",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 6,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 1,
+ "hole": 6,
+ "breath": "draw",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 5,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 1,
+ "hole": 6,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ }
+ ]
+ },
+ {
+ "notes": [
+ {
+ "degree": 6,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 1,
+ "hole": 6,
+ "breath": "draw",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 5,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 1,
+ "hole": 6,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 4,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 1,
+ "hole": 5,
+ "breath": "draw",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 3,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 1,
+ "hole": 5,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ }
+ ]
+ },
+ {
+ "notes": [
+ {
+ "degree": 6,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 1,
+ "hole": 6,
+ "breath": "draw",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 5,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 1,
+ "hole": 6,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 4,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 1,
+ "hole": 5,
+ "breath": "draw",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 3,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 1,
+ "hole": 5,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ }
+ ]
+ },
+ {
+ "notes": [
+ {
+ "degree": 2,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 3,
+ "hole": 4,
+ "breath": "draw",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 3,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 1,
+ "hole": 5,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ }
+ ]
+ }
+ ],
+ [
+ {
+ "notes": [
+ {
+ "degree": 4,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 1,
+ "hole": 5,
+ "breath": "draw",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 3,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 1,
+ "hole": 5,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 6,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 1,
+ "hole": 6,
+ "breath": "draw",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 5,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 1,
+ "hole": 6,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ }
+ ]
+ },
+ {
+ "notes": [
+ {
+ "degree": 4,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 1,
+ "hole": 5,
+ "breath": "draw",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 3,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 1,
+ "hole": 5,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 2,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 1,
+ "hole": 4,
+ "breath": "draw",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 6,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 1,
+ "hole": 6,
+ "breath": "draw",
+ "bend": 0,
+ "overblow": false
+ }
+ ]
+ },
+ {
+ "notes": [
+ {
+ "degree": 5,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 1,
+ "hole": 6,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 3,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 1,
+ "hole": 5,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 4,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.5,
+ "hole": 5,
+ "breath": "draw",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 3,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.5,
+ "hole": 5,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 2,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 1,
+ "hole": 4,
+ "breath": "draw",
+ "bend": 0,
+ "overblow": false
+ }
+ ]
+ },
+ {
+ "notes": [
+ {
+ "degree": 1,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 3,
+ "hole": 4,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ }
+ ],
+ "sectionEnd": true
+ }
+ ]
+ ]
+}
diff --git a/src/data/scores/clap-hands.json b/src/data/scores/clap-hands.json
new file mode 100644
index 0000000..af1ccf4
--- /dev/null
+++ b/src/data/scores/clap-hands.json
@@ -0,0 +1,346 @@
+{
+ "id": "clap-hands",
+ "title": "大家一起拍拍手",
+ "subtitle": "We'll All Clap Hands Together · 1927 歌集版",
+ "composer": "传统儿童动作歌(所选歌集署名)",
+ "key": "C",
+ "harmonicaKey": "C",
+ "position": "第一把位",
+ "timeSignature": "4/4",
+ "tempo": 96,
+ "difficulty": 1,
+ "tags": [
+ "入门",
+ "儿歌"
+ ],
+ "source": "The Everyday Song Book (1927), No.7;John Chambers ABC 转录 (2015)",
+ "sourceUrl": "https://trillian.mit.edu/~jc/music/book/EverydaySongBook/007_Well_all_Clap_Hands_Together.abc",
+ "sourceFormat": "music-text",
+ "sourceCheckedAt": "2026-10-23",
+ "builtin": true,
+ "order": 53,
+ "notes": "原 G4 主音移为 C5;9个书写小节含一拍弱起,三拍尾节互补。第一段三拍结束与第二段一拍起拍合为同一完整小节;保留末句两个八分音。 不收录歌词、伴奏和异音连奏线,速度为编辑练习建议。",
+ "lines": [
+ [
+ {
+ "notes": [
+ {
+ "degree": 5,
+ "accidental": 0,
+ "octave": 0,
+ "beats": 1,
+ "hole": 3,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ }
+ ]
+ },
+ {
+ "notes": [
+ {
+ "degree": 1,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 1,
+ "hole": 4,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 1,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 1,
+ "hole": 4,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 1,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 1,
+ "hole": 4,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 1,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 1,
+ "hole": 4,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ }
+ ]
+ },
+ {
+ "notes": [
+ {
+ "degree": 1,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 2,
+ "hole": 4,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 5,
+ "accidental": 0,
+ "octave": 0,
+ "beats": 1,
+ "hole": 3,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 5,
+ "accidental": 0,
+ "octave": 0,
+ "beats": 1,
+ "hole": 3,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ }
+ ]
+ },
+ {
+ "notes": [
+ {
+ "degree": 3,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 1,
+ "hole": 5,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 3,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 1,
+ "hole": 5,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 3,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 1,
+ "hole": 5,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 3,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 1,
+ "hole": 5,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ }
+ ]
+ },
+ {
+ "notes": [
+ {
+ "degree": 3,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 2,
+ "hole": 5,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 1,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 1,
+ "hole": 4,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 3,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 1,
+ "hole": 5,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ }
+ ]
+ }
+ ],
+ [
+ {
+ "notes": [
+ {
+ "degree": 5,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 1,
+ "hole": 6,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 5,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 1,
+ "hole": 6,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 5,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 1,
+ "hole": 6,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 5,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 1,
+ "hole": 6,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ }
+ ]
+ },
+ {
+ "notes": [
+ {
+ "degree": 5,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 2,
+ "hole": 6,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 3,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 1,
+ "hole": 5,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 3,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 1,
+ "hole": 5,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ }
+ ]
+ },
+ {
+ "notes": [
+ {
+ "degree": 2,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 1,
+ "hole": 4,
+ "breath": "draw",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 2,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 1,
+ "hole": 4,
+ "breath": "draw",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 2,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 1,
+ "hole": 4,
+ "breath": "draw",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 3,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.5,
+ "hole": 5,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 2,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.5,
+ "hole": 4,
+ "breath": "draw",
+ "bend": 0,
+ "overblow": false
+ }
+ ]
+ },
+ {
+ "notes": [
+ {
+ "degree": 1,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 3,
+ "hole": 4,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ }
+ ],
+ "sectionEnd": true
+ }
+ ]
+ ]
+}
diff --git a/src/data/scores/click-go-the-shears.json b/src/data/scores/click-go-the-shears.json
new file mode 100644
index 0000000..8aa6452
--- /dev/null
+++ b/src/data/scores/click-go-the-shears.json
@@ -0,0 +1,588 @@
+{
+ "id": "click-go-the-shears",
+ "title": "剪羊毛",
+ "subtitle": "Click Go the Shears · 教材旋律版",
+ "composer": "澳大利亚传统歌曲",
+ "key": "C",
+ "harmonicaKey": "C",
+ "position": "第一把位",
+ "timeSignature": "2/4",
+ "tempo": 92,
+ "difficulty": 2,
+ "tags": [
+ "大洋洲民歌",
+ "附点",
+ "自然音"
+ ],
+ "source": "人民教育出版社《音乐七年级下册·简谱》印刷第 46 页(PDF 第 51 页);16 小节单旋律。保留 1=C,整体升八度适配口琴。",
+ "sourceUrl": "https://dev98.oa.henanyuexue.com/static/szjc-resources/pdf/q/f/2/7.pdf#page=51",
+ "sourceFormat": "jianpu-image",
+ "sourceCheckedAt": "2026-10-22",
+ "builtin": true,
+ "order": 24,
+ "notes": "按教材所列旋律保留附点八分与十六分节奏,以及第 4、8、12、16 小节的四分休止。末句从中音 do 跳至高音 do;省略歌词与异音连奏线。速度为练习建议。",
+ "lines": [
+ [
+ {
+ "notes": [
+ {
+ "degree": 3,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 1,
+ "hole": 5,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 3,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.5,
+ "dotted": true,
+ "hole": 5,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 2,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.25,
+ "hole": 4,
+ "breath": "draw",
+ "bend": 0,
+ "overblow": false
+ }
+ ]
+ },
+ {
+ "notes": [
+ {
+ "degree": 1,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.5,
+ "hole": 4,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 1,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.5,
+ "hole": 4,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 3,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.5,
+ "hole": 5,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 5,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.5,
+ "hole": 6,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ }
+ ]
+ },
+ {
+ "notes": [
+ {
+ "degree": 1,
+ "accidental": 0,
+ "octave": 2,
+ "beats": 1,
+ "hole": 7,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 1,
+ "accidental": 0,
+ "octave": 2,
+ "beats": 0.5,
+ "dotted": true,
+ "hole": 7,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 7,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.25,
+ "hole": 7,
+ "breath": "draw",
+ "bend": 0,
+ "overblow": false
+ }
+ ]
+ },
+ {
+ "notes": [
+ {
+ "degree": 6,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 1,
+ "hole": 6,
+ "breath": "draw",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 0,
+ "accidental": 0,
+ "octave": 0,
+ "beats": 1,
+ "hole": null,
+ "breath": null,
+ "bend": 0,
+ "overblow": false
+ }
+ ]
+ }
+ ],
+ [
+ {
+ "notes": [
+ {
+ "degree": 5,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 1,
+ "hole": 6,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 5,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.5,
+ "dotted": true,
+ "hole": 6,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 6,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.25,
+ "hole": 6,
+ "breath": "draw",
+ "bend": 0,
+ "overblow": false
+ }
+ ]
+ },
+ {
+ "notes": [
+ {
+ "degree": 5,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 1,
+ "hole": 6,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 3,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.5,
+ "dotted": true,
+ "hole": 5,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 1,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.25,
+ "hole": 4,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ }
+ ]
+ },
+ {
+ "notes": [
+ {
+ "degree": 2,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 1,
+ "hole": 4,
+ "breath": "draw",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 2,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.5,
+ "dotted": true,
+ "hole": 4,
+ "breath": "draw",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 3,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.25,
+ "hole": 5,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ }
+ ]
+ },
+ {
+ "notes": [
+ {
+ "degree": 2,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 1,
+ "hole": 4,
+ "breath": "draw",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 0,
+ "accidental": 0,
+ "octave": 0,
+ "beats": 1,
+ "hole": null,
+ "breath": null,
+ "bend": 0,
+ "overblow": false
+ }
+ ]
+ }
+ ],
+ [
+ {
+ "notes": [
+ {
+ "degree": 3,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 1,
+ "hole": 5,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 3,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.5,
+ "dotted": true,
+ "hole": 5,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 2,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.25,
+ "hole": 4,
+ "breath": "draw",
+ "bend": 0,
+ "overblow": false
+ }
+ ]
+ },
+ {
+ "notes": [
+ {
+ "degree": 1,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.5,
+ "hole": 4,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 1,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.5,
+ "hole": 4,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 3,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.5,
+ "hole": 5,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 5,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.5,
+ "hole": 6,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ }
+ ]
+ },
+ {
+ "notes": [
+ {
+ "degree": 1,
+ "accidental": 0,
+ "octave": 2,
+ "beats": 1,
+ "hole": 7,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 1,
+ "accidental": 0,
+ "octave": 2,
+ "beats": 0.5,
+ "dotted": true,
+ "hole": 7,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 7,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.25,
+ "hole": 7,
+ "breath": "draw",
+ "bend": 0,
+ "overblow": false
+ }
+ ]
+ },
+ {
+ "notes": [
+ {
+ "degree": 6,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 1,
+ "hole": 6,
+ "breath": "draw",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 0,
+ "accidental": 0,
+ "octave": 0,
+ "beats": 1,
+ "hole": null,
+ "breath": null,
+ "bend": 0,
+ "overblow": false
+ }
+ ]
+ }
+ ],
+ [
+ {
+ "notes": [
+ {
+ "degree": 2,
+ "accidental": 0,
+ "octave": 2,
+ "beats": 0.5,
+ "dotted": true,
+ "hole": 8,
+ "breath": "draw",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 1,
+ "accidental": 0,
+ "octave": 2,
+ "beats": 0.25,
+ "hole": 7,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 7,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.5,
+ "hole": 7,
+ "breath": "draw",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 6,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.5,
+ "hole": 6,
+ "breath": "draw",
+ "bend": 0,
+ "overblow": false
+ }
+ ]
+ },
+ {
+ "notes": [
+ {
+ "degree": 5,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.5,
+ "hole": 6,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 4,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.5,
+ "hole": 5,
+ "breath": "draw",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 3,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.5,
+ "hole": 5,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 2,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.5,
+ "hole": 4,
+ "breath": "draw",
+ "bend": 0,
+ "overblow": false
+ }
+ ]
+ },
+ {
+ "notes": [
+ {
+ "degree": 1,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 1,
+ "hole": 4,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 1,
+ "accidental": 0,
+ "octave": 2,
+ "beats": 0.5,
+ "dotted": true,
+ "hole": 7,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 7,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.25,
+ "hole": 7,
+ "breath": "draw",
+ "bend": 0,
+ "overblow": false
+ }
+ ]
+ },
+ {
+ "notes": [
+ {
+ "degree": 1,
+ "accidental": 0,
+ "octave": 2,
+ "beats": 1,
+ "hole": 7,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 0,
+ "accidental": 0,
+ "octave": 0,
+ "beats": 1,
+ "hole": null,
+ "breath": null,
+ "bend": 0,
+ "overblow": false
+ }
+ ],
+ "sectionEnd": true
+ }
+ ]
+ ]
+}
diff --git a/src/data/scores/cross-harp-call-response.json b/src/data/scores/cross-harp-call-response.json
new file mode 100644
index 0000000..9eb47a6
--- /dev/null
+++ b/src/data/scores/cross-harp-call-response.json
@@ -0,0 +1,769 @@
+{
+ "id": "cross-harp-call-response",
+ "title": "二把位呼应练习",
+ "subtitle": "Cross-Harp Call and Response",
+ "composer": "HarpScore 原创练习曲",
+ "key": "G",
+ "harmonicaKey": "C",
+ "position": "第二把位",
+ "timeSignature": "4/4",
+ "tempo": 80,
+ "difficulty": 2,
+ "tags": [
+ "布鲁斯",
+ "原创练习",
+ "呼应",
+ "自然音"
+ ],
+ "source": "HarpScore 原创:四组各四小节的呼应练习,可自由使用。",
+ "sourceFormat": "original",
+ "sourceCheckedAt": "2026-10-22",
+ "builtin": true,
+ "order": 27,
+ "notes": "C 调口琴奏 G 调,使用 G、B、C、D、F、G 高音的自然音;每组前两小节提出短句,后两小节回应,保留休止以练习呼吸。八分音符按等长演奏,不作三连音或 shuffle 标注;只写单音旋律,无伴奏。G4 按自动指法显示 3 孔吹,也可用同音高的 2 孔吸。",
+ "lines": [
+ [
+ {
+ "notes": [
+ {
+ "degree": 1,
+ "accidental": 0,
+ "octave": 0,
+ "beats": 1,
+ "hole": 3,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 3,
+ "accidental": 0,
+ "octave": 0,
+ "beats": 0.5,
+ "hole": 3,
+ "breath": "draw",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 5,
+ "accidental": 0,
+ "octave": 0,
+ "beats": 0.5,
+ "hole": 4,
+ "breath": "draw",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 0,
+ "accidental": 0,
+ "octave": 0,
+ "beats": 1,
+ "hole": null,
+ "breath": null,
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 5,
+ "accidental": 0,
+ "octave": 0,
+ "beats": 1,
+ "hole": 4,
+ "breath": "draw",
+ "bend": 0,
+ "overblow": false
+ }
+ ]
+ },
+ {
+ "notes": [
+ {
+ "degree": 7,
+ "accidental": -1,
+ "octave": 0,
+ "beats": 1,
+ "hole": 5,
+ "breath": "draw",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 5,
+ "accidental": 0,
+ "octave": 0,
+ "beats": 1,
+ "hole": 4,
+ "breath": "draw",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 3,
+ "accidental": 0,
+ "octave": 0,
+ "beats": 1,
+ "hole": 3,
+ "breath": "draw",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 0,
+ "accidental": 0,
+ "octave": 0,
+ "beats": 1,
+ "hole": null,
+ "breath": null,
+ "bend": 0,
+ "overblow": false
+ }
+ ]
+ },
+ {
+ "notes": [
+ {
+ "degree": 1,
+ "accidental": 0,
+ "octave": 0,
+ "beats": 1,
+ "hole": 3,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 3,
+ "accidental": 0,
+ "octave": 0,
+ "beats": 0.5,
+ "hole": 3,
+ "breath": "draw",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 5,
+ "accidental": 0,
+ "octave": 0,
+ "beats": 0.5,
+ "hole": 4,
+ "breath": "draw",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 0,
+ "accidental": 0,
+ "octave": 0,
+ "beats": 1,
+ "hole": null,
+ "breath": null,
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 3,
+ "accidental": 0,
+ "octave": 0,
+ "beats": 1,
+ "hole": 3,
+ "breath": "draw",
+ "bend": 0,
+ "overblow": false
+ }
+ ]
+ },
+ {
+ "notes": [
+ {
+ "degree": 1,
+ "accidental": 0,
+ "octave": 0,
+ "beats": 2,
+ "hole": 3,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 0,
+ "accidental": 0,
+ "octave": 0,
+ "beats": 2,
+ "hole": null,
+ "breath": null,
+ "bend": 0,
+ "overblow": false
+ }
+ ]
+ }
+ ],
+ [
+ {
+ "notes": [
+ {
+ "degree": 4,
+ "accidental": 0,
+ "octave": 0,
+ "beats": 1,
+ "hole": 4,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 5,
+ "accidental": 0,
+ "octave": 0,
+ "beats": 0.5,
+ "hole": 4,
+ "breath": "draw",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 7,
+ "accidental": -1,
+ "octave": 0,
+ "beats": 0.5,
+ "hole": 5,
+ "breath": "draw",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 0,
+ "accidental": 0,
+ "octave": 0,
+ "beats": 1,
+ "hole": null,
+ "breath": null,
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 7,
+ "accidental": -1,
+ "octave": 0,
+ "beats": 1,
+ "hole": 5,
+ "breath": "draw",
+ "bend": 0,
+ "overblow": false
+ }
+ ]
+ },
+ {
+ "notes": [
+ {
+ "degree": 1,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 1,
+ "hole": 6,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 7,
+ "accidental": -1,
+ "octave": 0,
+ "beats": 1,
+ "hole": 5,
+ "breath": "draw",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 5,
+ "accidental": 0,
+ "octave": 0,
+ "beats": 1,
+ "hole": 4,
+ "breath": "draw",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 0,
+ "accidental": 0,
+ "octave": 0,
+ "beats": 1,
+ "hole": null,
+ "breath": null,
+ "bend": 0,
+ "overblow": false
+ }
+ ]
+ },
+ {
+ "notes": [
+ {
+ "degree": 4,
+ "accidental": 0,
+ "octave": 0,
+ "beats": 1,
+ "hole": 4,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 5,
+ "accidental": 0,
+ "octave": 0,
+ "beats": 0.5,
+ "hole": 4,
+ "breath": "draw",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 7,
+ "accidental": -1,
+ "octave": 0,
+ "beats": 0.5,
+ "hole": 5,
+ "breath": "draw",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 0,
+ "accidental": 0,
+ "octave": 0,
+ "beats": 1,
+ "hole": null,
+ "breath": null,
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 5,
+ "accidental": 0,
+ "octave": 0,
+ "beats": 1,
+ "hole": 4,
+ "breath": "draw",
+ "bend": 0,
+ "overblow": false
+ }
+ ]
+ },
+ {
+ "notes": [
+ {
+ "degree": 4,
+ "accidental": 0,
+ "octave": 0,
+ "beats": 2,
+ "hole": 4,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 0,
+ "accidental": 0,
+ "octave": 0,
+ "beats": 2,
+ "hole": null,
+ "breath": null,
+ "bend": 0,
+ "overblow": false
+ }
+ ]
+ }
+ ],
+ [
+ {
+ "notes": [
+ {
+ "degree": 5,
+ "accidental": 0,
+ "octave": 0,
+ "beats": 0.5,
+ "hole": 4,
+ "breath": "draw",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 5,
+ "accidental": 0,
+ "octave": 0,
+ "beats": 0.5,
+ "hole": 4,
+ "breath": "draw",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 7,
+ "accidental": -1,
+ "octave": 0,
+ "beats": 1,
+ "hole": 5,
+ "breath": "draw",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 5,
+ "accidental": 0,
+ "octave": 0,
+ "beats": 1,
+ "hole": 4,
+ "breath": "draw",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 0,
+ "accidental": 0,
+ "octave": 0,
+ "beats": 1,
+ "hole": null,
+ "breath": null,
+ "bend": 0,
+ "overblow": false
+ }
+ ]
+ },
+ {
+ "notes": [
+ {
+ "degree": 3,
+ "accidental": 0,
+ "octave": 0,
+ "beats": 0.5,
+ "hole": 3,
+ "breath": "draw",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 4,
+ "accidental": 0,
+ "octave": 0,
+ "beats": 0.5,
+ "hole": 4,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 5,
+ "accidental": 0,
+ "octave": 0,
+ "beats": 1,
+ "hole": 4,
+ "breath": "draw",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 3,
+ "accidental": 0,
+ "octave": 0,
+ "beats": 1,
+ "hole": 3,
+ "breath": "draw",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 0,
+ "accidental": 0,
+ "octave": 0,
+ "beats": 1,
+ "hole": null,
+ "breath": null,
+ "bend": 0,
+ "overblow": false
+ }
+ ]
+ },
+ {
+ "notes": [
+ {
+ "degree": 5,
+ "accidental": 0,
+ "octave": 0,
+ "beats": 0.5,
+ "hole": 4,
+ "breath": "draw",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 7,
+ "accidental": -1,
+ "octave": 0,
+ "beats": 0.5,
+ "hole": 5,
+ "breath": "draw",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 1,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 1,
+ "hole": 6,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 7,
+ "accidental": -1,
+ "octave": 0,
+ "beats": 1,
+ "hole": 5,
+ "breath": "draw",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 5,
+ "accidental": 0,
+ "octave": 0,
+ "beats": 1,
+ "hole": 4,
+ "breath": "draw",
+ "bend": 0,
+ "overblow": false
+ }
+ ]
+ },
+ {
+ "notes": [
+ {
+ "degree": 1,
+ "accidental": 0,
+ "octave": 0,
+ "beats": 2,
+ "hole": 3,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 0,
+ "accidental": 0,
+ "octave": 0,
+ "beats": 2,
+ "hole": null,
+ "breath": null,
+ "bend": 0,
+ "overblow": false
+ }
+ ]
+ }
+ ],
+ [
+ {
+ "notes": [
+ {
+ "degree": 1,
+ "accidental": 0,
+ "octave": 0,
+ "beats": 1,
+ "hole": 3,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 3,
+ "accidental": 0,
+ "octave": 0,
+ "beats": 0.5,
+ "hole": 3,
+ "breath": "draw",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 5,
+ "accidental": 0,
+ "octave": 0,
+ "beats": 0.5,
+ "hole": 4,
+ "breath": "draw",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 7,
+ "accidental": -1,
+ "octave": 0,
+ "beats": 1,
+ "hole": 5,
+ "breath": "draw",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 0,
+ "accidental": 0,
+ "octave": 0,
+ "beats": 1,
+ "hole": null,
+ "breath": null,
+ "bend": 0,
+ "overblow": false
+ }
+ ]
+ },
+ {
+ "notes": [
+ {
+ "degree": 4,
+ "accidental": 0,
+ "octave": 0,
+ "beats": 1,
+ "hole": 4,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 5,
+ "accidental": 0,
+ "octave": 0,
+ "beats": 0.5,
+ "hole": 4,
+ "breath": "draw",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 7,
+ "accidental": -1,
+ "octave": 0,
+ "beats": 0.5,
+ "hole": 5,
+ "breath": "draw",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 1,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 1,
+ "hole": 6,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 0,
+ "accidental": 0,
+ "octave": 0,
+ "beats": 1,
+ "hole": null,
+ "breath": null,
+ "bend": 0,
+ "overblow": false
+ }
+ ]
+ },
+ {
+ "notes": [
+ {
+ "degree": 7,
+ "accidental": -1,
+ "octave": 0,
+ "beats": 0.5,
+ "hole": 5,
+ "breath": "draw",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 5,
+ "accidental": 0,
+ "octave": 0,
+ "beats": 0.5,
+ "hole": 4,
+ "breath": "draw",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 4,
+ "accidental": 0,
+ "octave": 0,
+ "beats": 0.5,
+ "hole": 4,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 3,
+ "accidental": 0,
+ "octave": 0,
+ "beats": 0.5,
+ "hole": 3,
+ "breath": "draw",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 1,
+ "accidental": 0,
+ "octave": 0,
+ "beats": 1,
+ "hole": 3,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 0,
+ "accidental": 0,
+ "octave": 0,
+ "beats": 1,
+ "hole": null,
+ "breath": null,
+ "bend": 0,
+ "overblow": false
+ }
+ ]
+ },
+ {
+ "notes": [
+ {
+ "degree": 1,
+ "accidental": 0,
+ "octave": 0,
+ "beats": 3,
+ "hole": 3,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 0,
+ "accidental": 0,
+ "octave": 0,
+ "beats": 1,
+ "hole": null,
+ "breath": null,
+ "bend": 0,
+ "overblow": false
+ }
+ ],
+ "sectionEnd": true
+ }
+ ]
+ ]
+}
diff --git a/src/data/scores/cuckoo-song.json b/src/data/scores/cuckoo-song.json
new file mode 100644
index 0000000..80f2577
--- /dev/null
+++ b/src/data/scores/cuckoo-song.json
@@ -0,0 +1,382 @@
+{
+ "id": "cuckoo-song",
+ "title": "布谷鸟",
+ "subtitle": "Cuckoo, You Sing So Clear · 1927歌集版",
+ "composer": "德国传统曲调",
+ "key": "C",
+ "harmonicaKey": "C",
+ "position": "第一把位",
+ "timeSignature": "3/4",
+ "tempo": 108,
+ "difficulty": 1,
+ "tags": [
+ "西方歌曲",
+ "入门",
+ "自然音",
+ "三拍子"
+ ],
+ "source": "The Everyday Song Book(1927)第117首,John Chambers于2017年转录的ABC;完整12小节旋律,原Bb调移为C调(Bb4→C5)。",
+ "sourceUrl": "https://trillian.mit.edu/~jc/music/book/EverydaySongBook/117_Cuckoo_You_Sing_So_Clear.abc",
+ "sourceFormat": "music-text",
+ "sourceCheckedAt": "2026-10-22",
+ "builtin": true,
+ "order": 31,
+ "notes": "开头两次sol–mi模仿布谷声,第三拍休止不要省略;第4、12小节末同样有四分休止。中段的二分长音与三拍律动保留。仅录入所选歌集的旋律,省略歌词与mf力度,数值速度为练习建议。",
+ "lines": [
+ [
+ {
+ "notes": [
+ {
+ "degree": 5,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 1,
+ "hole": 6,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 3,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 1,
+ "hole": 5,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 0,
+ "accidental": 0,
+ "octave": 0,
+ "beats": 1,
+ "hole": null,
+ "breath": null,
+ "bend": 0,
+ "overblow": false
+ }
+ ]
+ },
+ {
+ "notes": [
+ {
+ "degree": 5,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 1,
+ "hole": 6,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 3,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 1,
+ "hole": 5,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 0,
+ "accidental": 0,
+ "octave": 0,
+ "beats": 1,
+ "hole": null,
+ "breath": null,
+ "bend": 0,
+ "overblow": false
+ }
+ ]
+ },
+ {
+ "notes": [
+ {
+ "degree": 2,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 1,
+ "hole": 4,
+ "breath": "draw",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 1,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 1,
+ "hole": 4,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 2,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 1,
+ "hole": 4,
+ "breath": "draw",
+ "bend": 0,
+ "overblow": false
+ }
+ ]
+ },
+ {
+ "notes": [
+ {
+ "degree": 1,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 2,
+ "hole": 4,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 0,
+ "accidental": 0,
+ "octave": 0,
+ "beats": 1,
+ "hole": null,
+ "breath": null,
+ "bend": 0,
+ "overblow": false
+ }
+ ]
+ }
+ ],
+ [
+ {
+ "notes": [
+ {
+ "degree": 2,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 1,
+ "hole": 4,
+ "breath": "draw",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 2,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 1,
+ "hole": 4,
+ "breath": "draw",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 3,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 1,
+ "hole": 5,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ }
+ ]
+ },
+ {
+ "notes": [
+ {
+ "degree": 4,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 2,
+ "hole": 5,
+ "breath": "draw",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 2,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 1,
+ "hole": 4,
+ "breath": "draw",
+ "bend": 0,
+ "overblow": false
+ }
+ ]
+ },
+ {
+ "notes": [
+ {
+ "degree": 3,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 1,
+ "hole": 5,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 3,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 1,
+ "hole": 5,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 4,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 1,
+ "hole": 5,
+ "breath": "draw",
+ "bend": 0,
+ "overblow": false
+ }
+ ]
+ },
+ {
+ "notes": [
+ {
+ "degree": 5,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 2,
+ "hole": 6,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 3,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 1,
+ "hole": 5,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ }
+ ]
+ }
+ ],
+ [
+ {
+ "notes": [
+ {
+ "degree": 5,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 2,
+ "hole": 6,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 3,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 1,
+ "hole": 5,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ }
+ ]
+ },
+ {
+ "notes": [
+ {
+ "degree": 5,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 2,
+ "hole": 6,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 3,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 1,
+ "hole": 5,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ }
+ ]
+ },
+ {
+ "notes": [
+ {
+ "degree": 4,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 1,
+ "hole": 5,
+ "breath": "draw",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 3,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 1,
+ "hole": 5,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 2,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 1,
+ "hole": 4,
+ "breath": "draw",
+ "bend": 0,
+ "overblow": false
+ }
+ ]
+ },
+ {
+ "notes": [
+ {
+ "degree": 1,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 2,
+ "hole": 4,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 0,
+ "accidental": 0,
+ "octave": 0,
+ "beats": 1,
+ "hole": null,
+ "breath": null,
+ "bend": 0,
+ "overblow": false
+ }
+ ],
+ "sectionEnd": true
+ }
+ ]
+ ]
+}
diff --git a/src/data/scores/did-you-ever-see-a-lassie.json b/src/data/scores/did-you-ever-see-a-lassie.json
new file mode 100644
index 0000000..c889d0b
--- /dev/null
+++ b/src/data/scores/did-you-ever-see-a-lassie.json
@@ -0,0 +1,637 @@
+{
+ "id": "did-you-ever-see-a-lassie",
+ "title": "你可曾见过小姑娘",
+ "subtitle": "Did You Ever See a Lassie? · 1927歌集版",
+ "composer": "传统曲调",
+ "key": "C",
+ "harmonicaKey": "C",
+ "position": "第一把位",
+ "timeSignature": "3/4",
+ "tempo": 96,
+ "difficulty": 1,
+ "tags": [
+ "西方歌曲",
+ "入门",
+ "自然音",
+ "弱起"
+ ],
+ "source": "The Everyday Song Book(1927)第10首,John Chambers于2015年转录的ABC;完整16小节加一拍弱起,G4主音移至C5。",
+ "sourceUrl": "https://trillian.mit.edu/~jc/music/book/EverydaySongBook/010_Did_You_Ever_See_a_Lassie.abc",
+ "sourceFormat": "music-text",
+ "sourceCheckedAt": "2026-10-22",
+ "builtin": true,
+ "order": 35,
+ "notes": "首尾一拍加两拍互补,保留中间的四分休止;所选版本含重复的动作问答段落。全自然音,音域G4–A5。省略歌词,速度为练习建议。",
+ "lines": [
+ [
+ {
+ "notes": [
+ {
+ "degree": 1,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.5,
+ "hole": 4,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 3,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.5,
+ "hole": 5,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ }
+ ]
+ },
+ {
+ "notes": [
+ {
+ "degree": 5,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 1,
+ "dotted": true,
+ "hole": 6,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 6,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.5,
+ "hole": 6,
+ "breath": "draw",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 5,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.5,
+ "hole": 6,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 4,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.5,
+ "hole": 5,
+ "breath": "draw",
+ "bend": 0,
+ "overblow": false
+ }
+ ]
+ },
+ {
+ "notes": [
+ {
+ "degree": 3,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 1,
+ "hole": 5,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 1,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 1,
+ "hole": 4,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 1,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 1,
+ "hole": 4,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ }
+ ]
+ },
+ {
+ "notes": [
+ {
+ "degree": 2,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 1,
+ "hole": 4,
+ "breath": "draw",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 5,
+ "accidental": 0,
+ "octave": 0,
+ "beats": 1,
+ "hole": 3,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 5,
+ "accidental": 0,
+ "octave": 0,
+ "beats": 1,
+ "hole": 3,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ }
+ ]
+ },
+ {
+ "notes": [
+ {
+ "degree": 3,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 1,
+ "hole": 5,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 1,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 1,
+ "hole": 4,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 1,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.5,
+ "hole": 4,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 3,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.5,
+ "hole": 5,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ }
+ ]
+ }
+ ],
+ [
+ {
+ "notes": [
+ {
+ "degree": 5,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 1,
+ "dotted": true,
+ "hole": 6,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 6,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.5,
+ "hole": 6,
+ "breath": "draw",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 5,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.5,
+ "hole": 6,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 4,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.5,
+ "hole": 5,
+ "breath": "draw",
+ "bend": 0,
+ "overblow": false
+ }
+ ]
+ },
+ {
+ "notes": [
+ {
+ "degree": 3,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 1,
+ "hole": 5,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 1,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 1,
+ "hole": 4,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 1,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 1,
+ "hole": 4,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ }
+ ]
+ },
+ {
+ "notes": [
+ {
+ "degree": 2,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 1,
+ "hole": 4,
+ "breath": "draw",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 5,
+ "accidental": 0,
+ "octave": 0,
+ "beats": 1,
+ "hole": 3,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 5,
+ "accidental": 0,
+ "octave": 0,
+ "beats": 1,
+ "hole": 3,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ }
+ ]
+ },
+ {
+ "notes": [
+ {
+ "degree": 1,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 1,
+ "hole": 4,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 0,
+ "accidental": 0,
+ "octave": 0,
+ "beats": 1,
+ "hole": null,
+ "breath": null,
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 1,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 1,
+ "hole": 4,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ }
+ ]
+ }
+ ],
+ [
+ {
+ "notes": [
+ {
+ "degree": 2,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 1,
+ "hole": 4,
+ "breath": "draw",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 5,
+ "accidental": 0,
+ "octave": 0,
+ "beats": 1,
+ "hole": 3,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 5,
+ "accidental": 0,
+ "octave": 0,
+ "beats": 1,
+ "hole": 3,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ }
+ ]
+ },
+ {
+ "notes": [
+ {
+ "degree": 3,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 1,
+ "hole": 5,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 1,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 1,
+ "hole": 4,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 1,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 1,
+ "hole": 4,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ }
+ ]
+ },
+ {
+ "notes": [
+ {
+ "degree": 2,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 1,
+ "hole": 4,
+ "breath": "draw",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 5,
+ "accidental": 0,
+ "octave": 0,
+ "beats": 1,
+ "hole": 3,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 5,
+ "accidental": 0,
+ "octave": 0,
+ "beats": 1,
+ "hole": 3,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ }
+ ]
+ },
+ {
+ "notes": [
+ {
+ "degree": 3,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 1,
+ "hole": 5,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 1,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 1,
+ "hole": 4,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 1,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.5,
+ "hole": 4,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 3,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.5,
+ "hole": 5,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ }
+ ]
+ }
+ ],
+ [
+ {
+ "notes": [
+ {
+ "degree": 5,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 1,
+ "dotted": true,
+ "hole": 6,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 6,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.5,
+ "hole": 6,
+ "breath": "draw",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 5,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.5,
+ "hole": 6,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 4,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.5,
+ "hole": 5,
+ "breath": "draw",
+ "bend": 0,
+ "overblow": false
+ }
+ ]
+ },
+ {
+ "notes": [
+ {
+ "degree": 3,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 1,
+ "hole": 5,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 1,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 1,
+ "hole": 4,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 1,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 1,
+ "hole": 4,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ }
+ ]
+ },
+ {
+ "notes": [
+ {
+ "degree": 2,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 1,
+ "hole": 4,
+ "breath": "draw",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 5,
+ "accidental": 0,
+ "octave": 0,
+ "beats": 1,
+ "hole": 3,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 5,
+ "accidental": 0,
+ "octave": 0,
+ "beats": 1,
+ "hole": 3,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ }
+ ]
+ },
+ {
+ "notes": [
+ {
+ "degree": 1,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 2,
+ "hole": 4,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ }
+ ],
+ "sectionEnd": true
+ }
+ ]
+ ]
+}
diff --git a/src/data/scores/ding-dong-bell.json b/src/data/scores/ding-dong-bell.json
new file mode 100644
index 0000000..ecdc960
--- /dev/null
+++ b/src/data/scores/ding-dong-bell.json
@@ -0,0 +1,472 @@
+{
+ "id": "ding-dong-bell",
+ "title": "叮咚铃声",
+ "subtitle": "Ding, Dong, Bell · 1927 歌集版",
+ "composer": "鹅妈妈童谣(所选歌集署名)",
+ "key": "C",
+ "harmonicaKey": "C",
+ "position": "第一把位",
+ "timeSignature": "4/4",
+ "tempo": 96,
+ "difficulty": 2,
+ "tags": [
+ "入门",
+ "儿歌",
+ "压音"
+ ],
+ "source": "The Everyday Song Book (1927), No.32;John Chambers ABC 转录 (2017)",
+ "sourceUrl": "https://trillian.mit.edu/~jc/music/book/EverydaySongBook/032_Ding_Dong_Bell.abc",
+ "sourceFormat": "music-text",
+ "sourceCheckedAt": "2026-10-23",
+ "builtin": true,
+ "order": 54,
+ "notes": "原 F4 主音移为 C5,完整10小节及首尾反复记号保留。第6小节低 sol–la–si 句中的低 la 需要3孔吸气全音压音,因此不能按曲名将其标为无需压音。 不收录歌词、伴奏和异音连奏线,速度为编辑练习建议。",
+ "lines": [
+ [
+ {
+ "notes": [
+ {
+ "degree": 1,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 1,
+ "hole": 4,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 3,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 1,
+ "hole": 5,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 5,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 2,
+ "hole": 6,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ }
+ ],
+ "repeatBegin": true
+ },
+ {
+ "notes": [
+ {
+ "degree": 5,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.5,
+ "hole": 6,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 4,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.5,
+ "hole": 5,
+ "breath": "draw",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 3,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.5,
+ "hole": 5,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 2,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.5,
+ "hole": 4,
+ "breath": "draw",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 1,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 2,
+ "hole": 4,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ }
+ ]
+ },
+ {
+ "notes": [
+ {
+ "degree": 1,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 1,
+ "hole": 4,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 3,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.5,
+ "hole": 5,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 3,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.5,
+ "hole": 5,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 5,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 2,
+ "hole": 6,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ }
+ ]
+ },
+ {
+ "notes": [
+ {
+ "degree": 5,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.5,
+ "hole": 6,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 4,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.5,
+ "hole": 5,
+ "breath": "draw",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 3,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.5,
+ "hole": 5,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 2,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.5,
+ "hole": 4,
+ "breath": "draw",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 1,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 2,
+ "hole": 4,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ }
+ ]
+ },
+ {
+ "notes": [
+ {
+ "degree": 6,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 1,
+ "hole": 6,
+ "breath": "draw",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 5,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.5,
+ "hole": 6,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 4,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.5,
+ "hole": 5,
+ "breath": "draw",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 3,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 2,
+ "hole": 5,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ }
+ ]
+ }
+ ],
+ [
+ {
+ "notes": [
+ {
+ "degree": 5,
+ "accidental": 0,
+ "octave": 0,
+ "beats": 1,
+ "hole": 3,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 6,
+ "accidental": 0,
+ "octave": 0,
+ "beats": 0.5,
+ "hole": 3,
+ "breath": "draw",
+ "bend": 2,
+ "overblow": false
+ },
+ {
+ "degree": 7,
+ "accidental": 0,
+ "octave": 0,
+ "beats": 0.5,
+ "hole": 3,
+ "breath": "draw",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 1,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 2,
+ "hole": 4,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ }
+ ]
+ },
+ {
+ "notes": [
+ {
+ "degree": 6,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 1,
+ "hole": 6,
+ "breath": "draw",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 6,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 1,
+ "hole": 6,
+ "breath": "draw",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 5,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 1,
+ "hole": 6,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 5,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 1,
+ "hole": 6,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ }
+ ]
+ },
+ {
+ "notes": [
+ {
+ "degree": 4,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 1,
+ "hole": 5,
+ "breath": "draw",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 4,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 1,
+ "hole": 5,
+ "breath": "draw",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 3,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 1,
+ "hole": 5,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 3,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 1,
+ "hole": 5,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ }
+ ]
+ },
+ {
+ "notes": [
+ {
+ "degree": 4,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 1,
+ "hole": 5,
+ "breath": "draw",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 4,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 1,
+ "hole": 5,
+ "breath": "draw",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 3,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 1,
+ "hole": 5,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 3,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 1,
+ "hole": 5,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ }
+ ]
+ },
+ {
+ "notes": [
+ {
+ "degree": 2,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 1,
+ "hole": 4,
+ "breath": "draw",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 2,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 1,
+ "hole": 4,
+ "breath": "draw",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 1,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 2,
+ "hole": 4,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ }
+ ],
+ "repeatEnd": true
+ }
+ ]
+ ]
+}
diff --git a/src/data/scores/farewell.json b/src/data/scores/farewell.json
index e693911..3d24254 100644
--- a/src/data/scores/farewell.json
+++ b/src/data/scores/farewell.json
@@ -13,13 +13,13 @@
"民歌",
"经典"
],
- "source": "江阴市长泾实验小学音乐教材简谱《送别》(李叔同词、J. P. Ordway 曲);应用内由 1=E 移调为 1=C",
+ "source": "江阴市长泾实验小学所载《中国诗乐二十品》,印刷第 222 页 / PDF 第 238 页《送别》数字简谱",
"sourceUrl": "https://cxqx.jyc.edu.cn/__local/3/D5/71/B7A1BD225359A39D710C8C3021A_A9C90F62_167DC01.pdf",
"sourceFormat": "jianpu-image",
- "sourceCheckedAt": "2026-08-31",
+ "sourceCheckedAt": "2026-10-23",
"builtin": true,
"order": 3,
- "notes": "按教材 24 小节完整展开版逐音核对,并整体升八度适配 C 调十孔口琴;全部音符可自然吹奏。",
+ "notes": "重新逐行核对完整 24 小节,全部音高与时值保持不变。原谱 1=降E(修正旧元数据误写的 E),移为 1=C 并升八度;只读数字简谱,歌词、伴奏与异音连线不录入,速度为编辑建议。",
"lines": [
[
{
diff --git a/src/data/scores/fengyang-flower-drum.json b/src/data/scores/fengyang-flower-drum.json
new file mode 100644
index 0000000..c376f3c
--- /dev/null
+++ b/src/data/scores/fengyang-flower-drum.json
@@ -0,0 +1,945 @@
+{
+ "id": "fengyang-flower-drum",
+ "title": "凤阳花鼓",
+ "subtitle": "安徽民歌 · 人教版教材旋律",
+ "composer": "安徽传统民歌",
+ "key": "C",
+ "harmonicaKey": "C",
+ "position": "第一把位",
+ "timeSignature": "4/4",
+ "tempo": 104,
+ "difficulty": 3,
+ "tags": [
+ "中国民歌",
+ "五声音阶",
+ "压音"
+ ],
+ "source": "人民教育出版社《音乐七年级下册·简谱》印刷第 31 页(PDF 第 36 页),1=C、15 小节。与广东教育/花城三年级下册的低音 la 标记交叉比对;本谱整体升八度。",
+ "sourceUrl": "https://dev98.oa.henanyuexue.com/static/szjc-resources/pdf/q/f/2/7.pdf#page=36",
+ "sourceFormat": "jianpu-image",
+ "sourceCheckedAt": "2026-10-22",
+ "builtin": true,
+ "order": 23,
+ "notes": "保留所选教材 15 小节的音区、节奏与两处八分休止;省略歌词、连奏线。第 5、10–12、15 小节的 la 按原谱低音点处理,不按其他传唱版本改写;使用 3 孔吸气全音压音。速度为练习建议。",
+ "lines": [
+ [
+ {
+ "notes": [
+ {
+ "degree": 5,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.5,
+ "hole": 6,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 3,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.5,
+ "hole": 5,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 2,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.5,
+ "hole": 4,
+ "breath": "draw",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 3,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.5,
+ "hole": 5,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 5,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 2,
+ "hole": 6,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ }
+ ]
+ },
+ {
+ "notes": [
+ {
+ "degree": 3,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.5,
+ "hole": 5,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 5,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.5,
+ "hole": 6,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 6,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.5,
+ "hole": 6,
+ "breath": "draw",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 1,
+ "accidental": 0,
+ "octave": 2,
+ "beats": 0.5,
+ "hole": 7,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 5,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 2,
+ "hole": 6,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ }
+ ]
+ },
+ {
+ "notes": [
+ {
+ "degree": 5,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.5,
+ "hole": 6,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 5,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 1,
+ "hole": 6,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 1,
+ "accidental": 0,
+ "octave": 2,
+ "beats": 0.5,
+ "hole": 7,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 6,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 1,
+ "hole": 6,
+ "breath": "draw",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 5,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.5,
+ "hole": 6,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 3,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.5,
+ "hole": 5,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ }
+ ]
+ },
+ {
+ "notes": [
+ {
+ "degree": 2,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.5,
+ "hole": 4,
+ "breath": "draw",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 5,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.5,
+ "hole": 6,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 3,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.5,
+ "hole": 5,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 2,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.5,
+ "hole": 4,
+ "breath": "draw",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 1,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 2,
+ "hole": 4,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ }
+ ]
+ }
+ ],
+ [
+ {
+ "notes": [
+ {
+ "degree": 1,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.5,
+ "hole": 4,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 1,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 1,
+ "hole": 4,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 6,
+ "accidental": 0,
+ "octave": 0,
+ "beats": 0.5,
+ "hole": 3,
+ "breath": "draw",
+ "bend": 2,
+ "overblow": false
+ },
+ {
+ "degree": 5,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 1,
+ "hole": 6,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 5,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.5,
+ "hole": 6,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 3,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.5,
+ "hole": 5,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ }
+ ]
+ },
+ {
+ "notes": [
+ {
+ "degree": 2,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.5,
+ "hole": 4,
+ "breath": "draw",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 1,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.5,
+ "hole": 4,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 2,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.5,
+ "hole": 4,
+ "breath": "draw",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 3,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.5,
+ "hole": 5,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 5,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 2,
+ "hole": 6,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ }
+ ]
+ },
+ {
+ "notes": [
+ {
+ "degree": 5,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.5,
+ "hole": 6,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 5,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 1,
+ "hole": 6,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 1,
+ "accidental": 0,
+ "octave": 2,
+ "beats": 0.5,
+ "hole": 7,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 6,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 1,
+ "hole": 6,
+ "breath": "draw",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 5,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.5,
+ "hole": 6,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 3,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.5,
+ "hole": 5,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ }
+ ]
+ },
+ {
+ "notes": [
+ {
+ "degree": 2,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.5,
+ "hole": 4,
+ "breath": "draw",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 5,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.5,
+ "hole": 6,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 3,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.5,
+ "hole": 5,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 2,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.5,
+ "hole": 4,
+ "breath": "draw",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 1,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 2,
+ "hole": 4,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ }
+ ]
+ }
+ ],
+ [
+ {
+ "notes": [
+ {
+ "degree": 5,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 1,
+ "hole": 6,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 3,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.5,
+ "hole": 5,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 2,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.5,
+ "hole": 4,
+ "breath": "draw",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 1,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.5,
+ "hole": 4,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 2,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.5,
+ "hole": 4,
+ "breath": "draw",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 3,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.5,
+ "hole": 5,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 5,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.5,
+ "hole": 6,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ }
+ ]
+ },
+ {
+ "notes": [
+ {
+ "degree": 2,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.5,
+ "hole": 4,
+ "breath": "draw",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 1,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.5,
+ "hole": 4,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 6,
+ "accidental": 0,
+ "octave": 0,
+ "beats": 0.5,
+ "hole": 3,
+ "breath": "draw",
+ "bend": 2,
+ "overblow": false
+ },
+ {
+ "degree": 2,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.5,
+ "hole": 4,
+ "breath": "draw",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 1,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 2,
+ "hole": 4,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ }
+ ]
+ },
+ {
+ "notes": [
+ {
+ "degree": 5,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 1,
+ "hole": 6,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 3,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.5,
+ "hole": 5,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 2,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.5,
+ "hole": 4,
+ "breath": "draw",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 1,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.5,
+ "hole": 4,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 6,
+ "accidental": 0,
+ "octave": 0,
+ "beats": 0.5,
+ "hole": 3,
+ "breath": "draw",
+ "bend": 2,
+ "overblow": false
+ },
+ {
+ "degree": 1,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 1,
+ "hole": 4,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ }
+ ]
+ },
+ {
+ "notes": [
+ {
+ "degree": 5,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 1,
+ "hole": 6,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 3,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.5,
+ "hole": 5,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 2,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.5,
+ "hole": 4,
+ "breath": "draw",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 1,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.5,
+ "hole": 4,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 6,
+ "accidental": 0,
+ "octave": 0,
+ "beats": 0.5,
+ "hole": 3,
+ "breath": "draw",
+ "bend": 2,
+ "overblow": false
+ },
+ {
+ "degree": 1,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 1,
+ "hole": 4,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ }
+ ]
+ }
+ ],
+ [
+ {
+ "notes": [
+ {
+ "degree": 5,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 1,
+ "hole": 6,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 1,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.5,
+ "hole": 4,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 0,
+ "accidental": 0,
+ "octave": 0,
+ "beats": 0.5,
+ "hole": null,
+ "breath": null,
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 5,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 1,
+ "hole": 6,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 1,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.5,
+ "hole": 4,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 0,
+ "accidental": 0,
+ "octave": 0,
+ "beats": 0.5,
+ "hole": null,
+ "breath": null,
+ "bend": 0,
+ "overblow": false
+ }
+ ]
+ },
+ {
+ "notes": [
+ {
+ "degree": 5,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 1,
+ "hole": 6,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 3,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.5,
+ "hole": 5,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 2,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.5,
+ "hole": 4,
+ "breath": "draw",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 1,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.5,
+ "hole": 4,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 2,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.5,
+ "hole": 4,
+ "breath": "draw",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 3,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.5,
+ "hole": 5,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 5,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.5,
+ "hole": 6,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ }
+ ]
+ },
+ {
+ "notes": [
+ {
+ "degree": 2,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.5,
+ "hole": 4,
+ "breath": "draw",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 1,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.5,
+ "hole": 4,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 6,
+ "accidental": 0,
+ "octave": 0,
+ "beats": 0.5,
+ "hole": 3,
+ "breath": "draw",
+ "bend": 2,
+ "overblow": false
+ },
+ {
+ "degree": 2,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.5,
+ "hole": 4,
+ "breath": "draw",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 1,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 2,
+ "hole": 4,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ }
+ ],
+ "sectionEnd": true
+ }
+ ]
+ ]
+}
diff --git a/src/data/scores/flowing-stream.json b/src/data/scores/flowing-stream.json
new file mode 100644
index 0000000..6c07ce1
--- /dev/null
+++ b/src/data/scores/flowing-stream.json
@@ -0,0 +1,869 @@
+{
+ "id": "flowing-stream",
+ "title": "小河淌水",
+ "subtitle": "云南民歌 · 教材变拍版",
+ "composer": "云南民歌",
+ "key": "C",
+ "harmonicaKey": "C",
+ "position": "第四把位",
+ "timeSignature": "2/4",
+ "tempo": 72,
+ "difficulty": 3,
+ "tags": [
+ "传统曲",
+ "中国民歌",
+ "变拍",
+ "延长记号"
+ ],
+ "source": "郭丽萍、王立民、马志飞《音乐鉴赏》(新华出版社),印刷第15页/PDF第22页,谱例1-6。",
+ "sourceUrl": "https://backend.sjhtbook.com/upload/file/2025/04/80fb4b7923894770828045c9e613e236.pdf#page=22",
+ "sourceFormat": "jianpu-image",
+ "sourceCheckedAt": "2026-10-23",
+ "builtin": true,
+ "order": 55,
+ "notes": "原1=降E移为1=C并提高一八度,羽调式主音为A,C调口琴第四把位。23个书写小节,前21小节反复,后2小节尾声。按来源保留2/4、3/4、4/4变拍、9处自由延长、2处同音延音;延长记号不改变书面时值。低la为3孔吸气全音压音。 不收录歌词、伴奏和异音连奏线,速度为编辑练习建议。",
+ "lines": [
+ [
+ {
+ "notes": [
+ {
+ "degree": 6,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 2,
+ "fermata": true,
+ "hole": 6,
+ "breath": "draw",
+ "bend": 0,
+ "overblow": false
+ }
+ ],
+ "repeatBegin": true
+ },
+ {
+ "notes": [
+ {
+ "degree": 6,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.5,
+ "hole": 6,
+ "breath": "draw",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 1,
+ "accidental": 0,
+ "octave": 2,
+ "beats": 0.5,
+ "hole": 7,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 2,
+ "accidental": 0,
+ "octave": 2,
+ "beats": 0.5,
+ "hole": 8,
+ "breath": "draw",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 3,
+ "accidental": 0,
+ "octave": 2,
+ "beats": 0.5,
+ "hole": 8,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ }
+ ]
+ },
+ {
+ "notes": [
+ {
+ "degree": 3,
+ "accidental": 0,
+ "octave": 2,
+ "beats": 0.5,
+ "hole": 8,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 2,
+ "accidental": 0,
+ "octave": 2,
+ "beats": 1,
+ "hole": 8,
+ "breath": "draw",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 1,
+ "accidental": 0,
+ "octave": 2,
+ "beats": 0.25,
+ "hole": 7,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 6,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.25,
+ "hole": 6,
+ "breath": "draw",
+ "bend": 0,
+ "overblow": false
+ }
+ ]
+ },
+ {
+ "notes": [
+ {
+ "degree": 3,
+ "accidental": 0,
+ "octave": 2,
+ "beats": 0.5,
+ "hole": 8,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 2,
+ "accidental": 0,
+ "octave": 2,
+ "beats": 1,
+ "dotted": true,
+ "fermata": true,
+ "hole": 8,
+ "breath": "draw",
+ "bend": 0,
+ "overblow": false
+ }
+ ]
+ },
+ {
+ "notes": [
+ {
+ "degree": 2,
+ "accidental": 0,
+ "octave": 2,
+ "beats": 0.25,
+ "hole": 8,
+ "breath": "draw",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 1,
+ "accidental": 0,
+ "octave": 2,
+ "beats": 0.25,
+ "hole": 7,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 6,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 1,
+ "dotted": true,
+ "tie": true,
+ "hole": 6,
+ "breath": "draw",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 6,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 1,
+ "fermata": true,
+ "hole": 6,
+ "breath": "draw",
+ "bend": 0,
+ "overblow": false
+ }
+ ],
+ "timeSignature": "3/4"
+ },
+ {
+ "notes": [
+ {
+ "degree": 6,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.5,
+ "hole": 6,
+ "breath": "draw",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 1,
+ "accidental": 0,
+ "octave": 2,
+ "beats": 0.5,
+ "hole": 7,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 6,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.5,
+ "hole": 6,
+ "breath": "draw",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 5,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.5,
+ "hole": 6,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ }
+ ],
+ "timeSignature": "2/4"
+ }
+ ],
+ [
+ {
+ "notes": [
+ {
+ "degree": 3,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.5,
+ "hole": 5,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 2,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.5,
+ "hole": 4,
+ "breath": "draw",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 5,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.5,
+ "hole": 6,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 6,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 1,
+ "dotted": true,
+ "hole": 6,
+ "breath": "draw",
+ "bend": 0,
+ "overblow": false
+ }
+ ],
+ "timeSignature": "3/4"
+ },
+ {
+ "notes": [
+ {
+ "degree": 6,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.5,
+ "hole": 6,
+ "breath": "draw",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 5,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.5,
+ "hole": 6,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 3,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.5,
+ "hole": 5,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 2,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.5,
+ "hole": 4,
+ "breath": "draw",
+ "bend": 0,
+ "overblow": false
+ }
+ ],
+ "timeSignature": "2/4"
+ },
+ {
+ "notes": [
+ {
+ "degree": 6,
+ "accidental": 0,
+ "octave": 0,
+ "beats": 2,
+ "fermata": true,
+ "hole": 3,
+ "breath": "draw",
+ "bend": 2,
+ "overblow": false
+ }
+ ]
+ },
+ {
+ "notes": [
+ {
+ "degree": 6,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.5,
+ "hole": 6,
+ "breath": "draw",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 2,
+ "accidental": 0,
+ "octave": 2,
+ "beats": 0.5,
+ "hole": 8,
+ "breath": "draw",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 2,
+ "accidental": 0,
+ "octave": 2,
+ "beats": 0.5,
+ "hole": 8,
+ "breath": "draw",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 6,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.5,
+ "hole": 6,
+ "breath": "draw",
+ "bend": 0,
+ "overblow": false
+ }
+ ]
+ },
+ {
+ "notes": [
+ {
+ "degree": 3,
+ "accidental": 0,
+ "octave": 2,
+ "beats": 0.5,
+ "hole": 8,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 2,
+ "accidental": 0,
+ "octave": 2,
+ "beats": 1,
+ "hole": 8,
+ "breath": "draw",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 1,
+ "accidental": 0,
+ "octave": 2,
+ "beats": 0.25,
+ "hole": 7,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 6,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.25,
+ "hole": 6,
+ "breath": "draw",
+ "bend": 0,
+ "overblow": false
+ }
+ ]
+ },
+ {
+ "notes": [
+ {
+ "degree": 3,
+ "accidental": 0,
+ "octave": 2,
+ "beats": 0.5,
+ "hole": 8,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 2,
+ "accidental": 0,
+ "octave": 2,
+ "beats": 1,
+ "dotted": true,
+ "fermata": true,
+ "hole": 8,
+ "breath": "draw",
+ "bend": 0,
+ "overblow": false
+ }
+ ]
+ }
+ ],
+ [
+ {
+ "notes": [
+ {
+ "degree": 2,
+ "accidental": 0,
+ "octave": 2,
+ "beats": 0.25,
+ "hole": 8,
+ "breath": "draw",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 1,
+ "accidental": 0,
+ "octave": 2,
+ "beats": 0.25,
+ "hole": 7,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 6,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 1,
+ "dotted": true,
+ "fermata": true,
+ "hole": 6,
+ "breath": "draw",
+ "bend": 0,
+ "overblow": false
+ }
+ ]
+ },
+ {
+ "notes": [
+ {
+ "degree": 2,
+ "accidental": 0,
+ "octave": 2,
+ "beats": 1,
+ "dotted": true,
+ "hole": 8,
+ "breath": "draw",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 1,
+ "accidental": 0,
+ "octave": 2,
+ "beats": 0.25,
+ "hole": 7,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 6,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.25,
+ "hole": 6,
+ "breath": "draw",
+ "bend": 0,
+ "overblow": false
+ }
+ ]
+ },
+ {
+ "notes": [
+ {
+ "degree": 3,
+ "accidental": 0,
+ "octave": 2,
+ "beats": 0.5,
+ "hole": 8,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 2,
+ "accidental": 0,
+ "octave": 2,
+ "beats": 1,
+ "hole": 8,
+ "breath": "draw",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 1,
+ "accidental": 0,
+ "octave": 2,
+ "beats": 0.25,
+ "hole": 7,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 6,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.25,
+ "hole": 6,
+ "breath": "draw",
+ "bend": 0,
+ "overblow": false
+ }
+ ]
+ },
+ {
+ "notes": [
+ {
+ "degree": 3,
+ "accidental": 0,
+ "octave": 2,
+ "beats": 0.5,
+ "hole": 8,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 2,
+ "accidental": 0,
+ "octave": 2,
+ "beats": 1,
+ "dotted": true,
+ "fermata": true,
+ "hole": 8,
+ "breath": "draw",
+ "bend": 0,
+ "overblow": false
+ }
+ ]
+ },
+ {
+ "notes": [
+ {
+ "degree": 1,
+ "accidental": 0,
+ "octave": 2,
+ "beats": 0.5,
+ "hole": 7,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 6,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 1,
+ "dotted": true,
+ "tie": true,
+ "hole": 6,
+ "breath": "draw",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 6,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 1,
+ "fermata": true,
+ "hole": 6,
+ "breath": "draw",
+ "bend": 0,
+ "overblow": false
+ }
+ ],
+ "timeSignature": "3/4"
+ },
+ {
+ "notes": [
+ {
+ "degree": 6,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.5,
+ "hole": 6,
+ "breath": "draw",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 1,
+ "accidental": 0,
+ "octave": 2,
+ "beats": 0.5,
+ "hole": 7,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 6,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.5,
+ "hole": 6,
+ "breath": "draw",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 5,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.5,
+ "hole": 6,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ }
+ ],
+ "timeSignature": "2/4"
+ }
+ ],
+ [
+ {
+ "notes": [
+ {
+ "degree": 3,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.5,
+ "hole": 5,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 2,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.5,
+ "hole": 4,
+ "breath": "draw",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 5,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.5,
+ "hole": 6,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 6,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 1,
+ "dotted": true,
+ "hole": 6,
+ "breath": "draw",
+ "bend": 0,
+ "overblow": false
+ }
+ ],
+ "timeSignature": "3/4"
+ },
+ {
+ "notes": [
+ {
+ "degree": 6,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.5,
+ "hole": 6,
+ "breath": "draw",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 5,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.5,
+ "hole": 6,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 3,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.5,
+ "hole": 5,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 2,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.5,
+ "hole": 4,
+ "breath": "draw",
+ "bend": 0,
+ "overblow": false
+ }
+ ],
+ "timeSignature": "2/4"
+ },
+ {
+ "notes": [
+ {
+ "degree": 6,
+ "accidental": 0,
+ "octave": 0,
+ "beats": 2,
+ "fermata": true,
+ "hole": 3,
+ "breath": "draw",
+ "bend": 2,
+ "overblow": false
+ }
+ ],
+ "repeatEnd": true
+ },
+ {
+ "notes": [
+ {
+ "degree": 3,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 2,
+ "hole": 5,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 3,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.5,
+ "hole": 5,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 2,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.5,
+ "hole": 4,
+ "breath": "draw",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 2,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 1,
+ "hole": 4,
+ "breath": "draw",
+ "bend": 0,
+ "overblow": false
+ }
+ ],
+ "timeSignature": "4/4"
+ },
+ {
+ "notes": [
+ {
+ "degree": 6,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 4,
+ "hole": 6,
+ "breath": "draw",
+ "bend": 0,
+ "overblow": false
+ }
+ ],
+ "sectionEnd": true
+ }
+ ]
+ ]
+}
diff --git a/src/data/scores/flying-kites.json b/src/data/scores/flying-kites.json
new file mode 100644
index 0000000..107e598
--- /dev/null
+++ b/src/data/scores/flying-kites.json
@@ -0,0 +1,1559 @@
+{
+ "id": "flying-kites",
+ "title": "放纸鹞",
+ "subtitle": "台湾民谣《一只鸟仔》曲调",
+ "composer": "台湾民谣",
+ "key": "C",
+ "harmonicaKey": "C",
+ "timeSignature": "4/4",
+ "tempo": 96,
+ "difficulty": 3,
+ "tags": [
+ "中国民歌",
+ "台湾",
+ "自然音",
+ "反复展开"
+ ],
+ "source": "粤教花城《音乐六年级上册·简谱》印刷第15页/PDF第16页。采用台湾民谣《一只鸟仔》曲调,仅录旋律,不收录教材新填歌词。原1=A改为1=C后整体提高八度,两个反复结尾展开为24小节。",
+ "sourceUrl": "https://lywgyxx.szftedu.cn/xkjc/yinyue/202209/P020220910588732922659.pdf#page=16",
+ "sourceFormat": "jianpu-image",
+ "sourceCheckedAt": "2026-10-22",
+ "builtin": true,
+ "order": 38,
+ "notes": "音域D5–F6,全部自然音。第一遍结尾括号内re是中音,第二遍是高音,不能复制同一结尾。保留括号内器乐回应及全部休止,省略歌词和异音连奏线。速度为练习建议。",
+ "lines": [
+ [
+ {
+ "notes": [
+ {
+ "degree": 2,
+ "accidental": 0,
+ "octave": 2,
+ "beats": 1,
+ "hole": 8,
+ "breath": "draw",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 3,
+ "accidental": 0,
+ "octave": 2,
+ "beats": 1,
+ "hole": 8,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 2,
+ "accidental": 0,
+ "octave": 2,
+ "beats": 0.5,
+ "hole": 8,
+ "breath": "draw",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 2,
+ "accidental": 0,
+ "octave": 2,
+ "beats": 0.25,
+ "hole": 8,
+ "breath": "draw",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 3,
+ "accidental": 0,
+ "octave": 2,
+ "beats": 0.25,
+ "hole": 8,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 2,
+ "accidental": 0,
+ "octave": 2,
+ "beats": 0.5,
+ "hole": 8,
+ "breath": "draw",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 1,
+ "accidental": 0,
+ "octave": 2,
+ "beats": 0.5,
+ "hole": 7,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ }
+ ]
+ },
+ {
+ "notes": [
+ {
+ "degree": 2,
+ "accidental": 0,
+ "octave": 2,
+ "beats": 0.5,
+ "hole": 8,
+ "breath": "draw",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 0,
+ "accidental": 0,
+ "octave": 0,
+ "beats": 0.5,
+ "hole": null,
+ "breath": null,
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 6,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.5,
+ "hole": 6,
+ "breath": "draw",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 6,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.5,
+ "hole": 6,
+ "breath": "draw",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 2,
+ "accidental": 0,
+ "octave": 2,
+ "beats": 0.5,
+ "hole": 8,
+ "breath": "draw",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 0,
+ "accidental": 0,
+ "octave": 0,
+ "beats": 0.5,
+ "hole": null,
+ "breath": null,
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 0,
+ "accidental": 0,
+ "octave": 0,
+ "beats": 1,
+ "hole": null,
+ "breath": null,
+ "bend": 0,
+ "overblow": false
+ }
+ ]
+ },
+ {
+ "notes": [
+ {
+ "degree": 6,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 1,
+ "hole": 6,
+ "breath": "draw",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 2,
+ "accidental": 0,
+ "octave": 2,
+ "beats": 1,
+ "hole": 8,
+ "breath": "draw",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 6,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.5,
+ "hole": 6,
+ "breath": "draw",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 1,
+ "accidental": 0,
+ "octave": 2,
+ "beats": 0.5,
+ "hole": 7,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 6,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.5,
+ "hole": 6,
+ "breath": "draw",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 5,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.5,
+ "hole": 6,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ }
+ ]
+ }
+ ],
+ [
+ {
+ "notes": [
+ {
+ "degree": 2,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 1,
+ "hole": 4,
+ "breath": "draw",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 5,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.5,
+ "hole": 6,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 6,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.5,
+ "hole": 6,
+ "breath": "draw",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 5,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.5,
+ "hole": 6,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 0,
+ "accidental": 0,
+ "octave": 0,
+ "beats": 0.5,
+ "hole": null,
+ "breath": null,
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 0,
+ "accidental": 0,
+ "octave": 0,
+ "beats": 1,
+ "hole": null,
+ "breath": null,
+ "bend": 0,
+ "overblow": false
+ }
+ ]
+ },
+ {
+ "notes": [
+ {
+ "degree": 1,
+ "accidental": 0,
+ "octave": 2,
+ "beats": 1,
+ "hole": 7,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 2,
+ "accidental": 0,
+ "octave": 2,
+ "beats": 1,
+ "hole": 8,
+ "breath": "draw",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 1,
+ "accidental": 0,
+ "octave": 2,
+ "beats": 0.5,
+ "hole": 7,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 1,
+ "accidental": 0,
+ "octave": 2,
+ "beats": 0.25,
+ "hole": 7,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 2,
+ "accidental": 0,
+ "octave": 2,
+ "beats": 0.25,
+ "hole": 8,
+ "breath": "draw",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 1,
+ "accidental": 0,
+ "octave": 2,
+ "beats": 0.5,
+ "hole": 7,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 5,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.5,
+ "hole": 6,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ }
+ ]
+ },
+ {
+ "notes": [
+ {
+ "degree": 1,
+ "accidental": 0,
+ "octave": 2,
+ "beats": 0.5,
+ "hole": 7,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 0,
+ "accidental": 0,
+ "octave": 0,
+ "beats": 0.5,
+ "hole": null,
+ "breath": null,
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 5,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.5,
+ "hole": 6,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 5,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.5,
+ "hole": 6,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 1,
+ "accidental": 0,
+ "octave": 2,
+ "beats": 0.5,
+ "hole": 7,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 0,
+ "accidental": 0,
+ "octave": 0,
+ "beats": 0.5,
+ "hole": null,
+ "breath": null,
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 0,
+ "accidental": 0,
+ "octave": 0,
+ "beats": 1,
+ "hole": null,
+ "breath": null,
+ "bend": 0,
+ "overblow": false
+ }
+ ]
+ }
+ ],
+ [
+ {
+ "notes": [
+ {
+ "degree": 2,
+ "accidental": 0,
+ "octave": 2,
+ "beats": 1,
+ "hole": 8,
+ "breath": "draw",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 2,
+ "accidental": 0,
+ "octave": 2,
+ "beats": 1,
+ "hole": 8,
+ "breath": "draw",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 6,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.5,
+ "hole": 6,
+ "breath": "draw",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 1,
+ "accidental": 0,
+ "octave": 2,
+ "beats": 0.5,
+ "hole": 7,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 6,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.5,
+ "hole": 6,
+ "breath": "draw",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 5,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.5,
+ "hole": 6,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ }
+ ]
+ },
+ {
+ "notes": [
+ {
+ "degree": 2,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 1,
+ "hole": 4,
+ "breath": "draw",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 5,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.5,
+ "hole": 6,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 6,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.5,
+ "hole": 6,
+ "breath": "draw",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 5,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.5,
+ "hole": 6,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 0,
+ "accidental": 0,
+ "octave": 0,
+ "beats": 0.5,
+ "hole": null,
+ "breath": null,
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 0,
+ "accidental": 0,
+ "octave": 0,
+ "beats": 1,
+ "hole": null,
+ "breath": null,
+ "bend": 0,
+ "overblow": false
+ }
+ ]
+ },
+ {
+ "notes": [
+ {
+ "degree": 2,
+ "accidental": 0,
+ "octave": 2,
+ "beats": 1,
+ "hole": 8,
+ "breath": "draw",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 2,
+ "accidental": 0,
+ "octave": 2,
+ "beats": 1,
+ "hole": 8,
+ "breath": "draw",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 2,
+ "accidental": 0,
+ "octave": 2,
+ "beats": 1,
+ "hole": 8,
+ "breath": "draw",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 2,
+ "accidental": 0,
+ "octave": 2,
+ "beats": 1,
+ "hole": 8,
+ "breath": "draw",
+ "bend": 0,
+ "overblow": false
+ }
+ ]
+ }
+ ],
+ [
+ {
+ "notes": [
+ {
+ "degree": 1,
+ "accidental": 0,
+ "octave": 2,
+ "beats": 0.5,
+ "hole": 7,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 2,
+ "accidental": 0,
+ "octave": 2,
+ "beats": 0.5,
+ "hole": 8,
+ "breath": "draw",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 4,
+ "accidental": 0,
+ "octave": 2,
+ "beats": 0.5,
+ "hole": 9,
+ "breath": "draw",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 3,
+ "accidental": 0,
+ "octave": 2,
+ "beats": 0.5,
+ "hole": 8,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 2,
+ "accidental": 0,
+ "octave": 2,
+ "beats": 0.5,
+ "hole": 8,
+ "breath": "draw",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 3,
+ "accidental": 0,
+ "octave": 2,
+ "beats": 0.5,
+ "hole": 8,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 1,
+ "accidental": 0,
+ "octave": 2,
+ "beats": 1,
+ "hole": 7,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ }
+ ]
+ },
+ {
+ "notes": [
+ {
+ "degree": 2,
+ "accidental": 0,
+ "octave": 2,
+ "beats": 3,
+ "hole": 8,
+ "breath": "draw",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 6,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.5,
+ "hole": 6,
+ "breath": "draw",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 6,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.5,
+ "hole": 6,
+ "breath": "draw",
+ "bend": 0,
+ "overblow": false
+ }
+ ]
+ },
+ {
+ "notes": [
+ {
+ "degree": 2,
+ "accidental": 0,
+ "octave": 2,
+ "beats": 1,
+ "hole": 8,
+ "breath": "draw",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 6,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.5,
+ "hole": 6,
+ "breath": "draw",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 6,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.5,
+ "hole": 6,
+ "breath": "draw",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 2,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 1,
+ "hole": 4,
+ "breath": "draw",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 0,
+ "accidental": 0,
+ "octave": 0,
+ "beats": 1,
+ "hole": null,
+ "breath": null,
+ "bend": 0,
+ "overblow": false
+ }
+ ]
+ }
+ ],
+ [
+ {
+ "notes": [
+ {
+ "degree": 2,
+ "accidental": 0,
+ "octave": 2,
+ "beats": 1,
+ "hole": 8,
+ "breath": "draw",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 3,
+ "accidental": 0,
+ "octave": 2,
+ "beats": 1,
+ "hole": 8,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 2,
+ "accidental": 0,
+ "octave": 2,
+ "beats": 0.5,
+ "hole": 8,
+ "breath": "draw",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 2,
+ "accidental": 0,
+ "octave": 2,
+ "beats": 0.25,
+ "hole": 8,
+ "breath": "draw",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 3,
+ "accidental": 0,
+ "octave": 2,
+ "beats": 0.25,
+ "hole": 8,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 2,
+ "accidental": 0,
+ "octave": 2,
+ "beats": 0.5,
+ "hole": 8,
+ "breath": "draw",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 1,
+ "accidental": 0,
+ "octave": 2,
+ "beats": 0.5,
+ "hole": 7,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ }
+ ]
+ },
+ {
+ "notes": [
+ {
+ "degree": 2,
+ "accidental": 0,
+ "octave": 2,
+ "beats": 0.5,
+ "hole": 8,
+ "breath": "draw",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 0,
+ "accidental": 0,
+ "octave": 0,
+ "beats": 0.5,
+ "hole": null,
+ "breath": null,
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 6,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.5,
+ "hole": 6,
+ "breath": "draw",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 6,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.5,
+ "hole": 6,
+ "breath": "draw",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 2,
+ "accidental": 0,
+ "octave": 2,
+ "beats": 0.5,
+ "hole": 8,
+ "breath": "draw",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 0,
+ "accidental": 0,
+ "octave": 0,
+ "beats": 0.5,
+ "hole": null,
+ "breath": null,
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 0,
+ "accidental": 0,
+ "octave": 0,
+ "beats": 1,
+ "hole": null,
+ "breath": null,
+ "bend": 0,
+ "overblow": false
+ }
+ ]
+ },
+ {
+ "notes": [
+ {
+ "degree": 6,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 1,
+ "hole": 6,
+ "breath": "draw",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 2,
+ "accidental": 0,
+ "octave": 2,
+ "beats": 1,
+ "hole": 8,
+ "breath": "draw",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 6,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.5,
+ "hole": 6,
+ "breath": "draw",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 1,
+ "accidental": 0,
+ "octave": 2,
+ "beats": 0.5,
+ "hole": 7,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 6,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.5,
+ "hole": 6,
+ "breath": "draw",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 5,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.5,
+ "hole": 6,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ }
+ ]
+ }
+ ],
+ [
+ {
+ "notes": [
+ {
+ "degree": 2,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 1,
+ "hole": 4,
+ "breath": "draw",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 5,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.5,
+ "hole": 6,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 6,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.5,
+ "hole": 6,
+ "breath": "draw",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 5,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.5,
+ "hole": 6,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 0,
+ "accidental": 0,
+ "octave": 0,
+ "beats": 0.5,
+ "hole": null,
+ "breath": null,
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 0,
+ "accidental": 0,
+ "octave": 0,
+ "beats": 1,
+ "hole": null,
+ "breath": null,
+ "bend": 0,
+ "overblow": false
+ }
+ ]
+ },
+ {
+ "notes": [
+ {
+ "degree": 1,
+ "accidental": 0,
+ "octave": 2,
+ "beats": 1,
+ "hole": 7,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 2,
+ "accidental": 0,
+ "octave": 2,
+ "beats": 1,
+ "hole": 8,
+ "breath": "draw",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 1,
+ "accidental": 0,
+ "octave": 2,
+ "beats": 0.5,
+ "hole": 7,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 1,
+ "accidental": 0,
+ "octave": 2,
+ "beats": 0.25,
+ "hole": 7,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 2,
+ "accidental": 0,
+ "octave": 2,
+ "beats": 0.25,
+ "hole": 8,
+ "breath": "draw",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 1,
+ "accidental": 0,
+ "octave": 2,
+ "beats": 0.5,
+ "hole": 7,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 5,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.5,
+ "hole": 6,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ }
+ ]
+ },
+ {
+ "notes": [
+ {
+ "degree": 1,
+ "accidental": 0,
+ "octave": 2,
+ "beats": 0.5,
+ "hole": 7,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 0,
+ "accidental": 0,
+ "octave": 0,
+ "beats": 0.5,
+ "hole": null,
+ "breath": null,
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 5,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.5,
+ "hole": 6,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 5,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.5,
+ "hole": 6,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 1,
+ "accidental": 0,
+ "octave": 2,
+ "beats": 0.5,
+ "hole": 7,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 0,
+ "accidental": 0,
+ "octave": 0,
+ "beats": 0.5,
+ "hole": null,
+ "breath": null,
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 0,
+ "accidental": 0,
+ "octave": 0,
+ "beats": 1,
+ "hole": null,
+ "breath": null,
+ "bend": 0,
+ "overblow": false
+ }
+ ]
+ }
+ ],
+ [
+ {
+ "notes": [
+ {
+ "degree": 2,
+ "accidental": 0,
+ "octave": 2,
+ "beats": 1,
+ "hole": 8,
+ "breath": "draw",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 2,
+ "accidental": 0,
+ "octave": 2,
+ "beats": 1,
+ "hole": 8,
+ "breath": "draw",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 6,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.5,
+ "hole": 6,
+ "breath": "draw",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 1,
+ "accidental": 0,
+ "octave": 2,
+ "beats": 0.5,
+ "hole": 7,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 6,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.5,
+ "hole": 6,
+ "breath": "draw",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 5,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.5,
+ "hole": 6,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ }
+ ]
+ },
+ {
+ "notes": [
+ {
+ "degree": 2,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 1,
+ "hole": 4,
+ "breath": "draw",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 5,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.5,
+ "hole": 6,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 6,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.5,
+ "hole": 6,
+ "breath": "draw",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 5,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.5,
+ "hole": 6,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 0,
+ "accidental": 0,
+ "octave": 0,
+ "beats": 0.5,
+ "hole": null,
+ "breath": null,
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 0,
+ "accidental": 0,
+ "octave": 0,
+ "beats": 1,
+ "hole": null,
+ "breath": null,
+ "bend": 0,
+ "overblow": false
+ }
+ ]
+ },
+ {
+ "notes": [
+ {
+ "degree": 2,
+ "accidental": 0,
+ "octave": 2,
+ "beats": 1,
+ "hole": 8,
+ "breath": "draw",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 2,
+ "accidental": 0,
+ "octave": 2,
+ "beats": 1,
+ "hole": 8,
+ "breath": "draw",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 2,
+ "accidental": 0,
+ "octave": 2,
+ "beats": 1,
+ "hole": 8,
+ "breath": "draw",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 2,
+ "accidental": 0,
+ "octave": 2,
+ "beats": 1,
+ "hole": 8,
+ "breath": "draw",
+ "bend": 0,
+ "overblow": false
+ }
+ ]
+ }
+ ],
+ [
+ {
+ "notes": [
+ {
+ "degree": 1,
+ "accidental": 0,
+ "octave": 2,
+ "beats": 0.5,
+ "hole": 7,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 2,
+ "accidental": 0,
+ "octave": 2,
+ "beats": 0.5,
+ "hole": 8,
+ "breath": "draw",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 4,
+ "accidental": 0,
+ "octave": 2,
+ "beats": 0.5,
+ "hole": 9,
+ "breath": "draw",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 3,
+ "accidental": 0,
+ "octave": 2,
+ "beats": 0.5,
+ "hole": 8,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 2,
+ "accidental": 0,
+ "octave": 2,
+ "beats": 0.5,
+ "hole": 8,
+ "breath": "draw",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 3,
+ "accidental": 0,
+ "octave": 2,
+ "beats": 0.5,
+ "hole": 8,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 1,
+ "accidental": 0,
+ "octave": 2,
+ "beats": 1,
+ "hole": 7,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ }
+ ]
+ },
+ {
+ "notes": [
+ {
+ "degree": 2,
+ "accidental": 0,
+ "octave": 2,
+ "beats": 3,
+ "hole": 8,
+ "breath": "draw",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 6,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.5,
+ "hole": 6,
+ "breath": "draw",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 6,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.5,
+ "hole": 6,
+ "breath": "draw",
+ "bend": 0,
+ "overblow": false
+ }
+ ]
+ },
+ {
+ "notes": [
+ {
+ "degree": 2,
+ "accidental": 0,
+ "octave": 2,
+ "beats": 1,
+ "hole": 8,
+ "breath": "draw",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 6,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.5,
+ "hole": 6,
+ "breath": "draw",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 6,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.5,
+ "hole": 6,
+ "breath": "draw",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 2,
+ "accidental": 0,
+ "octave": 2,
+ "beats": 1,
+ "hole": 8,
+ "breath": "draw",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 0,
+ "accidental": 0,
+ "octave": 0,
+ "beats": 1,
+ "hole": null,
+ "breath": null,
+ "bend": 0,
+ "overblow": false
+ }
+ ],
+ "sectionEnd": true
+ }
+ ]
+ ]
+}
diff --git a/src/data/scores/frere-jacques.json b/src/data/scores/frere-jacques.json
index 7fe2093..9b8a5dd 100644
--- a/src/data/scores/frere-jacques.json
+++ b/src/data/scores/frere-jacques.json
@@ -14,13 +14,13 @@
"轮唱",
"入门"
],
- "source": "睿龙创客 UNO 实验盒教材《两只老虎》数字简谱;原谱 1=G,应用内移调为 1=C",
- "sourceUrl": "https://wiki.ruilongmaker.cc/images/4/44/MIXEPI_UNO%28LITE%29%E5%AE%9E%E9%AA%8C%E7%9B%92%E5%A5%97%E4%BB%B6PDF.pdf",
- "sourceFormat": "jianpu-image",
- "sourceCheckedAt": "2026-08-31",
+ "source": "The Everyday Song Book (1927), No.104;John Chambers ABC 转录",
+ "sourceUrl": "https://trillian.mit.edu/~jc/music/book/EverydaySongBook/104_Round_Are_You_Sleeping.abc",
+ "sourceFormat": "music-text",
+ "sourceCheckedAt": "2026-10-23",
"builtin": true,
"order": 9,
- "notes": "按教材 8 小节轮唱旋律录入,整体升八度适配 C 调十孔口琴;第五、六小节注意连续八分音符。",
+ "notes": "原创客教材地址现返回校验网页,改按可完整读取的 ABC 版本核对。旋律音符序列不变;采用该版本两拍弱起、两拍结尾的 9 小节划分。G4 主音移为 C5,轮唱按单声部记谱,歌词与轮唱入口编号不录入,速度为编辑建议。",
"lines": [
[
{
@@ -44,7 +44,11 @@
"breath": "draw",
"bend": 0,
"overblow": false
- },
+ }
+ ]
+ },
+ {
+ "notes": [
{
"degree": 3,
"accidental": 0,
@@ -64,11 +68,7 @@
"breath": "blow",
"bend": 0,
"overblow": false
- }
- ]
- },
- {
- "notes": [
+ },
{
"degree": 1,
"accidental": 0,
@@ -88,7 +88,11 @@
"breath": "draw",
"bend": 0,
"overblow": false
- },
+ }
+ ]
+ },
+ {
+ "notes": [
{
"degree": 3,
"accidental": 0,
@@ -108,11 +112,7 @@
"breath": "blow",
"bend": 0,
"overblow": false
- }
- ]
- },
- {
- "notes": [
+ },
{
"degree": 3,
"accidental": 0,
@@ -132,7 +132,11 @@
"breath": "draw",
"bend": 0,
"overblow": false
- },
+ }
+ ]
+ },
+ {
+ "notes": [
{
"degree": 5,
"accidental": 0,
@@ -142,11 +146,7 @@
"breath": "blow",
"bend": 0,
"overblow": false
- }
- ]
- },
- {
- "notes": [
+ },
{
"degree": 3,
"accidental": 0,
@@ -166,7 +166,13 @@
"breath": "draw",
"bend": 0,
"overblow": false
- },
+ }
+ ]
+ }
+ ],
+ [
+ {
+ "notes": [
{
"degree": 5,
"accidental": 0,
@@ -176,13 +182,7 @@
"breath": "blow",
"bend": 0,
"overblow": false
- }
- ]
- }
- ],
- [
- {
- "notes": [
+ },
{
"degree": 5,
"accidental": 0,
@@ -222,7 +222,11 @@
"breath": "draw",
"bend": 0,
"overblow": false
- },
+ }
+ ]
+ },
+ {
+ "notes": [
{
"degree": 3,
"accidental": 0,
@@ -242,11 +246,7 @@
"breath": "blow",
"bend": 0,
"overblow": false
- }
- ]
- },
- {
- "notes": [
+ },
{
"degree": 5,
"accidental": 0,
@@ -286,7 +286,11 @@
"breath": "draw",
"bend": 0,
"overblow": false
- },
+ }
+ ]
+ },
+ {
+ "notes": [
{
"degree": 3,
"accidental": 0,
@@ -306,11 +310,7 @@
"breath": "blow",
"bend": 0,
"overblow": false
- }
- ]
- },
- {
- "notes": [
+ },
{
"degree": 1,
"accidental": 0,
@@ -330,7 +330,11 @@
"breath": "blow",
"bend": 0,
"overblow": false
- },
+ }
+ ]
+ },
+ {
+ "notes": [
{
"degree": 1,
"accidental": 0,
@@ -340,11 +344,7 @@
"breath": "blow",
"bend": 0,
"overblow": false
- }
- ]
- },
- {
- "notes": [
+ },
{
"degree": 1,
"accidental": 0,
@@ -364,7 +364,11 @@
"breath": "blow",
"bend": 0,
"overblow": false
- },
+ }
+ ]
+ },
+ {
+ "notes": [
{
"degree": 1,
"accidental": 0,
diff --git a/src/data/scores/golden-slumbers.json b/src/data/scores/golden-slumbers.json
new file mode 100644
index 0000000..e22e511
--- /dev/null
+++ b/src/data/scores/golden-slumbers.json
@@ -0,0 +1,452 @@
+{
+ "id": "golden-slumbers",
+ "title": "金色梦乡",
+ "subtitle": "Golden Slumbers · 传统摇篮曲",
+ "composer": "传统曲调",
+ "key": "C",
+ "harmonicaKey": "C",
+ "position": "第一把位",
+ "timeSignature": "3/4",
+ "tempo": 72,
+ "difficulty": 3,
+ "tags": [
+ "西方歌曲",
+ "摇篮曲",
+ "三拍子",
+ "压音"
+ ],
+ "source": "The Everyday Song Book(1927)第175首,John Chambers于2017年转录的ABC;16个写出小节,前8小节保留反复。原Bb4主音移至C5。",
+ "sourceUrl": "https://trillian.mit.edu/~jc/music/book/EverydaySongBook/175_Golden_Slumbers.abc",
+ "sourceFormat": "music-text",
+ "sourceCheckedAt": "2026-10-22",
+ "builtin": true,
+ "order": 36,
+ "notes": "传统旋律版本,并非同名流行歌曲。音域E4–G5,低fa为2孔吸压全音、低la为3孔吸压全音;保留三拍长音及前半段反复,异音连奏线和歌词省略。速度为练习建议。",
+ "lines": [
+ [
+ {
+ "notes": [
+ {
+ "degree": 5,
+ "accidental": 0,
+ "octave": 0,
+ "beats": 1,
+ "hole": 3,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 3,
+ "accidental": 0,
+ "octave": 0,
+ "beats": 1,
+ "hole": 2,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 4,
+ "accidental": 0,
+ "octave": 0,
+ "beats": 1,
+ "hole": 2,
+ "breath": "draw",
+ "bend": 2,
+ "overblow": false
+ }
+ ],
+ "repeatBegin": true
+ },
+ {
+ "notes": [
+ {
+ "degree": 5,
+ "accidental": 0,
+ "octave": 0,
+ "beats": 2,
+ "hole": 3,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 3,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 1,
+ "hole": 5,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ }
+ ]
+ },
+ {
+ "notes": [
+ {
+ "degree": 2,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 2,
+ "hole": 4,
+ "breath": "draw",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 1,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 1,
+ "hole": 4,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ }
+ ]
+ },
+ {
+ "notes": [
+ {
+ "degree": 6,
+ "accidental": 0,
+ "octave": 0,
+ "beats": 3,
+ "hole": 3,
+ "breath": "draw",
+ "bend": 2,
+ "overblow": false
+ }
+ ]
+ }
+ ],
+ [
+ {
+ "notes": [
+ {
+ "degree": 5,
+ "accidental": 0,
+ "octave": 0,
+ "beats": 1,
+ "hole": 3,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 3,
+ "accidental": 0,
+ "octave": 0,
+ "beats": 1,
+ "hole": 2,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 4,
+ "accidental": 0,
+ "octave": 0,
+ "beats": 1,
+ "hole": 2,
+ "breath": "draw",
+ "bend": 2,
+ "overblow": false
+ }
+ ]
+ },
+ {
+ "notes": [
+ {
+ "degree": 5,
+ "accidental": 0,
+ "octave": 0,
+ "beats": 2,
+ "hole": 3,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 3,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 1,
+ "hole": 5,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ }
+ ]
+ },
+ {
+ "notes": [
+ {
+ "degree": 2,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 2,
+ "hole": 4,
+ "breath": "draw",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 1,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 1,
+ "hole": 4,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ }
+ ]
+ },
+ {
+ "notes": [
+ {
+ "degree": 2,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 3,
+ "hole": 4,
+ "breath": "draw",
+ "bend": 0,
+ "overblow": false
+ }
+ ],
+ "repeatEnd": true
+ }
+ ],
+ [
+ {
+ "notes": [
+ {
+ "degree": 2,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 1,
+ "hole": 4,
+ "breath": "draw",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 3,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 1,
+ "hole": 5,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 4,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 1,
+ "hole": 5,
+ "breath": "draw",
+ "bend": 0,
+ "overblow": false
+ }
+ ]
+ },
+ {
+ "notes": [
+ {
+ "degree": 5,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 1,
+ "hole": 6,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 4,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 1,
+ "hole": 5,
+ "breath": "draw",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 3,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 1,
+ "hole": 5,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ }
+ ]
+ },
+ {
+ "notes": [
+ {
+ "degree": 4,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 1,
+ "hole": 5,
+ "breath": "draw",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 3,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 1,
+ "hole": 5,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 2,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 1,
+ "hole": 4,
+ "breath": "draw",
+ "bend": 0,
+ "overblow": false
+ }
+ ]
+ },
+ {
+ "notes": [
+ {
+ "degree": 1,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 1,
+ "hole": 4,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 7,
+ "accidental": 0,
+ "octave": 0,
+ "beats": 1,
+ "hole": 3,
+ "breath": "draw",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 5,
+ "accidental": 0,
+ "octave": 0,
+ "beats": 1,
+ "hole": 3,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ }
+ ]
+ }
+ ],
+ [
+ {
+ "notes": [
+ {
+ "degree": 1,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 1,
+ "hole": 4,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 3,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 2,
+ "hole": 5,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ }
+ ]
+ },
+ {
+ "notes": [
+ {
+ "degree": 6,
+ "accidental": 0,
+ "octave": 0,
+ "beats": 2,
+ "hole": 3,
+ "breath": "draw",
+ "bend": 2,
+ "overblow": false
+ },
+ {
+ "degree": 2,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 1,
+ "hole": 4,
+ "breath": "draw",
+ "bend": 0,
+ "overblow": false
+ }
+ ]
+ },
+ {
+ "notes": [
+ {
+ "degree": 5,
+ "accidental": 0,
+ "octave": 0,
+ "beats": 1,
+ "hole": 3,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 7,
+ "accidental": 0,
+ "octave": 0,
+ "beats": 2,
+ "hole": 3,
+ "breath": "draw",
+ "bend": 0,
+ "overblow": false
+ }
+ ]
+ },
+ {
+ "notes": [
+ {
+ "degree": 1,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 3,
+ "hole": 4,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ }
+ ],
+ "sectionEnd": true
+ }
+ ]
+ ]
+}
diff --git a/src/data/scores/good-comrade.json b/src/data/scores/good-comrade.json
new file mode 100644
index 0000000..49f72a9
--- /dev/null
+++ b/src/data/scores/good-comrade.json
@@ -0,0 +1,556 @@
+{
+ "id": "good-comrade",
+ "title": "好伙伴",
+ "subtitle": "The Good Comrade · 1927 歌集版本",
+ "composer": "民歌曲调(Folksong,所选歌集署名)",
+ "key": "C",
+ "harmonicaKey": "C",
+ "position": "第一把位",
+ "timeSignature": "4/4",
+ "tempo": 96,
+ "difficulty": 2,
+ "tags": [
+ "传统曲",
+ "西方民谣"
+ ],
+ "source": "The Everyday Song Book (1927), No.148;John Chambers ABC 转录",
+ "sourceUrl": "https://trillian.mit.edu/~jc/music/book/EverydaySongBook/148_the_Good_Comrade.abc",
+ "sourceFormat": "music-text",
+ "sourceCheckedAt": "2026-10-23",
+ "builtin": true,
+ "order": 51,
+ "notes": "13个书写小节含一拍弱起,末尾三拍互补。原文第一段末尾三拍与第二段一拍弱起接为同一完整小节;保留休止,不添加音符。 仅录主旋律,不录歌词、伴奏及异音连奏线;速度为编辑练习建议。 原 G4 主音移为 C5,所有音符整体上移 5 个半音。",
+ "lines": [
+ [
+ {
+ "notes": [
+ {
+ "degree": 5,
+ "accidental": 0,
+ "octave": 0,
+ "beats": 1,
+ "hole": 3,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ }
+ ]
+ },
+ {
+ "notes": [
+ {
+ "degree": 1,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 1,
+ "hole": 4,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 3,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 1,
+ "hole": 5,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 3,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 1,
+ "hole": 5,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 2,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 1,
+ "hole": 4,
+ "breath": "draw",
+ "bend": 0,
+ "overblow": false
+ }
+ ]
+ },
+ {
+ "notes": [
+ {
+ "degree": 1,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 2,
+ "hole": 4,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 5,
+ "accidental": 0,
+ "octave": 0,
+ "beats": 1,
+ "hole": 3,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 1,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.5,
+ "hole": 4,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 2,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.5,
+ "hole": 4,
+ "breath": "draw",
+ "bend": 0,
+ "overblow": false
+ }
+ ]
+ },
+ {
+ "notes": [
+ {
+ "degree": 3,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 1,
+ "hole": 5,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 5,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 1,
+ "hole": 6,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 5,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 1,
+ "hole": 6,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 4,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 1,
+ "hole": 5,
+ "breath": "draw",
+ "bend": 0,
+ "overblow": false
+ }
+ ]
+ },
+ {
+ "notes": [
+ {
+ "degree": 3,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 2,
+ "hole": 5,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 0,
+ "accidental": 0,
+ "octave": 0,
+ "beats": 1,
+ "hole": null,
+ "breath": null,
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 1,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.5,
+ "hole": 4,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 2,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.5,
+ "hole": 4,
+ "breath": "draw",
+ "bend": 0,
+ "overblow": false
+ }
+ ]
+ }
+ ],
+ [
+ {
+ "notes": [
+ {
+ "degree": 3,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 1,
+ "hole": 5,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 3,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 1,
+ "hole": 5,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 3,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 1,
+ "hole": 5,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 2,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 1,
+ "hole": 4,
+ "breath": "draw",
+ "bend": 0,
+ "overblow": false
+ }
+ ]
+ },
+ {
+ "notes": [
+ {
+ "degree": 3,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 1,
+ "dotted": true,
+ "hole": 5,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 4,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.5,
+ "hole": 5,
+ "breath": "draw",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 5,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 1,
+ "hole": 6,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 4,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.5,
+ "hole": 5,
+ "breath": "draw",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 3,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.5,
+ "hole": 5,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ }
+ ]
+ },
+ {
+ "notes": [
+ {
+ "degree": 2,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 1,
+ "hole": 4,
+ "breath": "draw",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 2,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 1,
+ "hole": 4,
+ "breath": "draw",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 2,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 1,
+ "hole": 4,
+ "breath": "draw",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 1,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 1,
+ "hole": 4,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ }
+ ]
+ },
+ {
+ "notes": [
+ {
+ "degree": 2,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 1,
+ "dotted": true,
+ "hole": 4,
+ "breath": "draw",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 3,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.5,
+ "hole": 5,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 4,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 1,
+ "hole": 5,
+ "breath": "draw",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 5,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 1,
+ "hole": 6,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ }
+ ]
+ }
+ ],
+ [
+ {
+ "notes": [
+ {
+ "degree": 3,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 1,
+ "hole": 5,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 3,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 1,
+ "hole": 5,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 2,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 1,
+ "hole": 4,
+ "breath": "draw",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 2,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 1,
+ "hole": 4,
+ "breath": "draw",
+ "bend": 0,
+ "overblow": false
+ }
+ ]
+ },
+ {
+ "notes": [
+ {
+ "degree": 1,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 2,
+ "hole": 4,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 2,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 2,
+ "hole": 4,
+ "breath": "draw",
+ "bend": 0,
+ "overblow": false
+ }
+ ]
+ },
+ {
+ "notes": [
+ {
+ "degree": 3,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 1,
+ "hole": 5,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 5,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 1,
+ "hole": 6,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 2,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 1,
+ "hole": 4,
+ "breath": "draw",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 2,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.5,
+ "hole": 4,
+ "breath": "draw",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 3,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.5,
+ "hole": 5,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ }
+ ]
+ },
+ {
+ "notes": [
+ {
+ "degree": 1,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 2,
+ "hole": 4,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 0,
+ "accidental": 0,
+ "octave": 0,
+ "beats": 1,
+ "hole": null,
+ "breath": null,
+ "bend": 0,
+ "overblow": false
+ }
+ ],
+ "sectionEnd": true
+ }
+ ]
+ ]
+}
diff --git a/src/data/scores/happy-birthday.json b/src/data/scores/happy-birthday.json
index 8b55d47..5f56983 100644
--- a/src/data/scores/happy-birthday.json
+++ b/src/data/scores/happy-birthday.json
@@ -8,40 +8,89 @@
"position": "第一把位",
"timeSignature": "3/4",
"tempo": 92,
+ "pickupBeats": 1,
"difficulty": 1,
"tags": [
"生日",
"入门",
"经典"
],
- "source": "黄冈师范学院音乐学院吉他教材数字简谱《祝你生日快乐》",
+ "source": "黄冈师范学院音乐学院吉他教材数字简谱《祝你生日快乐》;印刷第 28 页 / PDF 第 32 页",
"sourceUrl": "https://music.hgnu.edu.cn/_upload/article/files/09/d4/faf43ffb4e08b61cf64ee0adaf16/ec5df379-7cae-4b24-9ece-880a54ee478b.pdf",
"sourceFormat": "jianpu-image",
- "sourceCheckedAt": "2026-08-31",
+ "sourceCheckedAt": "2026-10-23",
"builtin": true,
"order": 11,
- "notes": "保留 3/4 拍弱起;应用内以两个休止拍补足首小节,演奏整体升八度。",
+ "notes": "按教材完整反复展开为 17 小节(含一拍弱起);第一结尾末拍为再次起句的两个八分 sol,第二结尾为三拍 do。移除人为前补休止,整体升八度;吉他指法不录入,速度为编辑建议。",
"lines": [
[
{
"notes": [
{
- "degree": 0,
+ "degree": 5,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.5,
+ "hole": 6,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 5,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.5,
+ "hole": 6,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ }
+ ]
+ },
+ {
+ "notes": [
+ {
+ "degree": 6,
"accidental": 0,
- "octave": 0,
+ "octave": 1,
"beats": 1,
- "hole": null,
- "breath": null,
+ "hole": 6,
+ "breath": "draw",
"bend": 0,
"overblow": false
},
{
- "degree": 0,
+ "degree": 5,
"accidental": 0,
- "octave": 0,
+ "octave": 1,
"beats": 1,
- "hole": null,
- "breath": null,
+ "hole": 6,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 1,
+ "accidental": 0,
+ "octave": 2,
+ "beats": 1,
+ "hole": 7,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ }
+ ]
+ },
+ {
+ "notes": [
+ {
+ "degree": 7,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 2,
+ "hole": 7,
+ "breath": "draw",
"bend": 0,
"overblow": false
},
@@ -67,6 +116,224 @@
}
]
},
+ {
+ "notes": [
+ {
+ "degree": 6,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 1,
+ "hole": 6,
+ "breath": "draw",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 5,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 1,
+ "hole": 6,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 2,
+ "accidental": 0,
+ "octave": 2,
+ "beats": 1,
+ "hole": 8,
+ "breath": "draw",
+ "bend": 0,
+ "overblow": false
+ }
+ ]
+ },
+ {
+ "notes": [
+ {
+ "degree": 1,
+ "accidental": 0,
+ "octave": 2,
+ "beats": 2,
+ "hole": 7,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 5,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.5,
+ "hole": 6,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 5,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.5,
+ "hole": 6,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ }
+ ]
+ }
+ ],
+ [
+ {
+ "notes": [
+ {
+ "degree": 5,
+ "accidental": 0,
+ "octave": 2,
+ "beats": 1,
+ "hole": 9,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 3,
+ "accidental": 0,
+ "octave": 2,
+ "beats": 1,
+ "hole": 8,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 1,
+ "accidental": 0,
+ "octave": 2,
+ "beats": 1,
+ "hole": 7,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ }
+ ]
+ },
+ {
+ "notes": [
+ {
+ "degree": 7,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 1,
+ "hole": 7,
+ "breath": "draw",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 6,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 1,
+ "hole": 6,
+ "breath": "draw",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 4,
+ "accidental": 0,
+ "octave": 2,
+ "beats": 0.5,
+ "hole": 9,
+ "breath": "draw",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 4,
+ "accidental": 0,
+ "octave": 2,
+ "beats": 0.5,
+ "hole": 9,
+ "breath": "draw",
+ "bend": 0,
+ "overblow": false
+ }
+ ]
+ },
+ {
+ "notes": [
+ {
+ "degree": 3,
+ "accidental": 0,
+ "octave": 2,
+ "beats": 1,
+ "hole": 8,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 1,
+ "accidental": 0,
+ "octave": 2,
+ "beats": 1,
+ "hole": 7,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 2,
+ "accidental": 0,
+ "octave": 2,
+ "beats": 1,
+ "hole": 8,
+ "breath": "draw",
+ "bend": 0,
+ "overblow": false
+ }
+ ]
+ },
+ {
+ "notes": [
+ {
+ "degree": 1,
+ "accidental": 0,
+ "octave": 2,
+ "beats": 2,
+ "hole": 7,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 5,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.5,
+ "hole": 6,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 5,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.5,
+ "hole": 6,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ }
+ ]
+ }
+ ],
+ [
{
"notes": [
{
@@ -168,9 +435,7 @@
"overblow": false
}
]
- }
- ],
- [
+ },
{
"notes": [
{
@@ -204,7 +469,9 @@
"overblow": false
}
]
- },
+ }
+ ],
+ [
{
"notes": [
{
diff --git a/src/data/scores/harvest-song.json b/src/data/scores/harvest-song.json
new file mode 100644
index 0000000..dede1e6
--- /dev/null
+++ b/src/data/scores/harvest-song.json
@@ -0,0 +1,875 @@
+{
+ "id": "harvest-song",
+ "title": "丰收之歌",
+ "subtitle": "Marken er mejet · 丹麦传统旋律",
+ "composer": "丹麦传统民歌",
+ "key": "C",
+ "harmonicaKey": "C",
+ "position": "第一把位",
+ "timeSignature": "2/4",
+ "tempo": 108,
+ "difficulty": 2,
+ "tags": [
+ "欧美民歌",
+ "入门",
+ "跳进"
+ ],
+ "source": "广东教育出版社/花城出版社《音乐三年级下册·简谱》印刷第 50–51 页(PDF 第 51–52 页),24 小节;1=Bb 移为 1=C,整体升八度适配 C 调口琴。",
+ "sourceUrl": "https://lywgyxx.szftedu.cn/xkjc/yinyue/202209/P020220910586729125995.pdf#page=51",
+ "sourceFormat": "jianpu-image",
+ "sourceCheckedAt": "2026-10-22",
+ "builtin": true,
+ "order": 16,
+ "notes": "完整录入教材两页的传统主旋律,不含译配歌词。注意开头高 do 到中音 mi 的跳进,以及结尾每次一拍休止;高音 mi 使用 8 孔吹气。",
+ "lines": [
+ [
+ {
+ "notes": [
+ {
+ "degree": 1,
+ "accidental": 0,
+ "octave": 2,
+ "beats": 1,
+ "hole": 7,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 5,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.5,
+ "hole": 6,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 3,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.5,
+ "hole": 5,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ }
+ ]
+ },
+ {
+ "notes": [
+ {
+ "degree": 1,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 1,
+ "hole": 4,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 3,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.5,
+ "hole": 5,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 5,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.5,
+ "hole": 6,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ }
+ ]
+ },
+ {
+ "notes": [
+ {
+ "degree": 1,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 1,
+ "hole": 4,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 3,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.5,
+ "hole": 5,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 5,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.5,
+ "hole": 6,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ }
+ ]
+ },
+ {
+ "notes": [
+ {
+ "degree": 1,
+ "accidental": 0,
+ "octave": 2,
+ "beats": 1,
+ "hole": 7,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 1,
+ "accidental": 0,
+ "octave": 2,
+ "beats": 1,
+ "hole": 7,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ }
+ ]
+ }
+ ],
+ [
+ {
+ "notes": [
+ {
+ "degree": 4,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.5,
+ "hole": 5,
+ "breath": "draw",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 6,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.5,
+ "hole": 6,
+ "breath": "draw",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 6,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.5,
+ "hole": 6,
+ "breath": "draw",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 6,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.5,
+ "hole": 6,
+ "breath": "draw",
+ "bend": 0,
+ "overblow": false
+ }
+ ]
+ },
+ {
+ "notes": [
+ {
+ "degree": 3,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.5,
+ "hole": 5,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 5,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.5,
+ "hole": 6,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 5,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.5,
+ "hole": 6,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 5,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.5,
+ "hole": 6,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ }
+ ]
+ },
+ {
+ "notes": [
+ {
+ "degree": 2,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.5,
+ "hole": 4,
+ "breath": "draw",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 4,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.5,
+ "hole": 5,
+ "breath": "draw",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 3,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.5,
+ "hole": 5,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 2,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.5,
+ "hole": 4,
+ "breath": "draw",
+ "bend": 0,
+ "overblow": false
+ }
+ ]
+ },
+ {
+ "notes": [
+ {
+ "degree": 1,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 1,
+ "hole": 4,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 0,
+ "accidental": 0,
+ "octave": 0,
+ "beats": 1,
+ "hole": null,
+ "breath": null,
+ "bend": 0,
+ "overblow": false
+ }
+ ]
+ }
+ ],
+ [
+ {
+ "notes": [
+ {
+ "degree": 1,
+ "accidental": 0,
+ "octave": 2,
+ "beats": 1,
+ "hole": 7,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 5,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.5,
+ "hole": 6,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 3,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.5,
+ "hole": 5,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ }
+ ]
+ },
+ {
+ "notes": [
+ {
+ "degree": 1,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 1,
+ "hole": 4,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 3,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.5,
+ "hole": 5,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 5,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.5,
+ "hole": 6,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ }
+ ]
+ },
+ {
+ "notes": [
+ {
+ "degree": 1,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 1,
+ "hole": 4,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 3,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.5,
+ "hole": 5,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 5,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.5,
+ "hole": 6,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ }
+ ]
+ },
+ {
+ "notes": [
+ {
+ "degree": 1,
+ "accidental": 0,
+ "octave": 2,
+ "beats": 1,
+ "hole": 7,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 1,
+ "accidental": 0,
+ "octave": 2,
+ "beats": 1,
+ "hole": 7,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ }
+ ]
+ }
+ ],
+ [
+ {
+ "notes": [
+ {
+ "degree": 4,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.5,
+ "hole": 5,
+ "breath": "draw",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 6,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.5,
+ "hole": 6,
+ "breath": "draw",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 6,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.5,
+ "hole": 6,
+ "breath": "draw",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 6,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.5,
+ "hole": 6,
+ "breath": "draw",
+ "bend": 0,
+ "overblow": false
+ }
+ ]
+ },
+ {
+ "notes": [
+ {
+ "degree": 3,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.5,
+ "hole": 5,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 5,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.5,
+ "hole": 6,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 5,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.5,
+ "hole": 6,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 5,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.5,
+ "hole": 6,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ }
+ ]
+ },
+ {
+ "notes": [
+ {
+ "degree": 2,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.5,
+ "hole": 4,
+ "breath": "draw",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 4,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.5,
+ "hole": 5,
+ "breath": "draw",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 3,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.5,
+ "hole": 5,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 2,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.5,
+ "hole": 4,
+ "breath": "draw",
+ "bend": 0,
+ "overblow": false
+ }
+ ]
+ },
+ {
+ "notes": [
+ {
+ "degree": 1,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 1,
+ "hole": 4,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 0,
+ "accidental": 0,
+ "octave": 0,
+ "beats": 1,
+ "hole": null,
+ "breath": null,
+ "bend": 0,
+ "overblow": false
+ }
+ ]
+ }
+ ],
+ [
+ {
+ "notes": [
+ {
+ "degree": 1,
+ "accidental": 0,
+ "octave": 2,
+ "beats": 1,
+ "hole": 7,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 1,
+ "accidental": 0,
+ "octave": 2,
+ "beats": 1,
+ "hole": 7,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ }
+ ]
+ },
+ {
+ "notes": [
+ {
+ "degree": 7,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.5,
+ "hole": 7,
+ "breath": "draw",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 2,
+ "accidental": 0,
+ "octave": 2,
+ "beats": 0.5,
+ "hole": 8,
+ "breath": "draw",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 5,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 1,
+ "hole": 6,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ }
+ ]
+ },
+ {
+ "notes": [
+ {
+ "degree": 2,
+ "accidental": 0,
+ "octave": 2,
+ "beats": 1,
+ "hole": 8,
+ "breath": "draw",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 2,
+ "accidental": 0,
+ "octave": 2,
+ "beats": 1,
+ "hole": 8,
+ "breath": "draw",
+ "bend": 0,
+ "overblow": false
+ }
+ ]
+ },
+ {
+ "notes": [
+ {
+ "degree": 1,
+ "accidental": 0,
+ "octave": 2,
+ "beats": 0.5,
+ "hole": 7,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 3,
+ "accidental": 0,
+ "octave": 2,
+ "beats": 0.5,
+ "hole": 8,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 5,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 1,
+ "hole": 6,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ }
+ ]
+ }
+ ],
+ [
+ {
+ "notes": [
+ {
+ "degree": 4,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.5,
+ "hole": 5,
+ "breath": "draw",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 6,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.5,
+ "hole": 6,
+ "breath": "draw",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 6,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.5,
+ "hole": 6,
+ "breath": "draw",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 6,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.5,
+ "hole": 6,
+ "breath": "draw",
+ "bend": 0,
+ "overblow": false
+ }
+ ]
+ },
+ {
+ "notes": [
+ {
+ "degree": 3,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.5,
+ "hole": 5,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 5,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.5,
+ "hole": 6,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 5,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.5,
+ "hole": 6,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 5,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.5,
+ "hole": 6,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ }
+ ]
+ },
+ {
+ "notes": [
+ {
+ "degree": 2,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.5,
+ "hole": 4,
+ "breath": "draw",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 4,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.5,
+ "hole": 5,
+ "breath": "draw",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 3,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.5,
+ "hole": 5,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 2,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.5,
+ "hole": 4,
+ "breath": "draw",
+ "bend": 0,
+ "overblow": false
+ }
+ ]
+ },
+ {
+ "notes": [
+ {
+ "degree": 1,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 1,
+ "hole": 4,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 0,
+ "accidental": 0,
+ "octave": 0,
+ "beats": 1,
+ "hole": null,
+ "breath": null,
+ "bend": 0,
+ "overblow": false
+ }
+ ],
+ "sectionEnd": true
+ }
+ ]
+ ]
+}
diff --git a/src/data/scores/hickory-dickory-dock.json b/src/data/scores/hickory-dickory-dock.json
new file mode 100644
index 0000000..be656ee
--- /dev/null
+++ b/src/data/scores/hickory-dickory-dock.json
@@ -0,0 +1,483 @@
+{
+ "id": "hickory-dickory-dock",
+ "title": "滴答滴答钟声响",
+ "subtitle": "Dickory, Dickory Dock · Elliott 版本",
+ "composer": "Elliott(所选歌集署名)",
+ "key": "C",
+ "harmonicaKey": "C",
+ "position": "第一把位",
+ "timeSignature": "6/8",
+ "tempo": 112,
+ "difficulty": 2,
+ "tags": [
+ "入门",
+ "儿歌"
+ ],
+ "source": "The Everyday Song Book (1927), No.19;John Chambers ABC 转录",
+ "sourceUrl": "https://trillian.mit.edu/~jc/music/book/EverydaySongBook/019_Dickory_Dickory_Dock.abc",
+ "sourceFormat": "music-text",
+ "sourceCheckedAt": "2026-10-23",
+ "builtin": true,
+ "order": 46,
+ "notes": "采用歌集署名 Elliott 的旋律版本;完整8小节,保留逐个八分休止及第6小节附点四分 la。请按六八拍分组,不将休止合并成连音。 仅录主旋律,不录歌词、伴奏及异音连奏线;速度为编辑练习建议。 原 F4 主音移为 C5,所有音符整体上移 7 个半音。",
+ "lines": [
+ [
+ {
+ "notes": [
+ {
+ "degree": 3,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.5,
+ "hole": 5,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 4,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.5,
+ "hole": 5,
+ "breath": "draw",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 5,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.5,
+ "hole": 6,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 4,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.5,
+ "hole": 5,
+ "breath": "draw",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 5,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.5,
+ "hole": 6,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 2,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.5,
+ "hole": 4,
+ "breath": "draw",
+ "bend": 0,
+ "overblow": false
+ }
+ ]
+ },
+ {
+ "notes": [
+ {
+ "degree": 3,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.5,
+ "hole": 5,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 0,
+ "accidental": 0,
+ "octave": 0,
+ "beats": 0.5,
+ "hole": null,
+ "breath": null,
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 0,
+ "accidental": 0,
+ "octave": 0,
+ "beats": 0.5,
+ "hole": null,
+ "breath": null,
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 0,
+ "accidental": 0,
+ "octave": 0,
+ "beats": 1,
+ "hole": null,
+ "breath": null,
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 3,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.5,
+ "hole": 5,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ }
+ ]
+ },
+ {
+ "notes": [
+ {
+ "degree": 3,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.5,
+ "hole": 5,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 0,
+ "accidental": 0,
+ "octave": 0,
+ "beats": 0.5,
+ "hole": null,
+ "breath": null,
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 5,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.5,
+ "hole": 6,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 4,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.5,
+ "hole": 5,
+ "breath": "draw",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 0,
+ "accidental": 0,
+ "octave": 0,
+ "beats": 0.5,
+ "hole": null,
+ "breath": null,
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 2,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.5,
+ "hole": 4,
+ "breath": "draw",
+ "bend": 0,
+ "overblow": false
+ }
+ ]
+ },
+ {
+ "notes": [
+ {
+ "degree": 3,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.5,
+ "hole": 5,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 0,
+ "accidental": 0,
+ "octave": 0,
+ "beats": 0.5,
+ "hole": null,
+ "breath": null,
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 0,
+ "accidental": 0,
+ "octave": 0,
+ "beats": 0.5,
+ "hole": null,
+ "breath": null,
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 0,
+ "accidental": 0,
+ "octave": 0,
+ "beats": 1,
+ "hole": null,
+ "breath": null,
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 3,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.5,
+ "hole": 5,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ }
+ ]
+ }
+ ],
+ [
+ {
+ "notes": [
+ {
+ "degree": 3,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.5,
+ "hole": 5,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 0,
+ "accidental": 0,
+ "octave": 0,
+ "beats": 0.5,
+ "hole": null,
+ "breath": null,
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 3,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.5,
+ "hole": 5,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 5,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 1,
+ "hole": 6,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 5,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.5,
+ "hole": 6,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ }
+ ]
+ },
+ {
+ "notes": [
+ {
+ "degree": 4,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.5,
+ "hole": 5,
+ "breath": "draw",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 0,
+ "accidental": 0,
+ "octave": 0,
+ "beats": 0.5,
+ "hole": null,
+ "breath": null,
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 4,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.5,
+ "hole": 5,
+ "breath": "draw",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 6,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 1,
+ "dotted": true,
+ "hole": 6,
+ "breath": "draw",
+ "bend": 0,
+ "overblow": false
+ }
+ ]
+ },
+ {
+ "notes": [
+ {
+ "degree": 5,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.5,
+ "hole": 6,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 6,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.5,
+ "hole": 6,
+ "breath": "draw",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 5,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.5,
+ "hole": 6,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 4,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.5,
+ "hole": 5,
+ "breath": "draw",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 3,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.5,
+ "hole": 5,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 2,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.5,
+ "hole": 4,
+ "breath": "draw",
+ "bend": 0,
+ "overblow": false
+ }
+ ]
+ },
+ {
+ "notes": [
+ {
+ "degree": 1,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.5,
+ "hole": 4,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 0,
+ "accidental": 0,
+ "octave": 0,
+ "beats": 0.5,
+ "hole": null,
+ "breath": null,
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 0,
+ "accidental": 0,
+ "octave": 0,
+ "beats": 0.5,
+ "hole": null,
+ "breath": null,
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 0,
+ "accidental": 0,
+ "octave": 0,
+ "beats": 1,
+ "hole": null,
+ "breath": null,
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 0,
+ "accidental": 0,
+ "octave": 0,
+ "beats": 0.5,
+ "hole": null,
+ "breath": null,
+ "bend": 0,
+ "overblow": false
+ }
+ ],
+ "sectionEnd": true
+ }
+ ]
+ ]
+}
diff --git a/src/data/scores/home-on-the-range.json b/src/data/scores/home-on-the-range.json
new file mode 100644
index 0000000..7999b9b
--- /dev/null
+++ b/src/data/scores/home-on-the-range.json
@@ -0,0 +1,990 @@
+{
+ "id": "home-on-the-range",
+ "title": "牧场上的家",
+ "subtitle": "Home on the Range · 教材主副歌",
+ "composer": "美国传统民歌",
+ "key": "C",
+ "harmonicaKey": "C",
+ "position": "第一把位",
+ "timeSignature": "3/4",
+ "tempo": 88,
+ "difficulty": 3,
+ "tags": [
+ "西方歌曲",
+ "三拍子",
+ "弱起",
+ "延音"
+ ],
+ "source": "粤教花城《音乐四年级下册·简谱》印刷第35页/PDF第36页,完整主歌与副歌,共33个写出小节(含一拍弱起)。原1=Eb改为1=C后整体提高八度。",
+ "sourceUrl": "https://lywgyxx.szftedu.cn/xkjc/yinyue/202209/P020220910587435677420.pdf#page=36",
+ "sourceFormat": "jianpu-image",
+ "sourceCheckedAt": "2026-10-23",
+ "builtin": true,
+ "order": 41,
+ "notes": "开头一拍与结尾两拍互补。保留长音跨小节延音、主副歌过渡和低音区;音域G4–G5,低la使用3孔吸压全音。省略译词、力度和异音连奏线,速度为练习建议。",
+ "lines": [
+ [
+ {
+ "notes": [
+ {
+ "degree": 5,
+ "accidental": 0,
+ "octave": 0,
+ "beats": 0.5,
+ "hole": 3,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 5,
+ "accidental": 0,
+ "octave": 0,
+ "beats": 0.5,
+ "hole": 3,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ }
+ ]
+ },
+ {
+ "notes": [
+ {
+ "degree": 5,
+ "accidental": 0,
+ "octave": 0,
+ "beats": 1,
+ "hole": 3,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 1,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 1,
+ "hole": 4,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 2,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 1,
+ "hole": 4,
+ "breath": "draw",
+ "bend": 0,
+ "overblow": false
+ }
+ ]
+ },
+ {
+ "notes": [
+ {
+ "degree": 3,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 2,
+ "hole": 5,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 1,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.5,
+ "hole": 4,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 7,
+ "accidental": 0,
+ "octave": 0,
+ "beats": 0.5,
+ "hole": 3,
+ "breath": "draw",
+ "bend": 0,
+ "overblow": false
+ }
+ ]
+ },
+ {
+ "notes": [
+ {
+ "degree": 6,
+ "accidental": 0,
+ "octave": 0,
+ "beats": 1,
+ "hole": 3,
+ "breath": "draw",
+ "bend": 2,
+ "overblow": false
+ },
+ {
+ "degree": 4,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 1,
+ "hole": 5,
+ "breath": "draw",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 4,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 1,
+ "hole": 5,
+ "breath": "draw",
+ "bend": 0,
+ "overblow": false
+ }
+ ]
+ },
+ {
+ "notes": [
+ {
+ "degree": 4,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 2,
+ "hole": 5,
+ "breath": "draw",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 4,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.5,
+ "hole": 5,
+ "breath": "draw",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 4,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.5,
+ "hole": 5,
+ "breath": "draw",
+ "bend": 0,
+ "overblow": false
+ }
+ ]
+ },
+ {
+ "notes": [
+ {
+ "degree": 5,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 2,
+ "hole": 6,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 1,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 1,
+ "hole": 4,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ }
+ ]
+ }
+ ],
+ [
+ {
+ "notes": [
+ {
+ "degree": 1,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 1,
+ "hole": 4,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 7,
+ "accidental": 0,
+ "octave": 0,
+ "beats": 1,
+ "hole": 3,
+ "breath": "draw",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 1,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 1,
+ "hole": 4,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ }
+ ]
+ },
+ {
+ "notes": [
+ {
+ "degree": 2,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 3,
+ "tie": true,
+ "hole": 4,
+ "breath": "draw",
+ "bend": 0,
+ "overblow": false
+ }
+ ]
+ },
+ {
+ "notes": [
+ {
+ "degree": 2,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 2,
+ "hole": 4,
+ "breath": "draw",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 5,
+ "accidental": 0,
+ "octave": 0,
+ "beats": 0.5,
+ "hole": 3,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 5,
+ "accidental": 0,
+ "octave": 0,
+ "beats": 0.5,
+ "hole": 3,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ }
+ ]
+ },
+ {
+ "notes": [
+ {
+ "degree": 5,
+ "accidental": 0,
+ "octave": 0,
+ "beats": 1,
+ "hole": 3,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 1,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 1,
+ "hole": 4,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 2,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 1,
+ "hole": 4,
+ "breath": "draw",
+ "bend": 0,
+ "overblow": false
+ }
+ ]
+ },
+ {
+ "notes": [
+ {
+ "degree": 3,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 2,
+ "hole": 5,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 1,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.5,
+ "hole": 4,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 7,
+ "accidental": 0,
+ "octave": 0,
+ "beats": 0.5,
+ "hole": 3,
+ "breath": "draw",
+ "bend": 0,
+ "overblow": false
+ }
+ ]
+ },
+ {
+ "notes": [
+ {
+ "degree": 6,
+ "accidental": 0,
+ "octave": 0,
+ "beats": 1,
+ "hole": 3,
+ "breath": "draw",
+ "bend": 2,
+ "overblow": false
+ },
+ {
+ "degree": 4,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 1,
+ "hole": 5,
+ "breath": "draw",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 4,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 1,
+ "hole": 5,
+ "breath": "draw",
+ "bend": 0,
+ "overblow": false
+ }
+ ]
+ }
+ ],
+ [
+ {
+ "notes": [
+ {
+ "degree": 4,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 2,
+ "hole": 5,
+ "breath": "draw",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 4,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.5,
+ "hole": 5,
+ "breath": "draw",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 4,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.5,
+ "hole": 5,
+ "breath": "draw",
+ "bend": 0,
+ "overblow": false
+ }
+ ]
+ },
+ {
+ "notes": [
+ {
+ "degree": 3,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 1,
+ "dotted": true,
+ "hole": 5,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 2,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.5,
+ "hole": 4,
+ "breath": "draw",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 1,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 1,
+ "hole": 4,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ }
+ ]
+ },
+ {
+ "notes": [
+ {
+ "degree": 7,
+ "accidental": 0,
+ "octave": 0,
+ "beats": 1,
+ "hole": 3,
+ "breath": "draw",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 1,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 1,
+ "hole": 4,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 2,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 1,
+ "hole": 4,
+ "breath": "draw",
+ "bend": 0,
+ "overblow": false
+ }
+ ]
+ },
+ {
+ "notes": [
+ {
+ "degree": 1,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 3,
+ "tie": true,
+ "hole": 4,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ }
+ ]
+ },
+ {
+ "notes": [
+ {
+ "degree": 1,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 3,
+ "hole": 4,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ }
+ ]
+ },
+ {
+ "notes": [
+ {
+ "degree": 5,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 3,
+ "hole": 6,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ }
+ ]
+ }
+ ],
+ [
+ {
+ "notes": [
+ {
+ "degree": 4,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 1,
+ "hole": 5,
+ "breath": "draw",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 3,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 1,
+ "dotted": true,
+ "hole": 5,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 2,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.5,
+ "hole": 4,
+ "breath": "draw",
+ "bend": 0,
+ "overblow": false
+ }
+ ]
+ },
+ {
+ "notes": [
+ {
+ "degree": 3,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 3,
+ "tie": true,
+ "hole": 5,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ }
+ ]
+ },
+ {
+ "notes": [
+ {
+ "degree": 3,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 2,
+ "hole": 5,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 2,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.5,
+ "hole": 4,
+ "breath": "draw",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 2,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.5,
+ "hole": 4,
+ "breath": "draw",
+ "bend": 0,
+ "overblow": false
+ }
+ ]
+ },
+ {
+ "notes": [
+ {
+ "degree": 1,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 1,
+ "hole": 4,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 1,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 1,
+ "hole": 4,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 1,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 1,
+ "hole": 4,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ }
+ ]
+ },
+ {
+ "notes": [
+ {
+ "degree": 1,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 1,
+ "hole": 4,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 7,
+ "accidental": 0,
+ "octave": 0,
+ "beats": 1,
+ "hole": 3,
+ "breath": "draw",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 1,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 1,
+ "hole": 4,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ }
+ ]
+ }
+ ],
+ [
+ {
+ "notes": [
+ {
+ "degree": 2,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 3,
+ "tie": true,
+ "hole": 4,
+ "breath": "draw",
+ "bend": 0,
+ "overblow": false
+ }
+ ]
+ },
+ {
+ "notes": [
+ {
+ "degree": 2,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 2,
+ "hole": 4,
+ "breath": "draw",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 5,
+ "accidental": 0,
+ "octave": 0,
+ "beats": 0.5,
+ "hole": 3,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 5,
+ "accidental": 0,
+ "octave": 0,
+ "beats": 0.5,
+ "hole": 3,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ }
+ ]
+ },
+ {
+ "notes": [
+ {
+ "degree": 5,
+ "accidental": 0,
+ "octave": 0,
+ "beats": 1,
+ "hole": 3,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 1,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 1,
+ "hole": 4,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 2,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 1,
+ "hole": 4,
+ "breath": "draw",
+ "bend": 0,
+ "overblow": false
+ }
+ ]
+ },
+ {
+ "notes": [
+ {
+ "degree": 3,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 2,
+ "hole": 5,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 1,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.5,
+ "hole": 4,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 7,
+ "accidental": 0,
+ "octave": 0,
+ "beats": 0.5,
+ "hole": 3,
+ "breath": "draw",
+ "bend": 0,
+ "overblow": false
+ }
+ ]
+ },
+ {
+ "notes": [
+ {
+ "degree": 6,
+ "accidental": 0,
+ "octave": 0,
+ "beats": 1,
+ "hole": 3,
+ "breath": "draw",
+ "bend": 2,
+ "overblow": false
+ },
+ {
+ "degree": 4,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 1,
+ "hole": 5,
+ "breath": "draw",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 4,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 1,
+ "hole": 5,
+ "breath": "draw",
+ "bend": 0,
+ "overblow": false
+ }
+ ]
+ }
+ ],
+ [
+ {
+ "notes": [
+ {
+ "degree": 4,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 2,
+ "hole": 5,
+ "breath": "draw",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 4,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.5,
+ "hole": 5,
+ "breath": "draw",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 4,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.5,
+ "hole": 5,
+ "breath": "draw",
+ "bend": 0,
+ "overblow": false
+ }
+ ]
+ },
+ {
+ "notes": [
+ {
+ "degree": 3,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 1,
+ "dotted": true,
+ "hole": 5,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 2,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.5,
+ "hole": 4,
+ "breath": "draw",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 1,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 1,
+ "hole": 4,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ }
+ ]
+ },
+ {
+ "notes": [
+ {
+ "degree": 7,
+ "accidental": 0,
+ "octave": 0,
+ "beats": 1,
+ "hole": 3,
+ "breath": "draw",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 1,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 1,
+ "hole": 4,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 2,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 1,
+ "hole": 4,
+ "breath": "draw",
+ "bend": 0,
+ "overblow": false
+ }
+ ]
+ },
+ {
+ "notes": [
+ {
+ "degree": 1,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 3,
+ "tie": true,
+ "hole": 4,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ }
+ ]
+ },
+ {
+ "notes": [
+ {
+ "degree": 1,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 2,
+ "hole": 4,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ }
+ ],
+ "sectionEnd": true
+ }
+ ]
+ ]
+}
diff --git a/src/data/scores/hong-yan.json b/src/data/scores/hong-yan.json
new file mode 100644
index 0000000..fd11791
--- /dev/null
+++ b/src/data/scores/hong-yan.json
@@ -0,0 +1,913 @@
+{
+ "id": "hong-yan",
+ "title": "鸿雁",
+ "subtitle": "乌拉特民歌曲调 · 教材旋律版",
+ "composer": "蒙古族民歌",
+ "key": "C",
+ "harmonicaKey": "C",
+ "position": "第四把位",
+ "timeSignature": "4/4",
+ "tempo": 64,
+ "difficulty": 3,
+ "tags": [
+ "中国民歌",
+ "蒙古族",
+ "前倚音",
+ "延长记号"
+ ],
+ "source": "粤教花城《音乐五年级上册·简谱》印刷第40页/PDF第41页,署蒙古族民歌;采用教材旋律及结束句,共16个写出小节,前8小节反复。原1=D改为1=C后整体提高八度。",
+ "sourceUrl": "https://lywgyxx.szftedu.cn/xkjc/yinyue/202209/P020220910587728087297.pdf#page=41",
+ "sourceFormat": "jianpu-image",
+ "sourceCheckedAt": "2026-10-23",
+ "builtin": true,
+ "order": 43,
+ "notes": "仅录主旋律,不收录吕燕卫歌词或张宏光伴奏编配。保留6处前倚音(单音为八分形状,三音组为十六分形状)、跨行同音延音与最后结束句mi上的自由延长记号。音域G4–C6,低la为3孔吸压全音;延长记号不固定增加拍数。省略异音连奏线,速度为练习建议。",
+ "lines": [
+ [
+ {
+ "notes": [
+ {
+ "degree": 2,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.5,
+ "hole": 4,
+ "breath": "draw",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 3,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.5,
+ "hole": 5,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 1,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.5,
+ "hole": 4,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 6,
+ "accidental": 0,
+ "octave": 0,
+ "beats": 0.5,
+ "hole": 3,
+ "breath": "draw",
+ "bend": 2,
+ "overblow": false
+ },
+ {
+ "degree": 5,
+ "accidental": 0,
+ "octave": 0,
+ "beats": 2,
+ "hole": 3,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ }
+ ],
+ "repeatBegin": true
+ },
+ {
+ "notes": [
+ {
+ "degree": 5,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 1,
+ "hole": 6,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 6,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.5,
+ "dotted": true,
+ "hole": 6,
+ "breath": "draw",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 1,
+ "accidental": 0,
+ "octave": 2,
+ "beats": 0.25,
+ "hole": 7,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 6,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 2,
+ "hole": 6,
+ "breath": "draw",
+ "bend": 0,
+ "overblow": false
+ }
+ ]
+ },
+ {
+ "notes": [
+ {
+ "degree": 6,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 1,
+ "hole": 6,
+ "breath": "draw",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 5,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.5,
+ "hole": 6,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 3,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.5,
+ "hole": 5,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 1,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.5,
+ "hole": 4,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 2,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.5,
+ "hole": 4,
+ "breath": "draw",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 5,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.5,
+ "hole": 6,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 3,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.5,
+ "tie": true,
+ "hole": 5,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ }
+ ]
+ }
+ ],
+ [
+ {
+ "notes": [
+ {
+ "degree": 3,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.5,
+ "hole": 5,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 2,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.5,
+ "tie": true,
+ "hole": 4,
+ "breath": "draw",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 2,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 3,
+ "hole": 4,
+ "breath": "draw",
+ "bend": 0,
+ "overblow": false
+ }
+ ]
+ },
+ {
+ "notes": [
+ {
+ "degree": 5,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 1,
+ "hole": 6,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 6,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.5,
+ "dotted": true,
+ "hole": 6,
+ "breath": "draw",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 1,
+ "accidental": 0,
+ "octave": 2,
+ "beats": 0.25,
+ "hole": 7,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 6,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 2,
+ "hole": 6,
+ "breath": "draw",
+ "bend": 0,
+ "overblow": false
+ }
+ ]
+ },
+ {
+ "notes": [
+ {
+ "degree": 2,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.5,
+ "hole": 4,
+ "breath": "draw",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 3,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.5,
+ "hole": 5,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 1,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.5,
+ "hole": 4,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 6,
+ "accidental": 0,
+ "octave": 0,
+ "beats": 0.5,
+ "hole": 3,
+ "breath": "draw",
+ "bend": 2,
+ "overblow": false
+ },
+ {
+ "degree": 5,
+ "accidental": 0,
+ "octave": 0,
+ "beats": 2,
+ "hole": 3,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ }
+ ]
+ }
+ ],
+ [
+ {
+ "notes": [
+ {
+ "degree": 3,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 1,
+ "hole": 5,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 1,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.5,
+ "hole": 4,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 6,
+ "accidental": 0,
+ "octave": 0,
+ "beats": 0.5,
+ "hole": 3,
+ "breath": "draw",
+ "bend": 2,
+ "overblow": false
+ },
+ {
+ "degree": 5,
+ "accidental": 0,
+ "octave": 0,
+ "beats": 0.5,
+ "hole": 3,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 6,
+ "accidental": 0,
+ "octave": 0,
+ "beats": 0.5,
+ "hole": 3,
+ "breath": "draw",
+ "bend": 2,
+ "overblow": false
+ },
+ {
+ "degree": 3,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 1,
+ "graceNotes": [
+ {
+ "degree": 6,
+ "accidental": 0,
+ "octave": 0,
+ "beats": 0.5,
+ "hole": 3,
+ "breath": "draw",
+ "bend": 2,
+ "overblow": false
+ }
+ ],
+ "hole": 5,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ }
+ ]
+ },
+ {
+ "notes": [
+ {
+ "degree": 6,
+ "accidental": 0,
+ "octave": 0,
+ "beats": 4,
+ "graceNotes": [
+ {
+ "degree": 1,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.25,
+ "hole": 4,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 2,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.25,
+ "hole": 4,
+ "breath": "draw",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 1,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.25,
+ "hole": 4,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ }
+ ],
+ "hole": 3,
+ "breath": "draw",
+ "bend": 2,
+ "overblow": false
+ }
+ ],
+ "repeatEnd": true
+ }
+ ],
+ [
+ {
+ "notes": [
+ {
+ "degree": 5,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 1,
+ "hole": 6,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 6,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.5,
+ "dotted": true,
+ "hole": 6,
+ "breath": "draw",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 1,
+ "accidental": 0,
+ "octave": 2,
+ "beats": 0.25,
+ "hole": 7,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 6,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 2,
+ "hole": 6,
+ "breath": "draw",
+ "bend": 0,
+ "overblow": false
+ }
+ ]
+ },
+ {
+ "notes": [
+ {
+ "degree": 2,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.5,
+ "hole": 4,
+ "breath": "draw",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 3,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.5,
+ "hole": 5,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 1,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.5,
+ "hole": 4,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 6,
+ "accidental": 0,
+ "octave": 0,
+ "beats": 0.5,
+ "hole": 3,
+ "breath": "draw",
+ "bend": 2,
+ "overblow": false
+ },
+ {
+ "degree": 5,
+ "accidental": 0,
+ "octave": 0,
+ "beats": 2,
+ "hole": 3,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ }
+ ]
+ },
+ {
+ "notes": [
+ {
+ "degree": 3,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 1,
+ "hole": 5,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 1,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.5,
+ "hole": 4,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 6,
+ "accidental": 0,
+ "octave": 0,
+ "beats": 0.5,
+ "hole": 3,
+ "breath": "draw",
+ "bend": 2,
+ "overblow": false
+ },
+ {
+ "degree": 5,
+ "accidental": 0,
+ "octave": 0,
+ "beats": 0.5,
+ "hole": 3,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 6,
+ "accidental": 0,
+ "octave": 0,
+ "beats": 0.5,
+ "hole": 3,
+ "breath": "draw",
+ "bend": 2,
+ "overblow": false
+ },
+ {
+ "degree": 3,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 1,
+ "graceNotes": [
+ {
+ "degree": 6,
+ "accidental": 0,
+ "octave": 0,
+ "beats": 0.5,
+ "hole": 3,
+ "breath": "draw",
+ "bend": 2,
+ "overblow": false
+ }
+ ],
+ "hole": 5,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ }
+ ]
+ },
+ {
+ "notes": [
+ {
+ "degree": 6,
+ "accidental": 0,
+ "octave": 0,
+ "beats": 4,
+ "graceNotes": [
+ {
+ "degree": 1,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.25,
+ "hole": 4,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 2,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.25,
+ "hole": 4,
+ "breath": "draw",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 1,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.25,
+ "hole": 4,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ }
+ ],
+ "hole": 3,
+ "breath": "draw",
+ "bend": 2,
+ "overblow": false
+ }
+ ]
+ }
+ ],
+ [
+ {
+ "notes": [
+ {
+ "degree": 5,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 1,
+ "hole": 6,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 6,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.5,
+ "dotted": true,
+ "hole": 6,
+ "breath": "draw",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 1,
+ "accidental": 0,
+ "octave": 2,
+ "beats": 0.25,
+ "hole": 7,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 6,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 2,
+ "hole": 6,
+ "breath": "draw",
+ "bend": 0,
+ "overblow": false
+ }
+ ]
+ },
+ {
+ "notes": [
+ {
+ "degree": 2,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.5,
+ "hole": 4,
+ "breath": "draw",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 3,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.5,
+ "hole": 5,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 1,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.5,
+ "hole": 4,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 6,
+ "accidental": 0,
+ "octave": 0,
+ "beats": 0.5,
+ "hole": 3,
+ "breath": "draw",
+ "bend": 2,
+ "overblow": false
+ },
+ {
+ "degree": 5,
+ "accidental": 0,
+ "octave": 0,
+ "beats": 2,
+ "hole": 3,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ }
+ ]
+ },
+ {
+ "notes": [
+ {
+ "degree": 3,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 1,
+ "hole": 5,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 1,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.5,
+ "hole": 4,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 6,
+ "accidental": 0,
+ "octave": 0,
+ "beats": 0.5,
+ "hole": 3,
+ "breath": "draw",
+ "bend": 2,
+ "overblow": false
+ },
+ {
+ "degree": 5,
+ "accidental": 0,
+ "octave": 0,
+ "beats": 0.5,
+ "hole": 3,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 6,
+ "accidental": 0,
+ "octave": 0,
+ "beats": 0.5,
+ "hole": 3,
+ "breath": "draw",
+ "bend": 2,
+ "overblow": false
+ },
+ {
+ "degree": 3,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 1,
+ "fermata": true,
+ "graceNotes": [
+ {
+ "degree": 6,
+ "accidental": 0,
+ "octave": 0,
+ "beats": 0.5,
+ "hole": 3,
+ "breath": "draw",
+ "bend": 2,
+ "overblow": false
+ }
+ ],
+ "hole": 5,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ }
+ ]
+ },
+ {
+ "notes": [
+ {
+ "degree": 6,
+ "accidental": 0,
+ "octave": 0,
+ "beats": 4,
+ "graceNotes": [
+ {
+ "degree": 1,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.25,
+ "hole": 4,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 2,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.25,
+ "hole": 4,
+ "breath": "draw",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 1,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.25,
+ "hole": 4,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ }
+ ],
+ "hole": 3,
+ "breath": "draw",
+ "bend": 2,
+ "overblow": false
+ }
+ ],
+ "sectionEnd": true
+ }
+ ]
+ ]
+}
diff --git a/src/data/scores/hunting-we-will-go.json b/src/data/scores/hunting-we-will-go.json
new file mode 100644
index 0000000..77171f6
--- /dev/null
+++ b/src/data/scores/hunting-we-will-go.json
@@ -0,0 +1,1028 @@
+{
+ "id": "hunting-we-will-go",
+ "title": "我们去狩猎",
+ "subtitle": "A Hunting We Will Go · 英格兰传统曲",
+ "composer": "英格兰传统曲(歌集地域署名)",
+ "key": "C",
+ "harmonicaKey": "C",
+ "position": "第一把位",
+ "timeSignature": "6/8",
+ "tempo": 96,
+ "difficulty": 2,
+ "tags": [
+ "传统曲",
+ "西方民谣",
+ "延长记号"
+ ],
+ "source": "The Everyday Song Book (1927), No.188;John Chambers ABC 转录 (2017)",
+ "sourceUrl": "https://trillian.mit.edu/~jc/music/book/EverydaySongBook/188_A_Hunting_We_Will_Go.abc",
+ "sourceFormat": "music-text",
+ "sourceCheckedAt": "2026-10-23",
+ "builtin": true,
+ "order": 60,
+ "notes": "原C4主音提高一八度至C5;21个书写小节,半拍弱起与末小节2.5拍互补。保留6处同音延音、2处自由延长及附点八分与十六分组合。C5–F6均有自然音孔位,入门后可练习复拍子与附点节奏。 不收录歌词和异音连奏线;速度为编辑练习建议,核对针对所列ABC版本。",
+ "lines": [
+ [
+ {
+ "notes": [
+ {
+ "degree": 5,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.25,
+ "tie": true,
+ "hole": 6,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 5,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.25,
+ "hole": 6,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ }
+ ]
+ },
+ {
+ "notes": [
+ {
+ "degree": 1,
+ "accidental": 0,
+ "octave": 2,
+ "beats": 1,
+ "hole": 7,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 1,
+ "accidental": 0,
+ "octave": 2,
+ "beats": 0.5,
+ "hole": 7,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 5,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 1,
+ "hole": 6,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 5,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.5,
+ "hole": 6,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ }
+ ]
+ },
+ {
+ "notes": [
+ {
+ "degree": 3,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.5,
+ "dotted": true,
+ "hole": 5,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 2,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.25,
+ "hole": 4,
+ "breath": "draw",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 3,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.5,
+ "hole": 5,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 1,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 1,
+ "hole": 4,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 5,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.5,
+ "hole": 6,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ }
+ ]
+ },
+ {
+ "notes": [
+ {
+ "degree": 6,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 1,
+ "hole": 6,
+ "breath": "draw",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 5,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.5,
+ "hole": 6,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 4,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.5,
+ "dotted": true,
+ "hole": 5,
+ "breath": "draw",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 3,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.25,
+ "hole": 5,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 4,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.5,
+ "hole": 5,
+ "breath": "draw",
+ "bend": 0,
+ "overblow": false
+ }
+ ]
+ },
+ {
+ "notes": [
+ {
+ "degree": 3,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 1,
+ "dotted": true,
+ "tie": true,
+ "hole": 5,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 3,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 1,
+ "hole": 5,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 1,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.5,
+ "hole": 4,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ }
+ ]
+ }
+ ],
+ [
+ {
+ "notes": [
+ {
+ "degree": 5,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 1,
+ "hole": 6,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 5,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.5,
+ "hole": 6,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 6,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 1,
+ "hole": 6,
+ "breath": "draw",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 6,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.5,
+ "hole": 6,
+ "breath": "draw",
+ "bend": 0,
+ "overblow": false
+ }
+ ]
+ },
+ {
+ "notes": [
+ {
+ "degree": 7,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.5,
+ "dotted": true,
+ "hole": 7,
+ "breath": "draw",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 6,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.25,
+ "hole": 6,
+ "breath": "draw",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 7,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.5,
+ "hole": 7,
+ "breath": "draw",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 5,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 1,
+ "hole": 6,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 5,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.5,
+ "hole": 6,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ }
+ ]
+ },
+ {
+ "notes": [
+ {
+ "degree": 1,
+ "accidental": 0,
+ "octave": 2,
+ "beats": 1,
+ "hole": 7,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 1,
+ "accidental": 0,
+ "octave": 2,
+ "beats": 0.5,
+ "hole": 7,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 2,
+ "accidental": 0,
+ "octave": 2,
+ "beats": 1,
+ "hole": 8,
+ "breath": "draw",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 2,
+ "accidental": 0,
+ "octave": 2,
+ "beats": 0.5,
+ "hole": 8,
+ "breath": "draw",
+ "bend": 0,
+ "overblow": false
+ }
+ ]
+ },
+ {
+ "notes": [
+ {
+ "degree": 3,
+ "accidental": 0,
+ "octave": 2,
+ "beats": 0.5,
+ "dotted": true,
+ "hole": 8,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 2,
+ "accidental": 0,
+ "octave": 2,
+ "beats": 0.25,
+ "hole": 8,
+ "breath": "draw",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 3,
+ "accidental": 0,
+ "octave": 2,
+ "beats": 0.5,
+ "hole": 8,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 1,
+ "accidental": 0,
+ "octave": 2,
+ "beats": 1,
+ "hole": 7,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 5,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.5,
+ "hole": 6,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ }
+ ]
+ },
+ {
+ "notes": [
+ {
+ "degree": 6,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.5,
+ "hole": 6,
+ "breath": "draw",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 7,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.5,
+ "hole": 7,
+ "breath": "draw",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 1,
+ "accidental": 0,
+ "octave": 2,
+ "beats": 0.5,
+ "hole": 7,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 2,
+ "accidental": 0,
+ "octave": 2,
+ "beats": 0.5,
+ "hole": 8,
+ "breath": "draw",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 3,
+ "accidental": 0,
+ "octave": 2,
+ "beats": 0.5,
+ "hole": 8,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 4,
+ "accidental": 0,
+ "octave": 2,
+ "beats": 0.5,
+ "hole": 9,
+ "breath": "draw",
+ "bend": 0,
+ "overblow": false
+ }
+ ]
+ }
+ ],
+ [
+ {
+ "notes": [
+ {
+ "degree": 5,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.5,
+ "hole": 6,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 6,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.5,
+ "hole": 6,
+ "breath": "draw",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 7,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.5,
+ "hole": 7,
+ "breath": "draw",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 1,
+ "accidental": 0,
+ "octave": 2,
+ "beats": 1,
+ "fermata": true,
+ "hole": 7,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 3,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.5,
+ "hole": 5,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ }
+ ]
+ },
+ {
+ "notes": [
+ {
+ "degree": 4,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.5,
+ "dotted": true,
+ "hole": 5,
+ "breath": "draw",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 3,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.25,
+ "hole": 5,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 4,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.5,
+ "hole": 5,
+ "breath": "draw",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 5,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 1,
+ "hole": 6,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 5,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.5,
+ "hole": 6,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ }
+ ]
+ },
+ {
+ "notes": [
+ {
+ "degree": 1,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 1,
+ "dotted": true,
+ "tie": true,
+ "hole": 4,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 1,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.5,
+ "hole": 4,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 3,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.5,
+ "hole": 5,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 1,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.5,
+ "hole": 4,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ }
+ ]
+ },
+ {
+ "notes": [
+ {
+ "degree": 5,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 1,
+ "hole": 6,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 5,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.5,
+ "hole": 6,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 5,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 1,
+ "hole": 6,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 5,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.5,
+ "hole": 6,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ }
+ ]
+ },
+ {
+ "notes": [
+ {
+ "degree": 5,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 1,
+ "dotted": true,
+ "tie": true,
+ "hole": 6,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 5,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 1,
+ "hole": 6,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 5,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.5,
+ "hole": 6,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ }
+ ]
+ }
+ ],
+ [
+ {
+ "notes": [
+ {
+ "degree": 1,
+ "accidental": 0,
+ "octave": 2,
+ "beats": 1,
+ "hole": 7,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 1,
+ "accidental": 0,
+ "octave": 2,
+ "beats": 0.5,
+ "hole": 7,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 1,
+ "accidental": 0,
+ "octave": 2,
+ "beats": 1,
+ "hole": 7,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 1,
+ "accidental": 0,
+ "octave": 2,
+ "beats": 0.5,
+ "hole": 7,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ }
+ ]
+ },
+ {
+ "notes": [
+ {
+ "degree": 1,
+ "accidental": 0,
+ "octave": 2,
+ "beats": 1,
+ "dotted": true,
+ "tie": true,
+ "hole": 7,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 1,
+ "accidental": 0,
+ "octave": 2,
+ "beats": 1,
+ "hole": 7,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 5,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.5,
+ "hole": 6,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ }
+ ]
+ },
+ {
+ "notes": [
+ {
+ "degree": 6,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.5,
+ "hole": 6,
+ "breath": "draw",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 7,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.5,
+ "hole": 7,
+ "breath": "draw",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 1,
+ "accidental": 0,
+ "octave": 2,
+ "beats": 0.5,
+ "hole": 7,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 2,
+ "accidental": 0,
+ "octave": 2,
+ "beats": 0.5,
+ "hole": 8,
+ "breath": "draw",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 3,
+ "accidental": 0,
+ "octave": 2,
+ "beats": 0.5,
+ "hole": 8,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 4,
+ "accidental": 0,
+ "octave": 2,
+ "beats": 0.5,
+ "hole": 9,
+ "breath": "draw",
+ "bend": 0,
+ "overblow": false
+ }
+ ]
+ },
+ {
+ "notes": [
+ {
+ "degree": 5,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.5,
+ "hole": 6,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 6,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.5,
+ "hole": 6,
+ "breath": "draw",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 7,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.5,
+ "hole": 7,
+ "breath": "draw",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 1,
+ "accidental": 0,
+ "octave": 2,
+ "beats": 1,
+ "fermata": true,
+ "hole": 7,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 3,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.5,
+ "hole": 5,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ }
+ ]
+ },
+ {
+ "notes": [
+ {
+ "degree": 4,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.5,
+ "dotted": true,
+ "hole": 5,
+ "breath": "draw",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 3,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.25,
+ "hole": 5,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 4,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.5,
+ "hole": 5,
+ "breath": "draw",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 5,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 1,
+ "hole": 6,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 5,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.5,
+ "hole": 6,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ }
+ ]
+ },
+ {
+ "notes": [
+ {
+ "degree": 1,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 1,
+ "dotted": true,
+ "tie": true,
+ "hole": 4,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 1,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 1,
+ "hole": 4,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ }
+ ],
+ "sectionEnd": true
+ }
+ ]
+ ]
+}
diff --git a/src/data/scores/jasmine-flower.json b/src/data/scores/jasmine-flower.json
new file mode 100644
index 0000000..d25eb8a
--- /dev/null
+++ b/src/data/scores/jasmine-flower.json
@@ -0,0 +1,885 @@
+{
+ "id": "jasmine-flower",
+ "title": "茉莉花",
+ "subtitle": "江苏民歌 · 好一朵美丽的茉莉花",
+ "composer": "江苏民歌",
+ "key": "C",
+ "harmonicaKey": "C",
+ "timeSignature": "2/4",
+ "tempo": 84,
+ "difficulty": 2,
+ "tags": [
+ "中国民歌",
+ "江苏",
+ "入门",
+ "附点节奏"
+ ],
+ "source": "粤教花城《音乐四年级下册·简谱》印刷第15页/PDF第16页,完整28小节;采用该页版本,不混合第12页加花版本。原1=D改为1=C后整体提高八度。",
+ "sourceUrl": "https://lywgyxx.szftedu.cn/xkjc/yinyue/202209/P020220910587435677420.pdf#page=16",
+ "sourceFormat": "jianpu-image",
+ "sourceCheckedAt": "2026-10-23",
+ "builtin": true,
+ "order": 39,
+ "notes": "保留全部七行、句末休止和后段低音sol/la;音域G4–C6,低la需3孔吸压全音。后半段较前半段难,先慢练附点和跳进。仅录旋律,省略歌词及异音连奏线,速度为练习建议。",
+ "lines": [
+ [
+ {
+ "notes": [
+ {
+ "degree": 3,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 1,
+ "hole": 5,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 3,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.5,
+ "hole": 5,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 5,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.5,
+ "hole": 6,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ }
+ ]
+ },
+ {
+ "notes": [
+ {
+ "degree": 6,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.5,
+ "hole": 6,
+ "breath": "draw",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 1,
+ "accidental": 0,
+ "octave": 2,
+ "beats": 0.5,
+ "hole": 7,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 1,
+ "accidental": 0,
+ "octave": 2,
+ "beats": 0.5,
+ "hole": 7,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 6,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.5,
+ "hole": 6,
+ "breath": "draw",
+ "bend": 0,
+ "overblow": false
+ }
+ ]
+ },
+ {
+ "notes": [
+ {
+ "degree": 5,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 1,
+ "hole": 6,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 5,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.5,
+ "hole": 6,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 6,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.5,
+ "hole": 6,
+ "breath": "draw",
+ "bend": 0,
+ "overblow": false
+ }
+ ]
+ },
+ {
+ "notes": [
+ {
+ "degree": 5,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 1,
+ "hole": 6,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 0,
+ "accidental": 0,
+ "octave": 0,
+ "beats": 1,
+ "hole": null,
+ "breath": null,
+ "bend": 0,
+ "overblow": false
+ }
+ ]
+ }
+ ],
+ [
+ {
+ "notes": [
+ {
+ "degree": 3,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 1,
+ "hole": 5,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 3,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.5,
+ "hole": 5,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 5,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.5,
+ "hole": 6,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ }
+ ]
+ },
+ {
+ "notes": [
+ {
+ "degree": 6,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.5,
+ "hole": 6,
+ "breath": "draw",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 1,
+ "accidental": 0,
+ "octave": 2,
+ "beats": 0.5,
+ "hole": 7,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 1,
+ "accidental": 0,
+ "octave": 2,
+ "beats": 0.5,
+ "hole": 7,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 6,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.5,
+ "hole": 6,
+ "breath": "draw",
+ "bend": 0,
+ "overblow": false
+ }
+ ]
+ },
+ {
+ "notes": [
+ {
+ "degree": 5,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 1,
+ "hole": 6,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 5,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.5,
+ "hole": 6,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 6,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.5,
+ "hole": 6,
+ "breath": "draw",
+ "bend": 0,
+ "overblow": false
+ }
+ ]
+ },
+ {
+ "notes": [
+ {
+ "degree": 5,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 1,
+ "hole": 6,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 0,
+ "accidental": 0,
+ "octave": 0,
+ "beats": 1,
+ "hole": null,
+ "breath": null,
+ "bend": 0,
+ "overblow": false
+ }
+ ]
+ }
+ ],
+ [
+ {
+ "notes": [
+ {
+ "degree": 5,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 1,
+ "hole": 6,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 5,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 1,
+ "hole": 6,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ }
+ ]
+ },
+ {
+ "notes": [
+ {
+ "degree": 5,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 1,
+ "hole": 6,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 3,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.5,
+ "hole": 5,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 5,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.5,
+ "hole": 6,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ }
+ ]
+ },
+ {
+ "notes": [
+ {
+ "degree": 6,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 1,
+ "hole": 6,
+ "breath": "draw",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 6,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 1,
+ "hole": 6,
+ "breath": "draw",
+ "bend": 0,
+ "overblow": false
+ }
+ ]
+ },
+ {
+ "notes": [
+ {
+ "degree": 5,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 1,
+ "hole": 6,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 0,
+ "accidental": 0,
+ "octave": 0,
+ "beats": 1,
+ "hole": null,
+ "breath": null,
+ "bend": 0,
+ "overblow": false
+ }
+ ]
+ }
+ ],
+ [
+ {
+ "notes": [
+ {
+ "degree": 3,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 1,
+ "hole": 5,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 2,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.5,
+ "hole": 4,
+ "breath": "draw",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 3,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.5,
+ "hole": 5,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ }
+ ]
+ },
+ {
+ "notes": [
+ {
+ "degree": 5,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 1,
+ "hole": 6,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 3,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.5,
+ "hole": 5,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 2,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.5,
+ "hole": 4,
+ "breath": "draw",
+ "bend": 0,
+ "overblow": false
+ }
+ ]
+ },
+ {
+ "notes": [
+ {
+ "degree": 1,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 1,
+ "hole": 4,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 1,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.5,
+ "hole": 4,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 2,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.5,
+ "hole": 4,
+ "breath": "draw",
+ "bend": 0,
+ "overblow": false
+ }
+ ]
+ },
+ {
+ "notes": [
+ {
+ "degree": 1,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 1,
+ "hole": 4,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 0,
+ "accidental": 0,
+ "octave": 0,
+ "beats": 1,
+ "hole": null,
+ "breath": null,
+ "bend": 0,
+ "overblow": false
+ }
+ ]
+ }
+ ],
+ [
+ {
+ "notes": [
+ {
+ "degree": 3,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.5,
+ "hole": 5,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 2,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.5,
+ "hole": 4,
+ "breath": "draw",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 1,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.5,
+ "hole": 4,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 3,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.5,
+ "hole": 5,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ }
+ ]
+ },
+ {
+ "notes": [
+ {
+ "degree": 2,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 1,
+ "dotted": true,
+ "hole": 4,
+ "breath": "draw",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 3,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.5,
+ "hole": 5,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ }
+ ]
+ },
+ {
+ "notes": [
+ {
+ "degree": 5,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 1,
+ "hole": 6,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 6,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.5,
+ "hole": 6,
+ "breath": "draw",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 1,
+ "accidental": 0,
+ "octave": 2,
+ "beats": 0.5,
+ "hole": 7,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ }
+ ]
+ },
+ {
+ "notes": [
+ {
+ "degree": 5,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 2,
+ "hole": 6,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ }
+ ]
+ }
+ ],
+ [
+ {
+ "notes": [
+ {
+ "degree": 2,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 1,
+ "hole": 4,
+ "breath": "draw",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 3,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.5,
+ "hole": 5,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 5,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.5,
+ "hole": 6,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ }
+ ]
+ },
+ {
+ "notes": [
+ {
+ "degree": 2,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.5,
+ "hole": 4,
+ "breath": "draw",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 3,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.5,
+ "hole": 5,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 1,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.5,
+ "hole": 4,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 6,
+ "accidental": 0,
+ "octave": 0,
+ "beats": 0.5,
+ "hole": 3,
+ "breath": "draw",
+ "bend": 2,
+ "overblow": false
+ }
+ ]
+ },
+ {
+ "notes": [
+ {
+ "degree": 5,
+ "accidental": 0,
+ "octave": 0,
+ "beats": 2,
+ "hole": 3,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ }
+ ]
+ },
+ {
+ "notes": [
+ {
+ "degree": 6,
+ "accidental": 0,
+ "octave": 0,
+ "beats": 1,
+ "hole": 3,
+ "breath": "draw",
+ "bend": 2,
+ "overblow": false
+ },
+ {
+ "degree": 1,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 1,
+ "hole": 4,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ }
+ ]
+ }
+ ],
+ [
+ {
+ "notes": [
+ {
+ "degree": 2,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 1,
+ "dotted": true,
+ "hole": 4,
+ "breath": "draw",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 3,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.5,
+ "hole": 5,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ }
+ ]
+ },
+ {
+ "notes": [
+ {
+ "degree": 1,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.5,
+ "hole": 4,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 2,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.5,
+ "hole": 4,
+ "breath": "draw",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 1,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.5,
+ "hole": 4,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 6,
+ "accidental": 0,
+ "octave": 0,
+ "beats": 0.5,
+ "hole": 3,
+ "breath": "draw",
+ "bend": 2,
+ "overblow": false
+ }
+ ]
+ },
+ {
+ "notes": [
+ {
+ "degree": 5,
+ "accidental": 0,
+ "octave": 0,
+ "beats": 2,
+ "hole": 3,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ }
+ ]
+ },
+ {
+ "notes": [
+ {
+ "degree": 5,
+ "accidental": 0,
+ "octave": 0,
+ "beats": 1,
+ "hole": 3,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 0,
+ "accidental": 0,
+ "octave": 0,
+ "beats": 1,
+ "hole": null,
+ "breath": null,
+ "bend": 0,
+ "overblow": false
+ }
+ ],
+ "sectionEnd": true
+ }
+ ]
+ ]
+}
diff --git a/src/data/scores/jingle-bells.json b/src/data/scores/jingle-bells.json
index 296a327..eea723b 100644
--- a/src/data/scores/jingle-bells.json
+++ b/src/data/scores/jingle-bells.json
@@ -14,13 +14,13 @@
"圣诞",
"入门"
],
- "source": "黄冈师范学院音乐学院吉他教材简谱《铃儿响叮当》;James Pierpont 公有领域旋律",
+ "source": "黄冈师范学院音乐学院吉他教材简谱《铃儿响叮当》;James Pierpont 公有领域旋律;印刷第 40 页 / PDF 第 44 页",
"sourceUrl": "https://music.hgnu.edu.cn/_upload/article/files/09/d4/faf43ffb4e08b61cf64ee0adaf16/ec5df379-7cae-4b24-9ece-880a54ee478b.pdf",
"sourceFormat": "jianpu-image",
- "sourceCheckedAt": "2026-08-31",
+ "sourceCheckedAt": "2026-10-23",
"builtin": true,
"order": 7,
- "notes": "按教材 1=C 简谱逐小节核对后整体升八度,全部自然音、零压音,适合练习吐音与节奏稳定性。",
+ "notes": "逐行核对教材完整 16 小节简化副歌版,旋律、节奏不变;不是包含主歌的全曲。整体升八度,吉他指法不录入,速度为编辑建议。",
"lines": [
[
{
diff --git a/src/data/scores/jolly-miller.json b/src/data/scores/jolly-miller.json
new file mode 100644
index 0000000..c900c7e
--- /dev/null
+++ b/src/data/scores/jolly-miller.json
@@ -0,0 +1,519 @@
+{
+ "id": "jolly-miller",
+ "title": "快乐的磨坊主",
+ "subtitle": "Jolly is the Miller · 英国游戏歌",
+ "composer": "英国传统游戏歌(所选歌集署名)",
+ "key": "C",
+ "harmonicaKey": "C",
+ "position": "第一把位",
+ "timeSignature": "4/4",
+ "tempo": 96,
+ "difficulty": 3,
+ "tags": [
+ "传统曲",
+ "西方民谣",
+ "压音"
+ ],
+ "source": "The Everyday Song Book (1927), No.98;John Chambers ABC 转录",
+ "sourceUrl": "https://trillian.mit.edu/~jc/music/book/EverydaySongBook/098_Jolly_is_the_Miller.abc",
+ "sourceFormat": "music-text",
+ "sourceCheckedAt": "2026-10-23",
+ "builtin": true,
+ "order": 50,
+ "notes": "完整8小节,保留附点八分/十六分和低音区跳进。低 fa 需2孔吸气全音压音,低 la 需3孔吸气全音压音;不是无压音入门谱。 仅录主旋律,不录歌词、伴奏及异音连奏线;速度为编辑练习建议。 原 A4 主音移为 C5,所有音符整体上移 3 个半音。",
+ "lines": [
+ [
+ {
+ "notes": [
+ {
+ "degree": 1,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.5,
+ "hole": 4,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 1,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.5,
+ "hole": 4,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 1,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.5,
+ "hole": 4,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 1,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.5,
+ "hole": 4,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 1,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 1,
+ "hole": 4,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 3,
+ "accidental": 0,
+ "octave": 0,
+ "beats": 0.5,
+ "hole": 2,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 4,
+ "accidental": 0,
+ "octave": 0,
+ "beats": 0.5,
+ "hole": 2,
+ "breath": "draw",
+ "bend": 2,
+ "overblow": false
+ }
+ ]
+ },
+ {
+ "notes": [
+ {
+ "degree": 5,
+ "accidental": 0,
+ "octave": 0,
+ "beats": 1,
+ "hole": 3,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 5,
+ "accidental": 0,
+ "octave": 0,
+ "beats": 0.5,
+ "dotted": true,
+ "hole": 3,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 6,
+ "accidental": 0,
+ "octave": 0,
+ "beats": 0.25,
+ "hole": 3,
+ "breath": "draw",
+ "bend": 2,
+ "overblow": false
+ },
+ {
+ "degree": 5,
+ "accidental": 0,
+ "octave": 0,
+ "beats": 1,
+ "dotted": true,
+ "hole": 3,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 3,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.5,
+ "hole": 5,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ }
+ ]
+ },
+ {
+ "notes": [
+ {
+ "degree": 3,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 1,
+ "hole": 5,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 3,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 1,
+ "hole": 5,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 3,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 1,
+ "hole": 5,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 1,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.5,
+ "dotted": true,
+ "hole": 4,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 2,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.25,
+ "hole": 4,
+ "breath": "draw",
+ "bend": 0,
+ "overblow": false
+ }
+ ]
+ },
+ {
+ "notes": [
+ {
+ "degree": 3,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 1,
+ "hole": 5,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 2,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 1,
+ "hole": 4,
+ "breath": "draw",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 2,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 1,
+ "hole": 4,
+ "breath": "draw",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 3,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.5,
+ "hole": 5,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 2,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.5,
+ "hole": 4,
+ "breath": "draw",
+ "bend": 0,
+ "overblow": false
+ }
+ ]
+ }
+ ],
+ [
+ {
+ "notes": [
+ {
+ "degree": 1,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 1,
+ "hole": 4,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 1,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.5,
+ "hole": 4,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 1,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.5,
+ "hole": 4,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 1,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.5,
+ "dotted": true,
+ "hole": 4,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 1,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.25,
+ "hole": 4,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 3,
+ "accidental": 0,
+ "octave": 0,
+ "beats": 0.5,
+ "hole": 2,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 4,
+ "accidental": 0,
+ "octave": 0,
+ "beats": 0.5,
+ "hole": 2,
+ "breath": "draw",
+ "bend": 2,
+ "overblow": false
+ }
+ ]
+ },
+ {
+ "notes": [
+ {
+ "degree": 5,
+ "accidental": 0,
+ "octave": 0,
+ "beats": 0.5,
+ "hole": 3,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 5,
+ "accidental": 0,
+ "octave": 0,
+ "beats": 0.5,
+ "hole": 3,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 5,
+ "accidental": 0,
+ "octave": 0,
+ "beats": 0.5,
+ "dotted": true,
+ "hole": 3,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 5,
+ "accidental": 0,
+ "octave": 0,
+ "beats": 0.25,
+ "hole": 3,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 5,
+ "accidental": 0,
+ "octave": 0,
+ "beats": 1,
+ "dotted": true,
+ "hole": 3,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 1,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.5,
+ "hole": 4,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ }
+ ]
+ },
+ {
+ "notes": [
+ {
+ "degree": 3,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 1,
+ "hole": 5,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 5,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 1,
+ "hole": 6,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 5,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.5,
+ "hole": 6,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 5,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.5,
+ "hole": 6,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 1,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.5,
+ "hole": 4,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 2,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.5,
+ "hole": 4,
+ "breath": "draw",
+ "bend": 0,
+ "overblow": false
+ }
+ ]
+ },
+ {
+ "notes": [
+ {
+ "degree": 3,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 1,
+ "hole": 5,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 2,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 1,
+ "hole": 4,
+ "breath": "draw",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 1,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 1,
+ "hole": 4,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 0,
+ "accidental": 0,
+ "octave": 0,
+ "beats": 1,
+ "hole": null,
+ "breath": null,
+ "bend": 0,
+ "overblow": false
+ }
+ ],
+ "sectionEnd": true
+ }
+ ]
+ ]
+}
diff --git a/src/data/scores/kangding-love-song.json b/src/data/scores/kangding-love-song.json
new file mode 100644
index 0000000..eb28784
--- /dev/null
+++ b/src/data/scores/kangding-love-song.json
@@ -0,0 +1,701 @@
+{
+ "id": "kangding-love-song",
+ "title": "康定情歌",
+ "subtitle": "四川民歌 · 香港中乐团教程版",
+ "composer": "四川民歌",
+ "key": "C",
+ "harmonicaKey": "C",
+ "position": "第四把位",
+ "timeSignature": "4/4",
+ "tempo": 84,
+ "difficulty": 3,
+ "tags": [
+ "传统曲",
+ "中国民歌",
+ "压音"
+ ],
+ "source": "香港中乐团《唢呐初级教程》,第29页《康定情歌》。",
+ "sourceUrl": "https://ynyqxg.hkco.org/uploads/docs/5bd9828a7a7201.pdf#page=29",
+ "sourceFormat": "jianpu-image",
+ "sourceCheckedAt": "2026-10-23",
+ "builtin": true,
+ "order": 61,
+ "notes": "原页按音级记谱,未单列1=调号;移写为1=C并提高一八度。羽调式主音A,C调口琴第四把位,音域A4–A5。8小节4/4,保留六处同音延音和十六分音符;低la需3孔吸气全音压音。 不收录歌词和异音连奏线;速度为编辑练习建议,核对针对所列来源版本。",
+ "lines": [
+ [
+ {
+ "notes": [
+ {
+ "degree": 3,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.5,
+ "hole": 5,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 5,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.5,
+ "hole": 6,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 6,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.5,
+ "hole": 6,
+ "breath": "draw",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 6,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.25,
+ "hole": 6,
+ "breath": "draw",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 5,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.25,
+ "hole": 6,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 6,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.5,
+ "hole": 6,
+ "breath": "draw",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 3,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.5,
+ "hole": 5,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 2,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 1,
+ "hole": 4,
+ "breath": "draw",
+ "bend": 0,
+ "overblow": false
+ }
+ ]
+ },
+ {
+ "notes": [
+ {
+ "degree": 3,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.5,
+ "hole": 5,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 5,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.5,
+ "hole": 6,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 6,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.5,
+ "hole": 6,
+ "breath": "draw",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 6,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.25,
+ "hole": 6,
+ "breath": "draw",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 5,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.25,
+ "hole": 6,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 6,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.5,
+ "hole": 6,
+ "breath": "draw",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 3,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.5,
+ "tie": true,
+ "hole": 5,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 3,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 1,
+ "hole": 5,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ }
+ ]
+ },
+ {
+ "notes": [
+ {
+ "degree": 3,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.5,
+ "hole": 5,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 5,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.5,
+ "hole": 6,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 6,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.5,
+ "hole": 6,
+ "breath": "draw",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 6,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.25,
+ "hole": 6,
+ "breath": "draw",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 5,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.25,
+ "hole": 6,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 6,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.5,
+ "hole": 6,
+ "breath": "draw",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 3,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.5,
+ "hole": 5,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 2,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 1,
+ "hole": 4,
+ "breath": "draw",
+ "bend": 0,
+ "overblow": false
+ }
+ ]
+ }
+ ],
+ [
+ {
+ "notes": [
+ {
+ "degree": 5,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.5,
+ "hole": 6,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 3,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.5,
+ "hole": 5,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 2,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.25,
+ "hole": 4,
+ "breath": "draw",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 3,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.25,
+ "hole": 5,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 2,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.25,
+ "hole": 4,
+ "breath": "draw",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 1,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.25,
+ "hole": 4,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 2,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.5,
+ "hole": 4,
+ "breath": "draw",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 6,
+ "accidental": 0,
+ "octave": 0,
+ "beats": 0.5,
+ "tie": true,
+ "hole": 3,
+ "breath": "draw",
+ "bend": 2,
+ "overblow": false
+ },
+ {
+ "degree": 6,
+ "accidental": 0,
+ "octave": 0,
+ "beats": 1,
+ "hole": 3,
+ "breath": "draw",
+ "bend": 2,
+ "overblow": false
+ }
+ ]
+ },
+ {
+ "notes": [
+ {
+ "degree": 6,
+ "accidental": 0,
+ "octave": 0,
+ "beats": 0.5,
+ "hole": 3,
+ "breath": "draw",
+ "bend": 2,
+ "overblow": false
+ },
+ {
+ "degree": 2,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.5,
+ "tie": true,
+ "hole": 4,
+ "breath": "draw",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 2,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 1,
+ "hole": 4,
+ "breath": "draw",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 5,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.5,
+ "hole": 6,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 3,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.5,
+ "tie": true,
+ "hole": 5,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 3,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 1,
+ "hole": 5,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ }
+ ]
+ },
+ {
+ "notes": [
+ {
+ "degree": 2,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.25,
+ "hole": 4,
+ "breath": "draw",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 1,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.25,
+ "hole": 4,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 6,
+ "accidental": 0,
+ "octave": 0,
+ "beats": 0.5,
+ "tie": true,
+ "hole": 3,
+ "breath": "draw",
+ "bend": 2,
+ "overblow": false
+ },
+ {
+ "degree": 6,
+ "accidental": 0,
+ "octave": 0,
+ "beats": 1,
+ "hole": 3,
+ "breath": "draw",
+ "bend": 2,
+ "overblow": false
+ },
+ {
+ "degree": 5,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.5,
+ "hole": 6,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 3,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.5,
+ "hole": 5,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 2,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.25,
+ "hole": 4,
+ "breath": "draw",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 3,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.25,
+ "hole": 5,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 2,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.25,
+ "hole": 4,
+ "breath": "draw",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 1,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.25,
+ "hole": 4,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ }
+ ]
+ }
+ ],
+ [
+ {
+ "notes": [
+ {
+ "degree": 2,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.5,
+ "hole": 4,
+ "breath": "draw",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 6,
+ "accidental": 0,
+ "octave": 0,
+ "beats": 0.5,
+ "tie": true,
+ "hole": 3,
+ "breath": "draw",
+ "bend": 2,
+ "overblow": false
+ },
+ {
+ "degree": 6,
+ "accidental": 0,
+ "octave": 0,
+ "beats": 1,
+ "hole": 3,
+ "breath": "draw",
+ "bend": 2,
+ "overblow": false
+ },
+ {
+ "degree": 5,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.5,
+ "hole": 6,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 5,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.25,
+ "hole": 6,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 3,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.25,
+ "hole": 5,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 2,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.25,
+ "hole": 4,
+ "breath": "draw",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 3,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.25,
+ "hole": 5,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 2,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.25,
+ "hole": 4,
+ "breath": "draw",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 1,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.25,
+ "hole": 4,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ }
+ ]
+ },
+ {
+ "notes": [
+ {
+ "degree": 2,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.5,
+ "hole": 4,
+ "breath": "draw",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 6,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 1,
+ "hole": 6,
+ "breath": "draw",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 5,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.5,
+ "hole": 6,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 6,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 2,
+ "hole": 6,
+ "breath": "draw",
+ "bend": 0,
+ "overblow": false
+ }
+ ],
+ "sectionEnd": true
+ }
+ ]
+ ]
+}
diff --git a/src/data/scores/learn-to-sing.json b/src/data/scores/learn-to-sing.json
new file mode 100644
index 0000000..f807515
--- /dev/null
+++ b/src/data/scores/learn-to-sing.json
@@ -0,0 +1,624 @@
+{
+ "id": "learn-to-sing",
+ "title": "一起来学唱",
+ "subtitle": "Come, Let Us Learn to Sing · 1927 歌集版",
+ "composer": "所选歌集未署曲作者",
+ "key": "C",
+ "harmonicaKey": "C",
+ "position": "第一把位",
+ "timeSignature": "4/4",
+ "tempo": 96,
+ "difficulty": 1,
+ "tags": [
+ "入门",
+ "儿歌"
+ ],
+ "source": "The Everyday Song Book (1927), No.25;John Chambers ABC 转录 (2017)",
+ "sourceUrl": "https://trillian.mit.edu/~jc/music/book/EverydaySongBook/025_Come_Let_Us_Learn_to_Sing.abc",
+ "sourceFormat": "music-text",
+ "sourceCheckedAt": "2026-10-23",
+ "builtin": true,
+ "order": 62,
+ "notes": "原F4主音移为C5;保留来源全部15小节及三个四分休止符。音域C5–C6,均有自然音孔位,适合音阶、长短音与休止练习。中文曲名为编辑译名。 不收录歌词和异音连奏线;速度为编辑练习建议,核对针对所列来源版本。",
+ "lines": [
+ [
+ {
+ "notes": [
+ {
+ "degree": 5,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 1,
+ "hole": 6,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 5,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.5,
+ "hole": 6,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 4,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.5,
+ "hole": 5,
+ "breath": "draw",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 3,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 1,
+ "hole": 5,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 2,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 1,
+ "hole": 4,
+ "breath": "draw",
+ "bend": 0,
+ "overblow": false
+ }
+ ]
+ },
+ {
+ "notes": [
+ {
+ "degree": 1,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 3,
+ "hole": 4,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 1,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.5,
+ "hole": 4,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 2,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.5,
+ "hole": 4,
+ "breath": "draw",
+ "bend": 0,
+ "overblow": false
+ }
+ ]
+ },
+ {
+ "notes": [
+ {
+ "degree": 3,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 1,
+ "hole": 5,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 4,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.5,
+ "hole": 5,
+ "breath": "draw",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 5,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.5,
+ "hole": 6,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 6,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 1,
+ "hole": 6,
+ "breath": "draw",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 7,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 1,
+ "hole": 7,
+ "breath": "draw",
+ "bend": 0,
+ "overblow": false
+ }
+ ]
+ },
+ {
+ "notes": [
+ {
+ "degree": 1,
+ "accidental": 0,
+ "octave": 2,
+ "beats": 3,
+ "hole": 7,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 0,
+ "accidental": 0,
+ "octave": 0,
+ "beats": 1,
+ "hole": null,
+ "breath": null,
+ "bend": 0,
+ "overblow": false
+ }
+ ]
+ }
+ ],
+ [
+ {
+ "notes": [
+ {
+ "degree": 5,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 1,
+ "hole": 6,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 5,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.5,
+ "hole": 6,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 4,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.5,
+ "hole": 5,
+ "breath": "draw",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 3,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 1,
+ "hole": 5,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 2,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 1,
+ "hole": 4,
+ "breath": "draw",
+ "bend": 0,
+ "overblow": false
+ }
+ ]
+ },
+ {
+ "notes": [
+ {
+ "degree": 1,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 3,
+ "hole": 4,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 1,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.5,
+ "hole": 4,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 2,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.5,
+ "hole": 4,
+ "breath": "draw",
+ "bend": 0,
+ "overblow": false
+ }
+ ]
+ },
+ {
+ "notes": [
+ {
+ "degree": 3,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 1,
+ "hole": 5,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 4,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.5,
+ "hole": 5,
+ "breath": "draw",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 5,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.5,
+ "hole": 6,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 6,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 1,
+ "hole": 6,
+ "breath": "draw",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 7,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 1,
+ "hole": 7,
+ "breath": "draw",
+ "bend": 0,
+ "overblow": false
+ }
+ ]
+ },
+ {
+ "notes": [
+ {
+ "degree": 1,
+ "accidental": 0,
+ "octave": 2,
+ "beats": 3,
+ "hole": 7,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 0,
+ "accidental": 0,
+ "octave": 0,
+ "beats": 1,
+ "hole": null,
+ "breath": null,
+ "bend": 0,
+ "overblow": false
+ }
+ ]
+ }
+ ],
+ [
+ {
+ "notes": [
+ {
+ "degree": 5,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 1,
+ "hole": 6,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 3,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 1,
+ "hole": 5,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 5,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 1,
+ "hole": 6,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 3,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 1,
+ "hole": 5,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ }
+ ]
+ },
+ {
+ "notes": [
+ {
+ "degree": 1,
+ "accidental": 0,
+ "octave": 2,
+ "beats": 1,
+ "hole": 7,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 6,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 1,
+ "hole": 6,
+ "breath": "draw",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 5,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 2,
+ "hole": 6,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ }
+ ]
+ },
+ {
+ "notes": [
+ {
+ "degree": 5,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 1,
+ "hole": 6,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 3,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 1,
+ "hole": 5,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 5,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 1,
+ "hole": 6,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 3,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 1,
+ "hole": 5,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ }
+ ]
+ },
+ {
+ "notes": [
+ {
+ "degree": 1,
+ "accidental": 0,
+ "octave": 2,
+ "beats": 1,
+ "hole": 7,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 6,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 1,
+ "hole": 6,
+ "breath": "draw",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 5,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 2,
+ "hole": 6,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ }
+ ]
+ }
+ ],
+ [
+ {
+ "notes": [
+ {
+ "degree": 1,
+ "accidental": 0,
+ "octave": 2,
+ "beats": 1,
+ "hole": 7,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 7,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.5,
+ "hole": 7,
+ "breath": "draw",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 6,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.5,
+ "hole": 6,
+ "breath": "draw",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 5,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 1,
+ "hole": 6,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 4,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 1,
+ "hole": 5,
+ "breath": "draw",
+ "bend": 0,
+ "overblow": false
+ }
+ ]
+ },
+ {
+ "notes": [
+ {
+ "degree": 3,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 2,
+ "hole": 5,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 2,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 2,
+ "hole": 4,
+ "breath": "draw",
+ "bend": 0,
+ "overblow": false
+ }
+ ]
+ },
+ {
+ "notes": [
+ {
+ "degree": 1,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 3,
+ "hole": 4,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 0,
+ "accidental": 0,
+ "octave": 0,
+ "beats": 1,
+ "hole": null,
+ "breath": null,
+ "bend": 0,
+ "overblow": false
+ }
+ ],
+ "sectionEnd": true
+ }
+ ]
+ ]
+}
diff --git a/src/data/scores/left-right.json b/src/data/scores/left-right.json
new file mode 100644
index 0000000..029ebff
--- /dev/null
+++ b/src/data/scores/left-right.json
@@ -0,0 +1,374 @@
+{
+ "id": "left-right",
+ "title": "左右齐步走",
+ "subtitle": "Left, Right! · 1927 歌集版",
+ "composer": "所选歌集未署曲作者",
+ "key": "C",
+ "harmonicaKey": "C",
+ "position": "第一把位",
+ "timeSignature": "2/4",
+ "tempo": 96,
+ "difficulty": 1,
+ "tags": [
+ "入门",
+ "儿歌"
+ ],
+ "source": "The Everyday Song Book (1927), No.26;John Chambers ABC 转录 (2017)",
+ "sourceUrl": "https://trillian.mit.edu/~jc/music/book/EverydaySongBook/026_Left_Right.abc",
+ "sourceFormat": "music-text",
+ "sourceCheckedAt": "2026-10-23",
+ "builtin": true,
+ "order": 57,
+ "notes": "原降E4主音移为C5;保留16小节,低si至高re均有自然音孔位。适合四分音符、二分音符与跨孔练习。 不收录歌词和异音连奏线;速度为编辑练习建议,核对针对所列ABC版本。",
+ "lines": [
+ [
+ {
+ "notes": [
+ {
+ "degree": 1,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 1,
+ "hole": 4,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 3,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 1,
+ "hole": 5,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ }
+ ]
+ },
+ {
+ "notes": [
+ {
+ "degree": 1,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 1,
+ "hole": 4,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 3,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 1,
+ "hole": 5,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ }
+ ]
+ },
+ {
+ "notes": [
+ {
+ "degree": 5,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 1,
+ "hole": 6,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 1,
+ "accidental": 0,
+ "octave": 2,
+ "beats": 1,
+ "hole": 7,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ }
+ ]
+ },
+ {
+ "notes": [
+ {
+ "degree": 5,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 2,
+ "hole": 6,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ }
+ ]
+ },
+ {
+ "notes": [
+ {
+ "degree": 4,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 1,
+ "hole": 5,
+ "breath": "draw",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 5,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 1,
+ "hole": 6,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ }
+ ]
+ },
+ {
+ "notes": [
+ {
+ "degree": 3,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 1,
+ "hole": 5,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 1,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 1,
+ "hole": 4,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ }
+ ]
+ },
+ {
+ "notes": [
+ {
+ "degree": 7,
+ "accidental": 0,
+ "octave": 0,
+ "beats": 1,
+ "hole": 3,
+ "breath": "draw",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 1,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 1,
+ "hole": 4,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ }
+ ]
+ },
+ {
+ "notes": [
+ {
+ "degree": 2,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 2,
+ "hole": 4,
+ "breath": "draw",
+ "bend": 0,
+ "overblow": false
+ }
+ ]
+ }
+ ],
+ [
+ {
+ "notes": [
+ {
+ "degree": 1,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 1,
+ "hole": 4,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 3,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 1,
+ "hole": 5,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ }
+ ]
+ },
+ {
+ "notes": [
+ {
+ "degree": 1,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 1,
+ "hole": 4,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 3,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 1,
+ "hole": 5,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ }
+ ]
+ },
+ {
+ "notes": [
+ {
+ "degree": 5,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 1,
+ "hole": 6,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 1,
+ "accidental": 0,
+ "octave": 2,
+ "beats": 1,
+ "hole": 7,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ }
+ ]
+ },
+ {
+ "notes": [
+ {
+ "degree": 6,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 2,
+ "hole": 6,
+ "breath": "draw",
+ "bend": 0,
+ "overblow": false
+ }
+ ]
+ },
+ {
+ "notes": [
+ {
+ "degree": 2,
+ "accidental": 0,
+ "octave": 2,
+ "beats": 1,
+ "hole": 8,
+ "breath": "draw",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 7,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 1,
+ "hole": 7,
+ "breath": "draw",
+ "bend": 0,
+ "overblow": false
+ }
+ ]
+ },
+ {
+ "notes": [
+ {
+ "degree": 1,
+ "accidental": 0,
+ "octave": 2,
+ "beats": 1,
+ "hole": 7,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 5,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 1,
+ "hole": 6,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ }
+ ]
+ },
+ {
+ "notes": [
+ {
+ "degree": 3,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 1,
+ "hole": 5,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 2,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 1,
+ "hole": 4,
+ "breath": "draw",
+ "bend": 0,
+ "overblow": false
+ }
+ ]
+ },
+ {
+ "notes": [
+ {
+ "degree": 1,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 2,
+ "hole": 4,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ }
+ ],
+ "sectionEnd": true
+ }
+ ]
+ ]
+}
diff --git a/src/data/scores/lightly-row.json b/src/data/scores/lightly-row.json
new file mode 100644
index 0000000..31b8427
--- /dev/null
+++ b/src/data/scores/lightly-row.json
@@ -0,0 +1,608 @@
+{
+ "id": "lightly-row",
+ "title": "轻轻划",
+ "subtitle": "Lightly Row · 16 小节歌集版",
+ "composer": "传统曲调(所选歌集版本)",
+ "key": "C",
+ "harmonicaKey": "C",
+ "position": "第一把位",
+ "timeSignature": "2/4",
+ "tempo": 96,
+ "difficulty": 1,
+ "tags": [
+ "入门",
+ "儿歌"
+ ],
+ "source": "The Everyday Song Book (1927), No.97;John Chambers ABC 转录",
+ "sourceUrl": "https://trillian.mit.edu/~jc/music/book/EverydaySongBook/097_Lightly_Row.abc",
+ "sourceFormat": "music-text",
+ "sourceCheckedAt": "2026-10-23",
+ "builtin": true,
+ "order": 45,
+ "notes": "完整16小节,第二乐句和末尾停在 mi 并接四分休止,与现有《西班牙划船歌》教材短版不同,不混用两个版本。 仅录主旋律,不录歌词、伴奏及异音连奏线;速度为编辑练习建议。 原 G4 主音移为 C5,所有音符整体上移 5 个半音。",
+ "lines": [
+ [
+ {
+ "notes": [
+ {
+ "degree": 5,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.5,
+ "hole": 6,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 3,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.5,
+ "hole": 5,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 3,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 1,
+ "hole": 5,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ }
+ ]
+ },
+ {
+ "notes": [
+ {
+ "degree": 4,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.5,
+ "hole": 5,
+ "breath": "draw",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 2,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.5,
+ "hole": 4,
+ "breath": "draw",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 2,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 1,
+ "hole": 4,
+ "breath": "draw",
+ "bend": 0,
+ "overblow": false
+ }
+ ]
+ },
+ {
+ "notes": [
+ {
+ "degree": 1,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.5,
+ "hole": 4,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 2,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.5,
+ "hole": 4,
+ "breath": "draw",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 3,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.5,
+ "hole": 5,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 4,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.5,
+ "hole": 5,
+ "breath": "draw",
+ "bend": 0,
+ "overblow": false
+ }
+ ]
+ },
+ {
+ "notes": [
+ {
+ "degree": 5,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.5,
+ "hole": 6,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 5,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.5,
+ "hole": 6,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 5,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 1,
+ "hole": 6,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ }
+ ]
+ }
+ ],
+ [
+ {
+ "notes": [
+ {
+ "degree": 5,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.5,
+ "hole": 6,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 3,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.5,
+ "hole": 5,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 3,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 1,
+ "hole": 5,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ }
+ ]
+ },
+ {
+ "notes": [
+ {
+ "degree": 4,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.5,
+ "hole": 5,
+ "breath": "draw",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 2,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.5,
+ "hole": 4,
+ "breath": "draw",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 2,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 1,
+ "hole": 4,
+ "breath": "draw",
+ "bend": 0,
+ "overblow": false
+ }
+ ]
+ },
+ {
+ "notes": [
+ {
+ "degree": 1,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.5,
+ "hole": 4,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 3,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.5,
+ "hole": 5,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 5,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.5,
+ "hole": 6,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 5,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.5,
+ "hole": 6,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ }
+ ]
+ },
+ {
+ "notes": [
+ {
+ "degree": 3,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 1,
+ "hole": 5,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 0,
+ "accidental": 0,
+ "octave": 0,
+ "beats": 1,
+ "hole": null,
+ "breath": null,
+ "bend": 0,
+ "overblow": false
+ }
+ ]
+ }
+ ],
+ [
+ {
+ "notes": [
+ {
+ "degree": 2,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.5,
+ "hole": 4,
+ "breath": "draw",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 2,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.5,
+ "hole": 4,
+ "breath": "draw",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 2,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.5,
+ "hole": 4,
+ "breath": "draw",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 2,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.5,
+ "hole": 4,
+ "breath": "draw",
+ "bend": 0,
+ "overblow": false
+ }
+ ]
+ },
+ {
+ "notes": [
+ {
+ "degree": 2,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.5,
+ "hole": 4,
+ "breath": "draw",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 3,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.5,
+ "hole": 5,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 4,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 1,
+ "hole": 5,
+ "breath": "draw",
+ "bend": 0,
+ "overblow": false
+ }
+ ]
+ },
+ {
+ "notes": [
+ {
+ "degree": 3,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.5,
+ "hole": 5,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 3,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.5,
+ "hole": 5,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 3,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.5,
+ "hole": 5,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 3,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.5,
+ "hole": 5,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ }
+ ]
+ },
+ {
+ "notes": [
+ {
+ "degree": 3,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.5,
+ "hole": 5,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 4,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.5,
+ "hole": 5,
+ "breath": "draw",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 5,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 1,
+ "hole": 6,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ }
+ ]
+ }
+ ],
+ [
+ {
+ "notes": [
+ {
+ "degree": 5,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.5,
+ "hole": 6,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 3,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.5,
+ "hole": 5,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 3,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 1,
+ "hole": 5,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ }
+ ]
+ },
+ {
+ "notes": [
+ {
+ "degree": 4,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.5,
+ "hole": 5,
+ "breath": "draw",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 2,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.5,
+ "hole": 4,
+ "breath": "draw",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 2,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 1,
+ "hole": 4,
+ "breath": "draw",
+ "bend": 0,
+ "overblow": false
+ }
+ ]
+ },
+ {
+ "notes": [
+ {
+ "degree": 1,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.5,
+ "hole": 4,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 3,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.5,
+ "hole": 5,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 5,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.5,
+ "hole": 6,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 5,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.5,
+ "hole": 6,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ }
+ ]
+ },
+ {
+ "notes": [
+ {
+ "degree": 3,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 1,
+ "hole": 5,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 0,
+ "accidental": 0,
+ "octave": 0,
+ "beats": 1,
+ "hole": null,
+ "breath": null,
+ "bend": 0,
+ "overblow": false
+ }
+ ],
+ "sectionEnd": true
+ }
+ ]
+ ]
+}
diff --git a/src/data/scores/little-bee.json b/src/data/scores/little-bee.json
new file mode 100644
index 0000000..a3ed0e4
--- /dev/null
+++ b/src/data/scores/little-bee.json
@@ -0,0 +1,572 @@
+{
+ "id": "little-bee",
+ "title": "小蜜蜂",
+ "subtitle": "香港中乐团教程版",
+ "composer": "所选教程未署曲作者",
+ "key": "C",
+ "harmonicaKey": "C",
+ "position": "第一把位",
+ "timeSignature": "4/4",
+ "tempo": 96,
+ "difficulty": 1,
+ "tags": [
+ "入门",
+ "儿歌"
+ ],
+ "source": "香港中乐团《唢呐初级教程》,第26页。",
+ "sourceUrl": "https://ynyqxg.hkco.org/uploads/docs/5bd9828a7a7201.pdf#page=26",
+ "sourceFormat": "jianpu-image",
+ "sourceCheckedAt": "2026-10-23",
+ "builtin": true,
+ "order": 64,
+ "notes": "按原页音级移写1=C并提高八度,原页未单列1=调号。保留8小节4/4、全部八分与四分音及两处四分休止,C5–G5均有自然音孔位。与曲库中英国旧歌《勤劳的小蜜蜂》(The Busy Bee)是不同旋律。 不收录歌词和异音连奏线;速度为编辑练习建议,核对针对所列器乐版本。",
+ "lines": [
+ [
+ {
+ "notes": [
+ {
+ "degree": 5,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.5,
+ "hole": 6,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 3,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.5,
+ "hole": 5,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 3,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 1,
+ "hole": 5,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 4,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.5,
+ "hole": 5,
+ "breath": "draw",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 2,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.5,
+ "hole": 4,
+ "breath": "draw",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 2,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 1,
+ "hole": 4,
+ "breath": "draw",
+ "bend": 0,
+ "overblow": false
+ }
+ ]
+ },
+ {
+ "notes": [
+ {
+ "degree": 1,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.5,
+ "hole": 4,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 2,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.5,
+ "hole": 4,
+ "breath": "draw",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 3,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.5,
+ "hole": 5,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 4,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.5,
+ "hole": 5,
+ "breath": "draw",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 5,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.5,
+ "hole": 6,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 5,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.5,
+ "hole": 6,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 5,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 1,
+ "hole": 6,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ }
+ ]
+ },
+ {
+ "notes": [
+ {
+ "degree": 5,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.5,
+ "hole": 6,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 3,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.5,
+ "hole": 5,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 3,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 1,
+ "hole": 5,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 4,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.5,
+ "hole": 5,
+ "breath": "draw",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 2,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.5,
+ "hole": 4,
+ "breath": "draw",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 2,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 1,
+ "hole": 4,
+ "breath": "draw",
+ "bend": 0,
+ "overblow": false
+ }
+ ]
+ },
+ {
+ "notes": [
+ {
+ "degree": 1,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.5,
+ "hole": 4,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 3,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.5,
+ "hole": 5,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 5,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.5,
+ "hole": 6,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 5,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.5,
+ "hole": 6,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 3,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 1,
+ "hole": 5,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 0,
+ "accidental": 0,
+ "octave": 0,
+ "beats": 1,
+ "hole": null,
+ "breath": null,
+ "bend": 0,
+ "overblow": false
+ }
+ ]
+ }
+ ],
+ [
+ {
+ "notes": [
+ {
+ "degree": 2,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.5,
+ "hole": 4,
+ "breath": "draw",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 2,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.5,
+ "hole": 4,
+ "breath": "draw",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 2,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.5,
+ "hole": 4,
+ "breath": "draw",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 2,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.5,
+ "hole": 4,
+ "breath": "draw",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 2,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.5,
+ "hole": 4,
+ "breath": "draw",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 3,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.5,
+ "hole": 5,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 4,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 1,
+ "hole": 5,
+ "breath": "draw",
+ "bend": 0,
+ "overblow": false
+ }
+ ]
+ },
+ {
+ "notes": [
+ {
+ "degree": 3,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.5,
+ "hole": 5,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 3,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.5,
+ "hole": 5,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 3,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.5,
+ "hole": 5,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 3,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.5,
+ "hole": 5,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 3,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.5,
+ "hole": 5,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 4,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.5,
+ "hole": 5,
+ "breath": "draw",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 5,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 1,
+ "hole": 6,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ }
+ ]
+ },
+ {
+ "notes": [
+ {
+ "degree": 5,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.5,
+ "hole": 6,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 3,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.5,
+ "hole": 5,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 3,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 1,
+ "hole": 5,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 4,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.5,
+ "hole": 5,
+ "breath": "draw",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 2,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.5,
+ "hole": 4,
+ "breath": "draw",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 2,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 1,
+ "hole": 4,
+ "breath": "draw",
+ "bend": 0,
+ "overblow": false
+ }
+ ]
+ },
+ {
+ "notes": [
+ {
+ "degree": 1,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.5,
+ "hole": 4,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 3,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.5,
+ "hole": 5,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 5,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.5,
+ "hole": 6,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 5,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.5,
+ "hole": 6,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 1,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 1,
+ "hole": 4,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 0,
+ "accidental": 0,
+ "octave": 0,
+ "beats": 1,
+ "hole": null,
+ "breath": null,
+ "bend": 0,
+ "overblow": false
+ }
+ ],
+ "sectionEnd": true
+ }
+ ]
+ ]
+}
diff --git a/src/data/scores/little-ship.json b/src/data/scores/little-ship.json
new file mode 100644
index 0000000..f768a81
--- /dev/null
+++ b/src/data/scores/little-ship.json
@@ -0,0 +1,794 @@
+{
+ "id": "little-ship",
+ "title": "小小航船",
+ "subtitle": "The Little Ship · 英格兰旧歌",
+ "composer": "英格兰旧歌(歌集署名)",
+ "key": "C",
+ "harmonicaKey": "C",
+ "position": "第一把位",
+ "timeSignature": "6/8",
+ "tempo": 84,
+ "difficulty": 3,
+ "tags": [
+ "传统曲",
+ "西方民谣",
+ "压音",
+ "延长记号"
+ ],
+ "source": "The Everyday Song Book (1927), No.85;John Chambers ABC 转录 (2017)",
+ "sourceUrl": "https://trillian.mit.edu/~jc/music/book/EverydaySongBook/085_the_Little_Ship.abc",
+ "sourceFormat": "music-text",
+ "sourceCheckedAt": "2026-10-23",
+ "builtin": true,
+ "order": 59,
+ "notes": "原A4主音移为C5;17个书写小节,半拍弱起与末小节2.5拍互补(四分音符计拍)。保留6处同音延音和第13书写小节的自由延长。音域E4–G5,低fa和低la需压音;连续十六分同音仍保留各自音头及延音,不合并改写。 不收录歌词和异音连奏线;速度为编辑练习建议,核对针对所列ABC版本。",
+ "lines": [
+ [
+ {
+ "notes": [
+ {
+ "degree": 5,
+ "accidental": 0,
+ "octave": 0,
+ "beats": 0.5,
+ "hole": 3,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ }
+ ]
+ },
+ {
+ "notes": [
+ {
+ "degree": 1,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 1,
+ "hole": 4,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 1,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.5,
+ "hole": 4,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 1,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.5,
+ "hole": 4,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 7,
+ "accidental": 0,
+ "octave": 0,
+ "beats": 0.5,
+ "hole": 3,
+ "breath": "draw",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 6,
+ "accidental": 0,
+ "octave": 0,
+ "beats": 0.5,
+ "hole": 3,
+ "breath": "draw",
+ "bend": 2,
+ "overblow": false
+ }
+ ]
+ },
+ {
+ "notes": [
+ {
+ "degree": 5,
+ "accidental": 0,
+ "octave": 0,
+ "beats": 1,
+ "hole": 3,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 4,
+ "accidental": 0,
+ "octave": 0,
+ "beats": 0.5,
+ "hole": 2,
+ "breath": "draw",
+ "bend": 2,
+ "overblow": false
+ },
+ {
+ "degree": 3,
+ "accidental": 0,
+ "octave": 0,
+ "beats": 1,
+ "hole": 2,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 5,
+ "accidental": 0,
+ "octave": 0,
+ "beats": 0.5,
+ "hole": 3,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ }
+ ]
+ },
+ {
+ "notes": [
+ {
+ "degree": 1,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 1,
+ "hole": 4,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 1,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.5,
+ "hole": 4,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 2,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 1,
+ "hole": 4,
+ "breath": "draw",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 7,
+ "accidental": 0,
+ "octave": 0,
+ "beats": 0.5,
+ "hole": 3,
+ "breath": "draw",
+ "bend": 0,
+ "overblow": false
+ }
+ ]
+ },
+ {
+ "notes": [
+ {
+ "degree": 1,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 1,
+ "dotted": true,
+ "tie": true,
+ "hole": 4,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 1,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 1,
+ "hole": 4,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 5,
+ "accidental": 0,
+ "octave": 0,
+ "beats": 0.5,
+ "hole": 3,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ }
+ ]
+ }
+ ],
+ [
+ {
+ "notes": [
+ {
+ "degree": 1,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 1,
+ "hole": 4,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 2,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.5,
+ "hole": 4,
+ "breath": "draw",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 3,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 1,
+ "hole": 5,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 4,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.5,
+ "hole": 5,
+ "breath": "draw",
+ "bend": 0,
+ "overblow": false
+ }
+ ]
+ },
+ {
+ "notes": [
+ {
+ "degree": 5,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 1,
+ "hole": 6,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 3,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.5,
+ "hole": 5,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 1,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 1,
+ "hole": 4,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 2,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.5,
+ "hole": 4,
+ "breath": "draw",
+ "bend": 0,
+ "overblow": false
+ }
+ ]
+ },
+ {
+ "notes": [
+ {
+ "degree": 3,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 1,
+ "hole": 5,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 3,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.5,
+ "hole": 5,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 3,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.5,
+ "hole": 5,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 2,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.5,
+ "hole": 4,
+ "breath": "draw",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 1,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.5,
+ "hole": 4,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ }
+ ]
+ },
+ {
+ "notes": [
+ {
+ "degree": 2,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 1,
+ "dotted": true,
+ "tie": true,
+ "hole": 4,
+ "breath": "draw",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 2,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 1,
+ "hole": 4,
+ "breath": "draw",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 5,
+ "accidental": 0,
+ "octave": 0,
+ "beats": 0.25,
+ "tie": true,
+ "hole": 3,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 5,
+ "accidental": 0,
+ "octave": 0,
+ "beats": 0.25,
+ "hole": 3,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ }
+ ]
+ },
+ {
+ "notes": [
+ {
+ "degree": 1,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 1,
+ "hole": 4,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 2,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.5,
+ "hole": 4,
+ "breath": "draw",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 3,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 1,
+ "hole": 5,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 4,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.5,
+ "hole": 5,
+ "breath": "draw",
+ "bend": 0,
+ "overblow": false
+ }
+ ]
+ }
+ ],
+ [
+ {
+ "notes": [
+ {
+ "degree": 5,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 1,
+ "hole": 6,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 3,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.5,
+ "hole": 5,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 1,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 1,
+ "hole": 4,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 2,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.25,
+ "tie": true,
+ "hole": 4,
+ "breath": "draw",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 2,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.25,
+ "hole": 4,
+ "breath": "draw",
+ "bend": 0,
+ "overblow": false
+ }
+ ]
+ },
+ {
+ "notes": [
+ {
+ "degree": 3,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 1,
+ "hole": 5,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 3,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.5,
+ "hole": 5,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 3,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.5,
+ "hole": 5,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 2,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.5,
+ "hole": 4,
+ "breath": "draw",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 1,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.5,
+ "hole": 4,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ }
+ ]
+ },
+ {
+ "notes": [
+ {
+ "degree": 2,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 1,
+ "hole": 4,
+ "breath": "draw",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 0,
+ "accidental": 0,
+ "octave": 0,
+ "beats": 0.5,
+ "hole": null,
+ "breath": null,
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 3,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 1,
+ "fermata": true,
+ "hole": 5,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 2,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.5,
+ "hole": 4,
+ "breath": "draw",
+ "bend": 0,
+ "overblow": false
+ }
+ ]
+ },
+ {
+ "notes": [
+ {
+ "degree": 1,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 1,
+ "hole": 4,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 1,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.5,
+ "hole": 4,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 1,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.5,
+ "hole": 4,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 7,
+ "accidental": 0,
+ "octave": 0,
+ "beats": 0.5,
+ "hole": 3,
+ "breath": "draw",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 6,
+ "accidental": 0,
+ "octave": 0,
+ "beats": 0.5,
+ "hole": 3,
+ "breath": "draw",
+ "bend": 2,
+ "overblow": false
+ }
+ ]
+ },
+ {
+ "notes": [
+ {
+ "degree": 5,
+ "accidental": 0,
+ "octave": 0,
+ "beats": 1,
+ "hole": 3,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 4,
+ "accidental": 0,
+ "octave": 0,
+ "beats": 0.5,
+ "hole": 2,
+ "breath": "draw",
+ "bend": 2,
+ "overblow": false
+ },
+ {
+ "degree": 3,
+ "accidental": 0,
+ "octave": 0,
+ "beats": 1,
+ "hole": 2,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 5,
+ "accidental": 0,
+ "octave": 0,
+ "beats": 0.25,
+ "tie": true,
+ "hole": 3,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 5,
+ "accidental": 0,
+ "octave": 0,
+ "beats": 0.25,
+ "hole": 3,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ }
+ ]
+ }
+ ],
+ [
+ {
+ "notes": [
+ {
+ "degree": 1,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 1,
+ "hole": 4,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 1,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.5,
+ "hole": 4,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 2,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 1,
+ "hole": 4,
+ "breath": "draw",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 7,
+ "accidental": 0,
+ "octave": 0,
+ "beats": 0.5,
+ "hole": 3,
+ "breath": "draw",
+ "bend": 0,
+ "overblow": false
+ }
+ ]
+ },
+ {
+ "notes": [
+ {
+ "degree": 1,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 1,
+ "dotted": true,
+ "tie": true,
+ "hole": 4,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 1,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 1,
+ "hole": 4,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ }
+ ],
+ "sectionEnd": true
+ }
+ ]
+ ]
+}
diff --git a/src/data/scores/london-bridge.json b/src/data/scores/london-bridge.json
new file mode 100644
index 0000000..16d5d6a
--- /dev/null
+++ b/src/data/scores/london-bridge.json
@@ -0,0 +1,359 @@
+{
+ "id": "london-bridge",
+ "title": "伦敦桥",
+ "subtitle": "London Bridge · 1927 歌集版",
+ "composer": "英国传统童谣",
+ "key": "C",
+ "harmonicaKey": "C",
+ "position": "第一把位",
+ "timeSignature": "4/4",
+ "tempo": 112,
+ "difficulty": 1,
+ "tags": [
+ "西方童谣",
+ "附点",
+ "自然音"
+ ],
+ "source": "The Everyday Song Book (1927), No.18;John Chambers 2015 年 ABC 转录。取上声部 8 小节完整旋律,原 F 调移至 C 调并升八度。",
+ "sourceUrl": "https://trillian.mit.edu/~jc/music/book/EverydaySongBook/018_London_Bridge.abc",
+ "sourceFormat": "music-text",
+ "sourceCheckedAt": "2026-10-22",
+ "builtin": true,
+ "order": 18,
+ "notes": "采用该歌集的 4/4 版本:开头附点四分音符,保留同音延音线与末尾休止。不混用常见 2/4 版本的时值;省略下声部与歌词。速度为练习建议。",
+ "lines": [
+ [
+ {
+ "notes": [
+ {
+ "degree": 5,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 1,
+ "dotted": true,
+ "hole": 6,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 6,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.5,
+ "hole": 6,
+ "breath": "draw",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 5,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 1,
+ "hole": 6,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 4,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 1,
+ "hole": 5,
+ "breath": "draw",
+ "bend": 0,
+ "overblow": false
+ }
+ ]
+ },
+ {
+ "notes": [
+ {
+ "degree": 3,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 1,
+ "hole": 5,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 4,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 1,
+ "hole": 5,
+ "breath": "draw",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 5,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 1,
+ "tie": true,
+ "hole": 6,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 5,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 1,
+ "hole": 6,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ }
+ ]
+ },
+ {
+ "notes": [
+ {
+ "degree": 2,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 1,
+ "hole": 4,
+ "breath": "draw",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 3,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 1,
+ "hole": 5,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 4,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 1,
+ "tie": true,
+ "hole": 5,
+ "breath": "draw",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 4,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 1,
+ "hole": 5,
+ "breath": "draw",
+ "bend": 0,
+ "overblow": false
+ }
+ ]
+ },
+ {
+ "notes": [
+ {
+ "degree": 3,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 1,
+ "hole": 5,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 4,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 1,
+ "hole": 5,
+ "breath": "draw",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 5,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 1,
+ "tie": true,
+ "hole": 6,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 5,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 1,
+ "hole": 6,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ }
+ ]
+ }
+ ],
+ [
+ {
+ "notes": [
+ {
+ "degree": 5,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 1,
+ "dotted": true,
+ "hole": 6,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 6,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.5,
+ "hole": 6,
+ "breath": "draw",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 5,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 1,
+ "hole": 6,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 4,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 1,
+ "hole": 5,
+ "breath": "draw",
+ "bend": 0,
+ "overblow": false
+ }
+ ]
+ },
+ {
+ "notes": [
+ {
+ "degree": 3,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 1,
+ "hole": 5,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 4,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 1,
+ "hole": 5,
+ "breath": "draw",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 5,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 1,
+ "tie": true,
+ "hole": 6,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 5,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 1,
+ "hole": 6,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ }
+ ]
+ },
+ {
+ "notes": [
+ {
+ "degree": 2,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 2,
+ "hole": 4,
+ "breath": "draw",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 5,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 2,
+ "hole": 6,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ }
+ ]
+ },
+ {
+ "notes": [
+ {
+ "degree": 3,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 1,
+ "hole": 5,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 1,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 2,
+ "hole": 4,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 0,
+ "accidental": 0,
+ "octave": 0,
+ "beats": 1,
+ "hole": null,
+ "breath": null,
+ "bend": 0,
+ "overblow": false
+ }
+ ],
+ "sectionEnd": true
+ }
+ ]
+ ]
+}
diff --git a/src/data/scores/longing-for-spring.json b/src/data/scores/longing-for-spring.json
new file mode 100644
index 0000000..101d750
--- /dev/null
+++ b/src/data/scores/longing-for-spring.json
@@ -0,0 +1,823 @@
+{
+ "id": "longing-for-spring",
+ "title": "渴望春天",
+ "subtitle": "Sehnsucht nach dem Frühlinge · K.596",
+ "composer": "W. A. Mozart",
+ "key": "C",
+ "harmonicaKey": "C",
+ "position": "第一把位",
+ "timeSignature": "6/8",
+ "tempo": 96,
+ "difficulty": 3,
+ "tags": [
+ "古典",
+ "前倚音",
+ "六八拍",
+ "压音"
+ ],
+ "source": "人民教育出版社《音乐七年级下册·简谱》印刷第 4–5 页(PDF 第 9–10 页);完整主旋律,保留原 1=C 音区。",
+ "sourceUrl": "https://dev98.oa.henanyuexue.com/static/szjc-resources/pdf/q/f/2/7.pdf#page=9",
+ "sourceFormat": "jianpu-image",
+ "sourceCheckedAt": "2026-10-22",
+ "builtin": true,
+ "order": 26,
+ "notes": "16 个主小节加八分弱起,末小节与弱起互补;保留同音延音、升 do、升 fa 及倒数第二小节的前倚音 sol。倚音为装饰音,不增加小节时值,须快速连入主音 fa。省略歌词及异音连奏线;速度为四分音符的练习建议。保持 C4–C5 音区以使用常规压音,未整体升八度。",
+ "lines": [
+ [
+ {
+ "notes": [
+ {
+ "degree": 1,
+ "accidental": 0,
+ "octave": 0,
+ "beats": 0.5,
+ "hole": 1,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ }
+ ]
+ },
+ {
+ "notes": [
+ {
+ "degree": 1,
+ "accidental": 0,
+ "octave": 0,
+ "beats": 1,
+ "hole": 1,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 3,
+ "accidental": 0,
+ "octave": 0,
+ "beats": 0.5,
+ "hole": 2,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 5,
+ "accidental": 0,
+ "octave": 0,
+ "beats": 1,
+ "hole": 3,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 1,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.5,
+ "hole": 4,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ }
+ ]
+ },
+ {
+ "notes": [
+ {
+ "degree": 5,
+ "accidental": 0,
+ "octave": 0,
+ "beats": 1,
+ "dotted": true,
+ "tie": true,
+ "hole": 3,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 5,
+ "accidental": 0,
+ "octave": 0,
+ "beats": 0.5,
+ "hole": 3,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 3,
+ "accidental": 0,
+ "octave": 0,
+ "beats": 0.5,
+ "hole": 2,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 1,
+ "accidental": 0,
+ "octave": 0,
+ "beats": 0.5,
+ "hole": 1,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ }
+ ]
+ },
+ {
+ "notes": [
+ {
+ "degree": 4,
+ "accidental": 0,
+ "octave": 0,
+ "beats": 1,
+ "hole": 2,
+ "breath": "draw",
+ "bend": 2,
+ "overblow": false
+ },
+ {
+ "degree": 4,
+ "accidental": 0,
+ "octave": 0,
+ "beats": 0.5,
+ "hole": 2,
+ "breath": "draw",
+ "bend": 2,
+ "overblow": false
+ },
+ {
+ "degree": 4,
+ "accidental": 0,
+ "octave": 0,
+ "beats": 0.5,
+ "hole": 2,
+ "breath": "draw",
+ "bend": 2,
+ "overblow": false
+ },
+ {
+ "degree": 5,
+ "accidental": 0,
+ "octave": 0,
+ "beats": 0.5,
+ "hole": 3,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 4,
+ "accidental": 0,
+ "octave": 0,
+ "beats": 0.5,
+ "hole": 2,
+ "breath": "draw",
+ "bend": 2,
+ "overblow": false
+ }
+ ]
+ },
+ {
+ "notes": [
+ {
+ "degree": 3,
+ "accidental": 0,
+ "octave": 0,
+ "beats": 1,
+ "dotted": true,
+ "hole": 2,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 0,
+ "accidental": 0,
+ "octave": 0,
+ "beats": 1,
+ "hole": null,
+ "breath": null,
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 1,
+ "accidental": 0,
+ "octave": 0,
+ "beats": 0.5,
+ "hole": 1,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ }
+ ]
+ }
+ ],
+ [
+ {
+ "notes": [
+ {
+ "degree": 1,
+ "accidental": 0,
+ "octave": 0,
+ "beats": 1,
+ "hole": 1,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 3,
+ "accidental": 0,
+ "octave": 0,
+ "beats": 0.5,
+ "hole": 2,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 5,
+ "accidental": 0,
+ "octave": 0,
+ "beats": 1,
+ "hole": 3,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 1,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.5,
+ "hole": 4,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ }
+ ]
+ },
+ {
+ "notes": [
+ {
+ "degree": 5,
+ "accidental": 0,
+ "octave": 0,
+ "beats": 1,
+ "dotted": true,
+ "tie": true,
+ "hole": 3,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 5,
+ "accidental": 0,
+ "octave": 0,
+ "beats": 0.5,
+ "hole": 3,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 3,
+ "accidental": 0,
+ "octave": 0,
+ "beats": 0.5,
+ "hole": 2,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 1,
+ "accidental": 0,
+ "octave": 0,
+ "beats": 0.5,
+ "hole": 1,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ }
+ ]
+ },
+ {
+ "notes": [
+ {
+ "degree": 2,
+ "accidental": 0,
+ "octave": 0,
+ "beats": 1,
+ "hole": 1,
+ "breath": "draw",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 2,
+ "accidental": 0,
+ "octave": 0,
+ "beats": 0.5,
+ "hole": 1,
+ "breath": "draw",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 2,
+ "accidental": 0,
+ "octave": 0,
+ "beats": 0.5,
+ "hole": 1,
+ "breath": "draw",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 3,
+ "accidental": 0,
+ "octave": 0,
+ "beats": 0.5,
+ "hole": 2,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 2,
+ "accidental": 0,
+ "octave": 0,
+ "beats": 0.5,
+ "hole": 1,
+ "breath": "draw",
+ "bend": 0,
+ "overblow": false
+ }
+ ]
+ },
+ {
+ "notes": [
+ {
+ "degree": 1,
+ "accidental": 0,
+ "octave": 0,
+ "beats": 1,
+ "dotted": true,
+ "hole": 1,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 0,
+ "accidental": 0,
+ "octave": 0,
+ "beats": 1,
+ "hole": null,
+ "breath": null,
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 3,
+ "accidental": 0,
+ "octave": 0,
+ "beats": 0.5,
+ "hole": 2,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ }
+ ]
+ }
+ ],
+ [
+ {
+ "notes": [
+ {
+ "degree": 4,
+ "accidental": 0,
+ "octave": 0,
+ "beats": 1,
+ "hole": 2,
+ "breath": "draw",
+ "bend": 2,
+ "overblow": false
+ },
+ {
+ "degree": 1,
+ "accidental": 1,
+ "octave": 0,
+ "beats": 0.5,
+ "hole": 1,
+ "breath": "draw",
+ "bend": 1,
+ "overblow": false
+ },
+ {
+ "degree": 2,
+ "accidental": 0,
+ "octave": 0,
+ "beats": 0.5,
+ "hole": 1,
+ "breath": "draw",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 3,
+ "accidental": 0,
+ "octave": 0,
+ "beats": 0.5,
+ "hole": 2,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 4,
+ "accidental": 0,
+ "octave": 0,
+ "beats": 0.5,
+ "hole": 2,
+ "breath": "draw",
+ "bend": 2,
+ "overblow": false
+ }
+ ]
+ },
+ {
+ "notes": [
+ {
+ "degree": 5,
+ "accidental": 0,
+ "octave": 0,
+ "beats": 1,
+ "hole": 3,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 3,
+ "accidental": 0,
+ "octave": 0,
+ "beats": 0.5,
+ "hole": 2,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 1,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.5,
+ "hole": 4,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 0,
+ "accidental": 0,
+ "octave": 0,
+ "beats": 0.5,
+ "hole": null,
+ "breath": null,
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 1,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.5,
+ "hole": 4,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ }
+ ]
+ },
+ {
+ "notes": [
+ {
+ "degree": 1,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.5,
+ "hole": 4,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 7,
+ "accidental": 0,
+ "octave": 0,
+ "beats": 0.5,
+ "hole": 3,
+ "breath": "draw",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 6,
+ "accidental": 0,
+ "octave": 0,
+ "beats": 0.5,
+ "hole": 3,
+ "breath": "draw",
+ "bend": 2,
+ "overblow": false
+ },
+ {
+ "degree": 6,
+ "accidental": 0,
+ "octave": 0,
+ "beats": 0.5,
+ "hole": 3,
+ "breath": "draw",
+ "bend": 2,
+ "overblow": false
+ },
+ {
+ "degree": 5,
+ "accidental": 0,
+ "octave": 0,
+ "beats": 0.5,
+ "hole": 3,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 4,
+ "accidental": 1,
+ "octave": 0,
+ "beats": 0.5,
+ "hole": 2,
+ "breath": "draw",
+ "bend": 1,
+ "overblow": false
+ }
+ ]
+ },
+ {
+ "notes": [
+ {
+ "degree": 5,
+ "accidental": 0,
+ "octave": 0,
+ "beats": 1,
+ "dotted": true,
+ "hole": 3,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 0,
+ "accidental": 0,
+ "octave": 0,
+ "beats": 1,
+ "hole": null,
+ "breath": null,
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 1,
+ "accidental": 0,
+ "octave": 0,
+ "beats": 0.5,
+ "hole": 1,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ }
+ ]
+ }
+ ],
+ [
+ {
+ "notes": [
+ {
+ "degree": 1,
+ "accidental": 0,
+ "octave": 0,
+ "beats": 1,
+ "hole": 1,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 3,
+ "accidental": 0,
+ "octave": 0,
+ "beats": 0.5,
+ "hole": 2,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 5,
+ "accidental": 0,
+ "octave": 0,
+ "beats": 1,
+ "hole": 3,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 1,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.5,
+ "hole": 4,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ }
+ ]
+ },
+ {
+ "notes": [
+ {
+ "degree": 1,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.5,
+ "hole": 4,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 6,
+ "accidental": 0,
+ "octave": 0,
+ "beats": 0.5,
+ "hole": 3,
+ "breath": "draw",
+ "bend": 2,
+ "overblow": false
+ },
+ {
+ "degree": 4,
+ "accidental": 0,
+ "octave": 0,
+ "beats": 0.5,
+ "hole": 2,
+ "breath": "draw",
+ "bend": 2,
+ "overblow": false
+ },
+ {
+ "degree": 2,
+ "accidental": 0,
+ "octave": 0,
+ "beats": 1,
+ "hole": 1,
+ "breath": "draw",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 6,
+ "accidental": 0,
+ "octave": 0,
+ "beats": 0.5,
+ "hole": 3,
+ "breath": "draw",
+ "bend": 2,
+ "overblow": false
+ }
+ ]
+ },
+ {
+ "notes": [
+ {
+ "degree": 5,
+ "accidental": 0,
+ "octave": 0,
+ "beats": 0.5,
+ "hole": 3,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 3,
+ "accidental": 0,
+ "octave": 0,
+ "beats": 0.5,
+ "hole": 2,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 5,
+ "accidental": 0,
+ "octave": 0,
+ "beats": 0.5,
+ "hole": 3,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 4,
+ "accidental": 0,
+ "octave": 0,
+ "beats": 0.5,
+ "graceNotes": [
+ {
+ "degree": 5,
+ "accidental": 0,
+ "octave": 0,
+ "beats": 0.25,
+ "hole": 3,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ }
+ ],
+ "hole": 2,
+ "breath": "draw",
+ "bend": 2,
+ "overblow": false
+ },
+ {
+ "degree": 3,
+ "accidental": 0,
+ "octave": 0,
+ "beats": 0.5,
+ "hole": 2,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 2,
+ "accidental": 0,
+ "octave": 0,
+ "beats": 0.5,
+ "hole": 1,
+ "breath": "draw",
+ "bend": 0,
+ "overblow": false
+ }
+ ]
+ },
+ {
+ "notes": [
+ {
+ "degree": 1,
+ "accidental": 0,
+ "octave": 0,
+ "beats": 1,
+ "hole": 1,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 0,
+ "accidental": 0,
+ "octave": 0,
+ "beats": 0.5,
+ "hole": null,
+ "breath": null,
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 0,
+ "accidental": 0,
+ "octave": 0,
+ "beats": 1,
+ "hole": null,
+ "breath": null,
+ "bend": 0,
+ "overblow": false
+ }
+ ],
+ "sectionEnd": true
+ }
+ ]
+ ]
+}
diff --git a/src/data/scores/low-blues-scale-study.json b/src/data/scores/low-blues-scale-study.json
new file mode 100644
index 0000000..2d59280
--- /dev/null
+++ b/src/data/scores/low-blues-scale-study.json
@@ -0,0 +1,413 @@
+{
+ "id": "low-blues-scale-study",
+ "title": "低音区蓝调音阶练习",
+ "subtitle": "G Blues Scale · Bend Accuracy",
+ "composer": "HarpScore 原创练习曲",
+ "key": "G",
+ "harmonicaKey": "C",
+ "position": "第二把位",
+ "timeSignature": "4/4",
+ "tempo": 72,
+ "difficulty": 3,
+ "tags": [
+ "布鲁斯",
+ "原创练习",
+ "压音",
+ "蓝调音阶"
+ ],
+ "source": "HarpScore 原创:G 蓝调六声音阶的上行、下行、半音定位和短句收束练习;可自由使用。",
+ "sourceFormat": "original",
+ "sourceCheckedAt": "2026-10-22",
+ "builtin": true,
+ "order": 28,
+ "notes": "音集 G–Bb–C–Db–D–F;Bb4 为 3 孔吸压半音,Db5 为 4 孔吸压半音。第 5–6 小节对比 C–Db–D 与 D–Db–C,先慢速分音保持音准,再连贯演奏。八分音符等长,曲末留一拍休止;全曲为 8 小节专项练习。G4 自动标为 3 孔吹,可选同音高 2 孔吸。",
+ "lines": [
+ [
+ {
+ "notes": [
+ {
+ "degree": 1,
+ "accidental": 0,
+ "octave": 0,
+ "beats": 1,
+ "hole": 3,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 3,
+ "accidental": -1,
+ "octave": 0,
+ "beats": 1,
+ "hole": 3,
+ "breath": "draw",
+ "bend": 1,
+ "overblow": false
+ },
+ {
+ "degree": 4,
+ "accidental": 0,
+ "octave": 0,
+ "beats": 1,
+ "hole": 4,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 5,
+ "accidental": -1,
+ "octave": 0,
+ "beats": 1,
+ "hole": 4,
+ "breath": "draw",
+ "bend": 1,
+ "overblow": false
+ }
+ ]
+ },
+ {
+ "notes": [
+ {
+ "degree": 5,
+ "accidental": 0,
+ "octave": 0,
+ "beats": 1,
+ "hole": 4,
+ "breath": "draw",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 7,
+ "accidental": -1,
+ "octave": 0,
+ "beats": 1,
+ "hole": 5,
+ "breath": "draw",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 1,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 2,
+ "hole": 6,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ }
+ ]
+ },
+ {
+ "notes": [
+ {
+ "degree": 1,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 1,
+ "hole": 6,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 7,
+ "accidental": -1,
+ "octave": 0,
+ "beats": 1,
+ "hole": 5,
+ "breath": "draw",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 5,
+ "accidental": 0,
+ "octave": 0,
+ "beats": 1,
+ "hole": 4,
+ "breath": "draw",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 5,
+ "accidental": -1,
+ "octave": 0,
+ "beats": 1,
+ "hole": 4,
+ "breath": "draw",
+ "bend": 1,
+ "overblow": false
+ }
+ ]
+ },
+ {
+ "notes": [
+ {
+ "degree": 4,
+ "accidental": 0,
+ "octave": 0,
+ "beats": 1,
+ "hole": 4,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 3,
+ "accidental": -1,
+ "octave": 0,
+ "beats": 1,
+ "hole": 3,
+ "breath": "draw",
+ "bend": 1,
+ "overblow": false
+ },
+ {
+ "degree": 1,
+ "accidental": 0,
+ "octave": 0,
+ "beats": 2,
+ "hole": 3,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ }
+ ]
+ }
+ ],
+ [
+ {
+ "notes": [
+ {
+ "degree": 4,
+ "accidental": 0,
+ "octave": 0,
+ "beats": 0.5,
+ "hole": 4,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 5,
+ "accidental": -1,
+ "octave": 0,
+ "beats": 0.5,
+ "hole": 4,
+ "breath": "draw",
+ "bend": 1,
+ "overblow": false
+ },
+ {
+ "degree": 5,
+ "accidental": 0,
+ "octave": 0,
+ "beats": 1,
+ "hole": 4,
+ "breath": "draw",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 4,
+ "accidental": 0,
+ "octave": 0,
+ "beats": 0.5,
+ "hole": 4,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 5,
+ "accidental": -1,
+ "octave": 0,
+ "beats": 0.5,
+ "hole": 4,
+ "breath": "draw",
+ "bend": 1,
+ "overblow": false
+ },
+ {
+ "degree": 5,
+ "accidental": 0,
+ "octave": 0,
+ "beats": 1,
+ "hole": 4,
+ "breath": "draw",
+ "bend": 0,
+ "overblow": false
+ }
+ ]
+ },
+ {
+ "notes": [
+ {
+ "degree": 5,
+ "accidental": 0,
+ "octave": 0,
+ "beats": 0.5,
+ "hole": 4,
+ "breath": "draw",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 5,
+ "accidental": -1,
+ "octave": 0,
+ "beats": 0.5,
+ "hole": 4,
+ "breath": "draw",
+ "bend": 1,
+ "overblow": false
+ },
+ {
+ "degree": 4,
+ "accidental": 0,
+ "octave": 0,
+ "beats": 1,
+ "hole": 4,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 5,
+ "accidental": 0,
+ "octave": 0,
+ "beats": 0.5,
+ "hole": 4,
+ "breath": "draw",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 5,
+ "accidental": -1,
+ "octave": 0,
+ "beats": 0.5,
+ "hole": 4,
+ "breath": "draw",
+ "bend": 1,
+ "overblow": false
+ },
+ {
+ "degree": 4,
+ "accidental": 0,
+ "octave": 0,
+ "beats": 1,
+ "hole": 4,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ }
+ ]
+ },
+ {
+ "notes": [
+ {
+ "degree": 3,
+ "accidental": -1,
+ "octave": 0,
+ "beats": 0.5,
+ "hole": 3,
+ "breath": "draw",
+ "bend": 1,
+ "overblow": false
+ },
+ {
+ "degree": 4,
+ "accidental": 0,
+ "octave": 0,
+ "beats": 0.5,
+ "hole": 4,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 5,
+ "accidental": -1,
+ "octave": 0,
+ "beats": 0.5,
+ "hole": 4,
+ "breath": "draw",
+ "bend": 1,
+ "overblow": false
+ },
+ {
+ "degree": 5,
+ "accidental": 0,
+ "octave": 0,
+ "beats": 0.5,
+ "hole": 4,
+ "breath": "draw",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 7,
+ "accidental": -1,
+ "octave": 0,
+ "beats": 1,
+ "hole": 5,
+ "breath": "draw",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 5,
+ "accidental": 0,
+ "octave": 0,
+ "beats": 1,
+ "hole": 4,
+ "breath": "draw",
+ "bend": 0,
+ "overblow": false
+ }
+ ]
+ },
+ {
+ "notes": [
+ {
+ "degree": 3,
+ "accidental": -1,
+ "octave": 0,
+ "beats": 1,
+ "hole": 3,
+ "breath": "draw",
+ "bend": 1,
+ "overblow": false
+ },
+ {
+ "degree": 1,
+ "accidental": 0,
+ "octave": 0,
+ "beats": 2,
+ "hole": 3,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 0,
+ "accidental": 0,
+ "octave": 0,
+ "beats": 1,
+ "hole": null,
+ "breath": null,
+ "bend": 0,
+ "overblow": false
+ }
+ ],
+ "sectionEnd": true
+ }
+ ]
+ ]
+}
diff --git a/src/data/scores/lucy-locket.json b/src/data/scores/lucy-locket.json
new file mode 100644
index 0000000..28c9057
--- /dev/null
+++ b/src/data/scores/lucy-locket.json
@@ -0,0 +1,374 @@
+{
+ "id": "lucy-locket",
+ "title": "露西的口袋",
+ "subtitle": "Lucy Locket · 1927 歌集版本",
+ "composer": "G. M. S.(所选歌集署名)",
+ "key": "C",
+ "harmonicaKey": "C",
+ "position": "第一把位",
+ "timeSignature": "2/4",
+ "tempo": 96,
+ "difficulty": 1,
+ "tags": [
+ "入门",
+ "儿歌"
+ ],
+ "source": "The Everyday Song Book (1927), No.67;John Chambers ABC 转录",
+ "sourceUrl": "https://trillian.mit.edu/~jc/music/book/EverydaySongBook/067_Lucy_Locket.abc",
+ "sourceFormat": "music-text",
+ "sourceCheckedAt": "2026-10-23",
+ "builtin": true,
+ "order": 48,
+ "notes": "完整16小节,仅四分和二分时值;保留低 sol 跳进及第14小节低 si。采用歌集署名 G. M. S. 的版本,不等同于所有同名童谣旋律。 仅录主旋律,不录歌词、伴奏及异音连奏线;速度为编辑练习建议。 原 G4 主音移为 C5,所有音符整体上移 5 个半音。",
+ "lines": [
+ [
+ {
+ "notes": [
+ {
+ "degree": 1,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 1,
+ "hole": 4,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 5,
+ "accidental": 0,
+ "octave": 0,
+ "beats": 1,
+ "hole": 3,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ }
+ ]
+ },
+ {
+ "notes": [
+ {
+ "degree": 5,
+ "accidental": 0,
+ "octave": 0,
+ "beats": 1,
+ "hole": 3,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 1,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 1,
+ "hole": 4,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ }
+ ]
+ },
+ {
+ "notes": [
+ {
+ "degree": 2,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 1,
+ "hole": 4,
+ "breath": "draw",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 5,
+ "accidental": 0,
+ "octave": 0,
+ "beats": 1,
+ "hole": 3,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ }
+ ]
+ },
+ {
+ "notes": [
+ {
+ "degree": 5,
+ "accidental": 0,
+ "octave": 0,
+ "beats": 1,
+ "hole": 3,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 2,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 1,
+ "hole": 4,
+ "breath": "draw",
+ "bend": 0,
+ "overblow": false
+ }
+ ]
+ },
+ {
+ "notes": [
+ {
+ "degree": 3,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 1,
+ "hole": 5,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 1,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 1,
+ "hole": 4,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ }
+ ]
+ },
+ {
+ "notes": [
+ {
+ "degree": 5,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 1,
+ "hole": 6,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 3,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 1,
+ "hole": 5,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ }
+ ]
+ },
+ {
+ "notes": [
+ {
+ "degree": 3,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 2,
+ "hole": 5,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ }
+ ]
+ },
+ {
+ "notes": [
+ {
+ "degree": 2,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 2,
+ "hole": 4,
+ "breath": "draw",
+ "bend": 0,
+ "overblow": false
+ }
+ ]
+ }
+ ],
+ [
+ {
+ "notes": [
+ {
+ "degree": 1,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 1,
+ "hole": 4,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 5,
+ "accidental": 0,
+ "octave": 0,
+ "beats": 1,
+ "hole": 3,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ }
+ ]
+ },
+ {
+ "notes": [
+ {
+ "degree": 5,
+ "accidental": 0,
+ "octave": 0,
+ "beats": 1,
+ "hole": 3,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 1,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 1,
+ "hole": 4,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ }
+ ]
+ },
+ {
+ "notes": [
+ {
+ "degree": 2,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 1,
+ "hole": 4,
+ "breath": "draw",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 5,
+ "accidental": 0,
+ "octave": 0,
+ "beats": 1,
+ "hole": 3,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ }
+ ]
+ },
+ {
+ "notes": [
+ {
+ "degree": 5,
+ "accidental": 0,
+ "octave": 0,
+ "beats": 1,
+ "hole": 3,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 2,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 1,
+ "hole": 4,
+ "breath": "draw",
+ "bend": 0,
+ "overblow": false
+ }
+ ]
+ },
+ {
+ "notes": [
+ {
+ "degree": 3,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 1,
+ "hole": 5,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 1,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 1,
+ "hole": 4,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ }
+ ]
+ },
+ {
+ "notes": [
+ {
+ "degree": 2,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 1,
+ "hole": 4,
+ "breath": "draw",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 7,
+ "accidental": 0,
+ "octave": 0,
+ "beats": 1,
+ "hole": 3,
+ "breath": "draw",
+ "bend": 0,
+ "overblow": false
+ }
+ ]
+ },
+ {
+ "notes": [
+ {
+ "degree": 2,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 2,
+ "hole": 4,
+ "breath": "draw",
+ "bend": 0,
+ "overblow": false
+ }
+ ]
+ },
+ {
+ "notes": [
+ {
+ "degree": 1,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 2,
+ "hole": 4,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ }
+ ],
+ "sectionEnd": true
+ }
+ ]
+ ]
+}
diff --git a/src/data/scores/mary-little-lamb.json b/src/data/scores/mary-little-lamb.json
index e781e41..72d9385 100644
--- a/src/data/scores/mary-little-lamb.json
+++ b/src/data/scores/mary-little-lamb.json
@@ -13,15 +13,29 @@
"儿歌",
"入门"
],
- "source": "LINTJ 文字数字简谱《Mary Had a Little Lamb》;按常见 4/4 教学分句补全时值",
- "sourceUrl": "https://www.lintj.com/collections/2020/04/08/SimpleMusic12345.html",
- "sourceFormat": "jianpu-text",
- "sourceCheckedAt": "2026-08-31",
+ "source": "The Everyday Song Book (1927), No.77;John Chambers ABC 转录 (2017)",
+ "sourceUrl": "https://trillian.mit.edu/~jc/music/book/EverydaySongBook/077_Mary_Had_a_Little_Lamb.abc",
+ "sourceFormat": "music-text",
+ "sourceCheckedAt": "2026-10-23",
"builtin": true,
"order": 10,
- "notes": "旋律只使用 1、2、3、5,整体升八度后全部为自然音,适合练习相邻音换气与重复吐音。",
+ "notes": "采用可核对时值的 1927 年版本替换旧无节奏文字来源。F4 主音移为 C5,半拍弱起、附点节奏、第 4 完整小节高 sol 同音延音和末尾休止均保留,9 小节含弱起。歌词不录入,速度为编辑建议。",
"lines": [
[
+ {
+ "notes": [
+ {
+ "degree": 3,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.5,
+ "hole": 5,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ }
+ ]
+ },
{
"notes": [
{
@@ -29,6 +43,7 @@
"accidental": 0,
"octave": 1,
"beats": 1,
+ "dotted": true,
"hole": 5,
"breath": "blow",
"bend": 0,
@@ -38,7 +53,7 @@
"degree": 2,
"accidental": 0,
"octave": 1,
- "beats": 1,
+ "beats": 0.5,
"hole": 4,
"breath": "draw",
"bend": 0,
@@ -160,7 +175,19 @@
"degree": 5,
"accidental": 0,
"octave": 1,
- "beats": 2,
+ "beats": 1,
+ "dotted": true,
+ "tie": true,
+ "hole": 6,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 5,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.5,
"hole": 6,
"breath": "blow",
"bend": 0,
@@ -177,6 +204,7 @@
"accidental": 0,
"octave": 1,
"beats": 1,
+ "dotted": true,
"hole": 5,
"breath": "blow",
"bend": 0,
@@ -186,7 +214,7 @@
"degree": 2,
"accidental": 0,
"octave": 1,
- "beats": 1,
+ "beats": 0.5,
"hole": 4,
"breath": "draw",
"bend": 0,
@@ -285,6 +313,7 @@
"accidental": 0,
"octave": 1,
"beats": 1,
+ "dotted": true,
"hole": 5,
"breath": "blow",
"bend": 0,
@@ -294,7 +323,7 @@
"degree": 2,
"accidental": 0,
"octave": 1,
- "beats": 1,
+ "beats": 0.5,
"hole": 4,
"breath": "draw",
"bend": 0,
@@ -308,11 +337,31 @@
"degree": 1,
"accidental": 0,
"octave": 1,
- "beats": 4,
+ "beats": 2,
"hole": 4,
"breath": "blow",
"bend": 0,
"overblow": false
+ },
+ {
+ "degree": 0,
+ "accidental": 0,
+ "octave": 0,
+ "beats": 1,
+ "hole": null,
+ "breath": null,
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 0,
+ "accidental": 0,
+ "octave": 0,
+ "beats": 0.5,
+ "hole": null,
+ "breath": null,
+ "bend": 0,
+ "overblow": false
}
],
"sectionEnd": true
diff --git a/src/data/scores/meng-jiang-nv.json b/src/data/scores/meng-jiang-nv.json
new file mode 100644
index 0000000..41b9e4d
--- /dev/null
+++ b/src/data/scores/meng-jiang-nv.json
@@ -0,0 +1,935 @@
+{
+ "id": "meng-jiang-nv",
+ "title": "孟姜女,哭长城",
+ "subtitle": "江苏民歌 · 粤教花城版",
+ "composer": "江苏民歌",
+ "key": "C",
+ "harmonicaKey": "C",
+ "timeSignature": "4/4",
+ "tempo": 64,
+ "difficulty": 4,
+ "tags": [
+ "中国民歌",
+ "江苏",
+ "前倚音",
+ "三十二分音符"
+ ],
+ "source": "粤教花城版《音乐六年级上册·简谱》印刷第49页/PDF第50页,完整8小节主旋律。原1=F改为1=C后整体提高八度。",
+ "sourceUrl": "https://lywgyxx.szftedu.cn/xkjc/yinyue/202209/P020220910588732922659.pdf#page=50",
+ "sourceFormat": "jianpu-image",
+ "sourceCheckedAt": "2026-10-22",
+ "builtin": true,
+ "order": 34,
+ "notes": "按所选教材保留繁密的加花旋律,包含五处附点十六分接三十二分、四处八分形状前倚音,以及第2、3小节的同音延音。音域E4–A5,低la为3孔吸压全音;慢练短音组,长音和休止保持原值。省略歌词及异音连奏线,速度为练习建议。",
+ "lines": [
+ [
+ {
+ "notes": [
+ {
+ "degree": 1,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.5,
+ "hole": 4,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 1,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 1,
+ "hole": 4,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 2,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.5,
+ "hole": 4,
+ "breath": "draw",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 3,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.25,
+ "dotted": true,
+ "hole": 5,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 5,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.125,
+ "hole": 6,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 3,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.25,
+ "hole": 5,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 2,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.25,
+ "hole": 4,
+ "breath": "draw",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 3,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 1,
+ "graceNotes": [
+ {
+ "degree": 2,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.5,
+ "hole": 4,
+ "breath": "draw",
+ "bend": 0,
+ "overblow": false
+ }
+ ],
+ "hole": 5,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ }
+ ]
+ },
+ {
+ "notes": [
+ {
+ "degree": 5,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.5,
+ "hole": 6,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 6,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.5,
+ "tie": true,
+ "hole": 6,
+ "breath": "draw",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 6,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.25,
+ "hole": 6,
+ "breath": "draw",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 5,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.25,
+ "tie": true,
+ "hole": 6,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 5,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.25,
+ "hole": 6,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 3,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.25,
+ "hole": 5,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 2,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 2,
+ "graceNotes": [
+ {
+ "degree": 3,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.5,
+ "hole": 5,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ }
+ ],
+ "hole": 4,
+ "breath": "draw",
+ "bend": 0,
+ "overblow": false
+ }
+ ]
+ }
+ ],
+ [
+ {
+ "notes": [
+ {
+ "degree": 2,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.5,
+ "hole": 4,
+ "breath": "draw",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 5,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.5,
+ "tie": true,
+ "hole": 6,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 5,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.25,
+ "hole": 6,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 3,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.25,
+ "tie": true,
+ "hole": 5,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 3,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.25,
+ "hole": 5,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 2,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.25,
+ "hole": 4,
+ "breath": "draw",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 1,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.25,
+ "hole": 4,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 6,
+ "accidental": 0,
+ "octave": 0,
+ "beats": 0.25,
+ "hole": 3,
+ "breath": "draw",
+ "bend": 2,
+ "overblow": false
+ },
+ {
+ "degree": 1,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.25,
+ "hole": 4,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 2,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.25,
+ "hole": 4,
+ "breath": "draw",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 3,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.25,
+ "hole": 5,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 0,
+ "accidental": 0,
+ "octave": 0,
+ "beats": 0.25,
+ "hole": null,
+ "breath": null,
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 5,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.25,
+ "hole": 6,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 3,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.25,
+ "hole": 5,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ }
+ ]
+ },
+ {
+ "notes": [
+ {
+ "degree": 2,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.25,
+ "dotted": true,
+ "hole": 4,
+ "breath": "draw",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 3,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.125,
+ "hole": 5,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 2,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.25,
+ "hole": 4,
+ "breath": "draw",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 1,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.25,
+ "hole": 4,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 6,
+ "accidental": 0,
+ "octave": 0,
+ "beats": 0.25,
+ "hole": 3,
+ "breath": "draw",
+ "bend": 2,
+ "overblow": false
+ },
+ {
+ "degree": 5,
+ "accidental": 0,
+ "octave": 0,
+ "beats": 0.25,
+ "hole": 3,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 1,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.25,
+ "hole": 4,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 6,
+ "accidental": 0,
+ "octave": 0,
+ "beats": 0.25,
+ "hole": 3,
+ "breath": "draw",
+ "bend": 2,
+ "overblow": false
+ },
+ {
+ "degree": 5,
+ "accidental": 0,
+ "octave": 0,
+ "beats": 2,
+ "graceNotes": [
+ {
+ "degree": 6,
+ "accidental": 0,
+ "octave": 0,
+ "beats": 0.5,
+ "hole": 3,
+ "breath": "draw",
+ "bend": 2,
+ "overblow": false
+ }
+ ],
+ "hole": 3,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ }
+ ]
+ }
+ ],
+ [
+ {
+ "notes": [
+ {
+ "degree": 5,
+ "accidental": 0,
+ "octave": 0,
+ "beats": 0.25,
+ "hole": 3,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 3,
+ "accidental": 0,
+ "octave": 0,
+ "beats": 0.25,
+ "hole": 2,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 5,
+ "accidental": 0,
+ "octave": 0,
+ "beats": 0.25,
+ "hole": 3,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 6,
+ "accidental": 0,
+ "octave": 0,
+ "beats": 0.25,
+ "hole": 3,
+ "breath": "draw",
+ "bend": 2,
+ "overblow": false
+ },
+ {
+ "degree": 1,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 1,
+ "hole": 4,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 2,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.25,
+ "dotted": true,
+ "hole": 4,
+ "breath": "draw",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 3,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.125,
+ "hole": 5,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 1,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.25,
+ "hole": 4,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 2,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.25,
+ "hole": 4,
+ "breath": "draw",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 3,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 1,
+ "hole": 5,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ }
+ ]
+ },
+ {
+ "notes": [
+ {
+ "degree": 5,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.5,
+ "hole": 6,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 3,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.25,
+ "hole": 5,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 2,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.25,
+ "hole": 4,
+ "breath": "draw",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 1,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.5,
+ "hole": 4,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 3,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.25,
+ "hole": 5,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 2,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.25,
+ "hole": 4,
+ "breath": "draw",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 2,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.25,
+ "hole": 4,
+ "breath": "draw",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 1,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.25,
+ "hole": 4,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 6,
+ "accidental": 0,
+ "octave": 0,
+ "beats": 1,
+ "dotted": true,
+ "hole": 3,
+ "breath": "draw",
+ "bend": 2,
+ "overblow": false
+ }
+ ]
+ }
+ ],
+ [
+ {
+ "notes": [
+ {
+ "degree": 6,
+ "accidental": 0,
+ "octave": 0,
+ "beats": 0.25,
+ "hole": 3,
+ "breath": "draw",
+ "bend": 2,
+ "overblow": false
+ },
+ {
+ "degree": 1,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.25,
+ "hole": 4,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 2,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.25,
+ "hole": 4,
+ "breath": "draw",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 3,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.25,
+ "hole": 5,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 1,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.25,
+ "dotted": true,
+ "hole": 4,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 2,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.125,
+ "hole": 4,
+ "breath": "draw",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 1,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.25,
+ "hole": 4,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 6,
+ "accidental": 0,
+ "octave": 0,
+ "beats": 0.25,
+ "hole": 3,
+ "breath": "draw",
+ "bend": 2,
+ "overblow": false
+ },
+ {
+ "degree": 5,
+ "accidental": 0,
+ "octave": 0,
+ "beats": 0.25,
+ "hole": 3,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 3,
+ "accidental": 0,
+ "octave": 0,
+ "beats": 0.25,
+ "hole": 2,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 5,
+ "accidental": 0,
+ "octave": 0,
+ "beats": 0.25,
+ "hole": 3,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 6,
+ "accidental": 0,
+ "octave": 0,
+ "beats": 0.25,
+ "hole": 3,
+ "breath": "draw",
+ "bend": 2,
+ "overblow": false
+ },
+ {
+ "degree": 1,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.5,
+ "hole": 4,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 5,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.25,
+ "hole": 6,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 3,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.25,
+ "hole": 5,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ }
+ ]
+ },
+ {
+ "notes": [
+ {
+ "degree": 2,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.25,
+ "dotted": true,
+ "hole": 4,
+ "breath": "draw",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 3,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.125,
+ "hole": 5,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 2,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.25,
+ "hole": 4,
+ "breath": "draw",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 1,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.25,
+ "hole": 4,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 6,
+ "accidental": 0,
+ "octave": 0,
+ "beats": 0.25,
+ "hole": 3,
+ "breath": "draw",
+ "bend": 2,
+ "overblow": false
+ },
+ {
+ "degree": 5,
+ "accidental": 0,
+ "octave": 0,
+ "beats": 0.25,
+ "hole": 3,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 1,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.25,
+ "hole": 4,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 6,
+ "accidental": 0,
+ "octave": 0,
+ "beats": 0.25,
+ "hole": 3,
+ "breath": "draw",
+ "bend": 2,
+ "overblow": false
+ },
+ {
+ "degree": 5,
+ "accidental": 0,
+ "octave": 0,
+ "beats": 2,
+ "graceNotes": [
+ {
+ "degree": 6,
+ "accidental": 0,
+ "octave": 0,
+ "beats": 0.5,
+ "hole": 3,
+ "breath": "draw",
+ "bend": 2,
+ "overblow": false
+ }
+ ],
+ "hole": 3,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ }
+ ],
+ "sectionEnd": true
+ }
+ ]
+ ]
+}
diff --git a/src/data/scores/mulberry-bush.json b/src/data/scores/mulberry-bush.json
new file mode 100644
index 0000000..8e7f9f3
--- /dev/null
+++ b/src/data/scores/mulberry-bush.json
@@ -0,0 +1,445 @@
+{
+ "id": "mulberry-bush",
+ "title": "桑树丛",
+ "subtitle": "The Mulberry Bush · 1927歌集版",
+ "composer": "传统曲调",
+ "key": "C",
+ "harmonicaKey": "C",
+ "position": "第一把位",
+ "timeSignature": "6/8",
+ "tempo": 96,
+ "difficulty": 2,
+ "tags": [
+ "西方歌曲",
+ "六八拍",
+ "游戏歌曲",
+ "压音"
+ ],
+ "source": "The Everyday Song Book(1927)第38首,John Chambers于2017年转录的ABC;完整8小节,原A4主音改为C5,保持相对音区。",
+ "sourceUrl": "https://trillian.mit.edu/~jc/music/book/EverydaySongBook/038_the_Mulberry_Bush.abc",
+ "sourceFormat": "music-text",
+ "sourceCheckedAt": "2026-10-23",
+ "builtin": true,
+ "order": 44,
+ "notes": "保留该歌集的十六分重复短音、低音下降句和两个八分休止。音域G4–G5,低la使用3孔吸压全音。省略歌词与异音连奏线,速度为四分拍练习建议。",
+ "lines": [
+ [
+ {
+ "notes": [
+ {
+ "degree": 1,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.5,
+ "hole": 4,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 1,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.5,
+ "hole": 4,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 1,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.5,
+ "hole": 4,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 1,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 1,
+ "hole": 4,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 3,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.5,
+ "hole": 5,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ }
+ ]
+ },
+ {
+ "notes": [
+ {
+ "degree": 5,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 1,
+ "hole": 6,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 3,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.25,
+ "hole": 5,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 3,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.25,
+ "hole": 5,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 1,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 1,
+ "hole": 4,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 3,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.5,
+ "hole": 5,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ }
+ ]
+ },
+ {
+ "notes": [
+ {
+ "degree": 2,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 1,
+ "hole": 4,
+ "breath": "draw",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 2,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.25,
+ "hole": 4,
+ "breath": "draw",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 2,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.25,
+ "hole": 4,
+ "breath": "draw",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 2,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 1,
+ "hole": 4,
+ "breath": "draw",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 1,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.5,
+ "hole": 4,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ }
+ ]
+ },
+ {
+ "notes": [
+ {
+ "degree": 7,
+ "accidental": 0,
+ "octave": 0,
+ "beats": 1,
+ "hole": 3,
+ "breath": "draw",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 6,
+ "accidental": 0,
+ "octave": 0,
+ "beats": 0.25,
+ "hole": 3,
+ "breath": "draw",
+ "bend": 2,
+ "overblow": false
+ },
+ {
+ "degree": 6,
+ "accidental": 0,
+ "octave": 0,
+ "beats": 0.25,
+ "hole": 3,
+ "breath": "draw",
+ "bend": 2,
+ "overblow": false
+ },
+ {
+ "degree": 5,
+ "accidental": 0,
+ "octave": 0,
+ "beats": 1,
+ "hole": 3,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 0,
+ "accidental": 0,
+ "octave": 0,
+ "beats": 0.5,
+ "hole": null,
+ "breath": null,
+ "bend": 0,
+ "overblow": false
+ }
+ ]
+ }
+ ],
+ [
+ {
+ "notes": [
+ {
+ "degree": 1,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.5,
+ "hole": 4,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 1,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.5,
+ "hole": 4,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 1,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.5,
+ "hole": 4,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 1,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 1,
+ "hole": 4,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 3,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.5,
+ "hole": 5,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ }
+ ]
+ },
+ {
+ "notes": [
+ {
+ "degree": 5,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 1,
+ "hole": 6,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 3,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.25,
+ "hole": 5,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 3,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.25,
+ "hole": 5,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 1,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 1,
+ "hole": 4,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 3,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.5,
+ "hole": 5,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ }
+ ]
+ },
+ {
+ "notes": [
+ {
+ "degree": 2,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 1,
+ "hole": 4,
+ "breath": "draw",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 2,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.5,
+ "hole": 4,
+ "breath": "draw",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 5,
+ "accidental": 0,
+ "octave": 0,
+ "beats": 0.5,
+ "hole": 3,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 6,
+ "accidental": 0,
+ "octave": 0,
+ "beats": 0.5,
+ "hole": 3,
+ "breath": "draw",
+ "bend": 2,
+ "overblow": false
+ },
+ {
+ "degree": 7,
+ "accidental": 0,
+ "octave": 0,
+ "beats": 0.5,
+ "hole": 3,
+ "breath": "draw",
+ "bend": 0,
+ "overblow": false
+ }
+ ]
+ },
+ {
+ "notes": [
+ {
+ "degree": 1,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 1,
+ "dotted": true,
+ "hole": 4,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 1,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 1,
+ "hole": 4,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 0,
+ "accidental": 0,
+ "octave": 0,
+ "beats": 0.5,
+ "hole": null,
+ "breath": null,
+ "bend": 0,
+ "overblow": false
+ }
+ ],
+ "sectionEnd": true
+ }
+ ]
+ ]
+}
diff --git a/src/data/scores/my-bonnie.json b/src/data/scores/my-bonnie.json
new file mode 100644
index 0000000..1845820
--- /dev/null
+++ b/src/data/scores/my-bonnie.json
@@ -0,0 +1,853 @@
+{
+ "id": "my-bonnie",
+ "title": "我的邦妮",
+ "subtitle": "My Bonnie · 1927 歌集版",
+ "composer": "传统歌曲;歌集署 H. J. Fuller",
+ "key": "C",
+ "harmonicaKey": "C",
+ "position": "第一把位",
+ "timeSignature": "3/4",
+ "tempo": 108,
+ "difficulty": 3,
+ "tags": [
+ "西方民谣",
+ "三拍子",
+ "压音"
+ ],
+ "source": "The Everyday Song Book (1927), No.6;John Chambers 2015 年 ABC 转录,转录者说明已补足第 5 小节中音的符尾。Bb 调移为 C 调,主音移至 C5。",
+ "sourceUrl": "https://trillian.mit.edu/~jc/music/book/EverydaySongBook/006_My_Bonnie.abc",
+ "sourceFormat": "music-text",
+ "sourceCheckedAt": "2026-10-22",
+ "builtin": true,
+ "order": 22,
+ "notes": "完整主歌与副歌,共 32 个主小节加一拍弱起。前两段之间将两拍长音与下一段的一拍弱起合为一小节;保留跨小节延音。省略歌词及副歌延长记号的自由时长,按书面拍值练习;速度为练习建议。",
+ "lines": [
+ [
+ {
+ "notes": [
+ {
+ "degree": 5,
+ "accidental": 0,
+ "octave": 0,
+ "beats": 1,
+ "hole": 3,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ }
+ ]
+ },
+ {
+ "notes": [
+ {
+ "degree": 3,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 1,
+ "dotted": true,
+ "hole": 5,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 2,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.5,
+ "hole": 4,
+ "breath": "draw",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 1,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 1,
+ "hole": 4,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ }
+ ]
+ },
+ {
+ "notes": [
+ {
+ "degree": 2,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 1,
+ "hole": 4,
+ "breath": "draw",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 1,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 1,
+ "hole": 4,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 6,
+ "accidental": 0,
+ "octave": 0,
+ "beats": 1,
+ "hole": 3,
+ "breath": "draw",
+ "bend": 2,
+ "overblow": false
+ }
+ ]
+ },
+ {
+ "notes": [
+ {
+ "degree": 5,
+ "accidental": 0,
+ "octave": 0,
+ "beats": 1,
+ "hole": 3,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 3,
+ "accidental": 0,
+ "octave": 0,
+ "beats": 2,
+ "tie": true,
+ "hole": 2,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ }
+ ]
+ },
+ {
+ "notes": [
+ {
+ "degree": 3,
+ "accidental": 0,
+ "octave": 0,
+ "beats": 1,
+ "hole": 2,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 0,
+ "accidental": 0,
+ "octave": 0,
+ "beats": 1,
+ "hole": null,
+ "breath": null,
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 5,
+ "accidental": 0,
+ "octave": 0,
+ "beats": 1,
+ "hole": 3,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ }
+ ]
+ }
+ ],
+ [
+ {
+ "notes": [
+ {
+ "degree": 3,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 1,
+ "dotted": true,
+ "hole": 5,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 2,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.5,
+ "hole": 4,
+ "breath": "draw",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 1,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 1,
+ "hole": 4,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ }
+ ]
+ },
+ {
+ "notes": [
+ {
+ "degree": 1,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 1,
+ "hole": 4,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 7,
+ "accidental": 0,
+ "octave": 0,
+ "beats": 1,
+ "hole": 3,
+ "breath": "draw",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 1,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 1,
+ "hole": 4,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ }
+ ]
+ },
+ {
+ "notes": [
+ {
+ "degree": 2,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 3,
+ "tie": true,
+ "hole": 4,
+ "breath": "draw",
+ "bend": 0,
+ "overblow": false
+ }
+ ]
+ },
+ {
+ "notes": [
+ {
+ "degree": 2,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 2,
+ "hole": 4,
+ "breath": "draw",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 5,
+ "accidental": 0,
+ "octave": 0,
+ "beats": 1,
+ "hole": 3,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ }
+ ]
+ }
+ ],
+ [
+ {
+ "notes": [
+ {
+ "degree": 3,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 1,
+ "dotted": true,
+ "hole": 5,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 2,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.5,
+ "hole": 4,
+ "breath": "draw",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 1,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 1,
+ "hole": 4,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ }
+ ]
+ },
+ {
+ "notes": [
+ {
+ "degree": 2,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 1,
+ "hole": 4,
+ "breath": "draw",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 1,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 1,
+ "hole": 4,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 6,
+ "accidental": 0,
+ "octave": 0,
+ "beats": 1,
+ "hole": 3,
+ "breath": "draw",
+ "bend": 2,
+ "overblow": false
+ }
+ ]
+ },
+ {
+ "notes": [
+ {
+ "degree": 5,
+ "accidental": 0,
+ "octave": 0,
+ "beats": 1,
+ "hole": 3,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 3,
+ "accidental": 0,
+ "octave": 0,
+ "beats": 2,
+ "tie": true,
+ "hole": 2,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ }
+ ]
+ },
+ {
+ "notes": [
+ {
+ "degree": 3,
+ "accidental": 0,
+ "octave": 0,
+ "beats": 1,
+ "hole": 2,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 0,
+ "accidental": 0,
+ "octave": 0,
+ "beats": 1,
+ "hole": null,
+ "breath": null,
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 5,
+ "accidental": 0,
+ "octave": 0,
+ "beats": 1,
+ "hole": 3,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ }
+ ]
+ }
+ ],
+ [
+ {
+ "notes": [
+ {
+ "degree": 6,
+ "accidental": 0,
+ "octave": 0,
+ "beats": 1,
+ "hole": 3,
+ "breath": "draw",
+ "bend": 2,
+ "overblow": false
+ },
+ {
+ "degree": 2,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 1,
+ "hole": 4,
+ "breath": "draw",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 1,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 1,
+ "hole": 4,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ }
+ ]
+ },
+ {
+ "notes": [
+ {
+ "degree": 7,
+ "accidental": 0,
+ "octave": 0,
+ "beats": 1,
+ "hole": 3,
+ "breath": "draw",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 6,
+ "accidental": 0,
+ "octave": 0,
+ "beats": 1,
+ "hole": 3,
+ "breath": "draw",
+ "bend": 2,
+ "overblow": false
+ },
+ {
+ "degree": 7,
+ "accidental": 0,
+ "octave": 0,
+ "beats": 1,
+ "hole": 3,
+ "breath": "draw",
+ "bend": 0,
+ "overblow": false
+ }
+ ]
+ },
+ {
+ "notes": [
+ {
+ "degree": 1,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 3,
+ "tie": true,
+ "hole": 4,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ }
+ ]
+ },
+ {
+ "notes": [
+ {
+ "degree": 1,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 2,
+ "hole": 4,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 0,
+ "accidental": 0,
+ "octave": 0,
+ "beats": 1,
+ "hole": null,
+ "breath": null,
+ "bend": 0,
+ "overblow": false
+ }
+ ]
+ }
+ ],
+ [
+ {
+ "notes": [
+ {
+ "degree": 5,
+ "accidental": 0,
+ "octave": 0,
+ "beats": 3,
+ "hole": 3,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ }
+ ]
+ },
+ {
+ "notes": [
+ {
+ "degree": 1,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 3,
+ "hole": 4,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ }
+ ]
+ },
+ {
+ "notes": [
+ {
+ "degree": 6,
+ "accidental": 0,
+ "octave": 0,
+ "beats": 3,
+ "hole": 3,
+ "breath": "draw",
+ "bend": 2,
+ "overblow": false
+ }
+ ]
+ },
+ {
+ "notes": [
+ {
+ "degree": 1,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 3,
+ "hole": 4,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ }
+ ]
+ }
+ ],
+ [
+ {
+ "notes": [
+ {
+ "degree": 7,
+ "accidental": 0,
+ "octave": 0,
+ "beats": 1,
+ "hole": 3,
+ "breath": "draw",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 7,
+ "accidental": 0,
+ "octave": 0,
+ "beats": 1,
+ "hole": 3,
+ "breath": "draw",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 7,
+ "accidental": 0,
+ "octave": 0,
+ "beats": 1,
+ "hole": 3,
+ "breath": "draw",
+ "bend": 0,
+ "overblow": false
+ }
+ ]
+ },
+ {
+ "notes": [
+ {
+ "degree": 7,
+ "accidental": 0,
+ "octave": 0,
+ "beats": 1,
+ "hole": 3,
+ "breath": "draw",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 6,
+ "accidental": 0,
+ "octave": 0,
+ "beats": 1,
+ "hole": 3,
+ "breath": "draw",
+ "bend": 2,
+ "overblow": false
+ },
+ {
+ "degree": 7,
+ "accidental": 0,
+ "octave": 0,
+ "beats": 1,
+ "hole": 3,
+ "breath": "draw",
+ "bend": 0,
+ "overblow": false
+ }
+ ]
+ },
+ {
+ "notes": [
+ {
+ "degree": 1,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 2,
+ "hole": 4,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 2,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 1,
+ "hole": 4,
+ "breath": "draw",
+ "bend": 0,
+ "overblow": false
+ }
+ ]
+ },
+ {
+ "notes": [
+ {
+ "degree": 3,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 3,
+ "hole": 5,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ }
+ ]
+ }
+ ],
+ [
+ {
+ "notes": [
+ {
+ "degree": 5,
+ "accidental": 0,
+ "octave": 0,
+ "beats": 3,
+ "hole": 3,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ }
+ ]
+ },
+ {
+ "notes": [
+ {
+ "degree": 1,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 3,
+ "hole": 4,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ }
+ ]
+ },
+ {
+ "notes": [
+ {
+ "degree": 6,
+ "accidental": 0,
+ "octave": 0,
+ "beats": 3,
+ "hole": 3,
+ "breath": "draw",
+ "bend": 2,
+ "overblow": false
+ }
+ ]
+ },
+ {
+ "notes": [
+ {
+ "degree": 2,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 2,
+ "hole": 4,
+ "breath": "draw",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 1,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 1,
+ "hole": 4,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ }
+ ]
+ }
+ ],
+ [
+ {
+ "notes": [
+ {
+ "degree": 7,
+ "accidental": 0,
+ "octave": 0,
+ "beats": 1,
+ "hole": 3,
+ "breath": "draw",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 7,
+ "accidental": 0,
+ "octave": 0,
+ "beats": 1,
+ "hole": 3,
+ "breath": "draw",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 7,
+ "accidental": 0,
+ "octave": 0,
+ "beats": 1,
+ "hole": 3,
+ "breath": "draw",
+ "bend": 0,
+ "overblow": false
+ }
+ ]
+ },
+ {
+ "notes": [
+ {
+ "degree": 7,
+ "accidental": 0,
+ "octave": 0,
+ "beats": 1,
+ "hole": 3,
+ "breath": "draw",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 6,
+ "accidental": 0,
+ "octave": 0,
+ "beats": 1,
+ "hole": 3,
+ "breath": "draw",
+ "bend": 2,
+ "overblow": false
+ },
+ {
+ "degree": 7,
+ "accidental": 0,
+ "octave": 0,
+ "beats": 1,
+ "hole": 3,
+ "breath": "draw",
+ "bend": 0,
+ "overblow": false
+ }
+ ]
+ },
+ {
+ "notes": [
+ {
+ "degree": 1,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 3,
+ "tie": true,
+ "hole": 4,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ }
+ ]
+ },
+ {
+ "notes": [
+ {
+ "degree": 1,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 2,
+ "hole": 4,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ }
+ ],
+ "sectionEnd": true
+ }
+ ]
+ ]
+}
diff --git a/src/data/scores/ode-to-joy.json b/src/data/scores/ode-to-joy.json
index a5456de..f0aec0b 100644
--- a/src/data/scores/ode-to-joy.json
+++ b/src/data/scores/ode-to-joy.json
@@ -16,10 +16,10 @@
"source": "新宁幼儿师范高等专科学校职业技能考试简谱《欢乐颂》(题目编号 1-3-3);应用内由 1=D 移调为 1=C",
"sourceUrl": "https://www.xnyesz.com/uploads/1/file/public/202311/20231115213157_md3qv5o7db.pdf",
"sourceFormat": "jianpu-image",
- "sourceCheckedAt": "2026-08-31",
+ "sourceCheckedAt": "2026-10-23",
"builtin": true,
"order": 2,
- "notes": "按教学简谱逐小节核对后整体移到中高音区演奏,全部为自然音、零压音。",
+ "notes": "重新核对职业技能考试题 1-3-3,印刷第 105 页 / PDF 第 107 页全部 16 小节;补回第 12 小节低音 sol、末音与第 13 小节首音的同音延音,以及后八小节反复。1=D 移至 1=C 后整体升八度,歌词和异音连线不录入,速度为编辑建议。",
"lines": [
[
{
@@ -402,7 +402,8 @@
"bend": 0,
"overblow": false
}
- ]
+ ],
+ "repeatBegin": true
},
{
"notes": [
@@ -537,9 +538,9 @@
{
"degree": 5,
"accidental": 0,
- "octave": 1,
+ "octave": 0,
"beats": 1,
- "hole": 6,
+ "hole": 3,
"breath": "blow",
"bend": 0,
"overblow": false
@@ -549,6 +550,7 @@
"accidental": 0,
"octave": 1,
"beats": 1,
+ "tie": true,
"hole": 5,
"breath": "blow",
"bend": 0,
@@ -734,7 +736,7 @@
"overblow": false
}
],
- "sectionEnd": true
+ "repeatEnd": true
}
]
]
diff --git a/src/data/scores/oh-susanna.json b/src/data/scores/oh-susanna.json
new file mode 100644
index 0000000..605d32e
--- /dev/null
+++ b/src/data/scores/oh-susanna.json
@@ -0,0 +1,1015 @@
+{
+ "id": "oh-susanna",
+ "title": "哦,苏珊娜",
+ "subtitle": "Oh Susanna · 主歌反复展开版",
+ "composer": "Stephen C. Foster",
+ "key": "C",
+ "harmonicaKey": "C",
+ "position": "第一把位",
+ "timeSignature": "2/4",
+ "tempo": 100,
+ "difficulty": 2,
+ "tags": [
+ "西方歌曲",
+ "弱起",
+ "附点"
+ ],
+ "source": "Frank Nordberg / musicaviva 的 Oh Susanna ABC 转录,John Chambers 镜像。C 调完整旋律,主歌反复展开两遍后接副歌;音符文本的小写 c 对应本谱高音 do(C5)。",
+ "sourceUrl": "https://trillian.mit.edu/~jc/music/abc/mirror/kirby98.fsnet.co.uk/oh/Oh_Susanna_1.abc",
+ "sourceFormat": "music-text",
+ "sourceCheckedAt": "2026-10-22",
+ "builtin": true,
+ "order": 19,
+ "notes": "开头两个十六分音符为半拍弱起。第一次主歌末尾接下一遍弱起;第二次末尾接八分休止进入副歌。末小节为一拍半,与开头互补。保留原版附点八分与十六分组合,省略和弦。速度为练习建议。",
+ "lines": [
+ [
+ {
+ "notes": [
+ {
+ "degree": 1,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.25,
+ "hole": 4,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 2,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.25,
+ "hole": 4,
+ "breath": "draw",
+ "bend": 0,
+ "overblow": false
+ }
+ ]
+ },
+ {
+ "notes": [
+ {
+ "degree": 3,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.5,
+ "hole": 5,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 5,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.5,
+ "hole": 6,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 5,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.5,
+ "dotted": true,
+ "hole": 6,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 6,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.25,
+ "hole": 6,
+ "breath": "draw",
+ "bend": 0,
+ "overblow": false
+ }
+ ]
+ },
+ {
+ "notes": [
+ {
+ "degree": 5,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.5,
+ "hole": 6,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 3,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.5,
+ "hole": 5,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 1,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.5,
+ "dotted": true,
+ "hole": 4,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 2,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.25,
+ "hole": 4,
+ "breath": "draw",
+ "bend": 0,
+ "overblow": false
+ }
+ ]
+ },
+ {
+ "notes": [
+ {
+ "degree": 3,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.5,
+ "hole": 5,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 3,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.5,
+ "hole": 5,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 2,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.5,
+ "hole": 4,
+ "breath": "draw",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 1,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.5,
+ "hole": 4,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ }
+ ]
+ },
+ {
+ "notes": [
+ {
+ "degree": 2,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 1,
+ "dotted": true,
+ "hole": 4,
+ "breath": "draw",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 1,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.25,
+ "hole": 4,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 2,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.25,
+ "hole": 4,
+ "breath": "draw",
+ "bend": 0,
+ "overblow": false
+ }
+ ]
+ }
+ ],
+ [
+ {
+ "notes": [
+ {
+ "degree": 3,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.5,
+ "hole": 5,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 5,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.5,
+ "hole": 6,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 5,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.5,
+ "dotted": true,
+ "hole": 6,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 6,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.25,
+ "hole": 6,
+ "breath": "draw",
+ "bend": 0,
+ "overblow": false
+ }
+ ]
+ },
+ {
+ "notes": [
+ {
+ "degree": 5,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.5,
+ "hole": 6,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 3,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.5,
+ "hole": 5,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 1,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.5,
+ "dotted": true,
+ "hole": 4,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 2,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.25,
+ "hole": 4,
+ "breath": "draw",
+ "bend": 0,
+ "overblow": false
+ }
+ ]
+ },
+ {
+ "notes": [
+ {
+ "degree": 3,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.5,
+ "hole": 5,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 3,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.5,
+ "hole": 5,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 2,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.5,
+ "hole": 4,
+ "breath": "draw",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 2,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.5,
+ "hole": 4,
+ "breath": "draw",
+ "bend": 0,
+ "overblow": false
+ }
+ ]
+ },
+ {
+ "notes": [
+ {
+ "degree": 1,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 1,
+ "dotted": true,
+ "hole": 4,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 1,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.25,
+ "hole": 4,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 2,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.25,
+ "hole": 4,
+ "breath": "draw",
+ "bend": 0,
+ "overblow": false
+ }
+ ]
+ }
+ ],
+ [
+ {
+ "notes": [
+ {
+ "degree": 3,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.5,
+ "hole": 5,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 5,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.5,
+ "hole": 6,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 5,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.5,
+ "dotted": true,
+ "hole": 6,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 6,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.25,
+ "hole": 6,
+ "breath": "draw",
+ "bend": 0,
+ "overblow": false
+ }
+ ]
+ },
+ {
+ "notes": [
+ {
+ "degree": 5,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.5,
+ "hole": 6,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 3,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.5,
+ "hole": 5,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 1,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.5,
+ "dotted": true,
+ "hole": 4,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 2,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.25,
+ "hole": 4,
+ "breath": "draw",
+ "bend": 0,
+ "overblow": false
+ }
+ ]
+ },
+ {
+ "notes": [
+ {
+ "degree": 3,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.5,
+ "hole": 5,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 3,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.5,
+ "hole": 5,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 2,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.5,
+ "hole": 4,
+ "breath": "draw",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 1,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.5,
+ "hole": 4,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ }
+ ]
+ },
+ {
+ "notes": [
+ {
+ "degree": 2,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 1,
+ "dotted": true,
+ "hole": 4,
+ "breath": "draw",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 1,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.25,
+ "hole": 4,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 2,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.25,
+ "hole": 4,
+ "breath": "draw",
+ "bend": 0,
+ "overblow": false
+ }
+ ]
+ }
+ ],
+ [
+ {
+ "notes": [
+ {
+ "degree": 3,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.5,
+ "hole": 5,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 5,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.5,
+ "hole": 6,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 5,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.5,
+ "dotted": true,
+ "hole": 6,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 6,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.25,
+ "hole": 6,
+ "breath": "draw",
+ "bend": 0,
+ "overblow": false
+ }
+ ]
+ },
+ {
+ "notes": [
+ {
+ "degree": 5,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.5,
+ "hole": 6,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 3,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.5,
+ "hole": 5,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 1,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.5,
+ "dotted": true,
+ "hole": 4,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 2,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.25,
+ "hole": 4,
+ "breath": "draw",
+ "bend": 0,
+ "overblow": false
+ }
+ ]
+ },
+ {
+ "notes": [
+ {
+ "degree": 3,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.5,
+ "hole": 5,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 3,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.5,
+ "hole": 5,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 2,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.5,
+ "hole": 4,
+ "breath": "draw",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 2,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.5,
+ "hole": 4,
+ "breath": "draw",
+ "bend": 0,
+ "overblow": false
+ }
+ ]
+ },
+ {
+ "notes": [
+ {
+ "degree": 1,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 1,
+ "dotted": true,
+ "hole": 4,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 0,
+ "accidental": 0,
+ "octave": 0,
+ "beats": 0.5,
+ "hole": null,
+ "breath": null,
+ "bend": 0,
+ "overblow": false
+ }
+ ]
+ }
+ ],
+ [
+ {
+ "notes": [
+ {
+ "degree": 4,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 1,
+ "hole": 5,
+ "breath": "draw",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 4,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 1,
+ "hole": 5,
+ "breath": "draw",
+ "bend": 0,
+ "overblow": false
+ }
+ ]
+ },
+ {
+ "notes": [
+ {
+ "degree": 6,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.5,
+ "hole": 6,
+ "breath": "draw",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 6,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 1,
+ "hole": 6,
+ "breath": "draw",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 6,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.5,
+ "hole": 6,
+ "breath": "draw",
+ "bend": 0,
+ "overblow": false
+ }
+ ]
+ },
+ {
+ "notes": [
+ {
+ "degree": 5,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.5,
+ "hole": 6,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 5,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.5,
+ "hole": 6,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 3,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.5,
+ "hole": 5,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 1,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.5,
+ "hole": 4,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ }
+ ]
+ },
+ {
+ "notes": [
+ {
+ "degree": 2,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 1,
+ "dotted": true,
+ "hole": 4,
+ "breath": "draw",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 1,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.25,
+ "hole": 4,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 2,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.25,
+ "hole": 4,
+ "breath": "draw",
+ "bend": 0,
+ "overblow": false
+ }
+ ]
+ }
+ ],
+ [
+ {
+ "notes": [
+ {
+ "degree": 3,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.5,
+ "hole": 5,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 5,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.5,
+ "hole": 6,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 5,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.5,
+ "dotted": true,
+ "hole": 6,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 6,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.25,
+ "hole": 6,
+ "breath": "draw",
+ "bend": 0,
+ "overblow": false
+ }
+ ]
+ },
+ {
+ "notes": [
+ {
+ "degree": 5,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.5,
+ "hole": 6,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 3,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.5,
+ "hole": 5,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 1,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.5,
+ "dotted": true,
+ "hole": 4,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 2,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.25,
+ "hole": 4,
+ "breath": "draw",
+ "bend": 0,
+ "overblow": false
+ }
+ ]
+ },
+ {
+ "notes": [
+ {
+ "degree": 3,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.5,
+ "hole": 5,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 3,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.5,
+ "hole": 5,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 2,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.5,
+ "hole": 4,
+ "breath": "draw",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 2,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.5,
+ "hole": 4,
+ "breath": "draw",
+ "bend": 0,
+ "overblow": false
+ }
+ ]
+ },
+ {
+ "notes": [
+ {
+ "degree": 1,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 1,
+ "dotted": true,
+ "hole": 4,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ }
+ ],
+ "sectionEnd": true
+ }
+ ]
+ ]
+}
diff --git a/src/data/scores/pan-hong-jun.json b/src/data/scores/pan-hong-jun.json
new file mode 100644
index 0000000..87241b6
--- /dev/null
+++ b/src/data/scores/pan-hong-jun.json
@@ -0,0 +1,494 @@
+{
+ "id": "pan-hong-jun",
+ "title": "盼红军",
+ "subtitle": "四川民歌 · 教材完整旋律",
+ "composer": "四川民歌",
+ "key": "C",
+ "harmonicaKey": "C",
+ "position": "第四把位",
+ "timeSignature": "2/4",
+ "tempo": 84,
+ "difficulty": 3,
+ "tags": [
+ "中国民歌",
+ "四川",
+ "压音",
+ "羽调式"
+ ],
+ "source": "粤教花城版《音乐六年级上册·简谱》印刷第47页/PDF第48页,完整12小节。原1=D改为1=C后整体提高八度。",
+ "sourceUrl": "https://lywgyxx.szftedu.cn/xkjc/yinyue/202209/P020220910588732922659.pdf#page=48",
+ "sourceFormat": "jianpu-image",
+ "sourceCheckedAt": "2026-10-22",
+ "builtin": true,
+ "order": 33,
+ "notes": "简谱1=C,旋律以低la(A4)收束,按C调口琴第四把位练习;低la为3孔吸压全音。保留附点八分、十六分和结尾跨小节延音,末音需持续四个四分拍。省略歌词及异音连奏线,速度为练习建议。",
+ "lines": [
+ [
+ {
+ "notes": [
+ {
+ "degree": 2,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.5,
+ "hole": 4,
+ "breath": "draw",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 1,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 1,
+ "hole": 4,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 1,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.25,
+ "hole": 4,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 2,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.25,
+ "hole": 4,
+ "breath": "draw",
+ "bend": 0,
+ "overblow": false
+ }
+ ]
+ },
+ {
+ "notes": [
+ {
+ "degree": 3,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.5,
+ "dotted": true,
+ "hole": 5,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 5,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.25,
+ "hole": 6,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 3,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.5,
+ "hole": 5,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 6,
+ "accidental": 0,
+ "octave": 0,
+ "beats": 0.5,
+ "hole": 3,
+ "breath": "draw",
+ "bend": 2,
+ "overblow": false
+ }
+ ]
+ },
+ {
+ "notes": [
+ {
+ "degree": 2,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.5,
+ "hole": 4,
+ "breath": "draw",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 1,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 1,
+ "hole": 4,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 1,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.25,
+ "hole": 4,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 2,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.25,
+ "hole": 4,
+ "breath": "draw",
+ "bend": 0,
+ "overblow": false
+ }
+ ]
+ },
+ {
+ "notes": [
+ {
+ "degree": 3,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.5,
+ "hole": 5,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 1,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.25,
+ "hole": 4,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 2,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.25,
+ "hole": 4,
+ "breath": "draw",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 3,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 1,
+ "hole": 5,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ }
+ ]
+ }
+ ],
+ [
+ {
+ "notes": [
+ {
+ "degree": 3,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.25,
+ "hole": 5,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 5,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.25,
+ "hole": 6,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 6,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 1,
+ "hole": 6,
+ "breath": "draw",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 1,
+ "accidental": 0,
+ "octave": 2,
+ "beats": 0.5,
+ "hole": 7,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ }
+ ]
+ },
+ {
+ "notes": [
+ {
+ "degree": 6,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 1,
+ "hole": 6,
+ "breath": "draw",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 5,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.5,
+ "hole": 6,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 3,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.5,
+ "hole": 5,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ }
+ ]
+ },
+ {
+ "notes": [
+ {
+ "degree": 6,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.5,
+ "hole": 6,
+ "breath": "draw",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 3,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 1,
+ "hole": 5,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 2,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.25,
+ "hole": 4,
+ "breath": "draw",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 3,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.25,
+ "hole": 5,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ }
+ ]
+ },
+ {
+ "notes": [
+ {
+ "degree": 1,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 1,
+ "hole": 4,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 1,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.25,
+ "hole": 4,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 2,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.25,
+ "hole": 4,
+ "breath": "draw",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 3,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.25,
+ "hole": 5,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 5,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.25,
+ "hole": 6,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ }
+ ]
+ }
+ ],
+ [
+ {
+ "notes": [
+ {
+ "degree": 3,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 1,
+ "hole": 5,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 2,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.5,
+ "hole": 4,
+ "breath": "draw",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 1,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.5,
+ "hole": 4,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ }
+ ]
+ },
+ {
+ "notes": [
+ {
+ "degree": 6,
+ "accidental": 0,
+ "octave": 0,
+ "beats": 0.5,
+ "hole": 3,
+ "breath": "draw",
+ "bend": 2,
+ "overblow": false
+ },
+ {
+ "degree": 1,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 1,
+ "hole": 4,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 6,
+ "accidental": 0,
+ "octave": 0,
+ "beats": 0.25,
+ "hole": 3,
+ "breath": "draw",
+ "bend": 2,
+ "overblow": false
+ },
+ {
+ "degree": 1,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.25,
+ "hole": 4,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ }
+ ]
+ },
+ {
+ "notes": [
+ {
+ "degree": 6,
+ "accidental": 0,
+ "octave": 0,
+ "beats": 2,
+ "tie": true,
+ "hole": 3,
+ "breath": "draw",
+ "bend": 2,
+ "overblow": false
+ }
+ ]
+ },
+ {
+ "notes": [
+ {
+ "degree": 6,
+ "accidental": 0,
+ "octave": 0,
+ "beats": 2,
+ "hole": 3,
+ "breath": "draw",
+ "bend": 2,
+ "overblow": false
+ }
+ ],
+ "sectionEnd": true
+ }
+ ]
+ ]
+}
diff --git a/src/data/scores/polish-waltz.json b/src/data/scores/polish-waltz.json
new file mode 100644
index 0000000..95cf24c
--- /dev/null
+++ b/src/data/scores/polish-waltz.json
@@ -0,0 +1,889 @@
+{
+ "id": "polish-waltz",
+ "title": "波兰圆舞曲",
+ "subtitle": "教材主旋律 · 32 小节",
+ "composer": "波兰民歌(教材署名)",
+ "key": "C",
+ "harmonicaKey": "C",
+ "position": "第一把位",
+ "timeSignature": "3/4",
+ "tempo": 96,
+ "difficulty": 2,
+ "tags": [
+ "传统曲",
+ "西方民谣",
+ "圆舞曲"
+ ],
+ "source": "人民教育出版社《音乐七年级下册·简谱》,印刷第48页/PDF第53页,“学吹竖笛”。",
+ "sourceUrl": "https://dev98.oa.henanyuexue.com/static/szjc-resources/pdf/q/f/2/7.pdf#page=53",
+ "sourceFormat": "jianpu-image",
+ "sourceCheckedAt": "2026-10-23",
+ "builtin": true,
+ "order": 56,
+ "notes": "保留1=C,整体提高一八度,音域D5–F6,均为自然音孔位。32小节:前16小节为单旋律,后16小节只取上声部主旋律,不混入下声部伴奏。第7–8、11–12、15–16小节的同音延音保留。 不收录歌词、伴奏和异音连奏线,速度为编辑练习建议。",
+ "lines": [
+ [
+ {
+ "notes": [
+ {
+ "degree": 5,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 2,
+ "hole": 6,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 1,
+ "accidental": 0,
+ "octave": 2,
+ "beats": 1,
+ "hole": 7,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ }
+ ]
+ },
+ {
+ "notes": [
+ {
+ "degree": 3,
+ "accidental": 0,
+ "octave": 2,
+ "beats": 2,
+ "hole": 8,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 2,
+ "accidental": 0,
+ "octave": 2,
+ "beats": 1,
+ "hole": 8,
+ "breath": "draw",
+ "bend": 0,
+ "overblow": false
+ }
+ ]
+ },
+ {
+ "notes": [
+ {
+ "degree": 1,
+ "accidental": 0,
+ "octave": 2,
+ "beats": 2,
+ "hole": 7,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 7,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 1,
+ "hole": 7,
+ "breath": "draw",
+ "bend": 0,
+ "overblow": false
+ }
+ ]
+ },
+ {
+ "notes": [
+ {
+ "degree": 1,
+ "accidental": 0,
+ "octave": 2,
+ "beats": 2,
+ "hole": 7,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 6,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 1,
+ "hole": 6,
+ "breath": "draw",
+ "bend": 0,
+ "overblow": false
+ }
+ ]
+ },
+ {
+ "notes": [
+ {
+ "degree": 5,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 2,
+ "hole": 6,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 5,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 1,
+ "hole": 6,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ }
+ ]
+ },
+ {
+ "notes": [
+ {
+ "degree": 3,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 2,
+ "hole": 5,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 4,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 1,
+ "hole": 5,
+ "breath": "draw",
+ "bend": 0,
+ "overblow": false
+ }
+ ]
+ },
+ {
+ "notes": [
+ {
+ "degree": 5,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 3,
+ "tie": true,
+ "hole": 6,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ }
+ ]
+ },
+ {
+ "notes": [
+ {
+ "degree": 5,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 3,
+ "hole": 6,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ }
+ ]
+ }
+ ],
+ [
+ {
+ "notes": [
+ {
+ "degree": 4,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 2,
+ "hole": 5,
+ "breath": "draw",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 6,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 1,
+ "hole": 6,
+ "breath": "draw",
+ "bend": 0,
+ "overblow": false
+ }
+ ]
+ },
+ {
+ "notes": [
+ {
+ "degree": 2,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 2,
+ "hole": 4,
+ "breath": "draw",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 3,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 1,
+ "hole": 5,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ }
+ ]
+ },
+ {
+ "notes": [
+ {
+ "degree": 4,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 3,
+ "tie": true,
+ "hole": 5,
+ "breath": "draw",
+ "bend": 0,
+ "overblow": false
+ }
+ ]
+ },
+ {
+ "notes": [
+ {
+ "degree": 4,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 3,
+ "hole": 5,
+ "breath": "draw",
+ "bend": 0,
+ "overblow": false
+ }
+ ]
+ },
+ {
+ "notes": [
+ {
+ "degree": 5,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 2,
+ "hole": 6,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 5,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 1,
+ "hole": 6,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ }
+ ]
+ },
+ {
+ "notes": [
+ {
+ "degree": 3,
+ "accidental": 0,
+ "octave": 2,
+ "beats": 2,
+ "hole": 8,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 2,
+ "accidental": 0,
+ "octave": 2,
+ "beats": 1,
+ "hole": 8,
+ "breath": "draw",
+ "bend": 0,
+ "overblow": false
+ }
+ ]
+ },
+ {
+ "notes": [
+ {
+ "degree": 1,
+ "accidental": 0,
+ "octave": 2,
+ "beats": 3,
+ "tie": true,
+ "hole": 7,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ }
+ ]
+ },
+ {
+ "notes": [
+ {
+ "degree": 1,
+ "accidental": 0,
+ "octave": 2,
+ "beats": 3,
+ "hole": 7,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ }
+ ]
+ }
+ ],
+ [
+ {
+ "notes": [
+ {
+ "degree": 3,
+ "accidental": 0,
+ "octave": 2,
+ "beats": 1,
+ "hole": 8,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 3,
+ "accidental": 0,
+ "octave": 2,
+ "beats": 0.5,
+ "hole": 8,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 2,
+ "accidental": 0,
+ "octave": 2,
+ "beats": 0.5,
+ "hole": 8,
+ "breath": "draw",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 1,
+ "accidental": 0,
+ "octave": 2,
+ "beats": 1,
+ "hole": 7,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ }
+ ]
+ },
+ {
+ "notes": [
+ {
+ "degree": 3,
+ "accidental": 0,
+ "octave": 2,
+ "beats": 1,
+ "hole": 8,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 3,
+ "accidental": 0,
+ "octave": 2,
+ "beats": 0.5,
+ "hole": 8,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 2,
+ "accidental": 0,
+ "octave": 2,
+ "beats": 0.5,
+ "hole": 8,
+ "breath": "draw",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 1,
+ "accidental": 0,
+ "octave": 2,
+ "beats": 1,
+ "hole": 7,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ }
+ ]
+ },
+ {
+ "notes": [
+ {
+ "degree": 3,
+ "accidental": 0,
+ "octave": 2,
+ "beats": 1,
+ "hole": 8,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 4,
+ "accidental": 0,
+ "octave": 2,
+ "beats": 1,
+ "dotted": true,
+ "hole": 9,
+ "breath": "draw",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 3,
+ "accidental": 0,
+ "octave": 2,
+ "beats": 0.5,
+ "hole": 8,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ }
+ ]
+ },
+ {
+ "notes": [
+ {
+ "degree": 2,
+ "accidental": 0,
+ "octave": 2,
+ "beats": 3,
+ "hole": 8,
+ "breath": "draw",
+ "bend": 0,
+ "overblow": false
+ }
+ ]
+ },
+ {
+ "notes": [
+ {
+ "degree": 2,
+ "accidental": 0,
+ "octave": 2,
+ "beats": 1,
+ "hole": 8,
+ "breath": "draw",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 2,
+ "accidental": 0,
+ "octave": 2,
+ "beats": 0.5,
+ "hole": 8,
+ "breath": "draw",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 1,
+ "accidental": 0,
+ "octave": 2,
+ "beats": 0.5,
+ "hole": 7,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 7,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 1,
+ "hole": 7,
+ "breath": "draw",
+ "bend": 0,
+ "overblow": false
+ }
+ ]
+ },
+ {
+ "notes": [
+ {
+ "degree": 2,
+ "accidental": 0,
+ "octave": 2,
+ "beats": 1,
+ "hole": 8,
+ "breath": "draw",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 2,
+ "accidental": 0,
+ "octave": 2,
+ "beats": 0.5,
+ "hole": 8,
+ "breath": "draw",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 1,
+ "accidental": 0,
+ "octave": 2,
+ "beats": 0.5,
+ "hole": 7,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 7,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 1,
+ "hole": 7,
+ "breath": "draw",
+ "bend": 0,
+ "overblow": false
+ }
+ ]
+ },
+ {
+ "notes": [
+ {
+ "degree": 2,
+ "accidental": 0,
+ "octave": 2,
+ "beats": 1,
+ "hole": 8,
+ "breath": "draw",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 3,
+ "accidental": 0,
+ "octave": 2,
+ "beats": 1,
+ "dotted": true,
+ "hole": 8,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 2,
+ "accidental": 0,
+ "octave": 2,
+ "beats": 0.5,
+ "hole": 8,
+ "breath": "draw",
+ "bend": 0,
+ "overblow": false
+ }
+ ]
+ },
+ {
+ "notes": [
+ {
+ "degree": 1,
+ "accidental": 0,
+ "octave": 2,
+ "beats": 3,
+ "hole": 7,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ }
+ ]
+ }
+ ],
+ [
+ {
+ "notes": [
+ {
+ "degree": 3,
+ "accidental": 0,
+ "octave": 2,
+ "beats": 1,
+ "hole": 8,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 3,
+ "accidental": 0,
+ "octave": 2,
+ "beats": 0.5,
+ "hole": 8,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 2,
+ "accidental": 0,
+ "octave": 2,
+ "beats": 0.5,
+ "hole": 8,
+ "breath": "draw",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 1,
+ "accidental": 0,
+ "octave": 2,
+ "beats": 1,
+ "hole": 7,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ }
+ ]
+ },
+ {
+ "notes": [
+ {
+ "degree": 3,
+ "accidental": 0,
+ "octave": 2,
+ "beats": 1,
+ "hole": 8,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 3,
+ "accidental": 0,
+ "octave": 2,
+ "beats": 0.5,
+ "hole": 8,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 2,
+ "accidental": 0,
+ "octave": 2,
+ "beats": 0.5,
+ "hole": 8,
+ "breath": "draw",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 1,
+ "accidental": 0,
+ "octave": 2,
+ "beats": 1,
+ "hole": 7,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ }
+ ]
+ },
+ {
+ "notes": [
+ {
+ "degree": 3,
+ "accidental": 0,
+ "octave": 2,
+ "beats": 1,
+ "hole": 8,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 4,
+ "accidental": 0,
+ "octave": 2,
+ "beats": 1,
+ "dotted": true,
+ "hole": 9,
+ "breath": "draw",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 3,
+ "accidental": 0,
+ "octave": 2,
+ "beats": 0.5,
+ "hole": 8,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ }
+ ]
+ },
+ {
+ "notes": [
+ {
+ "degree": 2,
+ "accidental": 0,
+ "octave": 2,
+ "beats": 3,
+ "hole": 8,
+ "breath": "draw",
+ "bend": 0,
+ "overblow": false
+ }
+ ]
+ },
+ {
+ "notes": [
+ {
+ "degree": 4,
+ "accidental": 0,
+ "octave": 2,
+ "beats": 1,
+ "hole": 9,
+ "breath": "draw",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 3,
+ "accidental": 0,
+ "octave": 2,
+ "beats": 1,
+ "hole": 8,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 2,
+ "accidental": 0,
+ "octave": 2,
+ "beats": 1,
+ "hole": 8,
+ "breath": "draw",
+ "bend": 0,
+ "overblow": false
+ }
+ ]
+ },
+ {
+ "notes": [
+ {
+ "degree": 1,
+ "accidental": 0,
+ "octave": 2,
+ "beats": 1,
+ "hole": 7,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 7,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 1,
+ "hole": 7,
+ "breath": "draw",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 6,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 1,
+ "hole": 6,
+ "breath": "draw",
+ "bend": 0,
+ "overblow": false
+ }
+ ]
+ },
+ {
+ "notes": [
+ {
+ "degree": 5,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 1,
+ "hole": 6,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 6,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 1,
+ "hole": 6,
+ "breath": "draw",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 7,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 1,
+ "hole": 7,
+ "breath": "draw",
+ "bend": 0,
+ "overblow": false
+ }
+ ]
+ },
+ {
+ "notes": [
+ {
+ "degree": 1,
+ "accidental": 0,
+ "octave": 2,
+ "beats": 3,
+ "hole": 7,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ }
+ ],
+ "sectionEnd": true
+ }
+ ]
+ ]
+}
diff --git a/src/data/scores/red-river-valley.json b/src/data/scores/red-river-valley.json
new file mode 100644
index 0000000..f212b5f
--- /dev/null
+++ b/src/data/scores/red-river-valley.json
@@ -0,0 +1,516 @@
+{
+ "id": "red-river-valley",
+ "title": "红河谷",
+ "subtitle": "Red River Valley · 教材版本",
+ "composer": "加拿大民歌",
+ "key": "C",
+ "harmonicaKey": "C",
+ "position": "第一把位",
+ "timeSignature": "4/4",
+ "tempo": 88,
+ "pickupBeats": 1,
+ "difficulty": 3,
+ "tags": [
+ "西方歌曲",
+ "弱起",
+ "半音",
+ "压音"
+ ],
+ "source": "粤教花城《音乐四年级下册·简谱》印刷第39页/PDF第40页,完整8小节加一拍弱起。原1=F改为1=C后整体提高八度,明确保留教材足拍末小节。",
+ "sourceUrl": "https://lywgyxx.szftedu.cn/xkjc/yinyue/202209/P020220910587435677420.pdf#page=40",
+ "sourceFormat": "jianpu-image",
+ "sourceCheckedAt": "2026-10-23",
+ "builtin": true,
+ "order": 42,
+ "notes": "本版本首尾不作互补:首小节一拍弱起,末小节四拍;不要删掉末尾休止。第6个完整小节低la接降la,分别为3孔吸压全音与一又二分之一音。保留同音延音,省略译词及异音连奏线,速度为练习建议。",
+ "lines": [
+ [
+ {
+ "notes": [
+ {
+ "degree": 5,
+ "accidental": 0,
+ "octave": 0,
+ "beats": 0.5,
+ "hole": 3,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 1,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.5,
+ "hole": 4,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ }
+ ]
+ },
+ {
+ "notes": [
+ {
+ "degree": 3,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 1,
+ "hole": 5,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 3,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.5,
+ "hole": 5,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 3,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.5,
+ "hole": 5,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 3,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 1,
+ "hole": 5,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 2,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.5,
+ "hole": 4,
+ "breath": "draw",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 3,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.5,
+ "hole": 5,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ }
+ ]
+ },
+ {
+ "notes": [
+ {
+ "degree": 2,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.5,
+ "hole": 4,
+ "breath": "draw",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 1,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 1,
+ "dotted": true,
+ "tie": true,
+ "hole": 4,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 1,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.5,
+ "hole": 4,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 0,
+ "accidental": 0,
+ "octave": 0,
+ "beats": 0.5,
+ "hole": null,
+ "breath": null,
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 5,
+ "accidental": 0,
+ "octave": 0,
+ "beats": 0.5,
+ "hole": 3,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 1,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.5,
+ "hole": 4,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ }
+ ]
+ }
+ ],
+ [
+ {
+ "notes": [
+ {
+ "degree": 3,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 1,
+ "hole": 5,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 1,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.5,
+ "hole": 4,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 3,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.5,
+ "hole": 5,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 5,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 1,
+ "hole": 6,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 4,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.5,
+ "hole": 5,
+ "breath": "draw",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 3,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.5,
+ "hole": 5,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ }
+ ]
+ },
+ {
+ "notes": [
+ {
+ "degree": 2,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 3,
+ "hole": 4,
+ "breath": "draw",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 5,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.5,
+ "hole": 6,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 4,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.5,
+ "hole": 5,
+ "breath": "draw",
+ "bend": 0,
+ "overblow": false
+ }
+ ]
+ },
+ {
+ "notes": [
+ {
+ "degree": 3,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 1,
+ "hole": 5,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 3,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.5,
+ "hole": 5,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 2,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.5,
+ "hole": 4,
+ "breath": "draw",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 1,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 1,
+ "hole": 4,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 2,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.5,
+ "hole": 4,
+ "breath": "draw",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 3,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.5,
+ "hole": 5,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ }
+ ]
+ }
+ ],
+ [
+ {
+ "notes": [
+ {
+ "degree": 5,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.5,
+ "hole": 6,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 4,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 1,
+ "dotted": true,
+ "tie": true,
+ "hole": 5,
+ "breath": "draw",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 4,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.5,
+ "hole": 5,
+ "breath": "draw",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 0,
+ "accidental": 0,
+ "octave": 0,
+ "beats": 0.5,
+ "hole": null,
+ "breath": null,
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 6,
+ "accidental": 0,
+ "octave": 0,
+ "beats": 0.5,
+ "hole": 3,
+ "breath": "draw",
+ "bend": 2,
+ "overblow": false
+ },
+ {
+ "degree": 6,
+ "accidental": -1,
+ "octave": 0,
+ "beats": 0.5,
+ "hole": 3,
+ "breath": "draw",
+ "bend": 3,
+ "overblow": false
+ }
+ ]
+ },
+ {
+ "notes": [
+ {
+ "degree": 5,
+ "accidental": 0,
+ "octave": 0,
+ "beats": 1,
+ "hole": 3,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 7,
+ "accidental": 0,
+ "octave": 0,
+ "beats": 0.5,
+ "hole": 3,
+ "breath": "draw",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 1,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.5,
+ "hole": 4,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 2,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 1,
+ "hole": 4,
+ "breath": "draw",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 3,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.5,
+ "hole": 5,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 2,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.5,
+ "hole": 4,
+ "breath": "draw",
+ "bend": 0,
+ "overblow": false
+ }
+ ]
+ },
+ {
+ "notes": [
+ {
+ "degree": 1,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 2,
+ "tie": true,
+ "hole": 4,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 1,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 1,
+ "hole": 4,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 0,
+ "accidental": 0,
+ "octave": 0,
+ "beats": 1,
+ "hole": null,
+ "breath": null,
+ "bend": 0,
+ "overblow": false
+ }
+ ],
+ "sectionEnd": true
+ }
+ ]
+ ]
+}
diff --git a/src/data/scores/rock-a-bye-baby.json b/src/data/scores/rock-a-bye-baby.json
new file mode 100644
index 0000000..36c4617
--- /dev/null
+++ b/src/data/scores/rock-a-bye-baby.json
@@ -0,0 +1,451 @@
+{
+ "id": "rock-a-bye-baby",
+ "title": "摇篮曲",
+ "subtitle": "Rock-a-bye Baby · 1927歌集版",
+ "composer": "传统曲调",
+ "key": "C",
+ "harmonicaKey": "C",
+ "position": "第一把位",
+ "timeSignature": "6/8",
+ "tempo": 72,
+ "difficulty": 3,
+ "tags": [
+ "西方歌曲",
+ "摇篮曲",
+ "六八拍",
+ "压音"
+ ],
+ "source": "The Everyday Song Book(1927)第9首,John Chambers于2015年转录的ABC;完整8小节,原Bb调移为C调(Bb4→C5),保留原相对音区。",
+ "sourceUrl": "https://trillian.mit.edu/~jc/music/book/EverydaySongBook/009_Rock-a-bye_Baby.abc",
+ "sourceFormat": "music-text",
+ "sourceCheckedAt": "2026-10-22",
+ "builtin": true,
+ "order": 32,
+ "notes": "每小节六个八分单位;开头附点八分加十六分不是等长八分。保持E4–F5音域,低fa使用2孔吸压全音,低la使用3孔吸压全音。两次相似开头的第2小节结尾不同;最后保留八分休止。省略歌词,速度为四分音符的练习建议。",
+ "lines": [
+ [
+ {
+ "notes": [
+ {
+ "degree": 3,
+ "accidental": 0,
+ "octave": 0,
+ "beats": 0.5,
+ "dotted": true,
+ "hole": 2,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 5,
+ "accidental": 0,
+ "octave": 0,
+ "beats": 0.25,
+ "hole": 3,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 3,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.5,
+ "hole": 5,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 2,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 1,
+ "hole": 4,
+ "breath": "draw",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 1,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.5,
+ "hole": 4,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ }
+ ]
+ },
+ {
+ "notes": [
+ {
+ "degree": 3,
+ "accidental": 0,
+ "octave": 0,
+ "beats": 0.5,
+ "dotted": true,
+ "hole": 2,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 5,
+ "accidental": 0,
+ "octave": 0,
+ "beats": 0.25,
+ "hole": 3,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 1,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.5,
+ "hole": 4,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 7,
+ "accidental": 0,
+ "octave": 0,
+ "beats": 1,
+ "dotted": true,
+ "hole": 3,
+ "breath": "draw",
+ "bend": 0,
+ "overblow": false
+ }
+ ]
+ },
+ {
+ "notes": [
+ {
+ "degree": 4,
+ "accidental": 0,
+ "octave": 0,
+ "beats": 0.5,
+ "dotted": true,
+ "hole": 2,
+ "breath": "draw",
+ "bend": 2,
+ "overblow": false
+ },
+ {
+ "degree": 5,
+ "accidental": 0,
+ "octave": 0,
+ "beats": 0.25,
+ "hole": 3,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 4,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.5,
+ "hole": 5,
+ "breath": "draw",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 3,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 1,
+ "hole": 5,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 2,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.5,
+ "hole": 4,
+ "breath": "draw",
+ "bend": 0,
+ "overblow": false
+ }
+ ]
+ },
+ {
+ "notes": [
+ {
+ "degree": 2,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.5,
+ "hole": 4,
+ "breath": "draw",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 1,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.5,
+ "hole": 4,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 6,
+ "accidental": 0,
+ "octave": 0,
+ "beats": 0.5,
+ "hole": 3,
+ "breath": "draw",
+ "bend": 2,
+ "overblow": false
+ },
+ {
+ "degree": 5,
+ "accidental": 0,
+ "octave": 0,
+ "beats": 1,
+ "dotted": true,
+ "hole": 3,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ }
+ ]
+ }
+ ],
+ [
+ {
+ "notes": [
+ {
+ "degree": 3,
+ "accidental": 0,
+ "octave": 0,
+ "beats": 0.5,
+ "dotted": true,
+ "hole": 2,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 5,
+ "accidental": 0,
+ "octave": 0,
+ "beats": 0.25,
+ "hole": 3,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 3,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.5,
+ "hole": 5,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 2,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 1,
+ "hole": 4,
+ "breath": "draw",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 1,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.5,
+ "hole": 4,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ }
+ ]
+ },
+ {
+ "notes": [
+ {
+ "degree": 3,
+ "accidental": 0,
+ "octave": 0,
+ "beats": 0.5,
+ "dotted": true,
+ "hole": 2,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 5,
+ "accidental": 0,
+ "octave": 0,
+ "beats": 0.25,
+ "hole": 3,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 1,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.5,
+ "hole": 4,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 7,
+ "accidental": 0,
+ "octave": 0,
+ "beats": 1,
+ "hole": 3,
+ "breath": "draw",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 6,
+ "accidental": 0,
+ "octave": 0,
+ "beats": 0.5,
+ "hole": 3,
+ "breath": "draw",
+ "bend": 2,
+ "overblow": false
+ }
+ ]
+ },
+ {
+ "notes": [
+ {
+ "degree": 5,
+ "accidental": 0,
+ "octave": 0,
+ "beats": 0.5,
+ "hole": 3,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 1,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.5,
+ "hole": 4,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 4,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.5,
+ "hole": 5,
+ "breath": "draw",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 3,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.5,
+ "hole": 5,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 1,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 1,
+ "hole": 4,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ }
+ ]
+ },
+ {
+ "notes": [
+ {
+ "degree": 2,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.5,
+ "hole": 4,
+ "breath": "draw",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 6,
+ "accidental": 0,
+ "octave": 0,
+ "beats": 0.5,
+ "hole": 3,
+ "breath": "draw",
+ "bend": 2,
+ "overblow": false
+ },
+ {
+ "degree": 7,
+ "accidental": 0,
+ "octave": 0,
+ "beats": 0.5,
+ "hole": 3,
+ "breath": "draw",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 1,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 1,
+ "hole": 4,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 0,
+ "accidental": 0,
+ "octave": 0,
+ "beats": 0.5,
+ "hole": null,
+ "breath": null,
+ "bend": 0,
+ "overblow": false
+ }
+ ],
+ "sectionEnd": true
+ }
+ ]
+ ]
+}
diff --git a/src/data/scores/sally-gardens.json b/src/data/scores/sally-gardens.json
index 540f1b1..560de5a 100644
--- a/src/data/scores/sally-gardens.json
+++ b/src/data/scores/sally-gardens.json
@@ -13,47 +13,17 @@
"爱尔兰",
"民谣"
],
- "source": "EveryonePiano《爱尔兰画眉—新手简单版》双手简谱的右手主旋律;爱尔兰公有领域旋律",
- "sourceUrl": "https://www.everyonepiano.cn/Number-18875-1.html",
- "sourceFormat": "jianpu-image",
- "sourceCheckedAt": "2026-08-31",
+ "source": "Thornton Rose 的 SallyGardens.abc,第 X:2 首 Down by the Sally Gardens;John Chambers 镜像",
+ "sourceUrl": "https://trillian.mit.edu/~jc/music/abc/mirror/mindspring.com/~thornton.rose/SallyGardens.abc",
+ "sourceFormat": "music-text",
+ "sourceCheckedAt": "2026-10-23",
"builtin": true,
"order": 5,
- "notes": "只采用清晰数字简谱的右手单旋律,不转录伴奏;保留 1=C、4/4、25 小节展开结构。",
+ "notes": "旧钢琴编配网页现不可读,改采用明确标注的传统单旋律 ABC 第 X:2 首,不拼接不同版本。17 小节含一拍弱起,三拍结尾与整曲反复保留;中间续句弱起并入前小节。D4 主音移为 C5,音域 C5–D6。与旧 25 小节钢琴展开版结构不同;和声、歌词、异音连线不录入,速度为编辑建议。",
"lines": [
[
{
"notes": [
- {
- "degree": 0,
- "accidental": 0,
- "octave": 0,
- "beats": 1,
- "hole": null,
- "breath": null,
- "bend": 0,
- "overblow": false
- },
- {
- "degree": 0,
- "accidental": 0,
- "octave": 0,
- "beats": 1,
- "hole": null,
- "breath": null,
- "bend": 0,
- "overblow": false
- },
- {
- "degree": 0,
- "accidental": 0,
- "octave": 0,
- "beats": 1,
- "hole": null,
- "breath": null,
- "bend": 0,
- "overblow": false
- },
{
"degree": 1,
"accidental": 0,
@@ -221,6 +191,7 @@
"accidental": 0,
"octave": 1,
"beats": 1,
+ "dotted": true,
"hole": 4,
"breath": "draw",
"bend": 0,
@@ -235,16 +206,6 @@
"breath": "blow",
"bend": 0,
"overblow": false
- },
- {
- "degree": 2,
- "accidental": 0,
- "octave": 1,
- "beats": 0.5,
- "hole": 4,
- "breath": "draw",
- "bend": 0,
- "overblow": false
}
]
}
@@ -253,11 +214,11 @@
{
"notes": [
{
- "degree": 3,
+ "degree": 1,
"accidental": 0,
"octave": 1,
"beats": 3,
- "hole": 5,
+ "hole": 4,
"breath": "blow",
"bend": 0,
"overblow": false
@@ -454,228 +415,9 @@
{
"degree": 1,
"accidental": 0,
- "octave": 2,
- "beats": 3,
- "hole": 7,
- "breath": "blow",
- "bend": 0,
- "overblow": false
- },
- {
- "degree": 5,
- "accidental": 0,
"octave": 1,
- "beats": 1,
- "hole": 6,
- "breath": "blow",
- "bend": 0,
- "overblow": false
- }
- ]
- },
- {
- "notes": [
- {
- "degree": 1,
- "accidental": 0,
- "octave": 2,
- "beats": 1,
- "hole": 7,
- "breath": "blow",
- "bend": 0,
- "overblow": false
- },
- {
- "degree": 7,
- "accidental": 0,
- "octave": 1,
- "beats": 0.5,
- "hole": 7,
- "breath": "draw",
- "bend": 0,
- "overblow": false
- },
- {
- "degree": 5,
- "accidental": 0,
- "octave": 1,
- "beats": 0.5,
- "hole": 6,
- "breath": "blow",
- "bend": 0,
- "overblow": false
- },
- {
- "degree": 6,
- "accidental": 0,
- "octave": 1,
- "beats": 1,
- "hole": 6,
- "breath": "draw",
- "bend": 0,
- "overblow": false
- },
- {
- "degree": 1,
- "accidental": 0,
- "octave": 2,
- "beats": 0.5,
- "hole": 7,
- "breath": "blow",
- "bend": 0,
- "overblow": false
- },
- {
- "degree": 6,
- "accidental": 0,
- "octave": 1,
- "beats": 0.5,
- "hole": 6,
- "breath": "draw",
- "bend": 0,
- "overblow": false
- }
- ]
- },
- {
- "notes": [
- {
- "degree": 7,
- "accidental": 0,
- "octave": 1,
- "beats": 1,
- "dotted": true,
- "hole": 7,
- "breath": "draw",
- "bend": 0,
- "overblow": false
- },
- {
- "degree": 6,
- "accidental": 0,
- "octave": 1,
- "beats": 0.5,
- "hole": 6,
- "breath": "draw",
- "bend": 0,
- "overblow": false
- },
- {
- "degree": 5,
- "accidental": 0,
- "octave": 1,
- "beats": 1,
- "hole": 6,
- "breath": "blow",
- "bend": 0,
- "overblow": false
- },
- {
- "degree": 3,
- "accidental": 0,
- "octave": 1,
- "beats": 0.5,
- "hole": 5,
- "breath": "blow",
- "bend": 0,
- "overblow": false
- },
- {
- "degree": 5,
- "accidental": 0,
- "octave": 1,
- "beats": 0.5,
- "hole": 6,
- "breath": "blow",
- "bend": 0,
- "overblow": false
- }
- ]
- },
- {
- "notes": [
- {
- "degree": 6,
- "accidental": 0,
- "octave": 1,
- "beats": 1,
- "hole": 6,
- "breath": "draw",
- "bend": 0,
- "overblow": false
- },
- {
- "degree": 5,
- "accidental": 0,
- "octave": 1,
- "beats": 0.5,
- "hole": 6,
- "breath": "blow",
- "bend": 0,
- "overblow": false
- },
- {
- "degree": 3,
- "accidental": 0,
- "octave": 1,
- "beats": 0.5,
- "hole": 5,
- "breath": "blow",
- "bend": 0,
- "overblow": false
- },
- {
- "degree": 5,
- "accidental": 0,
- "octave": 1,
- "beats": 0.5,
- "hole": 6,
- "breath": "blow",
- "bend": 0,
- "overblow": false
- },
- {
- "degree": 6,
- "accidental": 0,
- "octave": 1,
- "beats": 0.5,
- "hole": 6,
- "breath": "draw",
- "bend": 0,
- "overblow": false
- },
- {
- "degree": 1,
- "accidental": 0,
- "octave": 2,
- "beats": 0.5,
- "hole": 7,
- "breath": "blow",
- "bend": 0,
- "overblow": false
- },
- {
- "degree": 2,
- "accidental": 0,
- "octave": 2,
- "beats": 0.5,
- "hole": 8,
- "breath": "draw",
- "bend": 0,
- "overblow": false
- }
- ]
- }
- ],
- [
- {
- "notes": [
- {
- "degree": 3,
- "accidental": 0,
- "octave": 2,
"beats": 3,
- "hole": 8,
+ "hole": 4,
"breath": "blow",
"bend": 0,
"overblow": false
@@ -738,21 +480,11 @@
"degree": 1,
"accidental": 0,
"octave": 2,
- "beats": 0.5,
+ "beats": 1,
"hole": 7,
"breath": "blow",
"bend": 0,
"overblow": false
- },
- {
- "degree": 6,
- "accidental": 0,
- "octave": 1,
- "beats": 0.5,
- "hole": 6,
- "breath": "draw",
- "bend": 0,
- "overblow": false
}
]
},
@@ -1083,220 +815,21 @@
"overblow": false
}
]
- }
- ],
- [
- {
- "notes": [
- {
- "degree": 3,
- "accidental": 0,
- "octave": 1,
- "beats": 3,
- "hole": 5,
- "breath": "blow",
- "bend": 0,
- "overblow": false
- },
- {
- "degree": 1,
- "accidental": 0,
- "octave": 1,
- "beats": 0.5,
- "hole": 4,
- "breath": "blow",
- "bend": 0,
- "overblow": false
- },
- {
- "degree": 2,
- "accidental": 0,
- "octave": 1,
- "beats": 0.5,
- "hole": 4,
- "breath": "draw",
- "bend": 0,
- "overblow": false
- }
- ]
},
{
"notes": [
- {
- "degree": 3,
- "accidental": 0,
- "octave": 1,
- "beats": 1,
- "hole": 5,
- "breath": "blow",
- "bend": 0,
- "overblow": false
- },
- {
- "degree": 2,
- "accidental": 0,
- "octave": 1,
- "beats": 0.5,
- "hole": 4,
- "breath": "draw",
- "bend": 0,
- "overblow": false
- },
{
"degree": 1,
"accidental": 0,
"octave": 1,
- "beats": 0.5,
- "hole": 4,
- "breath": "blow",
- "bend": 0,
- "overblow": false
- },
- {
- "degree": 2,
- "accidental": 0,
- "octave": 1,
- "beats": 1,
- "hole": 4,
- "breath": "draw",
- "bend": 0,
- "overblow": false
- },
- {
- "degree": 3,
- "accidental": 0,
- "octave": 1,
- "beats": 0.5,
- "hole": 5,
- "breath": "blow",
- "bend": 0,
- "overblow": false
- },
- {
- "degree": 5,
- "accidental": 0,
- "octave": 1,
- "beats": 0.5,
- "hole": 6,
- "breath": "blow",
- "bend": 0,
- "overblow": false
- }
- ]
- },
- {
- "notes": [
- {
- "degree": 6,
- "accidental": 0,
- "octave": 1,
- "beats": 2,
- "hole": 6,
- "breath": "draw",
- "bend": 0,
- "overblow": false
- },
- {
- "degree": 5,
- "accidental": 0,
- "octave": 1,
- "beats": 1,
- "hole": 6,
- "breath": "blow",
- "bend": 0,
- "overblow": false
- },
- {
- "degree": 1,
- "accidental": 0,
- "octave": 2,
- "beats": 0.5,
- "hole": 7,
- "breath": "blow",
- "bend": 0,
- "overblow": false
- },
- {
- "degree": 5,
- "accidental": 0,
- "octave": 1,
- "beats": 0.5,
- "hole": 6,
- "breath": "blow",
- "bend": 0,
- "overblow": false
- }
- ]
- },
- {
- "notes": [
- {
- "degree": 6,
- "accidental": 0,
- "octave": 1,
- "beats": 1,
- "hole": 6,
- "breath": "draw",
- "bend": 0,
- "overblow": false
- },
- {
- "degree": 5,
- "accidental": 0,
- "octave": 1,
- "beats": 0.5,
- "hole": 6,
- "breath": "blow",
- "bend": 0,
- "overblow": false
- },
- {
- "degree": 3,
- "accidental": 0,
- "octave": 1,
- "beats": 0.5,
- "hole": 5,
- "breath": "blow",
- "bend": 0,
- "overblow": false
- },
- {
- "degree": 2,
- "accidental": 0,
- "octave": 1,
- "beats": 1,
- "dotted": true,
- "hole": 4,
- "breath": "draw",
- "bend": 0,
- "overblow": false
- },
- {
- "degree": 1,
- "accidental": 0,
- "octave": 1,
- "beats": 0.5,
- "hole": 4,
- "breath": "blow",
- "bend": 0,
- "overblow": false
- }
- ]
- },
- {
- "notes": [
- {
- "degree": 1,
- "accidental": 0,
- "octave": 1,
- "beats": 4,
+ "beats": 3,
"hole": 4,
"breath": "blow",
"bend": 0,
"overblow": false
}
],
- "sectionEnd": true
+ "repeatEnd": true
}
]
]
diff --git a/src/data/scores/santa-lucia.json b/src/data/scores/santa-lucia.json
new file mode 100644
index 0000000..b0eaf4d
--- /dev/null
+++ b/src/data/scores/santa-lucia.json
@@ -0,0 +1,891 @@
+{
+ "id": "santa-lucia",
+ "title": "桑塔·露琪亚",
+ "subtitle": "Santa Lucia · 意大利船歌",
+ "composer": "科特劳(教材署名)",
+ "key": "C",
+ "harmonicaKey": "C",
+ "position": "第一把位",
+ "timeSignature": "3/8",
+ "tempo": 66,
+ "difficulty": 3,
+ "tags": [
+ "西方民谣",
+ "三八拍",
+ "压音"
+ ],
+ "source": "人民教育出版社《音乐七年级下册·简谱》印刷第 41 页(PDF 第 46 页);保留原 1=C 音高,前段反复记号保留,后段第一/第二结尾反复展开。",
+ "sourceUrl": "https://dev98.oa.henanyuexue.com/static/szjc-resources/pdf/q/f/2/7.pdf#page=46",
+ "sourceFormat": "jianpu-image",
+ "sourceCheckedAt": "2026-10-22",
+ "builtin": true,
+ "order": 25,
+ "notes": "24 个书写小节:前 8 小节反复一次,后 16 小节已按两种结尾展开,按顺序演奏。注意第 6 小节升 fa 后还原为自然 fa,两者分别为 2 孔吸气半音/全音压音。低音区不额外升八度,避免把升 fa 移到需要超吹的音区。省略歌词与异音连奏线;速度为练习建议。",
+ "lines": [
+ [
+ {
+ "notes": [
+ {
+ "degree": 5,
+ "accidental": 0,
+ "octave": 0,
+ "beats": 0.5,
+ "hole": 3,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 5,
+ "accidental": 0,
+ "octave": 0,
+ "beats": 0.5,
+ "dotted": true,
+ "hole": 3,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 1,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.25,
+ "hole": 4,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ }
+ ],
+ "repeatBegin": true
+ },
+ {
+ "notes": [
+ {
+ "degree": 1,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.25,
+ "hole": 4,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 7,
+ "accidental": 0,
+ "octave": 0,
+ "beats": 0.25,
+ "hole": 3,
+ "breath": "draw",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 7,
+ "accidental": 0,
+ "octave": 0,
+ "beats": 1,
+ "hole": 3,
+ "breath": "draw",
+ "bend": 0,
+ "overblow": false
+ }
+ ]
+ },
+ {
+ "notes": [
+ {
+ "degree": 4,
+ "accidental": 0,
+ "octave": 0,
+ "beats": 0.5,
+ "hole": 2,
+ "breath": "draw",
+ "bend": 2,
+ "overblow": false
+ },
+ {
+ "degree": 4,
+ "accidental": 0,
+ "octave": 0,
+ "beats": 0.5,
+ "dotted": true,
+ "hole": 2,
+ "breath": "draw",
+ "bend": 2,
+ "overblow": false
+ },
+ {
+ "degree": 6,
+ "accidental": 0,
+ "octave": 0,
+ "beats": 0.25,
+ "hole": 3,
+ "breath": "draw",
+ "bend": 2,
+ "overblow": false
+ }
+ ]
+ },
+ {
+ "notes": [
+ {
+ "degree": 6,
+ "accidental": 0,
+ "octave": 0,
+ "beats": 0.25,
+ "hole": 3,
+ "breath": "draw",
+ "bend": 2,
+ "overblow": false
+ },
+ {
+ "degree": 5,
+ "accidental": 0,
+ "octave": 0,
+ "beats": 0.25,
+ "hole": 3,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 5,
+ "accidental": 0,
+ "octave": 0,
+ "beats": 1,
+ "hole": 3,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ }
+ ]
+ }
+ ],
+ [
+ {
+ "notes": [
+ {
+ "degree": 3,
+ "accidental": 0,
+ "octave": 0,
+ "beats": 0.5,
+ "hole": 2,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 6,
+ "accidental": 0,
+ "octave": 0,
+ "beats": 0.5,
+ "hole": 3,
+ "breath": "draw",
+ "bend": 2,
+ "overblow": false
+ },
+ {
+ "degree": 5,
+ "accidental": 0,
+ "octave": 0,
+ "beats": 0.5,
+ "hole": 3,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ }
+ ]
+ },
+ {
+ "notes": [
+ {
+ "degree": 5,
+ "accidental": 0,
+ "octave": 0,
+ "beats": 0.25,
+ "hole": 3,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 4,
+ "accidental": 1,
+ "octave": 0,
+ "beats": 0.25,
+ "hole": 2,
+ "breath": "draw",
+ "bend": 1,
+ "overblow": false
+ },
+ {
+ "degree": 4,
+ "accidental": 0,
+ "octave": 0,
+ "beats": 1,
+ "hole": 2,
+ "breath": "draw",
+ "bend": 2,
+ "overblow": false
+ }
+ ]
+ },
+ {
+ "notes": [
+ {
+ "degree": 4,
+ "accidental": 0,
+ "octave": 0,
+ "beats": 0.5,
+ "hole": 2,
+ "breath": "draw",
+ "bend": 2,
+ "overblow": false
+ },
+ {
+ "degree": 3,
+ "accidental": 0,
+ "octave": 0,
+ "beats": 0.5,
+ "hole": 2,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 2,
+ "accidental": 0,
+ "octave": 0,
+ "beats": 0.5,
+ "hole": 1,
+ "breath": "draw",
+ "bend": 0,
+ "overblow": false
+ }
+ ]
+ },
+ {
+ "notes": [
+ {
+ "degree": 6,
+ "accidental": 0,
+ "octave": 0,
+ "beats": 0.5,
+ "hole": 3,
+ "breath": "draw",
+ "bend": 2,
+ "overblow": false
+ },
+ {
+ "degree": 5,
+ "accidental": 0,
+ "octave": 0,
+ "beats": 1,
+ "hole": 3,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ }
+ ],
+ "repeatEnd": true
+ }
+ ],
+ [
+ {
+ "notes": [
+ {
+ "degree": 3,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.5,
+ "hole": 5,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 2,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.5,
+ "hole": 4,
+ "breath": "draw",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 1,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.5,
+ "hole": 4,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ }
+ ]
+ },
+ {
+ "notes": [
+ {
+ "degree": 7,
+ "accidental": 0,
+ "octave": 0,
+ "beats": 0.25,
+ "hole": 3,
+ "breath": "draw",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 6,
+ "accidental": 0,
+ "octave": 0,
+ "beats": 0.25,
+ "hole": 3,
+ "breath": "draw",
+ "bend": 2,
+ "overblow": false
+ },
+ {
+ "degree": 2,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 1,
+ "hole": 4,
+ "breath": "draw",
+ "bend": 0,
+ "overblow": false
+ }
+ ]
+ },
+ {
+ "notes": [
+ {
+ "degree": 2,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.5,
+ "hole": 4,
+ "breath": "draw",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 1,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.5,
+ "hole": 4,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 6,
+ "accidental": 0,
+ "octave": 0,
+ "beats": 0.5,
+ "hole": 3,
+ "breath": "draw",
+ "bend": 2,
+ "overblow": false
+ }
+ ]
+ },
+ {
+ "notes": [
+ {
+ "degree": 4,
+ "accidental": 1,
+ "octave": 0,
+ "beats": 0.25,
+ "hole": 2,
+ "breath": "draw",
+ "bend": 1,
+ "overblow": false
+ },
+ {
+ "degree": 5,
+ "accidental": 0,
+ "octave": 0,
+ "beats": 0.25,
+ "hole": 3,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 1,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 1,
+ "hole": 4,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ }
+ ]
+ }
+ ],
+ [
+ {
+ "notes": [
+ {
+ "degree": 3,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.25,
+ "hole": 5,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 1,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.25,
+ "hole": 4,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 1,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.25,
+ "hole": 4,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 5,
+ "accidental": 0,
+ "octave": 0,
+ "beats": 0.25,
+ "hole": 3,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 5,
+ "accidental": 0,
+ "octave": 0,
+ "beats": 0.25,
+ "hole": 3,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 3,
+ "accidental": 0,
+ "octave": 0,
+ "beats": 0.25,
+ "hole": 2,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ }
+ ]
+ },
+ {
+ "notes": [
+ {
+ "degree": 4,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.25,
+ "hole": 5,
+ "breath": "draw",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 2,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.25,
+ "hole": 4,
+ "breath": "draw",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 2,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 1,
+ "hole": 4,
+ "breath": "draw",
+ "bend": 0,
+ "overblow": false
+ }
+ ]
+ },
+ {
+ "notes": [
+ {
+ "degree": 2,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.5,
+ "hole": 4,
+ "breath": "draw",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 6,
+ "accidental": 0,
+ "octave": 0,
+ "beats": 0.5,
+ "dotted": true,
+ "hole": 3,
+ "breath": "draw",
+ "bend": 2,
+ "overblow": false
+ },
+ {
+ "degree": 7,
+ "accidental": 0,
+ "octave": 0,
+ "beats": 0.25,
+ "hole": 3,
+ "breath": "draw",
+ "bend": 0,
+ "overblow": false
+ }
+ ]
+ },
+ {
+ "notes": [
+ {
+ "degree": 2,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.5,
+ "hole": 4,
+ "breath": "draw",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 1,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 1,
+ "hole": 4,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ }
+ ]
+ }
+ ],
+ [
+ {
+ "notes": [
+ {
+ "degree": 3,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.5,
+ "hole": 5,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 2,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.5,
+ "hole": 4,
+ "breath": "draw",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 1,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.5,
+ "hole": 4,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ }
+ ]
+ },
+ {
+ "notes": [
+ {
+ "degree": 7,
+ "accidental": 0,
+ "octave": 0,
+ "beats": 0.25,
+ "hole": 3,
+ "breath": "draw",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 6,
+ "accidental": 0,
+ "octave": 0,
+ "beats": 0.25,
+ "hole": 3,
+ "breath": "draw",
+ "bend": 2,
+ "overblow": false
+ },
+ {
+ "degree": 2,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 1,
+ "hole": 4,
+ "breath": "draw",
+ "bend": 0,
+ "overblow": false
+ }
+ ]
+ },
+ {
+ "notes": [
+ {
+ "degree": 2,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.5,
+ "hole": 4,
+ "breath": "draw",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 1,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.5,
+ "hole": 4,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 6,
+ "accidental": 0,
+ "octave": 0,
+ "beats": 0.5,
+ "hole": 3,
+ "breath": "draw",
+ "bend": 2,
+ "overblow": false
+ }
+ ]
+ },
+ {
+ "notes": [
+ {
+ "degree": 4,
+ "accidental": 1,
+ "octave": 0,
+ "beats": 0.25,
+ "hole": 2,
+ "breath": "draw",
+ "bend": 1,
+ "overblow": false
+ },
+ {
+ "degree": 5,
+ "accidental": 0,
+ "octave": 0,
+ "beats": 0.25,
+ "hole": 3,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 1,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 1,
+ "hole": 4,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ }
+ ]
+ }
+ ],
+ [
+ {
+ "notes": [
+ {
+ "degree": 3,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.25,
+ "hole": 5,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 1,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.25,
+ "hole": 4,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 1,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.25,
+ "hole": 4,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 5,
+ "accidental": 0,
+ "octave": 0,
+ "beats": 0.25,
+ "hole": 3,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 5,
+ "accidental": 0,
+ "octave": 0,
+ "beats": 0.25,
+ "hole": 3,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 3,
+ "accidental": 0,
+ "octave": 0,
+ "beats": 0.25,
+ "hole": 2,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ }
+ ]
+ },
+ {
+ "notes": [
+ {
+ "degree": 4,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.25,
+ "hole": 5,
+ "breath": "draw",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 2,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.25,
+ "hole": 4,
+ "breath": "draw",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 2,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 1,
+ "hole": 4,
+ "breath": "draw",
+ "bend": 0,
+ "overblow": false
+ }
+ ]
+ },
+ {
+ "notes": [
+ {
+ "degree": 2,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.5,
+ "hole": 4,
+ "breath": "draw",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 3,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.5,
+ "dotted": true,
+ "hole": 5,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 2,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.25,
+ "hole": 4,
+ "breath": "draw",
+ "bend": 0,
+ "overblow": false
+ }
+ ]
+ },
+ {
+ "notes": [
+ {
+ "degree": 2,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.5,
+ "hole": 4,
+ "breath": "draw",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 1,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 1,
+ "hole": 4,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ }
+ ],
+ "sectionEnd": true
+ }
+ ]
+ ]
+}
diff --git a/src/data/scores/see-saw.json b/src/data/scores/see-saw.json
new file mode 100644
index 0000000..cc64143
--- /dev/null
+++ b/src/data/scores/see-saw.json
@@ -0,0 +1,407 @@
+{
+ "id": "see-saw",
+ "title": "跷跷板",
+ "subtitle": "See-saw, Margery Daw · Elliott 版本",
+ "composer": "Elliott(所选歌集署名)",
+ "key": "C",
+ "harmonicaKey": "C",
+ "position": "第一把位",
+ "timeSignature": "6/8",
+ "tempo": 112,
+ "difficulty": 2,
+ "tags": [
+ "入门",
+ "儿歌"
+ ],
+ "source": "The Everyday Song Book (1927), No.8;John Chambers ABC 转录",
+ "sourceUrl": "https://trillian.mit.edu/~jc/music/book/EverydaySongBook/008_See-saw_Margery_Daw.abc",
+ "sourceFormat": "music-text",
+ "sourceCheckedAt": "2026-10-23",
+ "builtin": true,
+ "order": 47,
+ "notes": "完整8小节,六八拍;第5小节在原文本中跨行,已接成完整小节。保留低 sol、末小节低 si 和所有休止。 仅录主旋律,不录歌词、伴奏及异音连奏线;速度为编辑练习建议。 原 Ab4 主音移为 C5,所有音符整体上移 4 个半音。",
+ "lines": [
+ [
+ {
+ "notes": [
+ {
+ "degree": 1,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 1,
+ "dotted": true,
+ "hole": 4,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 5,
+ "accidental": 0,
+ "octave": 0,
+ "beats": 1,
+ "dotted": true,
+ "hole": 3,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ }
+ ]
+ },
+ {
+ "notes": [
+ {
+ "degree": 1,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.5,
+ "hole": 4,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 1,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.5,
+ "hole": 4,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 1,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.5,
+ "hole": 4,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 5,
+ "accidental": 0,
+ "octave": 0,
+ "beats": 1,
+ "dotted": true,
+ "hole": 3,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ }
+ ]
+ },
+ {
+ "notes": [
+ {
+ "degree": 1,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 1,
+ "hole": 4,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 1,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.5,
+ "hole": 4,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 1,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.5,
+ "hole": 4,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 1,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.5,
+ "hole": 4,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 1,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.5,
+ "hole": 4,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ }
+ ]
+ },
+ {
+ "notes": [
+ {
+ "degree": 3,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 1,
+ "dotted": true,
+ "hole": 5,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 2,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 1,
+ "hole": 4,
+ "breath": "draw",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 0,
+ "accidental": 0,
+ "octave": 0,
+ "beats": 0.5,
+ "hole": null,
+ "breath": null,
+ "bend": 0,
+ "overblow": false
+ }
+ ]
+ }
+ ],
+ [
+ {
+ "notes": [
+ {
+ "degree": 1,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 1,
+ "hole": 4,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 1,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.5,
+ "hole": 4,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 5,
+ "accidental": 0,
+ "octave": 0,
+ "beats": 0.5,
+ "hole": 3,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 5,
+ "accidental": 0,
+ "octave": 0,
+ "beats": 0.5,
+ "hole": 3,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 5,
+ "accidental": 0,
+ "octave": 0,
+ "beats": 0.5,
+ "hole": 3,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ }
+ ]
+ },
+ {
+ "notes": [
+ {
+ "degree": 1,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.5,
+ "hole": 4,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 1,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.5,
+ "hole": 4,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 1,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.5,
+ "hole": 4,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 5,
+ "accidental": 0,
+ "octave": 0,
+ "beats": 1,
+ "hole": 3,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 5,
+ "accidental": 0,
+ "octave": 0,
+ "beats": 0.5,
+ "hole": 3,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ }
+ ]
+ },
+ {
+ "notes": [
+ {
+ "degree": 3,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.5,
+ "hole": 5,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 3,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.5,
+ "hole": 5,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 3,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.5,
+ "hole": 5,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 5,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.5,
+ "hole": 6,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 4,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.5,
+ "hole": 5,
+ "breath": "draw",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 2,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.5,
+ "hole": 4,
+ "breath": "draw",
+ "bend": 0,
+ "overblow": false
+ }
+ ]
+ },
+ {
+ "notes": [
+ {
+ "degree": 7,
+ "accidental": 0,
+ "octave": 0,
+ "beats": 1,
+ "dotted": true,
+ "hole": 3,
+ "breath": "draw",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 1,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.5,
+ "hole": 4,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 0,
+ "accidental": 0,
+ "octave": 0,
+ "beats": 0.5,
+ "hole": null,
+ "breath": null,
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 0,
+ "accidental": 0,
+ "octave": 0,
+ "beats": 0.5,
+ "hole": null,
+ "breath": null,
+ "bend": 0,
+ "overblow": false
+ }
+ ],
+ "sectionEnd": true
+ }
+ ]
+ ]
+}
diff --git a/src/data/scores/silent-night.json b/src/data/scores/silent-night.json
index eccc2db..eb174da 100644
--- a/src/data/scores/silent-night.json
+++ b/src/data/scores/silent-night.json
@@ -6,7 +6,7 @@
"key": "C",
"harmonicaKey": "C",
"position": "第一把位",
- "timeSignature": "3/4",
+ "timeSignature": "6/8",
"tempo": 76,
"difficulty": 2,
"tags": [
@@ -14,13 +14,13 @@
"赞美诗",
"经典"
],
- "source": "苍强曲谱 1=C、3/4《平安夜》文字简谱;采用 24 小节常见旋律版",
- "sourceUrl": "https://www.cangqiang.com.cn/bofang/5872.html",
- "sourceFormat": "jianpu-text",
- "sourceCheckedAt": "2026-08-31",
+ "source": "The Everyday Song Book (1927), No.57 Holy Night;John Chambers ABC 转录 (2017)",
+ "sourceUrl": "https://trillian.mit.edu/~jc/music/book/EverydaySongBook/057_Holy_Night.abc",
+ "sourceFormat": "music-text",
+ "sourceCheckedAt": "2026-10-23",
"builtin": true,
"order": 13,
- "notes": "注意附点四分音符与八分音符的摇曳感;整体升八度后可在 C 调十孔口琴自然演奏。",
+ "notes": "旧来源文字音高与现有谱不一致,改用 1927 年可逐音核对版本。保留原 6/8 拍、12 小节、四处八分休止、第三小节附点十六分与三十二分、末小节同音延音。整体升八度至 C5–F6;终止音为 C5。歌词、力度与异音连线不录入;四分拍速度为编辑建议。",
"lines": [
[
{
@@ -29,7 +29,7 @@
"degree": 5,
"accidental": 0,
"octave": 1,
- "beats": 1,
+ "beats": 0.5,
"dotted": true,
"hole": 6,
"breath": "blow",
@@ -40,7 +40,7 @@
"degree": 6,
"accidental": 0,
"octave": 1,
- "beats": 0.5,
+ "beats": 0.25,
"hole": 6,
"breath": "draw",
"bend": 0,
@@ -50,21 +50,18 @@
"degree": 5,
"accidental": 0,
"octave": 1,
- "beats": 1,
+ "beats": 0.5,
"hole": 6,
"breath": "blow",
"bend": 0,
"overblow": false
- }
- ]
- },
- {
- "notes": [
+ },
{
"degree": 3,
"accidental": 0,
"octave": 1,
- "beats": 3,
+ "beats": 1,
+ "dotted": true,
"hole": 5,
"breath": "blow",
"bend": 0,
@@ -78,7 +75,7 @@
"degree": 5,
"accidental": 0,
"octave": 1,
- "beats": 1,
+ "beats": 0.5,
"dotted": true,
"hole": 6,
"breath": "blow",
@@ -89,7 +86,7 @@
"degree": 6,
"accidental": 0,
"octave": 1,
- "beats": 0.5,
+ "beats": 0.25,
"hole": 6,
"breath": "draw",
"bend": 0,
@@ -99,37 +96,32 @@
"degree": 5,
"accidental": 0,
"octave": 1,
- "beats": 1,
+ "beats": 0.5,
"hole": 6,
"breath": "blow",
"bend": 0,
"overblow": false
- }
- ]
- },
- {
- "notes": [
+ },
{
"degree": 3,
"accidental": 0,
"octave": 1,
- "beats": 3,
+ "beats": 1,
+ "dotted": true,
"hole": 5,
"breath": "blow",
"bend": 0,
"overblow": false
}
]
- }
- ],
- [
+ },
{
"notes": [
{
"degree": 2,
"accidental": 0,
"octave": 2,
- "beats": 2,
+ "beats": 1,
"hole": 8,
"breath": "draw",
"bend": 0,
@@ -139,21 +131,29 @@
"degree": 2,
"accidental": 0,
"octave": 2,
- "beats": 1,
+ "beats": 0.25,
+ "dotted": true,
"hole": 8,
"breath": "draw",
"bend": 0,
"overblow": false
- }
- ]
- },
- {
- "notes": [
+ },
+ {
+ "degree": 7,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.125,
+ "hole": 7,
+ "breath": "draw",
+ "bend": 0,
+ "overblow": false
+ },
{
"degree": 7,
"accidental": 0,
"octave": 1,
- "beats": 3,
+ "beats": 1,
+ "dotted": true,
"hole": 7,
"breath": "draw",
"bend": 0,
@@ -167,7 +167,7 @@
"degree": 1,
"accidental": 0,
"octave": 2,
- "beats": 2,
+ "beats": 1,
"hole": 7,
"breath": "blow",
"bend": 0,
@@ -177,21 +177,28 @@
"degree": 1,
"accidental": 0,
"octave": 2,
- "beats": 1,
+ "beats": 0.25,
"hole": 7,
"breath": "blow",
"bend": 0,
"overblow": false
- }
- ]
- },
- {
- "notes": [
+ },
+ {
+ "degree": 5,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.25,
+ "hole": 6,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
{
"degree": 5,
"accidental": 0,
"octave": 1,
- "beats": 3,
+ "beats": 1,
+ "dotted": true,
"hole": 6,
"breath": "blow",
"bend": 0,
@@ -207,7 +214,7 @@
"degree": 6,
"accidental": 0,
"octave": 1,
- "beats": 2,
+ "beats": 1,
"hole": 6,
"breath": "draw",
"bend": 0,
@@ -217,21 +224,17 @@
"degree": 6,
"accidental": 0,
"octave": 1,
- "beats": 1,
+ "beats": 0.5,
"hole": 6,
"breath": "draw",
"bend": 0,
"overblow": false
- }
- ]
- },
- {
- "notes": [
+ },
{
"degree": 1,
"accidental": 0,
"octave": 2,
- "beats": 1,
+ "beats": 0.5,
"dotted": true,
"hole": 7,
"breath": "blow",
@@ -242,7 +245,7 @@
"degree": 7,
"accidental": 0,
"octave": 1,
- "beats": 0.5,
+ "beats": 0.25,
"hole": 7,
"breath": "draw",
"bend": 0,
@@ -252,7 +255,7 @@
"degree": 6,
"accidental": 0,
"octave": 1,
- "beats": 1,
+ "beats": 0.5,
"hole": 6,
"breath": "draw",
"bend": 0,
@@ -266,7 +269,7 @@
"degree": 5,
"accidental": 0,
"octave": 1,
- "beats": 1,
+ "beats": 0.5,
"dotted": true,
"hole": 6,
"breath": "blow",
@@ -277,7 +280,7 @@
"degree": 6,
"accidental": 0,
"octave": 1,
- "beats": 0.5,
+ "beats": 0.25,
"hole": 6,
"breath": "draw",
"bend": 0,
@@ -287,37 +290,41 @@
"degree": 5,
"accidental": 0,
"octave": 1,
- "beats": 1,
+ "beats": 0.5,
"hole": 6,
"breath": "blow",
"bend": 0,
"overblow": false
- }
- ]
- },
- {
- "notes": [
+ },
{
"degree": 3,
"accidental": 0,
"octave": 1,
- "beats": 3,
+ "beats": 1,
"hole": 5,
"breath": "blow",
"bend": 0,
"overblow": false
+ },
+ {
+ "degree": 0,
+ "accidental": 0,
+ "octave": 0,
+ "beats": 0.5,
+ "hole": null,
+ "breath": null,
+ "bend": 0,
+ "overblow": false
}
]
- }
- ],
- [
+ },
{
"notes": [
{
"degree": 6,
"accidental": 0,
"octave": 1,
- "beats": 2,
+ "beats": 1,
"hole": 6,
"breath": "draw",
"bend": 0,
@@ -327,21 +334,17 @@
"degree": 6,
"accidental": 0,
"octave": 1,
- "beats": 1,
+ "beats": 0.5,
"hole": 6,
"breath": "draw",
"bend": 0,
"overblow": false
- }
- ]
- },
- {
- "notes": [
+ },
{
"degree": 1,
"accidental": 0,
"octave": 2,
- "beats": 1,
+ "beats": 0.5,
"dotted": true,
"hole": 7,
"breath": "blow",
@@ -352,7 +355,7 @@
"degree": 7,
"accidental": 0,
"octave": 1,
- "beats": 0.5,
+ "beats": 0.25,
"hole": 7,
"breath": "draw",
"bend": 0,
@@ -362,7 +365,7 @@
"degree": 6,
"accidental": 0,
"octave": 1,
- "beats": 1,
+ "beats": 0.5,
"hole": 6,
"breath": "draw",
"bend": 0,
@@ -376,7 +379,7 @@
"degree": 5,
"accidental": 0,
"octave": 1,
- "beats": 1,
+ "beats": 0.5,
"dotted": true,
"hole": 6,
"breath": "blow",
@@ -387,7 +390,7 @@
"degree": 6,
"accidental": 0,
"octave": 1,
- "beats": 0.5,
+ "beats": 0.25,
"hole": 6,
"breath": "draw",
"bend": 0,
@@ -397,25 +400,31 @@
"degree": 5,
"accidental": 0,
"octave": 1,
- "beats": 1,
+ "beats": 0.5,
"hole": 6,
"breath": "blow",
"bend": 0,
"overblow": false
- }
- ]
- },
- {
- "notes": [
+ },
{
"degree": 3,
"accidental": 0,
"octave": 1,
- "beats": 3,
+ "beats": 1,
"hole": 5,
"breath": "blow",
"bend": 0,
"overblow": false
+ },
+ {
+ "degree": 0,
+ "accidental": 0,
+ "octave": 0,
+ "beats": 0.5,
+ "hole": null,
+ "breath": null,
+ "bend": 0,
+ "overblow": false
}
]
}
@@ -427,7 +436,7 @@
"degree": 2,
"accidental": 0,
"octave": 2,
- "beats": 2,
+ "beats": 1,
"hole": 8,
"breath": "draw",
"bend": 0,
@@ -437,21 +446,17 @@
"degree": 2,
"accidental": 0,
"octave": 2,
- "beats": 1,
+ "beats": 0.5,
"hole": 8,
"breath": "draw",
"bend": 0,
"overblow": false
- }
- ]
- },
- {
- "notes": [
+ },
{
"degree": 4,
"accidental": 0,
"octave": 2,
- "beats": 1,
+ "beats": 0.5,
"dotted": true,
"hole": 9,
"breath": "draw",
@@ -462,7 +467,7 @@
"degree": 2,
"accidental": 0,
"octave": 2,
- "beats": 0.5,
+ "beats": 0.25,
"hole": 8,
"breath": "draw",
"bend": 0,
@@ -472,7 +477,7 @@
"degree": 7,
"accidental": 0,
"octave": 1,
- "beats": 1,
+ "beats": 0.5,
"hole": 7,
"breath": "draw",
"bend": 0,
@@ -486,37 +491,43 @@
"degree": 1,
"accidental": 0,
"octave": 2,
- "beats": 3,
+ "beats": 1,
+ "dotted": true,
"hole": 7,
"breath": "blow",
"bend": 0,
"overblow": false
- }
- ]
- },
- {
- "notes": [
+ },
{
"degree": 3,
"accidental": 0,
"octave": 2,
- "beats": 3,
+ "beats": 1,
"hole": 8,
"breath": "blow",
"bend": 0,
"overblow": false
+ },
+ {
+ "degree": 0,
+ "accidental": 0,
+ "octave": 0,
+ "beats": 0.5,
+ "hole": null,
+ "breath": null,
+ "bend": 0,
+ "overblow": false
}
]
- }
- ],
- [
+ },
{
"notes": [
{
"degree": 1,
"accidental": 0,
"octave": 2,
- "beats": 1,
+ "beats": 0.5,
+ "dotted": true,
"hole": 7,
"breath": "blow",
"bend": 0,
@@ -526,7 +537,7 @@
"degree": 5,
"accidental": 0,
"octave": 1,
- "beats": 1,
+ "beats": 0.25,
"hole": 6,
"breath": "blow",
"bend": 0,
@@ -536,21 +547,17 @@
"degree": 3,
"accidental": 0,
"octave": 1,
- "beats": 1,
+ "beats": 0.5,
"hole": 5,
"breath": "blow",
"bend": 0,
"overblow": false
- }
- ]
- },
- {
- "notes": [
+ },
{
"degree": 5,
"accidental": 0,
"octave": 1,
- "beats": 1,
+ "beats": 0.5,
"dotted": true,
"hole": 6,
"breath": "blow",
@@ -561,7 +568,7 @@
"degree": 4,
"accidental": 0,
"octave": 1,
- "beats": 0.5,
+ "beats": 0.25,
"hole": 5,
"breath": "draw",
"bend": 0,
@@ -571,7 +578,7 @@
"degree": 2,
"accidental": 0,
"octave": 1,
- "beats": 1,
+ "beats": 0.5,
"hole": 4,
"breath": "draw",
"bend": 0,
@@ -584,26 +591,34 @@
{
"degree": 1,
"accidental": 0,
- "octave": 2,
- "beats": 3,
- "hole": 7,
+ "octave": 1,
+ "beats": 1,
+ "dotted": true,
+ "tie": true,
+ "hole": 4,
"breath": "blow",
"bend": 0,
"overblow": false
- }
- ]
- },
- {
- "notes": [
+ },
{
"degree": 1,
"accidental": 0,
- "octave": 2,
- "beats": 3,
- "hole": 7,
+ "octave": 1,
+ "beats": 1,
+ "hole": 4,
"breath": "blow",
"bend": 0,
"overblow": false
+ },
+ {
+ "degree": 0,
+ "accidental": 0,
+ "octave": 0,
+ "beats": 0.5,
+ "hole": null,
+ "breath": null,
+ "bend": 0,
+ "overblow": false
}
],
"sectionEnd": true
diff --git a/src/data/scores/snowbirds.json b/src/data/scores/snowbirds.json
new file mode 100644
index 0000000..980c6f6
--- /dev/null
+++ b/src/data/scores/snowbirds.json
@@ -0,0 +1,514 @@
+{
+ "id": "snowbirds",
+ "title": "雪鸟",
+ "subtitle": "The Snowbirds · B. J. Relemann",
+ "composer": "B. J. Relemann(歌集署名)",
+ "key": "C",
+ "harmonicaKey": "C",
+ "position": "第一把位",
+ "timeSignature": "3/4",
+ "tempo": 96,
+ "difficulty": 1,
+ "tags": [
+ "入门",
+ "儿歌"
+ ],
+ "source": "The Everyday Song Book (1927), No.29;John Chambers ABC 转录 (2017)",
+ "sourceUrl": "https://trillian.mit.edu/~jc/music/book/EverydaySongBook/029_the_Snowbirds.abc",
+ "sourceFormat": "music-text",
+ "sourceCheckedAt": "2026-10-23",
+ "builtin": true,
+ "order": 58,
+ "notes": "原E4主音移为C5;保留16小节,C5–C6均为自然音孔位。以四分、二分和附点二分音符练习三拍子。 不收录歌词和异音连奏线;速度为编辑练习建议,核对针对所列ABC版本。",
+ "lines": [
+ [
+ {
+ "notes": [
+ {
+ "degree": 1,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 1,
+ "hole": 4,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 1,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 1,
+ "hole": 4,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 1,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 1,
+ "hole": 4,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ }
+ ]
+ },
+ {
+ "notes": [
+ {
+ "degree": 2,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 1,
+ "hole": 4,
+ "breath": "draw",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 2,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 1,
+ "hole": 4,
+ "breath": "draw",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 2,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 1,
+ "hole": 4,
+ "breath": "draw",
+ "bend": 0,
+ "overblow": false
+ }
+ ]
+ },
+ {
+ "notes": [
+ {
+ "degree": 3,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 1,
+ "hole": 5,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 4,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 1,
+ "hole": 5,
+ "breath": "draw",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 5,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 1,
+ "hole": 6,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ }
+ ]
+ },
+ {
+ "notes": [
+ {
+ "degree": 5,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 3,
+ "hole": 6,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ }
+ ]
+ },
+ {
+ "notes": [
+ {
+ "degree": 1,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 1,
+ "hole": 4,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 1,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 1,
+ "hole": 4,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 1,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 1,
+ "hole": 4,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ }
+ ]
+ },
+ {
+ "notes": [
+ {
+ "degree": 2,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 1,
+ "hole": 4,
+ "breath": "draw",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 2,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 1,
+ "hole": 4,
+ "breath": "draw",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 2,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 1,
+ "hole": 4,
+ "breath": "draw",
+ "bend": 0,
+ "overblow": false
+ }
+ ]
+ },
+ {
+ "notes": [
+ {
+ "degree": 3,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 1,
+ "hole": 5,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 4,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 1,
+ "hole": 5,
+ "breath": "draw",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 5,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 1,
+ "hole": 6,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ }
+ ]
+ },
+ {
+ "notes": [
+ {
+ "degree": 5,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 2,
+ "hole": 6,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 5,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 1,
+ "hole": 6,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ }
+ ]
+ }
+ ],
+ [
+ {
+ "notes": [
+ {
+ "degree": 6,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 1,
+ "hole": 6,
+ "breath": "draw",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 1,
+ "accidental": 0,
+ "octave": 2,
+ "beats": 1,
+ "hole": 7,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 6,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 1,
+ "hole": 6,
+ "breath": "draw",
+ "bend": 0,
+ "overblow": false
+ }
+ ]
+ },
+ {
+ "notes": [
+ {
+ "degree": 5,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 1,
+ "hole": 6,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 3,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 1,
+ "hole": 5,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 5,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 1,
+ "hole": 6,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ }
+ ]
+ },
+ {
+ "notes": [
+ {
+ "degree": 4,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 1,
+ "hole": 5,
+ "breath": "draw",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 3,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 1,
+ "hole": 5,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 2,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 1,
+ "hole": 4,
+ "breath": "draw",
+ "bend": 0,
+ "overblow": false
+ }
+ ]
+ },
+ {
+ "notes": [
+ {
+ "degree": 3,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 2,
+ "hole": 5,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 5,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 1,
+ "hole": 6,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ }
+ ]
+ },
+ {
+ "notes": [
+ {
+ "degree": 6,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 1,
+ "hole": 6,
+ "breath": "draw",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 1,
+ "accidental": 0,
+ "octave": 2,
+ "beats": 1,
+ "hole": 7,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 6,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 1,
+ "hole": 6,
+ "breath": "draw",
+ "bend": 0,
+ "overblow": false
+ }
+ ]
+ },
+ {
+ "notes": [
+ {
+ "degree": 5,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 1,
+ "hole": 6,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 3,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 1,
+ "hole": 5,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 5,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 1,
+ "hole": 6,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ }
+ ]
+ },
+ {
+ "notes": [
+ {
+ "degree": 4,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 1,
+ "hole": 5,
+ "breath": "draw",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 3,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 1,
+ "hole": 5,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 2,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 1,
+ "hole": 4,
+ "breath": "draw",
+ "bend": 0,
+ "overblow": false
+ }
+ ]
+ },
+ {
+ "notes": [
+ {
+ "degree": 1,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 3,
+ "hole": 4,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ }
+ ],
+ "sectionEnd": true
+ }
+ ]
+ ]
+}
diff --git a/src/data/scores/spanish-rowing-song.json b/src/data/scores/spanish-rowing-song.json
index 8844eb7..32dc72c 100644
--- a/src/data/scores/spanish-rowing-song.json
+++ b/src/data/scores/spanish-rowing-song.json
@@ -1,7 +1,7 @@
{
"id": "spanish-rowing-song",
"title": "西班牙划船歌",
- "subtitle": "划船 · 西班牙民歌",
+ "subtitle": "划船 · 教材活动短版(8小节)",
"composer": "西班牙民歌",
"key": "C",
"harmonicaKey": "C",
@@ -14,13 +14,13 @@
"二八节奏",
"入门"
],
- "source": "高等教育出版社《带旋律柱式和弦伴奏》教材简谱《划船》;原谱 1=F,应用内移调为 1=C",
- "sourceUrl": "https://oss0.changxianggu.com/book/chapter/269_9787040575224.pdf",
+ "source": "湖南文艺出版社义务教育音乐一年级下册,第49页活动《随着琴声动一动》;采用西班牙民歌《划船》8小节版本,原谱1=C",
+ "sourceUrl": "https://hnwy-ecs-backup.oss-cn-beijing.aliyuncs.com/uploads/20200204/e894c036ed303450e968b59a0073ed82.pdf",
"sourceFormat": "jianpu-image",
- "sourceCheckedAt": "2026-08-31",
+ "sourceCheckedAt": "2026-10-23",
"builtin": true,
"order": 12,
- "notes": "按教材 16 小节版本录入,前八小节舒缓,后八小节用连续八分音符表现水波与划桨律动。",
+ "notes": "采用教材活动中的8小节短版,逐音核对音高与时值,整体升高一个八度以适合C调十孔口琴。此版本不包含此前16小节编配中未能重新核对的后八小节;课堂强弱和快慢变化由演奏者自行练习。",
"lines": [
[
{
@@ -283,292 +283,6 @@
}
]
},
- {
- "notes": [
- {
- "degree": 1,
- "accidental": 0,
- "octave": 1,
- "beats": 2,
- "hole": 4,
- "breath": "blow",
- "bend": 0,
- "overblow": false
- }
- ]
- }
- ],
- [
- {
- "notes": [
- {
- "degree": 2,
- "accidental": 0,
- "octave": 1,
- "beats": 0.5,
- "hole": 4,
- "breath": "draw",
- "bend": 0,
- "overblow": false
- },
- {
- "degree": 2,
- "accidental": 0,
- "octave": 1,
- "beats": 0.5,
- "hole": 4,
- "breath": "draw",
- "bend": 0,
- "overblow": false
- },
- {
- "degree": 2,
- "accidental": 0,
- "octave": 1,
- "beats": 0.5,
- "hole": 4,
- "breath": "draw",
- "bend": 0,
- "overblow": false
- },
- {
- "degree": 2,
- "accidental": 0,
- "octave": 1,
- "beats": 0.5,
- "hole": 4,
- "breath": "draw",
- "bend": 0,
- "overblow": false
- }
- ]
- },
- {
- "notes": [
- {
- "degree": 2,
- "accidental": 0,
- "octave": 1,
- "beats": 0.5,
- "hole": 4,
- "breath": "draw",
- "bend": 0,
- "overblow": false
- },
- {
- "degree": 3,
- "accidental": 0,
- "octave": 1,
- "beats": 0.5,
- "hole": 5,
- "breath": "blow",
- "bend": 0,
- "overblow": false
- },
- {
- "degree": 4,
- "accidental": 0,
- "octave": 1,
- "beats": 1,
- "hole": 5,
- "breath": "draw",
- "bend": 0,
- "overblow": false
- }
- ]
- },
- {
- "notes": [
- {
- "degree": 3,
- "accidental": 0,
- "octave": 1,
- "beats": 0.5,
- "hole": 5,
- "breath": "blow",
- "bend": 0,
- "overblow": false
- },
- {
- "degree": 3,
- "accidental": 0,
- "octave": 1,
- "beats": 0.5,
- "hole": 5,
- "breath": "blow",
- "bend": 0,
- "overblow": false
- },
- {
- "degree": 3,
- "accidental": 0,
- "octave": 1,
- "beats": 0.5,
- "hole": 5,
- "breath": "blow",
- "bend": 0,
- "overblow": false
- },
- {
- "degree": 3,
- "accidental": 0,
- "octave": 1,
- "beats": 0.5,
- "hole": 5,
- "breath": "blow",
- "bend": 0,
- "overblow": false
- }
- ]
- },
- {
- "notes": [
- {
- "degree": 3,
- "accidental": 0,
- "octave": 1,
- "beats": 0.5,
- "hole": 5,
- "breath": "blow",
- "bend": 0,
- "overblow": false
- },
- {
- "degree": 4,
- "accidental": 0,
- "octave": 1,
- "beats": 0.5,
- "hole": 5,
- "breath": "draw",
- "bend": 0,
- "overblow": false
- },
- {
- "degree": 5,
- "accidental": 0,
- "octave": 1,
- "beats": 1,
- "hole": 6,
- "breath": "blow",
- "bend": 0,
- "overblow": false
- }
- ]
- }
- ],
- [
- {
- "notes": [
- {
- "degree": 5,
- "accidental": 0,
- "octave": 1,
- "beats": 0.5,
- "hole": 6,
- "breath": "blow",
- "bend": 0,
- "overblow": false
- },
- {
- "degree": 3,
- "accidental": 0,
- "octave": 1,
- "beats": 0.5,
- "hole": 5,
- "breath": "blow",
- "bend": 0,
- "overblow": false
- },
- {
- "degree": 3,
- "accidental": 0,
- "octave": 1,
- "beats": 1,
- "hole": 5,
- "breath": "blow",
- "bend": 0,
- "overblow": false
- }
- ]
- },
- {
- "notes": [
- {
- "degree": 4,
- "accidental": 0,
- "octave": 1,
- "beats": 0.5,
- "hole": 5,
- "breath": "draw",
- "bend": 0,
- "overblow": false
- },
- {
- "degree": 2,
- "accidental": 0,
- "octave": 1,
- "beats": 0.5,
- "hole": 4,
- "breath": "draw",
- "bend": 0,
- "overblow": false
- },
- {
- "degree": 2,
- "accidental": 0,
- "octave": 1,
- "beats": 1,
- "hole": 4,
- "breath": "draw",
- "bend": 0,
- "overblow": false
- }
- ]
- },
- {
- "notes": [
- {
- "degree": 1,
- "accidental": 0,
- "octave": 1,
- "beats": 0.5,
- "hole": 4,
- "breath": "blow",
- "bend": 0,
- "overblow": false
- },
- {
- "degree": 3,
- "accidental": 0,
- "octave": 1,
- "beats": 0.5,
- "hole": 5,
- "breath": "blow",
- "bend": 0,
- "overblow": false
- },
- {
- "degree": 5,
- "accidental": 0,
- "octave": 1,
- "beats": 0.5,
- "hole": 6,
- "breath": "blow",
- "bend": 0,
- "overblow": false
- },
- {
- "degree": 5,
- "accidental": 0,
- "octave": 1,
- "beats": 0.5,
- "hole": 6,
- "breath": "blow",
- "bend": 0,
- "overblow": false
- }
- ]
- },
{
"notes": [
{
diff --git a/src/data/scores/spotted-dove-song.json b/src/data/scores/spotted-dove-song.json
new file mode 100644
index 0000000..38571b4
--- /dev/null
+++ b/src/data/scores/spotted-dove-song.json
@@ -0,0 +1,509 @@
+{
+ "id": "spotted-dove-song",
+ "title": "斑鸠调",
+ "subtitle": "江西民歌 · 演唱主旋律",
+ "composer": "江西民歌",
+ "key": "C",
+ "harmonicaKey": "C",
+ "timeSignature": "2/4",
+ "tempo": 88,
+ "difficulty": 2,
+ "tags": [
+ "中国民歌",
+ "江西",
+ "自然音",
+ "十六分音符"
+ ],
+ "source": "粤教花城《音乐六年级上册·简谱》印刷第38页/PDF第39页;从“回原速”开始的完整9小节演唱主旋律,反复保留。采用源谱1=C并整体提高八度。",
+ "sourceUrl": "https://lywgyxx.szftedu.cn/xkjc/yinyue/202209/P020220910588732922659.pdf#page=39",
+ "sourceFormat": "jianpu-image",
+ "sourceCheckedAt": "2026-10-22",
+ "builtin": true,
+ "order": 37,
+ "notes": "仅收录带歌词的演唱主旋律,前面的“鸟儿的对话”前奏/双声部段不属于本版独奏谱。音域E5–E6,全自然音;保留第8小节附点八分接十六分、末尾两拍长音与整段反复。歌词及异音连奏线省略,速度为练习建议。",
+ "lines": [
+ [
+ {
+ "notes": [
+ {
+ "degree": 1,
+ "accidental": 0,
+ "octave": 2,
+ "beats": 0.5,
+ "hole": 7,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 1,
+ "accidental": 0,
+ "octave": 2,
+ "beats": 0.25,
+ "hole": 7,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 6,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.25,
+ "hole": 6,
+ "breath": "draw",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 5,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.25,
+ "hole": 6,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 6,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.25,
+ "hole": 6,
+ "breath": "draw",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 2,
+ "accidental": 0,
+ "octave": 2,
+ "beats": 0.25,
+ "hole": 8,
+ "breath": "draw",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 1,
+ "accidental": 0,
+ "octave": 2,
+ "beats": 0.25,
+ "hole": 7,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ }
+ ],
+ "repeatBegin": true
+ },
+ {
+ "notes": [
+ {
+ "degree": 6,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.5,
+ "hole": 6,
+ "breath": "draw",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 6,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.25,
+ "hole": 6,
+ "breath": "draw",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 5,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.25,
+ "hole": 6,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 6,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 1,
+ "hole": 6,
+ "breath": "draw",
+ "bend": 0,
+ "overblow": false
+ }
+ ]
+ },
+ {
+ "notes": [
+ {
+ "degree": 1,
+ "accidental": 0,
+ "octave": 2,
+ "beats": 0.5,
+ "hole": 7,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 1,
+ "accidental": 0,
+ "octave": 2,
+ "beats": 0.25,
+ "hole": 7,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 6,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.25,
+ "hole": 6,
+ "breath": "draw",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 5,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.25,
+ "hole": 6,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 6,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.25,
+ "hole": 6,
+ "breath": "draw",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 2,
+ "accidental": 0,
+ "octave": 2,
+ "beats": 0.25,
+ "hole": 8,
+ "breath": "draw",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 1,
+ "accidental": 0,
+ "octave": 2,
+ "beats": 0.25,
+ "hole": 7,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ }
+ ]
+ },
+ {
+ "notes": [
+ {
+ "degree": 6,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.5,
+ "hole": 6,
+ "breath": "draw",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 6,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.25,
+ "hole": 6,
+ "breath": "draw",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 5,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.25,
+ "hole": 6,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 6,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 1,
+ "hole": 6,
+ "breath": "draw",
+ "bend": 0,
+ "overblow": false
+ }
+ ]
+ }
+ ],
+ [
+ {
+ "notes": [
+ {
+ "degree": 1,
+ "accidental": 0,
+ "octave": 2,
+ "beats": 0.5,
+ "hole": 7,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 1,
+ "accidental": 0,
+ "octave": 2,
+ "beats": 1,
+ "hole": 7,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 1,
+ "accidental": 0,
+ "octave": 2,
+ "beats": 0.25,
+ "hole": 7,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 2,
+ "accidental": 0,
+ "octave": 2,
+ "beats": 0.25,
+ "hole": 8,
+ "breath": "draw",
+ "bend": 0,
+ "overblow": false
+ }
+ ]
+ },
+ {
+ "notes": [
+ {
+ "degree": 3,
+ "accidental": 0,
+ "octave": 2,
+ "beats": 0.5,
+ "hole": 8,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 3,
+ "accidental": 0,
+ "octave": 2,
+ "beats": 0.5,
+ "hole": 8,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 2,
+ "accidental": 0,
+ "octave": 2,
+ "beats": 1,
+ "hole": 8,
+ "breath": "draw",
+ "bend": 0,
+ "overblow": false
+ }
+ ]
+ },
+ {
+ "notes": [
+ {
+ "degree": 6,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.25,
+ "hole": 6,
+ "breath": "draw",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 6,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.25,
+ "hole": 6,
+ "breath": "draw",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 6,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.25,
+ "hole": 6,
+ "breath": "draw",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 2,
+ "accidental": 0,
+ "octave": 2,
+ "beats": 0.25,
+ "hole": 8,
+ "breath": "draw",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 1,
+ "accidental": 0,
+ "octave": 2,
+ "beats": 0.25,
+ "hole": 7,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 2,
+ "accidental": 0,
+ "octave": 2,
+ "beats": 0.25,
+ "hole": 8,
+ "breath": "draw",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 6,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.25,
+ "hole": 6,
+ "breath": "draw",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 5,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.25,
+ "hole": 6,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ }
+ ]
+ },
+ {
+ "notes": [
+ {
+ "degree": 3,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.5,
+ "dotted": true,
+ "hole": 5,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 2,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.25,
+ "hole": 4,
+ "breath": "draw",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 3,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.25,
+ "hole": 5,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 2,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.25,
+ "hole": 4,
+ "breath": "draw",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 3,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.25,
+ "hole": 5,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 6,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.25,
+ "hole": 6,
+ "breath": "draw",
+ "bend": 0,
+ "overblow": false
+ }
+ ]
+ },
+ {
+ "notes": [
+ {
+ "degree": 5,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 2,
+ "hole": 6,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ }
+ ],
+ "repeatEnd": true
+ }
+ ]
+ ]
+}
diff --git a/src/data/scores/spring-excursion.json b/src/data/scores/spring-excursion.json
new file mode 100644
index 0000000..f8bb014
--- /dev/null
+++ b/src/data/scores/spring-excursion.json
@@ -0,0 +1,668 @@
+{
+ "id": "spring-excursion",
+ "title": "春游",
+ "subtitle": "李叔同 · 主旋律",
+ "composer": "李叔同",
+ "key": "C",
+ "harmonicaKey": "C",
+ "position": "第一把位",
+ "timeSignature": "6/8",
+ "tempo": 96,
+ "difficulty": 3,
+ "tags": [
+ "中国经典",
+ "学堂乐歌",
+ "六八拍",
+ "压音"
+ ],
+ "source": "人民教育出版社《音乐七年级下册·简谱》印刷第6–7页(PDF第11–12页);完整16小节女声I主旋律。",
+ "sourceUrl": "https://dev98.oa.henanyuexue.com/static/szjc-resources/pdf/q/f/2/7.pdf#page=11",
+ "sourceFormat": "jianpu-image",
+ "sourceCheckedAt": "2026-10-22",
+ "builtin": true,
+ "order": 30,
+ "notes": "取教材女声I的完整主旋律,不加入中、低声部;原1=C音区保留,最高音C5。桥段升fa为F#4,可用2孔吸压半音;自然fa为2孔吸压全音。保留6/8节奏及四个乐句,省略歌词、力度渐变和末段rit.,速度为四分音符的练习建议。",
+ "lines": [
+ [
+ {
+ "notes": [
+ {
+ "degree": 5,
+ "accidental": 0,
+ "octave": 0,
+ "beats": 1,
+ "hole": 3,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 5,
+ "accidental": 0,
+ "octave": 0,
+ "beats": 0.5,
+ "hole": 3,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 1,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 1,
+ "hole": 4,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 5,
+ "accidental": 0,
+ "octave": 0,
+ "beats": 0.5,
+ "hole": 3,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ }
+ ]
+ },
+ {
+ "notes": [
+ {
+ "degree": 3,
+ "accidental": 0,
+ "octave": 0,
+ "beats": 1,
+ "hole": 2,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 4,
+ "accidental": 0,
+ "octave": 0,
+ "beats": 0.5,
+ "hole": 2,
+ "breath": "draw",
+ "bend": 2,
+ "overblow": false
+ },
+ {
+ "degree": 5,
+ "accidental": 0,
+ "octave": 0,
+ "beats": 1,
+ "dotted": true,
+ "hole": 3,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ }
+ ]
+ },
+ {
+ "notes": [
+ {
+ "degree": 1,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 1,
+ "hole": 4,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 1,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.5,
+ "hole": 4,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 5,
+ "accidental": 0,
+ "octave": 0,
+ "beats": 1,
+ "hole": 3,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 5,
+ "accidental": 0,
+ "octave": 0,
+ "beats": 0.5,
+ "hole": 3,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ }
+ ]
+ },
+ {
+ "notes": [
+ {
+ "degree": 4,
+ "accidental": 0,
+ "octave": 0,
+ "beats": 1,
+ "hole": 2,
+ "breath": "draw",
+ "bend": 2,
+ "overblow": false
+ },
+ {
+ "degree": 2,
+ "accidental": 0,
+ "octave": 0,
+ "beats": 0.5,
+ "hole": 1,
+ "breath": "draw",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 3,
+ "accidental": 0,
+ "octave": 0,
+ "beats": 1,
+ "dotted": true,
+ "hole": 2,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ }
+ ]
+ }
+ ],
+ [
+ {
+ "notes": [
+ {
+ "degree": 5,
+ "accidental": 0,
+ "octave": 0,
+ "beats": 1,
+ "hole": 3,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 5,
+ "accidental": 0,
+ "octave": 0,
+ "beats": 0.5,
+ "hole": 3,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 1,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 1,
+ "hole": 4,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 5,
+ "accidental": 0,
+ "octave": 0,
+ "beats": 0.5,
+ "hole": 3,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ }
+ ]
+ },
+ {
+ "notes": [
+ {
+ "degree": 3,
+ "accidental": 0,
+ "octave": 0,
+ "beats": 1,
+ "hole": 2,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 4,
+ "accidental": 0,
+ "octave": 0,
+ "beats": 0.5,
+ "hole": 2,
+ "breath": "draw",
+ "bend": 2,
+ "overblow": false
+ },
+ {
+ "degree": 5,
+ "accidental": 0,
+ "octave": 0,
+ "beats": 1,
+ "dotted": true,
+ "hole": 3,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ }
+ ]
+ },
+ {
+ "notes": [
+ {
+ "degree": 1,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 1,
+ "hole": 4,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 1,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.5,
+ "hole": 4,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 5,
+ "accidental": 0,
+ "octave": 0,
+ "beats": 1,
+ "hole": 3,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 5,
+ "accidental": 0,
+ "octave": 0,
+ "beats": 0.5,
+ "hole": 3,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ }
+ ]
+ },
+ {
+ "notes": [
+ {
+ "degree": 4,
+ "accidental": 0,
+ "octave": 0,
+ "beats": 1,
+ "hole": 2,
+ "breath": "draw",
+ "bend": 2,
+ "overblow": false
+ },
+ {
+ "degree": 2,
+ "accidental": 0,
+ "octave": 0,
+ "beats": 0.5,
+ "hole": 1,
+ "breath": "draw",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 1,
+ "accidental": 0,
+ "octave": 0,
+ "beats": 1,
+ "dotted": true,
+ "hole": 1,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ }
+ ]
+ }
+ ],
+ [
+ {
+ "notes": [
+ {
+ "degree": 2,
+ "accidental": 0,
+ "octave": 0,
+ "beats": 1,
+ "hole": 1,
+ "breath": "draw",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 2,
+ "accidental": 0,
+ "octave": 0,
+ "beats": 0.5,
+ "hole": 1,
+ "breath": "draw",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 2,
+ "accidental": 0,
+ "octave": 0,
+ "beats": 1,
+ "hole": 1,
+ "breath": "draw",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 5,
+ "accidental": 0,
+ "octave": 0,
+ "beats": 0.5,
+ "hole": 3,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ }
+ ]
+ },
+ {
+ "notes": [
+ {
+ "degree": 4,
+ "accidental": 0,
+ "octave": 0,
+ "beats": 1,
+ "hole": 2,
+ "breath": "draw",
+ "bend": 2,
+ "overblow": false
+ },
+ {
+ "degree": 4,
+ "accidental": 0,
+ "octave": 0,
+ "beats": 0.5,
+ "hole": 2,
+ "breath": "draw",
+ "bend": 2,
+ "overblow": false
+ },
+ {
+ "degree": 3,
+ "accidental": 0,
+ "octave": 0,
+ "beats": 1,
+ "dotted": true,
+ "hole": 2,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ }
+ ]
+ },
+ {
+ "notes": [
+ {
+ "degree": 5,
+ "accidental": 0,
+ "octave": 0,
+ "beats": 1,
+ "hole": 3,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 5,
+ "accidental": 0,
+ "octave": 0,
+ "beats": 0.5,
+ "hole": 3,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 7,
+ "accidental": 0,
+ "octave": 0,
+ "beats": 1,
+ "hole": 3,
+ "breath": "draw",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 6,
+ "accidental": 0,
+ "octave": 0,
+ "beats": 0.5,
+ "hole": 3,
+ "breath": "draw",
+ "bend": 2,
+ "overblow": false
+ }
+ ]
+ },
+ {
+ "notes": [
+ {
+ "degree": 5,
+ "accidental": 0,
+ "octave": 0,
+ "beats": 1,
+ "hole": 3,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 4,
+ "accidental": 1,
+ "octave": 0,
+ "beats": 0.5,
+ "hole": 2,
+ "breath": "draw",
+ "bend": 1,
+ "overblow": false
+ },
+ {
+ "degree": 5,
+ "accidental": 0,
+ "octave": 0,
+ "beats": 1,
+ "dotted": true,
+ "hole": 3,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ }
+ ]
+ }
+ ],
+ [
+ {
+ "notes": [
+ {
+ "degree": 5,
+ "accidental": 0,
+ "octave": 0,
+ "beats": 1,
+ "hole": 3,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 5,
+ "accidental": 0,
+ "octave": 0,
+ "beats": 0.5,
+ "hole": 3,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 1,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 1,
+ "hole": 4,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 5,
+ "accidental": 0,
+ "octave": 0,
+ "beats": 0.5,
+ "hole": 3,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ }
+ ]
+ },
+ {
+ "notes": [
+ {
+ "degree": 3,
+ "accidental": 0,
+ "octave": 0,
+ "beats": 1,
+ "hole": 2,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 4,
+ "accidental": 0,
+ "octave": 0,
+ "beats": 0.5,
+ "hole": 2,
+ "breath": "draw",
+ "bend": 2,
+ "overblow": false
+ },
+ {
+ "degree": 5,
+ "accidental": 0,
+ "octave": 0,
+ "beats": 1,
+ "dotted": true,
+ "hole": 3,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ }
+ ]
+ },
+ {
+ "notes": [
+ {
+ "degree": 1,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 1,
+ "hole": 4,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 1,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.5,
+ "hole": 4,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 5,
+ "accidental": 0,
+ "octave": 0,
+ "beats": 1,
+ "hole": 3,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 5,
+ "accidental": 0,
+ "octave": 0,
+ "beats": 0.5,
+ "hole": 3,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ }
+ ]
+ },
+ {
+ "notes": [
+ {
+ "degree": 4,
+ "accidental": 0,
+ "octave": 0,
+ "beats": 1,
+ "hole": 2,
+ "breath": "draw",
+ "bend": 2,
+ "overblow": false
+ },
+ {
+ "degree": 2,
+ "accidental": 0,
+ "octave": 0,
+ "beats": 0.5,
+ "hole": 1,
+ "breath": "draw",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 1,
+ "accidental": 0,
+ "octave": 0,
+ "beats": 1,
+ "dotted": true,
+ "hole": 1,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ }
+ ],
+ "sectionEnd": true
+ }
+ ]
+ ]
+}
diff --git a/src/data/scores/su-wu-herding-sheep.json b/src/data/scores/su-wu-herding-sheep.json
new file mode 100644
index 0000000..5e6eff0
--- /dev/null
+++ b/src/data/scores/su-wu-herding-sheep.json
@@ -0,0 +1,1015 @@
+{
+ "id": "su-wu-herding-sheep",
+ "title": "苏武牧羊",
+ "subtitle": "学堂乐歌 · 香港中乐团器乐版",
+ "composer": "所选教程未署曲作者",
+ "key": "C",
+ "harmonicaKey": "C",
+ "position": "第一把位",
+ "timeSignature": "4/4",
+ "tempo": 72,
+ "difficulty": 3,
+ "tags": [
+ "传统曲",
+ "学堂乐歌",
+ "压音",
+ "重音",
+ "保持音",
+ "倚音",
+ "延长记号"
+ ],
+ "source": "香港中乐团《唢呐初级教程》,第33页。",
+ "sourceUrl": "https://ynyqxg.hkco.org/uploads/docs/5bd9828a7a7201.pdf#page=33",
+ "sourceFormat": "jianpu-image",
+ "sourceCheckedAt": "2026-10-23",
+ "builtin": true,
+ "order": 63,
+ "notes": "按原页音级移写1=C并提高八度,原页未单列1=调号。保留29个书写小节(末行5小节)、15处重音、29处保持音、3处八分前倚音及末两全音符之间的延音,前一全音符保留自由延长。音域G4–D6;低la需3孔吸气全音压音。保持音不是高八度标记,也不增加书面拍数。 不收录歌词和异音连奏线;速度为编辑练习建议,核对针对所列器乐版本。",
+ "lines": [
+ [
+ {
+ "notes": [
+ {
+ "degree": 5,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 2,
+ "articulation": "accent",
+ "hole": 6,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 1,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 2,
+ "articulation": "accent",
+ "hole": 4,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ }
+ ]
+ },
+ {
+ "notes": [
+ {
+ "degree": 2,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 1,
+ "hole": 4,
+ "breath": "draw",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 5,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 1,
+ "hole": 6,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 4,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 1,
+ "hole": 5,
+ "breath": "draw",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 2,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 1,
+ "hole": 4,
+ "breath": "draw",
+ "bend": 0,
+ "overblow": false
+ }
+ ]
+ },
+ {
+ "notes": [
+ {
+ "degree": 1,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 4,
+ "articulation": "accent",
+ "graceNotes": [
+ {
+ "degree": 2,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.5,
+ "hole": 4,
+ "breath": "draw",
+ "bend": 0,
+ "overblow": false
+ }
+ ],
+ "hole": 4,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ }
+ ]
+ },
+ {
+ "notes": [
+ {
+ "degree": 1,
+ "accidental": 0,
+ "octave": 2,
+ "beats": 1,
+ "articulation": "tenuto",
+ "hole": 7,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 2,
+ "accidental": 0,
+ "octave": 2,
+ "beats": 1,
+ "articulation": "tenuto",
+ "hole": 8,
+ "breath": "draw",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 1,
+ "accidental": 0,
+ "octave": 2,
+ "beats": 1,
+ "articulation": "tenuto",
+ "hole": 7,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 6,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 1,
+ "articulation": "tenuto",
+ "hole": 6,
+ "breath": "draw",
+ "bend": 0,
+ "overblow": false
+ }
+ ]
+ }
+ ],
+ [
+ {
+ "notes": [
+ {
+ "degree": 5,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 4,
+ "articulation": "tenuto",
+ "hole": 6,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ }
+ ]
+ },
+ {
+ "notes": [
+ {
+ "degree": 4,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 1,
+ "articulation": "tenuto",
+ "hole": 5,
+ "breath": "draw",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 2,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 1,
+ "articulation": "tenuto",
+ "hole": 4,
+ "breath": "draw",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 4,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 1,
+ "articulation": "tenuto",
+ "hole": 5,
+ "breath": "draw",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 6,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 1,
+ "articulation": "tenuto",
+ "hole": 6,
+ "breath": "draw",
+ "bend": 0,
+ "overblow": false
+ }
+ ]
+ },
+ {
+ "notes": [
+ {
+ "degree": 5,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 4,
+ "articulation": "tenuto",
+ "hole": 6,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ }
+ ]
+ },
+ {
+ "notes": [
+ {
+ "degree": 1,
+ "accidental": 0,
+ "octave": 2,
+ "beats": 1,
+ "articulation": "accent",
+ "hole": 7,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 6,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 1,
+ "articulation": "accent",
+ "hole": 6,
+ "breath": "draw",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 5,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 2,
+ "articulation": "accent",
+ "hole": 6,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ }
+ ]
+ }
+ ],
+ [
+ {
+ "notes": [
+ {
+ "degree": 4,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 1,
+ "articulation": "accent",
+ "hole": 5,
+ "breath": "draw",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 6,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 1,
+ "articulation": "accent",
+ "hole": 6,
+ "breath": "draw",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 5,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 2,
+ "articulation": "accent",
+ "hole": 6,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ }
+ ]
+ },
+ {
+ "notes": [
+ {
+ "degree": 2,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 1,
+ "hole": 4,
+ "breath": "draw",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 5,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 1,
+ "hole": 6,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 4,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 1,
+ "hole": 5,
+ "breath": "draw",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 2,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 1,
+ "hole": 4,
+ "breath": "draw",
+ "bend": 0,
+ "overblow": false
+ }
+ ]
+ },
+ {
+ "notes": [
+ {
+ "degree": 1,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 4,
+ "articulation": "accent",
+ "graceNotes": [
+ {
+ "degree": 2,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.5,
+ "hole": 4,
+ "breath": "draw",
+ "bend": 0,
+ "overblow": false
+ }
+ ],
+ "hole": 4,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ }
+ ]
+ },
+ {
+ "notes": [
+ {
+ "degree": 2,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 1,
+ "articulation": "tenuto",
+ "hole": 4,
+ "breath": "draw",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 2,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 1,
+ "articulation": "tenuto",
+ "hole": 4,
+ "breath": "draw",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 2,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 1,
+ "articulation": "tenuto",
+ "hole": 4,
+ "breath": "draw",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 6,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 1,
+ "articulation": "tenuto",
+ "hole": 6,
+ "breath": "draw",
+ "bend": 0,
+ "overblow": false
+ }
+ ]
+ }
+ ],
+ [
+ {
+ "notes": [
+ {
+ "degree": 5,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 3,
+ "articulation": "tenuto",
+ "hole": 6,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 4,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 1,
+ "articulation": "tenuto",
+ "hole": 5,
+ "breath": "draw",
+ "bend": 0,
+ "overblow": false
+ }
+ ]
+ },
+ {
+ "notes": [
+ {
+ "degree": 2,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 1,
+ "hole": 4,
+ "breath": "draw",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 1,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 1,
+ "hole": 4,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 6,
+ "accidental": 0,
+ "octave": 0,
+ "beats": 1,
+ "hole": 3,
+ "breath": "draw",
+ "bend": 2,
+ "overblow": false
+ },
+ {
+ "degree": 5,
+ "accidental": 0,
+ "octave": 0,
+ "beats": 0.5,
+ "hole": 3,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 6,
+ "accidental": 0,
+ "octave": 0,
+ "beats": 0.5,
+ "hole": 3,
+ "breath": "draw",
+ "bend": 2,
+ "overblow": false
+ }
+ ]
+ },
+ {
+ "notes": [
+ {
+ "degree": 1,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 4,
+ "articulation": "tenuto",
+ "hole": 4,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ }
+ ]
+ },
+ {
+ "notes": [
+ {
+ "degree": 5,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 1,
+ "hole": 6,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 5,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 1,
+ "hole": 6,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 6,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 1,
+ "hole": 6,
+ "breath": "draw",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 1,
+ "accidental": 0,
+ "octave": 2,
+ "beats": 1,
+ "hole": 7,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ }
+ ]
+ }
+ ],
+ [
+ {
+ "notes": [
+ {
+ "degree": 3,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 4,
+ "hole": 5,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ }
+ ]
+ },
+ {
+ "notes": [
+ {
+ "degree": 5,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 1,
+ "hole": 6,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 3,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 1,
+ "hole": 5,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 2,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.5,
+ "hole": 4,
+ "breath": "draw",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 3,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.5,
+ "hole": 5,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 5,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 1,
+ "hole": 6,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ }
+ ]
+ },
+ {
+ "notes": [
+ {
+ "degree": 1,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 4,
+ "hole": 4,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ }
+ ]
+ },
+ {
+ "notes": [
+ {
+ "degree": 1,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 1,
+ "dotted": true,
+ "articulation": "tenuto",
+ "hole": 4,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 2,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.5,
+ "articulation": "tenuto",
+ "hole": 4,
+ "breath": "draw",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 4,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 1,
+ "articulation": "tenuto",
+ "hole": 5,
+ "breath": "draw",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 4,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 1,
+ "articulation": "tenuto",
+ "hole": 5,
+ "breath": "draw",
+ "bend": 0,
+ "overblow": false
+ }
+ ]
+ }
+ ],
+ [
+ {
+ "notes": [
+ {
+ "degree": 2,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 1,
+ "articulation": "tenuto",
+ "hole": 4,
+ "breath": "draw",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 4,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 1,
+ "articulation": "tenuto",
+ "hole": 5,
+ "breath": "draw",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 2,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 1,
+ "articulation": "tenuto",
+ "hole": 4,
+ "breath": "draw",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 1,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 1,
+ "articulation": "tenuto",
+ "hole": 4,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ }
+ ]
+ },
+ {
+ "notes": [
+ {
+ "degree": 6,
+ "accidental": 0,
+ "octave": 0,
+ "beats": 1,
+ "articulation": "tenuto",
+ "hole": 3,
+ "breath": "draw",
+ "bend": 2,
+ "overblow": false
+ },
+ {
+ "degree": 1,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 1,
+ "articulation": "tenuto",
+ "hole": 4,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 2,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 1,
+ "articulation": "tenuto",
+ "hole": 4,
+ "breath": "draw",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 4,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 1,
+ "articulation": "tenuto",
+ "hole": 5,
+ "breath": "draw",
+ "bend": 0,
+ "overblow": false
+ }
+ ]
+ },
+ {
+ "notes": [
+ {
+ "degree": 1,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 4,
+ "articulation": "accent",
+ "graceNotes": [
+ {
+ "degree": 2,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.5,
+ "hole": 4,
+ "breath": "draw",
+ "bend": 0,
+ "overblow": false
+ }
+ ],
+ "hole": 4,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ }
+ ]
+ },
+ {
+ "notes": [
+ {
+ "degree": 1,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 1,
+ "dotted": true,
+ "hole": 4,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 2,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.5,
+ "hole": 4,
+ "breath": "draw",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 4,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 1,
+ "hole": 5,
+ "breath": "draw",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 4,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 1,
+ "hole": 5,
+ "breath": "draw",
+ "bend": 0,
+ "overblow": false
+ }
+ ]
+ }
+ ],
+ [
+ {
+ "notes": [
+ {
+ "degree": 2,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 1,
+ "hole": 4,
+ "breath": "draw",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 4,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 1,
+ "hole": 5,
+ "breath": "draw",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 2,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 1,
+ "hole": 4,
+ "breath": "draw",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 1,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 1,
+ "hole": 4,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ }
+ ]
+ },
+ {
+ "notes": [
+ {
+ "degree": 6,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 4,
+ "articulation": "accent",
+ "hole": 6,
+ "breath": "draw",
+ "bend": 0,
+ "overblow": false
+ }
+ ]
+ },
+ {
+ "notes": [
+ {
+ "degree": 5,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 2,
+ "articulation": "accent",
+ "hole": 6,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 6,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 2,
+ "articulation": "accent",
+ "hole": 6,
+ "breath": "draw",
+ "bend": 0,
+ "overblow": false
+ }
+ ]
+ },
+ {
+ "notes": [
+ {
+ "degree": 1,
+ "accidental": 0,
+ "octave": 2,
+ "beats": 4,
+ "tie": true,
+ "fermata": true,
+ "articulation": "accent",
+ "hole": 7,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ }
+ ]
+ },
+ {
+ "notes": [
+ {
+ "degree": 1,
+ "accidental": 0,
+ "octave": 2,
+ "beats": 4,
+ "hole": 7,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ }
+ ],
+ "sectionEnd": true
+ }
+ ]
+ ]
+}
diff --git a/src/data/scores/twinkle.json b/src/data/scores/twinkle.json
index bfb62aa..cdac0fe 100644
--- a/src/data/scores/twinkle.json
+++ b/src/data/scores/twinkle.json
@@ -13,13 +13,13 @@
"儿歌",
"入门"
],
- "source": "FunnyAI 文本简谱《小星星》;公有领域法国童谣",
- "sourceUrl": "https://www.funnyai.com/animate/music/",
- "sourceFormat": "jianpu-text",
- "sourceCheckedAt": "2026-08-31",
+ "source": "黄冈师范学院音乐学院所载吉他教材,印刷第 28 页 / PDF 第 32 页《闪烁的小星星》数字简谱",
+ "sourceUrl": "https://music.hgnu.edu.cn/_upload/article/files/09/d4/faf43ffb4e08b61cf64ee0adaf16/ec5df379-7cae-4b24-9ece-880a54ee478b.pdf",
+ "sourceFormat": "jianpu-image",
+ "sourceCheckedAt": "2026-10-23",
"builtin": true,
"order": 1,
- "notes": "全部自然音,入门第一首。注意 6 在 6 孔吸音。",
+ "notes": "完整 12 小节逐行核对,旋律与节奏未改;由原谱 1=C 整体升八度至 C5–A5。吉他指法不录入,练习速度为编辑建议。",
"lines": [
[
{
diff --git a/src/data/scores/what-boat.json b/src/data/scores/what-boat.json
new file mode 100644
index 0000000..77a8894
--- /dev/null
+++ b/src/data/scores/what-boat.json
@@ -0,0 +1,381 @@
+{
+ "id": "what-boat",
+ "title": "什么船儿",
+ "subtitle": "山西民歌曲调 · 三八拍问答",
+ "composer": "山西民歌曲调",
+ "key": "C",
+ "harmonicaKey": "C",
+ "timeSignature": "3/8",
+ "tempo": 72,
+ "difficulty": 2,
+ "tags": [
+ "中国民歌",
+ "山西",
+ "三八拍",
+ "压音"
+ ],
+ "source": "粤教花城《音乐四年级下册·简谱》印刷第46页/PDF第47页,完整12小节。原1=F改为1=C后整体提高八度;只录山西民歌曲调,不收录游戏新词。",
+ "sourceUrl": "https://lywgyxx.szftedu.cn/xkjc/yinyue/202209/P020220910587435677420.pdf#page=47",
+ "sourceFormat": "jianpu-image",
+ "sourceCheckedAt": "2026-10-23",
+ "builtin": true,
+ "order": 40,
+ "notes": "每小节三个八分单位,附点四分音符占满一小节;完整问答与衬句均保留。低sol、la、si不可误作中音,低la为3孔吸压全音。省略歌词与异音连奏线,速度按四分拍给出练习建议。",
+ "lines": [
+ [
+ {
+ "notes": [
+ {
+ "degree": 5,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.5,
+ "hole": 6,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 5,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.5,
+ "hole": 6,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 6,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.5,
+ "hole": 6,
+ "breath": "draw",
+ "bend": 0,
+ "overblow": false
+ }
+ ]
+ },
+ {
+ "notes": [
+ {
+ "degree": 5,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.5,
+ "hole": 6,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 4,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.5,
+ "hole": 5,
+ "breath": "draw",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 3,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.5,
+ "hole": 5,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ }
+ ]
+ },
+ {
+ "notes": [
+ {
+ "degree": 5,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.5,
+ "hole": 6,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 2,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.5,
+ "hole": 4,
+ "breath": "draw",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 5,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.5,
+ "hole": 6,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ }
+ ]
+ },
+ {
+ "notes": [
+ {
+ "degree": 7,
+ "accidental": 0,
+ "octave": 0,
+ "beats": 0.5,
+ "hole": 3,
+ "breath": "draw",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 6,
+ "accidental": 0,
+ "octave": 0,
+ "beats": 0.5,
+ "hole": 3,
+ "breath": "draw",
+ "bend": 2,
+ "overblow": false
+ },
+ {
+ "degree": 5,
+ "accidental": 0,
+ "octave": 0,
+ "beats": 0.5,
+ "hole": 3,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ }
+ ]
+ },
+ {
+ "notes": [
+ {
+ "degree": 1,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 1,
+ "hole": 4,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 5,
+ "accidental": 0,
+ "octave": 0,
+ "beats": 0.5,
+ "hole": 3,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ }
+ ]
+ },
+ {
+ "notes": [
+ {
+ "degree": 1,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.5,
+ "hole": 4,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 7,
+ "accidental": 0,
+ "octave": 0,
+ "beats": 0.5,
+ "hole": 3,
+ "breath": "draw",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 6,
+ "accidental": 0,
+ "octave": 0,
+ "beats": 0.5,
+ "hole": 3,
+ "breath": "draw",
+ "bend": 2,
+ "overblow": false
+ }
+ ]
+ }
+ ],
+ [
+ {
+ "notes": [
+ {
+ "degree": 1,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.5,
+ "hole": 4,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 5,
+ "accidental": 0,
+ "octave": 0,
+ "beats": 0.5,
+ "hole": 3,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 6,
+ "accidental": 0,
+ "octave": 0,
+ "beats": 0.5,
+ "hole": 3,
+ "breath": "draw",
+ "bend": 2,
+ "overblow": false
+ }
+ ]
+ },
+ {
+ "notes": [
+ {
+ "degree": 5,
+ "accidental": 0,
+ "octave": 0,
+ "beats": 1,
+ "dotted": true,
+ "hole": 3,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ }
+ ]
+ },
+ {
+ "notes": [
+ {
+ "degree": 1,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 1,
+ "hole": 4,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 5,
+ "accidental": 0,
+ "octave": 0,
+ "beats": 0.5,
+ "hole": 3,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ }
+ ]
+ },
+ {
+ "notes": [
+ {
+ "degree": 1,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.5,
+ "hole": 4,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 7,
+ "accidental": 0,
+ "octave": 0,
+ "beats": 0.5,
+ "hole": 3,
+ "breath": "draw",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 6,
+ "accidental": 0,
+ "octave": 0,
+ "beats": 0.5,
+ "hole": 3,
+ "breath": "draw",
+ "bend": 2,
+ "overblow": false
+ }
+ ]
+ },
+ {
+ "notes": [
+ {
+ "degree": 1,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.5,
+ "hole": 4,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 5,
+ "accidental": 0,
+ "octave": 0,
+ "beats": 0.5,
+ "hole": 3,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 6,
+ "accidental": 0,
+ "octave": 0,
+ "beats": 0.5,
+ "hole": 3,
+ "breath": "draw",
+ "bend": 2,
+ "overblow": false
+ }
+ ]
+ },
+ {
+ "notes": [
+ {
+ "degree": 5,
+ "accidental": 0,
+ "octave": 0,
+ "beats": 1,
+ "dotted": true,
+ "hole": 3,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ }
+ ],
+ "sectionEnd": true
+ }
+ ]
+ ]
+}
diff --git a/src/data/scores/wuxi-jing.json b/src/data/scores/wuxi-jing.json
new file mode 100644
index 0000000..524b25f
--- /dev/null
+++ b/src/data/scores/wuxi-jing.json
@@ -0,0 +1,820 @@
+{
+ "id": "wuxi-jing",
+ "title": "无锡景",
+ "subtitle": "江苏民歌 · 单顺波音与前倚音",
+ "composer": "江苏民歌",
+ "key": "C",
+ "harmonicaKey": "C",
+ "position": "第一把位",
+ "timeSignature": "2/4",
+ "tempo": 76,
+ "difficulty": 3,
+ "tags": [
+ "中国民歌",
+ "江南",
+ "前倚音",
+ "波音"
+ ],
+ "source": "郭丽萍、王立民、马志飞主编《音乐鉴赏》(新华出版社)印刷第18页/PDF第25页,谱例1-8;完整16小节主旋律。",
+ "sourceUrl": "https://backend.sjhtbook.com/upload/file/2025/04/80fb4b7923894770828045c9e613e236.pdf#page=25",
+ "sourceFormat": "jianpu-image",
+ "sourceCheckedAt": "2026-10-22",
+ "builtin": true,
+ "order": 29,
+ "notes": "原谱1=B改为1=C后整体提高八度,使用C调口琴中高音区自然音。首小节高音re为单顺波音:主音re—上方mi—re,辅助mi的孔位在谱下标为“辅 +8”;第4、8小节保留短前倚音。波音和倚音不额外增加小节拍数,应快速连贯演奏。保留原谱附点及十六分节奏,省略歌词和异音连奏线;速度为练习建议。",
+ "lines": [
+ [
+ {
+ "notes": [
+ {
+ "degree": 6,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.5,
+ "hole": 6,
+ "breath": "draw",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 6,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.25,
+ "hole": 6,
+ "breath": "draw",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 5,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.25,
+ "hole": 6,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 6,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.5,
+ "hole": 6,
+ "breath": "draw",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 2,
+ "accidental": 0,
+ "octave": 2,
+ "beats": 0.5,
+ "ornament": {
+ "kind": "upper-mordent",
+ "auxiliary": {
+ "degree": 3,
+ "accidental": 0,
+ "octave": 2,
+ "hole": 8,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ }
+ },
+ "hole": 8,
+ "breath": "draw",
+ "bend": 0,
+ "overblow": false
+ }
+ ]
+ },
+ {
+ "notes": [
+ {
+ "degree": 1,
+ "accidental": 0,
+ "octave": 2,
+ "beats": 0.25,
+ "hole": 7,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 2,
+ "accidental": 0,
+ "octave": 2,
+ "beats": 0.25,
+ "hole": 8,
+ "breath": "draw",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 1,
+ "accidental": 0,
+ "octave": 2,
+ "beats": 0.25,
+ "hole": 7,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 6,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.25,
+ "hole": 6,
+ "breath": "draw",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 5,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 1,
+ "hole": 6,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ }
+ ]
+ },
+ {
+ "notes": [
+ {
+ "degree": 6,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.5,
+ "hole": 6,
+ "breath": "draw",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 1,
+ "accidental": 0,
+ "octave": 2,
+ "beats": 0.25,
+ "hole": 7,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 1,
+ "accidental": 0,
+ "octave": 2,
+ "beats": 0.25,
+ "hole": 7,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 1,
+ "accidental": 0,
+ "octave": 2,
+ "beats": 0.25,
+ "hole": 7,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 6,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.25,
+ "hole": 6,
+ "breath": "draw",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 5,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.25,
+ "hole": 6,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 6,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.25,
+ "hole": 6,
+ "breath": "draw",
+ "bend": 0,
+ "overblow": false
+ }
+ ]
+ },
+ {
+ "notes": [
+ {
+ "degree": 1,
+ "accidental": 0,
+ "octave": 2,
+ "beats": 2,
+ "graceNotes": [
+ {
+ "degree": 6,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.25,
+ "hole": 6,
+ "breath": "draw",
+ "bend": 0,
+ "overblow": false
+ }
+ ],
+ "hole": 7,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ }
+ ]
+ },
+ {
+ "notes": [
+ {
+ "degree": 1,
+ "accidental": 0,
+ "octave": 2,
+ "beats": 0.5,
+ "hole": 7,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 1,
+ "accidental": 0,
+ "octave": 2,
+ "beats": 1,
+ "hole": 7,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 2,
+ "accidental": 0,
+ "octave": 2,
+ "beats": 0.5,
+ "hole": 8,
+ "breath": "draw",
+ "bend": 0,
+ "overblow": false
+ }
+ ]
+ }
+ ],
+ [
+ {
+ "notes": [
+ {
+ "degree": 3,
+ "accidental": 0,
+ "octave": 2,
+ "beats": 0.5,
+ "dotted": true,
+ "hole": 8,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 2,
+ "accidental": 0,
+ "octave": 2,
+ "beats": 0.25,
+ "hole": 8,
+ "breath": "draw",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 3,
+ "accidental": 0,
+ "octave": 2,
+ "beats": 0.5,
+ "dotted": true,
+ "hole": 8,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 2,
+ "accidental": 0,
+ "octave": 2,
+ "beats": 0.25,
+ "hole": 8,
+ "breath": "draw",
+ "bend": 0,
+ "overblow": false
+ }
+ ]
+ },
+ {
+ "notes": [
+ {
+ "degree": 1,
+ "accidental": 0,
+ "octave": 2,
+ "beats": 0.5,
+ "dotted": true,
+ "hole": 7,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 3,
+ "accidental": 0,
+ "octave": 2,
+ "beats": 0.25,
+ "hole": 8,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 2,
+ "accidental": 0,
+ "octave": 2,
+ "beats": 0.5,
+ "hole": 8,
+ "breath": "draw",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 1,
+ "accidental": 0,
+ "octave": 2,
+ "beats": 0.5,
+ "hole": 7,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ }
+ ]
+ },
+ {
+ "notes": [
+ {
+ "degree": 6,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.5,
+ "dotted": true,
+ "graceNotes": [
+ {
+ "degree": 1,
+ "accidental": 0,
+ "octave": 2,
+ "beats": 0.25,
+ "hole": 7,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ }
+ ],
+ "hole": 6,
+ "breath": "draw",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 1,
+ "accidental": 0,
+ "octave": 2,
+ "beats": 0.25,
+ "hole": 7,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 5,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 1,
+ "hole": 6,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ }
+ ]
+ },
+ {
+ "notes": [
+ {
+ "degree": 6,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.25,
+ "hole": 6,
+ "breath": "draw",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 1,
+ "accidental": 0,
+ "octave": 2,
+ "beats": 0.25,
+ "hole": 7,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 6,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.25,
+ "hole": 6,
+ "breath": "draw",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 5,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.25,
+ "hole": 6,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 3,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 1,
+ "hole": 5,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ }
+ ]
+ },
+ {
+ "notes": [
+ {
+ "degree": 1,
+ "accidental": 0,
+ "octave": 2,
+ "beats": 0.5,
+ "hole": 7,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 1,
+ "accidental": 0,
+ "octave": 2,
+ "beats": 1,
+ "hole": 7,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 2,
+ "accidental": 0,
+ "octave": 2,
+ "beats": 0.5,
+ "hole": 8,
+ "breath": "draw",
+ "bend": 0,
+ "overblow": false
+ }
+ ]
+ },
+ {
+ "notes": [
+ {
+ "degree": 6,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.5,
+ "dotted": true,
+ "hole": 6,
+ "breath": "draw",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 1,
+ "accidental": 0,
+ "octave": 2,
+ "beats": 0.25,
+ "hole": 7,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 5,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 1,
+ "hole": 6,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ }
+ ]
+ }
+ ],
+ [
+ {
+ "notes": [
+ {
+ "degree": 6,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.25,
+ "hole": 6,
+ "breath": "draw",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 1,
+ "accidental": 0,
+ "octave": 2,
+ "beats": 0.25,
+ "hole": 7,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 6,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.25,
+ "hole": 6,
+ "breath": "draw",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 5,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.25,
+ "hole": 6,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 3,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 1,
+ "hole": 5,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ }
+ ]
+ },
+ {
+ "notes": [
+ {
+ "degree": 5,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.5,
+ "hole": 6,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 5,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.5,
+ "hole": 6,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 6,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.5,
+ "dotted": true,
+ "hole": 6,
+ "breath": "draw",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 1,
+ "accidental": 0,
+ "octave": 2,
+ "beats": 0.25,
+ "hole": 7,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ }
+ ]
+ },
+ {
+ "notes": [
+ {
+ "degree": 5,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.25,
+ "hole": 6,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 6,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.25,
+ "hole": 6,
+ "breath": "draw",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 5,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.25,
+ "hole": 6,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 3,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.25,
+ "hole": 5,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 2,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 1,
+ "hole": 4,
+ "breath": "draw",
+ "bend": 0,
+ "overblow": false
+ }
+ ]
+ },
+ {
+ "notes": [
+ {
+ "degree": 3,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.5,
+ "hole": 5,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 5,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.25,
+ "hole": 6,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 5,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.25,
+ "hole": 6,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 5,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.25,
+ "hole": 6,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 6,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.25,
+ "hole": 6,
+ "breath": "draw",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 2,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.5,
+ "hole": 4,
+ "breath": "draw",
+ "bend": 0,
+ "overblow": false
+ }
+ ]
+ },
+ {
+ "notes": [
+ {
+ "degree": 3,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.25,
+ "hole": 5,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 5,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.25,
+ "hole": 6,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 3,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.25,
+ "hole": 5,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 2,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.25,
+ "hole": 4,
+ "breath": "draw",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 1,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 1,
+ "hole": 4,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ }
+ ],
+ "sectionEnd": true
+ }
+ ]
+ ]
+}
diff --git a/src/data/scores/xiao-bai-cai.json b/src/data/scores/xiao-bai-cai.json
new file mode 100644
index 0000000..a331ceb
--- /dev/null
+++ b/src/data/scores/xiao-bai-cai.json
@@ -0,0 +1,340 @@
+{
+ "id": "xiao-bai-cai",
+ "title": "小白菜",
+ "subtitle": "河北民歌 · 含变拍结束句",
+ "composer": "河北传统民歌",
+ "key": "C",
+ "harmonicaKey": "C",
+ "position": "第二把位",
+ "timeSignature": "5/4",
+ "tempo": 64,
+ "difficulty": 3,
+ "tags": [
+ "中国民歌",
+ "变拍",
+ "压音"
+ ],
+ "source": "郭丽萍、王立民、马志飞主编《音乐鉴赏》(新华出版社)印刷第 17 页,谱例 1-7;PDF 第 24 页。主歌 4 小节 5/4,结束句 2 小节 4/4。1=Ab 移为 1=C,升八度适配口琴。",
+ "sourceUrl": "https://backend.sjhtbook.com/upload/file/2025/04/80fb4b7923894770828045c9e613e236.pdf#page=24",
+ "sourceFormat": "jianpu-image",
+ "sourceCheckedAt": "2026-10-22",
+ "builtin": true,
+ "order": 17,
+ "notes": "保留教材主歌与结束句的反复标记;主歌可按需反复后进入结束句,结束句反复一次。省略歌词及异音连奏弧线。第 4 小节采用本版的 do–低 la,不混用其他版本的低 si–低 la。低 la 用 3 孔吸气全音压音。速度为练习建议。 把位按本版移调后的主音 G 计算,为 C 调口琴第二把位;1=C 是简谱标尺。 调式参考《基本乐理教程》修订版第 85 页例 7-3(d) 对该民歌的徵调式分类;旋律仍采用上述简谱教材版本。",
+ "lines": [
+ [
+ {
+ "notes": [
+ {
+ "degree": 5,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 1,
+ "hole": 6,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 3,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 1,
+ "hole": 5,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 3,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 1,
+ "hole": 5,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 2,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 2,
+ "hole": 4,
+ "breath": "draw",
+ "bend": 0,
+ "overblow": false
+ }
+ ]
+ },
+ {
+ "notes": [
+ {
+ "degree": 5,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 1,
+ "hole": 6,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 5,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.5,
+ "hole": 6,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 3,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.5,
+ "hole": 5,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 3,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.5,
+ "hole": 5,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 2,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.5,
+ "hole": 4,
+ "breath": "draw",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 1,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 2,
+ "hole": 4,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ }
+ ]
+ }
+ ],
+ [
+ {
+ "notes": [
+ {
+ "degree": 1,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 1,
+ "hole": 4,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 3,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 1,
+ "hole": 5,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 2,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 1,
+ "hole": 4,
+ "breath": "draw",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 6,
+ "accidental": 0,
+ "octave": 0,
+ "beats": 2,
+ "hole": 3,
+ "breath": "draw",
+ "bend": 2,
+ "overblow": false
+ }
+ ]
+ },
+ {
+ "notes": [
+ {
+ "degree": 2,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 1,
+ "hole": 4,
+ "breath": "draw",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 1,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 1,
+ "hole": 4,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 1,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.5,
+ "hole": 4,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 6,
+ "accidental": 0,
+ "octave": 0,
+ "beats": 0.5,
+ "hole": 3,
+ "breath": "draw",
+ "bend": 2,
+ "overblow": false
+ },
+ {
+ "degree": 5,
+ "accidental": 0,
+ "octave": 0,
+ "beats": 2,
+ "hole": 3,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ }
+ ],
+ "repeatEnd": true
+ }
+ ],
+ [
+ {
+ "notes": [
+ {
+ "degree": 6,
+ "accidental": 0,
+ "octave": 0,
+ "beats": 1,
+ "hole": 3,
+ "breath": "draw",
+ "bend": 2,
+ "overblow": false
+ },
+ {
+ "degree": 1,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.5,
+ "hole": 4,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 6,
+ "accidental": 0,
+ "octave": 0,
+ "beats": 0.5,
+ "hole": 3,
+ "breath": "draw",
+ "bend": 2,
+ "overblow": false
+ },
+ {
+ "degree": 5,
+ "accidental": 0,
+ "octave": 0,
+ "beats": 2,
+ "hole": 3,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ }
+ ],
+ "timeSignature": "4/4",
+ "repeatBegin": true
+ },
+ {
+ "notes": [
+ {
+ "degree": 6,
+ "accidental": 0,
+ "octave": 0,
+ "beats": 0.5,
+ "hole": 3,
+ "breath": "draw",
+ "bend": 2,
+ "overblow": false
+ },
+ {
+ "degree": 2,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.5,
+ "hole": 4,
+ "breath": "draw",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 1,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.5,
+ "hole": 4,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 6,
+ "accidental": 0,
+ "octave": 0,
+ "beats": 0.5,
+ "hole": 3,
+ "breath": "draw",
+ "bend": 2,
+ "overblow": false
+ },
+ {
+ "degree": 5,
+ "accidental": 0,
+ "octave": 0,
+ "beats": 2,
+ "hole": 3,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ }
+ ],
+ "repeatEnd": true
+ }
+ ]
+ ]
+}
diff --git a/src/data/scores/yankee-doodle.json b/src/data/scores/yankee-doodle.json
new file mode 100644
index 0000000..76d53ea
--- /dev/null
+++ b/src/data/scores/yankee-doodle.json
@@ -0,0 +1,718 @@
+{
+ "id": "yankee-doodle",
+ "title": "扬基歌",
+ "subtitle": "Yankee Doodle · 含副歌",
+ "composer": "传统曲调",
+ "key": "C",
+ "harmonicaKey": "C",
+ "position": "第一把位",
+ "timeSignature": "2/4",
+ "tempo": 100,
+ "difficulty": 3,
+ "tags": [
+ "西方民谣",
+ "弱起",
+ "压音"
+ ],
+ "source": "The Everyday Song Book (1927), No.3;John Chambers 2015 年 ABC 转录。A 调移为 C 调,主音移至 C5;保留主歌和低音区副歌。",
+ "sourceUrl": "https://trillian.mit.edu/~jc/music/book/EverydaySongBook/003_Yankee_Doodle.abc",
+ "sourceFormat": "music-text",
+ "sourceCheckedAt": "2026-10-22",
+ "builtin": true,
+ "order": 21,
+ "notes": "开头八分弱起,末尾一拍半互补;主歌后的副歌包含低 fa / la 压音,不只截取常见的前八小节。省略歌词与异音连奏线;速度为练习建议。",
+ "lines": [
+ [
+ {
+ "notes": [
+ {
+ "degree": 5,
+ "accidental": 0,
+ "octave": 0,
+ "beats": 0.5,
+ "hole": 3,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ }
+ ]
+ },
+ {
+ "notes": [
+ {
+ "degree": 1,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.5,
+ "hole": 4,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 1,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.5,
+ "hole": 4,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 2,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.5,
+ "hole": 4,
+ "breath": "draw",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 3,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.5,
+ "hole": 5,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ }
+ ]
+ },
+ {
+ "notes": [
+ {
+ "degree": 1,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.5,
+ "hole": 4,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 3,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.5,
+ "hole": 5,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 2,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.5,
+ "hole": 4,
+ "breath": "draw",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 5,
+ "accidental": 0,
+ "octave": 0,
+ "beats": 0.5,
+ "hole": 3,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ }
+ ]
+ },
+ {
+ "notes": [
+ {
+ "degree": 1,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.5,
+ "hole": 4,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 1,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.5,
+ "hole": 4,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 2,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.5,
+ "hole": 4,
+ "breath": "draw",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 3,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.5,
+ "hole": 5,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ }
+ ]
+ },
+ {
+ "notes": [
+ {
+ "degree": 1,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 1,
+ "hole": 4,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 7,
+ "accidental": 0,
+ "octave": 0,
+ "beats": 0.5,
+ "hole": 3,
+ "breath": "draw",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 5,
+ "accidental": 0,
+ "octave": 0,
+ "beats": 0.5,
+ "hole": 3,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ }
+ ]
+ }
+ ],
+ [
+ {
+ "notes": [
+ {
+ "degree": 1,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.5,
+ "hole": 4,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 1,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.5,
+ "hole": 4,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 2,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.5,
+ "hole": 4,
+ "breath": "draw",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 3,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.5,
+ "hole": 5,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ }
+ ]
+ },
+ {
+ "notes": [
+ {
+ "degree": 4,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.5,
+ "hole": 5,
+ "breath": "draw",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 3,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.5,
+ "hole": 5,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 2,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.5,
+ "dotted": true,
+ "hole": 4,
+ "breath": "draw",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 1,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.25,
+ "hole": 4,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ }
+ ]
+ },
+ {
+ "notes": [
+ {
+ "degree": 7,
+ "accidental": 0,
+ "octave": 0,
+ "beats": 0.5,
+ "hole": 3,
+ "breath": "draw",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 5,
+ "accidental": 0,
+ "octave": 0,
+ "beats": 0.5,
+ "hole": 3,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 6,
+ "accidental": 0,
+ "octave": 0,
+ "beats": 0.5,
+ "hole": 3,
+ "breath": "draw",
+ "bend": 2,
+ "overblow": false
+ },
+ {
+ "degree": 7,
+ "accidental": 0,
+ "octave": 0,
+ "beats": 0.5,
+ "hole": 3,
+ "breath": "draw",
+ "bend": 0,
+ "overblow": false
+ }
+ ]
+ },
+ {
+ "notes": [
+ {
+ "degree": 1,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 1,
+ "hole": 4,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 1,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.5,
+ "hole": 4,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 0,
+ "accidental": 0,
+ "octave": 0,
+ "beats": 0.5,
+ "hole": null,
+ "breath": null,
+ "bend": 0,
+ "overblow": false
+ }
+ ]
+ }
+ ],
+ [
+ {
+ "notes": [
+ {
+ "degree": 6,
+ "accidental": 0,
+ "octave": 0,
+ "beats": 0.5,
+ "dotted": true,
+ "hole": 3,
+ "breath": "draw",
+ "bend": 2,
+ "overblow": false
+ },
+ {
+ "degree": 7,
+ "accidental": 0,
+ "octave": 0,
+ "beats": 0.25,
+ "hole": 3,
+ "breath": "draw",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 6,
+ "accidental": 0,
+ "octave": 0,
+ "beats": 0.5,
+ "hole": 3,
+ "breath": "draw",
+ "bend": 2,
+ "overblow": false
+ },
+ {
+ "degree": 5,
+ "accidental": 0,
+ "octave": 0,
+ "beats": 0.5,
+ "hole": 3,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ }
+ ]
+ },
+ {
+ "notes": [
+ {
+ "degree": 6,
+ "accidental": 0,
+ "octave": 0,
+ "beats": 0.5,
+ "hole": 3,
+ "breath": "draw",
+ "bend": 2,
+ "overblow": false
+ },
+ {
+ "degree": 7,
+ "accidental": 0,
+ "octave": 0,
+ "beats": 0.5,
+ "hole": 3,
+ "breath": "draw",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 1,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.5,
+ "hole": 4,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 0,
+ "accidental": 0,
+ "octave": 0,
+ "beats": 0.5,
+ "hole": null,
+ "breath": null,
+ "bend": 0,
+ "overblow": false
+ }
+ ]
+ },
+ {
+ "notes": [
+ {
+ "degree": 5,
+ "accidental": 0,
+ "octave": 0,
+ "beats": 0.5,
+ "dotted": true,
+ "hole": 3,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 6,
+ "accidental": 0,
+ "octave": 0,
+ "beats": 0.25,
+ "hole": 3,
+ "breath": "draw",
+ "bend": 2,
+ "overblow": false
+ },
+ {
+ "degree": 5,
+ "accidental": 0,
+ "octave": 0,
+ "beats": 0.5,
+ "hole": 3,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 4,
+ "accidental": 0,
+ "octave": 0,
+ "beats": 0.5,
+ "hole": 2,
+ "breath": "draw",
+ "bend": 2,
+ "overblow": false
+ }
+ ]
+ },
+ {
+ "notes": [
+ {
+ "degree": 3,
+ "accidental": 0,
+ "octave": 0,
+ "beats": 0.5,
+ "dotted": true,
+ "hole": 2,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 4,
+ "accidental": 0,
+ "octave": 0,
+ "beats": 0.25,
+ "hole": 2,
+ "breath": "draw",
+ "bend": 2,
+ "overblow": false
+ },
+ {
+ "degree": 5,
+ "accidental": 0,
+ "octave": 0,
+ "beats": 0.5,
+ "hole": 3,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 0,
+ "accidental": 0,
+ "octave": 0,
+ "beats": 0.5,
+ "hole": null,
+ "breath": null,
+ "bend": 0,
+ "overblow": false
+ }
+ ]
+ }
+ ],
+ [
+ {
+ "notes": [
+ {
+ "degree": 6,
+ "accidental": 0,
+ "octave": 0,
+ "beats": 0.5,
+ "dotted": true,
+ "hole": 3,
+ "breath": "draw",
+ "bend": 2,
+ "overblow": false
+ },
+ {
+ "degree": 7,
+ "accidental": 0,
+ "octave": 0,
+ "beats": 0.25,
+ "hole": 3,
+ "breath": "draw",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 6,
+ "accidental": 0,
+ "octave": 0,
+ "beats": 0.5,
+ "hole": 3,
+ "breath": "draw",
+ "bend": 2,
+ "overblow": false
+ },
+ {
+ "degree": 5,
+ "accidental": 0,
+ "octave": 0,
+ "beats": 0.5,
+ "hole": 3,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ }
+ ]
+ },
+ {
+ "notes": [
+ {
+ "degree": 6,
+ "accidental": 0,
+ "octave": 0,
+ "beats": 0.5,
+ "hole": 3,
+ "breath": "draw",
+ "bend": 2,
+ "overblow": false
+ },
+ {
+ "degree": 7,
+ "accidental": 0,
+ "octave": 0,
+ "beats": 0.5,
+ "hole": 3,
+ "breath": "draw",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 1,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.5,
+ "hole": 4,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 6,
+ "accidental": 0,
+ "octave": 0,
+ "beats": 0.5,
+ "hole": 3,
+ "breath": "draw",
+ "bend": 2,
+ "overblow": false
+ }
+ ]
+ },
+ {
+ "notes": [
+ {
+ "degree": 5,
+ "accidental": 0,
+ "octave": 0,
+ "beats": 0.5,
+ "hole": 3,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 1,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.5,
+ "hole": 4,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 7,
+ "accidental": 0,
+ "octave": 0,
+ "beats": 0.5,
+ "hole": 3,
+ "breath": "draw",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 2,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.5,
+ "hole": 4,
+ "breath": "draw",
+ "bend": 0,
+ "overblow": false
+ }
+ ]
+ },
+ {
+ "notes": [
+ {
+ "degree": 1,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 1,
+ "hole": 4,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 1,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.5,
+ "hole": 4,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ }
+ ],
+ "sectionEnd": true
+ }
+ ]
+ ]
+}
diff --git a/src/data/scores/zou-jiang-zhou.json b/src/data/scores/zou-jiang-zhou.json
new file mode 100644
index 0000000..2d5a29b
--- /dev/null
+++ b/src/data/scores/zou-jiang-zhou.json
@@ -0,0 +1,991 @@
+{
+ "id": "zou-jiang-zhou",
+ "title": "走绛州",
+ "subtitle": "山西民歌 · 教材单旋律版",
+ "composer": "山西传统民歌",
+ "key": "C",
+ "harmonicaKey": "C",
+ "position": "第二把位",
+ "timeSignature": "2/4",
+ "tempo": 88,
+ "difficulty": 3,
+ "tags": [
+ "中国民歌",
+ "十六分音符",
+ "压音"
+ ],
+ "source": "郭丽萍、王立民、马志飞主编《音乐鉴赏》(新华出版社)印刷第 6 页,谱例 1-1;PDF 第 13 页。23 小节,1=G 移为 1=C,升八度适配口琴。",
+ "sourceUrl": "https://backend.sjhtbook.com/upload/file/2025/04/80fb4b7923894770828045c9e613e236.pdf#page=13",
+ "sourceFormat": "jianpu-image",
+ "sourceCheckedAt": "2026-10-22",
+ "builtin": true,
+ "order": 20,
+ "notes": "保留 23 小节主旋律、高低音区及十六分休止;省略歌词、异音连奏弧线和第二/三段歌词的节奏变体。第 6–7 小节短音与休止交替,先慢练吐音;低 fa 为 2 孔吸气全音压音,低 la 为 3 孔吸气全音压音。速度为练习建议。 把位按本版移调后的主音 G 计算,为 C 调口琴第二把位;1=C 是简谱标尺。 所选教材第 5 页对下句落音 D 徵的分析,与原 1=G 简谱及移调关系对应。",
+ "lines": [
+ [
+ {
+ "notes": [
+ {
+ "degree": 1,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 1,
+ "hole": 4,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 5,
+ "accidental": 0,
+ "octave": 0,
+ "beats": 1,
+ "hole": 3,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ }
+ ]
+ },
+ {
+ "notes": [
+ {
+ "degree": 1,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.5,
+ "hole": 4,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 7,
+ "accidental": 0,
+ "octave": 0,
+ "beats": 0.25,
+ "hole": 3,
+ "breath": "draw",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 6,
+ "accidental": 0,
+ "octave": 0,
+ "beats": 0.25,
+ "hole": 3,
+ "breath": "draw",
+ "bend": 2,
+ "overblow": false
+ },
+ {
+ "degree": 5,
+ "accidental": 0,
+ "octave": 0,
+ "beats": 1,
+ "hole": 3,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ }
+ ]
+ },
+ {
+ "notes": [
+ {
+ "degree": 5,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.5,
+ "dotted": true,
+ "hole": 6,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 1,
+ "accidental": 0,
+ "octave": 2,
+ "beats": 0.25,
+ "hole": 7,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 5,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.5,
+ "hole": 6,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 4,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.5,
+ "hole": 5,
+ "breath": "draw",
+ "bend": 0,
+ "overblow": false
+ }
+ ]
+ },
+ {
+ "notes": [
+ {
+ "degree": 5,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.5,
+ "hole": 6,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 2,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 1,
+ "hole": 4,
+ "breath": "draw",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 1,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.5,
+ "hole": 4,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ }
+ ]
+ },
+ {
+ "notes": [
+ {
+ "degree": 2,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 2,
+ "hole": 4,
+ "breath": "draw",
+ "bend": 0,
+ "overblow": false
+ }
+ ]
+ }
+ ],
+ [
+ {
+ "notes": [
+ {
+ "degree": 5,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.25,
+ "hole": 6,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 0,
+ "accidental": 0,
+ "octave": 0,
+ "beats": 0.25,
+ "hole": null,
+ "breath": null,
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 1,
+ "accidental": 0,
+ "octave": 2,
+ "beats": 0.25,
+ "hole": 7,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 0,
+ "accidental": 0,
+ "octave": 0,
+ "beats": 0.25,
+ "hole": null,
+ "breath": null,
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 5,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.25,
+ "hole": 6,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 0,
+ "accidental": 0,
+ "octave": 0,
+ "beats": 0.25,
+ "hole": null,
+ "breath": null,
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 1,
+ "accidental": 0,
+ "octave": 2,
+ "beats": 0.25,
+ "hole": 7,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 0,
+ "accidental": 0,
+ "octave": 0,
+ "beats": 0.25,
+ "hole": null,
+ "breath": null,
+ "bend": 0,
+ "overblow": false
+ }
+ ]
+ },
+ {
+ "notes": [
+ {
+ "degree": 5,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.25,
+ "hole": 6,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 0,
+ "accidental": 0,
+ "octave": 0,
+ "beats": 0.25,
+ "hole": null,
+ "breath": null,
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 1,
+ "accidental": 0,
+ "octave": 2,
+ "beats": 0.25,
+ "hole": 7,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 0,
+ "accidental": 0,
+ "octave": 0,
+ "beats": 0.25,
+ "hole": null,
+ "breath": null,
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 5,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.25,
+ "hole": 6,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 0,
+ "accidental": 0,
+ "octave": 0,
+ "beats": 0.25,
+ "hole": null,
+ "breath": null,
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 1,
+ "accidental": 0,
+ "octave": 2,
+ "beats": 0.25,
+ "hole": 7,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 0,
+ "accidental": 0,
+ "octave": 0,
+ "beats": 0.25,
+ "hole": null,
+ "breath": null,
+ "bend": 0,
+ "overblow": false
+ }
+ ]
+ },
+ {
+ "notes": [
+ {
+ "degree": 5,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.5,
+ "hole": 6,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 2,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 1,
+ "hole": 4,
+ "breath": "draw",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 1,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.5,
+ "hole": 4,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ }
+ ]
+ },
+ {
+ "notes": [
+ {
+ "degree": 2,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 2,
+ "hole": 4,
+ "breath": "draw",
+ "bend": 0,
+ "overblow": false
+ }
+ ]
+ }
+ ],
+ [
+ {
+ "notes": [
+ {
+ "degree": 5,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 1,
+ "hole": 6,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 2,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.5,
+ "hole": 4,
+ "breath": "draw",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 2,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.5,
+ "hole": 4,
+ "breath": "draw",
+ "bend": 0,
+ "overblow": false
+ }
+ ]
+ },
+ {
+ "notes": [
+ {
+ "degree": 5,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 1,
+ "hole": 6,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 2,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 1,
+ "hole": 4,
+ "breath": "draw",
+ "bend": 0,
+ "overblow": false
+ }
+ ]
+ },
+ {
+ "notes": [
+ {
+ "degree": 1,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.5,
+ "hole": 4,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 7,
+ "accidental": 0,
+ "octave": 0,
+ "beats": 0.5,
+ "hole": 3,
+ "breath": "draw",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 1,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.5,
+ "hole": 4,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 2,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.25,
+ "hole": 4,
+ "breath": "draw",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 1,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.25,
+ "hole": 4,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ }
+ ]
+ },
+ {
+ "notes": [
+ {
+ "degree": 5,
+ "accidental": 0,
+ "octave": 0,
+ "beats": 2,
+ "hole": 3,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ }
+ ]
+ },
+ {
+ "notes": [
+ {
+ "degree": 1,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.5,
+ "hole": 4,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 7,
+ "accidental": 0,
+ "octave": 0,
+ "beats": 0.5,
+ "hole": 3,
+ "breath": "draw",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 1,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.5,
+ "hole": 4,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 2,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.5,
+ "hole": 4,
+ "breath": "draw",
+ "bend": 0,
+ "overblow": false
+ }
+ ]
+ }
+ ],
+ [
+ {
+ "notes": [
+ {
+ "degree": 5,
+ "accidental": 0,
+ "octave": 0,
+ "beats": 0.25,
+ "hole": 3,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 5,
+ "accidental": 0,
+ "octave": 0,
+ "beats": 0.25,
+ "hole": 3,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 5,
+ "accidental": 0,
+ "octave": 0,
+ "beats": 0.25,
+ "hole": 3,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 4,
+ "accidental": 0,
+ "octave": 0,
+ "beats": 0.25,
+ "hole": 2,
+ "breath": "draw",
+ "bend": 2,
+ "overblow": false
+ },
+ {
+ "degree": 5,
+ "accidental": 0,
+ "octave": 0,
+ "beats": 1,
+ "hole": 3,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ }
+ ]
+ },
+ {
+ "notes": [
+ {
+ "degree": 1,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.5,
+ "hole": 4,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 7,
+ "accidental": 0,
+ "octave": 0,
+ "beats": 0.5,
+ "hole": 3,
+ "breath": "draw",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 1,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.5,
+ "hole": 4,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 2,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.5,
+ "hole": 4,
+ "breath": "draw",
+ "bend": 0,
+ "overblow": false
+ }
+ ]
+ },
+ {
+ "notes": [
+ {
+ "degree": 5,
+ "accidental": 0,
+ "octave": 0,
+ "beats": 0.25,
+ "hole": 3,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 6,
+ "accidental": 0,
+ "octave": 0,
+ "beats": 0.25,
+ "hole": 3,
+ "breath": "draw",
+ "bend": 2,
+ "overblow": false
+ },
+ {
+ "degree": 5,
+ "accidental": 0,
+ "octave": 0,
+ "beats": 0.25,
+ "hole": 3,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 4,
+ "accidental": 0,
+ "octave": 0,
+ "beats": 0.25,
+ "hole": 2,
+ "breath": "draw",
+ "bend": 2,
+ "overblow": false
+ },
+ {
+ "degree": 5,
+ "accidental": 0,
+ "octave": 0,
+ "beats": 1,
+ "hole": 3,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ }
+ ]
+ },
+ {
+ "notes": [
+ {
+ "degree": 5,
+ "accidental": 0,
+ "octave": 0,
+ "beats": 0.5,
+ "hole": 3,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 4,
+ "accidental": 0,
+ "octave": 0,
+ "beats": 0.5,
+ "hole": 2,
+ "breath": "draw",
+ "bend": 2,
+ "overblow": false
+ },
+ {
+ "degree": 5,
+ "accidental": 0,
+ "octave": 0,
+ "beats": 0.5,
+ "hole": 3,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 4,
+ "accidental": 0,
+ "octave": 0,
+ "beats": 0.5,
+ "hole": 2,
+ "breath": "draw",
+ "bend": 2,
+ "overblow": false
+ }
+ ]
+ }
+ ],
+ [
+ {
+ "notes": [
+ {
+ "degree": 2,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.25,
+ "hole": 4,
+ "breath": "draw",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 1,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.25,
+ "hole": 4,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 2,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.25,
+ "hole": 4,
+ "breath": "draw",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 1,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.25,
+ "hole": 4,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 2,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.5,
+ "hole": 4,
+ "breath": "draw",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 1,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.5,
+ "hole": 4,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ }
+ ]
+ },
+ {
+ "notes": [
+ {
+ "degree": 1,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.5,
+ "hole": 4,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 2,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.5,
+ "hole": 4,
+ "breath": "draw",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 5,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.5,
+ "hole": 6,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 1,
+ "accidental": 0,
+ "octave": 2,
+ "beats": 0.5,
+ "hole": 7,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ }
+ ]
+ },
+ {
+ "notes": [
+ {
+ "degree": 5,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 1,
+ "dotted": true,
+ "hole": 6,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 2,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.25,
+ "hole": 4,
+ "breath": "draw",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 2,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.25,
+ "hole": 4,
+ "breath": "draw",
+ "bend": 0,
+ "overblow": false
+ }
+ ]
+ },
+ {
+ "notes": [
+ {
+ "degree": 1,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.5,
+ "hole": 4,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 7,
+ "accidental": 0,
+ "octave": 0,
+ "beats": 0.5,
+ "hole": 3,
+ "breath": "draw",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 1,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.5,
+ "hole": 4,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 2,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.25,
+ "hole": 4,
+ "breath": "draw",
+ "bend": 0,
+ "overblow": false
+ },
+ {
+ "degree": 1,
+ "accidental": 0,
+ "octave": 1,
+ "beats": 0.25,
+ "hole": 4,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ }
+ ]
+ },
+ {
+ "notes": [
+ {
+ "degree": 5,
+ "accidental": 0,
+ "octave": 0,
+ "beats": 2,
+ "hole": 3,
+ "breath": "blow",
+ "bend": 0,
+ "overblow": false
+ }
+ ],
+ "sectionEnd": true
+ }
+ ]
+ ]
+}
diff --git a/src/lib/builtinCodec.ts b/src/lib/builtinCodec.ts
new file mode 100644
index 0000000..cb6cb51
--- /dev/null
+++ b/src/lib/builtinCodec.ts
@@ -0,0 +1,57 @@
+import type { Measure, Note, Score } from '../types/score';
+
+type PackedMeasure = Omit
& { notes: number[] };
+type PackedScore = Omit & { lines: PackedMeasure[][] };
+
+/** Build-only transport format. Public score files and exports still use Score. */
+export interface PackedBuiltinLibrary {
+ version: 1;
+ notes: Note[];
+ scores: PackedScore[];
+}
+
+export function packBuiltinScores(scores: Score[]): PackedBuiltinLibrary {
+ const notes: Note[] = [];
+ const indexes = new Map();
+ const packedScores = scores.map(score => {
+ const { lines, ...metadata } = structuredClone(score);
+ return {
+ ...metadata,
+ lines: lines.map(line => line.map(({ notes: measureNotes, ...measure }) => ({
+ ...measure,
+ notes: measureNotes.map(note => {
+ const key = JSON.stringify(note);
+ let index = indexes.get(key);
+ if (index === undefined) {
+ index = notes.length;
+ indexes.set(key, index);
+ notes.push(note);
+ }
+ return index;
+ }),
+ }))),
+ };
+ });
+ return { version: 1, notes, scores: packedScores };
+}
+
+export function unpackBuiltinScores(packed: PackedBuiltinLibrary): Score[] {
+ if (packed.version !== 1) throw new Error('不支持的内置曲库数据版本');
+ return packed.scores.map(score => {
+ const { lines, ...metadata } = structuredClone(score);
+ return {
+ ...metadata,
+ lines: lines.map(line => line.map(({ notes: indexes, ...measure }) => ({
+ ...measure,
+ notes: indexes.map(index => {
+ if (!Number.isInteger(index) || index < 0 || index >= packed.notes.length) {
+ throw new Error(`内置曲库 ${metadata.id} 的音符索引无效:${index}`);
+ }
+ // Analysis fills fingering fields in place. Every occurrence, including
+ // its grace/ornament objects, must be independent of the dictionary.
+ return structuredClone(packed.notes[index]);
+ }),
+ }))),
+ };
+ });
+}
diff --git a/src/lib/export.ts b/src/lib/export.ts
index 9338509..15dd25e 100644
--- a/src/lib/export.ts
+++ b/src/lib/export.ts
@@ -4,19 +4,20 @@
import type { Score } from '../types/score';
import React from 'react';
import { createRoot } from 'react-dom/client';
-import { ScoreSheetSvg } from '../components/ScoreSheet';
+import { ScoreSheetSvg, type ScoreDisplayOptions } from '../components/ScoreSheet';
import { flushSync } from 'react-dom';
+import { paginateRows } from './printLayout';
function safeName(s: string): string {
return s.replace(/[\\/:*?"<>|\s]+/g, '_');
}
/** 把曲谱渲染为独立 SVG 字符串 */
-export function renderToSvgString(score: Score): string {
+export function renderToSvgString(score: Score, pageWidth = 1080, options: ScoreDisplayOptions = {}): string {
const container = document.createElement('div');
const root = createRoot(container);
flushSync(() => {
- root.render(React.createElement(ScoreSheetSvg, { score, standalone: true }));
+ root.render(React.createElement(ScoreSheetSvg, { score, standalone: true, pageWidth, ...options }));
});
const svg = container.querySelector('svg');
const str = svg ? new XMLSerializer().serializeToString(svg) : '';
@@ -33,13 +34,13 @@ function download(blob: Blob, filename: string) {
setTimeout(() => URL.revokeObjectURL(url), 4000);
}
-export function exportSvg(score: Score) {
- const str = renderToSvgString(score);
+export function exportSvg(score: Score, options: ScoreDisplayOptions = {}) {
+ const str = renderToSvgString(score, 1080, options);
download(new Blob([str], { type: 'image/svg+xml;charset=utf-8' }), `${safeName(score.title)}.svg`);
}
-export async function exportPng(score: Score, scale = 2): Promise {
- const str = renderToSvgString(score);
+export async function exportPng(score: Score, scale = 2, options: ScoreDisplayOptions = {}): Promise {
+ const str = renderToSvgString(score, 1080, options);
const svgBlob = new Blob([str], { type: 'image/svg+xml;charset=utf-8' });
const url = URL.createObjectURL(svgBlob);
try {
@@ -58,21 +59,79 @@ export async function exportPng(score: Score, scale = 2): Promise {
ctx.fillRect(0, 0, canvas.width, canvas.height);
ctx.drawImage(img, 0, 0, canvas.width, canvas.height);
const blob = await new Promise((resolve) => canvas.toBlob(resolve, 'image/png'));
- if (blob) download(blob, `${safeName(score.title)}.png`);
+ if (!blob) throw new Error('PNG 编码失败,请尝试 SVG 导出');
+ download(blob, `${safeName(score.title)}.png`);
} finally {
URL.revokeObjectURL(url);
}
}
-/** 打印(浏览器可另存为 PDF) */
-export function exportPdf(score: Score) {
- const str = renderToSvgString(score);
+/** Measure the actual SVG ink (including ties, lyrics and techniques) before paging. */
+export function renderPrintPages(score: Score, options: ScoreDisplayOptions = {}): string[] {
+ // 900 units across A4's printable width keeps the main fingering around 8.5 pt.
+ const width = 900;
+ const source = new DOMParser().parseFromString(renderToSvgString(score, width, options), 'image/svg+xml');
+ const svg = document.importNode(source.documentElement, true) as unknown as SVGSVGElement;
+ const container = document.createElement('div');
+ container.style.cssText = 'position:fixed;left:-100000px;top:0;visibility:hidden;pointer-events:none';
+ container.append(svg);
+ document.body.append(container);
+ try {
+ const header = svg.querySelector('[data-score-part="header"]')!;
+ const footer = svg.querySelector('[data-score-part="footer"]')!;
+ const rows = [...svg.querySelectorAll('[data-score-row]')];
+ const bounds = rows.map(row => row.getBBox());
+ const headerBox = header.getBBox(), footerBox = footer.getBBox();
+ // A4, 12 mm margins; leave 1 mm of height for print rounding differences.
+ const height = width * 272 / 186;
+ const rowTop = headerBox.y + headerBox.height + 28;
+ const footerTop = height - 36 - footerBox.height;
+ const pages = paginateRows(bounds.map(box => box.height), rowTop, footerTop - 28);
+ const ns = 'http://www.w3.org/2000/svg';
+ const translated = (element: SVGElement, dy: number) => {
+ const group = document.createElementNS(ns, 'g');
+ group.setAttribute('transform', `translate(0 ${dy})`);
+ group.append(element.cloneNode(true));
+ return group;
+ };
+ return pages.map((page, index) => {
+ const result = document.createElementNS(ns, 'svg');
+ result.setAttribute('xmlns', ns);
+ result.setAttribute('viewBox', `0 0 ${width} ${height}`);
+ result.setAttribute('role', 'img');
+ result.setAttribute('aria-label', `${score.title} 第 ${index + 1} 页`);
+ const background = document.createElementNS(ns, 'rect');
+ background.setAttribute('width', String(width));
+ background.setAttribute('height', String(height));
+ background.setAttribute('fill', '#fffdf7');
+ result.append(background, header.cloneNode(true));
+ for (const row of page) result.append(translated(rows[row.index], row.top - bounds[row.index].y));
+ result.append(translated(footer, footerTop - footerBox.y));
+ const pageNumber = document.createElementNS(ns, 'text');
+ pageNumber.setAttribute('x', String(width - 56));
+ pageNumber.setAttribute('y', String(height - 12));
+ pageNumber.setAttribute('text-anchor', 'end');
+ pageNumber.setAttribute('font-size', '12');
+ pageNumber.setAttribute('fill', '#666');
+ pageNumber.textContent = `第 ${index + 1} / ${pages.length} 页`;
+ result.append(pageNumber);
+ return new XMLSerializer().serializeToString(result);
+ });
+ } finally { container.remove(); }
+}
+
+/** 打印(A4 整行分页,浏览器可另存为 PDF) */
+export async function exportPdf(score: Score, options: ScoreDisplayOptions = {}) {
+ const pages = renderPrintPages(score, options);
const win = window.open('', '_blank');
- if (!win) return;
- win.document.write(`${score.title} - HarpScore
-
-${str}