Leçon 1 : notes, classes de hauteurs et manche
Sections
Réglages de lecture
Aucune voix pour cette langue dans ce navigateur.
Plus de voix
Code et termes techniques en anglais
Désactivé : la voix de la page lit tout, sans pause entre deux voix.
Aucune voix pour cette langue dans ce navigateur.
Plus de voix
D’autres voix : Microsoft Edge propose des voix naturelles en ligne, et Windows (Paramètres › Heure et langue › Voix), macOS et Android en installent d’autres.
Toutes les autres leçons reposent sur quatre idées : une hauteur (pitch) est une note à une hauteur donnée, une classe de hauteurs (pitch class) est cette note dans n’importe quelle octave, un intervalle est la distance entre deux notes, et sur une guitare chaque case ajoute l’une de ces distances, un demi-ton. Cette leçon les parcourt dans cet ordre : d’abord l’idée musicale, puis sa notation, puis les types que Guitar Alchemist (GA) utilise pour la représenter.
Tous les liens vers GA pointent sur le commit a826864 de GuitarAlchemist/ga, celui contre lequel le programme du cours est compilé.
Exécuter le programme de la leçon
Section intitulée « Exécuter le programme de la leçon »Le programme du cours se trouve dans code/music-theory-ga. fetch-ga.sh clone GA à ce commit sans le contenu de ses fichiers (--filter=blob:none), puis n’extrait que trois projets avec git sparse-checkout. Le projet C# référence l’un d’eux, GA.Domain.Core, comme n’importe quel autre projet d’une solution (GaTheory.csproj). Il te faut le SDK .NET 10 et Git ; sous Windows, lance les commandes depuis Git Bash.
bash code/music-theory-ga/check.sh # toutes les leçons, comparées avec expected/dotnet run --project code/music-theory-ga/GaTheory -c Release -- l1 # cette leçon seulement, après check.shChaque tableau affiche le calcul propre au cours, écrit à partir des définitions des manuels dans Theory.cs, à côté de la réponse de GA, puis ok ou DIFF. Un DIFF n’est pas un échec du programme : c’est quelque chose que GA fait autrement, et la leçon l’explique. check.sh compare toute la sortie, lignes DIFF comprises, avec expected/l1.txt, sous Linux, Windows et macOS en CI.
Hauteur et classe de hauteurs
Section intitulée « Hauteur et classe de hauteurs »Joue la corde de E grave à vide, puis la même note douze cases plus haut : la seconde note sonne « pareil, mais plus aigu ». Les musiciens appellent cela l’équivalence d’octave. Une hauteur est une note précise, comme le E de la corde grave ; une classe de hauteurs, c’est tous les E de toutes les octaves (Open Music Theory, “Pitch and Pitch Class”).
La musique occidentale divise l’octave en douze demi-tons égaux. Si tu connais TimeOnly ou LocalTime, une classe de hauteurs est l’heure sur un cadran de 12 heures et une hauteur est un horodatage complet : ajouter douze demi-tons change l’octave, pas la classe de hauteurs.
La notation
Section intitulée « La notation »- La notation scientifique des hauteurs (American Standard Pitch Notation) écrit une hauteur comme un nom de note suivi d’un numéro d’octave. Les numéros d’octave changent sur C, et le C central (middle C) est C4 (Open Music Theory, “ASPN”).
- Les numéros de note MIDI comptent les demi-tons de 0 à 127 : le C central vaut 60 et A4 (440 Hz) vaut 69 (MIDI tuning standard). Donc
midi = 12 × (octave + 1) + pitch class. - La notation entière numérote les classes de hauteurs de C = 0 à B = 11. Toutes les graphies enharmoniques d’une note partagent son numéro : B♯ vaut 0 et D♭ vaut 1 (Open Music Theory, “Pitch and Pitch Class”). Pour que chaque classe de hauteurs tienne en un caractère, 10 et 11 s’écrivent souvent T et E, comme dans le tableau des classes d’ensembles de Open Music Theory, “Set Class and Prime Form”, où la gamme majeure est
(013568T).
Le premier tableau du programme convertit les six cordes à vide d’une guitare, le C central, A4 et 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 EPitchClassest unreadonly record structqui contient unintde 0 à 11 : un objet valeur, comme tu écrirais unMoneyou unEmailAddress. Son setter normalise la valeur modulo 12 viaEnsureValueRange(…, normalize: true), si bien quePitchClass.FromValue(-1)vaut 11 : l’arithmétique des classes de hauteurs ne quitte jamais le cadran.ToString()affiche 10 et 11 sous la forme T et E. Attention : la classe de hauteursEest B, pas la note E.Pitchest unabstract recordavec uneOctaveet unePitchClass, et trois sous-types selon la graphie de la note :Chromatic,SharpetFlat.MidiNotedéduit l’octave et la classe de hauteurs en divisant par 12, etMidiNote.Createest la formule ci-dessus, avecOctave.Min= −1.
Noms des notes et altérations
Section intitulée « Noms des notes et altérations »Les sept notes naturelles C D E F G A B sont les touches blanches d’un piano. Entre la plupart d’entre elles se trouve une classe de hauteurs de plus (une touche noire), sauf entre E et F et entre B et C, qui ne sont qu’à un demi-ton l’une de l’autre. Une altération élève (♯, dièse) ou abaisse (♭, bémol) une lettre d’un demi-ton ; les doubles dièses (𝄪, écrits x) et les doubles bémols (𝄫) la déplacent de deux.
Une même classe de hauteurs a donc plusieurs noms : C♯ et D♭ sont la même touche du piano, tout comme B♯ et C. Ce sont des graphies enharmoniques (Open Music Theory, “Pitch and Pitch Class”). Les numéros d’octave suivent la lettre, pas le son : B♯3 et C4 sont la même touche, dans deux octaves (Open Music Theory, “ASPN”). Le nom choisi dépend du contexte : la leçon 3 montre pourquoi un accord de C mineur s’écrit C E♭ G, et non 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 est une hiérarchie fermée de records, l’union discriminée de GA : l’équivalent C# d’une sealed interface Java avec des implémentations en records.
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.Chromaticest une classe de hauteurs sans graphie ; elle s’afficheC#/Db.Note.SharpetNote.Flatsont les noms utilisés dans les tonalités à dièses et à bémols.Note.Accidentedaccepte n’importe quelleAccidental, du triple bémol au triple dièse. Sa classe de hauteurs est celle de la lettre, tirée deNaturalNote.PitchClass, plus l’altération, normalisée : c’est ainsi queCbdevient 11.
Intervalles
Section intitulée « Intervalles »Un intervalle porte deux noms à la fois (Open Music Theory, “Intervals”) :
- son numéro compte les lettres, extrémités comprises : de C à E, c’est une tierce (C, D, E), quelles que soient les altérations ;
- sa qualité vient du nombre de demi-tons. Les unissons, quartes, quintes et octaves sont justes (P) et deviennent augmentés (A) ou diminués (d) quand ils sont plus larges ou plus étroits d’un demi-ton. Les secondes, tierces, sixtes et septièmes sont majeures (M) ou mineures (m), à un demi-ton d’écart, puis augmentées ou diminuées au-delà.
Voilà pourquoi C–D♯ et C–E♭ font tous deux trois demi-tons mais sont des intervalles différents : une seconde augmentée et une tierce mineure. Retourner un intervalle (de C à E, puis de E à C) est un renversement : les numéros totalisent 9 (une tierce devient une sixte), juste reste juste, majeur devient mineur et augmenté devient diminué (même chapitre, “Intervallic Inversion”).
Quand seules les classes de hauteurs comptent, la distance est repliée sur 6 demi-tons au plus : c’est la classe d’intervalles, et C–E (4) comme E–C (8) sont de classe d’intervalles 4 (Open Music Theory, “Intervals in Integer Notation”). La leçon 4 compte les classes d’intervalles.
== 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.Simpleest un record avec uneSize(le numéro,SimpleIntervalSize, de 1 à 8, qui sait s’il est juste et connaît sa taille majeure ou juste en demi-tons) et uneQuality(IntervalQuality, de −3 pour doublement diminué à +3 pour doublement augmenté). Ses demi-tons sont ceux de la taille plus la qualité convertie en altération.- L’opérateur
!estToInverse:9 - Valuepour la taille et la qualité opposée. GetIntervaltire le numéro des lettres et les demi-tons des classes de hauteurs, puis cherche la qualité dansDetermineQuality, le même algorithme queTheory.Intervaldans le cours. Les méthodes de GA sont des extension members de C# 14 (extension(Note note1) { … }).IntervalClass.FromValuereplie n’importe quel nombre de demi-tons dans 0–6.
Le manche et les accordages
Section intitulée « Le manche et les accordages »Les cordes d’une guitare sont numérotées à partir de la plus aiguë : la corde 1 est le E aigu, la plus fine, la corde 6 le E grave. L’accordage standard est E2 A2 D3 G3 B3 E4 de la corde 6 à la corde 1 (Guitar tunings). Chaque case élève la corde d’un demi-ton, donc la note à la corde s, case f, est le numéro MIDI de la corde à vide plus f. La même hauteur apparaît sur plusieurs cordes : C4 est à la corde 2 case 1, à la corde 3 case 5 et à la corde 4 case 10. Le module Streeling GTR-001 · La carte du manche passe en revue les notes naturelles sur chaque corde.
E2A2D3G3B3E4Le diagramme dessine les cases 0 à 12 en accordage standard, la corde 1 en haut comme dans une tablature, et marque chaque position de la classe de hauteurs C avec sa hauteur. Il y en a six : C3 sur la corde 6 case 8 et sur la corde 5 case 3, C4 sur la corde 4 case 10, la corde 3 case 5 et la corde 2 case 1, et C5 sur la corde 1 case 8. Trois positions jouent exactement la même hauteur, 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 construit à partir d’une chaîne de hauteurs :Tuning.Defaultanalyse"E2 A2 D3 G3 B3 E4", du grave à l’aigu, etBuildPitchArrayl’inverse quand la première hauteur est la plus grave, pour que l’indexeurtuning[new Str(1)]soit la corde la plus aiguë, comme comptent les guitaristes.Str(de 1 à 26) etFret(−1 pour une corde étouffée, 0 à vide, jusqu’à 36) sont là encore des objets valeur.Fretboard.GetNoteajoute la case à la note MIDI de la corde à vide, comme ci-dessus, mais prend un index de corde à partir de 0 :GetNote(0, 0)est la corde 1.GetPositionsForNotecompare la note de chaque position avecEquals.GetNoterenvoie unNote.Chromatic, et des records de types différents ne sont jamais égaux, donc chercherNote.Sharp.Cne trouve rien : c’est la ligne(none)ci-dessus.
Surprises rencontrées en écrivant cette leçon
Section intitulée « Surprises rencontrées en écrivant cette leçon »L’écriture des comparaisons a révélé quelques endroits où GA ne répond pas ce que dit la théorie. Le programme du cours les garde comme lignes DIFF, pour que la CI remarque si un commit ultérieur de GA les change ; ils figurent aussi dans le journal.
== 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),FFlatetGFlatconstruisent D, G et A au lieu de D♭, F♭ et G♭. Les propriétésDFlat4et consorts sont justes ; seules les méthodes sont fausses.PitchParsercherche son motif([A-G])(#?)(10|11|[0-9])sans ancres^…$et ignore la casse : dans"Eb2", le parseur à dièses saute le E et reconnaîtb2comme B2.Note.Flat.TryParsemet son entrée en majuscules avant de remplacer♭parb, puis traite unBfinal comme un signe bémol. Ces deux lignes le cassent dans les deux sens :"B"lui-même devient B♭, et un vrai"D♭"est rejeté, parce que le remplacement laisse unbminuscule là où leEndsWith("B"), sensible à la casse, ne le reconnaît plus.PitchClass.TryParselitAetBcomme les chiffres 10 et 11, exprès : le commentaire les appelle “common hex-like aliases sometimes used in set notation”. La convention existe bel et bien ; le bug, c’est l’ordre. Les alias sont essayés avant les noms de notes, si bien que"A"est la classe de hauteurs 10 et que la note A, classe de hauteurs 9, ne peut jamais être analysée.SimpleIntervalSize.TryParselève une exception sur une entrée invalide au lieu de renvoyerfalse, contrairement au contrat deIParsable<TSelf>.TryParse, etCompoundIntervalSize.TryParsefait de même. Le tableau abrège le nom : le type s’appelleSimpleIntervalSize.
Exercices
Section intitulée « Exercices »- Quelle hauteur, quel numéro MIDI et quelle classe de hauteurs correspondent à la corde 4, case 7, en accordage standard ?
- Nomme les intervalles E–B♭ et A–C♯, avec leur taille en demi-tons et leur classe d’intervalles.
- En accordage drop D, la corde 6 est descendue à D2 (Guitar tunings). Où se trouve la classe de hauteurs D sur les cases 0 à 5 ? Construis ce manche avec les types
TuningetFretboardde GA.
Solutions
-
La corde 4 est D3 (MIDI 50) ; sept cases plus haut, c’est A3, MIDI 57, classe de hauteurs 9.
-
De E à B♭, on couvre cinq lettres (E F G A B) et 6 demi-tons, un de moins qu’une quinte juste : une quinte diminuée, classe d’intervalles 6. De A à C♯, on couvre trois lettres et 4 demi-tons : une tierce majeure, classe d’intervalles 4.
-
Cordes 6 et 4 à vide, corde 5 case 5 et corde 2 case 3. Avec GA, un accordage est une collection de hauteurs analysée (
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
À retenir
Section intitulée « À retenir »- Une hauteur est une classe de hauteurs plus une octave ; avec les numéros MIDI,
pitch class = midi % 12et le C central vaut 60. - Un nom de note est une lettre plus des altérations ; plusieurs noms partagent une même classe de hauteurs. GA garde les deux :
PitchClasspour le numéro, les recordsNotepour la graphie. - Le numéro d’un intervalle vient des lettres et sa qualité des demi-tons ; la classe d’intervalles oublie à la fois la direction et l’octave.
- Sur une guitare, une position est une corde et une case : la hauteur de la corde à vide plus un demi-ton par case. GA numérote les cordes à partir de la plus aiguë, comme les guitaristes.
- Les primitives de GA sont de petits objets valeur, des
readonly record structqui valident ou normalisent leur plage, et des records pour les unions : la même modélisation que pour de l’argent ou des identifiants.
- Mark Gotham et al., Open Music Theory, version 2, 2023 : chapitres Pitch and Pitch Class, ASPN, Intervals, Intervals in Integer Notation, Set Class and Prime Form. Le livre est publié sous licence CC BY-SA 4.0.
- MIDI tuning standard (MIDI 60 = C4, 69 = A4) et Guitar tunings (accordages standard et drop D, numérotation des cordes), Wikipédia.
- GuitarAlchemist/ga au commit
a826864:Primitives/Notes,Primitives/Intervals,Theory/Atonal/PitchClass.cs,Instruments.