/**
 * @file motifs.h
 *
 * Gestion des motifs
 *
 * @version 1
 * @author Module CSC3502 : Projet Informatique 1ère année TELECOM SudParis
 * @date  Mai 2014
*/

#ifndef _motif_h
#define _motif_h

#include <stdlib.h>
#include <stdio.h>

#define DEFNBRTMP 16

typedef struct _note{
    int note;
    int octave;
    int instrument;
    int volume;
    int effet;
} Note;

typedef Note Portee[];

typedef Portee* Mesure[];

typedef struct _motif{
    char            nom[10];
    int             nbrTmp;
    Mesure*	    motif;
    struct _motif*  suivant;
} Motif;

/**
	Permet d'obtenir le numéro d'un motif
	@param[in] m : Mmtif dont on veut déterminer le numéro
	@return Le numéro du motif
*/
int getIdMotif(Motif* m);

/**
	Permet d'ajouter un nouveau motif
	@param[out] pliste : liste de motifs
	@param[in] nbrTmp : nombre de temps que doit contenir le motif
	@param[in] nbrPortees : nombre de portées que doit contenir le motif
*/
void ajouterMotif(Motif** pliste, int nbrTmp, int nbrPortees);

/**
	Permet de nommer un motif
	@param[out] m : motif que l'on veut nommer
	@param[in] nom : nom que l'on donne au motif
	*/
void definirNomMotif(Motif* m, char* nom);

// void definirNbrTmp(Motif* m, int nbrTmp);
// C'est chiant de changer le nomre de temps en cours de route,
// donc on le fera après le proto.

/**
	Permet de supprimer un motif
	@param[out] cellule : adresse de l'élément de la liste
	@param[in] nbrPortees : nombre de portées que l'on supprime
*/
void supprimerMotif(Motif** cellule, int nbrPortees); // cellule correspond à l'adresse de l'élément de la liste (avec &)

/**
	Permet de définir une note
	param[out] m : motif dans lequel on ajoute la note
	param[in] portee : portée du motif dans laquelle on ajoute la note
	param[in] tmp : temps du motif dans lequel on ajoute la note
	param[in] note : note que l'on ajoute
*/
void definirNote(Motif* m, int portee, int tmp, int note);

/**
	Permet de définir une octave
	param[out] m : motif dans lequel on ajoute l'octave
	param[in] portee : portée du motif dans laquelle on ajoute l'octave
	param[in] tmp : temps du motif dans lequel on ajoute l'octave
	param[in] octave : octave que l'on ajoute à la note
*/
void definirOctave(Motif* m, int portee, int tmp, int octave);

/**
	Permet de définir l'instrument jouant une note
	param[out] m : motif dans lequel on utilise cet instrument
	param[in] portee : portée du motif dans laquelle on utilise cet instrument
	param[in] tmp : temps du motif dans lequel on utilise cet instrument
	param[in] instrument : instrument que l'on utilise
*/
void definirInstrument(Motif* m, int portee, int tmp, int intrument);

/**
	Permet de définir le volume d'une note
	param[out] m : motif dans lequel on modifie le volume
	param[in] portee : portée du motif dans laquelle on modifie le volume
	param[in] tmp : temps du motif dans lequel on modifie le volume
	param[in] volume : volume de la note
*/
void definirVolume(Motif* m, int portee, int tmp, int volume);

/**
	Permet de définir l'effet donné à une note
	param[out] m : motif dans lequel on ajoute l'effet
	param[in] portee : portée du motif dans laquelle on ajoute l'effet
	param[in] tmp : temps du motif dans lequel on ajoute l'effet
	param[in] effet : effet donné à la note
*/
void definirEffet(Motif* m, int portee, int tmp, int effet);

/**
	Permet de supprimer une note
	param[out] m : motif dans lequel on supprime la note
	param[in] portee : portée du motif dans laquelle on supprime la note
	param[in] tmp : temps du motif dans lequel on supprime la note
*/
void supprimerNote(Motif* m, int portee, int tmp);

// Maintenant, voici les getters (qui intéressent entre autres Majora)

/**
	Permet d'afficher une note
	param[out] m : motif dans lequel on affiche la note
	param[in] portee : portée du motif dans laquelle on affiche la note
	param[in] tmp : temps du motif dans lequel on affiche la note
*/
int getNote(Motif* m, int portee, int tmp);

/**
	Permet d'afficher une octave
	param[out] m : motif dans lequel on affiche l'octave
	param[in] portee : portée du motif dans laquelle on affiche l'octave
	param[in] tmp : temps du motif dans lequel on affiche l'octave
*/
int getOctave(Motif* m, int portee, int tmp);

/**
	Permet d'afficher un instrument utilisé
	param[out] m : motif dans lequel on affiche l'instrument utilisé
	param[in] portee : portée du motif dans laquelle on affiche l'instrument utilisé
	param[in] tmp : temps du motif dans lequel on affiche l'instrument utilisé
*/
int getInstrument(Motif* m, int portee, int tmp);

/**
	Permet d'afficher une volume de note
	param[out] m : motif dans lequel on affiche le volume de la note
	param[in] portee : portée du motif dans laquelle on affiche le volume de la note
	param[in] tmp : temps du motif dans lequel on affiche le volume de la note
*/
int getVolume(Motif* m, int portee, int tmp);

/**
	Permet d'afficher un effet donné
	param[out] m : motif dans lequel on affiche l'effet donné
	param[in] portee : portée du motif dans laquelle on affiche l'effet donné
	param[in] tmp : temps du motif dans lequel on affiche l'effet donné
*/
int getEffet(Motif* m, int portee, int tmp);

#endif
