2021-01-02 00:12:31 (UTC-03:00)
Marcel Rodrigues <marcelgmr@gmail.com>
add function to run event queue
diff --git a/qms.c b/qms.c index 1e9c2fb..9da6ebe 100644 --- a/qms.c +++ b/qms.c @@ -125,3 +125,35 @@ qms_advance(unsigned int nsamples) qms_putsample((int16_t) left, (int16_t) right); } } + +void +qms_runevents(Event *evs, unsigned int nevs) +{ + uint32_t total_samples = 0; + EvType ev_type; + unsigned int track, voice, arg; + for (; nevs--; evs++) { + qms_advance(evs->offset - total_samples); + total_samples = evs->offset; + track = evs->event >> 28; + voice = evs->event >> 24 & 7; + ev_type = evs->event >> 16 & 0xFF; + arg = evs->event & 0xFFFF; + switch (ev_type) { + case PAC: + qms_setpac(track, arg); + break; + case VOL: + qms_setvol(track, arg); + break; + case PAN: + qms_setpan(track, arg); + break; + case VEL: + qms_setvelocity(track, voice, arg); + break; + case PITCH: + qms_setnote(track, voice, arg); + } + } +} diff --git a/qms.h b/qms.h index aa4d2f2..71bc420 100644 --- a/qms.h +++ b/qms.h @@ -12,6 +12,13 @@ /* sample rate in samples per second*/ #define R 44100 +typedef enum EvType {PAC, VOL, PAN, VEL, PITCH} EvType; + +typedef struct Event { + uint32_t offset; + uint32_t event; +} Event; + void qms_init(); void qms_setpac(int track, int pac); void qms_setvol(int track, int midivol); @@ -19,4 +26,5 @@ void qms_setpan(int track, int midipan); void qms_setvelocity(int track, int voice, int velocity); void qms_setnote(int track, int voice, int midipitch); void qms_advance(unsigned int nsamples); +void qms_runevents(Event *evs, unsigned int nevs); void qms_putsample(int16_t left, int16_t right);