From 5a20382d1f3fe92557a287267165fc625539cf31 Mon Sep 17 00:00:00 2001 From: "Stefan@Lap" Date: Thu, 22 Nov 2018 00:41:27 +0100 Subject: [PATCH 01/13] fix(tutorials): move step 1 to 4 of march tutorial into subfolders --- _tutorials/102_march/102_march.json | 6 ++++++ .../102_march/{ => step-01}/102_march_step-01-desc.html | 0 .../102_march/{ => step-01}/102_march_step-01-prefill.xml | 0 _tutorials/102_march/{ => step-01}/102_march_step-01.xml | 0 .../102_march/{ => step-02}/102_march_step-02-desc.html | 0 .../102_march/{ => step-02}/102_march_step-02-prefill.xml | 0 _tutorials/102_march/{ => step-02}/102_march_step-02.xml | 0 .../102_march/{ => step-03}/102_march_step-03-desc.html | 0 .../102_march/{ => step-03}/102_march_step-03-prefill.xml | 0 _tutorials/102_march/{ => step-03}/102_march_step-03.xml | 0 .../102_march/{ => step-04}/102_march_step-04-desc.html | 0 .../102_march/{ => step-04}/102_march_step-04-prefill.xml | 0 _tutorials/102_march/{ => step-04}/102_march_step-04.xml | 0 13 files changed, 6 insertions(+) rename _tutorials/102_march/{ => step-01}/102_march_step-01-desc.html (100%) rename _tutorials/102_march/{ => step-01}/102_march_step-01-prefill.xml (100%) rename _tutorials/102_march/{ => step-01}/102_march_step-01.xml (100%) rename _tutorials/102_march/{ => step-02}/102_march_step-02-desc.html (100%) rename _tutorials/102_march/{ => step-02}/102_march_step-02-prefill.xml (100%) rename _tutorials/102_march/{ => step-02}/102_march_step-02.xml (100%) rename _tutorials/102_march/{ => step-03}/102_march_step-03-desc.html (100%) rename _tutorials/102_march/{ => step-03}/102_march_step-03-prefill.xml (100%) rename _tutorials/102_march/{ => step-03}/102_march_step-03.xml (100%) rename _tutorials/102_march/{ => step-04}/102_march_step-04-desc.html (100%) rename _tutorials/102_march/{ => step-04}/102_march_step-04-prefill.xml (100%) rename _tutorials/102_march/{ => step-04}/102_march_step-04.xml (100%) diff --git a/_tutorials/102_march/102_march.json b/_tutorials/102_march/102_march.json index 67f1596b..ed1e1fac 100644 --- a/_tutorials/102_march/102_march.json +++ b/_tutorials/102_march/102_march.json @@ -8,9 +8,12 @@ "xmlFile": "102_march_step-01.xml", "xpaths": [ {"rule": "count(//mei:scoreDef) = 1", "renderanyway": false, "hint": "You need one scoreDef element."}, + {"rule": "count(//mei:scoreDef/@*) = 0", "renderanyway": false, "hint": "You need no attribute on the scoreDef element."}, {"rule": "count(//mei:staffGrp) = 1", "renderanyway": false, "hint": "You need one staffGrp element."}, + {"rule": "count(//mei:staffGrp/@*) = 0", "renderanyway": false, "hint": "You need no attribute on the staffGrp element."}, {"rule": "//mei:scoreDef/mei:staffGrp", "renderanyway": false, "hint": "staffGrp element has to be a child of scoreDef element."}, {"rule": "count(//mei:staffDef) = 1", "renderanyway": false, "hint": "You need one staffDef element."}, + {"rule": "count(//mei:staffDef/@*) = 0", "renderanyway": false, "hint": "You need no attribute on the staffDef element."}, {"rule": "//mei:staffGrp/mei:staffDef", "renderanyway": false, "hint": "staffDef element has to be a child of staffGrp element."} ] }, @@ -23,6 +26,7 @@ "xpaths": [ {"rule": "count(//mei:scoreDef) = 1", "renderanyway": false, "hint": "You need one scoreDef element."}, {"rule": "count(//mei:staffGrp) = 1", "renderanyway": false, "hint": "You need one staffGroup element."}, + {"rule": "count(//mei:staffGrp/@*) = 0", "renderanyway": false, "hint": "You need no attribute on the staffGrp element."}, {"rule": "//mei:scoreDef/mei:staffGrp", "renderanyway": false, "hint": "staffGrp element has to be a child of scoreDef element."}, {"rule": "count(//mei:staffDef) = 1", "renderanyway": false, "hint": "You need one staffDef element."}, {"rule": "//mei:staffGrp/mei:staffDef", "renderanyway": false, "hint": "staffDef element has to be a child of staffGrp element."}, @@ -44,6 +48,7 @@ "xmlFile": "102_march_step-03.xml", "xpaths": [ {"rule": "count(//mei:section) = 1", "renderanyway": false, "hint": "You need one section element."}, + {"rule": "count(//mei:section/@*) = 0", "renderanyway": false, "hint": "You need no attribute on the section element."}, {"rule": "//mei:score/mei:section", "renderanyway": false, "hint": "section element has to be a child of score element."}, {"rule": "count(//mei:measure) = 1", "renderanyway": false, "hint": "You need one measure element."}, {"rule": "//mei:section/mei:measure", "renderanyway": false, "hint": "measure element has to be a child of section element."}, @@ -54,6 +59,7 @@ {"rule":"count(//mei:staff/@*) = 1", "renderanyway": false, "hint": "You need one attribute on staff (@n)."}, {"rule": "//mei:staff/@n = '1'", "renderanyway": false, "hint": "You need a @n attribute with a value of 1."}, {"rule": "count(//mei:layer) = 1", "renderanyway": false, "hint": "You need one layer element."}, + {"rule": "count(//mei:layer/@*) = 0", "renderanyway": false, "hint": "You need no attribute on the layer element."}, {"rule": "//mei:staff/mei:layer", "renderanyway": false, "hint": "layer element has to be a child of staff element."} ] }, diff --git a/_tutorials/102_march/102_march_step-01-desc.html b/_tutorials/102_march/step-01/102_march_step-01-desc.html similarity index 100% rename from _tutorials/102_march/102_march_step-01-desc.html rename to _tutorials/102_march/step-01/102_march_step-01-desc.html diff --git a/_tutorials/102_march/102_march_step-01-prefill.xml b/_tutorials/102_march/step-01/102_march_step-01-prefill.xml similarity index 100% rename from _tutorials/102_march/102_march_step-01-prefill.xml rename to _tutorials/102_march/step-01/102_march_step-01-prefill.xml diff --git a/_tutorials/102_march/102_march_step-01.xml b/_tutorials/102_march/step-01/102_march_step-01.xml similarity index 100% rename from _tutorials/102_march/102_march_step-01.xml rename to _tutorials/102_march/step-01/102_march_step-01.xml diff --git a/_tutorials/102_march/102_march_step-02-desc.html b/_tutorials/102_march/step-02/102_march_step-02-desc.html similarity index 100% rename from _tutorials/102_march/102_march_step-02-desc.html rename to _tutorials/102_march/step-02/102_march_step-02-desc.html diff --git a/_tutorials/102_march/102_march_step-02-prefill.xml b/_tutorials/102_march/step-02/102_march_step-02-prefill.xml similarity index 100% rename from _tutorials/102_march/102_march_step-02-prefill.xml rename to _tutorials/102_march/step-02/102_march_step-02-prefill.xml diff --git a/_tutorials/102_march/102_march_step-02.xml b/_tutorials/102_march/step-02/102_march_step-02.xml similarity index 100% rename from _tutorials/102_march/102_march_step-02.xml rename to _tutorials/102_march/step-02/102_march_step-02.xml diff --git a/_tutorials/102_march/102_march_step-03-desc.html b/_tutorials/102_march/step-03/102_march_step-03-desc.html similarity index 100% rename from _tutorials/102_march/102_march_step-03-desc.html rename to _tutorials/102_march/step-03/102_march_step-03-desc.html diff --git a/_tutorials/102_march/102_march_step-03-prefill.xml b/_tutorials/102_march/step-03/102_march_step-03-prefill.xml similarity index 100% rename from _tutorials/102_march/102_march_step-03-prefill.xml rename to _tutorials/102_march/step-03/102_march_step-03-prefill.xml diff --git a/_tutorials/102_march/102_march_step-03.xml b/_tutorials/102_march/step-03/102_march_step-03.xml similarity index 100% rename from _tutorials/102_march/102_march_step-03.xml rename to _tutorials/102_march/step-03/102_march_step-03.xml diff --git a/_tutorials/102_march/102_march_step-04-desc.html b/_tutorials/102_march/step-04/102_march_step-04-desc.html similarity index 100% rename from _tutorials/102_march/102_march_step-04-desc.html rename to _tutorials/102_march/step-04/102_march_step-04-desc.html diff --git a/_tutorials/102_march/102_march_step-04-prefill.xml b/_tutorials/102_march/step-04/102_march_step-04-prefill.xml similarity index 100% rename from _tutorials/102_march/102_march_step-04-prefill.xml rename to _tutorials/102_march/step-04/102_march_step-04-prefill.xml diff --git a/_tutorials/102_march/102_march_step-04.xml b/_tutorials/102_march/step-04/102_march_step-04.xml similarity index 100% rename from _tutorials/102_march/102_march_step-04.xml rename to _tutorials/102_march/step-04/102_march_step-04.xml From 7145253c22f8b51a3eff4cc0905a7998cd3b82e1 Mon Sep 17 00:00:00 2001 From: "Stefan@Lap" Date: Thu, 22 Nov 2018 00:42:01 +0100 Subject: [PATCH 02/13] feat(tutorials): add step 5 of march tutorial --- _tutorials/102_march/102_march.json | 43 +++++++++++++++++++ .../step-05/102_march_step-05-desc.html | 5 +++ .../step-05/102_march_step-05-prefill.xml | 10 +++++ .../102_march/step-05/102_march_step-05.xml | 43 +++++++++++++++++++ 4 files changed, 101 insertions(+) create mode 100644 _tutorials/102_march/step-05/102_march_step-05-desc.html create mode 100644 _tutorials/102_march/step-05/102_march_step-05-prefill.xml create mode 100644 _tutorials/102_march/step-05/102_march_step-05.xml diff --git a/_tutorials/102_march/102_march.json b/_tutorials/102_march/102_march.json index ed1e1fac..a513469c 100644 --- a/_tutorials/102_march/102_march.json +++ b/_tutorials/102_march/102_march.json @@ -76,6 +76,49 @@ {"rule": "//mei:note/@oct = '3'", "renderanyway": false, "hint": "You need an @oct attribute with a value of 3."}, {"rule": "//mei:note/@dur = '4'", "renderanyway": false, "hint": "You need a @dur attribute with a value of 4."} ] + }, + { + "label": "Second note", + "editorLines": 18, + "descFile": "102_march_step-05-desc.html", + "prefillFile": "102_march_step-05-prefill.xml", + "xmlFile": "102_march_step-05.xml", + "xpaths": [ + {"rule": "count(//mei:section) = 1", "renderanyway": false, "hint": "You need one section element."}, + {"rule": "count(//mei:section/@*) = 0", "renderanyway": false, "hint": "You need no attribute on the section element."}, + {"rule": "count(//mei:measure) = 2", "renderanyway": false, "hint": "You need two measure elements."}, + {"rule": "//mei:section/mei:measure", "renderanyway": false, "hint": "measure element has to be a child of section element."}, + {"rule": "count(//mei:section/mei:measure) = 2", "renderanyway": false, "hint": "You need two measure children in section element."}, + {"rule": "count(//mei:measure[1]/@*) = 1", "renderanyway": false, "hint": "You need one attribute on the first measure (@n)."}, + {"rule": "//mei:measure[1]/@n = 0", "renderanyway": false, "hint": "You need a @n attribute with a value of 0 on first measure."}, + {"rule": "count(//mei:measure[2]/@*) = 1", "renderanyway": false, "hint": "You need one attribute on the second measure (@n)."}, + {"rule": "//mei:measure[2]/@n = 1", "renderanyway": false, "hint": "You need a @n attribute with a value of 1 on second measure."}, + {"rule": "count(//mei:staff) = 2", "renderanyway": false, "hint": "You need two staff elements."}, + {"rule": "//mei:measure[1]/mei:staff", "renderanyway": false, "hint": "You need a staff in first measure element."}, + {"rule": "//mei:measure[2]/mei:staff", "renderanyway": false, "hint": "You need a staff in second measure element."}, + {"rule": "count(//mei:measure/mei:staff) = 2", "renderanyway": false, "hint": "You need a staff child in every measure element."}, + {"rule": "count(//mei:measure[1]/mei:staff/@*) = 1", "renderanyway": false, "hint": "You need one attribute on the staff of first measure (@n)."}, + {"rule": "count(//mei:measure[2]/mei:staff/@*) = 1", "renderanyway": false, "hint": "You need one attribute on the staff of first measure (@n)."}, + {"rule": "//mei:measure[1]/mei:staff/@n = 1", "renderanyway": false, "hint": "You need a @n attribute with a value of 1 on first staff."}, + {"rule": "//mei:measure[2]/mei:staff/@n = 1", "renderanyway": false, "hint": "You need a @n attribute with a value of 1 on second staff."}, + {"rule": "count(//mei:layer) = 2", "renderanyway": false, "hint": "You need two layer elements."}, + {"rule": "//mei:measure[1]/mei:staff/mei:layer", "renderanyway": false, "hint": "You need a layer element in first staff element."}, + {"rule": "//mei:measure[2]/mei:staff/mei:layer", "renderanyway": false, "hint": "You need a layer element in second staff element."}, + {"rule": "count(//mei:staff/mei:layer) = 2", "renderanyway": false, "hint": "You need a layer child in every staff element."}, + {"rule": "count(//mei:layer/@*) = 0", "renderanyway": false, "hint": "You need no attribute on the layer elements."}, + {"rule": "count(//mei:note) = 2", "renderanyway": false, "hint": "You need two note elements."}, + {"rule": "//mei:measure[1]/mei:staff/mei:layer/mei:note", "renderanyway": false, "hint": "First note has to be a child of first layer element."}, + {"rule": "//mei:measure[2]/mei:staff/mei:layer/mei:note", "renderanyway": false, "hint": "Second note has to be a child of second layer element."}, + {"rule": "count(//mei:measure[1]/mei:staff/mei:layer/mei:note/@*) = 3", "renderanyway": false, "hint": "You need three attributes on the first note (@pname, @oct & @dur)."}, + {"rule": "count(//mei:measure[2]/mei:staff/mei:layer/mei:note/@*) = 3", "renderanyway": false, "hint": "You need three attributes on the second note (@pname, @oct & @dur)."}, + {"rule": "//mei:measure[1]/mei:staff/mei:layer/mei:note/@pname = 'b'", "renderanyway": false, "hint": "You need a @pname attribute with a value of b on first note."}, + {"rule": "//mei:measure[1]/mei:staff/mei:layer/mei:note/@oct = '3'", "renderanyway": false, "hint": "You need an @oct attribute with a value of 3 on first note."}, + {"rule": "//mei:measure[1]/mei:staff/mei:layer/mei:note/@dur = '4'", "renderanyway": false, "hint": "You need a @dur attribute with a value of 4 on first note."}, + {"rule": "//mei:measure[2]/mei:staff/mei:layer/mei:note/@pname = 'e'", "renderanyway": false, "hint": "You need a @pname attribute with a value of e on second note."}, + {"rule": "//mei:measure[2]/mei:staff/mei:layer/mei:note/@oct = '4'", "renderanyway": false, "hint": "You need an @oct attribute with a value of 4 on second note."}, + {"rule": "//mei:measure[2]/mei:staff/mei:layer/mei:note/@dur = '4'", "renderanyway": false, "hint": "You need a @dur attribute with a value of 4 on second note."} + ] + }, } ], "outro": "Congratulations, you've successfully finished this tutorial!" diff --git a/_tutorials/102_march/step-05/102_march_step-05-desc.html b/_tutorials/102_march/step-05/102_march_step-05-desc.html new file mode 100644 index 00000000..a7c493f4 --- /dev/null +++ b/_tutorials/102_march/step-05/102_march_step-05-desc.html @@ -0,0 +1,5 @@ +
+

It's time to combine what you've learned in last two steps: In this step you will encode at once the next measure and the second note of the example.

+ +

In the editor below, add another <measure> element (n="1") with staff and layer next to the existing pickup measure. Add the second note of the example (a quarter note e4) to this new measure. Don’t worry about the measure being too short in given time signature – you’ll fill it in in the next steps.

