mirror of
https://github.com/nacabaro/nacapet.git
synced 2026-06-05 14:02:53 +00:00
Improve sound system thing in here
This commit is contained in:
parent
3de6c121a5
commit
79d60e7201
98
src/sound/sound.cpp
Normal file
98
src/sound/sound.cpp
Normal file
@ -0,0 +1,98 @@
|
||||
#include "sound.h"
|
||||
#include "defs/defs.h"
|
||||
|
||||
static const Note* currentMelody = nullptr;
|
||||
|
||||
static uint16_t melodyLength = 0;
|
||||
static uint16_t currentNote = 0;
|
||||
|
||||
static bool playing = false;
|
||||
|
||||
static unsigned long nextNoteTime = 0;
|
||||
|
||||
void sound_init() {
|
||||
pinMode(SPK_PIN, OUTPUT);
|
||||
}
|
||||
|
||||
void sound_playTone(uint16_t frequency, uint16_t duration) {
|
||||
if (!soundEnabled) { return; }
|
||||
|
||||
currentMelody = nullptr;
|
||||
melodyLength = 0;
|
||||
currentNote = 0;
|
||||
|
||||
if (frequency == 0) {
|
||||
noTone(SPK_PIN);
|
||||
} else {
|
||||
tone(SPK_PIN, frequency, duration);
|
||||
}
|
||||
|
||||
playing = true;
|
||||
nextNoteTime = millis() + duration;
|
||||
}
|
||||
|
||||
void sound_playMelody(const Note* melody, uint16_t noteCount) {
|
||||
if (!soundEnabled) { return; }
|
||||
|
||||
if (melody == nullptr || noteCount == 0) {
|
||||
return;
|
||||
}
|
||||
|
||||
currentMelody = melody;
|
||||
melodyLength = noteCount;
|
||||
currentNote = 0;
|
||||
playing = true;
|
||||
nextNoteTime = 0;
|
||||
}
|
||||
|
||||
void sound_stop() {
|
||||
noTone(SPK_PIN);
|
||||
playing = false;
|
||||
currentMelody = nullptr;
|
||||
melodyLength = 0;
|
||||
currentNote = 0;
|
||||
}
|
||||
|
||||
bool sound_isPlaying() {
|
||||
return playing;
|
||||
}
|
||||
|
||||
void sound_update() {
|
||||
if (!soundEnabled) {
|
||||
sound_stop();
|
||||
return;
|
||||
}
|
||||
|
||||
if (!playing) {
|
||||
return;
|
||||
}
|
||||
|
||||
if (currentMelody == nullptr) {
|
||||
if (millis() >= nextNoteTime) {
|
||||
sound_stop();
|
||||
}
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
if (millis() < nextNoteTime) {
|
||||
return;
|
||||
}
|
||||
|
||||
if (currentNote >= melodyLength) {
|
||||
sound_stop();
|
||||
return;
|
||||
}
|
||||
|
||||
const Note& note = currentMelody[currentNote];
|
||||
|
||||
if (note.frequency == 0) {
|
||||
noTone(SPK_PIN);
|
||||
} else {
|
||||
tone(SPK_PIN, note.frequency, note.duration);
|
||||
}
|
||||
|
||||
nextNoteTime = millis() + note.duration;
|
||||
|
||||
currentNote++;
|
||||
}
|
||||
15
src/sound/sound.h
Normal file
15
src/sound/sound.h
Normal file
@ -0,0 +1,15 @@
|
||||
#pragma once
|
||||
|
||||
#include <Arduino.h>
|
||||
|
||||
struct Note {
|
||||
uint16_t frequency;
|
||||
uint16_t duration;
|
||||
};
|
||||
|
||||
void sound_init();
|
||||
void sound_update();
|
||||
void sound_playTone(uint16_t frequency, uint16_t duration);
|
||||
void sound_playMelody(const Note* melody, uint16_t noteCount);
|
||||
void sound_stop();
|
||||
bool sound_isPlaying();
|
||||
Loading…
x
Reference in New Issue
Block a user