#pragma once #include #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); } };