PonyTracker
Un projet de tracker de musique
 Tout Structures de données Espaces de nommage Fichiers Fonctions Variables Définitions de type Ã‰numérations Valeurs énumérées Macros Pages
lecture.c
Aller à la documentation de ce fichier.
1 
11 #include "lecture.h"
12 
13 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
14 
15  //int tempsPrecedent = SDL_GetTicks();
16 
17  for (int chaine = 0; chaine < nbrPortees; chaine++) { // On va lire les chaines une à une par numéro croissant
18  if (m != NULL) {
19  if (getInstrument(m,0,tmp) == -1) FMOD_Channel_Stop(chan[0]); // Si la note est un silence, la chaine s'arrête
20  else {
21  if (getNote(m,0,tmp) != 0) {
22 
23  FMOD_Channel_Stop(chan[chaine]);
24  FMOD_System_PlaySound(system, FMOD_CHANNEL_FREE, sample[getInstrument(m,chaine,tmp)], 0, &chan[chaine]);
25 
26  //Ici on va s'occuper du pitch
27  FMOD_DSP *pitch;
30  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é...
31  // On va passer une bonne journée...
32  }
33  }
34  }
35  }
36  /* while (SDL_GetTicks() - tempsPrecedent < 125) {} // Si 125 ms se sont écoulées (il faudra régler ce temps sur le tempo)
37  tempsPrecedent = tempsPrecedent + 125;
38  Avouez que ce serait con qu'on ait besoin de SDL juste pour la temporisation
39  alors qu'on peut utiliser la fonction native usleep pour ça, et beaucoup plus simplement. */
40  usleep(60000000/tempo);
41 }
42 
43 
44 
45 void lecture (int nombreChaines, int tempo, Motif* melodie[]) {
46 
47  FMOD_SYSTEM *system;
48 
49  FMOD_RESULT resultat;
50 
51 
52  FMOD_System_Create(&system);
53  FMOD_System_Init(system, 8, FMOD_INIT_NORMAL, NULL); //Le deuxième argument donne le nombre de canaux à utiliser (nombre de chaines)
54 
55 
56  //INITIALISATION SAMPLES ET CHANNELS
57 
58  FMOD_CHANNEL **chan = malloc(nombreChaines*sizeof(FMOD_CHANNEL*)); // On ouvre le nombre de chaines nécessaires dans le mixer
59 
60  FMOD_SOUND *sample[5]; // On charge les samples avec un message d'erreur en cas d'échec
61 
62  resultat = FMOD_System_CreateStream(system, "lecture/0.wav", FMOD_SOFTWARE | FMOD_2D | FMOD_LOOP_NORMAL, 0, &sample[0]);
63  if (resultat != FMOD_OK)
64  {
65  fprintf(stderr, "Impossible de lire le fichier audio\n");
66  exit(EXIT_FAILURE);
67  }
68 
69  resultat = FMOD_System_CreateStream(system, "lecture/1.wav", FMOD_SOFTWARE | FMOD_2D | FMOD_LOOP_NORMAL, 0, &sample[1]);
70  if (resultat != FMOD_OK)
71  {
72  fprintf(stderr, "Impossible de lire le fichier audio\n");
73  exit(EXIT_FAILURE);
74  }
75 
76  resultat = FMOD_System_CreateStream(system, "lecture/2.wav", FMOD_SOFTWARE | FMOD_2D | FMOD_LOOP_NORMAL, 0, &sample[2]);
77  if (resultat != FMOD_OK)
78  {
79  fprintf(stderr, "Impossible de lire le fichier audio\n");
80  exit(EXIT_FAILURE);
81  }
82 
83  resultat = FMOD_System_CreateStream(system, "lecture/3.wav", FMOD_SOFTWARE | FMOD_2D | FMOD_LOOP_NORMAL, 0, &sample[3]);
84  if (resultat != FMOD_OK)
85  {
86  fprintf(stderr, "Impossible de lire le fichier audio\n");
87  exit(EXIT_FAILURE);
88  }
89 
90  resultat = FMOD_System_CreateStream(system, "lecture/4.wav", FMOD_SOFTWARE | FMOD_2D | FMOD_LOOP_NORMAL, 0, &sample[4]);
91  if (resultat != FMOD_OK)
92  {
93  fprintf(stderr, "Impossible de lire le fichier audio\n");
94  exit(EXIT_FAILURE);
95  }
96 
97 
98  //Lecture des motifs
99  for (courant = 0; courant < taille; courant++) {
100  for (int i = 0; i < melodie[courant] -> nbrTmp; i++) {
101  printf("lecture temps %d : N=%d I=%d\n",i,getNote(melodie[courant],0,i),getInstrument(melodie[courant],0,i));
102  lireTick (system, melodie[courant], i, sample, chan, nombreChaines, tempo);
103  }
104  }
105 
106  //On relache le système FMOD
107  for (int i = 0; i <= nombreChaines; i++) {
108  FMOD_Sound_Release(sample[i]);
109  }
110  FMOD_System_Close(system);
111  FMOD_System_Release(system);
112 }
FMOD_RESULT F_API FMOD_System_PlaySound(FMOD_SYSTEM *system, FMOD_CHANNELINDEX channelid, FMOD_SOUND *sound, FMOD_BOOL paused, FMOD_CHANNEL **channel)
int getInstrument(Motif *m, int portee, int tmp)
Definition: motifs.c:85
int getNote(Motif *m, int portee, int tmp)
Definition: motifs.c:77
struct FMOD_SOUND FMOD_SOUND
Definition: fmod.h:65
FMOD_RESULT F_API FMOD_System_CreateDSPByType(FMOD_SYSTEM *system, FMOD_DSP_TYPE type, FMOD_DSP **dsp)
int courant
Definition: melodie.h:8
Definition: motifs.h:31
FMOD_RESULT F_API FMOD_Channel_Stop(FMOD_CHANNEL *channel)
FMOD_RESULT
Definition: fmod.h:97
FMOD_RESULT F_API FMOD_System_Create(FMOD_SYSTEM **system)
int taille
Definition: melodie.h:10
struct FMOD_CHANNEL FMOD_CHANNEL
Definition: fmod.h:66
struct FMOD_SYSTEM FMOD_SYSTEM
Definition: fmod.h:64
Definition: fmod.h:99
FMOD_RESULT F_API FMOD_DSP_SetParameter(FMOD_DSP *dsp, int index, float value)
FMOD_RESULT F_API FMOD_System_Init(FMOD_SYSTEM *system, int maxchannels, FMOD_INITFLAGS flags, void *extradriverdata)
void lecture(int nombreChaines, int tempo, Motif *melodie[])
Definition: lecture.c:45
FMOD_RESULT F_API FMOD_Sound_Release(FMOD_SOUND *sound)
#define FMOD_LOOP_NORMAL
Definition: fmod.h:895
#define FMOD_SOFTWARE
Definition: fmod.h:900
void lireTick(FMOD_SYSTEM *system, Motif *m, int tmp, FMOD_SOUND *sample[], FMOD_CHANNEL *chan[], int nbrPortees, int tempo)
Definition: lecture.c:13
struct FMOD_DSP FMOD_DSP
Definition: fmod.h:70
FMOD_RESULT F_API FMOD_System_Release(FMOD_SYSTEM *system)
FMOD_RESULT F_API FMOD_System_Close(FMOD_SYSTEM *system)
FMOD_RESULT F_API FMOD_System_CreateStream(FMOD_SYSTEM *system, const char *name_or_data, FMOD_MODE mode, FMOD_CREATESOUNDEXINFO *exinfo, FMOD_SOUND **sound)
#define FMOD_INIT_NORMAL
Definition: fmod.h:733
#define FMOD_2D
Definition: fmod.h:897
FMOD_RESULT F_API FMOD_Channel_AddDSP(FMOD_CHANNEL *channel, FMOD_DSP *dsp, FMOD_DSPCONNECTION **connection)