+
\ No newline at end of file diff --git a/_tutorials/102_march/step-05/102_march_step-05-prefill.xml b/_tutorials/102_march/step-05/102_march_step-05-prefill.xml new file mode 100644 index 00000000..47f2281d --- /dev/null +++ b/_tutorials/102_march/step-05/102_march_step-05-prefill.xml @@ -0,0 +1,10 @@ +
+ + + + + + + + +
\ No newline at end of file diff --git a/_tutorials/102_march/step-05/102_march_step-05.xml b/_tutorials/102_march/step-05/102_march_step-05.xml new file mode 100644 index 00000000..a505bb5a --- /dev/null +++ b/_tutorials/102_march/step-05/102_march_step-05.xml @@ -0,0 +1,43 @@ + + + + + March + + + + + + + + + + + + + + + +
+ + + + + + + + + + + + + + +
+ + +
+
+ +
+
From 2cdb6217a692fe806a4eea008cf0c9dab47cdd20 Mon Sep 17 00:00:00 2001 From: "Stefan@Lap" Date: Thu, 22 Nov 2018 00:42:37 +0100 Subject: [PATCH 03/13] feat(tutorials): add step 6 of march tutorial --- _tutorials/102_march/102_march.json | 36 ++++++++++++++ .../step-06/102_march_step-06-desc.html | 7 +++ .../step-06/102_march_step-06-prefill.xml | 8 ++++ .../102_march/step-06/102_march_step-06.xml | 47 +++++++++++++++++++ 4 files changed, 98 insertions(+) create mode 100644 _tutorials/102_march/step-06/102_march_step-06-desc.html create mode 100644 _tutorials/102_march/step-06/102_march_step-06-prefill.xml create mode 100644 _tutorials/102_march/step-06/102_march_step-06.xml diff --git a/_tutorials/102_march/102_march.json b/_tutorials/102_march/102_march.json index a513469c..cd03ad90 100644 --- a/_tutorials/102_march/102_march.json +++ b/_tutorials/102_march/102_march.json @@ -119,6 +119,42 @@ {"rule": "//mei:measure[2]/mei:staff/mei:layer/mei:note/@dur = '4'", "renderanyway": false, "hint": "You need a @dur attribute with a value of 4 on second note."} ] }, + { + "label": "Beams", + "editorLines": 12, + "descFile": "102_march_step-06-desc.html", + "prefillFile": "102_march_step-06-prefill.xml", + "xmlFile": "102_march_step-06.xml", + "xpaths": [ + {"rule": "count(//mei:measure) = 2", "renderanyway": false, "hint": "You need a measure element."}, + {"rule": "count(//mei:measure[2]/@*) = 1", "renderanyway": false, "hint": "You need one attribute on measure (@n)."}, + {"rule": "//mei:measure[2]/@n = 1", "renderanyway": false, "hint": "You need a @n attribute with a value of 1 on measure."}, + {"rule": "//mei:measure[2]/mei:staff", "renderanyway": false, "hint": "You need a staff in measure element."}, + {"rule": "count(//mei:measure[2]/mei:staff/@*) = 1", "renderanyway": false, "hint": "You need one attribute on staff (@n)."}, + {"rule": "//mei:measure[2]/mei:staff/@n = 1", "renderanyway": false, "hint": "You need a @n attribute with a value of 1 on staff."}, + {"rule": "//mei:measure[2]/mei:staff/mei:layer", "renderanyway": false, "hint": "You need a layer element in staff element."}, + {"rule": "count(//mei:layer/@*) = 0", "renderanyway": false, "hint": "You need no attribute on the layer element."}, + {"rule": "//mei:measure[2]/mei:staff/mei:layer/mei:note[1]", "renderanyway": false, "hint": "First note element has to be a child of layer element."}, + {"rule": "count(//mei:measure[2]/mei:staff/mei:layer/mei:note[1]/@*) = 3", "renderanyway": false, "hint": "You need three attributes on the first note (@pname, @oct & @dur)."}, + {"rule": "//mei:measure[2]/mei:staff/mei:layer/mei:note[1]/@pname = 'e'", "renderanyway": false, "hint": "You need a @pname attribute with a value of e on first note element."}, + {"rule": "//mei:measure[2]/mei:staff/mei:layer/mei:note[1]/@oct = '4'", "renderanyway": false, "hint": "You need an @oct attribute with a value of 4 on first note."}, + {"rule": "//mei:measure[2]/mei:staff/mei:layer/mei:note[1]/@dur = '4'", "renderanyway": false, "hint": "You need a @dur attribute with a value of 4 on first note."}, + {"rule": "count(//mei:beam) = '1'", "renderanyway": false, "hint": "You need one beam element."}, + {"rule": "//mei:layer/mei:beam", "renderanyway": false, "hint": "beam element has to be a child of layer element."}, + {"rule": "//mei:layer/mei:note/following-sibling::mei:beam", "renderanyway": false, "hint": "beam element has to follow note element."}, + {"rule": "count(//mei:layer/mei:note/following-sibling::*) = 1", "renderanyway": false, "hint": "You need only one element to follow note element."}, + {"rule": "count(//mei:beam/@*) = 0", "renderanyway": false, "hint": "You need no attribute on the beam element."}, + {"rule": "count(//mei:beam/mei:note) = 2", "renderanyway": false, "hint": "You need two note elements inside beam element."}, + {"rule": "count(//mei:beam/mei:note[1]/@*) = 3", "renderanyway": false, "hint": "You need three attributes on the first beamed note (@pname, @oct & @dur)."}, + {"rule": "//mei:beam/mei:note[1]/@pname = 'e'", "renderanyway": false, "hint": "You need a @pname attribute with a value of e on the first beamed note."}, + {"rule": "//mei:beam/mei:note[1]/@oct = '4'", "renderanyway": false, "hint": "You need an @oct attribute with a value of 4 on the first beamed note."}, + {"rule": "//mei:beam/mei:note[1]/@dur = '8'", "renderanyway": false, "hint": "You need a @dur attribute with a value of 8 on the first beamed note."}, + {"rule": "count(//mei:beam/mei:note[2]/@*) = 3", "renderanyway": false, "hint": "You need three attributes on the second beamed note (@pname, @oct & @dur)."}, + {"rule": "//mei:beam/mei:note[2]/@pname = 'g'", "renderanyway": false, "hint": "You need a @pname attribute with a value of g on second beamed note."}, + {"rule": "//mei:beam/mei:note[2]/@oct = '4'", "renderanyway": false, "hint": "You need an @oct attribute with a value of 4 on second beamed note."}, + {"rule": "//mei:beam/mei:note[2]/@dur = '8'", "renderanyway": false, "hint": "You need a @dur attribute with a value of 8 on second beamed note."} + ] + }, } ], "outro": "Congratulations, you've successfully finished this tutorial!" diff --git a/_tutorials/102_march/step-06/102_march_step-06-desc.html b/_tutorials/102_march/step-06/102_march_step-06-desc.html new file mode 100644 index 00000000..cc0434b1 --- /dev/null +++ b/_tutorials/102_march/step-06/102_march_step-06-desc.html @@ -0,0 +1,7 @@ +
+

In this step you will encode a beamed group of notes.

+ +

To group notes under a beam within a measure, the <beam> element is to be used. The <beam> element is a container for a series of explicitly beamed events that begins and ends entirely within a measure.

+ +

In the editor below, please add a <beam> element at the specified position before adding the two child <note>'s separately (e flat and g).

+
\ No newline at end of file diff --git a/_tutorials/102_march/step-06/102_march_step-06-prefill.xml b/_tutorials/102_march/step-06/102_march_step-06-prefill.xml new file mode 100644 index 00000000..79d5ee32 --- /dev/null +++ b/_tutorials/102_march/step-06/102_march_step-06-prefill.xml @@ -0,0 +1,8 @@ + + + + + + + + \ No newline at end of file diff --git a/_tutorials/102_march/step-06/102_march_step-06.xml b/_tutorials/102_march/step-06/102_march_step-06.xml new file mode 100644 index 00000000..e99398b6 --- /dev/null +++ b/_tutorials/102_march/step-06/102_march_step-06.xml @@ -0,0 +1,47 @@ + + + + + March + + + + + + + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + + +
+ +
+
+ +
+
From 6f63fc6a4f13e6427fe93f59a89e012a98eb4888 Mon Sep 17 00:00:00 2001 From: "Stefan@Lap" Date: Thu, 22 Nov 2018 00:43:08 +0100 Subject: [PATCH 04/13] feat(tutorials): add step 7 of march tutorial --- _tutorials/102_march/102_march.json | 49 +++++++++++++++++++ .../step-07/102_march_step-07-desc.html | 7 +++ .../step-07/102_march_step-07-prefill.xml | 12 +++++ .../102_march/step-07/102_march_step-07.xml | 49 +++++++++++++++++++ 4 files changed, 117 insertions(+) create mode 100644 _tutorials/102_march/step-07/102_march_step-07-desc.html create mode 100644 _tutorials/102_march/step-07/102_march_step-07-prefill.xml create mode 100644 _tutorials/102_march/step-07/102_march_step-07.xml diff --git a/_tutorials/102_march/102_march.json b/_tutorials/102_march/102_march.json index cd03ad90..136d9ff0 100644 --- a/_tutorials/102_march/102_march.json +++ b/_tutorials/102_march/102_march.json @@ -155,6 +155,55 @@ {"rule": "//mei:beam/mei:note[2]/@dur = '8'", "renderanyway": false, "hint": "You need a @dur attribute with a value of 8 on second beamed note."} ] }, + { + "label": "Dotted rhythm", + "editorLines": 14, + "descFile": "102_march_step-07-desc.html", + "prefillFile": "102_march_step-07-prefill.xml", + "xmlFile": "102_march_step-07.xml", + "xpaths": [ + {"rule": "count(//mei:measure) = 2", "renderanyway": false, "hint": "You need a measure element."}, + {"rule": "count(//mei:measure[2]/@*) = 1", "renderanyway": false, "hint": "You need one attribute on the measure (@n)."}, + {"rule": "//mei:measure[2]/@n = 1", "renderanyway": false, "hint": "You need a @n attribute with a value of 1 on measure."}, + {"rule": "//mei:measure[2]/mei:staff", "renderanyway": false, "hint": "You need a staff in measure element."}, + {"rule": "count(//mei:measure[2]/mei:staff/@*) = 1", "renderanyway": false, "hint": "You need one attribute on staff (@n)."}, + {"rule": "//mei:measure[2]/mei:staff/@n = 1", "renderanyway": false, "hint": "You need a @n attribute with a value of 1 on staff."}, + {"rule": "//mei:measure[2]/mei:staff/mei:layer", "renderanyway": false, "hint": "You need a layer element in staff element."}, + {"rule": "count(//mei:layer/@*) = 0", "renderanyway": false, "hint": "You need no attribute on the layer element."}, + {"rule": "//mei:measure[2]/mei:staff/mei:layer/mei:note[1]", "renderanyway": false, "hint": "First note element has to be a child of layer element."}, + {"rule": "count(//mei:measure[2]/mei:staff/mei:layer/mei:note[1]/@*) = 3", "renderanyway": false, "hint": "You need three attributes on the first note (@pname, @oct & @dur)."}, + {"rule": "//mei:measure[2]/mei:staff/mei:layer/mei:note[1]/@pname = 'e'", "renderanyway": false, "hint": "You need a @pname attribute with a value of e on first note element."}, + {"rule": "//mei:measure[2]/mei:staff/mei:layer/mei:note[1]/@oct = '4'", "renderanyway": false, "hint": "You need an @oct attribute with a value of 4 on first note."}, + {"rule": "//mei:measure[2]/mei:staff/mei:layer/mei:note[1]/@dur = '4'", "renderanyway": false, "hint": "You need a @dur attribute with a value of 4 on first note."}, + {"rule": "count(//mei:beam) = '1'", "renderanyway": false, "hint": "You need one beam element."}, + {"rule": "//mei:layer/mei:beam", "renderanyway": false, "hint": "beam element has to be a child of layer element."}, + {"rule": "//mei:layer/mei:note/following-sibling::mei:beam", "renderanyway": false, "hint": "beam element has to follow note element."}, + {"rule": "count(//mei:beam/@*) = 0", "renderanyway": false, "hint": "You need no attribute on the beam element."}, + {"rule": "count(//mei:beam/mei:note) = 2", "renderanyway": false, "hint": "You need two note elements inside beam element."}, + {"rule": "count(//mei:beam/mei:note[1]/@*) = 3", "renderanyway": false, "hint": "You need three attributes on the first beamed note (@pname, @oct & @dur)."}, + {"rule": "//mei:beam/mei:note[1]/@pname = 'e'", "renderanyway": false, "hint": "You need a @pname attribute with a value of e on the first beamed note."}, + {"rule": "//mei:beam/mei:note[1]/@oct = '4'", "renderanyway": false, "hint": "You need an @oct attribute with a value of 4 on the first beamed note."}, + {"rule": "//mei:beam/mei:note[1]/@dur = '8'", "renderanyway": false, "hint": "You need a @dur attribute with a value of 8 on the first beamed note."}, + {"rule": "count(//mei:beam/mei:note[2]/@*) = 3", "renderanyway": false, "hint": "You need three attributes on the second beamed note (@pname, @oct & @dur)."}, + {"rule": "//mei:beam/mei:note[2]/@pname = 'g'", "renderanyway": false, "hint": "You need a @pname attribute with a value of g on second beamed note."}, + {"rule": "//mei:beam/mei:note[2]/@oct = '4'", "renderanyway": false, "hint": "You need an @oct attribute with a value of 4 on second beamed note."}, + {"rule": "//mei:beam/mei:note[2]/@dur = '8'", "renderanyway": false, "hint": "You need a @dur attribute with a value of 8 on second beamed note."}, + {"rule": "count(//mei:measure[2]/mei:staff/mei:layer/mei:note) = 3", "renderanyway": false, "hint": "You need three note elements in this measure's layer altogether."}, + {"rule": "//mei:layer/mei:beam/following-sibling::mei:note", "renderanyway": false, "hint": "One note element has to follow beam element."}, + {"rule": "//mei:layer/mei:beam/following-sibling::mei:note/following-sibling::mei:note", "renderanyway": false, "hint": "Another note element has to follow the note after beam element."}, + {"rule": "count(//mei:layer/mei:note/following-sibling::*) = 3", "renderanyway": false, "hint": "You need three elements to follow the first note element."}, + {"rule": "count(//mei:measure[2]/mei:staff/mei:layer/mei:note[2]/@*) = 4", "renderanyway": false, "hint": "You need four attributes on second added note (@pname, @oct, @dur & @dots)."}, + {"rule": "//mei:measure[2]/mei:staff/mei:layer/mei:note[2]/@pname = 'f'", "renderanyway": false, "hint": "You need a @pname attribute with a value of f on second added note."}, + {"rule": "//mei:measure[2]/mei:staff/mei:layer/mei:note[2]/@oct = '4'", "renderanyway": false, "hint": "You need an @oct attribute with a value of 4 on second added note."}, + {"rule": "//mei:measure[2]/mei:staff/mei:layer/mei:note[2]/@dur = '4'", "renderanyway": false, "hint": "You need a @dur attribute with a value of 4 on second added note."}, + {"rule": "//mei:measure[2]/mei:staff/mei:layer/mei:note[2]/@dots = '1'", "renderanyway": false, "hint": "You need a @dots attribute with a value of 1 on second added note."}, + {"rule": "//mei:measure[2]/mei:staff/mei:layer/mei:note[3]", "renderanyway": false, "hint": "Second added note has to be a child of layer element."}, + {"rule": "count(//mei:measure[2]/mei:staff/mei:layer/mei:note[3]/@*) = 3", "renderanyway": false, "hint": "You need three attributes on second added note (@pname, @oct & @dur)."}, + {"rule": "//mei:measure[2]/mei:staff/mei:layer/mei:note[3]/@pname = 'd'", "renderanyway": false, "hint": "You need a @pname attribute with a value of d on second added note."}, + {"rule": "//mei:measure[2]/mei:staff/mei:layer/mei:note[3]/@oct = '4'", "renderanyway": false, "hint": "You need an @oct attribute with a value of 4 on second added note."}, + {"rule": "//mei:measure[2]/mei:staff/mei:layer/mei:note[3]/@dur = '8'", "renderanyway": false, "hint": "You need a @dur attribute with a value of 8 on second added note."} + ] + }, } ], "outro": "Congratulations, you've successfully finished this tutorial!" diff --git a/_tutorials/102_march/step-07/102_march_step-07-desc.html b/_tutorials/102_march/step-07/102_march_step-07-desc.html new file mode 100644 index 00000000..0f51a30f --- /dev/null +++ b/_tutorials/102_march/step-07/102_march_step-07-desc.html @@ -0,0 +1,7 @@ +
+

In this step you will learn to encode dotted durations.

+ +

To encode a dotted rhythm, you need to use a @dots attribute on <note> element and set the number of dots as the attribute's value, e.g. “1” or “2”.

+ +

Please encode the rest of the measure (n=1) in the editor below by adding two <note> elements with different rhythmic values (dotted quarter, eighth) next to the <beam> element.

