Loading s4prg_rust_05_note...

enib_small.png S4-PRG_Rust 05_Note — Les notes de musique

De manière simplifiée, nous pouvons considérer qu'il existe douze noms pour les notes de musique :
Un type énuméré Key représentant chaque nom de note possible convient parfaitement.
Il doit être public et n'a pas besoin de fournir d'implémentation particulière ; il ne sert qu'à distinguer tous les noms possibles.
Ce type devra figurer dans un nouveau module note dédié aux notes de musique.

Seulement, en observant un instrument de musique, nous constatons qu'il existe plusieurs séquences (les octaves) correspondant à ces mêmes noms décrits par Key.
De plus, de manière générale, une note de musique peut être jouée plus ou moins fortement, à un moment précis et pendant une certaine durée.
Une note de musique peut donc être complètement décrite par un type structuré Note, dans le module note, contenant les membres :
À titre d'illustration, le fichier Child_In_Time.json contient, entre autres, des séquences de notes de musique qui correspondent à une telle description.
Le type Note doit être public et chacun de ses membres aussi puisqu'il n'existe aucun invariant qui les lie.
Cependant, l'ajout d'une implémentation pour ce type donnera du confort :

Le calcul de la fréquence d'une note de musique détermine à quel point cette note sera perçue comme grave (basse fréquence) ou aiguë (haute fréquence).
La fréquence de référence correspond à 440.0 Hertz pour la note A4 (la note de nom A dans la quatrième octave).
L'évolution des fréquences dans la perception de la hauteur d'un son n'est pas linéaire mais logarithmique, c'est à dire que passer d'une note à une autre se fait en multipliant la fréquence par un facteur et non en ajoutant un incrément.
Par exemple, la note A5 correspond à la fréquence 880.0 Hertz (le double de celle de A4) et la note A3 correspond à la fréquence 220.0 Hertz (la moitié de celle de A4).
Puisqu'il y a douze noms de notes différents dans une octave, on passe de la fréquence de l'un à celle du suivant (un demi-ton) en la multipliant par la racine douzième de deux.
Les noms de note ne sont pas directement des valeurs numériques, mais la conversion explicite d'une Key en i32 est possible : si les noms de note on été correctement ordonnés dans le type énuméré, alors nous obtenons 0 pour C, 5 pour F, 9 pour A...
Toutes ces indications suffisent désormais au calcul de la fréquence (donné ici de manière symbolique, à adapter).
const A4_FREQUENCY: f32 = 440.0;
const SEMITONE: f64 = 1.059_463_094_359_295_3; // 2^(1/12)
let k_offset = key as i32 - 9; // relative to A (key number 9)
let o_offset = 12 * (octave - 4); // relative to octave 4
let frequency = A4_FREQUENCY * SEMITONE.powi(k_offset + o_offset) as f32;

Documentez les types Key et Note ainsi que les fonctions associées.
Inspirez vous des fréquences indiquées sur cette page pour tester votre calcul de fréquence.
C'est l'occasion de compléter la documentation de la fonction frequency() avec un exemple qui servira de test unitaire pour vérifier la fréquence de quelques notes.