136 lines
2.5 KiB
C
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);
|
||
|
|
|
||
|
|
}
|
||
|
|
|
||
|
|
};
|
||
|
|
|
||
|
|
|