+
\ No newline at end of file diff --git a/_tutorials/102_march/step-07/102_march_step-07-prefill.xml b/_tutorials/102_march/step-07/102_march_step-07-prefill.xml new file mode 100644 index 00000000..fb245e7f --- /dev/null +++ b/_tutorials/102_march/step-07/102_march_step-07-prefill.xml @@ -0,0 +1,12 @@ + + + + + + + + + + + + \ No newline at end of file diff --git a/_tutorials/102_march/step-07/102_march_step-07.xml b/_tutorials/102_march/step-07/102_march_step-07.xml new file mode 100644 index 00000000..7150b10d --- /dev/null +++ b/_tutorials/102_march/step-07/102_march_step-07.xml @@ -0,0 +1,49 @@ + + + + + March + + + + + + + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + + + + +
+ +
+
+ +
+
From 5e7606ffa6db9535b267ec205d5e26cc937096ab Mon Sep 17 00:00:00 2001 From: "Stefan@Lap" Date: Thu, 22 Nov 2018 00:43:35 +0100 Subject: [PATCH 05/13] feat(tutorials): add step 8 of march tutorial --- _tutorials/102_march/102_march.json | 50 +++++++++++++++ .../step-08/102_march_step-08-desc.html | 5 ++ .../step-08/102_march_step-08-prefill.xml | 1 + .../102_march/step-08/102_march_step-08.xml | 62 +++++++++++++++++++ 4 files changed, 118 insertions(+) create mode 100644 _tutorials/102_march/step-08/102_march_step-08-desc.html create mode 100644 _tutorials/102_march/step-08/102_march_step-08-prefill.xml create mode 100644 _tutorials/102_march/step-08/102_march_step-08.xml diff --git a/_tutorials/102_march/102_march.json b/_tutorials/102_march/102_march.json index 136d9ff0..7cb9f508 100644 --- a/_tutorials/102_march/102_march.json +++ b/_tutorials/102_march/102_march.json @@ -204,6 +204,56 @@ {"rule": "//mei:measure[2]/mei:staff/mei:layer/mei:note[3]/@dur = '8'", "renderanyway": false, "hint": "You need a @dur attribute with a value of 8 on second added note."} ] }, + { + "label": "A full measure", + "editorLines": 14, + "descFile": "102_march_step-08-desc.html", + "prefillFile": "102_march_step-08-prefill.xml", + "xmlFile": "102_march_step-08.xml", + "xpaths": [ + {"rule": "count(//mei:measure) = 3", "renderanyway": false, "hint": "You need one measure element."}, + {"rule": "count(//mei:measure[3]/@*) = 1", "renderanyway": false, "hint": "You need one attribute on measure (@n)."}, + {"rule": "//mei:measure[3]/@n = 2", "renderanyway": false, "hint": "You need a @n attribute with a value of 2 on measure."}, + {"rule": "//mei:measure[3]/mei:staff", "renderanyway": false, "hint": "You need a staff element in measure element."}, + {"rule": "count(//mei:measure[3]/mei:staff/@*) = 1", "renderanyway": false, "hint": "You need one attribute on staff (@n)."}, + {"rule": "//mei:measure[3]/mei:staff/@n = 1", "renderanyway": false, "hint": "You need a @n attribute with a value of 1 on staff."}, + {"rule": "//mei:measure[3]/mei:staff/mei:layer", "renderanyway": false, "hint": "You need a layer element in staff element."}, + {"rule": "count(//mei:layer/@*) = 0", "renderanyway": false, "hint": "You need no attribute on the layer element."}, + {"rule": "//mei:measure[3]/mei:staff/mei:layer/mei:note[1]", "renderanyway": false, "hint": "First note element has to be child of layer element."}, + {"rule": "count(//mei:measure[3]/mei:staff/mei:layer/mei:note[1]/@*) = 3", "renderanyway": false, "hint": "You need three attributes on first note element(@pname, @oct & @dur)."}, + {"rule": "//mei:measure[3]/mei:staff/mei:layer/mei:note[1]/@pname = 'e'", "renderanyway": false, "hint": "You need a @pname attribute with a value of e on first note element."}, + {"rule": "//mei:measure[3]/mei:staff/mei:layer/mei:note[1]/@oct = '4'", "renderanyway": false, "hint": "You need an @oct attribute with a value of 4 on first note element."}, + {"rule": "//mei:measure[3]/mei:staff/mei:layer/mei:note[1]/@dur = '4'", "renderanyway": false, "hint": "You need a @dur attribute with a value of 4 on first note element."}, + {"rule": "count(//mei:measure[3]/mei:staff/mei:layer/mei:beam) = '1'", "renderanyway": false, "hint": "You need one beam element."}, + {"rule": "//mei:measure[3]/mei:staff/mei:layer/mei:beam", "renderanyway": false, "hint": "beam element has to be a child of layer element."}, + {"rule": "//mei:measure[3]/mei:staff/mei:layer/mei:note/following-sibling::mei:beam", "renderanyway": false, "hint": "beam element has to follow note element."}, + {"rule": "count(//mei:beam/@*) = 0", "renderanyway": false, "hint": "You need no attribute on the beam element."}, + {"rule": "count(//mei:measure[3]/mei:staff/mei:layer/mei:beam/mei:note) = 2", "renderanyway": false, "hint": "You need two note elements inside beam element."}, + {"rule": "count(//mei:measure[3]/mei:staff/mei:layer/mei:beam/mei:note[1]/@*) = 3", "renderanyway": false, "hint": "You need three attributes on the first beamed note (@pname, @oct & @dur)."}, + {"rule": "//mei:measure[3]/mei:staff/mei:layer/mei:beam/mei:note[1]/@pname = 'e'", "renderanyway": false, "hint": "You need a @pname attribute with a value of e on the first beamed note."}, + {"rule": "//mei:measure[3]/mei:staff/mei:layer/mei:beam/mei:note[1]/@oct = '4'", "renderanyway": false, "hint": "You need an @oct attribute with a value of 4 on the first beamed note."}, + {"rule": "//mei:measure[3]/mei:staff/mei:layer/mei:beam/mei:note[1]/@dur = '8'", "renderanyway": false, "hint": "You need a @dur attribute with a value of 8 on the first beamed note."}, + {"rule": "count(//mei:measure[3]/mei:staff/mei:layer/mei:beam/mei:note[2]/@*) = 3", "renderanyway": false, "hint": "You need three attributes on the second beamed note (@pname, @oct & @dur)."}, + {"rule": "//mei:measure[3]/mei:staff/mei:layer/mei:beam/mei:note[2]/@pname = 'g'", "renderanyway": false, "hint": "You need a @pname attribute with a value of g on second beamed note."}, + {"rule": "//mei:measure[3]/mei:staff/mei:layer/mei:beam/mei:note[2]/@oct = '4'", "renderanyway": false, "hint": "You need an @oct attribute with a value of 4 on second beamed note."}, + {"rule": "//mei:measure[3]/mei:staff/mei:layer/mei:beam/mei:note[2]/@dur = '8'", "renderanyway": false, "hint": "You need a @dur attribute with a value of 8 on second beamed note."}, + {"rule": "count(//mei:measure[3]/mei:staff/mei:layer/mei:note) = 3", "renderanyway": false, "hint": "You need three note elements in this measure's layer altogether."}, + {"rule": "//mei:measure[3]/mei:staff/mei:layer/mei:beam/following-sibling::mei:note", "renderanyway": false, "hint": "One note element has to follow beam element."}, + {"rule": "//mei:measure[3]/mei:staff/mei:layer/mei:beam/following-sibling::mei:note/following-sibling::mei:note", "renderanyway": false, "hint": "Another note element has to follow the note after beam element."}, + {"rule": "count(//mei:measure[3]/mei:staff/mei:layer/mei:note/following-sibling::*) = 3", "renderanyway": false, "hint": "You need three elements to follow the first note element."}, + {"rule": "//mei:measure[3]/mei:staff/mei:layer/mei:note[2]", "renderanyway": false, "hint": "Second note element has to be a child of layer element."}, + {"rule": "count(//mei:measure[3]/mei:staff/mei:layer/mei:note[2]/@*) = 4", "renderanyway": false, "hint": "You need four attributes on the second note element (@pname, @oct, @dur & @dots)."}, + {"rule": "//mei:measure[3]/mei:staff/mei:layer/mei:note[2]/@pname = 'b'", "renderanyway": false, "hint": "You need a @pname attribute with a value of b on the second note element."}, + {"rule": "//mei:measure[3]/mei:staff/mei:layer/mei:note[2]/@oct = '4'", "renderanyway": false, "hint": "You need an @oct attribute with a value of 4 on the second note element."}, + {"rule": "//mei:measure[3]/mei:staff/mei:layer/mei:note[2]/@dur = '4'", "renderanyway": false, "hint": "You need a @dur attribute with a value of 4 on the second note element."}, + {"rule": "//mei:measure[3]/mei:staff/mei:layer/mei:note[2]/@dots = '1'", "renderanyway": false, "hint": "You need a @dots attribute with a value of 1 on the second note element."}, + {"rule": "//mei:measure[3]/mei:staff/mei:layer/mei:note[3]", "renderanyway": false, "hint": "Third note element has to be a child of layer element."}, + {"rule": "count(//mei:measure[3]/mei:staff/mei:layer/mei:note[3]/@*) = 3", "renderanyway": false, "hint": "You need three attributes on third note element (@pname, @oct & @dur)."}, + {"rule": "//mei:measure[3]/mei:staff/mei:layer/mei:note[3]/@pname = 'g'", "renderanyway": false, "hint": "You need a @pname attribute with a value of g on third note element."}, + {"rule": "//mei:measure[3]/mei:staff/mei:layer/mei:note[3]/@oct = '4'", "renderanyway": false, "hint": "You need an @oct attribute with a value of 4 on third note element."}, + {"rule": "//mei:measure[3]/mei:staff/mei:layer/mei:note[3]/@dur = '8'", "renderanyway": false, "hint": "You need a @dur attribute with a value of 8 on third note element."} + ] + }, } ], "outro": "Congratulations, you've successfully finished this tutorial!" diff --git a/_tutorials/102_march/step-08/102_march_step-08-desc.html b/_tutorials/102_march/step-08/102_march_step-08-desc.html new file mode 100644 index 00000000..746395ef --- /dev/null +++ b/_tutorials/102_march/step-08/102_march_step-08-desc.html @@ -0,0 +1,5 @@ +
+

Ok, let's encode the complete next measure to repeat all the things you've learned in the previous steps.

+ +

Please encode the next measure (n=2) in the editor below. Add a staff and layer element which contains 4 child elements: a quarter <note>, a <beam> with to eighth <note>'s and a dotted quarter <note> with an eighth <note>.

+
\ No newline at end of file diff --git a/_tutorials/102_march/step-08/102_march_step-08-prefill.xml b/_tutorials/102_march/step-08/102_march_step-08-prefill.xml new file mode 100644 index 00000000..81bd1e18 --- /dev/null +++ b/_tutorials/102_march/step-08/102_march_step-08-prefill.xml @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/_tutorials/102_march/step-08/102_march_step-08.xml b/_tutorials/102_march/step-08/102_march_step-08.xml new file mode 100644 index 00000000..0e3ef676 --- /dev/null +++ b/_tutorials/102_march/step-08/102_march_step-08.xml @@ -0,0 +1,62 @@ + + + + + March + + + + + + + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+
+ +
+
From dbe6d086007b9e47eb08edf6f7500a65d9938536 Mon Sep 17 00:00:00 2001 From: "Stefan@Lap" Date: Thu, 22 Nov 2018 00:43:58 +0100 Subject: [PATCH 06/13] feat(tutorials): add step 9 of march tutorial --- _tutorials/102_march/102_march.json | 70 +++++++++++++++ .../step-09/102_march_step-09-desc.html | 9 ++ .../step-09/102_march_step-09-prefill.xml | 1 + .../102_march/step-09/102_march_step-09.xml | 88 +++++++++++++++++++ 4 files changed, 168 insertions(+) create mode 100644 _tutorials/102_march/step-09/102_march_step-09-desc.html create mode 100644 _tutorials/102_march/step-09/102_march_step-09-prefill.xml create mode 100644 _tutorials/102_march/step-09/102_march_step-09.xml diff --git a/_tutorials/102_march/102_march.json b/_tutorials/102_march/102_march.json index 7cb9f508..7f6635c4 100644 --- a/_tutorials/102_march/102_march.json +++ b/_tutorials/102_march/102_march.json @@ -254,6 +254,76 @@ {"rule": "//mei:measure[3]/mei:staff/mei:layer/mei:note[3]/@dur = '8'", "renderanyway": false, "hint": "You need a @dur attribute with a value of 8 on third note element."} ] }, + { + "label": "Final two measures", + "editorLines": 14, + "descFile": "102_march_step-09-desc.html", + "prefillFile": "102_march_step-09-prefill.xml", + "xmlFile": "102_march_step-09.xml", + "xpaths": [ + {"rule": "count(//mei:measure) = 5", "renderanyway": false, "hint": "You need two measure elements."}, + {"rule": "//mei:measure[4]/following-sibling::mei:measure", "renderanyway": false, "hint": "Measures have to follow each other."}, + {"rule": "count(//mei:measure[4]/@*) = 1", "renderanyway": false, "hint": "You need one attribute on the first measure element (@n)."}, + {"rule": "//mei:measure[4]/@n = 3", "renderanyway": false, "hint": "You need a @n attribute with a value of 3 on the first measure element."}, + {"rule": "count(//mei:measure[5]/@*) = 1", "renderanyway": false, "hint": "You need one attribute on the second measure element (@n)."}, + {"rule": "//mei:measure[5]/@n = 4", "renderanyway": false, "hint": "You need a @n attribute with a value of 4 on the second measure element."}, + {"rule": "//mei:measure[4]/mei:staff", "renderanyway": false, "hint": "You need a staff element inside first measure element."}, + {"rule": "count(//mei:measure[4]/mei:staff/@*) = 1", "renderanyway": false, "hint": "You need one attribute on staff (@n)."}, + {"rule": "//mei:measure[4]/mei:staff/@n = 1", "renderanyway": false, "hint": "You need a @n attribute with a value of 1 on staff."}, + {"rule": "//mei:measure[5]/mei:staff", "renderanyway": false, "hint": "You need a staff element inside second measure element."}, + {"rule": "count(//mei:measure[5]/mei:staff/@*) = 1", "renderanyway": false, "hint": "You need one attribute on staff (@n)."}, + {"rule": "//mei:measure[5]/mei:staff/@n = 1", "renderanyway": false, "hint": "You need a @n attribute with a value of 1 on staff."}, + {"rule": "//mei:measure[4]/mei:staff/mei:layer", "renderanyway": false, "hint": "Measure n=3: You need a layer element inside staff."}, + {"rule": "//mei:measure[5]/mei:staff/mei:layer", "renderanyway": false, "hint": "Measure n=4: You need a layer element inside staff."}, + {"rule": "count(//mei:layer/@*) = 0", "renderanyway": false, "hint": "You need no attribute on the layer elements."}, + {"rule": "count(//mei:measure[4]/mei:staff/mei:layer/mei:beam) = '2'", "renderanyway": false, "hint": "Measure n=3: You need two beam elements as children of layer."}, + {"rule": "count(//mei:measure[4]/mei:staff/mei:layer/mei:note) = '1'", "renderanyway": false, "hint": "Measure n=3: You need one note element as child of layer."}, + {"rule": "//mei:measure[4]/mei:staff/mei:layer/mei:beam[1]/following-sibling::mei:note/following-sibling::mei:beam", "renderanyway": false, "hint": "Measure n=3: Note element has to be placed between the two beam elements."}, + {"rule": "count(//mei:beam/@*) = 0", "renderanyway": false, "hint": "You need no attribute on the beam elements."}, + {"rule": "count(//mei:measure[4]/mei:staff/mei:layer/mei:note/@*) = 3", "renderanyway": false, "hint": "Measure n=3: You need three attributes on the note element (@pname, @oct & @dur)."}, + {"rule": "//mei:measure[4]/mei:staff/mei:layer/mei:note/@pname = 'e'", "renderanyway": false, "hint": "Measure n=3: You need a @pname attribute with a value of e on note element."}, + {"rule": "//mei:measure[4]/mei:staff/mei:layer/mei:note/@oct = '5'", "renderanyway": false, "hint": "Measure n=3: You need an @oct attribute with a value of 5 on note element."}, + {"rule": "//mei:measure[4]/mei:staff/mei:layer/mei:note/@dur = '4'", "renderanyway": false, "hint": "Measure n=3: You need a @dur attribute with a value of 4 on note element."}, + {"rule": "count(//mei:measure[4]/mei:staff/mei:layer/mei:beam[1]/mei:note) = 4", "renderanyway": false, "hint": "Measure n=3: You need four note elements inside the first beam element."}, + {"rule": "count(//mei:measure[4]/mei:staff/mei:layer/mei:beam[1]/mei:note[1]/@*) = 3", "renderanyway": false, "hint": "Measure n=3: You need three attributes on the first beamed note (@pname, @oct & @dur)."}, + {"rule": "//mei:measure[4]/mei:staff/mei:layer/mei:beam[1]/mei:note[1]/@pname = 'a'", "renderanyway": false, "hint": "Measure n=3: You need a @pname attribute with a value of a on the first beamed note."}, + {"rule": "//mei:measure[4]/mei:staff/mei:layer/mei:beam[1]/mei:note[1]/@oct = '4'", "renderanyway": false, "hint": "Measure n=3: You need an @oct attribute with a value of 4 on the first beamed note."}, + {"rule": "//mei:measure[4]/mei:staff/mei:layer/mei:beam[1]/mei:note[1]/@dur = '8'", "renderanyway": false, "hint": "Measure n=3: You need a @dur attribute with a value of 8 on the first beamed note."}, + {"rule": "count(//mei:measure[4]/mei:staff/mei:layer/mei:beam[1]/mei:note[2]/@*) = 3", "renderanyway": false, "hint": "Measure n=3: You need three attributes on the second beamed note (@pname, @oct & @dur)."}, + {"rule": "//mei:measure[4]/mei:staff/mei:layer/mei:beam[1]/mei:note[2]/@pname = 'b'", "renderanyway": false, "hint": "Measure n=3: You need a @pname attribute with a value of b on the second beamed note."}, + {"rule": "//mei:measure[4]/mei:staff/mei:layer/mei:beam[1]/mei:note[2]/@oct = '4'", "renderanyway": false, "hint": "Measure n=3: You need an @oct attribute with a value of 4 on the second beamed note."}, + {"rule": "//mei:measure[4]/mei:staff/mei:layer/mei:beam[1]/mei:note[2]/@dur = '8'", "renderanyway": false, "hint": "Measure n=3: You need a @dur attribute with a value of 8 on the second beamed note."}, + {"rule": "count(//mei:measure[4]/mei:staff/mei:layer/mei:beam[1]/mei:note[3]/@*) = 3", "renderanyway": false, "hint": "Measure n=3: You need three attributes on the third beamed note (@pname, @oct & @dur)."}, + {"rule": "//mei:measure[4]/mei:staff/mei:layer/mei:beam[1]/mei:note[3]/@pname = 'c'", "renderanyway": false, "hint": "Measure n=3: You need a @pname attribute with a value of c on the third beamed note."}, + {"rule": "//mei:measure[4]/mei:staff/mei:layer/mei:beam[1]/mei:note[3]/@oct = '5'", "renderanyway": false, "hint": "Measure n=3: You need an @oct attribute with a value of 5 on the third beamed note."}, + {"rule": "//mei:measure[4]/mei:staff/mei:layer/mei:beam[1]/mei:note[3]/@dur = '8'", "renderanyway": false, "hint": "Measure n=3: You need a @dur attribute with a value of 8 on the third beamed note."}, + {"rule": "count(//mei:measure[4]/mei:staff/mei:layer/mei:beam[1]/mei:note[4]/@*) = 3", "renderanyway": false, "hint": "Measure n=3: You need three attributes on the fourth beamed note (@pname, @oct & @dur)."}, + {"rule": "//mei:measure[4]/mei:staff/mei:layer/mei:beam[1]/mei:note[4]/@pname = 'd'", "renderanyway": false, "hint": "Measure n=3: You need a @pname attribute with a value of d on the fourth beamed note."}, + {"rule": "//mei:measure[4]/mei:staff/mei:layer/mei:beam[1]/mei:note[4]/@oct = '5'", "renderanyway": false, "hint": "Measure n=3: You need an @oct attribute with a value of 5 on the fourth beamed note."}, + {"rule": "//mei:measure[4]/mei:staff/mei:layer/mei:beam[1]/mei:note[4]/@dur = '8'", "renderanyway": false, "hint": "Measure n=3: You need a @dur attribute with a value of 8 on the fourth beamed note."}, + {"rule": "count(//mei:measure[4]/mei:staff/mei:layer/mei:beam[2]/mei:note) = 2", "renderanyway": false, "hint": "Measure n=3: You need two note elements inside the second beam element."}, + {"rule": "count(//mei:measure[4]/mei:staff/mei:layer/mei:beam[2]/mei:note[1]/@*) = 3", "renderanyway": false, "hint": "Measure n=3: You need three attributes on the first beamed note (@pname, @oct & @dur)."}, + {"rule": "//mei:measure[4]/mei:staff/mei:layer/mei:beam[2]/mei:note[1]/@pname = 'd'", "renderanyway": false, "hint": "Measure n=3: You need a @pname attribute with a value of d on the first beamed note."}, + {"rule": "//mei:measure[4]/mei:staff/mei:layer/mei:beam[2]/mei:note[1]/@oct = '5'", "renderanyway": false, "hint": "Measure n=3: You need an @oct attribute with a value of 5 on the first beamed note."}, + {"rule": "//mei:measure[4]/mei:staff/mei:layer/mei:beam[2]/mei:note[1]/@dur = '8'", "renderanyway": false, "hint": "Measure n=3: You need a @dur attribute with a value of 8 on the first beamed note."}, + {"rule": "count(//mei:measure[4]/mei:staff/mei:layer/mei:beam[2]/mei:note[2]/@*) = 3", "renderanyway": false, "hint": "Measure n=3: You need three attributes on the second beamed note (@pname, @oct & @dur)."}, + {"rule": "//mei:measure[4]/mei:staff/mei:layer/mei:beam[2]/mei:note[2]/@pname = 'b'", "renderanyway": false, "hint": "Measure n=3: You need a @pname attribute with a value of b on the second beamed note."}, + {"rule": "//mei:measure[4]/mei:staff/mei:layer/mei:beam[2]/mei:note[2]/@oct = '4'", "renderanyway": false, "hint": "Measure n=3: You need an @oct attribute with a value of 4 on the second beamed note."}, + {"rule": "//mei:measure[4]/mei:staff/mei:layer/mei:beam[2]/mei:note[2]/@dur = '8'", "renderanyway": false, "hint": "Measure n=3: You need a @dur attribute with a value of 8 on the second beamed note."}, + {"rule": "count(//mei:measure[5]/mei:staff/mei:layer/mei:note) = '2'", "renderanyway": false, "hint": "Measure n=4: You need two note elements as children of layer."}, + {"rule": "count(//mei:measure[5]/mei:staff/mei:layer/mei:rest) = '1'", "renderanyway": false, "hint": "Measure n=4: You need one rest element as child of layer."}, + {"rule": "//mei:measure[5]/mei:staff/mei:layer/mei:note[1]/following-sibling::mei:note/following-sibling::mei:rest", "renderanyway": false, "hint": "Measure n=4: Rest element has to follow the two note elements."}, + {"rule": "count(//mei:measure[5]/mei:staff/mei:layer/mei:note[1]/@*) = 3", "renderanyway": false, "hint": "Measure n=4: You need three attributes on the first note element (@pname, @oct & @dur)."}, + {"rule": "//mei:measure[5]/mei:staff/mei:layer/mei:note[1]/@pname = 'c'", "renderanyway": false, "hint": "Measure n=4: You need a @pname attribute with a value of c on the first note element."}, + {"rule": "//mei:measure[5]/mei:staff/mei:layer/mei:note[1]/@oct = '5'", "renderanyway": false, "hint": "Measure n=4: You need an @oct attribute with a value of 5 on the first note element."}, + {"rule": "//mei:measure[5]/mei:staff/mei:layer/mei:note[1]/@dur = '4'", "renderanyway": false, "hint": "Measure n=4: You need a @dur attribute with a value of 4 on the first note element."}, + {"rule": "count(//mei:measure[5]/mei:staff/mei:layer/mei:note[2]/@*) = 3", "renderanyway": false, "hint": "Measure n=4: You need three attributes on the second note element (@pname, @oct & @dur)."}, + {"rule": "//mei:measure[5]/mei:staff/mei:layer/mei:note[2]/@pname = 'b'", "renderanyway": false, "hint": "Measure n=4: You need a @pname attribute with a value of b on the second note element."}, + {"rule": "//mei:measure[5]/mei:staff/mei:layer/mei:note[2]/@oct = '4'", "renderanyway": false, "hint": "Measure n=4: You need an @oct attribute with a value of 4 on the second note element."}, + {"rule": "//mei:measure[5]/mei:staff/mei:layer/mei:note[2]/@dur = '4'", "renderanyway": false, "hint": "Measure n=4: You need a @dur attribute with a value of 4 on the second note element."}, + {"rule": "count(//mei:measure[5]/mei:staff/mei:layer/mei:rest/@*) = 1", "renderanyway": false, "hint": "Measure n=4: You need one attribute on the rest element (@dur)."}, + {"rule": "//mei:measure[5]/mei:staff/mei:layer/mei:rest/@dur = '4'", "renderanyway": false, "hint": "Measure n=4: You need a @dur attribute with a value of 4 on the rest element."} + ] } ], "outro": "Congratulations, you've successfully finished this tutorial!" diff --git a/_tutorials/102_march/step-09/102_march_step-09-desc.html b/_tutorials/102_march/step-09/102_march_step-09-desc.html new file mode 100644 index 00000000..c5bd423d --- /dev/null +++ b/_tutorials/102_march/step-09/102_march_step-09-desc.html @@ -0,0 +1,9 @@ +
+

