366 lines
12 KiB
Diff
366 lines
12 KiB
Diff
|
From 962ee8fc46ca51691bde1c8c1022dacbe8a037ed Mon Sep 17 00:00:00 2001
|
||
|
From: Carl Reinke <carlreinke@users.noreply.github.com>
|
||
|
Date: Sun, 14 Jun 2020 14:11:00 -0600
|
||
|
Subject: [PATCH] Move definitions that don't need to be exposed from opl.h to
|
||
|
opl.c
|
||
|
|
||
|
[Retrieved from:
|
||
|
https://github.com/opentyrian/opentyrian/commit/962ee8fc46ca51691bde1c8c1022dacbe8a037ed]
|
||
|
Signed-off-by: Fabrice Fontaine <fontaine.fabrice@gmail.com>
|
||
|
---
|
||
|
src/opl.c | 153 +++++++++++++++++++++++++++++++++++++++++++++++++++-
|
||
|
src/opl.h | 157 ++----------------------------------------------------
|
||
|
2 files changed, 154 insertions(+), 156 deletions(-)
|
||
|
|
||
|
diff --git a/src/opl.c b/src/opl.c
|
||
|
index a4071c5..f15474c 100644
|
||
|
--- a/src/opl.c
|
||
|
+++ b/src/opl.c
|
||
|
@@ -23,12 +23,161 @@
|
||
|
* Copyright (C) 1998-2001 Ken Silverman
|
||
|
* Ken Silverman's official web site: "http://www.advsys.net/ken"
|
||
|
*/
|
||
|
-
|
||
|
+#include "opl.h"
|
||
|
|
||
|
#include <math.h>
|
||
|
+#include <stdbool.h>
|
||
|
#include <stdlib.h> // rand()
|
||
|
#include <string.h> // memset()
|
||
|
-#include "opl.h"
|
||
|
+
|
||
|
+#define fltype double
|
||
|
+
|
||
|
+ /*
|
||
|
+ define attribution that inlines/forces inlining of a function (optional)
|
||
|
+ */
|
||
|
+#define OPL_INLINE inline
|
||
|
+
|
||
|
+
|
||
|
+#undef NUM_CHANNELS
|
||
|
+#if defined(OPLTYPE_IS_OPL3)
|
||
|
+#define NUM_CHANNELS 18
|
||
|
+#else
|
||
|
+#define NUM_CHANNELS 9
|
||
|
+#endif
|
||
|
+
|
||
|
+#define MAXOPERATORS (NUM_CHANNELS*2)
|
||
|
+
|
||
|
+
|
||
|
+#define FL05 ((fltype)0.5)
|
||
|
+#define FL2 ((fltype)2.0)
|
||
|
+#define PI ((fltype)3.1415926535897932384626433832795)
|
||
|
+
|
||
|
+
|
||
|
+#define FIXEDPT 0x10000 // fixed-point calculations using 16+16
|
||
|
+#define FIXEDPT_LFO 0x1000000 // fixed-point calculations using 8+24
|
||
|
+
|
||
|
+#define WAVEPREC 1024 // waveform precision (10 bits)
|
||
|
+
|
||
|
+#define INTFREQU ((fltype)(14318180.0 / 288.0)) // clocking of the chip
|
||
|
+
|
||
|
+
|
||
|
+#define OF_TYPE_ATT 0
|
||
|
+#define OF_TYPE_DEC 1
|
||
|
+#define OF_TYPE_REL 2
|
||
|
+#define OF_TYPE_SUS 3
|
||
|
+#define OF_TYPE_SUS_NOKEEP 4
|
||
|
+#define OF_TYPE_OFF 5
|
||
|
+
|
||
|
+#define ARC_CONTROL 0x00
|
||
|
+#define ARC_TVS_KSR_MUL 0x20
|
||
|
+#define ARC_KSL_OUTLEV 0x40
|
||
|
+#define ARC_ATTR_DECR 0x60
|
||
|
+#define ARC_SUSL_RELR 0x80
|
||
|
+#define ARC_FREQ_NUM 0xa0
|
||
|
+#define ARC_KON_BNUM 0xb0
|
||
|
+#define ARC_PERC_MODE 0xbd
|
||
|
+#define ARC_FEEDBACK 0xc0
|
||
|
+#define ARC_WAVE_SEL 0xe0
|
||
|
+
|
||
|
+#define ARC_SECONDSET 0x100 // second operator set for OPL3
|
||
|
+
|
||
|
+
|
||
|
+#define OP_ACT_OFF 0x00
|
||
|
+#define OP_ACT_NORMAL 0x01 // regular channel activated (bitmasked)
|
||
|
+#define OP_ACT_PERC 0x02 // percussion channel activated (bitmasked)
|
||
|
+
|
||
|
+#define BLOCKBUF_SIZE 512
|
||
|
+
|
||
|
+
|
||
|
+ // vibrato constants
|
||
|
+#define VIBTAB_SIZE 8
|
||
|
+#define VIBFAC 70/50000 // no braces, integer mul/div
|
||
|
+
|
||
|
+ // tremolo constants and table
|
||
|
+#define TREMTAB_SIZE 53
|
||
|
+#define TREM_FREQ ((fltype)(3.7)) // tremolo at 3.7hz
|
||
|
+
|
||
|
+
|
||
|
+ /* operator struct definition
|
||
|
+ For OPL2 all 9 channels consist of two operators each, carrier and modulator.
|
||
|
+ Channel x has operators x as modulator and operators (9+x) as carrier.
|
||
|
+ For OPL3 all 18 channels consist either of two operators (2op mode) or four
|
||
|
+ operators (4op mode) which is determined through register4 of the second
|
||
|
+ adlib register set.
|
||
|
+ Only the channels 0,1,2 (first set) and 9,10,11 (second set) can act as
|
||
|
+ 4op channels. The two additional operators for a channel y come from the
|
||
|
+ 2op channel y+3 so the operatorss y, (9+y), y+3, (9+y)+3 make up a 4op
|
||
|
+ channel.
|
||
|
+ */
|
||
|
+typedef struct operator_struct {
|
||
|
+ Bit32s cval, lastcval; // current output/last output (used for feedback)
|
||
|
+ Bit32u tcount, wfpos, tinc; // time (position in waveform) and time increment
|
||
|
+ fltype amp, step_amp; // and amplification (envelope)
|
||
|
+ fltype vol; // volume
|
||
|
+ fltype sustain_level; // sustain level
|
||
|
+ Bit32s mfbi; // feedback amount
|
||
|
+ fltype a0, a1, a2, a3; // attack rate function coefficients
|
||
|
+ fltype decaymul, releasemul; // decay/release rate functions
|
||
|
+ Bit32u op_state; // current state of operator (attack/decay/sustain/release/off)
|
||
|
+ Bit32u toff;
|
||
|
+ Bit32s freq_high; // highest three bits of the frequency, used for vibrato calculations
|
||
|
+ Bit16s* cur_wform; // start of selected waveform
|
||
|
+ Bit32u cur_wmask; // mask for selected waveform
|
||
|
+ Bit32u act_state; // activity state (regular, percussion)
|
||
|
+ bool sus_keep; // keep sustain level when decay finished
|
||
|
+ bool vibrato,tremolo; // vibrato/tremolo enable bits
|
||
|
+
|
||
|
+ // variables used to provide non-continuous envelopes
|
||
|
+ Bit32u generator_pos; // for non-standard sample rates we need to determine how many samples have passed
|
||
|
+ Bits cur_env_step; // current (standardized) sample position
|
||
|
+ Bits env_step_a,env_step_d,env_step_r; // number of std samples of one step (for attack/decay/release mode)
|
||
|
+ Bit8u step_skip_pos_a; // position of 8-cyclic step skipping (always 2^x to check against mask)
|
||
|
+ Bits env_step_skip_a; // bitmask that determines if a step is skipped (respective bit is zero then)
|
||
|
+
|
||
|
+#if defined(OPLTYPE_IS_OPL3)
|
||
|
+ bool is_4op,is_4op_attached; // base of a 4op channel/part of a 4op channel
|
||
|
+ Bit32s left_pan,right_pan; // opl3 stereo panning amount
|
||
|
+#endif
|
||
|
+} op_type;
|
||
|
+
|
||
|
+// per-chip variables
|
||
|
+static op_type op[MAXOPERATORS];
|
||
|
+
|
||
|
+static Bits int_samplerate;
|
||
|
+
|
||
|
+static Bit8u status;
|
||
|
+static Bit32u opl_index;
|
||
|
+#if defined(OPLTYPE_IS_OPL3)
|
||
|
+static Bit8u adlibreg[512]; // adlib register set (including second set)
|
||
|
+static Bit8u wave_sel[44]; // waveform selection
|
||
|
+#else
|
||
|
+static Bit8u adlibreg[256]; // adlib register set
|
||
|
+static Bit8u wave_sel[22]; // waveform selection
|
||
|
+#endif
|
||
|
+
|
||
|
+
|
||
|
+ // vibrato/tremolo increment/counter
|
||
|
+static Bit32u vibtab_pos;
|
||
|
+static Bit32u vibtab_add;
|
||
|
+static Bit32u tremtab_pos;
|
||
|
+static Bit32u tremtab_add;
|
||
|
+
|
||
|
+
|
||
|
+// enable an operator
|
||
|
+void enable_operator(Bitu regbase, op_type* op_pt, Bit32u act_type);
|
||
|
+
|
||
|
+// functions to change parameters of an operator
|
||
|
+void change_frequency(Bitu chanbase, Bitu regbase, op_type* op_pt);
|
||
|
+
|
||
|
+void change_attackrate(Bitu regbase, op_type* op_pt);
|
||
|
+void change_decayrate(Bitu regbase, op_type* op_pt);
|
||
|
+void change_releaserate(Bitu regbase, op_type* op_pt);
|
||
|
+void change_sustainlevel(Bitu regbase, op_type* op_pt);
|
||
|
+void change_waveform(Bitu regbase, op_type* op_pt);
|
||
|
+void change_keepsustain(Bitu regbase, op_type* op_pt);
|
||
|
+void change_vibrato(Bitu regbase, op_type* op_pt);
|
||
|
+void change_feedback(Bitu chanbase, op_type* op_pt);
|
||
|
+
|
||
|
|
||
|
static Bit32u generator_add; // should be a chip parameter
|
||
|
|
||
|
diff --git a/src/opl.h b/src/opl.h
|
||
|
index c8e643b..cbb56ad 100644
|
||
|
--- a/src/opl.h
|
||
|
+++ b/src/opl.h
|
||
|
@@ -25,11 +25,8 @@
|
||
|
* Ken Silverman's official web site: "http://www.advsys.net/ken"
|
||
|
*/
|
||
|
|
||
|
-
|
||
|
-#define fltype double
|
||
|
-
|
||
|
-#include <stdbool.h>
|
||
|
#include <stdint.h>
|
||
|
+
|
||
|
typedef uintptr_t Bitu;
|
||
|
typedef intptr_t Bits;
|
||
|
typedef uint32_t Bit32u;
|
||
|
@@ -39,154 +36,6 @@ typedef int16_t Bit16s;
|
||
|
typedef uint8_t Bit8u;
|
||
|
typedef int8_t Bit8s;
|
||
|
|
||
|
-
|
||
|
-/*
|
||
|
- define attribution that inlines/forces inlining of a function (optional)
|
||
|
-*/
|
||
|
-#define OPL_INLINE inline
|
||
|
-
|
||
|
-
|
||
|
-#undef NUM_CHANNELS
|
||
|
-#if defined(OPLTYPE_IS_OPL3)
|
||
|
-#define NUM_CHANNELS 18
|
||
|
-#else
|
||
|
-#define NUM_CHANNELS 9
|
||
|
-#endif
|
||
|
-
|
||
|
-#define MAXOPERATORS (NUM_CHANNELS*2)
|
||
|
-
|
||
|
-
|
||
|
-#define FL05 ((fltype)0.5)
|
||
|
-#define FL2 ((fltype)2.0)
|
||
|
-#define PI ((fltype)3.1415926535897932384626433832795)
|
||
|
-
|
||
|
-
|
||
|
-#define FIXEDPT 0x10000 // fixed-point calculations using 16+16
|
||
|
-#define FIXEDPT_LFO 0x1000000 // fixed-point calculations using 8+24
|
||
|
-
|
||
|
-#define WAVEPREC 1024 // waveform precision (10 bits)
|
||
|
-
|
||
|
-#define INTFREQU ((fltype)(14318180.0 / 288.0)) // clocking of the chip
|
||
|
-
|
||
|
-
|
||
|
-#define OF_TYPE_ATT 0
|
||
|
-#define OF_TYPE_DEC 1
|
||
|
-#define OF_TYPE_REL 2
|
||
|
-#define OF_TYPE_SUS 3
|
||
|
-#define OF_TYPE_SUS_NOKEEP 4
|
||
|
-#define OF_TYPE_OFF 5
|
||
|
-
|
||
|
-#define ARC_CONTROL 0x00
|
||
|
-#define ARC_TVS_KSR_MUL 0x20
|
||
|
-#define ARC_KSL_OUTLEV 0x40
|
||
|
-#define ARC_ATTR_DECR 0x60
|
||
|
-#define ARC_SUSL_RELR 0x80
|
||
|
-#define ARC_FREQ_NUM 0xa0
|
||
|
-#define ARC_KON_BNUM 0xb0
|
||
|
-#define ARC_PERC_MODE 0xbd
|
||
|
-#define ARC_FEEDBACK 0xc0
|
||
|
-#define ARC_WAVE_SEL 0xe0
|
||
|
-
|
||
|
-#define ARC_SECONDSET 0x100 // second operator set for OPL3
|
||
|
-
|
||
|
-
|
||
|
-#define OP_ACT_OFF 0x00
|
||
|
-#define OP_ACT_NORMAL 0x01 // regular channel activated (bitmasked)
|
||
|
-#define OP_ACT_PERC 0x02 // percussion channel activated (bitmasked)
|
||
|
-
|
||
|
-#define BLOCKBUF_SIZE 512
|
||
|
-
|
||
|
-
|
||
|
-// vibrato constants
|
||
|
-#define VIBTAB_SIZE 8
|
||
|
-#define VIBFAC 70/50000 // no braces, integer mul/div
|
||
|
-
|
||
|
-// tremolo constants and table
|
||
|
-#define TREMTAB_SIZE 53
|
||
|
-#define TREM_FREQ ((fltype)(3.7)) // tremolo at 3.7hz
|
||
|
-
|
||
|
-
|
||
|
-/* operator struct definition
|
||
|
- For OPL2 all 9 channels consist of two operators each, carrier and modulator.
|
||
|
- Channel x has operators x as modulator and operators (9+x) as carrier.
|
||
|
- For OPL3 all 18 channels consist either of two operators (2op mode) or four
|
||
|
- operators (4op mode) which is determined through register4 of the second
|
||
|
- adlib register set.
|
||
|
- Only the channels 0,1,2 (first set) and 9,10,11 (second set) can act as
|
||
|
- 4op channels. The two additional operators for a channel y come from the
|
||
|
- 2op channel y+3 so the operatorss y, (9+y), y+3, (9+y)+3 make up a 4op
|
||
|
- channel.
|
||
|
-*/
|
||
|
-typedef struct operator_struct {
|
||
|
- Bit32s cval, lastcval; // current output/last output (used for feedback)
|
||
|
- Bit32u tcount, wfpos, tinc; // time (position in waveform) and time increment
|
||
|
- fltype amp, step_amp; // and amplification (envelope)
|
||
|
- fltype vol; // volume
|
||
|
- fltype sustain_level; // sustain level
|
||
|
- Bit32s mfbi; // feedback amount
|
||
|
- fltype a0, a1, a2, a3; // attack rate function coefficients
|
||
|
- fltype decaymul, releasemul; // decay/release rate functions
|
||
|
- Bit32u op_state; // current state of operator (attack/decay/sustain/release/off)
|
||
|
- Bit32u toff;
|
||
|
- Bit32s freq_high; // highest three bits of the frequency, used for vibrato calculations
|
||
|
- Bit16s* cur_wform; // start of selected waveform
|
||
|
- Bit32u cur_wmask; // mask for selected waveform
|
||
|
- Bit32u act_state; // activity state (regular, percussion)
|
||
|
- bool sus_keep; // keep sustain level when decay finished
|
||
|
- bool vibrato,tremolo; // vibrato/tremolo enable bits
|
||
|
-
|
||
|
- // variables used to provide non-continuous envelopes
|
||
|
- Bit32u generator_pos; // for non-standard sample rates we need to determine how many samples have passed
|
||
|
- Bits cur_env_step; // current (standardized) sample position
|
||
|
- Bits env_step_a,env_step_d,env_step_r; // number of std samples of one step (for attack/decay/release mode)
|
||
|
- Bit8u step_skip_pos_a; // position of 8-cyclic step skipping (always 2^x to check against mask)
|
||
|
- Bits env_step_skip_a; // bitmask that determines if a step is skipped (respective bit is zero then)
|
||
|
-
|
||
|
-#if defined(OPLTYPE_IS_OPL3)
|
||
|
- bool is_4op,is_4op_attached; // base of a 4op channel/part of a 4op channel
|
||
|
- Bit32s left_pan,right_pan; // opl3 stereo panning amount
|
||
|
-#endif
|
||
|
-} op_type;
|
||
|
-
|
||
|
-// per-chip variables
|
||
|
-Bitu chip_num;
|
||
|
-op_type op[MAXOPERATORS];
|
||
|
-
|
||
|
-Bits int_samplerate;
|
||
|
-
|
||
|
-Bit8u status;
|
||
|
-Bit32u opl_index;
|
||
|
-#if defined(OPLTYPE_IS_OPL3)
|
||
|
-Bit8u adlibreg[512]; // adlib register set (including second set)
|
||
|
-Bit8u wave_sel[44]; // waveform selection
|
||
|
-#else
|
||
|
-Bit8u adlibreg[256]; // adlib register set
|
||
|
-Bit8u wave_sel[22]; // waveform selection
|
||
|
-#endif
|
||
|
-
|
||
|
-
|
||
|
-// vibrato/tremolo increment/counter
|
||
|
-Bit32u vibtab_pos;
|
||
|
-Bit32u vibtab_add;
|
||
|
-Bit32u tremtab_pos;
|
||
|
-Bit32u tremtab_add;
|
||
|
-
|
||
|
-
|
||
|
-// enable an operator
|
||
|
-void enable_operator(Bitu regbase, op_type* op_pt, Bit32u act_type);
|
||
|
-
|
||
|
-// functions to change parameters of an operator
|
||
|
-void change_frequency(Bitu chanbase, Bitu regbase, op_type* op_pt);
|
||
|
-
|
||
|
-void change_attackrate(Bitu regbase, op_type* op_pt);
|
||
|
-void change_decayrate(Bitu regbase, op_type* op_pt);
|
||
|
-void change_releaserate(Bitu regbase, op_type* op_pt);
|
||
|
-void change_sustainlevel(Bitu regbase, op_type* op_pt);
|
||
|
-void change_waveform(Bitu regbase, op_type* op_pt);
|
||
|
-void change_keepsustain(Bitu regbase, op_type* op_pt);
|
||
|
-void change_vibrato(Bitu regbase, op_type* op_pt);
|
||
|
-void change_feedback(Bitu chanbase, op_type* op_pt);
|
||
|
-
|
||
|
// general functions
|
||
|
void adlib_init(Bit32u samplerate);
|
||
|
void adlib_write(Bitu idx, Bit8u val);
|
||
|
@@ -195,8 +44,8 @@ void adlib_getsample(Bit16s* sndptr, Bits numsamples);
|
||
|
Bitu adlib_reg_read(Bitu port);
|
||
|
void adlib_write_index(Bitu port, Bit8u val);
|
||
|
|
||
|
-#endif /* OPL_H */
|
||
|
-
|
||
|
#define opl_init() adlib_init(OUTPUT_QUALITY * 11025)
|
||
|
#define opl_write(reg, val) adlib_write(reg, val)
|
||
|
#define opl_update(buf, num) adlib_getsample(buf, num)
|
||
|
+
|
||
|
+#endif /* OPL_H */
|