..
&,
be]e[jYekb[khi
Wffb_YWj_edi[jZYb_dW_iedi
B[iYekb[khiZkbe]e
Kd^X^idjiZhaZhYXa^cV^hdchedhh^WaZh
Yjad\dineZJEB8#
'Yekb[khYehfehWj[F-+&*9
AZad\dineZZcXdjaZjgXdgedgViZ
Zhiji^a^hedjgaVeVeZiZg^Z#
F)/&9
9(&C%@&%%D(
H&-'L&.&8%
F',,9
9%C,-@&%%D%
H'')L-'8+
F-&)9
9,C.*@).D&+
H&-&L*+8,.
FFhe$CW]9
9%C&%%@%D%
H'%.L%8&&+
F9eeb=hWo'&9
9)%C(&@'%D,%
H.,L..8&%&
F-+*,9
9,&C)(@'(D+(
H*,L,)8--
F+-*)9
9*)C')@-+D-&
H+)L,)8)&
F-+)(9
9'(C(+@)(D++
H&%'L-*8,%
F+'/+9
9)*C,)@'&D+(
H&%%L+-8-.
F-+&*9
9&,C(+@),D(-
H&)*L&'%8.&
*Yekb[khiZ[hkfjkh[
F)/&9>F',,9>F-&)9>FFhe$CW]9
AZhÈeZi^ihedcihÉYjad\dineZ
eZjkZciZm^hiZgVjX]d^m!
YVchjcZYZh)XdjaZjghYZgjeijgZ#
+Yekb[khiYecfbc[djW_h[i
F-+)(9>F+'/+9>F+-*)9>F-+*,9>
F9eeb=hWo'&9>
AZad\dineZji^a^hZYZhXdjaZjgh
XdbeabZciV^gZhedjgaZhY^i^dch!
aZhV[ÒX]ZhZiaZhVccdcXZhegZhhZ#
.
MPIL(LI332)
Année 2013/2014
Projet final MPIL
..
Objectifs
1. Structures complexes
2. Parcours d’arbres et de graphes
3. Programmation orientée objet
4. Inter-opérabilité avec C
Le but de ce projet est d’étendre notre librairie de traite-
ments en informatique musicale par OCaml. Nous allons donc
continuer le travail entrepris sur les fichiers MIDI pour passer
à un niveau supérieur de modélisation. Ce projet se basera
donc sur le travail effectué lors du premier mini-projet. Vous
pouvez réutiliser votre propre implémentation des interac-
tions MIDI, ou utiliser le module mis à votre disposition sur la
page http ://repmus.ircam.fr/esling/mpil.html. Vous
disposerez ainsi des fonctions de transformations musicales
de base, mais surtout des deux fonctions essentielles à la
réalisation du projet loadMidi et saveMidi. Nous utiliserons
la même représentation des objets musicaux que celle utilisée
dans le mini-projet.
Le style musical peut être représenté et modélisé par
l’ensemble de successions de notes utilisées par un musicien.
Généralement chaque musicien utilise un ensemble précis de
motifs plus ou moins récurrents. L’idée est donc d’arriver à
capter ces motifs et leur utilisation pour être par la suite
capable de regénérer des mélodies ayant une similarité
avec le style d’un musicien particulier. Dans tout les exer-
cices (sauf le dernier exercice bonus), nous considèrerons
uniquement des mélodies à une voix. Ainsi l’objet musi-
cal prinicipal ne peut être qu’une Sequence qui contiendra
éventuellement des objets Parallel représentant des accords.
Exercice 1 : Structures arborescentes
Pour modéliser (puis plagier) le style musical d’un artiste,
nous allons utiliser des méthodes par dictionnaire utilisant des
structures arborescentes. L’idée est donc de créer des arbres
(n-aires) qui permettent de structurer les répétitions d’une
musique sous forme de liens (d’un nœud vers un autre) entre
les différents motifs musicaux. Chaque motif musical (note,
accord, mélodie) fera donc partie de notre dictionnaire. Nous
allons ici séparer les représentations des nœuds et des arbres,
et également considérer les arbres comme étant un cas parti-
culier de graphe acyclique orienté.
Q.1.1 Définir le type musicalNode sous forme d’une classe,
qui devra contenir
– Un objet musical.
– Une liste de probabilités.
– Un index entier.
– Une liste de nœuds voisins.
Q.1.2 Définir les fonctions permettant d’accéder et modi-
fier les différentes variables de la classe ainsi qu’une fonction
addProba permettant d’ajouter une valeur à la liste de proba-
bilités et une fonction changeProba permettant de modifier
une des valeurs de la liste.
Q.1.3 Définir la fonction isEq permettant de tester si deux
nœuds sont équivalents en termes d’évènements musicaux.
Nous allons représenter les structures arborescentes comme
un cas particulier de graphe.
Q.1.4 Écrire la classe graphList qui définit un graphe comme
– Une liste de nœuds
– Un nombre de nœuds
– Un index indiquant la racine du graphe
Q.1.5 Écrire la fonction addNode (permettant d’ajouter un
nœud au graphe), putEdge (permettant d’ajouter un lien
entre deux nœuds) et getEdge (vérifiant l’existence d’un lien
entre 2 nœuds).
Exercice 2 : Incremental Parsing (IP)
Dans un premier temps, nous allons utiliser une struc-
ture simpliste pour modéliser les motifs musicaux. Nous al-
lons utiliser pour ce faire un des premiers algorithmes ayant
été développé dans ce but. La première question permet de
construire l’arbre représentant le style musical et les suivantes
permettent de le parcourir pour générer des musiques simi-
laires.
Q.2.1 Écrire la fonction constructIPTree qui permet
de construire l’arbre IP à partir d’une séquence musicale.
L’algorithme de construction se fait de la manière suivante
– Construire un arbre vide contenant une racine de proba-
bilité 1.0
– Établir le nœud courant comme étant la racine
– Parcourir la séquence musicale, en effectuant pour
chaque élément elt(i)
– Si le nœud courant contient un fils égal à elt(i)
– Augmenter la probabilité du nœud courant de 1.0
– Le nœud courant devient le fils
– Sinon on crée un nouveau fils (de probabilité 1.0) au
nœud courant puis le nœud courant devient la racine
Q.2.2 Écrire la fonction chooseProbabilistic qui choisit
aléatoirement le fils d’un nœud en fonction des probabilités
de tous ses fils.
Q.2.3 Écrire la fonction chooseContinuation qui parcourt
l’intégralité des nœuds d’un arbre et trouve un nœud égal à
un élément musical donné en paramètre.
Q.2.4 Écrire la fonction computePlagiatIP qui construit
un plagiat en parcourant un arbre IP. L’idée est de par-
tir de la racine avec une séquence musicale vide, puis choi-
sir à chaque fois un fils du nœud courant avec la fonc-
tion chooseProbabilistic. Si le nœud courant n’a pas de
fils, alors on utilise la fonction chooseContinuation avec
comme paramètre l’élement musical courant. A chaque choix
de nœud, on ajoute l’élement musical courant à la séquence.
Le parcours s’arrête lorsqu’on obtient une séquence dont le
nombre de notes dépasse une longueur définie.
Q.2.5 Testez votre fonction de plagiat en générant plusieurs
plagiats que vous sauvegarderez et écouterez au format MIDI.
Exercice 3 : Probabilistic Suffix Tree (PST)
Le gros problème de l’algorithme IP est qu’il n’est capable
de modéliser que le contexte local d’une musique. Ainsi, pour
prendre en compte le contexte global, nous allons utiliser les
Probabilistic Suffix Trees (PST). Cet algorithme se base sur
une structure d’arbre représentant les suffixes d’une séquence.
1