You should be prepared now to encode the final two measures of the example with their note values.

+ +

Ignore the additional elements, such as dynamics, slurs and accents at this point as they will be adressed in the next steps separately.

+ +

The pause is encoded with a <rest> element having a @dur attribute analogue to the <note> element.

+ +

Please encode the next measure (n=2) in the editor below. Add a staff and layer element which contains 4 child elements: a quarter <note>, a <beam> with to eighth <note>'s and a dotted quarter <note> with an eighth <note>.

+
\ No newline at end of file diff --git a/_tutorials/102_march/step-09/102_march_step-09-prefill.xml b/_tutorials/102_march/step-09/102_march_step-09-prefill.xml new file mode 100644 index 00000000..81bd1e18 --- /dev/null +++ b/_tutorials/102_march/step-09/102_march_step-09-prefill.xml @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/_tutorials/102_march/step-09/102_march_step-09.xml b/_tutorials/102_march/step-09/102_march_step-09.xml new file mode 100644 index 00000000..529fd855 --- /dev/null +++ b/_tutorials/102_march/step-09/102_march_step-09.xml @@ -0,0 +1,88 @@ + + + + + March + + + + + + + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+
+ +
+
From 3a28fadc690c8d1cd00725f97cec08ced7249172 Mon Sep 17 00:00:00 2001 From: "Stefan@Lap" Date: Sat, 24 Nov 2018 21:46:27 +0100 Subject: [PATCH 07/13] feat(tutorials): add step 10 of march tutorial --- _tutorials/102_march/102_march.json | 84 +++++++++++++++++ .../step-10/102_march_step-10-desc.html | 11 +++ .../step-10/102_march_step-10-prefill.xml | 49 ++++++++++ .../102_march/step-10/102_march_step-10.xml | 94 +++++++++++++++++++ 4 files changed, 238 insertions(+) create mode 100644 _tutorials/102_march/step-10/102_march_step-10-desc.html create mode 100644 _tutorials/102_march/step-10/102_march_step-10-prefill.xml create mode 100644 _tutorials/102_march/step-10/102_march_step-10.xml diff --git a/_tutorials/102_march/102_march.json b/_tutorials/102_march/102_march.json index 7f6635c4..3cc16739 100644 --- a/_tutorials/102_march/102_march.json +++ b/_tutorials/102_march/102_march.json @@ -324,6 +324,90 @@ {"rule": "count(//mei:measure[5]/mei:staff/mei:layer/mei:rest/@*) = 1", "renderanyway": false, "hint": "Measure n=4: You need one attribute on the rest element (@dur)."}, {"rule": "//mei:measure[5]/mei:staff/mei:layer/mei:rest/@dur = '4'", "renderanyway": false, "hint": "Measure n=4: You need a @dur attribute with a value of 4 on the rest element."} ] + }, + { + "label": "Articulations", + "editorLines": 50, + "descFile": "102_march_step-10-desc.html", + "prefillFile": "102_march_step-10-prefill.xml", + "xmlFile": "102_march_step-10.xml", + "xpaths": [ + {"rule": "count(//mei:measure) = 5", "renderanyway": false, "hint": "You need two measure elements."}, + {"rule": "//mei:measure[4]/following-sibling::mei:measure", "renderanyway": false, "hint": "Measures have to follow each other."}, + {"rule": "count(//mei:measure[4]/@*) = 1", "renderanyway": false, "hint": "You need one attribute on the first measure element (@n)."}, + {"rule": "//mei:measure[4]/@n = 3", "renderanyway": false, "hint": "You need a @n attribute with a value of 3 on the first measure element."}, + {"rule": "count(//mei:measure[5]/@*) = 1", "renderanyway": false, "hint": "You need one attribute on the second measure element (@n)."}, + {"rule": "//mei:measure[5]/@n = 4", "renderanyway": false, "hint": "You need a @n attribute with a value of 4 on the second measure element."}, + {"rule": "//mei:measure[4]/mei:staff", "renderanyway": false, "hint": "You need a staff element inside first measure element."}, + {"rule": "count(//mei:measure[4]/mei:staff/@*) = 1", "renderanyway": false, "hint": "You need one attribute on staff (@n)."}, + {"rule": "//mei:measure[4]/mei:staff/@n = 1", "renderanyway": false, "hint": "You need a @n attribute with a value of 1 on staff."}, + {"rule": "//mei:measure[5]/mei:staff", "renderanyway": false, "hint": "You need a staff element inside second measure element."}, + {"rule": "count(//mei:measure[5]/mei:staff/@*) = 1", "renderanyway": false, "hint": "You need one attribute on staff (@n)."}, + {"rule": "//mei:measure[5]/mei:staff/@n = 1", "renderanyway": false, "hint": "You need a @n attribute with a value of 1 on staff."}, + {"rule": "//mei:measure[4]/mei:staff/mei:layer", "renderanyway": false, "hint": "Measure n=3: You need a layer element inside staff."}, + {"rule": "//mei:measure[5]/mei:staff/mei:layer", "renderanyway": false, "hint": "Measure n=4: You need a layer element inside staff."}, + {"rule": "count(//mei:layer/@*) = 0", "renderanyway": false, "hint": "You need no attribute on the layer elements."}, + {"rule": "count(//mei:measure[4]/mei:staff/mei:layer/mei:beam) = '2'", "renderanyway": false, "hint": "Measure n=3: You need two beam elements as children of layer."}, + {"rule": "count(//mei:measure[4]/mei:staff/mei:layer/mei:note) = '1'", "renderanyway": false, "hint": "Measure n=3: You need one note element as child of layer."}, + {"rule": "//mei:measure[4]/mei:staff/mei:layer/mei:beam[1]/following-sibling::mei:note/following-sibling::mei:beam", "renderanyway": false, "hint": "Measure n=3: Note element has to be placed between the two beam elements."}, + {"rule": "count(//mei:beam/@*) = 0", "renderanyway": false, "hint": "You need no attribute on the beam elements."}, + {"rule": "count(//mei:measure[4]/mei:staff/mei:layer/mei:note/@*) = 3", "renderanyway": false, "hint": "Measure n=3: You need three attributes on the note element (@pname, @oct & @dur)."}, + {"rule": "//mei:measure[4]/mei:staff/mei:layer/mei:note/@pname = 'e'", "renderanyway": false, "hint": "Measure n=3: You need a @pname attribute with a value of e on note element."}, + {"rule": "//mei:measure[4]/mei:staff/mei:layer/mei:note/@oct = '5'", "renderanyway": false, "hint": "Measure n=3: You need an @oct attribute with a value of 5 on note element."}, + {"rule": "//mei:measure[4]/mei:staff/mei:layer/mei:note/@dur = '4'", "renderanyway": false, "hint": "Measure n=3: You need a @dur attribute with a value of 4 on note element."}, + {"rule": "count(//mei:measure[4]/mei:staff/mei:layer/mei:beam[1]/mei:note) = 4", "renderanyway": false, "hint": "Measure n=3: You need four note elements inside the first beam element."}, + {"rule": "count(//mei:measure[4]/mei:staff/mei:layer/mei:beam[1]/mei:note[1]/@*) = 3", "renderanyway": false, "hint": "Measure n=3: You need three attributes on the first beamed note (@pname, @oct & @dur)."}, + {"rule": "//mei:measure[4]/mei:staff/mei:layer/mei:beam[1]/mei:note[1]/@pname = 'a'", "renderanyway": false, "hint": "Measure n=3: You need a @pname attribute with a value of a on the first beamed note."}, + {"rule": "//mei:measure[4]/mei:staff/mei:layer/mei:beam[1]/mei:note[1]/@oct = '4'", "renderanyway": false, "hint": "Measure n=3: You need an @oct attribute with a value of 4 on the first beamed note."}, + {"rule": "//mei:measure[4]/mei:staff/mei:layer/mei:beam[1]/mei:note[1]/@dur = '8'", "renderanyway": false, "hint": "Measure n=3: You need a @dur attribute with a value of 8 on the first beamed note."}, + {"rule": "count(//mei:measure[4]/mei:staff/mei:layer/mei:beam[1]/mei:note[2]/@*) = 3", "renderanyway": false, "hint": "Measure n=3: You need three attributes on the second beamed note (@pname, @oct & @dur)."}, + {"rule": "//mei:measure[4]/mei:staff/mei:layer/mei:beam[1]/mei:note[2]/@pname = 'b'", "renderanyway": false, "hint": "Measure n=3: You need a @pname attribute with a value of b on the second beamed note."}, + {"rule": "//mei:measure[4]/mei:staff/mei:layer/mei:beam[1]/mei:note[2]/@oct = '4'", "renderanyway": false, "hint": "Measure n=3: You need an @oct attribute with a value of 4 on the second beamed note."}, + {"rule": "//mei:measure[4]/mei:staff/mei:layer/mei:beam[1]/mei:note[2]/@dur = '8'", "renderanyway": false, "hint": "Measure n=3: You need a @dur attribute with a value of 8 on the second beamed note."}, + {"rule": "count(//mei:measure[4]/mei:staff/mei:layer/mei:beam[1]/mei:note[3]/@*) = 3", "renderanyway": false, "hint": "Measure n=3: You need three attributes on the third beamed note (@pname, @oct & @dur)."}, + {"rule": "//mei:measure[4]/mei:staff/mei:layer/mei:beam[1]/mei:note[3]/@pname = 'c'", "renderanyway": false, "hint": "Measure n=3: You need a @pname attribute with a value of c on the third beamed note."}, + {"rule": "//mei:measure[4]/mei:staff/mei:layer/mei:beam[1]/mei:note[3]/@oct = '5'", "renderanyway": false, "hint": "Measure n=3: You need an @oct attribute with a value of 5 on the third beamed note."}, + {"rule": "//mei:measure[4]/mei:staff/mei:layer/mei:beam[1]/mei:note[3]/@dur = '8'", "renderanyway": false, "hint": "Measure n=3: You need a @dur attribute with a value of 8 on the third beamed note."}, + {"rule": "count(//mei:measure[4]/mei:staff/mei:layer/mei:beam[1]/mei:note[4]/@*) = 3", "renderanyway": false, "hint": "Measure n=3: You need three attributes on the fourth beamed note (@pname, @oct & @dur)."}, + {"rule": "//mei:measure[4]/mei:staff/mei:layer/mei:beam[1]/mei:note[4]/@pname = 'd'", "renderanyway": false, "hint": "Measure n=3: You need a @pname attribute with a value of d on the fourth beamed note."}, + {"rule": "//mei:measure[4]/mei:staff/mei:layer/mei:beam[1]/mei:note[4]/@oct = '5'", "renderanyway": false, "hint": "Measure n=3: You need an @oct attribute with a value of 5 on the fourth beamed note."}, + {"rule": "//mei:measure[4]/mei:staff/mei:layer/mei:beam[1]/mei:note[4]/@dur = '8'", "renderanyway": false, "hint": "Measure n=3: You need a @dur attribute with a value of 8 on the fourth beamed note."}, + {"rule": "count(//mei:measure[4]/mei:staff/mei:layer/mei:beam[2]/mei:note) = 2", "renderanyway": false, "hint": "Measure n=3: You need two note elements inside the second beam element."}, + {"rule": "count(//mei:measure[4]/mei:staff/mei:layer/mei:beam[2]/mei:note[1]/@*) = 3", "renderanyway": false, "hint": "Measure n=3: You need three attributes on the first beamed note (@pname, @oct & @dur)."}, + {"rule": "//mei:measure[4]/mei:staff/mei:layer/mei:beam[2]/mei:note[1]/@pname = 'd'", "renderanyway": false, "hint": "Measure n=3: You need a @pname attribute with a value of d on the first beamed note."}, + {"rule": "//mei:measure[4]/mei:staff/mei:layer/mei:beam[2]/mei:note[1]/@oct = '5'", "renderanyway": false, "hint": "Measure n=3: You need an @oct attribute with a value of 5 on the first beamed note."}, + {"rule": "//mei:measure[4]/mei:staff/mei:layer/mei:beam[2]/mei:note[1]/@dur = '8'", "renderanyway": false, "hint": "Measure n=3: You need a @dur attribute with a value of 8 on the first beamed note."}, + {"rule": "count(//mei:measure[4]/mei:staff/mei:layer/mei:beam[2]/mei:note[2]/@*) = 3", "renderanyway": false, "hint": "Measure n=3: You need three attributes on the second beamed note (@pname, @oct & @dur)."}, + {"rule": "//mei:measure[4]/mei:staff/mei:layer/mei:beam[2]/mei:note[2]/@pname = 'b'", "renderanyway": false, "hint": "Measure n=3: You need a @pname attribute with a value of b on the second beamed note."}, + {"rule": "//mei:measure[4]/mei:staff/mei:layer/mei:beam[2]/mei:note[2]/@oct = '4'", "renderanyway": false, "hint": "Measure n=3: You need an @oct attribute with a value of 4 on the second beamed note."}, + {"rule": "//mei:measure[4]/mei:staff/mei:layer/mei:beam[2]/mei:note[2]/@dur = '8'", "renderanyway": false, "hint": "Measure n=3: You need a @dur attribute with a value of 8 on the second beamed note."}, + {"rule": "count(//mei:measure[5]/mei:staff/mei:layer/mei:note) = '2'", "renderanyway": false, "hint": "Measure n=4: You need two note elements as children of layer."}, + {"rule": "count(//mei:measure[5]/mei:staff/mei:layer/mei:rest) = '1'", "renderanyway": false, "hint": "Measure n=4: You need one rest element as child of layer."}, + {"rule": "//mei:measure[5]/mei:staff/mei:layer/mei:note[1]/following-sibling::mei:note/following-sibling::mei:rest", "renderanyway": false, "hint": "Measure n=4: Rest element has to follow the two note elements."}, + {"rule": "count(//mei:measure[5]/mei:staff/mei:layer/mei:note[1]/@*) = 3", "renderanyway": false, "hint": "Measure n=4: You need three attributes on the first note element (@pname, @oct & @dur)."}, + {"rule": "//mei:measure[5]/mei:staff/mei:layer/mei:note[1]/@pname = 'c'", "renderanyway": false, "hint": "Measure n=4: You need a @pname attribute with a value of c on the first note element."}, + {"rule": "//mei:measure[5]/mei:staff/mei:layer/mei:note[1]/@oct = '5'", "renderanyway": false, "hint": "Measure n=4: You need an @oct attribute with a value of 5 on the first note element."}, + {"rule": "//mei:measure[5]/mei:staff/mei:layer/mei:note[1]/@dur = '4'", "renderanyway": false, "hint": "Measure n=4: You need a @dur attribute with a value of 4 on the first note element."}, + {"rule": "count(//mei:measure[5]/mei:staff/mei:layer/mei:note[2]/@*) = 3", "renderanyway": false, "hint": "Measure n=4: You need three attributes on the second note element (@pname, @oct & @dur)."}, + {"rule": "//mei:measure[5]/mei:staff/mei:layer/mei:note[2]/@pname = 'b'", "renderanyway": false, "hint": "Measure n=4: You need a @pname attribute with a value of b on the second note element."}, + {"rule": "//mei:measure[5]/mei:staff/mei:layer/mei:note[2]/@oct = '4'", "renderanyway": false, "hint": "Measure n=4: You need an @oct attribute with a value of 4 on the second note element."}, + {"rule": "//mei:measure[5]/mei:staff/mei:layer/mei:note[2]/@dur = '4'", "renderanyway": false, "hint": "Measure n=4: You need a @dur attribute with a value of 4 on the second note element."}, + {"rule": "count(//mei:measure[5]/mei:staff/mei:layer/mei:rest/@*) = 1", "renderanyway": false, "hint": "Measure n=4: You need one attribute on the rest element (@dur)."}, + {"rule": "//mei:measure[5]/mei:staff/mei:layer/mei:rest/@dur = '4'", "renderanyway": false, "hint": "Measure n=4: You need a @dur attribute with a value of 4 on the rest element."}, + {"rule": "count(//mei:measure[2]/mei:staff/mei:layer/mei:note[2]/mei:artic) = '1'", "renderanyway": false, "hint": "Measure n=1: You need a artic element as children of the second note element."}, + {"rule": "count(//mei:measure[2]/mei:staff/mei:layer/mei:note[2]/mei:artic/@*) = 2", "renderanyway": false, "hint": "Measure n=1: You need two attributes on the artic element (@artic, @place)."}, + {"rule": "//mei:measure[2]/mei:staff/mei:layer/mei:note[2]/mei:artic/@artic = 'acc'", "renderanyway": false, "hint": "Measure n=1: You need a @artic attribute with a value of acc on artic element."}, + {"rule": "//mei:measure[2]/mei:staff/mei:layer/mei:note[2]/mei:artic/@place = 'above'", "renderanyway": false, "hint": "Measure n=1: You need an @place attribute with a value of above on the artic element."}, + {"rule": "count(//mei:measure[3]/mei:staff/mei:layer/mei:note[2]/mei:artic) = '1'", "renderanyway": false, "hint": "Measure n=2: You need a artic element as children of the second note element."}, + {"rule": "count(//mei:measure[3]/mei:staff/mei:layer/mei:note[2]/mei:artic/@*) = 2", "renderanyway": false, "hint": "Measure n=2: You need two attributes on the artic element (@artic, @place)."}, + {"rule": "//mei:measure[3]/mei:staff/mei:layer/mei:note[2]/mei:artic/@artic = 'acc'", "renderanyway": false, "hint": "Measure n=2: You need a @artic attribute with a value of acc on artic element."}, + {"rule": "//mei:measure[3]/mei:staff/mei:layer/mei:note[2]/mei:artic/@place = 'above'", "renderanyway": false, "hint": "Measure n=2: You need an @place attribute with a value of above on the artic element."}, + {"rule": "count(//mei:measure[4]/mei:staff/mei:layer/mei:note/mei:artic) = '1'", "renderanyway": false, "hint": "Measure n=3: You need a artic element as children of the note element."}, + {"rule": "count(//mei:measure[4]/mei:staff/mei:layer/mei:note/mei:artic/@*) = 2", "renderanyway": false, "hint": "Measure n=3: You need two attributes on the artic element (@artic, @place)."}, + {"rule": "//mei:measure[4]/mei:staff/mei:layer/mei:note/mei:artic/@artic = 'acc'", "renderanyway": false, "hint": "Measure n=3: You need a @artic attribute with a value of acc on artic element."}, + {"rule": "//mei:measure[4]/mei:staff/mei:layer/mei:note/mei:artic/@place = 'above'", "renderanyway": false, "hint": "Measure n=3: You need an @place attribute with a value of above on the artic element."} + ] + }, } ], "outro": "Congratulations, you've successfully finished this tutorial!" diff --git a/_tutorials/102_march/step-10/102_march_step-10-desc.html b/_tutorials/102_march/step-10/102_march_step-10-desc.html new file mode 100644 index 00000000..66bf565b --- /dev/null +++ b/_tutorials/102_march/step-10/102_march_step-10-desc.html @@ -0,0 +1,11 @@ +
+

