A tutorial on how to encode music in the Humdrum syntax for VHV.

This tutorial covers the basics of representing graphic music notation in the Humdrum syntax. Mostly this involves encoding music within the **kern data representation. For more advanced notational features, other data types are used, such as **dynam for dynamics and **text for lyrics. Also see other pages in the Humdrum encoding section of the navigation menu for special encoding topics (to the left or above).

Each musical example in the tutorial below is interactive, so trying tweaking the examples to see what happens. A text box containing the Humdrum data used to produce the notation is given on the left side of each notation example. The text in these boxes is editable, and changing the text will update the notation as you type. [If the notation no longer updates when editing the Humdrum text, you will have to reload the webpage to restart verovio again.]

Pitch

Here is a short music example of notes, each containing a rhythm and then a pitch:

4 represents a quarter note, and c, d, e and f represent the first four pitches of the fourth octave (middle-C octave). The musical example is interactive and changes whenever you type text into the box to the left, so try adding pitches for G, A and B in the same octave to the notation like this:

Experiment with the numbers to generate other rhythms, such as half notes and eighth notes:

Note the order of rhythm and then pitch in the encoded notes. The order can be reversed, although the canonical order is rhythm first, then pitch. Try reversing the order of a note such as 4c to c4 and see what happens to the note in the graphical notation.

Clefs

VHV will automatically choose the most suitable clef (either bass or treble) to fit the pitch range of the notes on a staff, but typically a clef is encoded explicitly for the music. Clefs are encoded in interpretation tokens that start with a single * followed by the string clef and then the shape and line position of the clef. For example, a treble clef is *clefG2, with G meaning a G-clef, and 2 meaning that the clef is centered on the second line up from the bottom of the staff. The bass clef is *clefF4 since it is an F-clef on the fourth line of the staff.

Try moving the clefs to different staff lines by changing the number after the clef shape in the above example textbox.

A vocal tenor clef is represented by *clefGv2, where the v means the music should be played an octave lower than the regular clef’s sounding pitches. Try creating a vocal tenor clef in the above interactive example. The v operator also works on the other clefs (but these sorts of clefs are very rare). Another rare clef is *clefG^2 which is the opposite of *clefGv2, where the music is written an octave lower than actually sounding pitch for the normal form of the clef. You can also try to create exotic two-octave clefs by doubling the ^^ and vv markers.

Octaves

The octave position of a note is indicated in **kern data as various repetitions of the pitch name as an upper- or lower-case letter. The middle-C octave is indicated by single lower case letters, and each successively higher octave repeats an additional lower-case letter to indicate the octave:

Lower octaves are indicated by successive repetitions of upper-case letters:

Barlines

Barlines are indicated by a token starting with an equals sign. A optional number can immediately follow the equals sign, representing a measure number. VHV will display the bar number at each system break, excluding a label for measure 1:

Following the measure number can be an optional styling for the barline. - means an invisible barline, || is a double thin barline, |!: is a left-repeat, :|!|: is a left-right repeat. A special style is ==, representing a final barline. This bar usually does not include a bar number, since it is the last one in the piece/movement.

Humdrum can represent more barline styles, but the above types are currently supported in verovio.

Pick-up measures

Typically the initial barline should be labeled in the Humdrum encoding even though it is not printed. Either =1 or =1- should be used at the start of the first measure (with - meaning an invisible barline), but the starting barline will be automatically suppressed if it is a regular barline. Labeling the first bar is necessary if you need to extract it by measure number with a tool such as myank.

Pickup beats do not have a barline at their start. If a measure does not match the duration of the time signature at the start of the music and the data does not start with a barline, it will be automatically interpreted as a pick-up measure and automatically assigned 0 as the measure number for use with the myank filter.

Here is example music with a pick-up beat, and a typical ending that drops the duration of the pickup measure:

Time signatures

Time signatures are interpretations in the form *MX/Y where X is the top number of the signature and Y is the bottom number of the signature:

Meter symbols

Cut-time and Common-time symbols can be displayed by including an interpretation in the form *met(X), where X is c| for cut-time, or c for common time:

The time signature equivalent of the meter symbol should still be encoded, typically immediately before the meter symbol. Try deleting the meter symbol lines from the above example and see what happens.

Most mensural-music mensuration signs are also available with *met():

Notice that *met(c) is used for the modern common-time metric sign, and *met(C) is used for the mensural symbol.

Accidentals

Accidentals must always be indicated along with the diatonic pitch name unless the pitch is natural. Accidentals up to double-sharp/flat can be displayed in VHV (no triple sharps/flats or higher can be rendered with verovio, although they can be represented in **kern data):

VHV will automatically calculate which accidentals should be visible in the graphic notation. In the following example, the key signature contains an F-sharp, so in the first measure no sharps are displayed on the F’s. The second measure contains an F-natural since there is no chromatic alteration of the F, so a natural is shown to cancel out the key signatures F-sharp. And at the end of the second measure, the second F has a sharp alteration which must be shown; otherwise, it would appear to be an F-natural.

Try removing the key signature, and see what happens to the accidentals displayed in the example.

