/** * @file lecture.c * * Ce module implémente les fonctions du fichier lecture.h * * @version 1 * @author Quentin, Guy * @date Mai 2014 */ #include "lecture.h" /* 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 à une par numé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ê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é par chan[1], vu que chan1 est as déclaré... // On va passer une bonne journée... } } } } while (SDL_GetTicks() - tempsPrecedent < 125) {} // Si 125 ms se sont écoulé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 ça, et beaucoup plus simplement. usleep(60000000/tempo); } */ 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ème argument donne le nombre de canaux à 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 FMOD_SOUND **sample = malloc(nombreInst*sizeof(FMOD_SOUND*)); // On charge les samples avec un message d'erreur en cas d'é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); } } /* 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); } */ //Lecture des motifs Motif* m; printf("\n"); for (int courant = 0; courant < taille; courant++) { for (int i = 0; i < melodie[courant] -> nbrTmp; i++) { // DÉBUT DU COPIER COLLER POTENTIELLEMENT FOIREUX m = melodie[courant]; for (int chaine = 0; chaine < nombreChaines; chaine++) { // On va lire les chaines une à une par numéro croissant if (m != NULL) { if (getInstrument(m,chaine,i) == -1) FMOD_Channel_Stop(chan[chaine]); // Si la note est un silence, la chaine s'arrête else { if (getNote(m,chaine,i) != -1) { FMOD_Channel_Stop(chan[chaine]); FMOD_System_PlaySound(system, FMOD_CHANNEL_FREE, sample[getInstrument(m,chaine,i)], 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, rapportPitch(inst[getInstrument(m,chaine,i)],getNote(m,chaine,i),getOctave(m,chaine,i))); FMOD_Channel_AddDSP(chan[chaine], pitch, 0); // C'est quoi chan1 ??? Je l'ai remplacé par chan[1], vu que chan1 est as déclaré... // On va passer une bonne journée... } } } } /* while (SDL_GetTicks() - tempsPrecedent < 125) {} // Si 125 ms se sont écoulé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 ç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ème FMOD for (int i = 0; i < nombreInst; i++) { FMOD_Sound_Release(sample[i]); } FMOD_System_Close(system); FMOD_System_Release(system); }