In this step, you will add the articulation signs to your encoding of the example.

+ +

Articulations, i.e. indications of how to play a note or chord, can be encoded with <artic> elements that are applied as children to <note> elements. From a lot of attributes that are possible with <artic>, you are supposed to use the following in this tutorial step:

+
    +
  • @artic (articulation type) – the type of articulation mark, e.g.: accent “acc”, staccato “stacc”, tenuto “ten”
  • +
  • @place – position of the articulation sign, “above” or “below” the staff.
  • +
+ +

Please find the <note> elements in the example to which accents are assigned. Add a child element <artic> to these <note> elements. Apply the corresponding attributes (@artic, @place).

+
\ No newline at end of file diff --git a/_tutorials/102_march/step-10/102_march_step-10-prefill.xml b/_tutorials/102_march/step-10/102_march_step-10-prefill.xml new file mode 100644 index 00000000..e9ae7ba1 --- /dev/null +++ b/_tutorials/102_march/step-10/102_march_step-10-prefill.xml @@ -0,0 +1,49 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/_tutorials/102_march/step-10/102_march_step-10.xml b/_tutorials/102_march/step-10/102_march_step-10.xml new file mode 100644 index 00000000..11061f47 --- /dev/null +++ b/_tutorials/102_march/step-10/102_march_step-10.xml @@ -0,0 +1,94 @@ + + + + + March + + + + + + + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+
+ +
+
From 3b8a0bdec3737876b054bc4c9c485a37e50a785b Mon Sep 17 00:00:00 2001 From: "Stefan@Lap" Date: Sat, 24 Nov 2018 21:46:59 +0100 Subject: [PATCH 08/13] feat(tutorials): add step 11 of march tutorial --- _tutorials/102_march/102_march.json | 27 ++++++ .../step-11/102_march_step-11-desc.html | 25 +++++ .../step-11/102_march_step-11-prefill.xml | 8 ++ .../102_march/step-11/102_march_step-11.xml | 95 +++++++++++++++++++ 4 files changed, 155 insertions(+) create mode 100644 _tutorials/102_march/step-11/102_march_step-11-desc.html create mode 100644 _tutorials/102_march/step-11/102_march_step-11-prefill.xml create mode 100644 _tutorials/102_march/step-11/102_march_step-11.xml diff --git a/_tutorials/102_march/102_march.json b/_tutorials/102_march/102_march.json index 3cc16739..4437ae93 100644 --- a/_tutorials/102_march/102_march.json +++ b/_tutorials/102_march/102_march.json @@ -408,6 +408,33 @@ {"rule": "//mei:measure[4]/mei:staff/mei:layer/mei:note/mei:artic/@place = 'above'", "renderanyway": false, "hint": "Measure n=3: You need an @place attribute with a value of above on the artic element."} ] }, + { + "label": "Dynamics (referencing tstamps)", + "editorLines": 10, + "descFile": "102_march_step-11-desc.html", + "prefillFile": "102_march_step-11-prefill.xml", + "xmlFile": "102_march_step-11.xml", + "xpaths": [ + {"rule": "count(//mei:measure[@n=0]) = 1", "renderanyway": false, "hint": "You need one measure with n = 0."}, + {"rule": "//mei:measure[1]/mei:staff", "renderanyway": false, "hint": "You need a staff element inside the measure element."}, + {"rule": "count(//mei:measure[1]/mei:staff/@*) = 1", "renderanyway": false, "hint": "You need one attribute on staff (@n)."}, + {"rule": "//mei:measure[1]/mei:staff/@n = 1", "renderanyway": false, "hint": "You need a @n attribute with a value of 1 on staff."}, + {"rule": "//mei:measure[1]/mei:staff/mei:layer", "renderanyway": false, "hint": "You need a layer element inside staff."}, + {"rule": "count(//mei:measure[1]/mei:staff/mei:layer/@*) = 0", "renderanyway": false, "hint": "You need no attribute on the layer element."}, + {"rule": "count(//mei:measure[1]/mei:staff/mei:layer/mei:note) = 1", "renderanyway": false, "hint": "You need one note element."}, + {"rule": "//mei:measure[1]/mei:staff/mei:layer/mei:note", "renderanyway": false, "hint": "Note has to be a child of layer element."}, + {"rule": "count(//mei:measure[1]/mei:staff/mei:layer/mei:note/@*) = 3", "renderanyway": false, "hint": "You need three attributes on the note (@pname, @oct & @dur)."}, + {"rule": "//mei:measure[1]/mei:staff/mei:layer/mei:note/@pname = 'b'", "renderanyway": false, "hint": "You need a @pname attribute with a value of b on note."}, + {"rule": "//mei:measure[1]/mei:staff/mei:layer/mei:note/@oct = '3'", "renderanyway": false, "hint": "You need an @oct attribute with a value of 3 on note."}, + {"rule": "//mei:measure[1]/mei:staff/mei:layer/mei:note/@dur = '4'", "renderanyway": false, "hint": "You need a @dur attribute with a value of 4 on note."}, + {"rule": "count(//mei:measure[1]/mei:dynam) = '1'", "renderanyway": false, "hint": "You need a dynam element as children of measure."}, + {"rule": "//mei:measure[1]/mei:staff/following-sibling::mei:dynam", "renderanyway": false, "hint": "dynam element as has to follow staff element."}, + {"rule": "count(//mei:measure[1]/mei:dynam/@*) = 3", "renderanyway": false, "hint": "You need three attributes on the dynam element (@staff, @tstamp & @place)."}, + {"rule": "//mei:measure[1]/mei:dynam/@staff = '1'", "renderanyway": false, "hint": "You need a @staff attribute with a value of 1 on the dynam element."}, + {"rule": "//mei:measure[1]/mei:dynam/@tstamp = '1'", "renderanyway": false, "hint": "You need a @tstamp attribute with a value of 1 on the dynam element."}, + {"rule": "//mei:measure[1]/mei:dynam/@place = 'below'", "renderanyway": false, "hint": "You need an @place attribute with a value of below on the dynam element."} + ] + }, } ], "outro": "Congratulations, you've successfully finished this tutorial!" diff --git a/_tutorials/102_march/step-11/102_march_step-11-desc.html b/_tutorials/102_march/step-11/102_march_step-11-desc.html new file mode 100644 index 00000000..3c9b54f3 --- /dev/null +++ b/_tutorials/102_march/step-11/102_march_step-11-desc.html @@ -0,0 +1,25 @@ +
+

In this step, you will add the dynamic marking to your encoding of the example.

+ +

You define dynamics with a <dynam> element. The <dynam> element may be used for instantaneous or continuous textual dynamics, e.g. “p”, “mf”, or “cresc. poco a poco”.

+ +

Unlike articulation signs, the <dynam> element is a so called control event which groups elements (such as dynamics, ties, phrase marks, pedal marks, etc.), which depend upon other events, such as notes or rests, for their existence. In general, control events are not encoded as child elements of the corresponding events they are meant to control. In practice, it means that they are placed outside the staff elements in most cases.

+ +

There are different options to indicate the reference to a <note> or <rest> (or any other event) from a control event like <dynam>: + +

    +
  • At first, the <staff> to which the control event shall be applied, can be referenced by a @staff attribute.
  • +
  • Furthermore, the starting point of a dynamic marking must be indicated either by a startid, tstamp, tstamp.ges, or tstamp.real attribute. The ending point may be recorded by either a dur, dur.ges, endid, or tstamp2 attribute. It is a semantic error not to specify a starting point attribute.
  • +
+ +

For this tutorial step, you will use the @tstamp attribute to indicate the starting position of the dynamic marking. @tstamp can be used to encode the onset time in terms of musical time, i.e., beats, as expressed in the written time signature.

+ +

Altogether, please use the following attributes:

+
    +
  • @staff – the identification number of the staff to which an element is applied, e.g. “1” in this case
  • +
  • @tstamp (time stamp) – the onset time in terms of musical time, i.e. beats, e.g. “1”, “2.5” +
  • @place – position of the dynamic marking, “above” or “below” the staff.
  • +
+ +

Please find the <note> element in the example to which dynamics are assigned. Add a sibling element <dynam> to the corresponding <staff>. Apply the attributes in question (@staff, @tstamp, @place).

