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 /*
14 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
15 
16  //int tempsPrecedent = SDL_GetTicks();
17 
18  for (int chaine = 0; chaine < nbrPortees; chaine++) { // On va lire les chaines une à une par numéro croissant
19  if (m != NULL) {
20  if (getInstrument(m,0,tmp) == -1) FMOD_Channel_Stop(chan[0]); // Si la note est un silence, la chaine s'arrête
21  else {
22  if (getNote(m,0,tmp) != 0) {
23 
24  FMOD_Channel_Stop(chan[chaine]);
25  FMOD_System_PlaySound(system, FMOD_CHANNEL_FREE, sample[getInstrument(m,chaine,tmp)], 0, &chan[chaine]);
26 
27  //Ici on va s'occuper du pitch
28  FMOD_DSP *pitch;
29  FMOD_System_CreateDSPByType(system, FMOD_DSP_TYPE_PITCHSHIFT, &pitch);
30  FMOD_DSP_SetParameter(pitch, FMOD_DSP_PITCHSHIFT_PITCH, 2.0);
31  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é...
32  // On va passer une bonne journée...
33  }
34  }
35  }
36  }
37  while (SDL_GetTicks() - tempsPrecedent < 125) {} // Si 125 ms se sont écoulées (il faudra régler ce temps sur le tempo)
38  tempsPrecedent = tempsPrecedent + 125;
39  Avouez que ce serait con qu'on ait besoin de SDL juste pour la temporisation
40  alors qu'on peut utiliser la fonction native usleep pour ça, et beaucoup plus simplement.
41  usleep(60000000/tempo);
42 }
43 */
44 
45 
46 void lecture (int nombreChaines, int nombreInst, int tempo, Instrument* inst[], Motif* melodie[]) {
47 
48  FMOD_SYSTEM *system;
49 
50  FMOD_RESULT resultat;
51 
52 
53  FMOD_System_Create(&system);
54  FMOD_System_Init(system, 8, FMOD_INIT_NORMAL, NULL); //Le deuxième argument donne le nombre de canaux à utiliser (nombre de chaines)
55 
56 
57  //INITIALISATION SAMPLES ET CHANNELS
58 
59  FMOD_CHANNEL **chan = malloc(nombreChaines*sizeof(FMOD_CHANNEL*)); // On ouvre le nombre de chaines nécessaires dans le mixer
60 
61  FMOD_SOUND **sample = malloc(nombreInst*sizeof(FMOD_SOUND*));
62 
63  // On charge les samples avec un message d'erreur en cas d'échec
64 
65  for (int k = 0; k < nombreInst; k++) {
66  resultat = FMOD_System_CreateStream(system, getChemin(inst[k]), FMOD_SOFTWARE | FMOD_2D | FMOD_LOOP_NORMAL, 0, &sample[0]);
67  if (resultat != FMOD_OK)
68  {
69  fprintf(stderr, "Impossible de lire le fichier audio\n");
70  exit(EXIT_FAILURE);
71  }
72  }
73 
74  /*
75  resultat = FMOD_System_CreateStream(system, "lecture/0.wav", FMOD_SOFTWARE | FMOD_2D | FMOD_LOOP_NORMAL, 0, &sample[0]);
76  if (resultat != FMOD_OK)
77  {
78  fprintf(stderr, "Impossible de lire le fichier audio\n");
79  exit(EXIT_FAILURE);
80  }
81 
82  resultat = FMOD_System_CreateStream(system, "lecture/1.wav", FMOD_SOFTWARE | FMOD_2D | FMOD_LOOP_NORMAL, 0, &sample[1]);
83  if (resultat != FMOD_OK)
84  {
85  fprintf(stderr, "Impossible de lire le fichier audio\n");
86  exit(EXIT_FAILURE);
87  }
88 
89  resultat = FMOD_System_CreateStream(system, "lecture/2.wav", FMOD_SOFTWARE | FMOD_2D | FMOD_LOOP_NORMAL, 0, &sample[2]);
90  if (resultat != FMOD_OK)
91  {
92  fprintf(stderr, "Impossible de lire le fichier audio\n");
93  exit(EXIT_FAILURE);
94  }
95 
96  resultat = FMOD_System_CreateStream(system, "lecture/3.wav", FMOD_SOFTWARE | FMOD_2D | FMOD_LOOP_NORMAL, 0, &sample[3]);
97  if (resultat != FMOD_OK)
98  {
99  fprintf(stderr, "Impossible de lire le fichier audio\n");
100  exit(EXIT_FAILURE);
101  }
102 
103  resultat = FMOD_System_CreateStream(system, "lecture/4.wav", FMOD_SOFTWARE | FMOD_2D | FMOD_LOOP_NORMAL, 0, &sample[4]);
104  if (resultat != FMOD_OK)
105  {
106  fprintf(stderr, "Impossible de lire le fichier audio\n");
107  exit(EXIT_FAILURE);
108  }
109  */
110 
111 
112  //Lecture des motifs
113 
114  Motif* m;
115  printf("\n");
116  for (int courant = 0; courant < taille; courant++) {
117  for (int i = 0; i < melodie[courant] -> nbrTmp; i++) {
118 
119  // DÉBUT DU COPIER COLLER POTENTIELLEMENT FOIREUX
120 
121  m = melodie[courant];
122  for (int chaine = 0; chaine < nombreChaines; chaine++) { // On va lire les chaines une à une par numéro croissant
123  if (m != NULL) {
124  if (getInstrument(m,chaine,i) == -1) FMOD_Channel_Stop(chan[chaine]); // Si la note est un silence, la chaine s'arrête
125  else {
126 
127  if (getNote(m,chaine,i) != -1) {
128 
129  FMOD_Channel_Stop(chan[chaine]);
130  FMOD_System_PlaySound(system, FMOD_CHANNEL_FREE, sample[getInstrument(m,chaine,i)], 0, &chan[chaine]);
131 
132  //Ici on va s'occuper du pitch
133  FMOD_DSP *pitch;
135  FMOD_DSP_SetParameter(pitch, FMOD_DSP_PITCHSHIFT_PITCH, rapportPitch(inst[getInstrument(m,chaine,i)],getNote(m,chaine,i),getOctave(m,chaine,i)));
136  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é...
137  // On va passer une bonne journée...
138  }
139  }
140  }
141  }
142  /* while (SDL_GetTicks() - tempsPrecedent < 125) {} // Si 125 ms se sont écoulées (il faudra régler ce temps sur le tempo)
143  tempsPrecedent = tempsPrecedent + 125;
144  Avouez que ce serait con qu'on ait besoin de SDL juste pour la temporisation
145  alors qu'on peut utiliser la fonction native usleep pour ça, et beaucoup plus simplement. */
146  usleep(60000000/tempo);
147 
148 
149  // FIN DU COPIER COLLER POTENTIELLEMENT FOIREUX
150 
151  // lireTick (system, melodie[courant], i, sample, chan, nombreChaines, tempo);
152  }
153  }
154 
155  //On relache le système FMOD
156  for (int i = 0; i < nombreInst; i++) {
157  FMOD_Sound_Release(sample[i]);
158  }
159  FMOD_System_Close(system);
160  FMOD_System_Release(system);
161 }
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
Instrument * inst[NBR_INST]
Definition: main.c:43
float rapportPitch(Instrument *inst, int note, int octave)
Definition: instruments.c:58
Motif * m
Definition: maintest.c:13
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)
Definition: motifs.h:31
FMOD_RESULT F_API FMOD_Channel_Stop(FMOD_CHANNEL *channel)
int taille
Definition: main.c:46
FMOD_RESULT
Definition: fmod.h:97
char * getChemin(Instrument *inst)
Definition: instruments.c:22
FMOD_RESULT F_API FMOD_System_Create(FMOD_SYSTEM **system)
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)
FMOD_RESULT F_API FMOD_Sound_Release(FMOD_SOUND *sound)
void lecture(int nombreChaines, int nombreInst, int tempo, Instrument *inst[], Motif *melodie[])
Definition: lecture.c:46
#define FMOD_LOOP_NORMAL
Definition: fmod.h:895
#define FMOD_SOFTWARE
Definition: fmod.h:900
struct FMOD_DSP FMOD_DSP
Definition: fmod.h:70
FMOD_RESULT F_API FMOD_System_Release(FMOD_SYSTEM *system)
Motif * melodie[MAX_PATTERNS]
Definition: main.c:41
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)
int getOctave(Motif *m, int portee, int tmp)
Definition: motifs.c:81