login

<     >

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);