+
\ No newline at end of file diff --git a/_tutorials/102_march/step-11/102_march_step-11-prefill.xml b/_tutorials/102_march/step-11/102_march_step-11-prefill.xml new file mode 100644 index 00000000..d429f7e4 --- /dev/null +++ b/_tutorials/102_march/step-11/102_march_step-11-prefill.xml @@ -0,0 +1,8 @@ + + + + + + + + \ No newline at end of file diff --git a/_tutorials/102_march/step-11/102_march_step-11.xml b/_tutorials/102_march/step-11/102_march_step-11.xml new file mode 100644 index 00000000..9bedfd76 --- /dev/null +++ b/_tutorials/102_march/step-11/102_march_step-11.xml @@ -0,0 +1,95 @@ + + + + + March + + + + + + + + + + + + + + +
+ + + + + + + + ff + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+
+ +
+
From 2f825ca99017b65dcff50c43efcd596164f0f903 Mon Sep 17 00:00:00 2001 From: "Stefan@Lap" Date: Sat, 24 Nov 2018 21:48:11 +0100 Subject: [PATCH 09/13] feat(tutorials): add step 12 of march tutorial --- _tutorials/102_march/102_march.json | 61 ++++++++++++ .../step-12/102_march_step-12-desc.html | 23 +++++ .../step-12/102_march_step-12-prefill.xml | 21 ++++ .../102_march/step-12/102_march_step-12.xml | 96 +++++++++++++++++++ 4 files changed, 201 insertions(+) create mode 100644 _tutorials/102_march/step-12/102_march_step-12-desc.html create mode 100644 _tutorials/102_march/step-12/102_march_step-12-prefill.xml create mode 100644 _tutorials/102_march/step-12/102_march_step-12.xml diff --git a/_tutorials/102_march/102_march.json b/_tutorials/102_march/102_march.json index 4437ae93..7fddd43c 100644 --- a/_tutorials/102_march/102_march.json +++ b/_tutorials/102_march/102_march.json @@ -435,6 +435,67 @@ {"rule": "//mei:measure[1]/mei:dynam/@place = 'below'", "renderanyway": false, "hint": "You need an @place attribute with a value of below on the dynam element."} ] }, + { + "label": "Slurs (referencing xml:id)", + "editorLines": 25, + "descFile": "102_march_step-12-desc.html", + "prefillFile": "102_march_step-12-prefill.xml", + "xmlFile": "102_march_step-12.xml", + "xpaths": [ + {"rule": "count(//mei:measure[@n=3]) = 1", "renderanyway": false, "hint": "You need one measure with n = 3."}, + {"rule": "//mei:measure[4]/mei:staff", "renderanyway": false, "hint": "You need a staff element inside the measure element."}, + {"rule": "count(//mei:measure[4]/mei:staff/@*) = 1", "renderanyway": false, "hint": "You need one attribute on staff (@n)."}, + {"rule": "//mei:measure[4]/mei:staff/@n = 1", "renderanyway": false, "hint": "You need a @n attribute with a value of 1 on staff."}, + {"rule": "//mei:measure[4]/mei:staff/mei:layer", "renderanyway": false, "hint": "You need a layer element inside staff."}, + {"rule": "count(//mei:measure[4]/mei:staff/mei:layer/@*) = 0", "renderanyway": false, "hint": "You need no attribute on the layer element."}, + {"rule": "count(//mei:measure[4]/mei:staff/mei:layer/mei:beam) = '2'", "renderanyway": false, "hint": "Measure n=3: You need two beam elements as children of layer."}, + {"rule": "count(//mei:measure[4]/mei:staff/mei:layer/mei:note) = '1'", "renderanyway": false, "hint": "Measure n=3: You need one note element as child of layer."}, + {"rule": "//mei:measure[4]/mei:staff/mei:layer/mei:beam[1]/following-sibling::mei:note/following-sibling::mei:beam", "renderanyway": false, "hint": "Measure n=3: Note element has to be placed between the two beam elements."}, + {"rule": "count(//mei:beam/@*) = 0", "renderanyway": false, "hint": "You need no attribute on the beam elements."}, + {"rule": "count(//mei:measure[4]/mei:staff/mei:layer/mei:note/@*) = 3", "renderanyway": false, "hint": "Measure n=3: You need three attributes on the note element (@pname, @oct & @dur)."}, + {"rule": "//mei:measure[4]/mei:staff/mei:layer/mei:note/@pname = 'e'", "renderanyway": false, "hint": "Measure n=3: You need a @pname attribute with a value of e on note element."}, + {"rule": "//mei:measure[4]/mei:staff/mei:layer/mei:note/@oct = '5'", "renderanyway": false, "hint": "Measure n=3: You need an @oct attribute with a value of 5 on note element."}, + {"rule": "//mei:measure[4]/mei:staff/mei:layer/mei:note/@dur = '4'", "renderanyway": false, "hint": "Measure n=3: You need a @dur attribute with a value of 4 on note element."}, + {"rule": "count(//mei:measure[4]/mei:staff/mei:layer/mei:beam[1]/mei:note) = 4", "renderanyway": false, "hint": "Measure n=3: You need four note elements inside the first beam element."}, + {"rule": "//mei:measure[4]/mei:staff/mei:layer/mei:beam[1]/mei:note[1]/@pname = 'a'", "renderanyway": false, "hint": "Measure n=3: You need a @pname attribute with a value of a on the first beamed note."}, + {"rule": "//mei:measure[4]/mei:staff/mei:layer/mei:beam[1]/mei:note[1]/@oct = '4'", "renderanyway": false, "hint": "Measure n=3: You need an @oct attribute with a value of 4 on the first beamed note."}, + {"rule": "//mei:measure[4]/mei:staff/mei:layer/mei:beam[1]/mei:note[1]/@dur = '8'", "renderanyway": false, "hint": "Measure n=3: You need a @dur attribute with a value of 8 on the first beamed note."}, + {"rule": "//mei:measure[4]/mei:staff/mei:layer/mei:beam[1]/mei:note[2]/@pname = 'b'", "renderanyway": false, "hint": "Measure n=3: You need a @pname attribute with a value of b on the second beamed note."}, + {"rule": "//mei:measure[4]/mei:staff/mei:layer/mei:beam[1]/mei:note[2]/@oct = '4'", "renderanyway": false, "hint": "Measure n=3: You need an @oct attribute with a value of 4 on the second beamed note."}, + {"rule": "//mei:measure[4]/mei:staff/mei:layer/mei:beam[1]/mei:note[2]/@dur = '8'", "renderanyway": false, "hint": "Measure n=3: You need a @dur attribute with a value of 8 on the second beamed note."}, + {"rule": "count(//mei:measure[4]/mei:staff/mei:layer/mei:beam[1]/mei:note[3]/@*) = 3", "renderanyway": false, "hint": "Measure n=3: You need three attributes on the third beamed note (@pname, @oct & @dur)."}, + {"rule": "//mei:measure[4]/mei:staff/mei:layer/mei:beam[1]/mei:note[3]/@pname = 'c'", "renderanyway": false, "hint": "Measure n=3: You need a @pname attribute with a value of c on the third beamed note."}, + {"rule": "//mei:measure[4]/mei:staff/mei:layer/mei:beam[1]/mei:note[3]/@oct = '5'", "renderanyway": false, "hint": "Measure n=3: You need an @oct attribute with a value of 5 on the third beamed note."}, + {"rule": "//mei:measure[4]/mei:staff/mei:layer/mei:beam[1]/mei:note[3]/@dur = '8'", "renderanyway": false, "hint": "Measure n=3: You need a @dur attribute with a value of 8 on the third beamed note."}, + {"rule": "count(//mei:measure[4]/mei:staff/mei:layer/mei:beam[1]/mei:note[4]/@*) = 3", "renderanyway": false, "hint": "Measure n=3: You need three attributes on the fourth beamed note (@pname, @oct & @dur)."}, + {"rule": "//mei:measure[4]/mei:staff/mei:layer/mei:beam[1]/mei:note[4]/@pname = 'd'", "renderanyway": false, "hint": "Measure n=3: You need a @pname attribute with a value of d on the fourth beamed note."}, + {"rule": "//mei:measure[4]/mei:staff/mei:layer/mei:beam[1]/mei:note[4]/@oct = '5'", "renderanyway": false, "hint": "Measure n=3: You need an @oct attribute with a value of 5 on the fourth beamed note."}, + {"rule": "//mei:measure[4]/mei:staff/mei:layer/mei:beam[1]/mei:note[4]/@dur = '8'", "renderanyway": false, "hint": "Measure n=3: You need a @dur attribute with a value of 8 on the fourth beamed note."}, + {"rule": "count(//mei:measure[4]/mei:staff/mei:layer/mei:beam[2]/mei:note) = 2", "renderanyway": false, "hint": "Measure n=3: You need two note elements inside the second beam element."}, + {"rule": "count(//mei:measure[4]/mei:staff/mei:layer/mei:beam[2]/mei:note[1]/@*) = 3", "renderanyway": false, "hint": "Measure n=3: You need three attributes on the first beamed note (@pname, @oct & @dur)."}, + {"rule": "//mei:measure[4]/mei:staff/mei:layer/mei:beam[2]/mei:note[1]/@pname = 'd'", "renderanyway": false, "hint": "Measure n=3: You need a @pname attribute with a value of d on the first beamed note."}, + {"rule": "//mei:measure[4]/mei:staff/mei:layer/mei:beam[2]/mei:note[1]/@oct = '5'", "renderanyway": false, "hint": "Measure n=3: You need an @oct attribute with a value of 5 on the first beamed note."}, + {"rule": "//mei:measure[4]/mei:staff/mei:layer/mei:beam[2]/mei:note[1]/@dur = '8'", "renderanyway": false, "hint": "Measure n=3: You need a @dur attribute with a value of 8 on the first beamed note."}, + {"rule": "count(//mei:measure[4]/mei:staff/mei:layer/mei:beam[2]/mei:note[2]/@*) = 3", "renderanyway": false, "hint": "Measure n=3: You need three attributes on the second beamed note (@pname, @oct & @dur)."}, + {"rule": "//mei:measure[4]/mei:staff/mei:layer/mei:beam[2]/mei:note[2]/@pname = 'b'", "renderanyway": false, "hint": "Measure n=3: You need a @pname attribute with a value of b on the second beamed note."}, + {"rule": "//mei:measure[4]/mei:staff/mei:layer/mei:beam[2]/mei:note[2]/@oct = '4'", "renderanyway": false, "hint": "Measure n=3: You need an @oct attribute with a value of 4 on the second beamed note."}, + {"rule": "//mei:measure[4]/mei:staff/mei:layer/mei:beam[2]/mei:note[2]/@dur = '8'", "renderanyway": false, "hint": "Measure n=3: You need a @dur attribute with a value of 8 on the second beamed note."}, + {"rule": "count(//mei:measure[4]/mei:staff/mei:layer/mei:note/mei:artic) = '1'", "renderanyway": false, "hint": "Measure n=3: You need a artic element as children of the note element."}, + {"rule": "count(//mei:measure[4]/mei:staff/mei:layer/mei:note/mei:artic/@*) = 2", "renderanyway": false, "hint": "Measure n=3: You need two attributes on the artic element (@artic, @place)."}, + {"rule": "//mei:measure[4]/mei:staff/mei:layer/mei:note/mei:artic/@artic = 'acc'", "renderanyway": false, "hint": "Measure n=3: You need a @artic attribute with a value of acc on artic element."}, + {"rule": "//mei:measure[4]/mei:staff/mei:layer/mei:note/mei:artic/@place = 'above'", "renderanyway": false, "hint": "Measure n=3: You need an @place attribute with a value of above on the artic element."}, + {"rule": "count(//mei:measure[4]/mei:staff/mei:layer/mei:beam[1]/mei:note[1]/@*) = 4", "renderanyway": false, "hint": "You need four attributes on the first beamed note (@pname, @oct, @dur & @xml:id)."}, + {"rule": "//mei:measure[4]/mei:staff/mei:layer/mei:beam[1]/mei:note[1]/@*[name()='xml:id'] = 'd1e4614'", "renderanyway": false, "hint": "You need a @xml:id attribute with a value of `d1e4614` on the first beamed note."}, + {"rule": "count(//mei:measure[4]/mei:staff/mei:layer/mei:beam[1]/mei:note[2]/@*) = 4", "renderanyway": false, "hint": "You need four attributes on the second beamed note (@pname, @oct, @dur & @xml:id)."}, + {"rule": "//mei:measure[4]/mei:staff/mei:layer/mei:beam[1]/mei:note[2]/@*[name()='xml:id'] = 'd1e4615'", "renderanyway": false, "hint": "You need a @xml:id attribute with a value of `d1e4615` on the second beamed note."}, + {"rule": "count(//mei:measure[4]/mei:slur) = '1'", "renderanyway": false, "hint": "You need a slur element as child of measure."}, + {"rule": "//mei:measure[4]/mei:staff/following-sibling::mei:slur", "renderanyway": false, "hint": "slur element has to follow staff element."}, + {"rule": "count(//mei:measure[4]/mei:slur/@*) = 4", "renderanyway": false, "hint": "You need four attributes on the slur element (@staff, @curvedir, @startid & @endid)."}, + {"rule": "//mei:measure[4]/mei:slur/@staff = '1'", "renderanyway": false, "hint": "You need a @staff attribute with a value of 1 on slur element."}, + {"rule": "//mei:measure[4]/mei:slur/@curvedir = 'above'", "renderanyway": false, "hint": "You need a @curvedir attribute with a value of above on slur element."}, + {"rule": "//mei:measure[4]/mei:slur/@startid = '#d1e4614'", "renderanyway": false, "hint": "You need a @startid attribute with a value of #d1e4614 on slur element."}, + {"rule": "//mei:measure[4]/mei:slur/@endid = '#d1e4615'", "renderanyway": false, "hint": "You need an @endid attribute with a value of #d1e4615 on slur element."} + ] } ], "outro": "Congratulations, you've successfully finished this tutorial!" diff --git a/_tutorials/102_march/step-12/102_march_step-12-desc.html b/_tutorials/102_march/step-12/102_march_step-12-desc.html new file mode 100644 index 00000000..e6262851 --- /dev/null +++ b/_tutorials/102_march/step-12/102_march_step-12-desc.html @@ -0,0 +1,23 @@ +
+

Well done, you'are almost there. In this step, you will add the last missing detail of the example: the slur in the third measure.

+ +

There are two different ways, to encode a slur in MEI:

+
    +
  1. You can use a @slur attribute on <note> or <chord> with a value of i=initial, m=medial or t=terminal.
  2. +
  3. You can use a separate <slur> element.
  4. +
+ +

In this tutorial step, you will use the second approach: Like dynamics, <slur> elements are control events, too, what means, that they are not encoded as child elements of the corresponding events they are meant to control but in most cases outside the staff elements.

+ +

To indicate the starting point and end point of the slur, it is possible to apply a reference to the corresponding @xml:id of a <note> or <chord> element. @xml:id's are identifiers with an arbitrary but unique character sequence that regularize the naming of an element throughout a document and thus facilitate building links between elements and other resources. For <slur>s, a reference to the @xml:id of an element can be given via the attributes @startid and @endid.

+ +

Along with @startid and @endid, you are supposed to use the following attributes in this step:

+
    +
  • @staff – the identification number of the staff to which an element is applied, e.g. “1” in this case
  • +
  • @curvedir (curve direction) – describes a curve with a generic term indicating the direction of curvature: “above”, “below” or “mixed”
  • +
  • @startid – reference to the xml:id of the start note of the slur, in the form: #xml:id (note the hash #)
  • +
  • @endid – reference to the xml:id of the ending note of the slur, in the form: #xml:id (note the hash #)
  • +
+ +

Please identify the first and the last note to which the slur is attached (inside the first <beam> element). Add an attribute @xml:id to both <note> elements. Set a unique value for each @xml:id, for this example you can use the values: “d1e4614”, “d1e4615”. Add a <slur> control element after the closing tag of <staff> element and apply the corresponding attributes.

+
\ No newline at end of file diff --git a/_tutorials/102_march/step-12/102_march_step-12-prefill.xml b/_tutorials/102_march/step-12/102_march_step-12-prefill.xml new file mode 100644 index 00000000..497152ff --- /dev/null +++ b/_tutorials/102_march/step-12/102_march_step-12-prefill.xml @@ -0,0 +1,21 @@ + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/_tutorials/102_march/step-12/102_march_step-12.xml b/_tutorials/102_march/step-12/102_march_step-12.xml new file mode 100644 index 00000000..dcb1e47b --- /dev/null +++ b/_tutorials/102_march/step-12/102_march_step-12.xml @@ -0,0 +1,96 @@ + + + + + March + + + + + + + + + + + + + + +
+ + + + + + + ff + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+
+ +
+
From d3dee760c7683020d2e0b87713509e4ce1119b6e Mon Sep 17 00:00:00 2001 From: "Stefan@Lap" Date: Sat, 24 Nov 2018 21:49:33 +0100 Subject: [PATCH 10/13] fix(tutorials): little change to goal description of step 9 of march tutorial --- _tutorials/102_march/step-09/102_march_step-09-desc.html | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/_tutorials/102_march/step-09/102_march_step-09-desc.html b/_tutorials/102_march/step-09/102_march_step-09-desc.html index c5bd423d..b01f0395 100644 --- a/_tutorials/102_march/step-09/102_march_step-09-desc.html +++ b/_tutorials/102_march/step-09/102_march_step-09-desc.html @@ -1,5 +1,5 @@
-

You should be prepared now to encode the final two measures of the example with their note values.

+

You should be prepared now to encode the note values of the final two measures of the example.

