Lección 1: Notas, clases de altura y el mástil
Secciones
Ajustes de lectura
Ninguna voz para este idioma en este navegador.
Más voces
Código y términos técnicos en inglés
Desactivado: la voz de la página lo lee todo, sin pausa entre dos voces.
Ninguna voz para este idioma en este navegador.
Más voces
Más voces: Microsoft Edge ofrece voces naturales en línea, y Windows (Configuración › Hora e idioma › Voz), macOS y Android instalan otras.
Todas las demás lecciones se apoyan en cuatro ideas: una altura (pitch) es una nota a una altura dada, una clase de altura (pitch class) es esa nota en cualquier octava, un intervalo es la distancia entre dos notas y, en una guitarra, cada traste añade una de esas distancias, un semitono. Esta lección las recorre en ese orden: primero la idea musical, luego cómo se escribe y después los tipos que usa Guitar Alchemist (GA) para representarla.
Todos los enlaces a GA apuntan al commit a826864 de GuitarAlchemist/ga, aquel contra el que se compila el programa del curso.
Ejecutar el programa de la lección
Sección titulada «Ejecutar el programa de la lección»El programa del curso está en code/music-theory-ga. fetch-ga.sh clona GA en ese commit sin el contenido de sus archivos (--filter=blob:none) y luego extrae solo tres proyectos con git sparse-checkout. El proyecto C# referencia uno de ellos, GA.Domain.Core, como cualquier otro proyecto de una solución (GaTheory.csproj). Necesitas el SDK de .NET 10 y Git; en Windows, ejecuta los comandos desde Git Bash.
bash code/music-theory-ga/check.sh # todas las lecciones, comparadas con expected/dotnet run --project code/music-theory-ga/GaTheory -c Release -- l1 # solo esta lección, después de check.shCada tabla imprime el cálculo propio del curso, escrito a partir de las definiciones de los libros de texto en Theory.cs, junto a la respuesta de GA, y ok o DIFF. Un DIFF no es un fallo del programa: es algo que GA hace de otra manera, y la lección lo explica. check.sh compara toda la salida, líneas DIFF incluidas, con expected/l1.txt, en Linux, Windows y macOS en la CI.
Altura y clase de altura
Sección titulada «Altura y clase de altura»La idea
Sección titulada «La idea»Toca al aire la cuerda E grave y luego la misma nota doce trastes más arriba: la segunda nota suena «igual, solo que más aguda». Los músicos lo llaman equivalencia de octava. Una altura es una nota concreta, como el E de la cuerda grave; una clase de altura es todos los E de todas las octavas (Open Music Theory, “Pitch and Pitch Class”).
La música occidental divide la octava en doce semitonos iguales. Si conoces TimeOnly o LocalTime, una clase de altura es la hora en un reloj de 12 horas y una altura es una marca de tiempo completa: sumar doce semitonos cambia la octava, no la clase de altura.
La notación
Sección titulada «La notación»- La notación científica (American Standard) de alturas escribe una altura como un nombre de nota y un número de octava. Los números de octava cambian en C, y el C central es C4 (Open Music Theory, “ASPN”).
- Los números de nota MIDI cuentan semitonos de 0 a 127: el C central es 60 y A4 (440 Hz) es 69 (MIDI tuning standard). Así,
midi = 12 × (octave + 1) + pitch class. - La notación entera numera las clases de altura de C = 0 a B = 11. Todas las grafías enarmónicas de una nota comparten su número: B♯ es 0 y D♭ es 1 (Open Music Theory, “Pitch and Pitch Class”). Para que cada clase de altura ocupe un solo carácter, 10 y 11 se escriben a menudo T y E, como en la tabla de clases de conjuntos de Open Music Theory, “Set Class and Prime Form”, donde la escala mayor es
(013568T).
La primera tabla del programa convierte las seis cuerdas al aire de una guitarra, el C central, A4 y C♯4:
== Pitches: MIDI number and pitch class (C4 = 60)pitch course GA checkE2 midi 40 pc 4 midi 40 pc 4 okA2 midi 45 pc 9 midi 45 pc 9 okD3 midi 50 pc 2 midi 50 pc 2 okG3 midi 55 pc 7 midi 55 pc 7 okB3 midi 59 pc 11 midi 59 pc 11 okE4 midi 64 pc 4 midi 64 pc 4 okC4 midi 60 pc 0 midi 60 pc 0 okA4 midi 69 pc 9 midi 69 pc 9 okC#4 midi 61 pc 1 midi 61 pc 1 okGA prints pitch classes as: 0 1 2 3 4 5 6 7 8 9 T EPitchClasses unreadonly record structque contiene unintde 0 a 11: un value object, como escribirías unMoneyo unEmailAddress. Su setter normaliza el valor módulo 12 medianteEnsureValueRange(…, normalize: true), de modo quePitchClass.FromValue(-1)es 11: la aritmética de clases de altura nunca sale de la esfera del reloj.ToString()imprime 10 y 11 como T y E. Cuidado: la clase de alturaEes B, no la nota E.Pitches unabstract recordcon unaOctavey unaPitchClass, y tres subtipos según cómo se escriba la nota:Chromatic,SharpyFlat.MidiNoteobtiene la octava y la clase de altura dividiendo entre 12, yMidiNote.Createes la fórmula anterior, conOctave.Min= −1.
Nombres de notas y alteraciones
Sección titulada «Nombres de notas y alteraciones»La idea
Sección titulada «La idea»Las siete notas naturales C D E F G A B son las teclas blancas de un piano. Entre la mayoría de ellas hay una clase de altura más (una tecla negra), salvo entre E y F y entre B y C, que están a solo un semitono. Una alteración sube (♯, sostenido) o baja (♭, bemol) una letra un semitono; los dobles sostenidos (𝄪, escrito x) y los dobles bemoles (𝄫) la mueven dos.
Así, una clase de altura tiene varios nombres: C♯ y D♭ son la misma tecla del piano, y también B♯ y C. Son grafías enarmónicas (Open Music Theory, “Pitch and Pitch Class”). Los números de octava siguen a la letra, no al sonido: B♯3 y C4 son la misma tecla, en dos octavas (Open Music Theory, “ASPN”). El nombre que eliges depende del contexto: la lección 3 muestra por qué un acorde de C menor se escribe C E♭ G y no C D♯ G.
== Spellings: many names, one pitch classnote course GA checkC# 1 1 okDb 1 1 okB# 0 0 okCb 11 11 okE# 5 5 okFb 4 4 okBbb 9 9 okFx 7 7 okNote es una jerarquía cerrada de records, la unión discriminada de GA: el equivalente en C# de una sealed interface de Java con implementaciones record.
classDiagram class Note { <<abstract record>> PitchClass PitchClass } class Chromatic { int Value } class KeyNote { <<abstract>> NaturalNote NaturalNote } class Sharp { SharpAccidental? SharpAccidental } class Flat { FlatAccidental? FlatAccidental } class Accidented { Accidental? Accidental } Note <|-- Chromatic Note <|-- KeyNote KeyNote <|-- Sharp KeyNote <|-- Flat Note <|-- AccidentedNote.Chromatices una clase de altura sin grafía; se imprime comoC#/Db.Note.SharpyNote.Flatson los nombres usados en las tonalidades con sostenidos y con bemoles.Note.Accidentedacepta cualquierAccidental, del triple bemol al triple sostenido. Su clase de altura es la de la letra, tomada deNaturalNote.PitchClass, más la alteración, normalizada: así es comoCbse convierte en 11.
Intervalos
Sección titulada «Intervalos»La idea
Sección titulada «La idea»Un intervalo tiene dos nombres a la vez (Open Music Theory, “Intervals”):
- su número cuenta letras, incluidos los dos extremos: de C a E hacia arriba es una tercera (C, D, E), sean cuales sean las alteraciones;
- su cualidad viene del número de semitonos. Los unísonos, cuartas, quintas y octavas son justos (P) y pasan a ser aumentados (A) o disminuidos (d) cuando son un semitono más anchos o más estrechos. Las segundas, terceras, sextas y séptimas son mayores (M) o menores (m), a un semitono de distancia, y más allá aumentadas o disminuidas.
Por eso C–D♯ y C–E♭ tienen ambos tres semitonos pero son intervalos distintos: una segunda aumentada y una tercera menor. Dar la vuelta a un intervalo (de C a E hacia arriba, luego de E a C hacia arriba) es una inversión: los números suman 9 (una tercera se convierte en sexta), justo sigue siendo justo, mayor pasa a menor y aumentado pasa a disminuido (mismo capítulo, “Intervallic Inversion”).
Cuando solo importan las clases de altura, la distancia se reduce a 6 semitonos como máximo: es la clase de intervalo, y C–E (4) y E–C (8) son ambos clase de intervalo 4 (Open Music Theory, “Intervals in Integer Notation”). La lección 4 cuenta clases de intervalo.
== Intervals: name from the letters, size in semitones, interval classnotes course GA checkC-E M3 4 ic4 M3 4 ic4 okC-Eb m3 3 ic3 m3 3 ic3 okC-D# A2 3 ic3 A2 3 ic3 okC-G P5 7 ic5 P5 7 ic5 okC-F# A4 6 ic6 A4 6 ic6 okC-Gb d5 6 ic6 d5 6 ic6 okB-F d5 6 ic6 d5 6 ic6 okE-C m6 8 ic4 m6 8 ic4 ok!M3 m6 m6 okInterval.Simplees un record con unSize(el número,SimpleIntervalSize, de 1 a 8, que sabe si es justo y su tamaño mayor o justo en semitonos) y unaQuality(IntervalQuality, de −3 para doblemente disminuido a +3 para doblemente aumentado). Sus semitonos son los del tamaño más la cualidad convertida en alteración.- El operador
!esToInverse:9 - Valuepara el tamaño y la cualidad opuesta. GetIntervaltoma el número de las letras y los semitonos de las clases de altura, y luego busca la cualidad enDetermineQuality, el mismo algoritmo que elTheory.Intervaldel curso. Los métodos de GA son extension members de C# 14 (extension(Note note1) { … }).IntervalClass.FromValuereduce cualquier número de semitonos a 0–6.
El mástil y las afinaciones
Sección titulada «El mástil y las afinaciones»La idea
Sección titulada «La idea»Las cuerdas de una guitarra se numeran desde la que suena más aguda: la cuerda 1 es la E aguda y fina, y la cuerda 6 la E grave. La afinación estándar es E2 A2 D3 G3 B3 E4 de la cuerda 6 a la cuerda 1 (Guitar tunings). Cada traste sube la cuerda un semitono, así que la nota de la cuerda s, traste f, es el número MIDI de la cuerda al aire más f. La misma altura aparece en varias cuerdas: C4 está en la cuerda 2 traste 1, la cuerda 3 traste 5 y la cuerda 4 traste 10. El módulo de Streeling GTR-001 · El mapa del mástil recorre las notas naturales de cada cuerda.
E2A2D3G3B3E4El diagrama dibuja los trastes 0 a 12 en afinación estándar, con la cuerda 1 arriba como en la tablatura, y marca cada posición de la clase de altura C con su altura. Hay seis: C3 en la cuerda 6 traste 8 y en la cuerda 5 traste 3, C4 en la cuerda 4 traste 10, la cuerda 3 traste 5 y la cuerda 2 traste 1, y C5 en la cuerda 1 traste 8. Tres posiciones tocan exactamente la misma altura, C4.
== Standard tuning: string 1 is the higheststring course GA check1 E4 E4 ok2 B3 B3 ok3 G3 G3 ok4 D3 D3 ok5 A2 A2 ok6 E2 E2 ok
== Fretboard: each fret adds one semitonestring/fret course GA check6/0 E2 40 E2 40 ok6/3 G2 43 G2 43 ok5/3 C3 48 C3 48 ok2/1 C4 60 C4 60 ok3/5 C4 60 C4 60 ok1/8 C5 72 C5 72 ok4/10 C4 60 C4 60 ok
== Where is pitch class C on frets 0-12? (string/fret)course 6/8 5/3 4/10 3/5 2/1 1/8GA, Note.Chromatic 6/8 5/3 4/10 3/5 2/1 1/8GA, Note.Sharp (none)Tuningse construye a partir de una cadena de alturas:Tuning.Defaultanaliza"E2 A2 D3 G3 B3 E4", de grave a agudo, yBuildPitchArrayla invierte cuando la primera altura es la más grave, para que el indexadortuning[new Str(1)]sea la cuerda más aguda, como cuentan los guitarristas.Str(de 1 a 26) yFret(−1 para una cuerda apagada, 0 al aire, hasta 36) son de nuevo value objects.Fretboard.GetNotesuma el traste a la nota MIDI de la cuerda al aire, como arriba, pero recibe un índice de cuerda empezando en 0:GetNote(0, 0)es la cuerda 1.GetPositionsForNotecompara la nota de cada posición conEquals.GetNotedevuelve unNote.Chromatic, y los records de tipos distintos nunca son iguales, así que buscarNote.Sharp.Cno encuentra nada: la línea(none)de arriba.
Sorpresas encontradas al escribir esta lección
Sección titulada «Sorpresas encontradas al escribir esta lección»Al escribir las comparaciones aparecieron algunos puntos en los que GA responde otra cosa que la teoría. El programa del curso los conserva como líneas DIFF, para que la CI se entere si un commit posterior de GA los cambia; también están en el diario.
== Surprises found while writing this lessoncall course GA checkPitch.Flat.DFlat(4) Db4 D4 DIFFPitch.Flat.GFlat(4) Gb4 A4 DIFFPitch.Flat.FFlat(4) Fb4 G4 DIFFPitch.Sharp.TryParse Eb2 rejected B2 DIFFNote.Flat.Parse B B Bb DIFFPitchClass.Parse A 9 10 DIFFIntervalSize.TryParse x False throws ArgumentException DIFFPitch.Flat.DFlat(octave),FFlatyGFlatconstruyen D, G y A en lugar de D♭, F♭ y G♭. Las propiedadesDFlat4y compañía son correctas; solo los métodos están mal.PitchParserbusca su patrón([A-G])(#?)(10|11|[0-9])sin anclas^…$e ignora las mayúsculas: en"Eb2", el parser de sostenidos se salta la E y reconoceb2como B2.Note.Flat.TryParsepasa su entrada a mayúsculas antes de sustituir♭porb, y luego trata unaBfinal como signo de bemol. Esas dos líneas lo estropean en los dos sentidos: la propia"B"se convierte en B♭, y un"D♭"auténtico se rechaza, porque la sustitución deja unabminúscula donde elEndsWith("B"), sensible a las mayúsculas, ya no la reconoce.PitchClass.TryParseleeAyBcomo los dígitos 10 y 11, a propósito: el comentario los llama “common hex-like aliases sometimes used in set notation”. La convención existe de verdad; el error está en el orden. Los alias se prueban antes que los nombres de notas, así que"A"es la clase de altura 10 y la nota A, la clase de altura 9, no se puede analizar en absoluto.SimpleIntervalSize.TryParselanza una excepción ante una entrada incorrecta en lugar de devolverfalse, al contrario de lo que pide el contrato deIParsable<TSelf>.TryParse, yCompoundIntervalSize.TryParsehace lo mismo. La tabla acorta el nombre: el tipo esSimpleIntervalSize.
Ejercicios
Sección titulada «Ejercicios»- ¿Qué altura, número MIDI y clase de altura corresponden a la cuerda 4, traste 7, en afinación estándar?
- Nombra los intervalos E–B♭ y A–C♯, con su tamaño en semitonos y su clase de intervalo.
- En la afinación drop D, la cuerda 6 se baja a D2 (Guitar tunings). ¿Dónde está la clase de altura D en los trastes 0 a 5? Construye ese mástil con los tipos
TuningyFretboardde GA.
Soluciones
-
La cuerda 4 es D3 (MIDI 50); siete trastes más arriba está A3, MIDI 57, clase de altura 9.
-
De E a B♭ hay cinco letras (E F G A B) y 6 semitonos, uno menos que una quinta justa: una quinta disminuida, clase de intervalo 6. De A a C♯ hay tres letras y 4 semitonos: una tercera mayor, clase de intervalo 4.
-
Las cuerdas 6 y 4 al aire, la cuerda 5 traste 5 y la cuerda 2 traste 3. Con GA, una afinación es una colección de alturas analizada (
Lesson1.cs):var dropD = new Fretboard(new Tuning(PitchCollection.Parse("D2 A2 D3 G3 B3 E4")), 5);var positions = dropD.GetPositionsForNote(Note.Chromatic.D);== Exercise solutionsquestion course GA check1. string 4, fret 7 A3 midi 57 pc 9 A3 midi 57 pc 9 ok2. E-Bb d5 6 ic6 d5 6 ic6 ok2. A-C# M3 4 ic4 M3 4 ic4 ok3. D in drop D, 0-5 6/0 5/5 4/0 2/3 6/0 5/5 4/0 2/3 ok
Puntos clave
Sección titulada «Puntos clave»- Una altura es una clase de altura más una octava; con números MIDI,
pitch class = midi % 12y el C central es 60. - Un nombre de nota es una letra más alteraciones; varios nombres comparten una clase de altura. GA conserva ambos:
PitchClasspara el número y los recordsNotepara la grafía. - El número de un intervalo viene de las letras y su cualidad de los semitonos; la clase de intervalo olvida tanto la dirección como la octava.
- En una guitarra, una posición es una cuerda y un traste: la altura de la cuerda al aire más un semitono por traste. GA numera las cuerdas desde la más aguda, como los guitarristas.
- Las primitivas de GA son pequeños value objects,
readonly record structs que validan o normalizan su rango, y records para las uniones: el mismo modelado que usarías para importes de dinero o identificadores.
Fuentes
Sección titulada «Fuentes»- Mark Gotham et al., Open Music Theory, versión 2, 2023: capítulos Pitch and Pitch Class, ASPN, Intervals, Intervals in Integer Notation, Set Class and Prime Form. El libro se publica bajo CC BY-SA 4.0.
- MIDI tuning standard (MIDI 60 = C4, 69 = A4) y Guitar tunings (afinaciones estándar y drop D, numeración de las cuerdas), Wikipedia.
- GuitarAlchemist/ga en
a826864:Primitives/Notes,Primitives/Intervals,Theory/Atonal/PitchClass.cs,Instruments.