Keyboard shortcuts

Press ← or → to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

De una interpretación MIDI o una partitura a una demostración

Archivos: crates/lineup-core/src/library/song/, crates/lineup-core/src/midi_file/import.rs y crates/lineup-core/tests/key_finding.rs

Una demostración es una constante de texto (ver Cómo se escribe una demostración). Las melodías cortas se escriben a mano. Las piezas más largas se leen de una versión que una computadora puede leer, un archivo MIDI, un grabado o una partitura guía, con pequeños scripts escritos para cada tipo de fuente. Los scripts no son parte de la aplicación: lo que escriben sí, como constantes de Rust corrientes, y el comentario // Source: encima de cada canción dice de dónde se leyó y qué se dejó afuera. Este capítulo trata de los métodos: cómo se leen de las notas un pulso, una melodía, una tonalidad y unos acordes, cómo reciben las notas su nombre, y qué conserva una demostración de una partitura. Casi todo es teoría musical puesta a trabajar. Qué escuchar en las piezas está en la guía de escucha del manual.

Tipos de fuente

FuenteQué contienePara
ABC (las colecciones de John Chambers y Henrik Norbeck, The Traditional Tune Archive)una melodía escrita con letras, a menudo con nombres de acordescanciones y danzas folk, los Balcanes
Partituras guía en MusicXML (OpenEWLD, la parte de dominio público del archivo Wikifonia)una melodía con los nombres de los acordes encimacanciones de casi todos los géneros: estándares de swing, blues, latinas, soul, pop
Grabados de LilyPond (el Mutopia Project, OpenScore)la partitura entera, cada voz, como textopiezas clásicas
Secuencias MIDI de una partituracada voz, tocada con clicla Misa Criolla, La consagración de la primavera, Petrushka, arreglos de tango y de folclore
Interpretaciones MIDIun pianista tocando libre, sin clictangos tocados al piano
Una transcripción en grados de la escala (TheoryTab de Hooktheory)la melodía y los acordes como números en una tonalidadel tema de The Big Bang Theory
SymbTrmúsica turca de makam, nota a notalas canciones turcas
Imágenes de las páginas de una partitura impresalo que lee el ojo, compás por compásalgunos tangos y canciones

Los formatos de texto ya se parecen a la notación de la aplicación, así que sus scripts sobre todo traducen. Los tresillos de una partitura guía pasan a las semicorcheas más cercanas, como los redondea la propia partitura guía de la aplicación, y donde un acorde de una partitura guía choca con su propia melodía se usa el acorde que suelen tocar los músicos de jazz ahí, con una nota en el comentario. Donde una fuente no trae acordes, el comentario dice que los acordes son una armonización sencilla. Muchas danzas de los Balcanes se escriben en semicorcheas (7/16, 11/16); aquí se escriben en corcheas, cada nota el doble de larga, lo que suena igual al tempo indicado.

Leer una partitura

Un grabado, a través de MIDI

LilyPond es un lenguaje para imprimir música a partir de texto. Estas son las primeras notas de los primeros violines de «Porque un niño nos ha nacido» de Handel:

re'''4 sol''8 sol'' do''' do''' do''' do''' |

Los nombres de las notas son los italianos, los mismos que en español (re, sol, do), cada ' sube la nota una octava, y el número es la duración (4 una negra, 8 una corchea). LilyPond escribe una partitura como archivo MIDI además de como página, y el script lee ese archivo compás por compás:

  • Dinámicas. LilyPond toca cada indicación de dinámica a una velocidad fija (p 69, mf 86, f 95), así que esas velocidades se leen de vuelta como las indicaciones, !p, !mf, !f.
  • Staccato. LilyPond toca una nota en staccato la mitad de larga de lo escrito. Para distinguir una negra en staccato de una corchea, la partitura se compila dos veces, una sin sus puntos de staccato: una nota que es más corta en el primer archivo está en staccato, y lleva un . en la demostración.
  • Fusas. Los trinos escritos de Bach son más rápidos que un paso. La notación puede escribir medio paso, D5:1/2.

Algunas partituras dejan cosas afuera, y el comentario dice qué se agregó: la edición del Mesías imprime sus fortes solo en los primeros violines, así que un forte vale para todas las cuerdas. Las ediciones también tienen errores. El grabado de Die Forelle escribe re natural en los compases 43 y 44, contra un re bemol en la mano izquierda. Los compases 19 y 20 tienen la misma música con re bemol, y también una segunda edición, la de OpenScore: la demostración toca re bemol.

Una anacrusa de su propia duración

Alfonsina y el mar empieza una corchea antes de su primer compás completo. En lugar de un compás de 6/8 que es casi todo silencio, como escribe su anacrusa «Clementine», la anacrusa puede ser un compás de su propia duración, porque una parte puede tener su propio compás:

#![allow(unused)]
fn main() {
const ONE_EIGHT: TimeSignature = TimeSignature::new(1, 8);
}
#![allow(unused)]
fn main() {
Part::new("Pickup", "!mf F#4:2", "")
    .in_time(ONE_EIGHT)
}

TimeSignature::new es una const fn, así que una indicación de compás también puede ser una constante.

Un coro son tres canales, no uno

Dos voces de un coro a menudo cantan la misma nota. Supón que las contraltos empiezan un mi en semicorcheas mientras los tenores sostienen un mi durante un pulso entero: en un mismo canal son dos notas con la misma altura en el mismo paso, y un patrón nunca guarda dos notas así (ver Nunca dos notas en el mismo lugar): gana la primera, y el mi sostenido de los tenores se perdería. Por eso el coro tiene sus contraltos, tenores y bajos en tres líneas, tres canales, como están en tres pentagramas de la partitura. El coro de la Misa Criolla es una sola línea, «Choir» (Coro), con sus voces unidas por &: donde dos de ellas coinciden en una nota, esa nota suena una vez.

Bajo cifrado: acordes escritos como números

Los compositores barrocos no escribían los acordes del teclado. Debajo de la línea del bajo escribían números pequeños, las cifras, cada una un intervalo sobre la nota del bajo, y quien tocaba completaba los acordes. La edición de Chrysander del Mesías imprime cifras sobre parte del bajo, y el cifrado de la demostración de Handel las sigue donde aparecen:

CifraSignificaEn este coro
ningunauna tríada en estado fundamentalcasi todos los compases
6una tríada en primera inversión: la tercera en el bajocompás 1: si con 6 es G/B
6/5un acorde de séptima en primera inversióncompás 1: fa♯ con 6/5 es D7/F#
4/2un acorde de séptima en tercera inversión: la séptima en el bajocompás 28: sol con 4/2 es A7/G; compás 43: do con 4/2 es D7/C
6 con una barraprimera inversión, con la sexta alzada un semitonocompás 26: mi con un 6 alzado es C#dim/E
+ solola tercera alzadacompás 22: la con do♯, A
un becuadrola tercera naturalcompás 58: re con fa natural, Dm

Una séptima quiere bajar un grado, así que un acorde de 4/2, con la séptima en el bajo, va casi siempre seguido de un 6 sobre la nota de abajo: A7/G va a D/F# en el compás 29, D7/C a G/B en el 44. Cómo escribe las inversiones la hoja de acordes está en Acordes con barra e inversiones del manual.

Leer una secuencia

Una secuencia es un archivo MIDI hecho en un secuenciador, cada voz en su pista, con clic. La Misa Criolla, La consagración de la primavera y Petrushka salen de secuencias de sus partituras. Las barras de compás están en el archivo; lo que tiene que hacer el script es volver a leer la interpretación como partitura:

  • cada nota va a la semicorchea más cercana, o al tercio de una más cercano donde la secuencia toca un tresillo, que entonces cae justo en el tick (ver Notas entre pasos);
  • el mapa de tempo se lee como las indicaciones de la partitura: una caída profunda que vuelve es un calderón, una serie de cambios pequeños un deslizamiento (rit. o accel.), y cualquier otra cosa un tempo nuevo;
  • las velocidades se leen como dinámicas, de pp a ff;
  • un trémolo, el mismo acorde tocado más rápido que una semicorchea, se escribe como un solo acorde sostenido.

Una partitura de orquesta tiene más líneas que canales una banda. El script mantiene la melodía delante y la sigue de instrumento en instrumento con played_by, da canales propios a las líneas que importan, y escribe el resto en el canal Teclados. Las líneas dobladas al unísono o a la octava se escriben una vez. Las notas de adorno, los trinos y los glissandos se simplifican, y el comentario dice cómo.

Leer una interpretación

Un pianista que toca libre, sin clic, deja un archivo MIDI sin barras de compás: la cuadrícula del archivo no significa nada. Los tangos de tango_played.rs salen de archivos así. Todo lo que diría una partitura hay que oírlo.

Encontrar el pulso

El pulso se encuentra como lo encuentra quien escucha, con el método de «Beat tracking by dynamic programming» de Dan Ellis (2007), el mismo que la aplicación usa con una grabación (ver Pulsos: arranques, autocorrelación y programación dinámica): cuánto sonido nuevo empieza en cada momento, el período más estable en eso, y luego la cadena de pulsos que cae en más arranques sin alejarse de ese período. Cada compás recibe entonces el tempo al que se tocó, y se escribe una marca de tempo donde el tempo se mueve medio pulso por minuto o más. Uno tiene 61.

Un pulso estable fuera de la cuadrícula

Algunos archivos se secuencian con un clic estable pero se guardan a otro tempo, así que los pulsos del clic duran una fracción de tick y se corren a través de los compases del propio archivo. Las notas de Balderrama no caen cerca de la cuadrícula del archivo, pero su bombo golpea cada 293 o 294 ticks del primer compás al último: un pulso estable. Para encontrarlo exactamente, numera los golpes por el pulso en que caen, k = 0, 1, 2, ..., y traza una recta por ellos, tick contra k. La recta de mínimos cuadrados es la que tiene la menor suma de errores al cuadrado, y su pendiente, la duración del pulso, tiene una fórmula:

period = Σ (k − k̄)(t − t̄) / Σ (k − k̄)²

donde k̄ y t̄ son los promedios. En Balderrama la corchea dura 293,966 ticks, y los golpes se apartan de la recta unos pocos ticks, milésimas de segundo: una máquina, no una persona.

La recta da el pulso pero no el compás: ¿cuál de las seis corcheas es la primera? La armonía cambia en el primer tiempo, y de las notas largas del coro la mayoría empieza en una misma corchea de las seis. Esa corchea es la primera del compás, y resulta que la melodía empieza dos corcheas antes, con una anacrusa, como suele hacer una zamba.

La melodía y la tonalidad

La melodía es la línea de arriba: de las notas que suenan en cada momento en la pista de la melodía, la más aguda (el perfil, como lee la melodía la partitura guía también). Las notas debajo de ella que la doblan, como una segunda voz en terceras, van en una línea propia.

La tonalidad sale de cuánto suena cada una de las doce clases de altura, comparado con perfiles de tonalidad, como lo hace el propio detector de tonalidad de la aplicación (ver Comparar: el método de Krumhansl-Schmuckler). Donde elige mal, la tonalidad se pone a mano, y una parte que cambia de tonalidad recibe su propio in_key. El test de que al menos cuatro notas de cada cinco estén en la tonalidad de su parte (melodies_are_mostly_in_their_key) atrapa también una elección equivocada de menor: la melodía de Balderrama canta re natural mucho más que re sostenido, así que en mi menor armónica solo 228 de sus 288 notas están en la tonalidad y el test falla, mientras que en mi menor natural están 257.

Los acordes

Para cada compás, medio compás o pulso, el script puntúa cada acorde común sobre las doce fundamentales: las notas dentro del acorde suman a su favor, las de afuera en contra, y una nota del bajo en la fundamental del acorde suma de más. Los acordes de la tonalidad reciben un pequeño premio, así una nota de paso no convierte un la menor en algo exótico, y un compás se divide solo donde la división puntúa claramente mejor. Es la misma idea que la escucha de acordes de la propia aplicación, y tiene la misma debilidad: las notas solas nombran cada color como un acorde propio. Una sexta que agrega el pianista convierte Bm en Bm6, y una nota de la melodía de paso le agrega una novena bemol a F♯7.

Una partitura guía de la canción arregla eso. Sus compases no coinciden con una interpretación libre (el pianista agrega una introducción, repite una sección, estira un compás), así que sus acordes no se ponen sobre los compases uno por uno. En cambio, la partitura le da a la lectura su vocabulario: solo se pueden elegir los acordes que usa la partitura. Una partitura en otra tonalidad primero se transporta, cada acorde movido el mismo intervalo, lo que mantiene la función de cada acorde en la tonalidad: la partitura de Uno está en sol y el pianista toca en do, así que G pasa a C, D7 a G7 y Em a Am.

Los compases 38 a 40 de Yira, yira, leídos solo de las notas, son Bm6 F#7b9 | Bm F#7 | Bm A7. Limitados a los acordes de la partitura son

Bm F#7 | Bm F#7 | Bm A7

La mano izquierda colorea el si menor con su sexta, sol♯, y la melodía toca sol, una novena bemol sobre F♯7. Debajo de los colores están los acordes sobre los que se construye la canción, i y V7 de si menor.

Sin partitura guía, los acordes se comprueban de oído y por lo que hacen. Tiempos viejos termina en re, fa, la y si. Esas cuatro notas son también si, re, fa, la, Bm7♭5, pero el bajo toca re, y el acorde viene después de A7, la dominante de re menor: es Dm6, re menor con sexta agregada. El nombre de un acorde sigue a su bajo y a su función, no solo a sus notas.

El nombre de las notas

Un archivo MIDI tiene números, no nombres. La nota 70 es la sostenido o si bemol, y el archivo no dice cuál. La tonalidad nombra las siete notas de su escala; las otras cinco siguen al acorde que las rodea:

  • Una nota del acorde se escribe como la tiene el acorde. En F♯7 (fa♯, la♯, do♯, mi) la nota 70 es la sostenido, la tercera del acorde; en Gm (sol, si♭, re) es si bemol.
  • Un acorde sobre una nota de fuera de la tonalidad se nombra por adónde va. Una séptima de dominante baja una quinta, así que el acorde antes de C♯m es G♯7. Un acorde de séptima que baja un semitono es un sustituto tritonal: el acorde antes de G es A♭7, no G♯7. Una séptima disminuida sube un semitono: G♯dim7 va a A.
  • Una nota de fuera del acorde se escribe por adónde va. Una nota de paso cromática entre dos notas a un tono de distancia es sostenido al subir y bemol al bajar: la, la♯, si y sol, sol♭, fa.
  • Nada de mi sostenido, si sostenido, do bemol ni fa bemol para una nota de paso: en el papel parecen errores por fa, do, si y mi. Las notas propias de la tonalidad sí pueden serlo: en si menor la cuarta alzada que lleva a la dominante, fa sostenido, es mi sostenido.

Cómo nombra la propia aplicación las notas de fuera de la tonalidad, sin mirar ningún acorde, está en Notas de fuera de la tonalidad; cómo las nombra la partitura guía, que mira el acorde como estas reglas, en Qué nombre de nota.

Una transcripción en grados de la escala

El tema de The Big Bang Theory sale de una transcripción del sitio TheoryTab de Hooktheory, donde las canciones se escriben como las lee una clase de teoría: cada nota un grado de la escala en la tonalidad (1 es la tónica, 5 la quinta), cada acorde un número romano. El conjunto de datos Sheet Sage (Chris Donahue y otros, 2022) reúne unas 26.000 en un archivo. Una nota ahí se ve así:

{"sd": "6", "octave": 0, "beat": 1, "duration": 1}

Grado 6, en la octava que empieza en la tónica, en el pulso 1, de un pulso de duración. El tema está en sol mayor, y con la tónica en G4 la melodía va de D4 a G5, el registro en que la escribe una partitura guía:

Escrito ahíEn solAquí
sd 6, octava 0, 1 pulsomi, encima de la tónicaE5:4
sd 5, octava 0, ½ pulsoreD5:2
sd 1, octava 0, ¼ de pulsosol, la tónicaG4:1
sd 5, octava −1, ½ pulsore, debajo de la tónicaD4:2

La transcripción también está alineada con la grabación: el pulso 1 de la estrofa está a los 7,6 segundos y su pulso 33 a los 19,66 segundos. 32 pulsos en 12,06 segundos son 32 × 60 / 12,06 = 159,2 pulsos por minuto, así que la estrofa lleva .with_tempo(&[tempo(0, 159)]) después de una introducción a 130.

Lo que una demostración tiene que conservar

Dos tests sobre todas las canciones deciden cómo se corta una pieza en partes y cómo se escribe su tempo.

Una exportación MIDI tiene que volver nota por nota. every_demo_comes_back_note_for_note exporta cada demostración como archivo MIDI, lo importa, lo vuelve a exportar y compara los dos archivos. El importador corta una canción larga en patrones en barras de compás que ninguna nota cruza (ver Cortar la canción en patrones); donde una nota sostenida cruza cada barra de compás durante muchos compases, tiene que cortar una, y la nota cortada se vuelve a tocar. Una demostración vuelve a tocar las notas sostenidas en los límites de sus propias partes de todos modos, así que un límite en la barra de compás correcta da un corte limpio: el Credo de la Misa Criolla, cuyo bajo se liga sobre casi todas las barras de compás, tiene uno en el compás 30, donde entran los solistas.

Una demostración mantiene un tempo razonable. every_demo_keeps_a_sensible_tempo mantiene cada marca de tempo entre tres décimos y dos veces y media el tempo de la canción. El último acorde de una secuencia a menudo se sostiene frenando el clic casi del todo: la secuencia del Credo sostiene su último acorde a 20 pulsos por minuto, y la demostración a 46.

Otro test lee las canciones de una manera que pide cuidado. El test del detector de tonalidad mide cuántos compases de las demostraciones oye en su tonalidad escrita, y una pieza en dos tonalidades a la vez haría que esa cifra no significara nada: diga la tonalidad que diga, la mitad de la música no está de acuerdo. Esas canciones van en una lista propia:

#![allow(unused)]
fn main() {
const POLYTONAL: &[&str] = &["The Rite of Spring, The Augurs of Spring"];
}

El test principal las deja afuera, y un segundo test comprueba que la tonalidad escrita esté entre las que se oyen, pero que no sea la única:

#![allow(unused)]
fn main() {
assert!(
    result.right_bars < result.bars,
    "{name} is heard in one key: drop it from POLYTONAL"
);
}

El segundo assert mantiene honesta la lista: si el detector llegara a oír los Augurios en una sola tonalidad, la canción dejaría de pertenecer a ella.

Comparar una demostración con su fuente

El último paso es tocar la demostración con la traza de reproducción:

ferrous-lineup --trace "Balderrama" --out balderrama.tsv

y buscar cada nota de la fuente en la traza: para una partitura en el mismo paso y la misma altura, en el canal correcto y con su duración; para una interpretación en la misma altura con un margen de un quinto de segundo. Lo que falta tiene que ser lo que una demostración deja afuera a propósito:

  • los unísonos en un mismo canal, que suenan una vez (dos manos en el canal Teclados, dos guitarras que tocan la misma nota, las voces de un coro en una sola línea);
  • los trémolos y los rasgueos más rápidos que una semicorchea, escritos como acordes sostenidos;
  • los golpes de batería que caen en el mismo paso de un carril;
  • las notas que nombra el comentario, como un error de una edición corregido.