Cautionary/Forced accidentals

When accidentals are not required according to the algorithm for calculating visual accidentals, but the accidentals are desired in order to add clarity for a performer, the accidental of a note can be forced to be displayed (whether it would be required or not) by adding X after the accidental.

In the first measure, two F-naturals are given, with only the first F-natural displaying its natural alteration. In the second measure, the first F has a sharp, but this sharp would not normally be displayed since it is within the key signature, and the barline canceled out the F-natural of the previous measure. To avoid confusion, the first F-sharp in the second measure should have a cautionary sharp added to the note as is shown in the above example.

Natural signs do not require X, as they are always displayed when given, but when they are used to indicate a cautionary accidental, the X is necessary. The X can also be used in diplomatic encodings to indicate a visual accidental in the source manuscript. Also, to force or indicate that an accidental is implied in a diplomatic score, use y immediately after the accidental to force it to be hidden.

Editorial accidentals

Editorial accidentals can be indicated by adding an RDF reference record for a user-signifier (character) used to mark the editorial accidentals in the data. Typically the character i is used to mark editorial accidentals in Josquin Research Project Humdrum encodings, displaying the accidental above the note:

The RDF reference record can be placed on any line of the file but typically is placed at the end of the data. Notice that editorial accidentals may affect the visual display of accidentals after the current pitch. Try making the natural sign on the last note in the above example an editorial accidental as well.

Also note that the style of the editorial accidental can be controlled from the RDF entry. Add the string brack or bracket to the RDF description so that the editorial accidentals are displayed as regular accidentals enclosed in brackets. Also try adding paren or parentheses to the RDF line to display the editorial accidental in parentheses.

Key signatures

Key signatures are represented by interpretations in the form *k[X], where X is a list of the accidentals in the order in which they are displayed in the key signature. Here a scale in C-sharp major and C-flat major, showing all of the accidentals in their proper order:

Key designation

The key of the music is different from the key signature. Indicate the key of the music by adding an interpretation in this form *X:, where X is a pitch name plus possible accidental, with lower-case pitch names indicating minor keys, and upper-case pitch names indicating major keys. For example, *C: means C major, and *a: means A minor (note that both have the key signature *k[] where there are no sharps or flats).

The key designation typical follows the key signature, or can appear on its own if the key changes but the key signature does not.

Note that the music in the last measure does not have a key signature change even though the music modulates to C-sharp minor.

The following codes can be appended to the key designation to indicate a particular mode:

code meaning example
dor dorian *d:dor
phr phrygian *e:phr
lyd lydian *F:lyd
mix mixolydian *G:mix
aeo aeolian *a:aeo
ion ionian *C:ion
loc locrian *b:loc

If the mode is closest to a minor key, then a lower-case letter will be used for the tonic note; otherwise, modes closer to major use an upper-case for the tonic.

See the full description of key signatures for more information.

Chords

Chords are created by adding multiple notes to a token, separated by a single space character. Rhythms and articulations of each note should be duplicated, but not slurs, fermatas or beams.

Rhythm

Rhythms in **kern data are given in terms of the number of units the duration of the note will divide a whole note. Whole notes are 1 since there is one whole note in a whole note. Half notes are 2 since there are two in a whole note. Quarter notes are 4 since there are four in a whole note, etc.

An exception to the numeric system for rhythms is used for some notes longer than a whole note: breves are represented by 0, longs are represented by 00 and maximas by 000.

The shortest note value that verovio can display is a 256th note, although shorter values can be represented in **kern data.

Augmentation dots

Augmentation dots are represented by period characters (.). The first one adds 1/2 the duration of the plain note, the next adds an additional 1/4 of the original note, and so on.

Ties

Ties are indicated by attaching [ to the starting note of a tie, and ] on the ending note. For intermediate notes in a tied group, the underscore character _ indicates a previous tie ends on the note at the same time that a tie starts to the next note.

More information about ties

Beaming

Beams work in a similar manner to ties. The L character indicates the start of a beam, and the J character indicates the end of a beam.

Try adding beams with irregular groupings in the first measure of the example.

Lazy beaming

VHV uses a lazy beaming system to beam notes together. Rather than specifying the beginning/ending of each sub-beam or beamlet direction, you instead indicate the beginning/ending of a beamed group of notes with the L and J characters (i.e., encode only the primary sub-beam):

Encoding a full description of sub-beams:

which is equivalent to this lazy-beam encoding of only the primary beam (the beam furthest from the noteheads):

autobeam filtering

The autobeam filter can be used to beam notes together automatically, based on the prevailing time signature:

Try copy-and-pasting the above content into VHV, and then press alt-c to compile the filter. This will run the Humdrum data through the filter and then display the results back in the text editor. Otherwise, the data is filtered before being converted into notation.

Tuplets

Tuplets are no different from regular rhythmic values since they describe how many notes of that duration sum together to create a whole-note duration. Triplet eighth notes are represented with the number 12 because twelve of them equal a whole-note duration. quintuplet sixteenth notes are represented as 20 since 20 of the equal a whole-note duration.

Extended Rhythm representation

