Travail Pratique 3 (TP3)
Le thème de ce TP est la musique.
Vous pourrez choisir entre trois projets possibles.
Quelque soit votre choix,
vous aurez à réaliser un certain nombre de modifications ou de fonctionalités,
valant un certain nombre de points, selon la taille de votre équipe.
Équipe de 1 personne: vos modifications ou fonctionalités doivent totaliser 4 points
Équipe de 2 personnes: 6 points
Équipe de 3 personnes: 8 points
Équipe de 4 personnes: 10 points
Votre projet sera évalué lors d'une démonstration devant le chargé de laboratoire.
Votre code source ne sera pas évalué, mais sera à remettre aussi.
Vous aurez aussi à présenter votre projet en cours,
lors d'une présentation d'un maximum de 4*N minutes, N étant le nombre de membres dans votre équipe.
Pendant votre présentation, votre projet ne sera peut-être pas encore fini, alors vous pourrez simplement
parler de ce que vous avez fait à date et ce que vous planifiez faire.
Projet 1: visualiser les relations d'influences entre des musiciens
Vous devez visualiser le réseau de liens entre les musiciens du jeu de données suivant:
http://www.michaelmcguffin.com/tmp/allmusic-data/allmusic-data-csvTables.zip
(identifiant: poutine , mot de passe: chaude )
Le jeu de données est sous forme de tableaux CSV (comma-separated values).
Vous pourrez utiliser la librarie de votre choix pour lire les données,
par exemple,
http://opencsv.sourceforge.net/
Pour visualiser le réseau, on vous conseille d'utiliser
le logiciel suivant comme point de départ:
http://profs.etsmtl.ca/mmcguffin/code/#SimpleNetworkVisualizer
Si vous voulez, vous pourrez écrire votre propre logiciel
de visualisation de réseau, dans le langage de programmation de votre choix,
pour visualiser le jeu de données. Mais il faut demander notre approbation avant.
Dans le jeu de données, il y a plus de 600 artistes,
193 "styles" (ou "marchés"),
13 styles principaux ou genres ("major markets"),
et plus de 3000 liens d'influence entre les artistes.
Le jeu de données contient aussi beaucoup d'informations supplémentaires
qui vous serviront pas pour bâtir le réseau de base,
telles les années pendant lesquelles chaque artiste était actif, etc.
Notez aussi que le jeu de données contient des erreurs
et des parties manquantes
(par exemple, des liens vers des artistes qui ne sont pas définis), alors
votre code va devoir être assez robuste pour seulement tirer les informations
cohérentes et bien sauter les données qui ne sont pas complètes.
Finalement, le jeu de données est CONFIDENTIEL et ne dois pas être distribué
en dehors des élèves du cours.
Modifications et fonctionnalités à réaliser:
- [2 points] Lire le jeu de données et afficher un réseau de quelques centaines de noeuds,
où chaque noeud est un artiste et chaque arête est un lien d'influence.
Chaque noeud devrait avoir une étiquette montrant le nom de l'artiste.
Le réseau devrait pouvoir se disposer selon une simulation de forces.
- [1 point] Rajouter une option pour disposer les noeuds sur un layout circulaire.
[Variante valant 2 points] Permettre de sélectionner n'importe quel sous-ensemble de noeuds
et de les disposer sur un cercle et les fixer en place, pendant que les autres noeuds peuvent être
disposés selon les forces.
L'utilisateur devra alors pouvoir créer plusieurs layouts circulaires
de différents noeuds en même temps.
Dans chaque layout circulaire, les noeuds seront fixés en place.
Les noeuds qui ne font pas partie d'un layout circulaire ne seront pas fixés en place
et pourront alors continuer à être dêplacées selon la simulation
de forces.
- [1 point] Rajouter une option pour disposer et dessiner les noeuds selon un diagramme en arcs.
Les noeuds devraient alors être placés sur une ligne droite,
et les arêtes dessinés comme des arcs de cercles.
Conseil: il serait pratique si la ligne sur laquelle les noeuds sont placés soit une ligne
verticale, et les arcs dessinés du côté gauche des noeuds,
permettant alors aux étiquettes des noeuds d'étre placées à la droite
de chaque noeud.
- [1 points] Rajouter un layout en cercles concentriques,
avec un noeud au centre, ses voisins dans le premier cercle,
leurs voisins dans le prochain cercle, etc.
Indice: utilisez Network.performConcentricCircleLayout()
- [1 point] Rajouter une option pour afficher la matrice d'adjacence du réseau.
(Ça fait une grande matrice, n'est-ce pas?)
Quand le curseur passe par dessus la matrice, la colonne et la rangée en dessous du curseur
devraient être mises en surbrilliance, pour faciliter la lecture de la matrice.
- [1 point] Programmer un algorithme d'ordonnancement en utilisant l'heuristique barycentrique,
et utilisez cette ordonnancement avec votre layout circulaire / diagramme en arcs / matrice d'adjacence.
- [1 point] Essayer deux manières de montrer les genres ("major markets") des artistes.
Choisissez 13 couleurs distinctes, une pour chaque genre.
Ensuite, essayer (1) de dessiner le réseau en colorant chaque noeud avec la couleur
de son genre
(certains artistes appartiennent peut-être à plusieurs genres,
donc vous pourriez choisir le genre "dominant" pour chacun de ces artistes là).
Aussi, essayer (2) de dessiner des enveloppes convexes autour des sous-ensembles de noeuds
de chaque genre -- cela fera 13 enveloppes, chacun dessiné en semi-transparent avec
sa couleur correspondente.
(Indice: Point2DUtil.computeExpandedPolygon( Point2DUtil.computeConvexHull( ... ) ) )
Pendant votre présentation orale, vous pourrez discuter de quelle méthode fonctionne
mieux pour montrer les genres.
- [1 point] Rajouter une option pour afficher un histogramme montrant des informations supplémentaires
quelconques du jeu de données; par exemple, pour montrer
le nombre d'albums de chaque genre qui ont sortis à chaque année.
- [2 points] Offrez une option pour simplifier le réseau de la manière suivante.
Si l'artiste A a influencé l'artiste B (A -> B),
et B a influencé C (B -> C),
alors on pourrait dire que A a influencé C de manière indirecte, en passant par B.
Donc, si le jeu de données contient un lien explicite A -> C,
on pourrait dire que ce lien est redondant, et le supprimer.
Supprimez donc tous les liens X -> Y s'il existe au autre chemin X -> A -> Y ou encore s'il existe un chemin X -> A -> B -> ... -> Y.
Comment faire?
Peut être en faisant les étapes suivantes:
Pour chaque noeud N, on fait une liste de ses voisins A, B, C, ... tels qu'il existe des liens
N->A, N->B, N->C, ...
Ensuite, on fait un parcours en largeur qui commence à N et qui traverse tout le réseau.
Pendant le parcours, si on rencontre un noeud X qui est dans l'ensemble {A,B,C,...},
cela veut dire qu'il existe un chemin N->...->X, et on peut donc supprimer le lien N->X.
- Vous pouvez aussi proposer d'autres changements pour approbation par le chargé de labo.
Projet 2: modifier un logiciel interactif permettant de jouer de la musique
Modifiez ou créer un logiciel permettant d'écrire des notes de musique et de les jouer.
On vous propose
SimplePianoRoll.zip
comme point de départ,
mais vous pouvez aussi créer votre propre logiciel,
dans le langage de programmation de votre choix,
mais il faut demander notre approbation avant.
Quelques remarques concernant SimplePianoRoll:
- Le bouton gauche de souris, seul ou avec les touches Ctrl ou Shift,
permet de lancer différentes opérations ou d'ouvrir
un menu radial ou un Control Menu.
- La case à cocher "Loop when playing" n'a actuellement aucun effet:
lorsqu'on appuie "Play", la musique boucle quelque soit l'état de la
case à cocher "Loop when playing".
Aussi, dans le ControlMenu,
les options "Tempo", "Total Duration", et "Transpose" n'ont
actuellement aucun effet.
Aussi, dans le menu "View",
la case à cocher "Auto Frame" n'a aucun effet.
Vous pouvez enlever ces éléments d'interface
si vous voulez, mais ces éléments d'interface
pourraient aussi vous aider à compléter certains changements.
Modifications et fonctionnalités à réaliser:
- [0.5 point] Permettez à l'utilisateur de changer la durée totale de la portée de notes
en glissant dans le ControlMenu.
[Variante valant 1 point] Si la case à cocher "Auto Frame" est cochée,
pendant que l'utilisateur glisse pour changer la durée totale,
faites un zoom automatique en même temps pour que l'utilisateur voit la portée qui
se rallonge ou se raccourcit.
(Indice: gw.frame( score.getBoundingRectangle(),...) )
- [1 point] Permettez à l'utilisateur de sélectionner des notes sur la portée,
et de les déplacer en hauteur ou en temps avec un glissement de souris.
[Variante valant 2 points] Permettez aussi à l'utilisateur de faire une copie d'une selection
de notes et de coller cotte copie ailleurs en temps.
- [1 point] Permettez à l'utilisateur de modifier le tempo (nombre de "temps" par seconde,
ou autrement dit le nombre de millisecondes entre les "temps").
Vous pouvez réaliser ce changement en permettant à l'utilisateur de glisser
sur "tempo" dans le ControlMenu.
Vous devez aussi afficher le tempo (en temps/seconde, ou bien en millisecondes) actuel dans
un champ de texte à quelque part.
[Variante valant 2 points] Pendant que l'utilisateur glisse dans le ControlMenu pour régler
le tempo, jouez en temps réel des battements (comme un Métronome) permettant à l'utilisateur d'entendre le tempo avant qu'il ne relâche le bouton de souris.
- [1 point] Actuellement, dans SimplePianoRoll, l'utilisateur peut dessiner des notes sur toutes les hauteurs
d'une gamme chromatique (autrement dit, toutes les hauteurs de notes sont permises).
Si on dessine un ensemble de notes arbitraires, en on appuie "Play", le résultat
est souvent désagréable.
On peut limiter l'ensemble de notes disponibles à l'utilisateur pour augmenter
les chances que le résultat sonore soit agréable.
Par exemple, si on limite les notes accessibles aux notes d'une gamme majeure
(exemple: la gamme majeure de do, qui correspond aux touches blances d'un piano:
C, D, E, F, G, A, B)
et on dessine des notes au hasard, le résultat sonne mieux.
Autre exemple: si on se limite à une gamme pentatonique
(comme C, D, E, G, A, ou encore les touches noires C#, D#, F#, G#, A#)
cela donne un résultat toujours agréable et plutôt oriental.
Autre exemple: des gammes
comme C, D, E, F#, G, A, B, ou encore C, D, E, F, G, A, A#,
donnent aussi des résultats agréables.
Pour aider l'utilisateur à composer des phrases musicales agréables,
rajouter une option qui limite les notes accessibles aux notes d'une gamme quelconque
(comme une gamme majeure, mineur, pentatonique, ou autre).
Pendant votre présentation orale, discutez de quelles gammes vous avez essayées
et lesquelles semblaient fonctionner mieux.
[Variante valant 2 points] Rajouter une option pour générez de la musique
alléatoire sur une gamme quelconque.
Pendant votre présentation orale, discutez de quelles gammes vous avez essayées,
et des algorithmes de choix de notes que vous avez essayés
(exemple: choix hasard indépendent pour chaque note? Choix dépendent de la note
précédente?),
et lesquels semblaient fonctionner mieux.
- [1 point] Modifiez le logiciel pour permettre des notes de différentes durées.
- [1 point] Remplacer le ControlMenu et le menu radial avec une interface alternative pour accéder
aux fonctionnalités.
Pendant votre présentation orale, discutez des avantages et des inconvénients que
vous avez trouvés avec le ControlMenu + menu radial versus votre nouvelle interface.
- [1 point] Rajoutez une option pour sauvegarder et lire une pièce d'un fichier.
Inventez votre propre format de fichier pour le faire.
[Variante valant 2 points] Utilisez le format MIDI pour sauvegarder et lire vos fichiers.
Quelques liens qui pourraient vous servir:
http://www.classicalarchives.com: source de fichiers MIDI gratuits de pièces de musique classique
http://opera.media.mit.edu/rogus/home.html: Rogus McJava, librarie permettant de lire des fichiers MIDI, mais pour laquelle le code source ne semble plus disponible :(
http://www.jsresources.org/examples/midi_files.html
http://docs.oracle.com/javase/1.4.2/docs/api/javax/sound/midi/spi/MidiFileReader.html
http://www.automatic-pilot.com/midifile.html
- [1 point] Rajoutez un effet visuel artistique ou abstrait
pour visualiser ou représenter l'historique des notes.
Par exemple, quand la pièce joue,
dessinez des tracées de couleurs pour chaque note,
qui disparaissent graduellement.
Voir la liste de visualisations de musique plus bas dans cet énoncé pour des exemples.
- [0.5 points] Passez 20 minutes à essayer de transcrire une pièce de musique que vous
aimez, et notez tous les problèmes que vous rencontrez avec l'interface.
Pendant votre présentation orale, discutez des changements qui vous semblent importants
pour rendre l'interface plus utilisable, et que vous ferez si vous aviez plus de temps.
- Vous pouvez aussi proposer d'autres changements pour approbation par le chargé de labo.
Projet 3: créer une interface multitactile avec un ou plusieurs instruments de musique
Créer un logiciel multitactile permettant de jouer de la musique.
Vous pouvez réutilisez le cadriciel Java multitactile que vous avez déjà
utilisé dans le cours.
Communiquez avec le chargé de laboratoire pour réserver des sessions au laboratoire
avec les écrans multitactiles.
Fonctionnalités à réaliser:
- [2 points] Un clavier de piano d'au moins deux octaves, avec touches noires et blanches,
permettant de jouer plusieurs notes en même temps.
- [1 point] Permettez à l'utilisateur de redimensionner le piano avec leurs doigts.
Le redimensionnement devra permettre de soit avoir des touches plus larges ou plus étroites,
ou bien de modifier le nombre de touches tout en gardant leur largeur fixe.
- [1 point] Permettez à l'utilisateur d'effectuer des rotations du piano en utilisant leurs
doigts, par exemple, pour le mettre à un angle de 23 degrés par rapport au cadre
de l'écran.
- [1 point] Réaliser un tambour, "beatbox", ou autre instrument de percussion.
Référence utile:
http://computermusicresource.com/GM.Percussion.KeyMap.html
[Variante valant 2 points] Permettez à l'utilisateur d'enregistrer des rhythmes
et de les jouer en boucle.
Voir les exemples plus bas dans cet énoncé pour des exemples.
- [1 point] Réalisez ou inventez un autre instrument de musique, différent d'un clavier
de piano ou d'un tambour. Par exemple, inspirez vous d'un instrument réel comme
la trompette ou la flute (chaque note est jouée avec une combinaison différente
de doigts),
ou bien inventez un instrument non-traditionnel (exemple: le doigt peint sur une surface 2D,
où la position en x détermine la hauteur de la note,
et la position en y détermine le "channel" MIDI).
Voir la liste d'instruments de musique plus bas dans cet énoncé pour des exemples.
- [1 point] Permettez à plus qu'on instrument d'être instancié à la fois,
et de permettre à deux ou plus d'utilisateurs de les jouer en même temps sur un seul
écran.
- [1 point] Rajoutez un effet visuel artistique ou abstraite
pour représenter l'historique des notes.
Par exemple, des tracées de couleurs qui sont affichées avec chaque note,
et qui disparaissent graduellement.
Voir la liste de visualisations de musique plus bas dans cet énoncé pour des exemples.
- Vous pouvez aussi proposer d'autres fonctionnalités pour approbation par le chargé de labo.
Informations utiles pour les projets 2 et 3
On vous conseille de générer les notes de musique en utilisant
javax.sound.midi.Synthesizer. Comme exemple simple, téléchargez
le fichier SynthesizerTest.java et compilez et exécutez
le pour voir comment faire jouer des notes.
Lorsqu'on utilise javax.sound.midi.Synthesizer pour jouer des notes,
on identifie les notes par un "MIDI note number", qui varie de 0 à 127.
Le tableau ci-dessous fait la correspondence entre ce "MIDI note number" et les noms habituels des notes.
MIDI_note_number Nom anglais Nom francais Remarques
---------------- ----------- ------------ --------------------------
21 A0 la touche la plus basse sur un piano de 88 touches
. . . .
. . . .
. . . .
57 A3 la frequence de 220 Hertz
58 A3# = B3b la diese = si bemol
59 B3 si
60 C4 do "middle C"; debut de l'octave 4
61 C4# = D4b do diese = re bemol
62 D4 re
63 D4# = E4b re diese = mi bemol
64 E4 mi
65 F4 fa
66 F4# = G4b fa diese = sol bemol
67 G4 sol
68 G4# = A4b sol diese = la bemol
69 A4 la "concert A"; frequence de 440 Hertz
70 A4# = B4b la diese = si bemol
71 B4 si
72 C5 do "concert C" = do concert; debut de l'octave 5
73 C5# = D5b do diese = re bemol
. . . .
. . . .
. . . .
108 C8 do touche la plus haute sur un piano de 88 touches
(pris de http://www.josef-k.net/mim/ThePianoKeyboard.gif)
(pris de http://www.vibrationdata.com/Resources/piano_keys.jpg)
Exemples de visualisations et d'instruments qui pourraient vous servir d'inspiration pour les projets 2 et 3
Visualisations de musique:
http://www.visualcomplexity.com/vc/blog/?p=811
http://www.youtube.com/watch?v=_PhathoNcXM
http://infosthetics.com/archives/2010/03/generative_music_visualization_composition.html
http://www.youtube.com/watch?v=71hNl_skTZQ
Instruments pour rhythmes en boucles:
http://www.youtube.com/watch?v=Jug3iYAuJes
http://www.youtube.com/watch?v=_SGwDhKTrwU
Instruments de musique:
http://www.youtube.com/watch?v=-swFqAT8yaA
http://www.youtube.com/watch?v=qQmSwuj7DZw
http://www.youtube.com/watch?v=0h-RhyopUmc
http://innovis.cpsc.ucalgary.ca/Research/SurfaceMusic
http://www.youtube.com/watch?v=4ciKgH5z1Dc
http://www.youtube.com/watch?v=aeQOuNBuJwg
Autres:
http://highc.org/