In breve
Un capitolo di uno studio sulla musica medievale. Brevi passi di un canone inglese del Duecento sono stampati come musica nel testo, e le note in fondo a ogni pagina registrano, battuta per battuta, dove le vecchie edizioni non concordano.
Che cosa comporrai
Il capitolo 3 di uno studio su come gli antiquari inglesi lessero la musica medievale: cinque pagine di 156 × 234 mm su Sumer is icumen in, la rota di Reading, e sugli editori che la misero in partitura tra il 1776 e il 1889. Tre passi del canone sono incisi nel testo, in Leipzig su un rigo di 5 mm, con la numerazione delle battute della partitura di W. S. Rockstro, e ogni commento richiama il suo apparato a piè di pagina: «b. 40, n. 2 la ] sol Hw, Bu». Le note sono brevi e fitte come si conviene a un apparato, la musica occupa la giustezza del testo, e ogni lezione viene dall’articolo di Rockstro nel Dictionary di Grove, come il capitolo dichiara nel secondo paragrafo.
Questa ricetta risponde a
- Come do agli esempi musicali un apparato critico delle varianti delle fonti in note a piè di pagina?
- Come faccio le note a piè di pagina?
La risposta breve
// In the Markdown each example is a ```mei fence. A variant is encoded where it stands,
// <app><lem>…</lem><rdg source="#Hw #Bu">…</rdg></app>: the staff shows the lemma, and
// the file keeps the reading for anyone who opens the encoding. The apparatus entry is a
// footnote cited from the paragraph that discusses the bar: `[^b40]: **b. 40, n. 2** A ] G`.
const scoreStyle = {
staffSize: mm(5), // running-text examples: 4.5–5.5 mm
musicFont: 'Leipzig', // lighter than Bravura, close to a 19th-century plate
textFont: 'Crimson Pro', // the underlay in the book's own face
barNumbers: 'system', // the apparatus is keyed by bar: number every system
spacing: 0.95,
systemGap: mm(4),
marginTop: pt(4),
marginBottom: pt(LEAD / 2),
color: col('ink'),
minSystemsAtBreak: 2, // never leave one system of an example alone at a page foot
};
const footnotes = {
placement: 'column', // the foot of the page in one column
numbering: 'chapter',
fontSize: pt(8.5),
lineHeight: pt(10.75),
hangingIndent: em(1.2), // turnover lines align past the number
spaceBetween: pt(2),
separator: { width: 0.2, lineWidth: pt(0.5), color: col('rubric') },
};
Ingredienti
- Funzionalità
- Notazione musicaleNote a piè di paginaStile di partituraAperture progettateAttributi dei titoliTestatine e folioMargini speculariTestatine secondo il ruolo della paginaStili di paragrafoTavolozza di colori semanticaColore della cartaVedove, orfane e righe corteEsportazione in PDF
- Tipo
- Crimson Pro, Cormorant Garamond, Source Sans 3 (SIL OFL 1.1)
- Risorse
- Nessuna: ogni immagine è disegnata nel codice
Preparazione
#1 · Scrivi ogni esempio in MEI, con le sue varianti
Le impostazioni sono nella risposta breve qui sopra; la musica sta nel Markdown, un blocco ```mei per esempio. Dove due fonti divergono, la battuta contiene un <app> con la lezione accolta in <lem> e l’altra in <rdg source="#Hw #Bu">. Si incide il lemma: la battuta 40 dell’esempio 3.3 mostra il la, e il sol di Hawkins e Burney resta nel file per chi apre la codifica. Dai a ogni blocco un alt nella lingua della pagina: è ciò che leggono della partitura uno screen reader e il PDF con tag.
#2 · Lega l’apparato alle battute che il lettore vede
barNumbers: 'system' numera la prima battuta di ogni sistema, e il <measure n="37"> di ogni blocco fa partire il conto da dove comincia il brano nell’edizione seguita: l’esempio 3.3 si apre quindi a 37, e una nota che dice «b. 40» rimanda a una battuta che il lettore trova. La voce d’apparato è una normale nota a piè di pagina, richiamata dal paragrafo che commenta la battuta: lemma, parentesi quadra di chiusura, variante, sigle in corsivo. Una nota non si può richiamare dall’interno di una partitura, perciò il richiamo va nella frase che nomina la lezione.
#3 · Dimensiona la musica per il testo corrente
Un rigo di 5 mm in Leipzig sta in una giustezza di 116 mm con cinque o sei battute di 3/2 per sistema, e le undici battute dell’esempio 3.3 stanno in due sistemi. textFont compone il testo cantato in Crimson Pro, il carattere del testo, e minSystemsAtBreak: 2 impedisce che una pagina finisca con un solo sistema di un esempio il cui resto passa alla pagina seguente. Il titolo di ogni esempio è un titolo di terzo livello, quindi non resta mai in fondo alla pagina senza la sua partitura.
#4 · Lascia che una pagina con note finisca corta
const opener = {
enabled: true,
minHeight: mm(50), // every chapter's text starts on the same grid line
slot: { elements: [
{ kind: 'text', id: 'kicker', content: '{attr.kicker}', ...label, fontSize: pt(8.5),
letterSpacing: pt(1.8), color: col('rubric'), align: 'left',
placement: at('container', 'top-left', 0, 8) },
{ kind: 'text', id: 'title', content: '{titleText}', fontFamily: 'Cormorant Garamond',
italic: true, fontWeight: 500, fontSize: pt(29), lineHeight: 1.05, color: col('ink'),
align: 'left', overflow: 'wrap', // design text ends in an ellipsis by default
placement: { ...at('#kicker', 'below', 0, 3), size: { width: mm(100), height: 'auto' } } },
{ kind: 'rule', id: 'rule', direction: 'horizontal', thickness: pt(1), color: col('rubric'),
placement: { ...at('#title', 'below', 0, 5), size: { width: mm(14) } } },
] },
};
L’apertura abbassa il testo di 50 mm sotto un titolo in Cormorant corsivo. Più avanti, una pagina la cui riga seguente si porterebbe dietro una nota lunga finisce qualche riga prima, e balancing: { maxLinesPerHeading: 1 } impedisce al bilanciamento delle colonne di spostare quel vuoto sopra il titolo della sezione seguente, dove sembrerebbe una cesura nel ragionamento.
#5 · Metti il libro sul verso e il capitolo sul recto
const head = (id, content, parity, edge, x, extra = {}) => ({
kind: 'text', id, content, parity, pages: 'body', // never on the opener
...label, fontSize: pt(7.5), letterSpacing: pt(1.3), color: col('muted'),
placement: at('page', edge, x, 13), ...extra,
});
const folio = { color: col('rubric'), fontWeight: 700 };
const header = { elements: [
head('verso-folio', '{pageNumber}', 'even', 'top-left', MARGIN.outer,
{ ...folio, align: 'left' }),
head('verso-title', '{title}', 'even', 'top-left', MARGIN.outer + 8, { align: 'left' }),
head('recto-title', '{chapterTitle}', 'odd', 'top-right', -(MARGIN.outer + 8),
{ align: 'right', overflow: 'ellipsis' }),
head('recto-folio', '{pageNumber}', 'odd', 'top-right', -MARGIN.outer,
{ ...folio, align: 'right' }),
] };
// The opener carries a drop folio instead, centred under the text block.
const footer = { elements: [{ ...head('drop-folio', '{pageNumber}', 'all', 'bottom', 0,
{ ...folio, align: 'center', placement: at('page', 'bottom', 0, -11) }), pages: 'opener' }] };
I numeri di pagina in rosso di rubrica sul margine esterno, il libro sul verso e il capitolo sul recto; pages: 'body' li toglie dall’apertura, che ha un numero di pagina centrato al piede.
La ricetta completa
// ═══ Postext Cookbook · Nº 165 · MEI music examples with a critical apparatus ═════
// https://postext.dev/en/cookbook/musicology-mei-apparatus
// Code: MIT · Text: original (CC BY 4.0) · Music: Sumer is icumen in, after Rockstro (PD)
// Fonts: Crimson Pro, Cormorant Garamond, Source Sans 3 (SIL OFL 1.1) · Needs postext ≥ 1.54.0
import {
buildDocumentWithFonts, renderPageToCanvas, initMusicEngine,
} from 'https://esm.sh/postext';
import { renderToPdf, decompressWoff2 } from 'https://esm.sh/postext-pdf';
const LANG = 'en'; // @lang: the language of the sample document ('en' | 'es')
const RECIPE = 'musicology-mei-apparatus';
// ─── 1 · Design ─────────────────────────────────────────────────────────────
// #region palette: a rubric red for kickers, labels and the notes' rule; ink on cream
const palette = {
ink: '#211d1a', // text and notation: a warm near-black
rubric: '#8c2f1f', // the one accent, the red of the manuscript's rubrics
muted: '#6c645b', // running heads, colophon
rule: '#cbbfae', // hairlines
paper: '#fcfaf6',
};
// col(id): a colour linked to its palette entry, with the entry's hex beside the id.
const col = (id) => ({ hex: palette[id], model: 'hex', paletteId: id });
const colorPalette = [
...Object.entries(palette).map(([id, hex]) => ({ id, name: id, value: { hex, model: 'hex' } })),
// The engine's defaults link to main-color: point it at the accent, never the default blue.
{ id: 'main-color', name: 'accent (defaults)', value: { hex: palette.rubric, model: 'hex' } },
];
// #endregion
const MARGIN = { top: 22, bottom: 22, inner: 19, outer: 21 }; // 156 × 234 mm, mirrored
const LEAD = 14.5; // body leading in pt: the baseline grid
const at = (to, edge, x = 0, y = 0) => ({ anchor: { to, edge }, offset: { x: mm(x), y: mm(y) } });
const label = { fontFamily: 'Source Sans 3', fontWeight: 600, textTransform: 'uppercase' };
// #region answer: MEI examples engraved in the text, their apparatus in footnotes
// In the Markdown each example is a ```mei fence. A variant is encoded where it stands,
// <app><lem>…</lem><rdg source="#Hw #Bu">…</rdg></app>: the staff shows the lemma, and
// the file keeps the reading for anyone who opens the encoding. The apparatus entry is a
// footnote cited from the paragraph that discusses the bar: `[^b40]: **b. 40, n. 2** A ] G`.
const scoreStyle = {
staffSize: mm(5), // running-text examples: 4.5–5.5 mm
musicFont: 'Leipzig', // lighter than Bravura, close to a 19th-century plate
textFont: 'Crimson Pro', // the underlay in the book's own face
barNumbers: 'system', // the apparatus is keyed by bar: number every system
spacing: 0.95,
systemGap: mm(4),
marginTop: pt(4),
marginBottom: pt(LEAD / 2),
Lo script.js composto funziona così com’è: incollalo nello script modulo di qualsiasi pagina, oppure apri la ricetta su CodePen. Cartella della ricetta su GitHub ↗ (si apre in una nuova scheda)
Varianti
#Numera tutte le battute
Un apparato con molte voci per sistema si segue meglio con un numero su ogni battuta.
- barNumbers: 'system', // the apparatus is keyed by bar: number every system
+ barNumbers: 'every',#Incidi gli esempi in Bravura
Le teste di nota più piene di Bravura si accordano con uno stile da incisione su lastra.
- musicFont: 'Leipzig', // lighter than Bravura, close to a 19th-century plate
+ musicFont: 'Bravura',Errori frequenti
- MEI 5 scrive l’armatura come
keysig="1f"suscoreDefostaffDef. L’attributokey.sigdi MEI 4 viene ignorato senza avviso, e il bemolle sparisce. - Dai a ogni
staffDefil suolines="5": senza, note e chiavi vengono incise senza rigo. - Si incide il
<lem>di un<app>, non il<rdg>. Una variante che il lettore deve vedere sulla pagina va nella nota d’apparato o in un secondo esempio.
Crediti
- Ricetta
- Ignacio Ferro
- Testo
- The chapter text and the apparatus notes, in English and Spanish · Ignacio Ferro · CC BY 4.0
- Sumer is icumen in (13th century), the music examples transcribed from W. S. Rockstro's score and the readings his article reports, in A Dictionary of Music and Musicians, ed. George Grove, vol. 3, pp. 765–768, and vol. 4, pp. 1–3 (Macmillan, 1900 printing), as transcribed on Wikisource · Anonymous; William Smyth Rockstro · pubblico dominio
- The Latin rubric of Harley MS 978, f. 11v, and the folio, as quoted in the Wikipedia article (fact check) · Wikipedia contributors · CC BY-SA 4.0
- Font
- Crimson Pro (SIL OFL 1.1) · Cormorant Garamond (SIL OFL 1.1) · Source Sans 3 (SIL OFL 1.1)
- Codice
- MIT, come Postext
Modifica questo testo ↗ (si apre in una nuova scheda)Cartella della ricetta su GitHub ↗ (si apre in una nuova scheda)


