#pragma once #include #include "util.hpp" struct Tone { enum Type { tt_sine = 0, tt_saw = 1, tt_square = 2, tt_triangle = 3, }; uint32_t phase; uint16_t frequency; uint8_t amplitude; Type mode; inline static int8_t sin_lookup[256]; static void init(); inline bool active() const AW_IN { return amplitude > 0; } inline void update(uint32_t t) AW_IN { phase += t * frequency; } inline int get() const AW_IN { int v; switch(mode) { case tt_sine: v = sin_lookup[(phase >> 12) & 255]; break; case tt_saw: v = (int8_t)((phase >> 12) & 255); break; case tt_square: v = phase & 0x80000 ? -127 : 127; break; case tt_triangle: v = (phase >> 11) & 0x1ff; v = (v > 0xff ? 1 : -1) * (int8_t)phase; break; } return v * amplitude; } };