En pocas palabras
Un capítulo de un estudio sobre música medieval. Pasajes breves de una rota inglesa del siglo XIII se imprimen como música dentro del texto, y las notas al pie de cada página recogen, compás a compás, dónde discrepan las ediciones antiguas.
Lo que vas a componer
El capítulo 3 de un estudio sobre cómo leyeron la música medieval los anticuarios ingleses: cinco páginas de 156 × 234 mm sobre Sumer is icumen in, la rota de Reading, y los editores que la pusieron en partitura entre 1776 y 1889. Tres pasajes de la rota van grabados en el texto, en Leipzig y con un pentagrama de 5 mm, con la numeración de compases de la partitura de W. S. Rockstro, y cada comentario cita su aparato al pie de la página: «c. 40, n. 2 la ] sol Hw, Bu». Las notas son breves y densas, como corresponde a un aparato; la música ocupa la medida del texto, y cada lectura procede del artículo de Rockstro en el Dictionary de Grove, cosa que el capítulo declara en su segundo párrafo.
Esta receta responde a
- ¿Cómo doy a los ejemplos musicales un aparato crítico de variantes de las fuentes en notas al pie?
- ¿Cómo hago notas al pie?
La respuesta corta
// 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
- Funciones
- Notación musicalNotas al pieEstilo de partituraAperturas diseñadasAtributos de títuloCabeceras y foliosMárgenes simétricosCabeceras según el tipo de páginaEstilos de párrafoPaleta de color semánticaColor del papelViudas, huérfanas y líneas cortasExportación a PDF
- Tipografía
- Crimson Pro, Cormorant Garamond, Source Sans 3 (SIL OFL 1.1)
- Recursos
- Ninguno: todas las imágenes se dibujan en código
Elaboración
#1 · Escribe cada ejemplo en MEI, con sus variantes
Los ajustes son la respuesta corta de arriba; la música va en el Markdown, un bloque ```mei por ejemplo. Donde dos fuentes discrepan, el compás lleva un <app> con la lectura adoptada en <lem> y la otra en <rdg source="#Hw #Bu">. El grabador imprime el lema: el c. 40 del ejemplo 3.3 muestra el la, y el sol de Hawkins y Burney sigue en el archivo para quien abra la codificación. Da a cada bloque un alt en el idioma de la página: es lo que leen de la partitura un lector de pantalla y el PDF etiquetado.
#2 · Ata el aparato a los compases que ve el lector
barNumbers: 'system' numera el primer compás de cada sistema, y el <measure n="37"> de cada bloque arranca la cuenta donde empieza el fragmento en la edición que sigue, así que el ejemplo 3.3 abre en el 37 y una nota que dice «c. 40» remite a un compás que el lector encuentra. La entrada del aparato es una nota al pie corriente, citada desde el párrafo que comenta el compás: lema, corchete de cierre, variante y siglas en cursiva. Una nota no puede citarse desde dentro de una partitura, así que la llamada va en la frase que nombra la lectura.
#3 · Ajusta la música al texto corrido
Un pentagrama de 5 mm en Leipzig cabe en una medida de 116 mm con cinco o seis compases de 3/2 por sistema, y los once compases del ejemplo 3.3 quedan en dos sistemas. textFont compone la letra en Crimson Pro, la letra del texto, y minSystemsAtBreak: 2 impide que una página acabe con un solo sistema de un ejemplo mientras el resto pasa a la siguiente. El rótulo de cada ejemplo es un título de tercer nivel, de modo que nunca se queda al pie de una página sin su partitura.
#4 · Deja que una página con notas acabe 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) } } },
] },
};
La apertura baja el texto 50 mm bajo un título en Cormorant cursiva. Más adelante, una página cuya línea siguiente arrastraría una nota larga acaba unas líneas antes, y balancing: { maxLinesPerHeading: 1 } evita que el equilibrado de columnas suba ese hueco encima del título de la sección siguiente, donde parecería un corte en el argumento.
#5 · Pon el libro en la página par y el capítulo en la impar
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' }] };
Los folios van en rojo de rúbrica en el borde exterior, el libro en la página par y el capítulo en la impar; pages: 'body' los quita de la apertura, que lleva un folio centrado al pie.
La receta 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 = 'es'; // @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),
El script.js compuesto funciona tal cual: pégalo como script de módulo en cualquier página o abre la receta en CodePen. Carpeta de la receta en GitHub ↗ (se abre en una nueva pestaña)
Variantes
#Numera todos los compases
Un aparato con muchas entradas por sistema se sigue mejor con un número en cada compás.
- barNumbers: 'system', // the apparatus is keyed by bar: number every system
+ barNumbers: 'every',#Graba los ejemplos en Bravura
Las cabezas de nota de Bravura, más gruesas, casan con un estilo de grabado en plancha.
- musicFont: 'Leipzig', // lighter than Bravura, close to a 19th-century plate
+ musicFont: 'Bravura',Errores frecuentes
- MEI 5 escribe la armadura como
keysig="1f"enscoreDefostaffDef. El atributokey.sigde MEI 4 se ignora sin aviso, y el bemol desaparece. - Pon
lines="5"en cadastaffDef: sin él, notas y claves se graban sin pentagrama. - El grabador imprime el
<lem>de un<app>, no el<rdg>. Una variante que el lector deba ver en la página va en la nota del aparato o en un segundo ejemplo.
Créditos
- Receta
- Ignacio Ferro
- Texto
- El texto del capítulo y las notas del aparato, en inglés y en español · Ignacio Ferro · CC BY 4.0
- Sumer is icumen in (siglo XIII): los ejemplos, transcritos de la partitura de W. S. Rockstro y las lecturas que da su artículo, en A Dictionary of Music and Musicians, ed. George Grove, vol. 3, págs. 765–768, y vol. 4, págs. 1–3 (Macmillan, reimpresión de 1900), según la transcripción de Wikisource · Anonymous; William Smyth Rockstro · dominio público
- La rúbrica latina del manuscrito Harley 978, f. 11v, y el folio, citados en el artículo de Wikipedia (comprobación) · Wikipedia contributors · CC BY-SA 4.0
- Fuentes
- Crimson Pro (SIL OFL 1.1) · Cormorant Garamond (SIL OFL 1.1) · Source Sans 3 (SIL OFL 1.1)
- Código
- MIT, como Postext
Editar este texto ↗ (se abre en una nueva pestaña)Carpeta de la receta en GitHub ↗ (se abre en una nueva pestaña)


