From e4f12dede3cea49631ad5cbd30d902d785d5d96d Mon Sep 17 00:00:00 2001 From: Chris Date: Wed, 13 Aug 2025 18:16:44 +0200 Subject: [PATCH] rename enum values, move event count to voice --- synth/voice_allocator.h | 69 +++++++++++++++++++++++++++++------------ 1 file changed, 49 insertions(+), 20 deletions(-) diff --git a/synth/voice_allocator.h b/synth/voice_allocator.h index 91c42f5..6004189 100644 --- a/synth/voice_allocator.h +++ b/synth/voice_allocator.h @@ -9,10 +9,10 @@ using namespace std; namespace trnr { enum midi_event_type { - note_on = 0, - note_off, - pitch_wheel, - mod_wheel + NOTE_ON = 0, + NOTE_OFF, + PITCH_WHEEL, + MOD_WHEEL }; struct midi_event { @@ -23,6 +23,34 @@ struct midi_event { double data; }; +inline void make_note_on(midi_event& ev, int _midi_note, float _velocity, int _offset = 0) +{ + ev.type = midi_event_type::NOTE_ON; + ev.midi_note = _midi_note; + ev.velocity = _velocity; + ev.offset = _offset; +} + +inline void make_note_off(midi_event& ev, int _midi_note, float _velocity, int _offset = 0) +{ + ev.type = midi_event_type::NOTE_OFF; + ev.midi_note = _midi_note; + ev.velocity = _velocity; + ev.offset = _offset; +} + +inline void make_pitch_wheel(midi_event& ev, double _pitch, int _offset = 0) +{ + ev.type = midi_event_type::PITCH_WHEEL; + ev.data = _pitch; +} + +inline void make_mod_wheel(midi_event& ev, double _mod, int _offset = 0) +{ + ev.type = midi_event_type::PITCH_WHEEL; + ev.data = _mod; +} + #ifndef MAX_VOICES #define MAX_VOICES 16 #endif @@ -38,18 +66,18 @@ struct voice_state { bool trigger; float velocity; array events; + size_t event_count = 0; }; struct voice_allocator { array voices; - array counts; int active_voice_count = 1; size_t index_to_steal = 0; }; inline void voice_allocator_init(voice_allocator& va) { - for (size_t i = 0; i < MAX_VOICES; ++i) { va.counts[i] = 0; } + for (size_t i = 0; i < MAX_VOICES; ++i) { va.voices[i].event_count = 0; } } inline void voice_allocator_process_block(voice_allocator& va, const vector& midi_events) @@ -57,16 +85,17 @@ inline void voice_allocator_process_block(voice_allocator& va, const vector= va.active_voice_count) va.index_to_steal = 0; break; } - case note_off: { + case NOTE_OFF: { for (size_t i = 0; i < va.active_voice_count; ++i) { - if (va.voices[i].midi_note == ev.midi_note) va.voices[i].events[va.counts[i]++] = ev; + if (va.voices[i].midi_note == ev.midi_note) va.voices[i].events[va.voices[i].event_count++] = ev; } break; } - case pitch_wheel: - case mod_wheel: { - for (size_t i = 0; i < va.active_voice_count; ++i) { va.voices[i].events[va.counts[i]++] = ev; } + case PITCH_WHEEL: + case MOD_WHEEL: { + for (size_t i = 0; i < va.active_voice_count; ++i) { va.voices[i].events[va.voices[i].event_count++] = ev; } break; } } @@ -114,24 +143,24 @@ inline void voice_process_event_for_frame(voice_state& v, size_t frame) const midi_event& ev = v.events[i]; if (ev.offset == frame) { best_event = &ev; - if (ev.type == note_on) break; + if (ev.type == NOTE_ON) break; } } if (best_event) switch (best_event->type) { - case note_on: + case NOTE_ON: v.midi_note = best_event->midi_note; v.velocity = best_event->velocity; v.is_busy = true; v.gate = true; v.trigger = true; break; - case note_off: + case NOTE_OFF: v.gate = false; break; // TODO: handle pitch wheel and mod wheel events - case pitch_wheel: - case mod_wheel: + case PITCH_WHEEL: + case MOD_WHEEL: break; } }