Saltar al contenido principal
Receta número 165

Recetario · Capítulo 6 · Recuadros y notas

Ejemplos musicales en MEI con aparato crítico en las notas

Bloques MEI 5 grabados en el texto con un pentagrama de 5 mm, variantes codificadas con app, lem y rdg, y el aparato por compás y nota en notas al pie.

En esta página
Salida
Canvas · PDF
Postext
Probada con Postext 1.54.0
Requiere ≥ 1.54.0 · postext-pdf ≥ 1.54.0
Licencia
Actualizada el 22 oct 2026
Código MIT · Texto CC BY 4.0

pp. 2–3 de 5

  • Formato 156 × 234 mm
  • 1 columna
  • Crimson Pro 11/14,5
  • Cormorant Garamond
  • Source Sans 3
  • 5 páginas
  • Nivel
  • Postext 1.54.0
  • Compuesto en 19 ms
  • 145 líneas de código

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

script.js · líneas 36–60en el código completo
// 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

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

script.js · líneas 64–78en el código completo
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

script.js · líneas 82–99en el código completo
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

Sandbox
// ═══ 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" en scoreDef o staffDef. El atributo key.sig de MEI 4 se ignora sin aviso, y el bemol desaparece.
  • Pon lines="5" en cada staffDef: 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

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)
SandboxPDF