602 lines
23 KiB
C
602 lines
23 KiB
C
/**
|
|
* @file SfxDefinitions.h
|
|
* @brief 52 curated SFX definitions for SfxEngine.
|
|
*
|
|
* Implements SfxEngine::loadSound() — mapping SfxId values to note sequences.
|
|
*/
|
|
|
|
#pragma once
|
|
|
|
#include "SfxEngine.h"
|
|
#include "esp_log.h"
|
|
|
|
// Safety macro to prevent buffer overflow
|
|
#define ADD_SFX_NOTE(seq, idx, ...) do { \
|
|
if ((idx) < MAX_SFX_NOTES) { \
|
|
SfxSequenceNote n = __VA_ARGS__; \
|
|
(seq)[(idx)++] = n; \
|
|
} else { \
|
|
ESP_LOGE("SfxDef", "SFX note overflow at index %d", (idx)); \
|
|
} \
|
|
} while(0)
|
|
|
|
inline void SfxEngine::loadSound(SfxId sound) {
|
|
sequenceIndex_ = 0;
|
|
sequenceDelaySamples_ = 0;
|
|
sequenceLength_ = 0;
|
|
|
|
// Stop all voices
|
|
for (int i = 0; i < NUM_VOICES; i++) {
|
|
voices_[i].active = false;
|
|
voices_[i].envStage = EnvelopeStage::Off;
|
|
}
|
|
|
|
switch (sound) {
|
|
|
|
// ── UI Sounds ────────────────────────────────────────────────────────
|
|
|
|
case SfxId::Click:
|
|
{
|
|
int i = 0;
|
|
ADD_SFX_NOTE(sequence_, i, {0, 80, 30, 0, SfxWaveType::Square, 0.3f});
|
|
sequenceLength_ = i;
|
|
}
|
|
break;
|
|
|
|
case SfxId::Confirm:
|
|
{
|
|
int i = 0;
|
|
ADD_SFX_NOTE(sequence_, i, {0, 72, 80, 0, SfxWaveType::Square, 0.35f});
|
|
ADD_SFX_NOTE(sequence_, i, {0, 79, 120, 70, SfxWaveType::Square, 0.4f});
|
|
sequenceLength_ = i;
|
|
}
|
|
break;
|
|
|
|
case SfxId::Cancel:
|
|
{
|
|
int i = 0;
|
|
ADD_SFX_NOTE(sequence_, i, {0, 72, 80, 0, SfxWaveType::Square, 0.35f});
|
|
ADD_SFX_NOTE(sequence_, i, {0, 60, 120, 70, SfxWaveType::Square, 0.3f});
|
|
sequenceLength_ = i;
|
|
}
|
|
break;
|
|
|
|
case SfxId::Error:
|
|
{
|
|
int i = 0;
|
|
ADD_SFX_NOTE(sequence_, i, {0, 48, 150, 0, SfxWaveType::Sawtooth, 0.4f});
|
|
ADD_SFX_NOTE(sequence_, i, {1, 51, 150, 0, SfxWaveType::Sawtooth, 0.3f});
|
|
sequenceLength_ = i;
|
|
}
|
|
break;
|
|
|
|
case SfxId::MenuOpen:
|
|
{
|
|
int i = 0;
|
|
ADD_SFX_NOTE(sequence_, i, {0, 60, 40, 0, SfxWaveType::Pulse25, 0.25f});
|
|
ADD_SFX_NOTE(sequence_, i, {0, 72, 60, 30, SfxWaveType::Pulse25, 0.3f});
|
|
sequenceLength_ = i;
|
|
}
|
|
break;
|
|
|
|
case SfxId::MenuClose:
|
|
{
|
|
int i = 0;
|
|
ADD_SFX_NOTE(sequence_, i, {0, 72, 40, 0, SfxWaveType::Pulse25, 0.25f});
|
|
ADD_SFX_NOTE(sequence_, i, {0, 60, 60, 30, SfxWaveType::Pulse25, 0.2f});
|
|
sequenceLength_ = i;
|
|
}
|
|
break;
|
|
|
|
case SfxId::Toggle:
|
|
{
|
|
int i = 0;
|
|
ADD_SFX_NOTE(sequence_, i, {0, 84, 50, 0, SfxWaveType::Pulse12, 0.3f});
|
|
sequenceLength_ = i;
|
|
}
|
|
break;
|
|
|
|
case SfxId::Slider:
|
|
{
|
|
int i = 0;
|
|
ADD_SFX_NOTE(sequence_, i, {0, 72, 15, 0, SfxWaveType::Pulse25, 0.2f});
|
|
sequenceLength_ = i;
|
|
}
|
|
break;
|
|
|
|
case SfxId::Tab:
|
|
{
|
|
int i = 0;
|
|
ADD_SFX_NOTE(sequence_, i, {0, 67, 50, 0, SfxWaveType::Square, 0.25f});
|
|
ADD_SFX_NOTE(sequence_, i, {0, 72, 70, 40, SfxWaveType::Square, 0.3f});
|
|
sequenceLength_ = i;
|
|
}
|
|
break;
|
|
|
|
// ── TamaTac Pet Sounds ───────────────────────────────────────────────
|
|
|
|
case SfxId::Feed:
|
|
{
|
|
int i = 0;
|
|
ADD_SFX_NOTE(sequence_, i, {0, 72, 80, 0, SfxWaveType::Pulse25, 0.4f});
|
|
ADD_SFX_NOTE(sequence_, i, {0, 76, 80, 80, SfxWaveType::Pulse25, 0.4f});
|
|
ADD_SFX_NOTE(sequence_, i, {0, 79, 100, 80, SfxWaveType::Pulse25, 0.4f});
|
|
sequenceLength_ = i;
|
|
}
|
|
break;
|
|
|
|
case SfxId::Play:
|
|
{
|
|
int i = 0;
|
|
ADD_SFX_NOTE(sequence_, i, {0, 72, 70, 0, SfxWaveType::Square, 0.35f});
|
|
ADD_SFX_NOTE(sequence_, i, {1, 60, 280, 0, SfxWaveType::Triangle, 0.2f});
|
|
ADD_SFX_NOTE(sequence_, i, {0, 76, 70, 70, SfxWaveType::Square, 0.35f});
|
|
ADD_SFX_NOTE(sequence_, i, {0, 79, 70, 70, SfxWaveType::Square, 0.35f});
|
|
ADD_SFX_NOTE(sequence_, i, {0, 84, 100, 70, SfxWaveType::Square, 0.35f});
|
|
sequenceLength_ = i;
|
|
}
|
|
break;
|
|
|
|
case SfxId::Medicine:
|
|
{
|
|
int i = 0;
|
|
ADD_SFX_NOTE(sequence_, i, {0, 72, 200, 0, SfxWaveType::Triangle, 0.4f});
|
|
ADD_SFX_NOTE(sequence_, i, {1, 79, 200, 50, SfxWaveType::Sine, 0.3f});
|
|
sequenceLength_ = i;
|
|
}
|
|
break;
|
|
|
|
case SfxId::Sleep:
|
|
{
|
|
int i = 0;
|
|
ADD_SFX_NOTE(sequence_, i, {0, 79, 200, 0, SfxWaveType::Triangle, 0.35f});
|
|
ADD_SFX_NOTE(sequence_, i, {0, 76, 200, 180, SfxWaveType::Triangle, 0.3f});
|
|
ADD_SFX_NOTE(sequence_, i, {0, 72, 300, 180, SfxWaveType::Triangle, 0.25f});
|
|
sequenceLength_ = i;
|
|
}
|
|
break;
|
|
|
|
case SfxId::Clean:
|
|
{
|
|
int i = 0;
|
|
ADD_SFX_NOTE(sequence_, i, {0, 84, 50, 0, SfxWaveType::Pulse12, 0.35f});
|
|
ADD_SFX_NOTE(sequence_, i, {0, 79, 50, 40, SfxWaveType::Pulse12, 0.3f});
|
|
ADD_SFX_NOTE(sequence_, i, {0, 72, 80, 40, SfxWaveType::Pulse12, 0.25f});
|
|
sequenceLength_ = i;
|
|
}
|
|
break;
|
|
|
|
case SfxId::Evolve:
|
|
{
|
|
int i = 0;
|
|
ADD_SFX_NOTE(sequence_, i, {0, 60, 150, 0, SfxWaveType::Square, 0.4f});
|
|
ADD_SFX_NOTE(sequence_, i, {1, 48, 600, 0, SfxWaveType::Triangle, 0.25f});
|
|
ADD_SFX_NOTE(sequence_, i, {0, 64, 150, 130, SfxWaveType::Square, 0.4f});
|
|
ADD_SFX_NOTE(sequence_, i, {0, 67, 150, 130, SfxWaveType::Square, 0.4f});
|
|
ADD_SFX_NOTE(sequence_, i, {0, 72, 400, 130, SfxWaveType::Square, 0.5f});
|
|
sequenceLength_ = i;
|
|
}
|
|
break;
|
|
|
|
case SfxId::Sick:
|
|
{
|
|
int i = 0;
|
|
ADD_SFX_NOTE(sequence_, i, {0, 72, 100, 0, SfxWaveType::Square, 0.4f});
|
|
ADD_SFX_NOTE(sequence_, i, {0, 60, 100, 150, SfxWaveType::Square, 0.4f});
|
|
ADD_SFX_NOTE(sequence_, i, {0, 72, 100, 150, SfxWaveType::Square, 0.4f});
|
|
sequenceLength_ = i;
|
|
}
|
|
break;
|
|
|
|
case SfxId::Death:
|
|
{
|
|
int i = 0;
|
|
ADD_SFX_NOTE(sequence_, i, {0, 67, 250, 0, SfxWaveType::Triangle, 0.4f});
|
|
ADD_SFX_NOTE(sequence_, i, {0, 64, 250, 220, SfxWaveType::Triangle, 0.35f});
|
|
ADD_SFX_NOTE(sequence_, i, {0, 60, 250, 220, SfxWaveType::Triangle, 0.3f});
|
|
ADD_SFX_NOTE(sequence_, i, {0, 55, 350, 220, SfxWaveType::Triangle, 0.25f});
|
|
ADD_SFX_NOTE(sequence_, i, {0, 48, 500, 300, SfxWaveType::Triangle, 0.2f});
|
|
sequenceLength_ = i;
|
|
}
|
|
break;
|
|
|
|
// ── Game Sounds ──────────────────────────────────────────────────────
|
|
|
|
case SfxId::Coin:
|
|
{
|
|
int i = 0;
|
|
ADD_SFX_NOTE(sequence_, i, {0, 83, 60, 0, SfxWaveType::Square, 0.4f});
|
|
ADD_SFX_NOTE(sequence_, i, {0, 88, 150, 50, SfxWaveType::Square, 0.35f});
|
|
sequenceLength_ = i;
|
|
}
|
|
break;
|
|
|
|
case SfxId::Powerup:
|
|
{
|
|
int i = 0;
|
|
ADD_SFX_NOTE(sequence_, i, {0, 60, 80, 0, SfxWaveType::Pulse25, 0.35f});
|
|
ADD_SFX_NOTE(sequence_, i, {0, 64, 80, 60, SfxWaveType::Pulse25, 0.35f});
|
|
ADD_SFX_NOTE(sequence_, i, {0, 67, 80, 60, SfxWaveType::Pulse25, 0.35f});
|
|
ADD_SFX_NOTE(sequence_, i, {0, 72, 80, 60, SfxWaveType::Pulse25, 0.4f});
|
|
ADD_SFX_NOTE(sequence_, i, {0, 76, 80, 60, SfxWaveType::Pulse25, 0.4f});
|
|
ADD_SFX_NOTE(sequence_, i, {0, 79, 80, 60, SfxWaveType::Pulse25, 0.45f});
|
|
ADD_SFX_NOTE(sequence_, i, {0, 84, 200, 60, SfxWaveType::Pulse25, 0.5f});
|
|
sequenceLength_ = i;
|
|
}
|
|
break;
|
|
|
|
case SfxId::Jump:
|
|
{
|
|
int i = 0;
|
|
ADD_SFX_NOTE(sequence_, i, {0, 60, 30, 0, SfxWaveType::Square, 0.35f});
|
|
ADD_SFX_NOTE(sequence_, i, {0, 65, 30, 25, SfxWaveType::Square, 0.35f});
|
|
ADD_SFX_NOTE(sequence_, i, {0, 70, 30, 25, SfxWaveType::Square, 0.35f});
|
|
ADD_SFX_NOTE(sequence_, i, {0, 75, 30, 25, SfxWaveType::Square, 0.35f});
|
|
ADD_SFX_NOTE(sequence_, i, {0, 80, 40, 25, SfxWaveType::Square, 0.3f});
|
|
ADD_SFX_NOTE(sequence_, i, {0, 84, 50, 30, SfxWaveType::Square, 0.25f});
|
|
sequenceLength_ = i;
|
|
}
|
|
break;
|
|
|
|
case SfxId::Land:
|
|
{
|
|
int i = 0;
|
|
ADD_SFX_NOTE(sequence_, i, {0, 36, 80, 0, SfxWaveType::Triangle, 0.5f});
|
|
ADD_SFX_NOTE(sequence_, i, {1, 40, 60, 0, SfxWaveType::Noise, 0.15f});
|
|
sequenceLength_ = i;
|
|
}
|
|
break;
|
|
|
|
case SfxId::Laser:
|
|
{
|
|
int i = 0;
|
|
ADD_SFX_NOTE(sequence_, i, {0, 96, 25, 0, SfxWaveType::Pulse25, 0.4f});
|
|
ADD_SFX_NOTE(sequence_, i, {0, 90, 25, 20, SfxWaveType::Pulse25, 0.38f});
|
|
ADD_SFX_NOTE(sequence_, i, {0, 84, 25, 20, SfxWaveType::Pulse25, 0.36f});
|
|
ADD_SFX_NOTE(sequence_, i, {0, 78, 30, 20, SfxWaveType::Pulse25, 0.34f});
|
|
ADD_SFX_NOTE(sequence_, i, {0, 72, 40, 25, SfxWaveType::Pulse25, 0.3f});
|
|
sequenceLength_ = i;
|
|
}
|
|
break;
|
|
|
|
case SfxId::Explosion:
|
|
{
|
|
int i = 0;
|
|
ADD_SFX_NOTE(sequence_, i, {0, 48, 50, 0, SfxWaveType::Noise, 0.5f});
|
|
ADD_SFX_NOTE(sequence_, i, {1, 30, 300, 0, SfxWaveType::Triangle, 0.45f});
|
|
ADD_SFX_NOTE(sequence_, i, {0, 36, 150, 40, SfxWaveType::Noise, 0.45f});
|
|
ADD_SFX_NOTE(sequence_, i, {0, 30, 200, 100, SfxWaveType::Noise, 0.35f});
|
|
ADD_SFX_NOTE(sequence_, i, {0, 24, 250, 150, SfxWaveType::Noise, 0.25f});
|
|
sequenceLength_ = i;
|
|
}
|
|
break;
|
|
|
|
case SfxId::Hurt:
|
|
{
|
|
int i = 0;
|
|
ADD_SFX_NOTE(sequence_, i, {0, 60, 80, 0, SfxWaveType::Sawtooth, 0.4f});
|
|
ADD_SFX_NOTE(sequence_, i, {0, 48, 120, 60, SfxWaveType::Sawtooth, 0.35f});
|
|
sequenceLength_ = i;
|
|
}
|
|
break;
|
|
|
|
case SfxId::Warp:
|
|
{
|
|
int i = 0;
|
|
ADD_SFX_NOTE(sequence_, i, {0, 48, 40, 0, SfxWaveType::Sine, 0.3f});
|
|
ADD_SFX_NOTE(sequence_, i, {1, 36, 350, 0, SfxWaveType::Noise, 0.12f});
|
|
ADD_SFX_NOTE(sequence_, i, {0, 55, 40, 35, SfxWaveType::Sine, 0.32f});
|
|
ADD_SFX_NOTE(sequence_, i, {0, 62, 40, 35, SfxWaveType::Sine, 0.34f});
|
|
ADD_SFX_NOTE(sequence_, i, {0, 69, 40, 35, SfxWaveType::Sine, 0.36f});
|
|
ADD_SFX_NOTE(sequence_, i, {0, 76, 40, 35, SfxWaveType::Sine, 0.38f});
|
|
ADD_SFX_NOTE(sequence_, i, {0, 83, 50, 35, SfxWaveType::Sine, 0.35f});
|
|
ADD_SFX_NOTE(sequence_, i, {0, 90, 60, 40, SfxWaveType::Sine, 0.3f});
|
|
ADD_SFX_NOTE(sequence_, i, {0, 96, 80, 50, SfxWaveType::Sine, 0.25f});
|
|
sequenceLength_ = i;
|
|
}
|
|
break;
|
|
|
|
case SfxId::Pickup:
|
|
{
|
|
int i = 0;
|
|
ADD_SFX_NOTE(sequence_, i, {0, 84, 60, 0, SfxWaveType::Pulse12, 0.35f});
|
|
ADD_SFX_NOTE(sequence_, i, {0, 88, 60, 50, SfxWaveType::Pulse12, 0.4f});
|
|
ADD_SFX_NOTE(sequence_, i, {0, 91, 100, 50, SfxWaveType::Pulse12, 0.35f});
|
|
sequenceLength_ = i;
|
|
}
|
|
break;
|
|
|
|
case SfxId::OneUp:
|
|
{
|
|
int i = 0;
|
|
ADD_SFX_NOTE(sequence_, i, {0, 72, 100, 0, SfxWaveType::Square, 0.35f});
|
|
ADD_SFX_NOTE(sequence_, i, {0, 76, 100, 80, SfxWaveType::Square, 0.35f});
|
|
ADD_SFX_NOTE(sequence_, i, {0, 79, 100, 80, SfxWaveType::Square, 0.35f});
|
|
ADD_SFX_NOTE(sequence_, i, {0, 84, 250, 80, SfxWaveType::Square, 0.45f});
|
|
ADD_SFX_NOTE(sequence_, i, {1, 60, 450, 0, SfxWaveType::Triangle, 0.2f});
|
|
sequenceLength_ = i;
|
|
}
|
|
break;
|
|
|
|
case SfxId::BrickHit:
|
|
{
|
|
int i = 0;
|
|
ADD_SFX_NOTE(sequence_, i, {0, 76, 20, 0, SfxWaveType::Pulse25, 0.25f});
|
|
sequenceLength_ = i;
|
|
}
|
|
break;
|
|
|
|
// ── Notifications ────────────────────────────────────────────────────
|
|
|
|
case SfxId::Alert:
|
|
{
|
|
int i = 0;
|
|
ADD_SFX_NOTE(sequence_, i, {0, 84, 80, 0, SfxWaveType::Square, 0.45f});
|
|
ADD_SFX_NOTE(sequence_, i, {0, 84, 80, 120, SfxWaveType::Square, 0.45f});
|
|
ADD_SFX_NOTE(sequence_, i, {0, 84, 80, 120, SfxWaveType::Square, 0.45f});
|
|
sequenceLength_ = i;
|
|
}
|
|
break;
|
|
|
|
case SfxId::Notify:
|
|
{
|
|
int i = 0;
|
|
ADD_SFX_NOTE(sequence_, i, {0, 79, 100, 0, SfxWaveType::Sine, 0.35f});
|
|
ADD_SFX_NOTE(sequence_, i, {0, 84, 150, 90, SfxWaveType::Sine, 0.4f});
|
|
ADD_SFX_NOTE(sequence_, i, {1, 67, 250, 0, SfxWaveType::Triangle, 0.15f});
|
|
sequenceLength_ = i;
|
|
}
|
|
break;
|
|
|
|
case SfxId::Success:
|
|
{
|
|
int i = 0;
|
|
ADD_SFX_NOTE(sequence_, i, {0, 72, 100, 0, SfxWaveType::Square, 0.35f});
|
|
ADD_SFX_NOTE(sequence_, i, {0, 79, 100, 80, SfxWaveType::Square, 0.4f});
|
|
ADD_SFX_NOTE(sequence_, i, {0, 84, 200, 80, SfxWaveType::Square, 0.45f});
|
|
ADD_SFX_NOTE(sequence_, i, {1, 60, 400, 0, SfxWaveType::Triangle, 0.2f});
|
|
sequenceLength_ = i;
|
|
}
|
|
break;
|
|
|
|
// ── Drum Kit ─────────────────────────────────────────────────────────
|
|
|
|
case SfxId::Kick:
|
|
{
|
|
int i = 0;
|
|
ADD_SFX_NOTE(sequence_, i, {0, 48, 15, 0, SfxWaveType::Triangle, 0.6f});
|
|
ADD_SFX_NOTE(sequence_, i, {0, 36, 60, 10, SfxWaveType::Triangle, 0.55f});
|
|
sequenceLength_ = i;
|
|
}
|
|
break;
|
|
|
|
case SfxId::Snare:
|
|
{
|
|
int i = 0;
|
|
ADD_SFX_NOTE(sequence_, i, {0, 60, 50, 0, SfxWaveType::Noise, 0.35f});
|
|
ADD_SFX_NOTE(sequence_, i, {1, 48, 30, 0, SfxWaveType::Triangle, 0.3f});
|
|
sequenceLength_ = i;
|
|
}
|
|
break;
|
|
|
|
case SfxId::HiHat:
|
|
{
|
|
int i = 0;
|
|
ADD_SFX_NOTE(sequence_, i, {0, 80, 15, 0, SfxWaveType::Noise, 0.2f});
|
|
sequenceLength_ = i;
|
|
}
|
|
break;
|
|
|
|
case SfxId::Crash:
|
|
{
|
|
int i = 0;
|
|
ADD_SFX_NOTE(sequence_, i, {0, 72, 250, 0, SfxWaveType::Noise, 0.3f});
|
|
sequenceLength_ = i;
|
|
}
|
|
break;
|
|
|
|
// ── Synth Percussion ─────────────────────────────────────────────────
|
|
|
|
case SfxId::SynthKick:
|
|
{
|
|
int i = 0;
|
|
ADD_SFX_NOTE(sequence_, i, {0, 55, 10, 0, SfxWaveType::Sine, 0.6f});
|
|
ADD_SFX_NOTE(sequence_, i, {0, 36, 120, 8, SfxWaveType::Sine, 0.55f});
|
|
sequenceLength_ = i;
|
|
}
|
|
break;
|
|
|
|
case SfxId::SynthSnare:
|
|
// MetalNoise -> Noise substitution
|
|
{
|
|
int i = 0;
|
|
ADD_SFX_NOTE(sequence_, i, {0, 60, 80, 0, SfxWaveType::Noise, 0.35f});
|
|
ADD_SFX_NOTE(sequence_, i, {1, 55, 40, 0, SfxWaveType::Triangle, 0.3f});
|
|
sequenceLength_ = i;
|
|
}
|
|
break;
|
|
|
|
case SfxId::SynthHat:
|
|
// MetalNoise -> Noise substitution
|
|
{
|
|
int i = 0;
|
|
ADD_SFX_NOTE(sequence_, i, {0, 84, 30, 0, SfxWaveType::Noise, 0.25f});
|
|
sequenceLength_ = i;
|
|
}
|
|
break;
|
|
|
|
case SfxId::SynthTom:
|
|
{
|
|
int i = 0;
|
|
ADD_SFX_NOTE(sequence_, i, {0, 60, 15, 0, SfxWaveType::Triangle, 0.5f});
|
|
ADD_SFX_NOTE(sequence_, i, {0, 48, 100, 12, SfxWaveType::Triangle, 0.45f});
|
|
sequenceLength_ = i;
|
|
}
|
|
break;
|
|
|
|
case SfxId::SynthRim:
|
|
// MetalNoise -> Noise substitution
|
|
{
|
|
int i = 0;
|
|
ADD_SFX_NOTE(sequence_, i, {0, 72, 25, 0, SfxWaveType::Noise, 0.35f});
|
|
ADD_SFX_NOTE(sequence_, i, {1, 84, 15, 0, SfxWaveType::Pulse12, 0.25f});
|
|
sequenceLength_ = i;
|
|
}
|
|
break;
|
|
|
|
// ── Extra Effects ────────────────────────────────────────────────────
|
|
|
|
case SfxId::Zap:
|
|
{
|
|
int i = 0;
|
|
ADD_SFX_NOTE(sequence_, i, {0, 96, 15, 0, SfxWaveType::Square, 0.35f});
|
|
ADD_SFX_NOTE(sequence_, i, {0, 84, 15, 10, SfxWaveType::Square, 0.30f});
|
|
ADD_SFX_NOTE(sequence_, i, {0, 72, 15, 10, SfxWaveType::Square, 0.25f});
|
|
ADD_SFX_NOTE(sequence_, i, {0, 60, 20, 10, SfxWaveType::Square, 0.20f});
|
|
sequenceLength_ = i;
|
|
}
|
|
break;
|
|
|
|
case SfxId::Blip:
|
|
{
|
|
int i = 0;
|
|
ADD_SFX_NOTE(sequence_, i, {0, 90, 20, 0, SfxWaveType::Square, 0.3f});
|
|
sequenceLength_ = i;
|
|
}
|
|
break;
|
|
|
|
case SfxId::Chirp:
|
|
{
|
|
int i = 0;
|
|
ADD_SFX_NOTE(sequence_, i, {0, 72, 20, 0, SfxWaveType::Pulse25, 0.3f});
|
|
ADD_SFX_NOTE(sequence_, i, {0, 84, 30, 15, SfxWaveType::Pulse25, 0.25f});
|
|
sequenceLength_ = i;
|
|
}
|
|
break;
|
|
|
|
case SfxId::Whoosh:
|
|
{
|
|
int i = 0;
|
|
ADD_SFX_NOTE(sequence_, i, {0, 48, 30, 0, SfxWaveType::Noise, 0.15f});
|
|
ADD_SFX_NOTE(sequence_, i, {0, 60, 30, 25, SfxWaveType::Noise, 0.20f});
|
|
ADD_SFX_NOTE(sequence_, i, {0, 72, 30, 25, SfxWaveType::Noise, 0.25f});
|
|
ADD_SFX_NOTE(sequence_, i, {0, 84, 40, 25, SfxWaveType::Noise, 0.20f});
|
|
sequenceLength_ = i;
|
|
}
|
|
break;
|
|
|
|
case SfxId::Ding:
|
|
{
|
|
int i = 0;
|
|
ADD_SFX_NOTE(sequence_, i, {0, 84, 300, 0, SfxWaveType::Sine, 0.4f});
|
|
ADD_SFX_NOTE(sequence_, i, {1, 91, 200, 0, SfxWaveType::Sine, 0.2f});
|
|
sequenceLength_ = i;
|
|
}
|
|
break;
|
|
|
|
case SfxId::RisingWhoosh:
|
|
{
|
|
int i = 0;
|
|
ADD_SFX_NOTE(sequence_, i, {0, 36, 30, 0, SfxWaveType::Noise, 0.15f});
|
|
ADD_SFX_NOTE(sequence_, i, {0, 48, 30, 25, SfxWaveType::Noise, 0.20f});
|
|
ADD_SFX_NOTE(sequence_, i, {0, 60, 30, 25, SfxWaveType::Noise, 0.25f});
|
|
ADD_SFX_NOTE(sequence_, i, {0, 72, 40, 25, SfxWaveType::Noise, 0.30f});
|
|
ADD_SFX_NOTE(sequence_, i, {0, 84, 50, 30, SfxWaveType::Noise, 0.25f});
|
|
sequenceLength_ = i;
|
|
}
|
|
break;
|
|
|
|
case SfxId::FallingWhoosh:
|
|
{
|
|
int i = 0;
|
|
ADD_SFX_NOTE(sequence_, i, {0, 84, 30, 0, SfxWaveType::Noise, 0.30f});
|
|
ADD_SFX_NOTE(sequence_, i, {0, 72, 30, 25, SfxWaveType::Noise, 0.25f});
|
|
ADD_SFX_NOTE(sequence_, i, {0, 60, 30, 25, SfxWaveType::Noise, 0.20f});
|
|
ADD_SFX_NOTE(sequence_, i, {0, 48, 40, 25, SfxWaveType::Noise, 0.15f});
|
|
ADD_SFX_NOTE(sequence_, i, {0, 36, 50, 30, SfxWaveType::Noise, 0.10f});
|
|
sequenceLength_ = i;
|
|
}
|
|
break;
|
|
|
|
case SfxId::GlitchHit:
|
|
// MetalNoise -> Noise substitution
|
|
{
|
|
int i = 0;
|
|
ADD_SFX_NOTE(sequence_, i, {0, 48, 20, 0, SfxWaveType::Noise, 0.45f});
|
|
ADD_SFX_NOTE(sequence_, i, {1, 36, 80, 0, SfxWaveType::Sawtooth, 0.40f});
|
|
ADD_SFX_NOTE(sequence_, i, {0, 96, 15, 15, SfxWaveType::Pulse12, 0.30f});
|
|
ADD_SFX_NOTE(sequence_, i, {0, 60, 40, 10, SfxWaveType::Noise, 0.25f});
|
|
sequenceLength_ = i;
|
|
}
|
|
break;
|
|
|
|
case SfxId::DigitalBurst:
|
|
{
|
|
int i = 0;
|
|
ADD_SFX_NOTE(sequence_, i, {0, 72, 25, 0, SfxWaveType::Pulse12, 0.35f});
|
|
ADD_SFX_NOTE(sequence_, i, {0, 84, 25, 20, SfxWaveType::Pulse12, 0.35f});
|
|
ADD_SFX_NOTE(sequence_, i, {0, 96, 25, 20, SfxWaveType::Pulse12, 0.35f});
|
|
ADD_SFX_NOTE(sequence_, i, {0, 108, 30, 20, SfxWaveType::Pulse12, 0.30f});
|
|
sequenceLength_ = i;
|
|
}
|
|
break;
|
|
|
|
case SfxId::RetroBell:
|
|
// HarmonicSquare -> Square substitution
|
|
{
|
|
int i = 0;
|
|
ADD_SFX_NOTE(sequence_, i, {0, 84, 200, 0, SfxWaveType::Square, 0.15f});
|
|
ADD_SFX_NOTE(sequence_, i, {1, 91, 180, 0, SfxWaveType::Pulse25, 0.10f});
|
|
sequenceLength_ = i;
|
|
}
|
|
break;
|
|
|
|
// ── Jingles ──────────────────────────────────────────────────────────
|
|
|
|
// Rising arpeggio (C4-E4-G4-C5-E5-G5-C6) with sustained bass (C3)
|
|
case SfxId::LevelUp:
|
|
{
|
|
int i = 0;
|
|
ADD_SFX_NOTE(sequence_, i, {0, 60, 100, 0, SfxWaveType::Square, 0.28f}); // C4
|
|
ADD_SFX_NOTE(sequence_, i, {1, 48, 800, 0, SfxWaveType::Triangle, 0.16f}); // C3 bass pad
|
|
ADD_SFX_NOTE(sequence_, i, {0, 64, 100, 80, SfxWaveType::Square, 0.28f}); // E4
|
|
ADD_SFX_NOTE(sequence_, i, {0, 67, 100, 80, SfxWaveType::Square, 0.28f}); // G4
|
|
ADD_SFX_NOTE(sequence_, i, {0, 72, 150, 80, SfxWaveType::Square, 0.32f}); // C5
|
|
ADD_SFX_NOTE(sequence_, i, {0, 76, 100, 130, SfxWaveType::Square, 0.32f}); // E5
|
|
ADD_SFX_NOTE(sequence_, i, {0, 79, 100, 80, SfxWaveType::Square, 0.32f}); // G5
|
|
ADD_SFX_NOTE(sequence_, i, {0, 84, 300, 80, SfxWaveType::Square, 0.40f}); // C6 (hold)
|
|
sequenceLength_ = i;
|
|
}
|
|
break;
|
|
|
|
// Descending chromatic line (C5-B4-A4-G4-F4-E4-C4) with bass drone
|
|
case SfxId::GameOver:
|
|
{
|
|
int i = 0;
|
|
ADD_SFX_NOTE(sequence_, i, {0, 72, 200, 0, SfxWaveType::Square, 0.30f}); // C5
|
|
ADD_SFX_NOTE(sequence_, i, {1, 60, 800, 0, SfxWaveType::Triangle, 0.15f}); // C4 bass drone
|
|
ADD_SFX_NOTE(sequence_, i, {0, 71, 200, 180, SfxWaveType::Square, 0.28f}); // B4
|
|
ADD_SFX_NOTE(sequence_, i, {0, 69, 200, 180, SfxWaveType::Square, 0.27f}); // A4
|
|
ADD_SFX_NOTE(sequence_, i, {0, 67, 200, 180, SfxWaveType::Square, 0.25f}); // G4
|
|
ADD_SFX_NOTE(sequence_, i, {1, 55, 600, 0, SfxWaveType::Triangle, 0.15f}); // G3 bass shift
|
|
ADD_SFX_NOTE(sequence_, i, {0, 65, 250, 180, SfxWaveType::Square, 0.24f}); // F4
|
|
ADD_SFX_NOTE(sequence_, i, {0, 64, 400, 230, SfxWaveType::Square, 0.22f}); // E4
|
|
ADD_SFX_NOTE(sequence_, i, {0, 60, 600, 380, SfxWaveType::Square, 0.18f}); // C4 (hold)
|
|
sequenceLength_ = i;
|
|
}
|
|
break;
|
|
|
|
case SfxId::None:
|
|
default:
|
|
sequenceLength_ = 0;
|
|
break;
|
|
}
|
|
|
|
// Start sequence
|
|
if (sequenceLength_ > 0) {
|
|
sequenceDelaySamples_ = (sequence_[0].delayMs * SAMPLE_RATE) / 1000;
|
|
}
|
|
}
|
|
|
|
#undef ADD_SFX_NOTE
|