diff fmgen/psg.h @ 0:c55ea9478c80

Hello Gensokyo!
author Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
date Tue, 21 May 2013 10:29:21 +0200
parents
children
line wrap: on
line diff
new file mode 100644
--- /dev/null
+++ b/fmgen/psg.h
@@ -0,0 +1,53 @@
+#ifndef __PSG_H__
+#define __PSG_H__
+
+#include <stdint.h>
+#define PSG_SAMPLETYPE		int32_t		// any of int16_t, int32_t or float will work here.
+
+// Constants for the shift amounts used in the counters.
+//
+enum {
+    toneshift = 24,
+    envshift = 22
+};
+
+typedef struct _PSG {
+    uint8_t reg[16];
+
+    const uint32_t *envelop;
+    uint32_t rng;
+    uint32_t olevel[3];
+    uint32_t scount[3], speriod[3];
+    uint32_t ecount, eperiod;
+    uint32_t ncount, nperiod;
+    uint32_t tperiodbase;
+    uint32_t eperiodbase;
+    int volume;
+    int mask;
+} PSG;
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+// Mostly self-explanatory.
+// Actual descriptions of each function can be found in psg.c
+// Also, PSGGetReg() is basically useless.
+// (More info on that can *also* be found in psg.c).
+void PSGInit(PSG *psg);
+void PSGReset(PSG *psg);
+void PSGSetClock(PSG *psg, uint32_t clock, uint32_t rate);
+void SetVolumePSG(PSG *psg, int volume);
+void PSGSetChannelMask(PSG *psg, int c);
+void PSGSetReg(PSG *psg, uint8_t regnum, uint8_t data);
+void PSGMix(PSG *psg, int32_t *dest, uint32_t nsamples);
+
+static inline uint32_t PSGGetReg(PSG *psg, uint8_t regnum) {
+    return psg->reg[regnum & 0x0f];
+}
+
+#ifdef __cplusplus
+};
+#endif
+
+#endif // PSG_H