%!TEX encoding = UTF-8 Unicode
\documentclass[11pt,a4paper,titlepage]{report}
\usepackage[francais]{babel}
\usepackage[utf8]{inputenc}
\usepackage{amsmath}
\usepackage{amsfonts}
\usepackage{amssymb}
\usepackage[usenames,dvipsnames]{pstricks}
\usepackage{epsfig}
\usepackage{pst-grad} % For gradients
\usepackage{pst-plot} % For axes
\usepackage{pstricks}
\usepackage{enumitem}
\usepackage{listings}

\author{Guillaume \textsc{Abramovici}\\
		Guy \textsc{Godfroy}\\
		Mickaël \textsc{Illy}\\
		Quentin \textsc{Martin}\\
		\\
		\textit{Encadrant :} Elizabeth \textsc{Brunet}}
\title{Projet \textsc{PonyTracker}\\
		Rapport\\
		\vspace{1cm}
		\includegraphics[scale=0.5]{icon/vinyl.pdf}}
%LOL j'adore les poneys
\addto\captionsfrench{\renewcommand{\chaptername}{Section}}

\begin{document}
\begin{titlepage}

\end{titlepage}
\maketitle

\tableofcontents

\chapter*{Introduction}

\addcontentsline{toc}{chapter}{Introduction}

La musique est un art ayant traversé les époques, évoluant au même rythme et à la même vitesse que les progrès culturels, sociaux, scientifiques et technologiques de l'Être Humain. Celui-ci a toujours su s'adapter à ces évolutions dans le but de faire progresser, d'améliorer, d'enrichir ses productions musicales. Parallèlement, l'informatique a connu ces dernières années une évolution sans précédent, devenant indispensable dans la vie de tous les jours.\\

Il n'en fallait alors pas plus pour deviner que le futur de la musique passerait peut-être par l'emploi de cet outil informatique. Traitement du son, des informations, des instruments, physiques ou virtuels,... aujourd'hui les ordinateurs nous offrent la possibilité d'aller plus loin dans tous les domaines artistiques et culturels, notamment dans la dscipline musicale, et de créer des œuvres qui n'auraient seulement pu être envisagées quand l'informatique n'en était qu'à ses débuts.\\

Il existe alors aujourd'hui un besoin de créer des applications permettant cette création musicale. En particulier, le genre de la musique électronique se prête particulièrement bien à cette idée. L'artiste voulant notamment produire ce genre de musique a désormais besoin d'un outil lui permettant de manier les sons, de les enregistrer, d'utiliser des instruments qu'il peut créer et d'appliquer les effets qu'il souhaite, sans pour autant posséder le matériel physique (les instruments), ou bien même les compétences nécessaires pour y jouer. Il s'agit donc de simuler les instruments et les effets.

L'avenir de la musique pourrait bien passer par l'infinité de possibilités que nous offre désormais l'informatique...

\chapter{Cahier des charges}

\section{Objectifs}

Notre objectif est de développer un séquenceur de musique, qui s'inscrit dans la discipline de la MAO (Musique Assistée par Ordinateur). Nous souhaitons répondre au besoin de musique électronique permettant d'écrire des fichiers de musique séquentielle, appelés \textit{modules}, et munir le programme d'une interface graphique simple et intuitive, afin de toucher le plus de passionnés de musique possible. Afin de répondre au besoin, l'utilisateur devra avoir la possibilité de :
\begin{itemize}
\item créer ou importer des sons de bases, nommés \textit{samples}, dont l'unique importance en définitive réside en la forme d'onde sonore;
\item configurer des \textit{instruments} virtuels basés sur ces samples.
\item entrer des mélodies joués simultanément par ces instruments via une matrice, dans des phrases musicales appelés des \textit{motifs}.
\item placer des effets isolément sur chaque note;
\item définir l'agencement temporel des motifs.
\end{itemize}

Notre but est de créer un programme s'inspirant de ceux déjà existants (par exemple \textsc{MilkyTracker}) en améliorant l'interface et en les simplifiant afin de les rendre plus accessibles, notamment pour les utilisateurs débutants. Par ailleurs, plutôt que de reprendre d'anciens standards de fichiers, qui datent maintenant de plus d'une vingtaine d'années et qui sont devenus flous pour cause de nombreux rajout successifs, il a été convennu que nous créerions un nouveau format de fichier, qui permettra d'implémenter plus simplement les caractéristiques d'un module.

