Em poucas palavras
Um capítulo de um estudo sobre música medieval. Trechos curtos de um cânone inglês do século XIII são impressos como música no texto, e as notas no pé de cada página registram, compasso a compasso, onde as edições antigas divergem.
O que você vai compor
O capítulo 3 de um estudo sobre como os antiquários ingleses leram a música medieval: cinco páginas de 156 × 234 mm sobre Sumer is icumen in, a rota de Reading, e sobre os editores que a puseram em partitura entre 1776 e 1889. Três trechos do cânone são gravados no texto, em Leipzig numa pauta de 5 mm, com a numeração de compassos da partitura de W. S. Rockstro, e cada comentário chama o seu aparato no pé da página: “c. 40, n. 2 lá ] sol Hw, Bu”. As notas são curtas e densas, como um aparato costuma ser, a música ocupa a medida do texto, e cada lição vem do artigo de Rockstro no Dictionary de Grove, o que o capítulo diz já no segundo parágrafo.
Esta receita responde a
- Como dou aos exemplos musicais um aparato crítico das variantes das fontes em notas de rodapé?
- Como faço notas de rodapé?
A resposta curta
// 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') },
};
Ingredientes
- Funcionalidades
- Notação musicalNotas de rodapéEstilo de partituraAberturas desenhadasAtributos de títuloCabeços e fóliosMargens espelhadasCabeços por tipo de páginaEstilos de parágrafoPaleta de cores semânticaCor do papelViúvas, órfãs e linhas curtasExportação para PDF
- Tipografia
- Crimson Pro, Cormorant Garamond, Source Sans 3 (SIL OFL 1.1)
- Materiais
- Nenhum: todas as imagens são desenhadas em código
Preparo
#1 · Escrever cada exemplo em MEI, com as suas variantes
As configurações estão na resposta curta acima; a música fica no Markdown, um bloco ```mei por exemplo. Onde duas fontes divergem, o compasso leva um <app> com a lição adotada em <lem> e a outra em <rdg source="#Hw #Bu">. Grava-se o lema: o compasso 40 do exemplo 3.3 mostra o lá, e o sol de Hawkins e Burney continua no arquivo para quem abrir a codificação. Dê a cada bloco um alt no idioma da página: é o que um leitor de tela e o PDF com tags leem da partitura.
#2 · Prender o aparato aos compassos que o leitor vê
barNumbers: 'system' numera o primeiro compasso de cada sistema, e o <measure n="37"> de cada bloco começa a contagem onde o trecho começa na edição seguida: o exemplo 3.3 abre no 37, e uma nota que diz “c. 40” aponta para um compasso que o leitor encontra. A entrada do aparato é uma nota de rodapé comum, chamada no parágrafo que comenta o compasso: lema, colchete de fechamento, variante, siglas em itálico. Não dá para chamar uma nota de dentro de uma partitura, por isso a chamada vai na frase que nomeia a lição.
#3 · Dimensionar a música para o texto corrido
Uma pauta de 5 mm em Leipzig cabe numa medida de 116 mm com cinco ou seis compassos de 3/2 por sistema, e os onze compassos do exemplo 3.3 ficam em dois sistemas. textFont compõe a letra cantada em Crimson Pro, a fonte do texto, e minSystemsAtBreak: 2 impede que uma página termine com um só sistema de um exemplo cujo resto passa para a seguinte. O título de cada exemplo é um título de terceiro nível, de modo que nunca fica no pé da página sem a sua partitura.
#4 · Deixar uma página com notas terminar curta
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) } } },
] },
};
A abertura rebaixa o texto 50 mm sob um título em Cormorant itálico. Mais adiante, uma página cuja linha seguinte traria consigo uma nota longa termina algumas linhas antes, e balancing: { maxLinesPerHeading: 1 } evita que o equilíbrio de colunas leve esse vazio para cima do título da seção seguinte, onde pareceria um corte no argumento.
#5 · Pôr o livro na página par e o capítulo na ímpar
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' }] };
Os fólios em vermelho de rubrica na margem externa, o livro na página par e o capítulo na ímpar; pages: 'body' tira-os da abertura, que recebe um fólio centrado no pé.
A receita 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),
O script.js montado funciona como está: cole-o como script de módulo em qualquer página ou abra a receita no CodePen. Pasta da receita no GitHub ↗ (abre em uma nova aba)
Variações
#Numerar todos os compassos
Um aparato com muitas entradas por sistema fica mais fácil de seguir com um número em cada compasso.
- barNumbers: 'system', // the apparatus is keyed by bar: number every system
+ barNumbers: 'every',#Gravar os exemplos em Bravura
As cabeças de nota mais cheias da Bravura combinam com um estilo de gravura em chapa.
- musicFont: 'Leipzig', // lighter than Bravura, close to a 19th-century plate
+ musicFont: 'Bravura',Erros comuns
- MEI 5 escreve a armadura como
keysig="1f"emscoreDefoustaffDef. O atributokey.sigdo MEI 4 é ignorado sem aviso, e o bemol some. - Dê a cada
staffDefo seulines="5": sem ele, notas e claves são gravadas sem pauta. - Grava-se o
<lem>de um<app>, não o<rdg>. Uma variante que o leitor precisa ver na página vai na nota do aparato ou num segundo exemplo.
Créditos
- Receita
- Ignacio Ferro
- Texto
- 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 · domínio público
- 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
- Fontes
- Crimson Pro (SIL OFL 1.1) · Cormorant Garamond (SIL OFL 1.1) · Source Sans 3 (SIL OFL 1.1)
- Código
- MIT, como o Postext
Editar este texto ↗ (abre em uma nova aba)Pasta da receita no GitHub ↗ (abre em uma nova aba)