Ignore the additional elements, such as dynamics, slurs and accents at this point as they will be adressed in the next steps separately.

From 23c4b7692a057d4af84111c28f711b7207b8e01e Mon Sep 17 00:00:00 2001 From: "Stefan@Lap" Date: Sat, 24 Nov 2018 22:16:43 +0100 Subject: [PATCH 11/13] fix(tutorials): add image of march and change fullname of march tutorial --- _tutorials/102_march/102_March.md | 6 ++++-- _tutorials/102_march/102_march.png | Bin 0 -> 13751 bytes 2 files changed, 4 insertions(+), 2 deletions(-) create mode 100644 _tutorials/102_march/102_march.png diff --git a/_tutorials/102_march/102_March.md b/_tutorials/102_march/102_March.md index 6b6d2944..720e9c19 100644 --- a/_tutorials/102_march/102_March.md +++ b/_tutorials/102_march/102_March.md @@ -2,9 +2,11 @@ layout: tutorials type: tutorial name: "March" -fullname: "A Quickstart tutorial for MEI encoding" +fullname: "An advanced tutorial for MEI encoding" data: "102_march.json" --- Welcome! In this tutorial you will learn how to encode the following music example in MEI: -"MarchExample" \ No newline at end of file +![Hallingdal Bataljons Marsch](../102_march.png) + +By the way: this is the beginning of _Hallingdal Bataljons Marsch_, the Opus 1 of the norwegian composer [Johan Halvorsen](https://de.wikipedia.org/wiki/Johan_Halvorsen) (1864–1935). \ No newline at end of file diff --git a/_tutorials/102_march/102_march.png b/_tutorials/102_march/102_march.png new file mode 100644 index 0000000000000000000000000000000000000000..acd2087a857a564023e0dbd3e82da580b0c20266 GIT binary patch literal 13751 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 literal 0 HcmV?d00001 From 9bab235cfb5878edb7d5cabbebc2c93726e82092 Mon Sep 17 00:00:00 2001 From: "Stefan@AWG2" Date: Wed, 5 Dec 2018 17:22:12 +0100 Subject: [PATCH 12/13] fix(tutorials): apply change requests from @ahankinson's review --- _tutorials/102_march/102_March.md | 2 +- _tutorials/102_march/102_march.json | 42 +++++++++---------- .../step-06/102_march_step-06-desc.html | 2 +- .../step-07/102_march_step-07-desc.html | 4 +- .../step-08/102_march_step-08-desc.html | 2 +- .../step-09/102_march_step-09-desc.html | 2 +- .../step-10/102_march_step-10-desc.html | 2 +- .../step-11/102_march_step-11-desc.html | 2 +- .../step-12/102_march_step-12-desc.html | 10 ++--- 9 files changed, 34 insertions(+), 34 deletions(-) diff --git a/_tutorials/102_march/102_March.md b/_tutorials/102_march/102_March.md index 720e9c19..24979276 100644 --- a/_tutorials/102_march/102_March.md +++ b/_tutorials/102_march/102_March.md @@ -9,4 +9,4 @@ Welcome! In this tutorial you will learn how to encode the following music examp ![Hallingdal Bataljons Marsch](../102_march.png) -By the way: this is the beginning of _Hallingdal Bataljons Marsch_, the Opus 1 of the norwegian composer [Johan Halvorsen](https://de.wikipedia.org/wiki/Johan_Halvorsen) (1864–1935). \ No newline at end of file +By the way: this is the beginning of _Hallingdal Bataljons Marsch_, the Opus 1 of the Norwegian composer [Johan Halvorsen](https://de.wikipedia.org/wiki/Johan_Halvorsen) (1864–1935). \ No newline at end of file diff --git a/_tutorials/102_march/102_march.json b/_tutorials/102_march/102_march.json index 7fddd43c..fad4c51e 100644 --- a/_tutorials/102_march/102_march.json +++ b/_tutorials/102_march/102_march.json @@ -8,12 +8,12 @@ "xmlFile": "102_march_step-01.xml", "xpaths": [ {"rule": "count(//mei:scoreDef) = 1", "renderanyway": false, "hint": "You need one scoreDef element."}, - {"rule": "count(//mei:scoreDef/@*) = 0", "renderanyway": false, "hint": "You need no attribute on the scoreDef element."}, + {"rule": "count(//mei:scoreDef/@*) = 0", "renderanyway": false, "hint": "You do not need an attribute on the scoreDef element."}, {"rule": "count(//mei:staffGrp) = 1", "renderanyway": false, "hint": "You need one staffGrp element."}, - {"rule": "count(//mei:staffGrp/@*) = 0", "renderanyway": false, "hint": "You need no attribute on the staffGrp element."}, + {"rule": "count(//mei:staffGrp/@*) = 0", "renderanyway": false, "hint": "You do not need an attribute on the staffGrp element."}, {"rule": "//mei:scoreDef/mei:staffGrp", "renderanyway": false, "hint": "staffGrp element has to be a child of scoreDef element."}, {"rule": "count(//mei:staffDef) = 1", "renderanyway": false, "hint": "You need one staffDef element."}, - {"rule": "count(//mei:staffDef/@*) = 0", "renderanyway": false, "hint": "You need no attribute on the staffDef element."}, + {"rule": "count(//mei:staffDef/@*) = 0", "renderanyway": false, "hint": "You do not need an attribute on the staffDef element."}, {"rule": "//mei:staffGrp/mei:staffDef", "renderanyway": false, "hint": "staffDef element has to be a child of staffGrp element."} ] }, @@ -26,7 +26,7 @@ "xpaths": [ {"rule": "count(//mei:scoreDef) = 1", "renderanyway": false, "hint": "You need one scoreDef element."}, {"rule": "count(//mei:staffGrp) = 1", "renderanyway": false, "hint": "You need one staffGroup element."}, - {"rule": "count(//mei:staffGrp/@*) = 0", "renderanyway": false, "hint": "You need no attribute on the staffGrp element."}, + {"rule": "count(//mei:staffGrp/@*) = 0", "renderanyway": false, "hint": "You do not need an attribute on the staffGrp element."}, {"rule": "//mei:scoreDef/mei:staffGrp", "renderanyway": false, "hint": "staffGrp element has to be a child of scoreDef element."}, {"rule": "count(//mei:staffDef) = 1", "renderanyway": false, "hint": "You need one staffDef element."}, {"rule": "//mei:staffGrp/mei:staffDef", "renderanyway": false, "hint": "staffDef element has to be a child of staffGrp element."}, @@ -48,7 +48,7 @@ "xmlFile": "102_march_step-03.xml", "xpaths": [ {"rule": "count(//mei:section) = 1", "renderanyway": false, "hint": "You need one section element."}, - {"rule": "count(//mei:section/@*) = 0", "renderanyway": false, "hint": "You need no attribute on the section element."}, + {"rule": "count(//mei:section/@*) = 0", "renderanyway": false, "hint": "You do not need an attribute on the section element."}, {"rule": "//mei:score/mei:section", "renderanyway": false, "hint": "section element has to be a child of score element."}, {"rule": "count(//mei:measure) = 1", "renderanyway": false, "hint": "You need one measure element."}, {"rule": "//mei:section/mei:measure", "renderanyway": false, "hint": "measure element has to be a child of section element."}, @@ -59,7 +59,7 @@ {"rule":"count(//mei:staff/@*) = 1", "renderanyway": false, "hint": "You need one attribute on staff (@n)."}, {"rule": "//mei:staff/@n = '1'", "renderanyway": false, "hint": "You need a @n attribute with a value of 1."}, {"rule": "count(//mei:layer) = 1", "renderanyway": false, "hint": "You need one layer element."}, - {"rule": "count(//mei:layer/@*) = 0", "renderanyway": false, "hint": "You need no attribute on the layer element."}, + {"rule": "count(//mei:layer/@*) = 0", "renderanyway": false, "hint": "You do not need an attribute on the layer element."}, {"rule": "//mei:staff/mei:layer", "renderanyway": false, "hint": "layer element has to be a child of staff element."} ] }, @@ -85,7 +85,7 @@ "xmlFile": "102_march_step-05.xml", "xpaths": [ {"rule": "count(//mei:section) = 1", "renderanyway": false, "hint": "You need one section element."}, - {"rule": "count(//mei:section/@*) = 0", "renderanyway": false, "hint": "You need no attribute on the section element."}, + {"rule": "count(//mei:section/@*) = 0", "renderanyway": false, "hint": "You do not need an attribute on the section element."}, {"rule": "count(//mei:measure) = 2", "renderanyway": false, "hint": "You need two measure elements."}, {"rule": "//mei:section/mei:measure", "renderanyway": false, "hint": "measure element has to be a child of section element."}, {"rule": "count(//mei:section/mei:measure) = 2", "renderanyway": false, "hint": "You need two measure children in section element."}, @@ -105,7 +105,7 @@ {"rule": "//mei:measure[1]/mei:staff/mei:layer", "renderanyway": false, "hint": "You need a layer element in first staff element."}, {"rule": "//mei:measure[2]/mei:staff/mei:layer", "renderanyway": false, "hint": "You need a layer element in second staff element."}, {"rule": "count(//mei:staff/mei:layer) = 2", "renderanyway": false, "hint": "You need a layer child in every staff element."}, - {"rule": "count(//mei:layer/@*) = 0", "renderanyway": false, "hint": "You need no attribute on the layer elements."}, + {"rule": "count(//mei:layer/@*) = 0", "renderanyway": false, "hint": "You do not need an attribute on the layer elements."}, {"rule": "count(//mei:note) = 2", "renderanyway": false, "hint": "You need two note elements."}, {"rule": "//mei:measure[1]/mei:staff/mei:layer/mei:note", "renderanyway": false, "hint": "First note has to be a child of first layer element."}, {"rule": "//mei:measure[2]/mei:staff/mei:layer/mei:note", "renderanyway": false, "hint": "Second note has to be a child of second layer element."}, @@ -133,7 +133,7 @@ {"rule": "count(//mei:measure[2]/mei:staff/@*) = 1", "renderanyway": false, "hint": "You need one attribute on staff (@n)."}, {"rule": "//mei:measure[2]/mei:staff/@n = 1", "renderanyway": false, "hint": "You need a @n attribute with a value of 1 on staff."}, {"rule": "//mei:measure[2]/mei:staff/mei:layer", "renderanyway": false, "hint": "You need a layer element in staff element."}, - {"rule": "count(//mei:layer/@*) = 0", "renderanyway": false, "hint": "You need no attribute on the layer element."}, + {"rule": "count(//mei:layer/@*) = 0", "renderanyway": false, "hint": "You do not need an attribute on the layer element."}, {"rule": "//mei:measure[2]/mei:staff/mei:layer/mei:note[1]", "renderanyway": false, "hint": "First note element has to be a child of layer element."}, {"rule": "count(//mei:measure[2]/mei:staff/mei:layer/mei:note[1]/@*) = 3", "renderanyway": false, "hint": "You need three attributes on the first note (@pname, @oct & @dur)."}, {"rule": "//mei:measure[2]/mei:staff/mei:layer/mei:note[1]/@pname = 'e'", "renderanyway": false, "hint": "You need a @pname attribute with a value of e on first note element."}, @@ -143,7 +143,7 @@ {"rule": "//mei:layer/mei:beam", "renderanyway": false, "hint": "beam element has to be a child of layer element."}, {"rule": "//mei:layer/mei:note/following-sibling::mei:beam", "renderanyway": false, "hint": "beam element has to follow note element."}, {"rule": "count(//mei:layer/mei:note/following-sibling::*) = 1", "renderanyway": false, "hint": "You need only one element to follow note element."}, - {"rule": "count(//mei:beam/@*) = 0", "renderanyway": false, "hint": "You need no attribute on the beam element."}, + {"rule": "count(//mei:beam/@*) = 0", "renderanyway": false, "hint": "You do not need an attribute on the beam element."}, {"rule": "count(//mei:beam/mei:note) = 2", "renderanyway": false, "hint": "You need two note elements inside beam element."}, {"rule": "count(//mei:beam/mei:note[1]/@*) = 3", "renderanyway": false, "hint": "You need three attributes on the first beamed note (@pname, @oct & @dur)."}, {"rule": "//mei:beam/mei:note[1]/@pname = 'e'", "renderanyway": false, "hint": "You need a @pname attribute with a value of e on the first beamed note."}, @@ -169,7 +169,7 @@ {"rule": "count(//mei:measure[2]/mei:staff/@*) = 1", "renderanyway": false, "hint": "You need one attribute on staff (@n)."}, {"rule": "//mei:measure[2]/mei:staff/@n = 1", "renderanyway": false, "hint": "You need a @n attribute with a value of 1 on staff."}, {"rule": "//mei:measure[2]/mei:staff/mei:layer", "renderanyway": false, "hint": "You need a layer element in staff element."}, - {"rule": "count(//mei:layer/@*) = 0", "renderanyway": false, "hint": "You need no attribute on the layer element."}, + {"rule": "count(//mei:layer/@*) = 0", "renderanyway": false, "hint": "You do not need an attribute on the layer element."}, {"rule": "//mei:measure[2]/mei:staff/mei:layer/mei:note[1]", "renderanyway": false, "hint": "First note element has to be a child of layer element."}, {"rule": "count(//mei:measure[2]/mei:staff/mei:layer/mei:note[1]/@*) = 3", "renderanyway": false, "hint": "You need three attributes on the first note (@pname, @oct & @dur)."}, {"rule": "//mei:measure[2]/mei:staff/mei:layer/mei:note[1]/@pname = 'e'", "renderanyway": false, "hint": "You need a @pname attribute with a value of e on first note element."}, @@ -178,7 +178,7 @@ {"rule": "count(//mei:beam) = '1'", "renderanyway": false, "hint": "You need one beam element."}, {"rule": "//mei:layer/mei:beam", "renderanyway": false, "hint": "beam element has to be a child of layer element."}, {"rule": "//mei:layer/mei:note/following-sibling::mei:beam", "renderanyway": false, "hint": "beam element has to follow note element."}, - {"rule": "count(//mei:beam/@*) = 0", "renderanyway": false, "hint": "You need no attribute on the beam element."}, + {"rule": "count(//mei:beam/@*) = 0", "renderanyway": false, "hint": "You do not need an attribute on the beam element."}, {"rule": "count(//mei:beam/mei:note) = 2", "renderanyway": false, "hint": "You need two note elements inside beam element."}, {"rule": "count(//mei:beam/mei:note[1]/@*) = 3", "renderanyway": false, "hint": "You need three attributes on the first beamed note (@pname, @oct & @dur)."}, {"rule": "//mei:beam/mei:note[1]/@pname = 'e'", "renderanyway": false, "hint": "You need a @pname attribute with a value of e on the first beamed note."}, @@ -218,7 +218,7 @@ {"rule": "count(//mei:measure[3]/mei:staff/@*) = 1", "renderanyway": false, "hint": "You need one attribute on staff (@n)."}, {"rule": "//mei:measure[3]/mei:staff/@n = 1", "renderanyway": false, "hint": "You need a @n attribute with a value of 1 on staff."}, {"rule": "//mei:measure[3]/mei:staff/mei:layer", "renderanyway": false, "hint": "You need a layer element in staff element."}, - {"rule": "count(//mei:layer/@*) = 0", "renderanyway": false, "hint": "You need no attribute on the layer element."}, + {"rule": "count(//mei:layer/@*) = 0", "renderanyway": false, "hint": "You do not need an attribute on the layer element."}, {"rule": "//mei:measure[3]/mei:staff/mei:layer/mei:note[1]", "renderanyway": false, "hint": "First note element has to be child of layer element."}, {"rule": "count(//mei:measure[3]/mei:staff/mei:layer/mei:note[1]/@*) = 3", "renderanyway": false, "hint": "You need three attributes on first note element(@pname, @oct & @dur)."}, {"rule": "//mei:measure[3]/mei:staff/mei:layer/mei:note[1]/@pname = 'e'", "renderanyway": false, "hint": "You need a @pname attribute with a value of e on first note element."}, @@ -227,7 +227,7 @@ {"rule": "count(//mei:measure[3]/mei:staff/mei:layer/mei:beam) = '1'", "renderanyway": false, "hint": "You need one beam element."}, {"rule": "//mei:measure[3]/mei:staff/mei:layer/mei:beam", "renderanyway": false, "hint": "beam element has to be a child of layer element."}, {"rule": "//mei:measure[3]/mei:staff/mei:layer/mei:note/following-sibling::mei:beam", "renderanyway": false, "hint": "beam element has to follow note element."}, - {"rule": "count(//mei:beam/@*) = 0", "renderanyway": false, "hint": "You need no attribute on the beam element."}, + {"rule": "count(//mei:beam/@*) = 0", "renderanyway": false, "hint": "You do not need an attribute on the beam element."}, {"rule": "count(//mei:measure[3]/mei:staff/mei:layer/mei:beam/mei:note) = 2", "renderanyway": false, "hint": "You need two note elements inside beam element."}, {"rule": "count(//mei:measure[3]/mei:staff/mei:layer/mei:beam/mei:note[1]/@*) = 3", "renderanyway": false, "hint": "You need three attributes on the first beamed note (@pname, @oct & @dur)."}, {"rule": "//mei:measure[3]/mei:staff/mei:layer/mei:beam/mei:note[1]/@pname = 'e'", "renderanyway": false, "hint": "You need a @pname attribute with a value of e on the first beamed note."}, @@ -275,11 +275,11 @@ {"rule": "//mei:measure[5]/mei:staff/@n = 1", "renderanyway": false, "hint": "You need a @n attribute with a value of 1 on staff."}, {"rule": "//mei:measure[4]/mei:staff/mei:layer", "renderanyway": false, "hint": "Measure n=3: You need a layer element inside staff."}, {"rule": "//mei:measure[5]/mei:staff/mei:layer", "renderanyway": false, "hint": "Measure n=4: You need a layer element inside staff."}, - {"rule": "count(//mei:layer/@*) = 0", "renderanyway": false, "hint": "You need no attribute on the layer elements."}, + {"rule": "count(//mei:layer/@*) = 0", "renderanyway": false, "hint": "You do not need an attribute on the layer elements."}, {"rule": "count(//mei:measure[4]/mei:staff/mei:layer/mei:beam) = '2'", "renderanyway": false, "hint": "Measure n=3: You need two beam elements as children of layer."}, {"rule": "count(//mei:measure[4]/mei:staff/mei:layer/mei:note) = '1'", "renderanyway": false, "hint": "Measure n=3: You need one note element as child of layer."}, {"rule": "//mei:measure[4]/mei:staff/mei:layer/mei:beam[1]/following-sibling::mei:note/following-sibling::mei:beam", "renderanyway": false, "hint": "Measure n=3: Note element has to be placed between the two beam elements."}, - {"rule": "count(//mei:beam/@*) = 0", "renderanyway": false, "hint": "You need no attribute on the beam elements."}, + {"rule": "count(//mei:beam/@*) = 0", "renderanyway": false, "hint": "You do not need an attribute on the beam elements."}, {"rule": "count(//mei:measure[4]/mei:staff/mei:layer/mei:note/@*) = 3", "renderanyway": false, "hint": "Measure n=3: You need three attributes on the note element (@pname, @oct & @dur)."}, {"rule": "//mei:measure[4]/mei:staff/mei:layer/mei:note/@pname = 'e'", "renderanyway": false, "hint": "Measure n=3: You need a @pname attribute with a value of e on note element."}, {"rule": "//mei:measure[4]/mei:staff/mei:layer/mei:note/@oct = '5'", "renderanyway": false, "hint": "Measure n=3: You need an @oct attribute with a value of 5 on note element."}, @@ -346,11 +346,11 @@ {"rule": "//mei:measure[5]/mei:staff/@n = 1", "renderanyway": false, "hint": "You need a @n attribute with a value of 1 on staff."}, {"rule": "//mei:measure[4]/mei:staff/mei:layer", "renderanyway": false, "hint": "Measure n=3: You need a layer element inside staff."}, {"rule": "//mei:measure[5]/mei:staff/mei:layer", "renderanyway": false, "hint": "Measure n=4: You need a layer element inside staff."}, - {"rule": "count(//mei:layer/@*) = 0", "renderanyway": false, "hint": "You need no attribute on the layer elements."}, + {"rule": "count(//mei:layer/@*) = 0", "renderanyway": false, "hint": "You do not need an attribute on the layer elements."}, {"rule": "count(//mei:measure[4]/mei:staff/mei:layer/mei:beam) = '2'", "renderanyway": false, "hint": "Measure n=3: You need two beam elements as children of layer."}, {"rule": "count(//mei:measure[4]/mei:staff/mei:layer/mei:note) = '1'", "renderanyway": false, "hint": "Measure n=3: You need one note element as child of layer."}, {"rule": "//mei:measure[4]/mei:staff/mei:layer/mei:beam[1]/following-sibling::mei:note/following-sibling::mei:beam", "renderanyway": false, "hint": "Measure n=3: Note element has to be placed between the two beam elements."}, - {"rule": "count(//mei:beam/@*) = 0", "renderanyway": false, "hint": "You need no attribute on the beam elements."}, + {"rule": "count(//mei:beam/@*) = 0", "renderanyway": false, "hint": "You do not need an attribute on the beam elements."}, {"rule": "count(//mei:measure[4]/mei:staff/mei:layer/mei:note/@*) = 3", "renderanyway": false, "hint": "Measure n=3: You need three attributes on the note element (@pname, @oct & @dur)."}, {"rule": "//mei:measure[4]/mei:staff/mei:layer/mei:note/@pname = 'e'", "renderanyway": false, "hint": "Measure n=3: You need a @pname attribute with a value of e on note element."}, {"rule": "//mei:measure[4]/mei:staff/mei:layer/mei:note/@oct = '5'", "renderanyway": false, "hint": "Measure n=3: You need an @oct attribute with a value of 5 on note element."}, @@ -420,7 +420,7 @@ {"rule": "count(//mei:measure[1]/mei:staff/@*) = 1", "renderanyway": false, "hint": "You need one attribute on staff (@n)."}, {"rule": "//mei:measure[1]/mei:staff/@n = 1", "renderanyway": false, "hint": "You need a @n attribute with a value of 1 on staff."}, {"rule": "//mei:measure[1]/mei:staff/mei:layer", "renderanyway": false, "hint": "You need a layer element inside staff."}, - {"rule": "count(//mei:measure[1]/mei:staff/mei:layer/@*) = 0", "renderanyway": false, "hint": "You need no attribute on the layer element."}, + {"rule": "count(//mei:measure[1]/mei:staff/mei:layer/@*) = 0", "renderanyway": false, "hint": "You do not need an attribute on the layer element."}, {"rule": "count(//mei:measure[1]/mei:staff/mei:layer/mei:note) = 1", "renderanyway": false, "hint": "You need one note element."}, {"rule": "//mei:measure[1]/mei:staff/mei:layer/mei:note", "renderanyway": false, "hint": "Note has to be a child of layer element."}, {"rule": "count(//mei:measure[1]/mei:staff/mei:layer/mei:note/@*) = 3", "renderanyway": false, "hint": "You need three attributes on the note (@pname, @oct & @dur)."}, @@ -447,11 +447,11 @@ {"rule": "count(//mei:measure[4]/mei:staff/@*) = 1", "renderanyway": false, "hint": "You need one attribute on staff (@n)."}, {"rule": "//mei:measure[4]/mei:staff/@n = 1", "renderanyway": false, "hint": "You need a @n attribute with a value of 1 on staff."}, {"rule": "//mei:measure[4]/mei:staff/mei:layer", "renderanyway": false, "hint": "You need a layer element inside staff."}, - {"rule": "count(//mei:measure[4]/mei:staff/mei:layer/@*) = 0", "renderanyway": false, "hint": "You need no attribute on the layer element."}, + {"rule": "count(//mei:measure[4]/mei:staff/mei:layer/@*) = 0", "renderanyway": false, "hint": "You do not need an attribute on the layer element."}, {"rule": "count(//mei:measure[4]/mei:staff/mei:layer/mei:beam) = '2'", "renderanyway": false, "hint": "Measure n=3: You need two beam elements as children of layer."}, {"rule": "count(//mei:measure[4]/mei:staff/mei:layer/mei:note) = '1'", "renderanyway": false, "hint": "Measure n=3: You need one note element as child of layer."}, {"rule": "//mei:measure[4]/mei:staff/mei:layer/mei:beam[1]/following-sibling::mei:note/following-sibling::mei:beam", "renderanyway": false, "hint": "Measure n=3: Note element has to be placed between the two beam elements."}, - {"rule": "count(//mei:beam/@*) = 0", "renderanyway": false, "hint": "You need no attribute on the beam elements."}, + {"rule": "count(//mei:beam/@*) = 0", "renderanyway": false, "hint": "You do not need an attribute on the beam elements."}, {"rule": "count(//mei:measure[4]/mei:staff/mei:layer/mei:note/@*) = 3", "renderanyway": false, "hint": "Measure n=3: You need three attributes on the note element (@pname, @oct & @dur)."}, {"rule": "//mei:measure[4]/mei:staff/mei:layer/mei:note/@pname = 'e'", "renderanyway": false, "hint": "Measure n=3: You need a @pname attribute with a value of e on note element."}, {"rule": "//mei:measure[4]/mei:staff/mei:layer/mei:note/@oct = '5'", "renderanyway": false, "hint": "Measure n=3: You need an @oct attribute with a value of 5 on note element."}, diff --git a/_tutorials/102_march/step-06/102_march_step-06-desc.html b/_tutorials/102_march/step-06/102_march_step-06-desc.html index cc0434b1..bb35e816 100644 --- a/_tutorials/102_march/step-06/102_march_step-06-desc.html +++ b/_tutorials/102_march/step-06/102_march_step-06-desc.html @@ -3,5 +3,5 @@

To group notes under a beam within a measure, the <beam> element is to be used. The <beam> element is a container for a series of explicitly beamed events that begins and ends entirely within a measure.

-

In the editor below, please add a <beam> element at the specified position before adding the two child <note>'s separately (e flat and g).

+

In the editor below, please add a <beam> element at the specified position before adding the two child <note>s separately (e flat and g).

\ No newline at end of file diff --git a/_tutorials/102_march/step-07/102_march_step-07-desc.html b/_tutorials/102_march/step-07/102_march_step-07-desc.html index 0f51a30f..d871cc6f 100644 --- a/_tutorials/102_march/step-07/102_march_step-07-desc.html +++ b/_tutorials/102_march/step-07/102_march_step-07-desc.html @@ -1,7 +1,7 @@
-

In this step you will learn to encode dotted durations.

+

In this step you will learn how to encode dotted durations.

-

To encode a dotted rhythm, you need to use a @dots attribute on <note> element and set the number of dots as the attribute's value, e.g. “1” or “2”.

+

To encode a dotted rhythm, you need to use a @dots attribute on a <note> element and set the number of dots as the attribute's value, e.g. “1” or “2”.

Please encode the rest of the measure (n=1) in the editor below by adding two <note> elements with different rhythmic values (dotted quarter, eighth) next to the <beam> element.

\ No newline at end of file diff --git a/_tutorials/102_march/step-08/102_march_step-08-desc.html b/_tutorials/102_march/step-08/102_march_step-08-desc.html index 746395ef..c990c7fb 100644 --- a/_tutorials/102_march/step-08/102_march_step-08-desc.html +++ b/_tutorials/102_march/step-08/102_march_step-08-desc.html @@ -1,5 +1,5 @@

Ok, let's encode the complete next measure to repeat all the things you've learned in the previous steps.

-

Please encode the next measure (n=2) in the editor below. Add a staff and layer element which contains 4 child elements: a quarter <note>, a <beam> with to eighth <note>'s and a dotted quarter <note> with an eighth <note>.

+

Please encode the next measure (n=2) in the editor below. Add a staff and layer element which contains 4 child elements: a quarter <note>, a <beam> with two eighth <note>s and a dotted quarter <note> with an eighth <note>.

\ No newline at end of file diff --git a/_tutorials/102_march/step-09/102_march_step-09-desc.html b/_tutorials/102_march/step-09/102_march_step-09-desc.html index b01f0395..f8978707 100644 --- a/_tutorials/102_march/step-09/102_march_step-09-desc.html +++ b/_tutorials/102_march/step-09/102_march_step-09-desc.html @@ -3,7 +3,7 @@

Ignore the additional elements, such as dynamics, slurs and accents at this point as they will be adressed in the next steps separately.

-

The pause is encoded with a <rest> element having a @dur attribute analogue to the <note> element.

+

The pause is encoded with a <rest> element having a @dur attribute similar to the <note> element.

Please encode the next measure (n=2) in the editor below. Add a staff and layer element which contains 4 child elements: a quarter <note>, a <beam> with to eighth <note>'s and a dotted quarter <note> with an eighth <note>.

\ No newline at end of file diff --git a/_tutorials/102_march/step-10/102_march_step-10-desc.html b/_tutorials/102_march/step-10/102_march_step-10-desc.html index 66bf565b..7d9a7d54 100644 --- a/_tutorials/102_march/step-10/102_march_step-10-desc.html +++ b/_tutorials/102_march/step-10/102_march_step-10-desc.html @@ -1,7 +1,7 @@

In this step, you will add the articulation signs to your encoding of the example.

-

Articulations, i.e. indications of how to play a note or chord, can be encoded with <artic> elements that are applied as children to <note> elements. From a lot of attributes that are possible with <artic>, you are supposed to use the following in this tutorial step:

+

Articulations, i.e. indications of how to play a note or chord, can be encoded with <artic> elements that are applied as children to <note> elements. You should use the following attributes on <artic> in this tutorial step:

  • @artic (articulation type) – the type of articulation mark, e.g.: accent “acc”, staccato “stacc”, tenuto “ten”
  • @place – position of the articulation sign, “above” or “below” the staff.
  • diff --git a/_tutorials/102_march/step-11/102_march_step-11-desc.html b/_tutorials/102_march/step-11/102_march_step-11-desc.html index 3c9b54f3..1041a542 100644 --- a/_tutorials/102_march/step-11/102_march_step-11-desc.html +++ b/_tutorials/102_march/step-11/102_march_step-11-desc.html @@ -3,7 +3,7 @@

    You define dynamics with a <dynam> element. The <dynam> element may be used for instantaneous or continuous textual dynamics, e.g. “p”, “mf”, or “cresc. poco a poco”.

    -

    Unlike articulation signs, the <dynam> element is a so called control event which groups elements (such as dynamics, ties, phrase marks, pedal marks, etc.), which depend upon other events, such as notes or rests, for their existence. In general, control events are not encoded as child elements of the corresponding events they are meant to control. In practice, it means that they are placed outside the staff elements in most cases.

    +

    Unlike articulation signs, the <dynam> element is a so-called control event which groups elements (such as dynamics, ties, phrase marks, pedal marks, etc.), which depend upon other events, such as notes or rests, for their existence. In general, control events are not encoded as child elements of the corresponding events they are meant to control. In practice, it means that they are placed outside the staff elements in most cases.

    There are different options to indicate the reference to a <note> or <rest> (or any other event) from a control event like <dynam>: diff --git a/_tutorials/102_march/step-12/102_march_step-12-desc.html b/_tutorials/102_march/step-12/102_march_step-12-desc.html index e6262851..5111107b 100644 --- a/_tutorials/102_march/step-12/102_march_step-12-desc.html +++ b/_tutorials/102_march/step-12/102_march_step-12-desc.html @@ -1,17 +1,17 @@

    -

    Well done, you'are almost there. In this step, you will add the last missing detail of the example: the slur in the third measure.

    +

    Well done, you are almost there. In this step, you will add the last missing detail of the example: the slur in the third measure.

    -

    There are two different ways, to encode a slur in MEI:

    +

    There are two different ways to encode a slur in MEI:

    1. You can use a @slur attribute on <note> or <chord> with a value of i=initial, m=medial or t=terminal.
    2. You can use a separate <slur> element.
    -

    In this tutorial step, you will use the second approach: Like dynamics, <slur> elements are control events, too, what means, that they are not encoded as child elements of the corresponding events they are meant to control but in most cases outside the staff elements.

    +

    In this tutorial step, you will use the second approach: Like dynamics, <slur> elements are control events. They are not encoded as child elements of the corresponding events that they are meant to control but are placed in most cases outside the staff elements.

    -

    To indicate the starting point and end point of the slur, it is possible to apply a reference to the corresponding @xml:id of a <note> or <chord> element. @xml:id's are identifiers with an arbitrary but unique character sequence that regularize the naming of an element throughout a document and thus facilitate building links between elements and other resources. For <slur>s, a reference to the @xml:id of an element can be given via the attributes @startid and @endid.

    +

    To indicate the starting point and end point of the slur, it is possible to apply a reference to the corresponding @xml:id of a <note> or <chord> element. @xml:ids are identifiers with an arbitrary but unique character sequence that regularize the naming of an element throughout a document and thus facilitate building links between elements and other resources. For <slur>s, a reference to the @xml:id of an element can be given via the attributes @startid and @endid.

    -

    Along with @startid and @endid, you are supposed to use the following attributes in this step:

    +

    Along with @startid and @endid, you should use the following attributes in this step:

    • @staff – the identification number of the staff to which an element is applied, e.g. “1” in this case
    • @curvedir (curve direction) – describes a curve with a generic term indicating the direction of curvature: “above”, “below” or “mixed”
    • From 4120b6605c3a2b054690dad37e6ffe31cb13fb3a Mon Sep 17 00:00:00 2001 From: "Stefan@AWG2" Date: Wed, 5 Dec 2018 17:22:56 +0100 Subject: [PATCH 13/13] fix(tutorials): fix tutorial task for step 9 (copy&paste error) --- _tutorials/102_march/step-09/102_march_step-09-desc.html | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/_tutorials/102_march/step-09/102_march_step-09-desc.html b/_tutorials/102_march/step-09/102_march_step-09-desc.html index f8978707..229c7648 100644 --- a/_tutorials/102_march/step-09/102_march_step-09-desc.html +++ b/_tutorials/102_march/step-09/102_march_step-09-desc.html @@ -5,5 +5,5 @@

      The pause is encoded with a <rest> element having a @dur attribute similar to the <note> element.

      -

      Please encode the next measure (n=2) in the editor below. Add a staff and layer element which contains 4 child elements: a quarter <note>, a <beam> with to eighth <note>'s and a dotted quarter <note> with an eighth <note>.

      +

      Please encode the final two measures (n=3 & n=4) of the example in the editor below. Add <measure>, <staff> and <layer> elements as well as the corresponding <note>, <beam> or <rest> elements. This is the most ambitious step of the tutorial. If you feel lost or unsure at any time, try to follow the hints that are displayed next to the editor box.

    \ No newline at end of file