2022-07-13 14:30:59 +02:00

136 lines
2.5 KiB
C

#pragma once
#include <Audio.h>
#include "WORDS.h"
static int time_interval_random_start = 2000;
typedef void(*synth_toggle_cb)(bool, int);
void _random_wav(AudioPlaySdWav* wav, E_WORDS* e_words, int MAX_WORD) {
int w = (int)random(0, MAX_WORD);
wav->play(words[e_words[w]]);
}
enum WAVPLAY_STATE {
LATIN, ENGLISH, RANDOM, NONE
};
typedef struct WAVPLAY_t {
int pin;
AudioPlaySdWav* wav;
E_PHRASES en_phrase;
E_PHRASES la_phrase;
E_WORDS* random_words;
int nbr_random_words;
synth_toggle_cb synth_toggle_func = NULL;
long random_start;
WAVPLAY_STATE state;
WAVPLAY_t(const int p, AudioPlaySdWav* w, E_PHRASES en, E_PHRASES la, E_WORDS* wds, int nbr_wds, synth_toggle_cb synth_func) {
pin = p;
wav = w;
en_phrase = en;
la_phrase = la;
random_words = wds;
nbr_random_words = nbr_wds;
state = NONE;
synth_toggle_func = synth_func;
}
void play(){
switch(state) {
case NONE:
wav->play(phrases[la_phrase]);
delay(25);
state = LATIN;
// Serial.println("state none > latin");
break;
default:
break;
}
}
void stop(){
wav->stop();
if(state == RANDOM) synth_toggle_func(false, pin);
state = NONE;
}
void update(){
if(state == NONE) return;
if(wav->isPlaying()) {
// Serial.println("...");
return;
}
switch(state) {
case LATIN:
wav->play(phrases[en_phrase]);
state = ENGLISH;
// Serial.println("state latin > english");
break;
case ENGLISH:
// _random_wav(wav, random_words, nbr_random_words);
state = RANDOM;
random_start = millis();
synth_toggle_func(true, pin);
// Serial.println("state english > random");
break;
case RANDOM:
if(millis() - random_start > time_interval_random_start) {
_random_wav(wav, random_words, nbr_random_words);
// Serial.println("random");
}
break;
default:
break;
}
}
};
typedef struct DETUNE_t {
AudioSynthWaveformSine sine3;
AudioSynthWaveformSine sine2;
AudioSynthWaveformSine sine1;
int base_freq = 0;
DETUNE_t(int freq) {
set_frequency(freq);
}
void set_frequency(int freq) {
sine1.frequency(freq);
sine2.frequency(freq);
sine3.frequency(freq);
base_freq = freq;
}
void set_detune(float detune) {
int det_mid = (int)(detune/2.0);
sine2.frequency(base_freq + det_mid);
if(detune > 100)
sine3.frequency(base_freq - det_mid);
else
sine3.frequency(base_freq - 2 * det_mid);
int r = (int)random(0, 100);
if(r > 33)
sine1.frequency(det_mid/2);
}
};