Le protocole MIDI sert à faire
communiquer du matériel électronique pour la musique.
Il existe notamment des fichiers qui reposent sur ce protocole pour décrire
des partitions ; la cratemidly sait les exploiter✍
La dépendance à
cette crate doit être exprimée dans le fichier Cargo.toml.
[dependencies]
midly = { version = "0.5", default-features = false, features = ["std"] }
.
Étudiez alors la documentation de cette crate afin de réaliser un
programme qui, à partir du fichier Isnt_she_lovely.mid,
extrait toutes les notes jouées par les différents canaux
(channels).
Vous réaliserez alors, dans le module note, une fonction
load_midi() dont le rôle est de retranscrire le contenu
d'un fichier MIDI en une partition Score.
Une utilisation minimale de cette fonction serait :
let my_score = load_midi("Isnt_she_lovely.mid")?;
Remarquez que l'analyse d'un tel fichier peut échouer ; la fonction doit
envisager cet échec dans son type de retour.
Arrivé à ce stade, vous devez être suffisamment expérimenté pour exploiter
la documentation de la
cratemidly.
Voici toutefois quelques informations éparses qui peuvent vous guider.
chaque canal c (de 0 à 16) correspond à un instrument jouant sa
partie,
la note k doit être interprétée en considérant que la valeur
60 correspond à la note de nom C dans l'octave 3
(chaque unité est un demi-ton : ...58→A#2, 59→B2,
60→C3, 61→C#3, 62→D3...),
la vélocité v varie entre 0 et 127 et peut être
interprétée comme une intensité sonore entre 0.0 et 1.0.
Il est nécessaire, pour chacun des seize canaux✍
Le protocole MIDI supporte au plus seize canaux.
, de mémoriser les notes dont l'événement NoteOn indique le
début jusqu'à rencontrer l'événement NoteOff qui lui correspond
afin d'en indiquer la durée.
Dans le cas particulier de cet exemple, nous remanierons la partition
obtenue pour en faire correspondre les canaux à ces instruments :
“0” → “piano” avec le gain 0.1
“1” → “bass” avec le gain 0.75
“2” → “organ” avec le gain 0.1
“3” → “flute” avec le gain 0.25
“5” → “cello” avec le gain 0.25
“6” → “clarinet” avec le gain 0.2
“8” → “bass” avec le gain 0.5
“9” → “drum” avec le gain 0.25
“10” → “organ” avec le gain 0.25
tous les autres canaux sont ignorés.
Dans ces conditions, vous devriez être en mesure de reconstituer une
partition et la
sérialiser✍
Au delà de la désérialisation, les types ScorePart, Note et
Key doivent également supporter la sérialisation.
dans un fichier
au format json✍
Le fichier Isnt_she_lovely.json qui vous a été fourni
comme exemple a d'ailleurs été produit de cette façon.
grâce à une fonction save_score() du module note.
Ce que vous avez réalisé à cette étape
vous permettra de jouer le contenu du fichier ainsi généré.