\section{Contraintes}

Le principal objectif du Projet Informatique est de développer la compétence des étudiants en génie logiciel et en gestion de projet en équipe. Ce projet est réalisé par un groupe de quatre étudiants et est encadré par un enseignant. Nous devrons fréquemment organiser des réunions de suivi avec l'enseignement, afin de présenter l'avancement du projet.\\

Le temps consacré par chaque étudiant au projet est d'environ 50h. Afin de respecter les échéances imposées par le cadre pédagogique, nous avons établi après analyse de l'ensembles des tâches à réaliser un plan de charge prévisionnel, un planning prévisionnel et un suivi d'activité.\\

Le langage utilisé pour le développement du projet sera le langage C. L'interface graphique sera réalisée avec l'environnement graphique GTK (notamment via l'utilisation de l'outil de création d'interface Glade). Afin de partager les informations entre les membres du groupe, nous utiliserons Git. La documentation concernant toutes les fonctions et tous les modules codés sera réalisée à l'aide de l'assistant de documentation Doxygen. Nous remplirons également un Wiki tout le long de notre projet.\\

Le projet achevé, il sera présenté lors d'une soutenance devant un Jury. La soutenance se décomposera en trois phases : une présentation vidéo-projetée, une démonstration du fonctionnement du logiciel développé et la réponse aux questions du jury. Elle aura lieu le 27 ou le 28 mai 2014.\\

Le projet se décomposera également en plusieurs livrables à rendre :\\
\begin{itemize}
\item Livrable 1 : Pré-rapport. Exposition du projet, cahier des charges, spécification fonctionnelle, plan de charge et planning prévisionnels... \textit{À rendre avant le 12 mars 2014}
\item Livrable 2 : Premier prototype du logiciel. \textit{À rendre avant le 10 avril 2014}
\item Livrable 3 : Logiciel et rapport. \textit{À rendre avant le 21 mai 2014}
\item Livrable 4 : Présentation vidéo-projetable de la soutenance. \textit{À rendre avant le 29 mai 2014}
\end{itemize}

\section{Fonctionnalités}

Nous avons dressé une liste des fonctions du programme qui se veut la plus exhaustive possible. Nous avons indicé chaque fonction selon leur priorité d'implémentation : $\ast\ast$ pour les fonctions à implémenter pour la première version à rendre pour le livrable 2, et $\ast$ pour celles à implémenter pour le produit final. Les autres sont les fonctions moins importantes, voire sujettes à débat, et il est prévu de les implémenter uniquement nous en avons la possibilité technique et temporelle.\\

Voici dons la liste des fonctionnalités :

\subsection{Gestion des samples}

\begin{itemize}
\item Import de samples $\ast\ast$
\item Visualisation graphique des samples en vue d'affinage du son $\ast$
\item Réglages des paramètres de lecture en boucle des samples $\ast\ast$
\end{itemize}

\subsection{Gestion des instruments}

\begin{itemize}
\item Choix d'un sample pour chaque instrument $\ast\ast$
\item Accord du sample en fonction d'une note de préférence $\ast$
\item Édition du volume d'attaque, de maintien et de chute via une enveloppe sonore $\ast$
\item Positionnement stéréo
\end{itemize}

\subsection{Matrice d'édition des motifs}

\begin{itemize}
\item Entrée/visualisation de la mélodie par clavier physique $\ast\ast$ ou clavier graphique cliquable $\ast$
\item Présentation de la matrice selon le temps et les instruments $\ast\ast$
\item Choix du nom des notes façon anglo-saxonne ou latine (via fenêtre des préférences)
\item Lecture de plusieurs instruments simultanément $\ast$
\item Choix du tempo $\ast\ast$, de la base de temps $\ast\ast$ et du nombre de \textit{ticks}\footnote{Voir définition dans le lexique en annexe} $\ast$
\item Gestion des motifs (choix de l'agencement dans le temps, du tempo et de la base de temps) $\ast$
\end{itemize}

\subsection{Effets}

\begin{itemize}
\item Implémentation de plusieurs effets :
	\begin{itemize}[label=$\bullet$]
	\item arpège $\ast\ast$
	\item portamento (montant, descendant, intelligent) $\ast$
	\item vibrato $\ast$
	\item tremolo $\ast$
	\item coupure $\ast$
	\item délai $\ast$
	\end{itemize}
\item Choix des effets via un menu déroulant en face de chaque note $\ast$
\item Modification dynamique du volume et de la stéréo $\ast$
\end{itemize}

\subsection{Fonctionnalités basiques}

\begin{itemize}
\item Créer nouveau document $\ast$
\item Ouvrir document $\ast$
\item Sauvegarder document $\ast$
\item Undo/redo $\ast$
\item Maximiser/minimiser/fermer fenêtre $\ast$
\item Export de la musique en fichier son (wav ou mp3) $\ast$
\end{itemize}

\chapter{Développement}

\section{Spécification fonctionnelle}

L'utilisateur se confrontera à une fenêtre principale, qui permettra l'accès à la plupart des fonctions via des boutons ou via une liste de menus en haut de la fenêtre.\\

En haut à gauche, la première rangée de boutons permet d'enregistrer un fichier, d'ouvrir un fichier, d'annuler et de rétablir la dernière action. La deuxième rangée de boutons donne accès au contrôles de lecture du module ouvert ainsi que la matrice d'édition des motifs, c'est à dire passer au motif précédent, mettre en lecture, stopper la lecture et passer au motif suivant.\\

En haut au centre, dans le cadre noir, on aura accès au statistiques générales de lecture, avec affichage des numéros en écriture hexadécimale du motif, du temps et du \textit{tick} en cours de lecture, de la durée depuis le début du module, et d'un VU-mètre par canal stéréo.\\

À droite, on trouve les boutons pour ouvrir les trois fenêtres de contrôles spécifiques des samples, des instruments et des motifs, un autre bouton en deux partie définissant le mode d'édition de la matrice (entrer des notes ou des effets), et enfin des champs éditables pour le tempo (BPM) et de nombre de \textit{ticks} par temps. On peut aussi choisir l'instrument d'édition via un menu déroulant.\\

Enfin, dans toute la partie basse de la fenêtre, on trouve la matrice d'édition du motif en cours, l'axe des temps étant vertical et descendant, et le tout organisé en plusieurs canaux de lecture afin de pouvoir jouer plusieurs instruments en même temps. Le plus souvent, on réserve un canal par instrument, mais cette distinction est facultative.\\

\begin{figure}[!h]
\includegraphics[width=\textwidth]{interface/mainwindow.eps}
\caption{Fenêtre principale}
\end{figure}

La fenêtres d'édition des samples permettra l'importation/édition des samples. Le premier bouton en haut à droite permet d'ajouter un sample à la liste juste en bas, et ouvre en même temps une fenêtre de navigation dans le système de fichiers de l'utilisateur. Le deuxième bouton supprime un élément. Les deux autre boutons démarrent et arrêtent la prévisualisation du sample. Le menu déroulant permet de choisir plusieurs modes de lecture du sample :
\begin{itemize}
\item \textit{Pas de boucle} : le sample sera lu une seule fois, sans tenir compte des poignées de sélection définies par l'utilisateur, visibles sur le visualiser de forme d'onde en bas.
\item \textit{En boucle} : le sample sera lu en continu et en boucle entre les deux poignées de sélections.
\item \textit{En rafale} : similaire à la lecture en boucle, sauf que le sample sera lu à partir du début, puis en boucle entre les deux poignées.
\item \textit{En aller-retour} : le sample sera lu en boucle entre les deux poignées alternativement à l'endroit et à l'envers.
\end{itemize}

En haut à droite, des boutons radio permettent trois mode d'ajustement de la hauteur de la note :
\begin{itemize}
\item Si le sample a une hauteur qui correspond exactement à une note de la gamme tempérée, on peut alors directement préciser cette note.
\item Si la note n'est pas juste, on peut être plus précis en indiquant plutôt la fréquence de la note.
\item Enfin, si on est sûr d'avoir sélectionné uniquement une période du sample, on peut demander au programme de calculer automatiquement la hauteur de la note, en calculant la durée de la période entre les deux poignées.
\end{itemize}

\begin{figure}[!h]
\begin{center}
\includegraphics{interface/samplewindow.eps}
\end{center}
\caption{Fenêtre d'édition des samples}
\end{figure}

La fenêtre d'édition des instruments permettra la création/édition des instruments par l'utilisateur. Elle présentera la liste des instruments couplée aux sample correspondants (dont le choix peut bien sûr être modifié) en vis-à-vis d'un cadre d'édition ou il sera possible d'éditer l'enveloppe sonore (activée ou non), d'ajouter une réverbération et de modifier les réglages propres à l'instrument, c'est à dire le volume et la balance de base.\\

\begin{figure}[!h]
\begin{center}
\includegraphics{interface/instrumentwindow.eps}
\end{center}
\caption{Fenêtre des instruments}
\end{figure}

La fenêtre des motifs présentera une liste de mise en correspondance entre le motif joué à un moment donné du module et le motif effectif, permettant ainsi de créer facilement des répétitions. On pourra choisir le nombre de temps par motif, et choisir si on veut que le module revienne au début après avoir lu tous les motifs.

\begin{figure}[!h]
\begin{center}
\includegraphics{interface/patternwindow.eps}
\end{center}
\caption{Fenêtre des instruments}
\end{figure}

On implémentera éventuellement une fenêtre de préférences, permettant notamment de régler la convention de nommage des notes façon latine/anglo-saxonne. Nous attendons d'avoir plus de besoins de configuration avant d'envisager créer cette fenêtre.

\section{Conception préliminaire}

Nous avons organisé le développement de ce programme en plusieurs pôles.
Çi-après un schéma de cette organisation.

\begin{figure}[!h]
\includegraphics[width=\textwidth]{Schema_tracker.eps}
\caption{Plan d'organisation des pôles de développements}
\end{figure}

Par ailleurs, nous nous servirons de la librairie PortAudio, qui est une librairie écrite en C, et qui permet la manipulation, l'entrée et la sortie du son.

\chapter{Tests unitaires}

On va définir des tests unitaires pour chaque pôle de développement.

\section{Import de samples}

On crée un petit algorithme de vérification qui va se charger de lancer la procédure d'import de sample pour un sample donné, et qui va ensuite vérifier octet par octet si le fichier de sauvegarde contient à l'endroit donné le même sample.

\section{Instruments}

De même, après avoir créé un instrument, on vérifie que le fichier contient bien la structure attendue représentant l'instrument. On peut jouer une note et comparer le flux audio en fréquence pour constater que la note est la même que celle que l'on a entré.

\section{Sauvegarde}

On crée un nouveau fichier, que l'on modifie selon un ordre à définir, puis l'on sauvegarde. Puis on relance le programme on ouvre le fichier de sauvegarde, et on compare si les modifications sont identiques.

\section{Effets}

C'est la partie la plus délicate à tester, vu que les effets sont des éléments subjectifs. On sera obligé de tester à l'oreille les différents effets.

\section{Mélodie}

On entre dans le programme une mélodie, puis en comparant le flux audio aux points de vue de la justesse et de la durée des notes, on constate que la mélodie est respectée.

\section{Export}

On compare le flux audio lu et le fichier audio produit.

\appendix

\chapter{Gestion de projet}

\section{Plan de charges}

\includegraphics[width=\textwidth]{plandecharges2.pdf}

\section{Planning prévisionnel}

\includegraphics[width=\textwidth]{schemas/planning.eps}

\chapter{Code source}

\chapter{Lexique}

\paragraph{Module} Morceau de musique séquentielle, contenant à la fois les samples, les instruments les motifs, ainsi que les divers réglages associés.

\paragraph{Sample} Unité élémentaire de son, ne contenant le plus souvent qu'une ou deux période d'onde sonore, destiné à être répété en boucle dans le but de produire un son continu homogène et qui en détermine ainsi le timbre.

\paragraph{Instrument} Entité permettant d'effectuer un mélodie, constitué d'un ensemble de réglages sur un sample, comme une enveloppe sonore, le volume et la balance.

\paragraph{Motif} Phrase musicale, délimitant des passages dans le module et permettant au musicien d'organiser sa musique. Un motif contient une mélodie constituée de notes couplées à des réglages individuels d'effets sonores et de volume.

\paragraph{Tick} Élément temporel atomique de l'édition musicale. On peut définir le nombre de ticks par temps, en général entre 3 et 10.

\end{document}
