123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365 |
- 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 */
|