ponytracker/sources/lecture/lecture.c

162 lines
5.5 KiB
C
Raw Permalink Normal View History

/**
* @file lecture.c
*
* Ce module impl<EFBFBD>mente les fonctions du fichier lecture.h
*
* @version 1
* @author Quentin, Guy
* @date Mai 2014
*/
#include "lecture.h"
2014-05-21 18:08:47 +02:00
/*
void lireTick (FMOD_SYSTEM* system, Motif* m, int tmp, FMOD_SOUND* sample[], FMOD_CHANNEL* chan[], int nbrPortees, int tempo) { // On va lire les ticks (plus petite division temporelle de la playlist) de haut en bas
//int tempsPrecedent = SDL_GetTicks();
for (int chaine = 0; chaine < nbrPortees; chaine++) { // On va lire les chaines une <20> une par num<75>ro croissant
if (m != NULL) {
if (getInstrument(m,0,tmp) == -1) FMOD_Channel_Stop(chan[0]); // Si la note est un silence, la chaine s'arr<72>te
else {
if (getNote(m,0,tmp) != 0) {
FMOD_Channel_Stop(chan[chaine]);
FMOD_System_PlaySound(system, FMOD_CHANNEL_FREE, sample[getInstrument(m,chaine,tmp)], 0, &chan[chaine]);
//Ici on va s'occuper du pitch
FMOD_DSP *pitch;
FMOD_System_CreateDSPByType(system, FMOD_DSP_TYPE_PITCHSHIFT, &pitch);
FMOD_DSP_SetParameter(pitch, FMOD_DSP_PITCHSHIFT_PITCH, 2.0);
FMOD_Channel_AddDSP(chan[chaine], pitch, 0); // C'est quoi chan1 ??? Je l'ai remplac<61> par chan[1], vu que chan1 est as d<>clar<61>...
// On va passer une bonne journ<72>e...
}
}
}
}
2014-05-21 18:08:47 +02:00
while (SDL_GetTicks() - tempsPrecedent < 125) {} // Si 125 ms se sont <20>coul<75>es (il faudra r<>gler ce temps sur le tempo)
tempsPrecedent = tempsPrecedent + 125;
Avouez que ce serait con qu'on ait besoin de SDL juste pour la temporisation
alors qu'on peut utiliser la fonction native usleep pour <EFBFBD>a, et beaucoup plus simplement.
usleep(60000000/tempo);
}
2014-05-21 18:08:47 +02:00
*/
2014-05-21 18:08:47 +02:00
void lecture (int nombreChaines, int nombreInst, int tempo, Instrument* inst[], Motif* melodie[]) {
FMOD_SYSTEM *system;
FMOD_RESULT resultat;
FMOD_System_Create(&system);
FMOD_System_Init(system, 8, FMOD_INIT_NORMAL, NULL); //Le deuxi<78>me argument donne le nombre de canaux <20> utiliser (nombre de chaines)
//INITIALISATION SAMPLES ET CHANNELS
FMOD_CHANNEL **chan = malloc(nombreChaines*sizeof(FMOD_CHANNEL*)); // On ouvre le nombre de chaines n<>cessaires dans le mixer
2014-05-21 18:08:47 +02:00
FMOD_SOUND **sample = malloc(nombreInst*sizeof(FMOD_SOUND*));
// On charge les samples avec un message d'erreur en cas d'<27>chec
for (int k = 0; k < nombreInst; k++) {
resultat = FMOD_System_CreateStream(system, getChemin(inst[k]), FMOD_SOFTWARE | FMOD_2D | FMOD_LOOP_NORMAL, 0, &sample[0]);
if (resultat != FMOD_OK)
{
fprintf(stderr, "Impossible de lire le fichier audio\n");
exit(EXIT_FAILURE);
}
}
2014-05-21 18:08:47 +02:00
/*
resultat = FMOD_System_CreateStream(system, "lecture/0.wav", FMOD_SOFTWARE | FMOD_2D | FMOD_LOOP_NORMAL, 0, &sample[0]);
if (resultat != FMOD_OK)
{
fprintf(stderr, "Impossible de lire le fichier audio\n");
exit(EXIT_FAILURE);
}
resultat = FMOD_System_CreateStream(system, "lecture/1.wav", FMOD_SOFTWARE | FMOD_2D | FMOD_LOOP_NORMAL, 0, &sample[1]);
if (resultat != FMOD_OK)
{
fprintf(stderr, "Impossible de lire le fichier audio\n");
exit(EXIT_FAILURE);
}
resultat = FMOD_System_CreateStream(system, "lecture/2.wav", FMOD_SOFTWARE | FMOD_2D | FMOD_LOOP_NORMAL, 0, &sample[2]);
if (resultat != FMOD_OK)
{
fprintf(stderr, "Impossible de lire le fichier audio\n");
exit(EXIT_FAILURE);
}
resultat = FMOD_System_CreateStream(system, "lecture/3.wav", FMOD_SOFTWARE | FMOD_2D | FMOD_LOOP_NORMAL, 0, &sample[3]);
if (resultat != FMOD_OK)
{
fprintf(stderr, "Impossible de lire le fichier audio\n");
exit(EXIT_FAILURE);
}
resultat = FMOD_System_CreateStream(system, "lecture/4.wav", FMOD_SOFTWARE | FMOD_2D | FMOD_LOOP_NORMAL, 0, &sample[4]);
if (resultat != FMOD_OK)
{
fprintf(stderr, "Impossible de lire le fichier audio\n");
exit(EXIT_FAILURE);
}
2014-05-21 18:08:47 +02:00
*/
//Lecture des motifs
2014-05-20 13:17:26 +02:00
Motif* m;
2014-05-21 23:27:28 +02:00
printf("\n");
2014-05-20 13:17:26 +02:00
for (int courant = 0; courant < taille; courant++) {
for (int i = 0; i < melodie[courant] -> nbrTmp; i++) {
2014-05-20 13:17:26 +02:00
// D<>BUT DU COPIER COLLER POTENTIELLEMENT FOIREUX
2014-05-21 18:08:47 +02:00
m = melodie[courant];
for (int chaine = 0; chaine < nombreChaines; chaine++) { // On va lire les chaines une <20> une par num<75>ro croissant
2014-05-20 13:17:26 +02:00
if (m != NULL) {
2014-05-21 21:12:56 +02:00
if (getInstrument(m,chaine,i) == -1) FMOD_Channel_Stop(chan[chaine]); // Si la note est un silence, la chaine s'arr<72>te
2014-05-20 13:17:26 +02:00
else {
2014-05-21 21:12:56 +02:00
if (getNote(m,chaine,i) != -1) {
2014-05-20 13:17:26 +02:00
FMOD_Channel_Stop(chan[chaine]);
2014-05-21 18:08:47 +02:00
FMOD_System_PlaySound(system, FMOD_CHANNEL_FREE, sample[getInstrument(m,chaine,i)], 0, &chan[chaine]);
2014-05-20 13:17:26 +02:00
//Ici on va s'occuper du pitch
FMOD_DSP *pitch;
FMOD_System_CreateDSPByType(system, FMOD_DSP_TYPE_PITCHSHIFT, &pitch);
2014-05-21 21:12:56 +02:00
FMOD_DSP_SetParameter(pitch, FMOD_DSP_PITCHSHIFT_PITCH, rapportPitch(inst[getInstrument(m,chaine,i)],getNote(m,chaine,i),getOctave(m,chaine,i)));
2014-05-20 13:17:26 +02:00
FMOD_Channel_AddDSP(chan[chaine], pitch, 0); // C'est quoi chan1 ??? Je l'ai remplac<61> par chan[1], vu que chan1 est as d<>clar<61>...
// On va passer une bonne journ<72>e...
}
}
}
}
/* while (SDL_GetTicks() - tempsPrecedent < 125) {} // Si 125 ms se sont <20>coul<75>es (il faudra r<>gler ce temps sur le tempo)
tempsPrecedent = tempsPrecedent + 125;
Avouez que ce serait con qu'on ait besoin de SDL juste pour la temporisation
alors qu'on peut utiliser la fonction native usleep pour <EFBFBD>a, et beaucoup plus simplement. */
usleep(60000000/tempo);
// FIN DU COPIER COLLER POTENTIELLEMENT FOIREUX
// lireTick (system, melodie[courant], i, sample, chan, nombreChaines, tempo);
}
}
//On relache le syst<73>me FMOD
2014-05-21 18:08:47 +02:00
for (int i = 0; i < nombreInst; i++) {
FMOD_Sound_Release(sample[i]);
}
FMOD_System_Close(system);
FMOD_System_Release(system);
}