A Javascript parser for musical data in the Humdrum syntax
This tutorial covers various ways that data can be loaded into a Humdrum object. Data can be loaded either when the object is created, or later by calling Humdrum.parse. Data can be loaded either from a string or from text extracted from the HTML DOM, or it even can be downloaded from the internet with a URL or URI.
When loading from a string, an element or with a ID reference to an HTML element, the data is processed immediately; however, when loading with a URL or URI, it will take some amount of time to download the data before it can be processed. Therefore, to continue processing the parsed data after loading a URL/URI, you need to assign a function to Humdrum.onload. This function will be called after the data has been downloaded and parsed into a Humdrum object.
Here is an example of loading data from a string when creating a Humdrum object:
var text = "**kern\n1c\n*-";
var h = new Humdrum(text);
Try copy-and-pasting the above code into the javascript console of your browser. You can usually open the console by typing control/command + alt/option + i/j. The exact key combination will depend on your browser and operating system. After entering the above two javascript lines, you can then use the Humdrum.stringify function to output a string containing the contents of the Humdrum object:
var text = "**kern\n1c\n*-";
var h = new Humdrum(text);
h.stringify();
This will display the Humdrum data in the console. Alternatively, you can print the data string to the console, which will have nearly the same effect:
var text = "**kern\n1c\n*-";
var h = new Humdrum(text);
console.log(h.stringify());
Here is an image showing the process of copy-and-pasting the above javascript code on the console:
(Click on the image to view in more detail.)
Notice the text that shows up after the javascript code that was pasted:
**kern
1c
*-
This is the contents of the Humdrum object that was extracted using the Humdrum.stringify function.
You can also view the internal structure of the Humdrum object by printing the object variable itself rather than the stringified version of the object:
var text = "**kern\n1c\n*-";
var h = new Humdrum(text);
console.log(h);
You can then click on the arrow button to the right of the object line in the console to see the internal structure of the object:
(Click on the image to view in more detail.)
Here is an example of loading data from a string after creating a Humdrum object by using the Humdrum.parse function. Instead of loading the data immediately upon creation of the Humdrum object, the data is loaded using the Humdrum.parse function afterwards.
var text = "**kern\n1c\n*-";
var h = new Humdrum();
h.parse(text);
When loading text content into a Humdrum object, either method gives the same results; however, when loading data with a URL/URI, the data will usually be parsed after creating the object (more about that in the URL section of the tutorial).
An alternate and more convenient way of storing and accessing text content
to be loaded into a Humdrum object is to extract
it from an HTML element on the webpage. The element should preferably
be a <script>
element so that its contents is always stored in the DOM
as a string rather than as an HTML element tree (more on that later).
Script tags always contain plain text, which allows all characters
to remain unaltered when reading or writing the Humdrum data to/from
the element.
Normally a <script>
element contains a javascript program. You need to
explicitly tell the web-browser that its contents is not a javascript
program by setting the value of the script’s type
attribute to
text/x-humdrum
. This is a MIME type for Humdrum data: text
means
that the contents is plain text, and the x-
prefix means that humdrum
is not a standard MIME subtype.
Below is an example Humdrum data script that is embedded into this webpage
(this is not the actual script, which is hidden). Also note that the
element is assigned a unique identifier of twinkle
which allows easy
access to the element in javascript.
<script id="twinkle" type="text/x-humdrum">
**kern
*M4/4
=1
4c
4c
4g
4g
=2
4a
4a
2g
=3
4f
4f
4e
4e
=4
4d
4d
2c
==
*-
</script>
Here is an example of how to extract the text from the element using the textContent variable of the element.
var element = document.querySelector("#twinkle");
var text = element.textContent;
var h = new Humdrum(text);
The first line finds the Humdrum script element labeled with the ID
twinkle
on the page. The second line extracts the text content
from the element, and the third line loads the data into a Humdrum object. Try copy-and-pasting that code
into the javascript console, and then printing the contents of the
h
variable.
The first two lines of the code can be merged into a single step like this (provided that an element was found with querySelector):
var text = document.querySelector("#twinkle").textContent;
var h = new Humdrum(text);
And even one line can be done:
var h = new Humdrum(document.querySelector("#twinkle").textContent);
Although if you cannot guarantee that an element with the twinkle ID exists on the webpage, then it is better to do error checks:
var element = document.querySelector("#twinkle");
if (element) {
var h = new Humdrum(element.textContent);
} else {
console.log("Error: cannot find twinkle data");
}
The Humdrum object or Humdrum.parse can be given an HTML element, and they will extract text content from the element automatically. In other words, you do not need to extract text from the element with textContent yourself, since the Humdrum parser can do that for you:
var element = document.querySelector("#twinkle");
var h = new Humdrum(element);
Although it is recommended to use a <script>
element to store Humdrum
text within a webpage, you can actually store Humdrum data in any HTML
element, as long as special HTML characters are escaped as HTML entities.
Mostly this involves using &
for &
, <
for <
and >
for
>
. This subsection goes into the gory details of the differences between
<script>
and other elements. If you plan to always store data using
a <script>
element, then you can skip this section; but otherwise,
you will have to suffer reading through it.
Here is an example of correctly encoded data stored in a non-script element:
<div id="humdiv">
**text
some
<text>
in
</text>
angle
brackets
*-
</div>
If this data were stored in a <script>
rather than a <div>
, then
the correct encoding would match the raw Humdrum data:
<script type="text/x-humdrum" id="humscript">
**text
some
<text>
in
</text>
angle
brackets
*-
</div>
In both cases, data can be extracted correctly from elements with the .textContent variable of the element:
var dive = document.querySelector("#humdiv");
var scripte = document.querySelector("#humscript");
console.log("DIV TEXT:", dive.textContent);
console.log("SCRIPT TEXT:", scripte.textContent);
In both cases the extracted texts will be the same:
DIV TEXT:
**text
some
<text>
in
</text>
angle
brackets
*-
SCRIPT TEXT:
**text
some
<text>
in
</text>
angle
brackets
*-
However, notice that if you do not HTML escape text in a non-script element, the returned text may be messed up, since the text was parsed as if it were HTML code when it is not:
<div id="humdivbad">
**text
some
<text>
in
</text>
angle
brackets
*-
</div>
var divbad = document.querySelector("#humdivbad");
console.log("DIV BAD TEXT:", divbad.textContent);
The above code will generate the output:
DIV BAD TEXT:
**text
some
in
angle
brackets
*-
The problem is that <text>
and </text>
look like HTML elements, and
the HTML parser converted them into elements when loading the page (as it
should be expected to do so). The textContent
variable extracts the plain text portions of an element’s contents,
so it will remove any element tags. You could try to extract the HTML
content of the div instead:
var divbad = document.querySelector("#humdivbad");
console.log("NEW DIV BAD HTML:", divbad.innerHTML);
which will give the desired text:
NEW DIV BAD HTML:
**text
some
<text>
in
</text>
angle
brackets
*-
but the problem is that the Humdrum data was parsed into HTML elements inadvertently when the page was loaded. Since they looked very much like HTML code, the original content could be reconstructed with innerHTML. But if the angle brackets do not make sense to the HTML parser, it will escape them to treat as regular text:
<div id="humdivbad2">
**text
some
<text
in
/text>
angle
brackets
*-
</div>
Now when using innerHTML on the
new example, the <
and >
characters have been escaped
by the HTML parser to indicate that it does not think they
are part of HTML element tags and should be interpreted as
plain text.
var divbad2 = document.querySelector("#humdivbad2");
console.log("DIV BAD 2 HTML:", divbad2.innerHTML);
Results in escaped characters in the data extraction:
DIV BAD 2 HTML:
**text
some
<text
in
/text>
angle
brackets
*-
In this case you would need to use textContent to unescape the escaped characters:
var divbad2 = document.querySelector("#humdivbad2");
console.log("DIV BAD 2 TEXT:", divbad2.textContent);
DIV BAD 2 TEXT:
**text
some
<text
in
/text>
angle
brackets
*-
but that would mean that sometime you need textContent and at other times innerHTML to extract the correctly formatted data, and this cannot be predicted with 100% accuracy.
The moral of the story is that the Humdrum data stored in an HTML element
must be stored as plain text so that the HTML parser does not try to
create HTML elements out of the data. If you do not escape the Humdrum
data contents when writing it inside of an element other than <script>
,
the HTML parser will try to interpret what it finds as HTML data rather
than Humdrum data. The <script>
tag does not have this problem, so
you do not need to be as careful, since the HTML parser knows that it
always must treat the contents of <script>
as plain text.
When writing Humdrum data to a non-script element within javascript,
you must use the textContent variable rather
than innerHTML. This will escape any special
characters that HTML may otherwise process. Then when extracting
the data, use textContent again. This will
transparently reverse the process to unescape the special characters.
When using a <script>
element, both textContent
or innerHTML can be used since they will have
equivalent behaviors. But, as has been illustrated in this section,
non-script elements they can have different behaviors when using innerHTML or mixing innerHTML
and textContent.
Also keep in mind that if you are typing Humdrum data by hand into a non-script
element on a webpage, you will have to escape the characters &
, <
and >
to
avoid problems when extracting the text content from the element for loading
into the Humdrum object.
The laziest way to load content from a webpage is to give an ID reference as input into the Humdrum object parser:
var h = new Humdrum("#twinkle");
or with delayed data loading:
var h = new Humdrum();
h.parse("#twinkle");
The Humdrum object will find the element, and
extract the text content for you. The string #twinkle
starts with a
#
character, which indicates that the following text is the ID of
an element. In the above example data, the ID was set to twinkle
,
so the element can be found using this ID.
If you want to use a different selector than an ID for some reason, it is better to select the element yourself and then give the selected element to the Humdrum initializer or parse function. However, if you really want humdrum-js to handle the selecting of the element, you can use the HumdrumBase.ParseSelector function, which inputs a selector as its argument, and will then choose the first element on the page that matches to it for extracting the Humdrum data:
var h = new Humdrum();
h.ParseSelector("script#twinkle");
If you try to do this:
var h = new Humdrum();
h.parse("script#twinkle");
the intended selector would instead be automatically interpreted as a URL to a local file called “script”.
Previous examples have shown how to load data from an HTML element or from a javascript string variable. You can also download data from a URL. The data can be either stored on the same server as the webpage, or a remote server.
Here is an example of loading a Humdrum file from the same server:
var h = new Humdrum();
h.onload = function (x) {
console.log("Downloaded data:");
console.log(h.stringify());
}
h.parse("twinkle.txt");
Notice the use of the Humdrum.onload function in this example. Since the Humdrum data needs to be downloaded from a location external to the webpage, a separate thread will be created to wait for the data to be downloaded. Therefore in order to do anything useful with the parsed data, a function needs to be called after the data will have been downloaded and parsed into the Humdrum object. Try the following code, and you should notice that nothing will be printed if you copy and paste all of the lines of code at the same time:
var h = new Humdrum("twinkle.txt");
console.log(h.stringify());
However, if you copy and paste each line separately, there should be content printed for the object. This is because by the time you copy and paste the second line, the data has been downloaded and parsed for the first line of code. So in an interactive environment you do not usually have to use the Humdrum.onload function, but in non-interactive situations, it is required for loading external data from a URL.
It is possible to download data from other web servers rather than just the same web server that hosts the web page humdrum-js is running in. However, this will be dependent on the remote server allowing indirect connections to its resources. If you run a web server and want to allow CORS (Cross Origin Resource Sharing), then you may have to configure your web server to allow it. Here are instructions for allowing this on an Apache webserver, for example.
The Github servers do allow remote access to data files. For example, the data for this Github repository file can be found here (click on the “Raw button near the top of the previous link to get to the plain text version of the file). Here is an example of downloading data from that URL:
var h = new Humdrum();
h.onload = function (x) {
console.log("Composer of music:", h.getRefValue("COM").value);
console.log("Number of lines in data:", h.getLineCount());
console.log("Downloaded data:", h.stringify());
};
h.parse("https://raw.githubusercontent.com/craigsapp/beethoven-piano-sonatas/master/kern/sonata01-1.krn");
Running this code should result in the output:
Composer of music: Beethoven, Ludwig van
Number of lines in data: 1429
!!!!SEGMENT: h://beethoven/sonatas/sonata01-1.krn
!!!COM: Beethoven, Ludwig van
!!!CDT: 1770///-1827///
!!!OTL: Piano Sonata no. 1 in F minor
!!!ODT: 1794///-1795///
!!!ODE: Joseph Haydn
!!!OMD: Allegro
!!!OPS: 2
!!!ONM: 1
!!!OMV: 1
!!!AGN: Sonata Form
**kern **dynam **kern **dynam
*Ipiano *Ipiano *Ipiano *Ipiano
*>[A,A,B,B] *>[A,A,B,B] *>[A,A,B,B] *>[A,A,B,B]
*>norep[A,B] *>norep[A,B] *>norep[A,B] *>norep[A,B]
*>A *>A *>A *>A
*clefF4 *clefF4 *clefG2 *clefG2
*k[b-e-a-d-] *k[b-e-a-d-] *k[b-e-a-d-] *k[b-e-a-d-]
*f: *f: *f: *f:
*M2/2 *M2/2 *M2/2 *M2/2
*MM240 *MM240 *MM240 *MM240
! ! ! !LO:DY:X=-22:Y=30
4r . (4c'/ p
=1 =1 =1 =1
1r . 4f'/ .
. . 4a-'/ .
. . 4cc'\ .
. . 4ff'\) .
=2 =2 =2 =2
4r . (4.aa-\ .
! !LO:DY:X=-20:z=5 ! !
4F\ 4A-\ 4c\ p . .
. . 24gg\LL .
. . 24ff\ .
. . 24ee\JJ .
4F\ 4A-\ 4c\ . 4ff'\) .
4F\ 4A-\ 4c\ . 4r .
=3 =3 =3 =3
4E\ 4G\ 4B-\ 4c\ . 4g'/ .
4r . 4cc'\ .
2r . 4ee'\ .
. . 4gg'\ .
=4 =4 =4 =4
4r . (4.bb-\ .
4E\ 4G\ 4B-\ 4c\ . . .
. . 24aa-\LL .
. . 24gg\ .
. . 24ff\JJ .
4E\ 4G\ 4B-\ 4c\ . 4gg'\) .
4E\ 4G\ 4B-\ 4c\ . 4r .
!!LO:LB:g=dukas
!!LO:LB:g=z16
=5 =5 =5 =5
. . (cc8q/ .
! ! !LO:DY:X=-20 !
4r . (4.aa-z\) .
4F\ 4A-\ 4c\ . . .
. . 24gg\LL .
. . 24ff\ .
. . 24ee\JJ .
4F\ 4A-\ 4c\ . 4ff'\) .
4F\ 4A-\ 4c\ . 4r .
=6 =6 =6 =6
. . (cc8q/ .
! ! !LO:DY:X=-20 !LO:HP:X=10:Y=25
4r . (4.bb-z\) <
4G\ 4B-\ 4e\ . . (
. . 24aa-\LL (
. . 24gg\ (
. . 24ff\JJ (
! ! ! !LO:HPZ:X=-30
4G\ 4B-\ 4e\ . 4gg'\) [
4G\ 4B-\ 4e\ . 4r .
=7 =7 =7 =7
! ! ! !LO:DY:Y=30
4r ffyy 2cc\: 2ff\: 2aa-\: 2ccc\: ff
4A-\ 4c\ 4f\ . . .
! ! ! !LO:HP:Y=25
4r . (8bb-\L >
. . 8aa-\ )
4B-\ 4d-\ 4g\ . 8gg\ )
. . 8ff\J) ]
=8 =8 =8 =8
. . (16eenXq/LL .
. . 16ffq/ .
. . 16ggq/JJ .
! ! ! !LO:DY:X=-10
4r . (4ff\) p
4c\ 4g\ . 4eenX\) .
4r; . 4r; r
! !LO:DY:X=-25:Y=20 ! !
4GG'/ p 4r .
=9 =9 =9 =9
4C'\ . 1r .
4E-X'\ . . .
4G'\ . . .
4c'\ . . .
!!LO:LB:g=dukas
!!LO:LB:g=z16
=10 =10 =10 =10
(4.e-\ . 1r .
24d\LL . . .
24c\ . . .
24B\JJ . . .
4c'\) . . .
4c'\ . . .
=11 =11 =11 =11
* * *^ *
1c 1f . 4r [1a- .
. . 8r . .
. . (24ee-/LL . .
. . 24dd-X/ . .
. . 24cc/JJ) . .
! ! !LO:SC:b ! !
. . 4dd-'/ . .
! ! !LO:SC:b ! !
. . 4dd-'/ . .
=12 =12 =12 =12 =12
1B- 1f . [1dd- 4.a-\] .
. . . (24b-\LL .
. . . 24a-\ .
. . . 24g\JJ) .
! ! ! !LO:SC:a !
. . . 4a-'\ .
! ! ! !LO:SC:a !
. . . 4a-'\ .
=13 =13 =13 =13 =13
1B- 1e- . 4.dd-/] 1g .
. . (24ee-/LL . .
. . 24dd-/ . .
. . 24cc/JJ) . .
! ! !LO:SC:b ! !
. . 4dd-'/ . .
! ! !LO:SC:b ! !
. . 4dd-'/ . .
=14 =14 =14 =14 =14
1A- 1e- . 4r 1a- .
. . 8r . .
. . (24dd-/LL . .
. . 24cc/ . .
. . 24b/JJ . .
! ! !LO:SC:b ! !
. . 4cc'/) . .
! ! !LO:SC:b ! !
. . 4cc'/ . .
!!LO:LB:g=dukas
=15 =15 =15 =15 =15
! ! ! ! !LO:HP:X=-10:Y=30
2d-\ . (4cc/ 1f <
! ! ! ! !LO:HPZ:X=10:Y=30
! ! ! ! !LO:HP:X=20:Y=30
. . 2b-/ . [ >
2d\ . . . )
. . 4a-/) . ]
* * *v *v *
!!LO:LB:g=z16
=16 =16 =16 =16
4e-\ . 4g'/ .
4r . (4ee-\ .
4r . 4dd-\) .
4c\ (4e-\ . [4cc\ .
=17 =17 =17 =17
! ! ! !LO:HP:X=-10:Y=30
2d-\ 2f\) . (4cc\] <
! ! ! !LO:HPZ:X=10:Y=30
! ! ! !LO:HP:X=20:Y=30
. . 2b-\ [ >
2d\ 2f\ . . )
. . 4a-\ ]
=18 =18 =18 =18
4e-\ . 4g/) .
4r . (4e-/ 4ee-/ f
4r . 4d-X/ 4dd-X/ .
4C\ (4E-\ . [4c/) [4cc/ .
=19 =19 =19 =19
2D-\ 2F\) . (4c/] 4cc/] .
. . 2B-/ 2b-/ .
2D\ 2F\ . . .
. . 4A-/ 4a-/ .
=20 =20 =20 =20
8E-\L . 4G/) 4g/ .
8e-\ . . .
8E-\ . 4r .
8e-\J . . .
8E-\L . 4r .
8e-\ . . .
! ! ! !LO:DY:y=-7
8E-\ . (4ff-\ p
8e-\J . . .
!!LO:LB:g=dukas
=21 =21 =21 =21
8E-\L . 4ee-\ .
8e-\ . . .
8E-\ . 4dd-\ .
8e-\J . . .
8E-\L . 4b-\ .
8e-\ . . .
8E-\ . 4g/) .
8e-\J . . .
!!LO:LB:g=z16
=22 =22 =22 =22
*^ * * *
! ! ! !LO:DY:X=-12:y=2 !
(2d-zy/ 4E-\ . (4.f-z/ .
. 4E-\ . . .
. . . 8e-/ .
4c/) 8E-\L . 4a-'/) .
. 8e-\ . . .
4ryy 8E-\ . (4ff-X\ .
. 8e-\J . . .
*v *v * * *
=23 =23 =23 =23
8E-\L . 4ee-\ .
8e-\ . . .
8E-\ . 4dd-\ .
8e-\J . . .
8E-\L . 4b-\ .
8e-\ . . .
8E-\ . 4g/) .
8e-\J . . .
=24 =24 =24 =24
*^ * * *
! ! ! !LO:DY:X=-15 !
(2d-zy/ 4E-\ . (4.f-z/ .
. 4E-\ . . .
. . . 8e-/ .
4c/) 8E-\L . 4a-'/) .
. 8e-\ . . .
4ryy 8E-\ . (4ff-X\ .
. 8e-\J . . .
*v *v * * *
=25 =25 =25 =25
8E-\L . 4ee-\ .
8e-\ . . .
8E-\ . 4dd-\ .
8e-\J . . .
8d-\L . 4b-\ .
8e-\ . . .
8d-\ . 4g/) .
8e-\J . . .
!!LO:LB:g=dukas
=26 =26 =26 =26
8c\L . 8r .
8e-\ . (8g/L .
8c\ . 8b-/ .
8e-\J . 8a-/J) .
8G\L . 8r .
8e-\ . (8a/L .
8G\ . 8cc/ .
8e-\J . 8b-/J) .
!!LO:LB:g=z16
=27 =27 =27 =27
8A-\L . 8r .
8e-\ . (8b\L .
8A-\ . 8dd-\ .
8e-\J . 8cc\J) .
8F\L . 8r .
! ! ! !LO:HP:X=-20:Y=30
8d\ . (8dd\L <
! ! ! !LO:HPZ:X=-5
! ! ! !LO:HP:Y=30
8A-\ . 8aa-\ [ >
8d\J . 8dd\J) ]
=28 =28 =28 =28
8E-\L . 4ee-\ .
8e-\ . . .
8G\ . 4r .
8e-\J . . .
8F\L . 8r .
! ! ! !LO:HP:X=-20:Y=30
8d\ . (8dd\L <
! ! ! !LO:HPZ:X=-5
! ! ! !LO:HP:Y=30
8A-\ . 8aa-\ [ >
8d\J . 8dd\J) ]
=29 =29 =29 =29
8E-\L . 4ee-\ .
8e-\ . . .
8G\ . 4r .
8e-\J . . .
8D-X\L . 8r .
! ! ! !LO:HP:X=-20:Y=30
8B-\ . (8gg\L <
! ! ! !LO:HPZ:X=-5
! ! ! !LO:HP:Y=30
8F-\ . 8fff-\ [ >
8B-\J . 8gg\J) ]
=30 =30 =30 =30
8C\L . 4aa-\ .
8A-\ . . .
8E-\ . 4r .
8A-\J . . .
8D-\L . 8r .
! ! ! !LO:HP:X=-20:Y=30
8B-\ . (8gg\L <
! ! ! !LO:HPZ:X=-5
! ! ! !LO:HP:Y=30
8F-\ . 8fff-\ [ >
8B-\J . 8gg\J) ]
!!LO:LB:g=dukas
=31 =31 =31 =31
8C\L . 8r .
! ! ! !LO:HP:Y=30
8A-\ . (8gg\L <
8E-\ . 8bb-\ (
8A-\J . 8aa-\J) (
8GG\L . 8r (
8G\ . (8aa\L (
8E-\ . 8ccc\ (
8G\J . 8bb-\J) (
!!LO:LB:gg=z16
=32 =32 =32 =32
8AA-\L . 8r (
8A-\ . (8bb\L (
8E-\ . 8ddd-\ (
8A-\J . 8ccc\J) (
8BB-\L . 8r (
8B-\ . (8ccc\L (
8E-\ . 8eee-\ (
8B-\J . 8ddd-\J) [
=33 =33 =33 =33
4C\ fyy 8r .
. . (8ddd\L f
!LO:DY:X=-10 ! ! !
2E-z\ . 8fff\ .
. . 8eee-\J .
. . 8ddd-\L .
. . 8ccc\ .
4A-\ . 8bb-\ .
. . 8aa-\J .
=34 =34 =34 =34
4D-\ . 8gg\L .
. . 8ff\ .
!LO:DY:X=-10 ! ! !
2Fz\ . 8ee-\ .
. . 8dd-\J .
. . 8cc\L .
. . 8b-\ .
4B-\ . 8a-\ .
. . 8g\J) .
=35 =35 =35 =35
4E-\ . (8f/L p
. . 8e-/ .
!LO:DY:X=-10 ! ! !
2A-z\ . 8d/ .
. . 8e-/J .
. . 8d/L .
. . 8e-/ .
4c\ . 8d/ .
. . 8e-/J .
!!LO:LB:g=dukas
=36 =36 =36 =36
(4d-X\ . 8dn/L .
. . 8e-/ .
4B-\ . 8f/ .
. . 8e-/J .
4G\ . 8d/L .
. . 8e-/ .
4D-\) . 8f/ .
. . 8e-/J) .
!!LO:PB:g=z16
=37 =37 =37 =37
4CC/ . 8r .
. . (8aa-\L f
2EE-z/ . 8fff\ .
. . 8eee-\J .
. . 8ddd-\L .
. . 8ccc\ .
4AA-/ . 8bb-\ .
. . 8aa-\J .
=38 =38 =38 =38
4DD-/ . 8gg\L .
. . 8ff\ .
2FFz/ . 8ee-\ .
. . 8dd-\J .
. . 8cc\L .
. . 8b-\ .
4BB-/ . 8a-\ .
. . 8g\J .
=39 =39 =39 =39
! ! ! !LO:DY:Y=25
4EE-/ . 8f/L p
. . 8e-/ .
2AA-z/ . 8d-/ .
. . 8c/J .
* * *clefF4 *clefF4
. . 8B-\L .
. . 8A-\ .
4C/ . 8G\ .
. . 8F\J .
=40 =40 =40 =40
(4D-/ . 8E-\L .
. . 8F\ .
4BB-/ . 8G\ .
. . 8A-\J .
4GG/ . 8B-\L .
. . 8c\ .
4EE-/) . 8d-\ .
. . 8B-\J .
!!LO:LB:g=dukas
=41 =41 =41 =41
4AA-/ . 4A-\) .
* * *clefG2 *clefG2
4A-\ . 4r .
. . (d8qnX/ .
! ! !LO:TX:i:t=con espressione:Z=15:X=-30 !
! ! ! !LO:DY:X=30
4r . (4.cc-\) >
4D'\ 4F'\ 4A-'\ 4c-'\ pyy . )
. . 8b-\) ]
!!LO:LB:gg=z16
=42 =42 =42 =42
4r . 2a-/ .
4E-'\ 4A-'\ 4cnX'\ . . .
! ! !LO:S:b !
4r . (4.g/ .
4E-'\ 4B-'\ 4d-'\ . . .
. . 8ee-\) .
=43 =43 =43 =43
4r . (4ee-z\ .
4A-'\ 4c'\ . 4a-\) .
. . (d8q/ .
! ! ! !LO:DY:X=30
4r . (4.cc-\) >
4D'\ 4F'\ 4A-'\ 4c-'\ . . )
. . 8b-\) ]
=44 =44 =44 =44
4r . 2a-/ .
4E-'\ 4A-'\ 4cnX'\ . . .
! ! !LO:S:b !
4r . (4.g/ .
4E-'\ 4B-'\ 4d-'\ . . .
. . 8ee-\) .
=45 =45 =45 =45
4r . (4ee-z\ .
4A-'\ 4c'\ . 4a-\) .
*clefG2 *clefG2 * *
. . (ddnX8q/ .
! ! ! !LO:DY:X=20:Y=25
4r . (4.ccc-\) >
4d'/ 4f'/ 4a-'/ 4cc-'/ . . )
. . 8bb-\) ]
=46 =46 =46 =46
4r . 2aa-\ .
4e-'/ 4a-'/ 4ccnX'/ . . .
4r . (4.gg\ .
4e-'/ 4b-'/ 4dd-'/ . . .
. . 8eee-\) .
=47 =47 =47 =47
! ! ! !LO:DY:Y=40
! ! ! !LO:HP:X=30:Y=40
1A-/ 1B-/ 1d-/ 1e-/ 1g/ . 1dd-\ 1gg\ 1eee-\ ff>]
=48 =48 =48 =48
! ! ! !LO:DY:Y=40
4A-/ 4c/ 4e-/ 4a-/ . 4cc\ 4ee-\ 4aa-\ p
4r . 4r r
4r . 4r r
*clefF4 * * *
!!LO:LB:g=z16
=:|!|: =:|!|: =:|!|: =:|!|:
*>B *>B *>B *>B
!!LO:LB:g=dukas
4r . 4e-'/ p
=49 =49 =49 =49
1r . 4a-'\ .
. . 4cc'\ .
. . 4ee-'\ .
. . 4aa-'\ .
*clefF4 *clefF4 * *
=50 =50 =50 =50
4r . (4.ccc\ .
4A-\ 4c\ 4e-\ pyy . .
. . 24bb-\LL .
. . 24aa-\ .
. . 24gg\JJ .
4A-\ 4c\ 4e-\ . 4aa-'\) .
4A-\ 4c\ 4e-\ . 4r .
=51 =51 =51 =51
. . (dd-8q/ .
4r . (4.ddd-\) .
4G\ 4B-\ 4d-\ 4e-\ . . .
. . 24ccc\LL .
. . 24bb-\ .
. . 24aa\JJ .
4G\ 4B-\ 4d-\ 4e-\ . 4bb-'\) .
4G\ 4B-\ 4d-\ 4e-\ . 4r .
=52 =52 =52 =52
1r . 4b-'\ .
. . 4dd-'\ .
. . 4gg'\ .
. . 4bb-'\ .
=53 =53 =53 =53
. . (dd-8q/ .
4r . (4.ddd-\) .
4G\ 4B-\ 4d-\ 4e\ . . .
. . 24ccc\LL .
. . 24bb-\ .
. . 24aa\JJ .
4G\ 4B-\ 4d-\ 4e\ . 4bb-'\) .
4G\ 4B-\ 4d-\ 4e\ . 4r .
!!LO:LB:g=dukas
!!LO:LB:gg=z16
=54 =54 =54 =54
. . (dd-8q/ .
! ! ! !LO:HP:Y=30
4r . (4.ddd-\) <
4G-\ 4B-\ 4d-\ 4e\ . . (
. . 24ccc\LL (
. . 24bb-\ (
. . 24aa\JJ (
! ! ! !LO:HPZ:X=-30
4G-\ 4B-\ 4d-\ 4e\ . 4bb-'\) [
4G-\ 4B-\ 4d-\ 4e\ . 4r .
=55 =55 =55 =55
! ! ! !LO:DY:X=-10
8F\L . 4aa\ fp
8f\ . . .
8F\ . 4r .
8f\J . . .
8F\L . 4r .
8f\ . . .
! ! ! !LO:DY:X=-10:y=-10
8F\ . (4gg-\ p
8f\J . . .
=56 =56 =56 =56
8F\L . 4ff\ .
8f\ . . .
8F\ . 4ee-\ .
8f\J . . .
8F\L . 4cc\ .
8f\ . . .
8F\ . 4a\) .
8f\J . . .
=57 =57 =57 =57
*^ * * *
! ! ! !LO:DY:X=-15:y=2 !
(2e-zy/ 4F\ . (4.g-z/ .
. 4F\ . . .
. . . 8f/ .
4d-/) 8F\L . 4b-'/) .
. 8f\ . . .
4ryy 8F\ . (4gg-X\ .
. 8f\J . . .
*v *v * * *
=58 =58 =58 =58
8F\L . 4ff\ .
8f\ . . .
8F\ . 4ee-\ .
8f\J . . .
8F\L . 4cc\ .
8f\ . . .
8F\ . 4a\) .
8f\J . . .
!!LO:LB:g=dukas
=59 =59 =59 =59
*^ * * *
! ! ! !LO:DY:X=-15:y=2 !
(2e-zy/ 4F\ . (4.g-z/ .
. 4F\ . . .
. . . 8f/ .
4d-/) 8F\L . 4b-'/) .
. 8f\ . . .
4ryy 8F\ . (4gg-X\ .
. 8f\J . . .
*v *v * * *
!!LO:LB:gg=z16
=60 =60 =60 =60
8F\L . 4ff\ .
8f\ . . .
8F\ . 4ee-\ .
8f\J . . .
8e-\L . 4cc\ .
8f\ . . .
8e-\ . 4a\) .
8f\J . . .
=61 =61 =61 =61
8d-\L . 8r .
! ! ! !LO:HP:Y=30
8f\ . (8a\L <
8d-\ . 8cc\ (
8f\J . 8b-\J) (
8c\L . 8r (
8f\ . (8b-\L (
8c\ . 8dd-\ (
8f\J . 8cc\J) (
=62 =62 =62 =62
8B-\L . 8r (
8f\ . (8cc\L (
8B-\ . 8ee-\ (
8f\J . 8dd-\J) (
8A-\L . 8r (
8f#\ . (8b\L (
8A-\ . 8dd\ (
8f#\J . 8cc\J) [
=63 =63 =63 =63
! ! ! !LO:DY:X=-12
8G\L . 4b\ fp
8g\ . . .
8G\ . 4r .
8g\J . . .
8G\L . 4r .
8g\ . . .
8G\ . (4aa-\ .
8g\J . . .
!!LO:PB:g=dukas
=64 =64 =64 =64
8G\L . 4gg\ .
8g\ . . .
8G\ . 4ff\ .
8g\J . . .
8G\L . 4dd\ .
8g\ . . .
8G\ . 4b\) .
8g\J . . .
!!LO:LB:gg=z16
=65 =65 =65 =65
*^ * * *
! ! ! !LO:DY:X=-12 !
(2fzy/ 4G\ . (4.a-z/ .
. 4G\ . . .
. . . 8g/ .
4e-/) 8G\L . 4cc'/) .
. 8g\ . . .
4ryy 8G\ . (4aa-\ .
. 8g\J . . .
*v *v * * *
=66 =66 =66 =66
8G\L . 4gg\ .
8g\ . . .
8G\ . 4ff\ .
8g\J . . .
8G\L . 4dd\ .
8g\ . . .
8G\ . 4b\) .
8g\J . . .
=67 =67 =67 =67
*^ * * *
! ! ! !LO:DY:X=-12 !
(2fzy/ 4G\ . (4.a-z/ .
. 4G\ . . .
. . . 8g/ .
4e-/) 4G\ . 4cc'/) .
!LO:S:a ! ! ! !
(4A-\ 4ryy . 8f/L .
. . . 8d/J .
*v *v * * *
=68 =68 =68 =68
4G\ . 8f/L .
. . 8d/ .
4F\ . 8f/ .
. . 8d/J .
4D\ . 8f/L .
. . 8d/ .
4BB/) . 8f/ .
. . 8d/J .
!!LO:LB:g=dukas
=69 =69 =69 =69
* * *^ *
!LO:DY:X=-10:y=2 ! ! ! !
(4.AA-z/ . 4r 8f\L .
. . . 8d\ .
. . (4b/ 8f\ .
8GG/ . . 8d\J .
4C'/) . 4cc/) 8e-\L .
. . . 8c\ .
(4G-\ . 4r 8e-\ .
. . . 8c\J .
!!LO:LB:gg=z16
=70 =70 =70 =70 =70
4F\ . 1r 8e-\L .
. . . 8c\ .
4E-\ . . 8e-\ .
. . . 8c\J .
4C/ . . 8e-\L .
. . . 8c\ .
4AA/) . . 8e-\ .
. . . 8c\J .
=71 =71 =71 =71 =71
!LO:DY:X=-10:y=2 ! ! ! !
(4.GG-z/ . 4r 8e-\L .
. . . 8c\ .
. . (4a/ 8e-\ .
8FF/ . . 8c\J .
4BB-'/) . 4b-/) 8d-\L .
. . . 8B-\ .
(4F-\ . 4r 8d-\ .
. . . 8B-\J .
=72 =72 =72 =72 =72
4E-\ . 1r 8d-\L .
. . . 8B-\ .
4D-\ . . 8d-\ .
. . . 8B-\J .
4BB-/ . . 8d-\L .
. . . 8B-\ .
4GG/) . . 8d-\ .
. . . 8B-\J .
=73 =73 =73 =73 =73
(4FF-/ . 2r 8d-\L .
. . . 8B-\ .
2EE-/) . . 8d-\ .
. . . 8B-\J .
! ! !LO:DY:Z=15 ! !
. . 2gz/ 8d-\L .
. . . 8B-\ .
!LO:DY:X=-10 ! ! ! !
[4E-z\ . . 8d-\ .
. . . 8B-\J .
!!LO:LB:g=dukas
=74 =74 =74 =74 =74
4E-\] . 2r 8c\L .
. . . 8A-\ .
2C\ . . 8e-\ .
. . . 8A-\J .
! ! !LO:DY:Z=20 ! !
. . 2a-z/ 8e-\L .
. . . 8A-\ .
[4CC/ . . 8e-\ .
. . . 8A-\J .
!!LO:PB:gg=z16
=75 =75 =75 =75 =75
4CC/] . 2r 8d-\L .
. . . 8A-\ .
2DD-/ . . 8d-\ .
. . . 8A-\J .
! ! !LO:DY:Z=10 ! !
. . 2fz/ 8d-\L .
. . . 8A-\ .
[4D-z/ . . 8d-\ .
. . . 8A-\J .
=76 =76 =76 =76 =76
4D-/] . 2r 8d-\L .
. . . 8G\ .
2BB-/ . . 8d-\ .
. . . 8G\J .
! ! !LO:DY:Z=15 ! !
. . 2gz/ 8d-\L .
. . . 8G\ .
[4BBB-/ . . 8d-\ .
. . . 8G\J .
=77 =77 =77 =77 =77
4BBB-/] . 2r 8c\L .
. . . 8G\ .
2CC/ . . 8c\ .
. . . 8G\J .
! ! !LO:DY:Z=10 ! !
. . 2enz/ 8c\L .
. . . 8G\ .
!LO:DY:X=-8 ! ! ! !
[4Cz/ . . 8c\ .
. . . 8G\J .
=78 =78 =78 =78 =78
4C/] . 2r 8A-\L .
. . . 8F\ .
2AA-/ . . 8c\ .
. . . 8F\J .
! ! !LO:DY:Z=10 ! !
. . 2fz/ 8c\L .
. . . 8F\ .
4AAA-/ . . 8c\ .
. . . 8F\J .
!!LO:LB:g=dukas
=79 =79 =79 =79 =79
4r . 2r 8d-\L .
. . . 8F\ .
(2BBB-/ . . 8d-\ .
. . . 8F\J .
! ! !LO:DY:Z=10 ! !
. . 2fz/ 8d-\L .
. . . 8F\ .
4BB-/) . . 8d-\ .
. . . 8F\J .
* * *v *v *
!!LO:LB:gg=z16
=80 =80 =80 =80
4r . 8d/L .
. . 8F/ .
(2BBBn/ . 8A-/ 8d/ 8f/ .
. . 8F/J .
. . 8A-/ 8d/ 8f/L .
. . 8F/ .
4BBnX/) . 8A-/ 8d/ 8f/ .
. . 8F/J .
=81 =81 =81 =81
8CC/L . 4G/ 4c/ 4e/ .
8C/ pyy . .
8E/ . 4r .
8C/J . . .
8E/L . 4r .
8C/ . . .
8E/ . (4cc\ .
8C/J . . .
=82 =82 =82 =82
8F\L . 4a-'\) .
8C\ . . .
8F\ . 4r .
8C\J . . .
8F\L . 4r .
8C\ . . .
8A-\ . (4ff\ .
8C\J . . .
=83 =83 =83 =83
8G\L . 4ee'\) .
8C\ . . .
8G\ . 4r .
8C\J . . .
8G\L . 4r .
8C\ . . .
8B-\ . (4ccc\ .
8C\J . . .
!!LO:LB:g=dukas
=84 =84 =84 =84
8A-\L . 4ff'\) .
8C\ . . .
8c\ . 4r .
8C\J . . .
8B\L . 2ff\z (2fff\z .
8C\ . . .
8d\ . . .
8C\J . . .
=85 =85 =85 =85
8c\L . 4ee\ 4eee\) .
8C\ . . .
8E\ . 4r .
8C\J . . .
8E\L . 4r .
8C\ . . .
8E\ . (4cct\ .
8C\J . . .
. . 16bnqLL/ .
. . 16ccqJJ/ .
!!LO:LB:gg=z16
=86 =86 =86 =86
8F\L . 4a-'/) .
8C\ . . .
8F\ . 4a-'/ .
8C\J . . .
8F\L . 4r .
8C\ . . .
8A-\ . (4ffT\ .
8C\J . . .
. . 16eenqLL/ .
. . 16ffqJJ/ .
=87 =87 =87 =87
8G\L . 4een'\) .
8C\ . . .
8G\ . 4ee'\ .
8C\J . . .
8G\L . 4r .
8C\ . . .
8B-\ . (4ccct\ .
8C\J . . .
. . 16bbnqLL/ .
. . 16cccqJJ/ .
=88 =88 =88 =88
8A-\L . 4ff'\) .
8C\ . . .
8c\ . 4ff'\ .
8C\J . . .
8B\L . 4r .
8C\ . . .
! ! !LO:DY:X=-10:y=-5 !
8d\ . 4ffz\ (4fffz\ .
8C\J . . .
!!LO:LB:g=dukas
=89 =89 =89 =89
8c\L . 4ee'\ 4eee'\) .
8C\ . . .
8c\ . 4ee'\ 4eee'\ .
8C\J . . .
8B-X\L . 4r .
8C\ . . .
8B-\ . 4dd-X\ (4ddd-X\ .
8C\J . . .
=90 =90 =90 =90
8A-\L >yy 4cc'\ 4ccc'\) >X
8C\ ) . )
8c\ ) 4cc'\ 4ccc'\ )
8C\J ) . )
8B\L ) 4r )
8C\ ) . )
8d\ ) 4ff\ (4fff\ )
8C\J ) . )
=91 =91 =91 =91
8c\L ) 4ee'\ 4eee'\) )
8C\ ) . )
8c\ ) 4ee'\ 4eee'\ )
8C\J ) . )
8B-X\L ) 4r )
8C\ ) . )
8B-\ ) 4dd-\ (4ddd-\ )
8C\J ) . )
!!LO:LB:gg=z16
=92 =92 =92 =92
8A-\L ) 4cc'\ 4ccc'\) )
8C\ ) . )
8c\ ) 4cc'\ 4ccc'\ )
8C\J ) . )
8B\L ) 4r )
8C\ ) . )
8d\ ) 4ff\ (4fff\ )
8C\J ]yy . ]X
=93 =93 =93 =93
! ! ! !LO:DY:Y=25:X=-10
(4c'\ ppyy 4ee'\ 4eee'\) pp
4c'\ . 4r .
4c'\ . 2r .
4c'\) . . .
!!LO:PB:g=dukas
=94 =94 =94 =94
(4c'\ . 1r .
4c'\ . . .
4c'\ . . .
4c'\) . . .
=95 =95 =95 =95
4c'\ (4d-'\ . 4r .
4c'\ 4d-'\ . 8r .
! ! ! !LO:DY:Z=15:X=-20
. . (24a-/LL pp
. . 24g-/ .
. . 24f/JJ .
4c'\ 4d-'\ . 4g-'/) .
4c'\ 4d-'\) . 4r .
=96 =96 =96 =96
4B-'\ (4d-'\ . 4r .
4B-'\ 4d-'\ . 8r .
. . (24eee-\LL .
. . 24ddd-\ .
. . 24ccc\JJ .
4B-'\ 4d-'\ . 4ddd-'\) .
4B-'\ 4d-'\) . 4r .
=97 =97 =97 =97
! ! ! !LO:TX:Y=25
! ! ! !LO:HP:dash
4B-'\ (4c'\ . 4r <X
4B-'\ 4c'\ . 8r (
. . (24f/LL (
. . 24e/ (
. . 24d/JJ (
4B-'\ 4c'\ . 4e'/) (
4B-'\ 4c'\) . 4r (
!!LO:LB:gg=z16
=98 =98 =98 =98
4A-'\ (4c'\ . 4r (
4A-'\ 4c'\ . 8r (
. . (24ddd-\LL (
. . 24ccc\ (
. . 24bb\JJ (
4A-'\ 4c'\ . 4ccc'\) (
4A-'\ 4c'\) . 4r (
!!LO:LB:g=dukas
=99 =99 =99 =99
4A-'\ (4B-'\ <yy 4r (
4A-'\ 4B-'\ ( 8r (
. ( (24e-/LL (
. ( 24d/ (
. ( 24c/JJ (
4A-'\ 4B-'\ ( 4d'/) (
4A-'\ 4B-'\) ( 4r (
=100 =100 =100 =100
4G'\ 4B-'\ (4e'\ ( 4r (
4G'\ 4B-'\ 4e'\ ( 8r (
. ( (24ccc\LL (
. ( 24bb-\ (
. ( 24aa\JJ (
4G'\ 4B-'\ 4e'\ ( 4bb-'\) (
4G'\ 4B-'\ 4e'\) [yy 4r [X
=101 =101 =101 =101
4F\ 4A-\ 4c\ . 4f'/ f
4r . 4a-'/ .
2r . 4cc'\ .
. . 4ff'\ .
=102 =102 =102 =102
4r . (4.aa-z\ .
4F\ 4A-\ 4c\ . . .
. . 24gg\LL .
. . 24ff\ .
. . 24ee\JJ .
4F\ 4A-\ 4c\ . 4ff'\) .
4F\ 4A-\ 4c\ . 4r .
!!LO:LB:gg=z16
=103 =103 =103 =103
4E\ 4G\ 4B-\ 4c\ . 4g'/ .
4r . 4cc'\ .
2r . 4ee'\ .
. . 4gg'\ .
!!LO:LB:g=dukas
=104 =104 =104 =104
4r . (4.bb-z\ .
4E\ 4G\ 4B-\ 4c\ . . .
. . 24aa-\LL .
. . 24gg\ .
. . 24ff\JJ .
4E\ 4G\ 4B-\ 4c\ . 4gg'\) .
4E\ 4G\ 4B-\ 4c\ . 4r .
=105 =105 =105 =105
. . (cc8q/ .
! ! !LO:DY:X=-10 !
2Fzy\ 2A-zy\ 2czy\ . (4.aa-z\) .
. . 24gg\LL .
. . 24ff\ .
. . 24ee\JJ .
2r . 4ff'\) .
. . 4r .
=106 =106 =106 =106
. . (cc8q/ .
! ! !LO:DY:X=-10:z=8 !
2Gzy\ 2B-zy\ 2ezy\ . (4.bb-z\) .
. . 24aa-\LL .
. . 24gg\ .
. . 24ff\JJ .
2r . 4gg'\) .
. . 4r .
=107 =107 =107 =107
! ! ! !LO:DY:z=8:x=4
4A-\ 4c\ 4f\ . 2cc:\ 2ff:\ 2aa-:\ 2ccc:\ ff
4r . . .
! ! ! !LO:HP:Y=25
4B-\ 4d-\ 4g\ >yy (8bb-\L >
. ) 8aa-\ )
4r ) 8gg\ )
. ]yy 8ff\J) ]
!!LO:LB:gg=z16
=108 =108 =108 =108
. . (16eeq/LL .
. . 16ffq/ .
. . 16ggq/JJ .
! ! ! !LO:DY:X=-20:z=6
4c\ 4g\ . (4ff\) p
4r . 4eenX\) .
4r; . 4r; r
! !LO:DY:X=-10:Y=15 ! !
4C'/ p 4r .
!!LO:LB:g=dukas
=109 =109 =109 =109
4F'\ . 1r .
4A-'\ . . .
4c'\ . . .
4f'\ . . .
*clefG2 *clefG2 * *
=110 =110 =110 =110
(4.a-/ . 1r .
24g/LL . . .
24f/ . . .
24e/JJ . . .
4f'/) . . .
4f'/ . . .
=111 =111 =111 =111
1f 1g- . (4.bb-\ .
. . 24aa-\LL .
. . 24gg-\ .
. . 24ff\JJ .
. . 4gg-'\) .
. . 4gg-'\ .
=112 =112 =112 =112
* * *^ *
1e- 1g- . [1gg- 4r .
. . . 8r .
. . . 24dd-X\LL .
. . . 24cc\ .
. . . 24b\JJ .
! ! ! !LO:SC:a !
. . . 4cc'\ .
! ! ! !LO:SC:a !
. . . 4cc'\ .
!!LO:PB:gg=z16
=113 =113 =113 =113 =113
1e- 1a . 4.gg-/] [1cc .
. . (24gg-/LL . .
. . 24ff/ . .
. . 24ee/JJ . .
! ! !LO:SC:b ! !
. . 4ff'/) . .
! ! !LO:SC:b ! !
. . 4ff'/ . .
=114 =114 =114 =114 =114
1d- 1f . 1ff 4.cc\] .
. . . 24cc\LL .
. . . 24b-\ .
. . . 24a\JJ .
! ! ! !LO:SC:a !
. . . 4b-'\ .
! ! ! !LO:SC:a !
. . . 4b-'\ .
!!LO:LB:g=dukas
=115 =115 =115 =115 =115
*^ * * * *
(2.f/ [1d\ . 4r 1b .
. . . 8r . .
. . . (24gg/LL . .
. . . 24ff/ . .
. . . 24ee/JJ) . .
. . . (4ff/ . .
4e/) . . 4gg/ . .
* * * *v *v *
=116 =116 =116 =116 =116
(4f/ 1d\] . 4aa-\ .
4g/ . . 4ee\ .
4a-/ . . 4ff\ .
4f/) . . 4b\) .
=117 =117 =117 =117 =117
! ! ! !LO:S:a !LO:HP:y=-5
(4e/ [1c . (4cc\ <
4g/ . . 4ee\ (
4f/ . . 4ff\ (
4e/ . . 4gg\ [
=118 =118 =118 =118 =118
! ! ! ! !LO:HP:y=-5
4f/ 2c\] . 4aa-\ >
4b-/ . . 4ee\ )
4a-/ 2d-X\ . 4ff\ )
4f/) . . 4b\ ]
*v *v * * *
*clefF4 *clefF4 * *
!!LO:LB:gg=z16
=119 =119 =119 =119
8C\L . 4e/ 4cc/) .
8c\ . . .
8C\ . 4r .
8c\J . . .
8C\L . 4r .
8c\ . . .
8C\ . (4dd-\ p
8c\J . . .
!!LO:LB:g=dukas
=120 =120 =120 =120
8C\L . 4cc\ .
8c\ . . .
8C\ . 4b-\ .
8c\J . . .
8C\L . 4g/ .
8c\ . . .
8C\ . 4e/) .
8c\J . . .
=121 =121 =121 =121
*^ * * *
! ! ! !LO:DY:X=-12:y=2 !
(2B-zy/ 4C\ . (4.d-z/ .
. 4C\ . . .
. . . 8c/ .
4A-/) 8C\L . 4f'/) .
. 8c\ . . .
4ryy 8C\ . (4ddd-\ .
. 8c\J . . .
*v *v * * *
=122 =122 =122 =122
8C\L . 4ccc\ .
8c\ . . .
8C\ . 4bb-\ .
8c\J . . .
8C\L . 4gg\ .
8c\ . . .
8C\ . 4ee\) .
8c\J . . .
=123 =123 =123 =123
*^ * * *
! ! ! !LO:DY:X=-10 !
(2B-zy/ 4C\ . (4.dd-z\ .
. 4C\ . . .
. . . 8cc\ .
4A-/) 8C\L . 4ff'\) .
. 8c\ . . .
4ryy 8C\ . (4ddd-\ .
. 8c\J . . .
*v *v * * *
=124 =124 =124 =124
8C\L . 4ccc\ .
8c\ . . .
8C\ . 4bb-\ .
8c\J . . .
8B-\L . 4gg\ .
8c\ . . .
8B-\ . 4ee\) .
8c\J . . .
!!LO:LB:g=dukas
!!LO:LB:gg=z16
=125 =125 =125 =125
8A-\L . 8r .
8f\ . (8ee\L .
8c\ . 8gg\ .
8f\J . 8ff\J) .
8G\L . 8r .
8e\ . (8ff\L .
8B-\ . 8aa-\ .
8e\J . 8gg\J) .
=126 =126 =126 =126
8F\L . 8r .
8c\ . (8gg\L .
8A-\ . 8bb-\ .
8c\J . 8aa-\J) .
8D-\L . 8r .
! ! ! !LO:HP:Y=30:X=-20
8B\ . (8bb\L <
! ! ! !LO:HP:Y=30
8F\ . 8fff\ [ >
8B\J . 8bb\J) ]
=127 =127 =127 =127
8C\L . 4ccc\ .
8c\ . . .
8E\ . 4r .
8c\J . . .
8D-\L . 8r .
! ! ! !LO:HP:Y=30:X=-20
8B\ . (8bb\L <
! ! ! !LO:HP:Y=30
8F\ . 8fff\ [ >
8B\J . 8bb\J) ]
=128 =128 =128 =128
8C\L . 4ccc\ .
8c\ . . .
8E\ . 4r .
8c\J . . .
8BB-X\L . 8r .
! ! ! !LO:HP:Y=30:X=-20
8G\ . (8ee\L <
! ! ! !LO:HP:Y=30
8D-\ . 8ddd-\ [ >
8G\J . 8ee\J) ]
=129 =129 =129 =129
8AA-\L . 4ff\ .
8F\ . . .
8C\ . 4r .
8F\J . . .
8BB-\L . 8r .
! ! ! !LO:HP:Y=30:X=-20
8G\ . (8ee\L <
! ! ! !LO:HP:Y=30
8D-\ . 8ddd-\ [ >
8G\J . 8ee\J) ]
!!LO:PB:g=dukas
!!LO:LB:gg=z16
=130 =130 =130 =130
8AA-/L . 8r .
! ! ! !LO:HP:Y=40:dash
! ! ! !LO:TX:Y=35
8F/ <yy (8ee\L <X
8C/ ( 8gg\ (
8F/J ( 8ff\J) (
8EE/L ( 8r (
8E/ ( (8ff\L (
8C/ ( 8aa-\ (
8E/J ( 8gg\J) (
=131 =131 =131 =131
8FF/L ( 8r (
8F/ ( (8gg\L (
8C/ ( 8bb-\ (
8F/J ( 8aa-\J) (
8GG/L ( 8r (
8G/ ( (8aa\L (
8C/ ( 8ccc\ (
8G/J [yy 8bb-\J) [X
=132 =132 =132 =132
4AA-/ ffyy 8r .
! ! ! !LO:DY:X=-10:Y=35
. . (8ccc\L ff
! ! !LO:TX:i:Y=35:t=sempre legato !
2Cz/ . 8fff\ .
. . 8eee-\J .
. . 8ddd-\L .
. . 8ccc\ .
4F\ . 8bb-\ .
. . 8aa-\J .
=133 =133 =133 =133
4BB-/ . 8gg\L .
. . 8ff\ .
2D-z/ . 8ee-\ .
. . 8dd-\J .
. . 8cc\L .
. . 8b-\ .
4G\ . 8a-\ .
. . 8g\J) .
=134 =134 =134 =134
! ! !LO:S:a !
4C\ . (8f/L .
. . 8e/ .
!LO:DY:X=-10 ! ! !
2Fz\ . 8d-/ .
. . 8c/J .
. . 8B/L .
. . 8c/ .
4A-\ . 8B/ .
. . 8c/J .
!!LO:LB:g=dukas
=135 =135 =135 =135
! ! ! !LO:DY:X=-8:Y=45
(4B-\ . 8B/L pp
. . 8c/ .
4G\ . 8d-/ .
. . 8c/J .
4E\ . 8B/L .
. . 8c/ .
4BB-/) . 8d-/ .
. . 8c/J) .
=136 =136 =136 =136
4AA-/ . 8r .
! ! ! !LO:DY:X=-10:Y=35
. . (8ccc\L ff
2Cz/ . 8fff\ .
. . 8eee-\J .
. . 8ddd-\L .
. . 8ccc\ .
4F\ . 8bb-\ .
. . 8aa-\J .
=137 =137 =137 =137
4BB-/ . 8gg\L .
. . 8ff\ .
2D-z/ . 8ee-\ .
. . 8dd-\J .
. . 8cc\L .
. . 8b-\ .
4G\ . 8a-\ .
. . 8g\J .
=138 =138 =138 =138
4C\ . 8f/L .
. . 8e/ .
!LO:DY:X=-10 ! ! !
2Fz\ . 8d-/ .
. . 8c/J .
. . 8B/L .
. . 8c/ .
4A-\ . 8B/ .
. . 8c/J) .
=139 =139 =139 =139
! ! !LO:S:a !LO:DY:Y=50
4r . (8B/L p
. . 8c/ .
4CC/ ppyy 8d-/ .
. . 8c/J .
4CC/ . 8c/L .
! ! !S- !
. . 8B-/j .
4CC/ . 8A-/j .
. . 8G/Jj .
!!LO:LB:g=dukas
!!LO:LB:gg=z16
=140 =140 =140 =140
4FF\ . 4F/)j .
! ! !S0 !
4F\ . 4r .
. . (B8q/ .
! ! !LO:TX:i:t=con espress.:Y=20:X=30 !
4r . (4.a-/) >yy
4D-'\ 4F'\ 4A-'\ 4B'\ . . )
. . 8g/ ]yy
=141 =141 =141 =141
4r . 2f/) .
4C'\ 4F'\ 4A-'\ 4c'\ . . .
! ! !LO:S:b !
4r . (4.e/ .
4C'\ 4G'\ 4B-X'\ . . .
. . 8cc\) .
=142 =142 =142 =142
4r . (4ccz\ .
4F'\ 4A-'\ . 4f/) .
. . (B8q/ .
4r . (4.a-/) >yy
4D-'\ 4F'\ 4A-'\ 4B'\ . . )
. . 8g/ ]yy
=143 =143 =143 =143
4r . 2f/) .
4C'\ 4F'\ 4A-'\ 4c'\ . . .
! ! !LO:S:b !
4r . (4.en/ .
4C'\ 4G'\ 4B-X'\ . . .
. . 8cc\) .
=144 =144 =144 =144
4r . (4ccz\ .
4F'\ 4A-'\ . 4f/) .
*clefG2 *clefG2 * *
. . (b8q/ .
4r . (4.aa-\) >yy
4d-'/ 4f'/ 4a-'/ 4b'/ . . )
. . 8gg\ ]yy
=145 =145 =145 =145
4r . 2ff\) .
4c'/ 4f'/ 4a-'/ 4cc'/ . . .
4r <yy (4.ee\ <yy
*clefF4 *clefF4 * *
4B-'\ 4c'\ 4g'\ ( . (
. [yy 8ccc\) [yy
!!LO:LB:g=dukas
!!LO:LB:gg=z16
=146 =146 =146 =146
!LO:S:b ! ! !
(1A 1c 1f ffyy 1cc 1ee-X (1ccc ff
=147 =147 =147 =147
4B-\) 4d-\ 4f\ . 4b-\ 4dd-\ 4ff\) .
4r . 4r .
4r . 4r .
8r . 8r .
8B-\ 8d-\ 8f\ . 8b-\ 8dd-\ 8bb-\ .
=148 =148 =148 =148
!LO:S:b ! ! !
(1G 1B- 1e- . 1b- 1dd- (1bb- ff
=149 =149 =149 =149
4A-\) 4c\ 4e-\ . 4a-\ 4cc\ 4ee-\) .
4r . 4r .
4r . 4r .
! ! !LO:DY:X=4:Y=30 !
4F'zy\ 4d-'zy\ . 4a-'z\ 4cc'z\ 4aa-'z\ .
=150 =150 =150 =150
4G'\ 4d-'\ . 4g'\ 4b-'\ 4dd-'\ .
! ! !LO:DY:X=4:Y=30 !
4E'zy\ 4c'zy\ . 4g'z\ 4b-'z\ 4gg'z\ .
4F'\ 4c'\ . 4f'\ 4a-'\ 4cc'\ .
! ! !LO:DY:X=4:Y=30 !
4D-'zy\ 4d-'zy\ . 4f'z\ 4a-'z\ 4ff'z\ .
=151 =151 =151 =151
! ! ! !LO:DY:X=4:z=12
4BB-'\ 4D-'\ 4G'\ 4B-'\ . 4f'\ 4g'\ 4dd-'\ 4ff'\ ff
4r . 4r .
4C'\ 4E'\ 4G'\ 4c'\ . 4e'\ 4g'\ 4b-'\ 4cc'\ 4ee'\ .
4r . 4r .
=152 =152 =152 =152
4FF'/ 4AA-'/ 4C'/ 4F'/ . 4f'\ 4a-'\ 4cc'\ 4ff'\ .
4r . 4r .
4r . 4r .
==:|! ==:|! ==:|! ==:|!
*- *- *- *-
!!!SMS: Durand 1915, plates 9327/9328, Paul Dukas, ed.
!!!ENC: Craig Stuart Sapp
!!!END: 2004/04/05/
!!!EEV: 2011/01/30/
!!!EED: Craig Stuart Sapp
!!!ONB: Notes proofread; Dynamics proofread
!!hum2abc: --spacing 2.0 -s 0.7
!!hum2muse: --sc "Op. 2, No. 1 (1793-5)"
!!muse2ps: T^Sonata no. 1 in F minor^C^L. van Beethoven\nop. 2/1^
!!muse2ps: v115,130jI200S100
!!muse2ps: =z16=c95F
!!muse2ps: =z14=F
(scroll in the above black box to view the entire output).
If you are on a page served over the https protocol, then you will likely not be able to load URLs that start with http. If you are on a page served via http, then loading a URL starting with https should not be a problem.
The standard way of downloading a URL is to define a function to do something with the data once it has been downloaded, and this function is usually stored in Humdrum.onload. An alternate method is to provide an option object with the onload function defined within it. Here is the method described previously:
h = new Humdrum();
h.onload = function (x) {
console.log("Downloaded data has", x.getLineCount(), "lines");
}
h.parse("twinkle.txt");
An alternate method of providing a function is with the onload property of an object containing options as a second parameter for parsing:
var options = {onload: function (x) {
console.log("Downloaded data has", x.getLineCount(), "lines");
}};
h = new Humdrum("twinkle.txt", options);
or equivalently (delaying the parsing):
var options = {onload: function (x) {
console.log("Downloaded data has", x.getLineCount(), "lines");
}};
h = new Humdrum();
h.parse("twinkle.txt", options);
or equivalently (assigning the function to a variable before storing in the options object):
var myfunction = function (x) {
console.log("Downloaded data has", x.getLineCount(), "lines");
}
var options = {onload: myfunction};
h = new Humdrum("twinkle.txt", options);
or equivalently (not creating a separate variable to store the options to Humdrum):
var myfunction = function (x) {
console.log("Downloaded data has", x.getLineCount(), "lines");
};
h = new Humdrum("twinkle.txt", {onload: myfunction});
or equivalently (using the options without a variable name in the parsing function):
var myfunction = function (x) {
console.log("Downloaded data has", x.getLineCount(), "lines");
};
h = new Humdrum();
h.parse("twinkle.txt", {onload: myfunction});
There are several short-cuts to Humdrum data URLs available on the web. These shortcuts are URIs (Uniform Resource Identifier). They are internally mapped into URLs by the Humdrum parsing functions.
Github URIs are prefixed with github://
(long form), gh://
(medium
form) or g://
(short form). This URI will download data from a
repository on Github. The basic form of the URI is:
github://username/repository-name/path/to/file/filename.krn
For example:
github://craigsapp/beethoven-piano-sonatas/kern/sonata01-1.krn
is mapped internally in the Humdrum.parse function to the URL:
https://raw.githubusercontent.com/craigsapp/beethoven-piano-sonatas/master/kern/sonata01-1.krn
Here is how to download the first movement of Beethoven’s first piano sonata from the repository at https://github.com/craigsapp/beethoven-piano-sonatas using the Github URI:
var h = new Humdrum();
h.onload = function (x) {
console.log("The downloaded data has", x.getLineCount(), "lines.");
}
h.parse("g://craigsapp/beethoven-piano-sonatas/kern/sonata01-1.krn");
If you copy and paste that code into the javascript console, it should
state that there are 1429 lines in the downloaded Humdrum data. Note that
the short form (g://
) of the Github URI is being used in the example.
You can add a parsing option called commitHash
to the parsing command
to download a particular version of a Humdrum file from Github. Here is
an example using the same Beethoven sonata, but an older version of the
data stored with commit 8b4258c
:
var options = {
commitHash: "8b4258c"
onload: function (x) {
console.log("The downloaded data has", x.getLineCount(), "lines.");
}
};
var uri = "g://craigsapp/beethoven-piano-sonatas/kern/sonata01-1.krn";
var h = new Humdrum(uri, options);
In this case the data should have 1427 lines instead of 1429 lines that the most recent version of the Humdrum file has.
The same score can be downloaded with the Humdrum URI, which
is either humdrum://
for the long form, hum://
for the
medium form, or h://
for the short form. This will load
data from kernScores. The data
will be served over http, so this method cannot be used on
pages served over https. Most larger collections of data in kernScores
are also available on Github in the humdrum-data
repository.
Here is an example of downloading the same Beethoven piano sonata movement with a Humdrum URI from kernScores:
var h = new Humdrum();
h.onload = function (x) {
console.log("The downloaded data has", x.getLineCount(), "lines.");
}
h.parse("h://beethoven/sonatas/sonata01-1.krn");
View the shortcuts page for some example kernScores locations that can be used for the Humdrum URI. The long Humdrum URI for this particular sonata is from this page:
var h = new Humdrum();
h.onload = function (x) {
console.log("The downloaded data has", x.getLineCount(), "lines.");
}
h.parse("h://users/craig/classical/beethoven/piano/sonata/sonata01-1.krn");
The Josquin Research Project has a
Humdrum file database of about 1500 works from the late Medieval and
early Renaissance periods. They can be downloaded using the jrp://
(long form) or j://
(short form) URI. To access a file, give
only the catalog number of the work in the JRP database. For example
Jos2721 is for the song
La Bernardina:
var h = new Humdrum();
h.onload = function (x) {
var title = h.getRefValue("OTL");
console.log("The title of the downloaded work:", title);
}
h.parse("j://Jos2721");
In this case the above javascript code should print:
The title of the downloaded work: La Bernardina
The JRP URI is also mapped into a URL over http, so you cannot use it on https-served webpages. However, you can use a Github URL or URI to download the data from the Github repository of the JRP digital scores. In that case the full name of the file (including the title of the work) is needed in the URL/URI rather than just the catalog number.