This page tracks the current state of corpus work, known issues, recurring MEI encoding patterns, and links to general documentation.
tba
In MEI, ordinary rests and full-bar rests are not the same thing.
<rest> = a non-sounding event with a specific written duration<mRest> = a complete measure rest, independent of meter<multiRest> = multiple consecutive complete-measure rests compressed into one symbol, typically in parts<mSpace> = an explicitly empty measure, where no musical content is encoded but nothing is considered missing
Use <rest> when the source shows a rest with a specific notated duration inside the rhythmic flow of the layer.
Typical cases:
Example:
<layer n="1"> <note pname="c" oct="4" dur="4"/> <rest dur="4"/> <note pname="d" oct="4" dur="2"/> </layer>
Use <mRest/> when the layer is silent for the entire measure and the source expresses that as a full-bar rest.
This is the preferred encoding for a complete measure rest because it does not depend on the current meter.
Example:
<measure n="12"> <staff n="1"> <layer n="1"> <mRest/> </layer> </staff> </measure>
For our corpus work:
<rest> for ordinary rests with explicit duration inside a measure<mRest/> when a whole measure is silent in that layer<rest> just because the meter happens to allow it<mRest/> when the notation is semantically a “whole measure rest”
A layer containing <mRest/> should not also contain notes or ordinary rests.
Control events such as fermatas may still occur alongside it.
A full-bar rest should usually still be encoded as:
<mRest/>
This remains true in different meters:
The point of <mRest> is that it means “this whole measure is silent”, regardless of how many beats the measure contains.
Use <multiRest> when the source compresses several complete silent measures into a single multiple-rest symbol.
Example:
<layer n="1"> <multiRest num="9"/> </layer>
For our project:
<multiRest> only when the source actually presents a compressed multi-measure rest<multiRest> in score-like encodings<mRest/> elementsDo not confuse:
<rest> = actual notated rest event<mRest> = actual complete-measure rest<mSpace> = explicitly empty measure with no encoded content
Use <mSpace> only when the layer is intentionally empty and this emptiness is itself what needs to be represented.
<measure n="5"> <staff n="1"> <layer n="1"> <rest dur="4"/> <note pname="e" oct="4" dur="4"/> <note pname="f" oct="4" dur="2"/> </layer> </staff> </measure>
<measure n="6"> <staff n="1"> <layer n="1"> <mRest/> </layer> </staff> </measure>
<measure n="20"> <staff n="1"> <layer n="1"> <multiRest num="8"/> </layer> </staff> </measure>
Ask:
<rest><mRest><multiRest>
In MEI, a <layer> is an independent stream of events on a staff. A staff may contain more than one layer in order to represent multiple voices.
A layer is best understood as a single rhythmic and event stream within one staff.
For beginners:
Use more than one layer when the notation clearly contains multiple independent voices on the same staff.
Typical cases:
Do not create extra layers just because stems point in different directions once or twice if the passage is still best understood as one continuous voice.
At minimum:
n valueExample:
<staff n="1"> <layer n="1"> <note pname="g" oct="4" dur="2"/> <note pname="a" oct="4" dur="2"/> </layer> <layer n="2"> <rest dur="2"/> <note pname="e" oct="4" dur="2"/> </layer> </staff>
Recommended local convention:
layer n=„1“ = upper voice or primary voicelayer n=„2“ = lower voice or secondary voicen=„3“, n=„4“, etc. when genuinely requiredShared stems and polyphonic overlap are often visually complex, but the encoding priority should be:
A useful practical rule is:
This matters because some relations are layer-sensitive.
For example:
So unstable or inconsistent layer assignment can create problems later.
When deciding whether to split into layers, ask:
If yes to several of these, use multiple layers.
MEI supports figured bass through harmonic indication markup.
The key elements are:
<harm> = the harmonic indication as the attached object<fb> = the figured-bass container<f> = one individual figure or component inside the figured bass signFor our corpus, the default pattern should be:
<harm tstamp="1"> <fb> <f>6</f> </fb> </harm>
This means:
harm provides the attachment pointfb says this is figured bass / Generalbassf holds the visible figure component
harm must define a point of attachment using one of these attributes:
startidtstamptstamp.geststamp.real
The most common attachment methods are startid and tstamp.
For practical work, I recommend:
startid when the figure clearly belongs to a specific encoded note or eventtstamp when the figure is best attached to a beat position in the measurestartid when stable note-level linking matters for editorial or computational reuse<measure n="1"> <staff n="1"> <layer n="1"> <note pname="c" oct="3" dur="1"/> </layer> </staff> <harm tstamp="1"> <fb> <f>6</f> </fb> </harm> </measure>
<measure n="1"> <staff n="1"> <layer n="1"> <note pname="c" oct="3" dur="1" xml:id="b1"/> </layer> </staff> <harm startid="#b1"> <fb> <f>6</f> <f>4</f> </fb> </harm> </measure>
The order of f elements is significant. Figures should be encoded in the order they appear, usually top to bottom on the page.
So this:
<fb> <f>6</f> <f>4</f> </fb>
is not just an arbitrary list; the order carries meaning.
Accidentals can be encoded directly in the figure content.
Example:
<harm tstamp="1"> <fb> <f>7♭</f> </fb> </harm>
harm + fb + f as the default structurestartid for note-bound corpus work when possibletstamp when note-level linking is not practicalA tie connects two notes of the same pitch so that the first note sounds for the combined duration of both notes.
Use ties only when:
The simplest MEI method uses the tie attribute.
Allowed values:
i = initialm = medialt = terminalExample:
<layer n="1"> <note pname="f" oct="4" dur="2" tie="i"/> <note pname="f" oct="4" dur="4" dots="1" tie="t"/> </layer>
A tie may continue into the following measure.
Example:
<measure n="1"> <staff n="1"> <layer n="1"> <note pname="g" oct="4" dur="2" tie="i"/> </layer> </staff> </measure> <measure n="2"> <staff n="1"> <layer n="1"> <note pname="g" oct="4" dur="2" tie="t"/> </layer> </staff> </measure>
This point is crucial for corpus consistency:
So for local practice:
The tie attribute can also be used on chord.
When used on a chord, it acts as shorthand for multiple ties on all unchanged pitches in the chord.
Example:
<chord dur="4" tie="i"> <note pname="f" oct="4"/> <note pname="a" oct="4"/> <note pname="c" oct="5"/> </chord> <chord dur="4" tie="t"> <note pname="f" oct="4"/> <note pname="a" oct="4"/> <note pname="c" oct="5"/> </chord>
For our project:
tie on note for simple casestie on chord only when the shorthand is genuinely clearnote elements insteadDo not confuse:
This distinction matters both musically and computationally.
Before encoding a tie, ask:
When barlines should run through some staves, then break, and then continue through a lower group, encode this with nested staffGrp elements.
Local recommendation:
staffGrp for the full systemstaffGrp bar.thru=„true“ for each continuous barline spanExample: barline through staves 1-3, break, then through staves 4-5:
<staffGrp> <staffGrp bar.thru="true"> <staffDef n="1"/> <staffDef n="2"/> <staffDef n="3"/> </staffGrp> <staffGrp bar.thru="true"> <grpSym symbol="brace"/> <staffDef n="4"/> <staffDef n="5"/> </staffGrp> </staffGrp>
Minimal checklist:
staffGrp?
For the current editorial task, also check the position of <sb> and <pb> carefully.
This is important because misplaced system or page breaks can change the number of bars per system or page and create mismatches with the facsimile layout.
Local recommendation:
<sb> and <pb> positions with the facsimileMinimal checklist:
When a measure still has no facsimile mapping, add a new <zone> in the relevant <surface> and then link that zone to the measure with the facs attribute.
Local recommendation:
<zone> inside the correct <surface>xml:idulx, uly, lrx, and lrytype=„measure“ for measure zonesfacs=„#zone_id“ on the matching <measure>Example:
<surface> <zone xml:id="zone_new123" ulx="100" uly="200" lrx="500" lry="800" type="measure"/> </surface> <measure n="12" facs="#zone_new123"> ... </measure>
Minimal checklist:
facs value point to the correct zone id?
Please encode written musical duration with dur and, where needed, dots.
dur records the notated value, for example dur=„4“ for a quarter note or dur=„8“ for an eighth note. dur.ppq records a calculated playback/timing value in pulses per quarter note. It is not the editorial duration and does not represent the visual notation directly.
Local directive:
dur and dots as the authoritative duration encodingdur.ppq to notes, rests, chords, or spacesppq to staffDef or scoreDefdur.ppq and ppq values from imported files during cleanupReason:
dur.ppq is usually import or playback residue and can disagree with the written dur/dotsMinimal checklist:
dur where required?dots?dur.ppq and ppq been removed?
For cross-staff chords encode it as one logical <chord> in a single <layer>, and place the low (or high) note on the other staff with staff=„5“ (use the number of corresponding staff). The lower (or higher) staff's time is then filled with <space/> so that the rhythmic alignment remains complete.
The MEI guidelines explicitly give this as an alternative for cross-staff chords. Some software handles this method better than separate cross-staff notes connected only by stem.with.
Example:
<staff xml:id="j138ax0t" n="4"> <layer xml:id="lie03m1" n="1"> <chord xml:id="n1v09lce" dur="8" stem.dir="up"> <note xml:id="m11lbwz8" oct="4" pname="f"/> <note xml:id="ooukl9j" oct="4" pname="d"/> <note xml:id="dgfh734" oct="3" pname="b" staff="5"/> </chord> ... </layer> </staff> <staff xml:id="k10lc1io" n="5"> <layer n="2"> <space dur="8"/> <note xml:id="dfj82467" dur="4" oct="3" pname="g" stem.dir="up"/> <note xml:id="dfj82d467" dur="4" oct="3" pname="a" stem.dir="up"/> </layer> </staff>
For mei-friend / Verovio-style workflows, this second version is often the more robust semantic encoding because it represents one chord rather than two separate events that merely share a stem.
Local recommendation:
<chord> with note-level staff when the source clearly shows one chord split across staves<space/> when that staff has no independent sounding event at that moment<chord> with dur