clangd auto-format
This commit is contained in:
parent
a9c8643318
commit
7c95e8c693
4 changed files with 350 additions and 305 deletions
|
@ -4,22 +4,23 @@
|
||||||
#include <vector>
|
#include <vector>
|
||||||
|
|
||||||
class AudioEmitter {
|
class AudioEmitter {
|
||||||
private:
|
private:
|
||||||
std::unique_ptr<FMOD::System> system;
|
std::unique_ptr<FMOD::System> system;
|
||||||
FMOD::Channel* timer{ nullptr };
|
FMOD::Channel *timer{nullptr};
|
||||||
std::vector <std::unique_ptr<FMOD::Sound>> chords;
|
std::vector<std::unique_ptr<FMOD::Sound>> chords;
|
||||||
std::vector<std::unique_ptr<FMOD::Sound>> drums;
|
std::vector<std::unique_ptr<FMOD::Sound>> drums;
|
||||||
std::vector<std::unique_ptr<FMOD::Sound>> notes;
|
std::vector<std::unique_ptr<FMOD::Sound>> notes;
|
||||||
int tempo{ 170 };
|
int tempo{170};
|
||||||
std::vector<std::vector<float>> markov_matrix_chords;
|
std::vector<std::vector<float>> markov_matrix_chords;
|
||||||
std::vector<std::vector<float>> markov_matrix_melody;
|
std::vector<std::vector<float>> markov_matrix_melody;
|
||||||
int nbr_melo_max{ 4 };
|
int nbr_melo_max{4};
|
||||||
int current_beat{ 0 };
|
int current_beat{0};
|
||||||
std::vector<std::vector<float>> rythmes;
|
std::vector<std::vector<float>> rythmes;
|
||||||
int index_note;
|
int index_note;
|
||||||
std::vector<int> chordProgression;
|
std::vector<int> chordProgression;
|
||||||
std::vector<FMOD::Channel*> activeChannels;
|
std::vector<FMOD::Channel *> activeChannels;
|
||||||
public:
|
|
||||||
|
public:
|
||||||
AudioEmitter();
|
AudioEmitter();
|
||||||
void generateMusic();
|
void generateMusic();
|
||||||
void audioUpdate();
|
void audioUpdate();
|
||||||
|
@ -30,5 +31,5 @@ class AudioEmitter {
|
||||||
int nextNote(int currentNote);
|
int nextNote(int currentNote);
|
||||||
int noteSecondaire(int note);
|
int noteSecondaire(int note);
|
||||||
float getTime();
|
float getTime();
|
||||||
float timeBeforeNewGeneration{ 0.2f };
|
float timeBeforeNewGeneration{0.2f};
|
||||||
};
|
};
|
|
@ -1,9 +1,9 @@
|
||||||
#ifndef BOOK_GAME_HPP
|
#ifndef BOOK_GAME_HPP
|
||||||
#define BOOK_GAME_HPP
|
#define BOOK_GAME_HPP
|
||||||
|
|
||||||
|
#include "AudioEmitter.hpp"
|
||||||
#include "RoundTarget.hpp"
|
#include "RoundTarget.hpp"
|
||||||
#include <SFML/Graphics.hpp>
|
#include <SFML/Graphics.hpp>
|
||||||
#include "AudioEmitter.hpp"
|
|
||||||
|
|
||||||
class Game {
|
class Game {
|
||||||
public:
|
public:
|
||||||
|
@ -13,11 +13,11 @@ public:
|
||||||
void run();
|
void run();
|
||||||
|
|
||||||
private:
|
private:
|
||||||
void processEvents(AudioEmitter& audioEmitter);
|
void processEvents(AudioEmitter &audioEmitter);
|
||||||
void update(sf::Time elapsedTime);
|
void update(sf::Time elapsedTime);
|
||||||
void render();
|
void render();
|
||||||
|
|
||||||
void updateStatistics(AudioEmitter& audioEmitter);
|
void updateStatistics(AudioEmitter &audioEmitter);
|
||||||
|
|
||||||
static const sf::Time TimePerFrame;
|
static const sf::Time TimePerFrame;
|
||||||
|
|
||||||
|
|
|
@ -1,8 +1,8 @@
|
||||||
#include "AudioEmitter.hpp"
|
#include "AudioEmitter.hpp"
|
||||||
#include <iostream>
|
#include <iostream>
|
||||||
|
#include <numeric>
|
||||||
#include <random>
|
#include <random>
|
||||||
#include <string>
|
#include <string>
|
||||||
#include <numeric>
|
|
||||||
|
|
||||||
void ERRCHECK(FMOD_RESULT result) {
|
void ERRCHECK(FMOD_RESULT result) {
|
||||||
if (result != FMOD_OK) {
|
if (result != FMOD_OK) {
|
||||||
|
@ -11,98 +11,120 @@ void ERRCHECK(FMOD_RESULT result) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
auto fmodSoundDeleter = [](FMOD::Sound* sound) {
|
auto fmodSoundDeleter = [](FMOD::Sound *sound) {
|
||||||
if (sound) {
|
if (sound) {
|
||||||
sound->release();
|
sound->release();
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
AudioEmitter::AudioEmitter() {
|
AudioEmitter::AudioEmitter() {
|
||||||
FMOD::System* rawSystem = nullptr;
|
FMOD::System *rawSystem = nullptr;
|
||||||
ERRCHECK(FMOD::System_Create(&rawSystem));
|
ERRCHECK(FMOD::System_Create(&rawSystem));
|
||||||
|
|
||||||
system.reset(rawSystem);
|
system.reset(rawSystem);
|
||||||
ERRCHECK(system->init(512, FMOD_INIT_NORMAL, nullptr));
|
ERRCHECK(system->init(512, FMOD_INIT_NORMAL, nullptr));
|
||||||
|
|
||||||
|
std::vector<FMOD::Sound *> rawChords(7);
|
||||||
std::vector<FMOD::Sound*> rawChords(7);
|
ERRCHECK(system->createSound("media/accords/do.wav", FMOD_LOOP_OFF, nullptr,
|
||||||
ERRCHECK(system->createSound("media/accords/do.wav", FMOD_LOOP_OFF, nullptr, &rawChords[0]));
|
&rawChords[0]));
|
||||||
ERRCHECK(system->createSound("media/accords/re.wav", FMOD_LOOP_OFF, nullptr, &rawChords[1]));
|
ERRCHECK(system->createSound("media/accords/re.wav", FMOD_LOOP_OFF, nullptr,
|
||||||
ERRCHECK(system->createSound("media/accords/mi.wav", FMOD_LOOP_OFF, nullptr, &rawChords[2]));
|
&rawChords[1]));
|
||||||
ERRCHECK(system->createSound("media/accords/fa.wav", FMOD_LOOP_OFF, nullptr, &rawChords[3]));
|
ERRCHECK(system->createSound("media/accords/mi.wav", FMOD_LOOP_OFF, nullptr,
|
||||||
ERRCHECK(system->createSound("media/accords/sol.wav", FMOD_LOOP_OFF, nullptr, &rawChords[4]));
|
&rawChords[2]));
|
||||||
ERRCHECK(system->createSound("media/accords/la.wav", FMOD_LOOP_OFF, nullptr, &rawChords[5]));
|
ERRCHECK(system->createSound("media/accords/fa.wav", FMOD_LOOP_OFF, nullptr,
|
||||||
ERRCHECK(system->createSound("media/accords/si.wav", FMOD_LOOP_OFF, nullptr, &rawChords[6]));
|
&rawChords[3]));
|
||||||
|
ERRCHECK(system->createSound("media/accords/sol.wav", FMOD_LOOP_OFF, nullptr,
|
||||||
|
&rawChords[4]));
|
||||||
|
ERRCHECK(system->createSound("media/accords/la.wav", FMOD_LOOP_OFF, nullptr,
|
||||||
|
&rawChords[5]));
|
||||||
|
ERRCHECK(system->createSound("media/accords/si.wav", FMOD_LOOP_OFF, nullptr,
|
||||||
|
&rawChords[6]));
|
||||||
for (int i = 0; i < 7; i += 1) {
|
for (int i = 0; i < 7; i += 1) {
|
||||||
chords.push_back(std::unique_ptr<FMOD::Sound>(rawChords[i]));
|
chords.push_back(std::unique_ptr<FMOD::Sound>(rawChords[i]));
|
||||||
}
|
}
|
||||||
|
|
||||||
int nbr_drums = 3;
|
int nbr_drums = 3;
|
||||||
std::vector<FMOD::Sound*> rawDrums(nbr_drums);
|
std::vector<FMOD::Sound *> rawDrums(nbr_drums);
|
||||||
ERRCHECK(system->createSound("media/percussions/drums1.wav", FMOD_LOOP_OFF, nullptr, &rawDrums[0]));
|
ERRCHECK(system->createSound("media/percussions/drums1.wav", FMOD_LOOP_OFF,
|
||||||
ERRCHECK(system->createSound("media/percussions/drums2.wav", FMOD_LOOP_OFF, nullptr, &rawDrums[1]));
|
nullptr, &rawDrums[0]));
|
||||||
ERRCHECK(system->createSound("media/percussions/drums3.wav", FMOD_LOOP_OFF, nullptr, &rawDrums[2]));
|
ERRCHECK(system->createSound("media/percussions/drums2.wav", FMOD_LOOP_OFF,
|
||||||
|
nullptr, &rawDrums[1]));
|
||||||
|
ERRCHECK(system->createSound("media/percussions/drums3.wav", FMOD_LOOP_OFF,
|
||||||
|
nullptr, &rawDrums[2]));
|
||||||
for (int i = 0; i < nbr_drums; i += 1) {
|
for (int i = 0; i < nbr_drums; i += 1) {
|
||||||
drums.push_back(std::unique_ptr<FMOD::Sound>(rawDrums[i]));
|
drums.push_back(std::unique_ptr<FMOD::Sound>(rawDrums[i]));
|
||||||
}
|
}
|
||||||
|
|
||||||
std::vector<FMOD::Sound*> rawNotes(15);
|
std::vector<FMOD::Sound *> rawNotes(15);
|
||||||
ERRCHECK(system->createSound("media/notes/A1.wav", FMOD_LOOP_OFF, nullptr, &rawNotes[0]));
|
ERRCHECK(system->createSound("media/notes/A1.wav", FMOD_LOOP_OFF, nullptr,
|
||||||
ERRCHECK(system->createSound("media/notes/B1.wav", FMOD_LOOP_OFF, nullptr, &rawNotes[1]));
|
&rawNotes[0]));
|
||||||
ERRCHECK(system->createSound("media/notes/C1.wav", FMOD_LOOP_OFF, nullptr, &rawNotes[2]));
|
ERRCHECK(system->createSound("media/notes/B1.wav", FMOD_LOOP_OFF, nullptr,
|
||||||
ERRCHECK(system->createSound("media/notes/D1.wav", FMOD_LOOP_OFF, nullptr, &rawNotes[3]));
|
&rawNotes[1]));
|
||||||
ERRCHECK(system->createSound("media/notes/E1.wav", FMOD_LOOP_OFF, nullptr, &rawNotes[4]));
|
ERRCHECK(system->createSound("media/notes/C1.wav", FMOD_LOOP_OFF, nullptr,
|
||||||
ERRCHECK(system->createSound("media/notes/F1.wav", FMOD_LOOP_OFF, nullptr, &rawNotes[5]));
|
&rawNotes[2]));
|
||||||
ERRCHECK(system->createSound("media/notes/G1.wav", FMOD_LOOP_OFF, nullptr, &rawNotes[6]));
|
ERRCHECK(system->createSound("media/notes/D1.wav", FMOD_LOOP_OFF, nullptr,
|
||||||
ERRCHECK(system->createSound("media/notes/A2.wav", FMOD_LOOP_OFF, nullptr, &rawNotes[7]));
|
&rawNotes[3]));
|
||||||
ERRCHECK(system->createSound("media/notes/B2.wav", FMOD_LOOP_OFF, nullptr, &rawNotes[8]));
|
ERRCHECK(system->createSound("media/notes/E1.wav", FMOD_LOOP_OFF, nullptr,
|
||||||
ERRCHECK(system->createSound("media/notes/C2.wav", FMOD_LOOP_OFF, nullptr, &rawNotes[9]));
|
&rawNotes[4]));
|
||||||
ERRCHECK(system->createSound("media/notes/D2.wav", FMOD_LOOP_OFF, nullptr, &rawNotes[10]));
|
ERRCHECK(system->createSound("media/notes/F1.wav", FMOD_LOOP_OFF, nullptr,
|
||||||
ERRCHECK(system->createSound("media/notes/E2.wav", FMOD_LOOP_OFF, nullptr, &rawNotes[11]));
|
&rawNotes[5]));
|
||||||
ERRCHECK(system->createSound("media/notes/F2.wav", FMOD_LOOP_OFF, nullptr, &rawNotes[12]));
|
ERRCHECK(system->createSound("media/notes/G1.wav", FMOD_LOOP_OFF, nullptr,
|
||||||
ERRCHECK(system->createSound("media/notes/G2.wav", FMOD_LOOP_OFF, nullptr, &rawNotes[13]));
|
&rawNotes[6]));
|
||||||
ERRCHECK(system->createSound("media/notes/A3.wav", FMOD_LOOP_OFF, nullptr, &rawNotes[14]));
|
ERRCHECK(system->createSound("media/notes/A2.wav", FMOD_LOOP_OFF, nullptr,
|
||||||
|
&rawNotes[7]));
|
||||||
|
ERRCHECK(system->createSound("media/notes/B2.wav", FMOD_LOOP_OFF, nullptr,
|
||||||
|
&rawNotes[8]));
|
||||||
|
ERRCHECK(system->createSound("media/notes/C2.wav", FMOD_LOOP_OFF, nullptr,
|
||||||
|
&rawNotes[9]));
|
||||||
|
ERRCHECK(system->createSound("media/notes/D2.wav", FMOD_LOOP_OFF, nullptr,
|
||||||
|
&rawNotes[10]));
|
||||||
|
ERRCHECK(system->createSound("media/notes/E2.wav", FMOD_LOOP_OFF, nullptr,
|
||||||
|
&rawNotes[11]));
|
||||||
|
ERRCHECK(system->createSound("media/notes/F2.wav", FMOD_LOOP_OFF, nullptr,
|
||||||
|
&rawNotes[12]));
|
||||||
|
ERRCHECK(system->createSound("media/notes/G2.wav", FMOD_LOOP_OFF, nullptr,
|
||||||
|
&rawNotes[13]));
|
||||||
|
ERRCHECK(system->createSound("media/notes/A3.wav", FMOD_LOOP_OFF, nullptr,
|
||||||
|
&rawNotes[14]));
|
||||||
for (int i = 0; i < 15; i += 1) {
|
for (int i = 0; i < 15; i += 1) {
|
||||||
notes.push_back(std::unique_ptr<FMOD::Sound>(rawNotes[i]));
|
notes.push_back(std::unique_ptr<FMOD::Sound>(rawNotes[i]));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
index_note = firstNote();
|
index_note = firstNote();
|
||||||
|
|
||||||
rythmes = {
|
rythmes = {
|
||||||
{0,2,4,6},
|
{0, 2, 4, 6},
|
||||||
{0,1,2,3,4,5,6,7},
|
{0, 1, 2, 3, 4, 5, 6, 7},
|
||||||
{0,0.5,1,1.5,2,3,4,5,6,7},
|
{0, 0.5, 1, 1.5, 2, 3, 4, 5, 6, 7},
|
||||||
{0,0.5,1,1.5,2,2.5,3,3.5,4,4.5,5,5.5,6,6.5,7,7.5},
|
{0, 0.5, 1, 1.5, 2, 2.5, 3, 3.5, 4, 4.5, 5, 5.5, 6, 6.5, 7, 7.5},
|
||||||
{0,0.5,1,2,2.5,3,4,4.5,5,6,6.5,7},
|
{0, 0.5, 1, 2, 2.5, 3, 4, 4.5, 5, 6, 6.5, 7},
|
||||||
{0.5,1,1.5,2,3.5,4,4.5,5,6.5,7,7.5},
|
{0.5, 1, 1.5, 2, 3.5, 4, 4.5, 5, 6.5, 7, 7.5},
|
||||||
{0,1,2.5,3,4,5,5.5,6.5,7,7.5},
|
{0, 1, 2.5, 3, 4, 5, 5.5, 6.5, 7, 7.5},
|
||||||
{0,0.75,1.5,2.5,3,3.5,5,5.5},
|
{0, 0.75, 1.5, 2.5, 3, 3.5, 5, 5.5},
|
||||||
{0,0.5,1,1.5,2,3,4,4.5,5,6,6.5,7,7.5},
|
{0, 0.5, 1, 1.5, 2, 3, 4, 4.5, 5, 6, 6.5, 7, 7.5},
|
||||||
{0,0.5,1,1.5,2.5,3.5,4,5,6,7},
|
{0, 0.5, 1, 1.5, 2.5, 3.5, 4, 5, 6, 7},
|
||||||
{0,1.5,3,4,5.5,7},
|
{0, 1.5, 3, 4, 5.5, 7},
|
||||||
{0,0.5,1.5,2,3,4,4.5,5.5,6,7},
|
{0, 0.5, 1.5, 2, 3, 4, 4.5, 5.5, 6, 7},
|
||||||
{0.5,1,1.5,2,2.75,3.5,4.5,5,5.5,6,6.5,7,7.5},
|
{0.5, 1, 1.5, 2, 2.75, 3.5, 4.5, 5, 5.5, 6, 6.5, 7, 7.5},
|
||||||
{0,0.75,1.5,2,2.75,3.5,4,4.5,5,5.5,6,7,7.5},
|
{0, 0.75, 1.5, 2, 2.75, 3.5, 4, 4.5, 5, 5.5, 6, 7, 7.5},
|
||||||
{0,0.5,1.5,2,3,3.5,4.5,5,6,6.5,7.5},
|
{0, 0.5, 1.5, 2, 3, 3.5, 4.5, 5, 6, 6.5, 7.5},
|
||||||
{0,1,2,2.75,3.5,4.5,5,5.5,6,6.75,7.5},
|
{0, 1, 2, 2.75, 3.5, 4.5, 5, 5.5, 6, 6.75, 7.5},
|
||||||
{0.5,1,1.5,2,2.5,3.5,4.5,5,5.5,6,6.5,7},
|
{0.5, 1, 1.5, 2, 2.5, 3.5, 4.5, 5, 5.5, 6, 6.5, 7},
|
||||||
{0,1,1.5,2,2.5,3,3.5,4,5.5,7},
|
{0, 1, 1.5, 2, 2.5, 3, 3.5, 4, 5.5, 7},
|
||||||
{0,1.5,2.5,3,4,5.5,6.5,7},
|
{0, 1.5, 2.5, 3, 4, 5.5, 6.5, 7},
|
||||||
{0,1.5,3,3.5,4,5.5,7},
|
{0, 1.5, 3, 3.5, 4, 5.5, 7},
|
||||||
{0,0.5,1.5,2,2.5,3.5,4,4.5,5,5.5},
|
{0, 0.5, 1.5, 2, 2.5, 3.5, 4, 4.5, 5, 5.5},
|
||||||
{0,0.5,1,2,2.5,3,4,4.5,5,6,6.5,7},
|
{0, 0.5, 1, 2, 2.5, 3, 4, 4.5, 5, 6, 6.5, 7},
|
||||||
{0,1.5,3,4.5,6,7},
|
{0, 1.5, 3, 4.5, 6, 7},
|
||||||
{0,0.5,1,1.5,2.5,3,3.5,4,4.5,5,5.5,6.5,7,7.5},
|
{0, 0.5, 1, 1.5, 2.5, 3, 3.5, 4, 4.5, 5, 5.5, 6.5, 7, 7.5},
|
||||||
{1,2,3.5,4},
|
{1, 2, 3.5, 4},
|
||||||
{0,1.5,3,4,5.5,7},
|
{0, 1.5, 3, 4, 5.5, 7},
|
||||||
{0,2,2.5,3,3.5,4.5,5.5,6.5,7},
|
{0, 2, 2.5, 3, 3.5, 4.5, 5.5, 6.5, 7},
|
||||||
{0.5,1,1.5,2,3.5,4,4.5,5,5.5,6,6.5,7},
|
{0.5, 1, 1.5, 2, 3.5, 4, 4.5, 5, 5.5, 6, 6.5, 7},
|
||||||
{0,0.5,1,1.5,3,4,4.5,5,5.5,7},
|
{0, 0.5, 1, 1.5, 3, 4, 4.5, 5, 5.5, 7},
|
||||||
};
|
};
|
||||||
|
|
||||||
markov_matrix_chords = {
|
markov_matrix_chords = {{0, 0.10, 0.00, 0.40, 0.35, 0.15, 0.00},
|
||||||
{0, 0.10, 0.00, 0.40, 0.35, 0.15, 0.00},
|
|
||||||
// Depuis ii (1)
|
// Depuis ii (1)
|
||||||
{0.10, 0, 0.00, 0.25, 0.65, 0.00, 0.00},
|
{0.10, 0, 0.00, 0.25, 0.65, 0.00, 0.00},
|
||||||
// Depuis iii (2)
|
// Depuis iii (2)
|
||||||
|
@ -114,41 +136,53 @@ AudioEmitter::AudioEmitter() {
|
||||||
// Depuis vi (5)
|
// Depuis vi (5)
|
||||||
{0.15, 0.15, 0.00, 0.45, 0.25, 0, 0.00},
|
{0.15, 0.15, 0.00, 0.45, 0.25, 0, 0.00},
|
||||||
// Depuis vii° (6)
|
// Depuis vii° (6)
|
||||||
{0.80, 0.00, 0.00, 0.00, 0.20, 0.00, 0.00}
|
{0.80, 0.00, 0.00, 0.00, 0.20, 0.00, 0.00}};
|
||||||
};
|
|
||||||
|
|
||||||
markov_matrix_melody = {
|
markov_matrix_melody = {// A1 (0)
|
||||||
// A1 (0)
|
{0.05, 0.30, 0.25, 0.15, 0.10, 0.05, 0.03, 0.02, 0.02,
|
||||||
{0.05, 0.30, 0.25, 0.15, 0.10, 0.05, 0.03, 0.02, 0.02, 0.01, 0.01, 0.00, 0.00, 0.00, 0.00},
|
0.01, 0.01, 0.00, 0.00, 0.00, 0.00},
|
||||||
// B1 (1)
|
// B1 (1)
|
||||||
{0.20, 0.05, 0.30, 0.20, 0.10, 0.05, 0.03, 0.02, 0.02, 0.01, 0.01, 0.00, 0.00, 0.00, 0.00},
|
{0.20, 0.05, 0.30, 0.20, 0.10, 0.05, 0.03, 0.02, 0.02,
|
||||||
|
0.01, 0.01, 0.00, 0.00, 0.00, 0.00},
|
||||||
// C2 (2)
|
// C2 (2)
|
||||||
{0.10, 0.20, 0.05, 0.30, 0.15, 0.10, 0.05, 0.02, 0.02, 0.01, 0.00, 0.00, 0.00, 0.00, 0.00},
|
{0.10, 0.20, 0.05, 0.30, 0.15, 0.10, 0.05, 0.02, 0.02,
|
||||||
|
0.01, 0.00, 0.00, 0.00, 0.00, 0.00},
|
||||||
// D2 (3)
|
// D2 (3)
|
||||||
{0.05, 0.15, 0.20, 0.05, 0.30, 0.15, 0.05, 0.03, 0.02, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00},
|
{0.05, 0.15, 0.20, 0.05, 0.30, 0.15, 0.05, 0.03, 0.02,
|
||||||
|
0.00, 0.00, 0.00, 0.00, 0.00, 0.00},
|
||||||
// E2 (4)
|
// E2 (4)
|
||||||
{0.03, 0.07, 0.15, 0.20, 0.05, 0.25, 0.15, 0.07, 0.03, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00},
|
{0.03, 0.07, 0.15, 0.20, 0.05, 0.25, 0.15, 0.07, 0.03,
|
||||||
|
0.00, 0.00, 0.00, 0.00, 0.00, 0.00},
|
||||||
// F2 (5)
|
// F2 (5)
|
||||||
{0.02, 0.05, 0.10, 0.15, 0.20, 0.05, 0.25, 0.15, 0.05, 0.02, 0.01, 0.00, 0.00, 0.00, 0.00},
|
{0.02, 0.05, 0.10, 0.15, 0.20, 0.05, 0.25, 0.15, 0.05,
|
||||||
|
0.02, 0.01, 0.00, 0.00, 0.00, 0.00},
|
||||||
// G2 (6)
|
// G2 (6)
|
||||||
{0.01, 0.03, 0.07, 0.10, 0.15, 0.20, 0.05, 0.25, 0.10, 0.03, 0.01, 0.00, 0.00, 0.00, 0.00},
|
{0.01, 0.03, 0.07, 0.10, 0.15, 0.20, 0.05, 0.25, 0.10,
|
||||||
|
0.03, 0.01, 0.00, 0.00, 0.00, 0.00},
|
||||||
// A2 (7) - Centre tonal
|
// A2 (7) - Centre tonal
|
||||||
{0.00, 0.02, 0.05, 0.10, 0.15, 0.20, 0.25, 0.05, 0.15, 0.05, 0.02, 0.01, 0.00, 0.00, 0.00},
|
{0.00, 0.02, 0.05, 0.10, 0.15, 0.20, 0.25, 0.05, 0.15,
|
||||||
|
0.05, 0.02, 0.01, 0.00, 0.00, 0.00},
|
||||||
// B2 (8)
|
// B2 (8)
|
||||||
{0.00, 0.00, 0.01, 0.03, 0.07, 0.15, 0.20, 0.25, 0.05, 0.20, 0.10, 0.05, 0.03, 0.01, 0.00},
|
{0.00, 0.00, 0.01, 0.03, 0.07, 0.15, 0.20, 0.25, 0.05,
|
||||||
|
0.20, 0.10, 0.05, 0.03, 0.01, 0.00},
|
||||||
// C3 (9)
|
// C3 (9)
|
||||||
{0.00, 0.00, 0.00, 0.02, 0.05, 0.10, 0.15, 0.20, 0.25, 0.05, 0.20, 0.15, 0.07, 0.03, 0.01},
|
{0.00, 0.00, 0.00, 0.02, 0.05, 0.10, 0.15, 0.20, 0.25,
|
||||||
|
0.05, 0.20, 0.15, 0.07, 0.03, 0.01},
|
||||||
// D3 (10)
|
// D3 (10)
|
||||||
{0.00, 0.00, 0.00, 0.00, 0.03, 0.07, 0.10, 0.15, 0.20, 0.25, 0.05, 0.25, 0.15, 0.07, 0.03},
|
{0.00, 0.00, 0.00, 0.00, 0.03, 0.07, 0.10, 0.15, 0.20,
|
||||||
|
0.25, 0.05, 0.25, 0.15, 0.07, 0.03},
|
||||||
// E3 (11)
|
// E3 (11)
|
||||||
{0.00, 0.00, 0.00, 0.00, 0.00, 0.02, 0.05, 0.10, 0.15, 0.20, 0.25, 0.05, 0.20, 0.15, 0.08},
|
{0.00, 0.00, 0.00, 0.00, 0.00, 0.02, 0.05, 0.10, 0.15,
|
||||||
|
0.20, 0.25, 0.05, 0.20, 0.15, 0.08},
|
||||||
// F3 (12)
|
// F3 (12)
|
||||||
{0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.03, 0.07, 0.10, 0.15, 0.20, 0.25, 0.05, 0.25, 0.15},
|
{0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.03, 0.07, 0.10,
|
||||||
|
0.15, 0.20, 0.25, 0.05, 0.25, 0.15},
|
||||||
// G3 (13)
|
// G3 (13)
|
||||||
{0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.02, 0.05, 0.10, 0.15, 0.20, 0.25, 0.05, 0.28},
|
{0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.02, 0.05,
|
||||||
|
0.10, 0.15, 0.20, 0.25, 0.05, 0.28},
|
||||||
// A3 (14)
|
// A3 (14)
|
||||||
{0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.03, 0.07, 0.10, 0.15, 0.20, 0.25, 0.05}
|
{0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.03,
|
||||||
};
|
0.07, 0.10, 0.15, 0.20, 0.25, 0.05}};
|
||||||
|
|
||||||
chordProgression.resize(4);
|
chordProgression.resize(4);
|
||||||
|
|
||||||
|
@ -159,24 +193,25 @@ AudioEmitter::AudioEmitter() {
|
||||||
chordProgression[i] = chord;
|
chordProgression[i] = chord;
|
||||||
}
|
}
|
||||||
|
|
||||||
FMOD::Sound* metronome_Sound;
|
FMOD::Sound *metronome_Sound;
|
||||||
ERRCHECK(system->createSound("media/notes/A1.wav", FMOD_DEFAULT, nullptr, &metronome_Sound));
|
ERRCHECK(system->createSound("media/notes/A1.wav", FMOD_DEFAULT, nullptr,
|
||||||
|
&metronome_Sound));
|
||||||
ERRCHECK(system->playSound(metronome_Sound, nullptr, true, &timer));
|
ERRCHECK(system->playSound(metronome_Sound, nullptr, true, &timer));
|
||||||
ERRCHECK(timer->setVolume(0));
|
ERRCHECK(timer->setVolume(0));
|
||||||
ERRCHECK(timer->setPaused(false));
|
ERRCHECK(timer->setPaused(false));
|
||||||
}
|
}
|
||||||
|
|
||||||
int AudioEmitter::firstChord() {
|
int AudioEmitter::firstChord() {
|
||||||
std::vector<int> possibleChords = { 1,5,6 };
|
std::vector<int> possibleChords = {1, 5, 6};
|
||||||
return possibleChords[rand() % possibleChords.size()] - 1;
|
return possibleChords[rand() % possibleChords.size()] - 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
int AudioEmitter::firstNote() {
|
int AudioEmitter::firstNote() {
|
||||||
std::vector<int> possibleNotes = { 4,5,6,7,8,9,10,11 };
|
std::vector<int> possibleNotes = {4, 5, 6, 7, 8, 9, 10, 11};
|
||||||
return possibleNotes[rand() % possibleNotes.size()];
|
return possibleNotes[rand() % possibleNotes.size()];
|
||||||
}
|
}
|
||||||
|
|
||||||
int sampleIndex(const std::vector<float>& probabilities) {
|
int sampleIndex(const std::vector<float> &probabilities) {
|
||||||
// Créer un générateur aléatoire
|
// Créer un générateur aléatoire
|
||||||
static std::random_device rd;
|
static std::random_device rd;
|
||||||
static std::mt19937 gen(rd());
|
static std::mt19937 gen(rd());
|
||||||
|
@ -188,9 +223,11 @@ int sampleIndex(const std::vector<float>& probabilities) {
|
||||||
return dist(gen);
|
return dist(gen);
|
||||||
}
|
}
|
||||||
|
|
||||||
int randomWeightedChoice(const std::vector<int>& values, const std::vector<double>& weights) {
|
int randomWeightedChoice(const std::vector<int> &values,
|
||||||
|
const std::vector<double> &weights) {
|
||||||
if (values.size() != weights.size() || values.empty()) {
|
if (values.size() != weights.size() || values.empty()) {
|
||||||
throw std::invalid_argument("Les tableaux doivent être de même taille et non vides.");
|
throw std::invalid_argument(
|
||||||
|
"Les tableaux doivent être de même taille et non vides.");
|
||||||
}
|
}
|
||||||
|
|
||||||
// Calcul de la somme totale des poids
|
// Calcul de la somme totale des poids
|
||||||
|
@ -227,8 +264,9 @@ int AudioEmitter::nextNote(int currentNote) {
|
||||||
}
|
}
|
||||||
|
|
||||||
int AudioEmitter::noteSecondaire(int note) {
|
int AudioEmitter::noteSecondaire(int note) {
|
||||||
std::vector<int> notesPossibles = { note - 4,note - 3,note + 3,note + 4,note + 5 };
|
std::vector<int> notesPossibles = {note - 4, note - 3, note + 3, note + 4,
|
||||||
std::vector<double> proba = { 0.05,0.10,0.60,0.05,0.2 };
|
note + 5};
|
||||||
|
std::vector<double> proba = {0.05, 0.10, 0.60, 0.05, 0.2};
|
||||||
for (int i = 0; i < proba.size(); i += 1) {
|
for (int i = 0; i < proba.size(); i += 1) {
|
||||||
if ((notesPossibles[i] < 0) || (notesPossibles[i] >= notes.size())) {
|
if ((notesPossibles[i] < 0) || (notesPossibles[i] >= notes.size())) {
|
||||||
proba[i] = 0;
|
proba[i] = 0;
|
||||||
|
@ -250,40 +288,47 @@ void AudioEmitter::generateMusic() {
|
||||||
}
|
}
|
||||||
chordProgression[0] = nextChord(chordProgression[3]);
|
chordProgression[0] = nextChord(chordProgression[3]);
|
||||||
for (int i = 1; i < 4; i += 1) {
|
for (int i = 1; i < 4; i += 1) {
|
||||||
chordProgression[i] = nextChord(chordProgression[i-1]);
|
chordProgression[i] = nextChord(chordProgression[i - 1]);
|
||||||
}
|
}
|
||||||
int index_drums = rand() % 3;
|
int index_drums = rand() % 3;
|
||||||
int second_melody = 1; //Pas de seconde mélodie
|
int second_melody = 1; // Pas de seconde mélodie
|
||||||
for (int i = current_beat; i < current_beat + nbr_melo_max; i += 1) {
|
for (int i = current_beat; i < current_beat + nbr_melo_max; i += 1) {
|
||||||
//Chords
|
// Chords
|
||||||
FMOD::Channel* channelChords = nullptr;
|
FMOD::Channel *channelChords = nullptr;
|
||||||
int index_chord = chordProgression[i % 4];
|
int index_chord = chordProgression[i % 4];
|
||||||
ERRCHECK(system->playSound(chords[index_chord].get(), nullptr, true, &channelChords));
|
ERRCHECK(system->playSound(chords[index_chord].get(), nullptr, true,
|
||||||
|
&channelChords));
|
||||||
|
|
||||||
unsigned long long delay = (unsigned long long)(i * beatDuration * sampleRate);
|
unsigned long long delay =
|
||||||
|
(unsigned long long)(i * beatDuration * sampleRate);
|
||||||
ERRCHECK(channelChords->setDelay(delay, 0, true));
|
ERRCHECK(channelChords->setDelay(delay, 0, true));
|
||||||
ERRCHECK(channelChords->setPaused(false));
|
ERRCHECK(channelChords->setPaused(false));
|
||||||
|
|
||||||
activeChannels.push_back(channelChords);
|
activeChannels.push_back(channelChords);
|
||||||
//Drums
|
// Drums
|
||||||
FMOD::Channel* channelDrums = nullptr;
|
FMOD::Channel *channelDrums = nullptr;
|
||||||
ERRCHECK(system->playSound(drums[index_drums].get(), nullptr, true, &channelDrums));
|
ERRCHECK(system->playSound(drums[index_drums].get(), nullptr, true,
|
||||||
|
&channelDrums));
|
||||||
ERRCHECK(channelDrums->setDelay(delay, 0, true));
|
ERRCHECK(channelDrums->setDelay(delay, 0, true));
|
||||||
ERRCHECK(channelDrums->setPaused(false));
|
ERRCHECK(channelDrums->setPaused(false));
|
||||||
|
|
||||||
activeChannels.push_back(channelDrums);
|
activeChannels.push_back(channelDrums);
|
||||||
//Mélodie
|
// Mélodie
|
||||||
std::vector<float> rythme_melodie = rythmes[rand() % rythmes.size()];
|
std::vector<float> rythme_melodie = rythmes[rand() % rythmes.size()];
|
||||||
for (float time : rythme_melodie) {
|
for (float time : rythme_melodie) {
|
||||||
FMOD::Channel* channelNote = nullptr;
|
FMOD::Channel *channelNote = nullptr;
|
||||||
ERRCHECK(system->playSound(notes[index_note].get(), nullptr, true, &channelNote));
|
ERRCHECK(system->playSound(notes[index_note].get(), nullptr, true,
|
||||||
unsigned long long delayNote = (unsigned long long)((i + time / 8.f) * beatDuration * sampleRate);
|
&channelNote));
|
||||||
|
unsigned long long delayNote =
|
||||||
|
(unsigned long long)((i + time / 8.f) * beatDuration * sampleRate);
|
||||||
ERRCHECK(channelNote->setDelay(delayNote, 0, true));
|
ERRCHECK(channelNote->setDelay(delayNote, 0, true));
|
||||||
ERRCHECK(channelNote->setPaused(false));
|
ERRCHECK(channelNote->setPaused(false));
|
||||||
if (second_melody == 0) {
|
if (second_melody == 0) {
|
||||||
FMOD::Channel* channelNoteSec = nullptr;
|
FMOD::Channel *channelNoteSec = nullptr;
|
||||||
ERRCHECK(system->playSound(notes[noteSecondaire(index_note)].get(), nullptr, true, &channelNoteSec));
|
ERRCHECK(system->playSound(notes[noteSecondaire(index_note)].get(),
|
||||||
unsigned long long delayNote = (unsigned long long)((i + time / 8.f) * beatDuration * sampleRate);
|
nullptr, true, &channelNoteSec));
|
||||||
|
unsigned long long delayNote =
|
||||||
|
(unsigned long long)((i + time / 8.f) * beatDuration * sampleRate);
|
||||||
ERRCHECK(channelNoteSec->setDelay(delayNote, 0, true));
|
ERRCHECK(channelNoteSec->setDelay(delayNote, 0, true));
|
||||||
ERRCHECK(channelNoteSec->setPaused(false));
|
ERRCHECK(channelNoteSec->setPaused(false));
|
||||||
activeChannels.push_back(channelNoteSec);
|
activeChannels.push_back(channelNoteSec);
|
||||||
|
@ -295,12 +340,10 @@ void AudioEmitter::generateMusic() {
|
||||||
current_beat += nbr_melo_max;
|
current_beat += nbr_melo_max;
|
||||||
}
|
}
|
||||||
|
|
||||||
void AudioEmitter::audioUpdate() {
|
void AudioEmitter::audioUpdate() { system->update(); }
|
||||||
system->update();
|
|
||||||
}
|
|
||||||
|
|
||||||
void AudioEmitter::audioEnd() {
|
void AudioEmitter::audioEnd() {
|
||||||
for (FMOD::Channel* c : activeChannels) {
|
for (FMOD::Channel *c : activeChannels) {
|
||||||
delete c;
|
delete c;
|
||||||
}
|
}
|
||||||
timer->stop();
|
timer->stop();
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
#include "Game.hpp"
|
#include "Game.hpp"
|
||||||
#include <string>
|
|
||||||
#include <iostream>
|
#include <iostream>
|
||||||
#include <math.h>
|
#include <math.h>
|
||||||
|
#include <string>
|
||||||
|
|
||||||
const sf::Time Game::TimePerFrame = sf::seconds(1.f / 60.f);
|
const sf::Time Game::TimePerFrame = sf::seconds(1.f / 60.f);
|
||||||
|
|
||||||
|
@ -24,7 +24,8 @@ void Game::run() {
|
||||||
sf::Time elapsedTime = clock.restart();
|
sf::Time elapsedTime = clock.restart();
|
||||||
timeSinceLastUpdate += elapsedTime;
|
timeSinceLastUpdate += elapsedTime;
|
||||||
while (timeSinceLastUpdate > TimePerFrame) {
|
while (timeSinceLastUpdate > TimePerFrame) {
|
||||||
if (32.f - fmod(audioEmitter.getTime(), 32.f) < audioEmitter.timeBeforeNewGeneration) {
|
if (32.f - fmod(audioEmitter.getTime(), 32.f) <
|
||||||
|
audioEmitter.timeBeforeNewGeneration) {
|
||||||
if (!generated) {
|
if (!generated) {
|
||||||
audioEmitter.generateMusic();
|
audioEmitter.generateMusic();
|
||||||
generated = true;
|
generated = true;
|
||||||
|
@ -44,7 +45,7 @@ void Game::run() {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void Game::processEvents(AudioEmitter& audioEmitter) {
|
void Game::processEvents(AudioEmitter &audioEmitter) {
|
||||||
while (const std::optional event = mWindow.pollEvent()) {
|
while (const std::optional event = mWindow.pollEvent()) {
|
||||||
if (const auto *keyPressed = event->getIf<sf::Event::KeyPressed>()) {
|
if (const auto *keyPressed = event->getIf<sf::Event::KeyPressed>()) {
|
||||||
mTarget.handlePlayerInput(keyPressed->code, true);
|
mTarget.handlePlayerInput(keyPressed->code, true);
|
||||||
|
@ -67,10 +68,10 @@ void Game::render() {
|
||||||
mWindow.display();
|
mWindow.display();
|
||||||
}
|
}
|
||||||
|
|
||||||
void Game::updateStatistics(AudioEmitter& audioEmitter) {
|
void Game::updateStatistics(AudioEmitter &audioEmitter) {
|
||||||
mStatisticsText.setString(std::format(
|
mStatisticsText.setString(std::format(
|
||||||
"Mesure = {}\nBeat = {} us", ceil(audioEmitter.getTime()/8.f),
|
"Mesure = {}\nBeat = {} us", ceil(audioEmitter.getTime() / 8.f),
|
||||||
ceil(fmod(audioEmitter.getTime(),8.f))));
|
ceil(fmod(audioEmitter.getTime(), 8.f))));
|
||||||
|
|
||||||
mStatisticsUpdateTime -= sf::seconds(1.0f);
|
mStatisticsUpdateTime -= sf::seconds(1.0f);
|
||||||
mStatisticsNumFrames = 0;
|
mStatisticsNumFrames = 0;
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue