#include <MozziGuts.h>
#include <Oscil.h>
#include <tables/sin2048_int8.h> // Волновая таблица
#include <EventDelay.h>
#define PIN_11 11
#define PIN_12 12
// Осцилляторы для двух голосов
Oscil<SIN2048_NUM_CELLS, AUDIO_RATE> osc1(SIN2048_DATA);
Oscil<SIN2048_NUM_CELLS, AUDIO_RATE> osc2(SIN2048_DATA);
// Мелодии
const int melody12[] = {NOTE_D5, NOTE_A5, NOTE_FS5, NOTE_D5, NOTE_E5, NOTE_FS5, NOTE_G5, NOTE_FS5, NOTE_E5, NOTE_FS5, NOTE_D5};
const int melody11[] = {NOTE_E5, NOTE_G5, NOTE_E6, NOTE_C6};
// Таймеры и состояния
EventDelay melodyTimer;
byte currentNoteIndex11 = 0;
byte currentNoteIndex12 = 0;
bool playMelody11 = false;
bool playMelody12 = false;
unsigned long pin12StartTime = 0;
void setup() {
pinMode(PIN_11, INPUT_PULLUP);
pinMode(PIN_12, INPUT_PULLUP);
startMozzi();
melodyTimer.set(200); // Интервал между нотами
}
void updateControl() {
// Обработка пина 11
if (digitalRead(PIN_11) == LOW) {
playMelody12 = false;
playMelody11 = true;
currentNoteIndex11 = 0;
melodyTimer.start();
}
// Обработка пина 12
static bool pin12Active = false;
if (digitalRead(PIN_12) == LOW) {
if (!pin12Active) {
pin12StartTime = millis();
pin12Active = true;
}
else if (millis() - pin12StartTime >= 3000) {
playMelody11 = false;
playMelody12 = true;
currentNoteIndex12 = 0;
melodyTimer.start();
}
}
else {
pin12Active = false;
}
// Управление нотами
if (melodyTimer.ready()) {
if (playMelody11 && currentNoteIndex11 < sizeof(melody11)/sizeof(int)) {
osc1.setFreq(melody11[currentNoteIndex11++]);
melodyTimer.set(wholenoteDuration(melody11[currentNoteIndex11]));
if (currentNoteIndex11 >= sizeof(melody11)/sizeof(int)) playMelody11 = false;
}
if (playMelody12 && currentNoteIndex12 < sizeof(melody12)/sizeof(int)) {
osc2.setFreq(melody12[currentNoteIndex12++]);
melodyTimer.set(wholenoteDuration(melody12[currentNoteIndex12]));
if (currentNoteIndex12 >= sizeof(melody12)/sizeof(int)) playMelody12 = false;
}
}
}
int updateAudio() {
return (osc1.next() + osc2.next()) >> 2; // Микшируем два голоса
}
void loop() {
audioHook(); // Обязательная функция для Mozzi
}
// Вспомогательная функция для расчета длительности
int wholenoteDuration(int noteIndex) {
const int baseTempo = 500; // Настройте под свой темп
return baseTempo * (4.0 / abs(melody[noteIndex + 1]));
}