Note durations that do not divide the duration of a whole note into an integer number of equal pieces (when also accounting for augmentation dots), must be encoded in an extended **recip representation. This system is understood by VHV and Humdrum Extras, but not in the classical Humdrum Toolkit (see rscale for using extended rhythms with the Humdrum Toolkit).

Example extended rhythms include triplet whole notes. 3/2 of a triplet whole note fill the duration of a regular whole note, so it is represented by the string 3%2. Another way of conceptualizing this is to flip the numbers in the rhythm string, noting that a triplet whole note is 2/3rds of a whole note:

Notice the 1%2 rhythm in the last measure. This represent a double whole note, since 1/2 of the double whole note is equivalent to a whole note. 0 is a special code equivalent to 1%2, 00 is equivalent to 1%4 (a long) and 000 is equivalent to 1%8 (a maxima). It is probably best to use the zero-system for breves, maximas and longs, reserving extended rhythms for readability and use %-based descriptions more complicated rhythmic cases.

Rests

Rests are represent by the character r in **kern data. Whole-measure rests are given their actual duration, and if the duration of the rest matches the time signature, then the rest will be displayed as a centered whole-measure rest regardless of its actual duration (or as a breve-measure rest if the duration of the measure is a breve or longer).

Slurs

Slurs are indicated by adding ( to a token for the slur start, and ) for a slur end.

Nested slurs

Slurs can be nested by opening another slur while another one is active. The first slur closing will affect the closest slur opening to it.

Notice the direction RDF character which can be used to force the direction of a slur.

Crossing slurs

Slurs can cross each other by prefixing an ampersand (&) in front of a slur marker which crosses another slur. For more than one crossing slur at a time, additional & characters can be added to the slur prefix.

More information about ties

Articulations

Here is a sampler of note articulations:

Articulations can be place on the opposite side of their automatic location by adding RDF entries to force the articulation above or below the notehead:

More information about articulations

Ornaments

Here is a sampler of ornaments. Upper-case ornaments indicate whole-tone auxiliary notes, and lower-case ornaments indicate semi-tone auxiliary notes. If the auxiliary notes require accidentals in the graphical music notation, then will be added automatically, as well as cautionary accidentals that may be needed on primary notes which follow the auxiliary notes of the ornaments.

Lyrics

Lyrics are added to a staff by placing one or more **text spines after a **kern spine.

Dynamics

Dynamics are added to the staff as a separate spine to the right of a **kern spine to which the dynamics should be associated with.

When lyrics are present, dynamics will automatically be placed above the staff:

Note that the order of the **dynam and **text spines does not matter.

Multiple voices on a staff

Spine split manipulators (*^) and spine merge manipulators (*v) are used to add or remove voices/layers on a staff. Note that the highest part on the staff will typically be left most (opposite of the staff ordering from lowest to highest).

Notes sounding together in the different voices are placed on the same line, and if the other voice is sustaining, a . character is used as a place holder for that voice (the dot is called a null token in Humdrum terminology).

Partial voices/layers

Voices/layers which do not continue throughout the measure can be encoded in two equivalent manners: (1) splitting and merging the spine as needed in the measure, or (2) adding invisible rests to fill in the voice/layer for the entire measure. For method #1, note that the spine merging cannot occur until the end of both sounding notes in each layer.

Multiple staves

Each **kern spine in the data will produce a staff in the graphical notation. The lowest staff is the left-most spine in the data, and the highest staff in the notation is the right-most spine.

Here is a more complicated example where the number of voices changes on each staff:

Note that when the subspines for adjacent staves merge at the same time (at the end of measure 2), then the merges must be staggered for grouping clarity. Also when a spine needs to expand from one to three voices, there must be two *^ expansions (the first to go from one to two subspines, and the second to go from two to three spines). Also note the use of 2ryy, which is used to delay merging of the spines until the end of the measure (otherwise the two right subspines could merge together before merging with the first subspine for the staff at the end of the measure). Also note that subspines should not be ended before the full duration of the last note in the subspine (so the first two subspines in the top staff in measure 2 can not merge half-way through the measure since the note in the first subspine has not yet finished sounding).

Cross-staff notes

Notes can be stored in one **kern spines, but appear in another staff by applying an orientation RDF marker immediately after a note’s pitch.

Text directions

Text can be displayed in the graphical notation by adding a text layout direction to the encoding:

Text layout comments start with !LO:TX: and are placed immediately before the note to which they are attached. The parameter a means place the text above, and b means place the text below. The font is roman by default; adding an i parameter will make the text italic, and b to make it bold. The actual text is given by the t parameter, such as “cresc.” with the parameter t=cresc.. Note that parameters are separated by colons, and : is used to insert a colon into the text string.

Transposing parts

Transposing scores are always encoded at sounding pitch in Humdrum data, and instructions for transposing to written pitch are encoded at the start of the part. In the following example, the second spine encodes a B-flat clarinet part, with the transposition interpretation *ITrd1c2 meaning that the written part is a diatonic step up, equivalent to 2 semi-tone up.

See the transposing parts section of the documentation for more information.