Voilà la nouvelle fonction lecture utilisant FMODex.
Le morceau concernant le pitch est pas tout à fait fini, il suffit de créer un entier égal à 1 et de le multiplier/diviser par 2^(1/12) autant de fois que l'on monte ou descend d'un demi-ton, puis de donner cette valeur au paramètre du pitch shifter ligne 17.
This commit is contained in:
parent
493e030e2a
commit
9f0b465d5a
|
@ -6,10 +6,16 @@ void lireTick (Motif* m, int tmp, Mix_Chunk* chunk[], int nbrPortees) { // On
|
||||||
|
|
||||||
for (int chaine = 0; chaine < nbrPortees; chaine++) { // On va lire les chaines une à une par numéro croissant
|
for (int chaine = 0; chaine < nbrPortees; chaine++) { // On va lire les chaines une à une par numéro croissant
|
||||||
if (m != NULL) {
|
if (m != NULL) {
|
||||||
if (getInstrument(m,0,tmp) == -1) Mix_HaltChannel(chaine); // Si la note est un silence, la chaine s'arrête
|
if (getInstrument(m,0,tmp) == -1) FMOD_Channel_Stop(chan[chaine]); // Si la note est un silence, la chaine s'arrête
|
||||||
else {
|
else {
|
||||||
if (getNote(m,0,tmp) != 0) {
|
if (getNote(m,0,tmp) != 0) {
|
||||||
Mix_PlayChannel(chaine, chunk[getInstrument(m,chaine,tmp)], -1); // Sinon le sample de la chaine est joué en boucle
|
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);
|
||||||
|
FMOD_Channel_AddDSP(chan1, pitch, 0);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -18,26 +24,60 @@ void lireTick (Motif* m, int tmp, Mix_Chunk* chunk[], int nbrPortees) { // On
|
||||||
tempsPrecedent = tempsPrecedent + 125;
|
tempsPrecedent = tempsPrecedent + 125;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
void lecture (int nombreChaines, Motif* melodie[]) {
|
void lecture (int nombreChaines, Motif* melodie[]) {
|
||||||
// Tout ça c'est pour ouvrir le périphérique audio
|
|
||||||
int audio_rate = 44100;
|
FMOD_SYSTEM *system;
|
||||||
Uint16 audio_format = AUDIO_S16; /* 16-bit stereo */
|
|
||||||
int audio_channels = 1;
|
FMOD_RESULT resultat;
|
||||||
int audio_buffers = 4096;
|
|
||||||
SDL_Init(SDL_INIT_VIDEO | SDL_INIT_AUDIO);
|
|
||||||
if(Mix_OpenAudio(audio_rate, audio_format, audio_channels, audio_buffers)) {
|
FMOD_System_Create(&system);
|
||||||
printf("Unable to open audio!\n");
|
FMOD_System_Init(system, 8, FMOD_INIT_NORMAL, NULL); //Le deuxième argument donne le nombre de canal à utiliser (nombre de chaines)
|
||||||
exit(1);
|
|
||||||
}
|
|
||||||
|
|
||||||
//INITIALISATION SAMPLES ET CHANNELS
|
//INITIALISATION SAMPLES ET CHANNELS
|
||||||
Mix_AllocateChannels(nombreChaines); // On ouvre le nombre de chaines nécessaires dans le mixer
|
|
||||||
Mix_Chunk* chunk[5];
|
FMOD_CHANNEL *chan[nombreChaines]; // On ouvre le nombre de chaines nécessaires dans le mixer
|
||||||
chunk[0] = Mix_LoadWAV("lecture/0.wav");
|
|
||||||
chunk[1] = Mix_LoadWAV("lecture/1.wav");
|
FMOD_SOUND *sample[5]; // On charge les samples avec un message d'erreur en cas d'échec
|
||||||
chunk[2] = Mix_LoadWAV("lecture/2.wav");
|
|
||||||
chunk[3] = Mix_LoadWAV("lecture/3.wav");
|
resultat = FMOD_System_CreateStream(system, "lecture/0.wav", FMOD_SOFTWARE | FMOD_2D | FMOD_LOOP_NORMAL, 0, &sample[0]);
|
||||||
chunk[4] = Mix_LoadWAV("lecture/4.wav");
|
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
|
//Lecture des motifs
|
||||||
for (courant = 0; courant < taille; courant++) {
|
for (courant = 0; courant < taille; courant++) {
|
||||||
|
@ -46,6 +86,13 @@ void lecture (int nombreChaines, Motif* melodie[]) {
|
||||||
lireTick (melodie[courant], i, chunk, nombreChaines);
|
lireTick (melodie[courant], i, chunk, nombreChaines);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
Mix_CloseAudio();
|
|
||||||
|
//On relache le système FMOD
|
||||||
|
for (int i = 0; i <= nombreChaines; i++) {
|
||||||
|
FMOD_Sound_Release(sample[i]);
|
||||||
|
}
|
||||||
|
FMOD_System_Close(system);
|
||||||
|
FMOD_System_Release(system);
|
||||||
|
|
||||||
SDL_Quit();
|
SDL_Quit();
|
||||||
}
|
}
|
||||||
|
|
|
@ -3,11 +3,13 @@
|
||||||
|
|
||||||
|
|
||||||
#include "../melodie/melodie.h"
|
#include "../melodie/melodie.h"
|
||||||
|
// #include "../instruments/instrument.h"
|
||||||
|
|
||||||
#include <SDL2/SDL.h>
|
#include <SDL2/SDL.h>
|
||||||
#include <SDL2/SDL_mixer.h>
|
#include <SDL2/SDL_mixer.h>
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
|
#include <fmodex/fmod.h>
|
||||||
|
|
||||||
#define NBR_MS
|
#define NBR_MS
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue