DOSBox-X
|
00001 /* 00002 * Copyright (C) 2002-2020 The DOSBox Team 00003 * OPL2/OPL3 emulation library 00004 * 00005 * This library is free software; you can redistribute it and/or 00006 * modify it under the terms of the GNU Lesser General Public 00007 * License as published by the Free Software Foundation; either 00008 * version 2.1 of the License, or (at your option) any later version. 00009 * 00010 * This library is distributed in the hope that it will be useful, 00011 * but WITHOUT ANY WARRANTY; without even the implied warranty of 00012 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 00013 * Lesser General Public License for more details. 00014 * 00015 * You should have received a copy of the GNU Lesser General Public 00016 * License along with this library; if not, write to the Free Software 00017 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA 00018 */ 00019 00020 00021 /* 00022 * Originally based on ADLIBEMU.C, an AdLib/OPL2 emulation library by Ken Silverman 00023 * Copyright (C) 1998-2001 Ken Silverman 00024 * Ken Silverman's official web site: "http://www.advsys.net/ken" 00025 */ 00026 00027 00028 #define fltype double 00029 00030 /* 00031 define Bits, Bitu, Bit32s, Bit32u, Bit16s, Bit16u, Bit8s, Bit8u here 00032 */ 00033 /* 00034 #include <stdint.h> 00035 typedef uintptr_t Bitu; 00036 typedef intptr_t Bits; 00037 typedef uint32_t Bit32u; 00038 typedef int32_t Bit32s; 00039 typedef uint16_t Bit16u; 00040 typedef int16_t Bit16s; 00041 typedef uint8_t Bit8u; 00042 typedef int8_t Bit8s; 00043 */ 00044 00045 00046 /* 00047 define attribution that inlines/forces inlining of a function (optional) 00048 */ 00049 #define OPL_INLINE INLINE 00050 00051 00052 #undef NUM_CHANNELS 00053 #if defined(OPLTYPE_IS_OPL3) 00054 #define NUM_CHANNELS 18 00055 #else 00056 #define NUM_CHANNELS 9 00057 #endif 00058 00059 #define MAXOPERATORS (NUM_CHANNELS*2) 00060 00061 00062 #define FL05 ((fltype)0.5) 00063 #define FL2 ((fltype)2.0) 00064 #define PI ((fltype)3.1415926535897932384626433832795) 00065 00066 00067 #define FIXEDPT 0x10000 // fixed-point calculations using 16+16 00068 #define FIXEDPT_LFO 0x1000000 // fixed-point calculations using 8+24 00069 00070 #define WAVEPREC 1024 // waveform precision (10 bits) 00071 00072 #define INTFREQU ((fltype)(14318180.0 / 288.0)) // clocking of the chip 00073 00074 00075 #define OF_TYPE_ATT 0 00076 #define OF_TYPE_DEC 1 00077 #define OF_TYPE_REL 2 00078 #define OF_TYPE_SUS 3 00079 #define OF_TYPE_SUS_NOKEEP 4 00080 #define OF_TYPE_OFF 5 00081 00082 #define ARC_CONTROL 0x00 00083 #define ARC_TVS_KSR_MUL 0x20 00084 #define ARC_KSL_OUTLEV 0x40 00085 #define ARC_ATTR_DECR 0x60 00086 #define ARC_SUSL_RELR 0x80 00087 #define ARC_FREQ_NUM 0xa0 00088 #define ARC_KON_BNUM 0xb0 00089 #define ARC_PERC_MODE 0xbd 00090 #define ARC_FEEDBACK 0xc0 00091 #define ARC_WAVE_SEL 0xe0 00092 00093 #define ARC_SECONDSET 0x100 // second operator set for OPL3 00094 00095 00096 #define OP_ACT_OFF 0x00 00097 #define OP_ACT_NORMAL 0x01 // regular channel activated (bitmasked) 00098 #define OP_ACT_PERC 0x02 // percussion channel activated (bitmasked) 00099 00100 #define BLOCKBUF_SIZE 512 00101 00102 00103 // vibrato constants 00104 #define VIBTAB_SIZE 8 00105 #define VIBFAC 70/50000 // no braces, integer mul/div 00106 00107 // tremolo constants and table 00108 #define TREMTAB_SIZE 53 00109 #define TREM_FREQ ((fltype)(3.7)) // tremolo at 3.7hz 00110 00111 00112 /* operator struct definition 00113 For OPL2 all 9 channels consist of two operators each, carrier and modulator. 00114 Channel x has operators x as modulator and operators (9+x) as carrier. 00115 For OPL3 all 18 channels consist either of two operators (2op mode) or four 00116 operators (4op mode) which is determined through register4 of the second 00117 adlib register set. 00118 Only the channels 0,1,2 (first set) and 9,10,11 (second set) can act as 00119 4op channels. The two additional operators for a channel y come from the 00120 2op channel y+3 so the operatorss y, (9+y), y+3, (9+y)+3 make up a 4op 00121 channel. 00122 */ 00123 typedef struct operator_struct { 00124 Bit32s cval, lastcval; // current output/last output (used for feedback) 00125 Bit32u tcount, wfpos, tinc; // time (position in waveform) and time increment 00126 fltype amp, step_amp; // and amplification (envelope) 00127 fltype vol; // volume 00128 fltype sustain_level; // sustain level 00129 Bit32s mfbi; // feedback amount 00130 fltype a0, a1, a2, a3; // attack rate function coefficients 00131 fltype decaymul, releasemul; // decay/release rate functions 00132 Bit32u op_state; // current state of operator (attack/decay/sustain/release/off) 00133 Bit32u toff; 00134 Bit32s freq_high; // highest three bits of the frequency, used for vibrato calculations 00135 Bit16s* cur_wform; // start of selected waveform 00136 Bit32u cur_wmask; // mask for selected waveform 00137 Bit32u act_state; // activity state (regular, percussion) 00138 bool sus_keep; // keep sustain level when decay finished 00139 bool vibrato,tremolo; // vibrato/tremolo enable bits 00140 00141 // variables used to provide non-continuous envelopes 00142 Bit32u generator_pos; // for non-standard sample rates we need to determine how many samples have passed 00143 Bits cur_env_step; // current (standardized) sample position 00144 Bits env_step_a,env_step_d,env_step_r; // number of std samples of one step (for attack/decay/release mode) 00145 Bit8u step_skip_pos_a; // position of 8-cyclic step skipping (always 2^x to check against mask) 00146 Bits env_step_skip_a; // bitmask that determines if a step is skipped (respective bit is zero then) 00147 00148 #if defined(OPLTYPE_IS_OPL3) 00149 bool is_4op,is_4op_attached; // base of a 4op channel/part of a 4op channel 00150 Bit32s left_pan,right_pan; // opl3 stereo panning amount 00151 #endif 00152 } op_type; 00153 00154 // per-chip variables 00155 Bitu chip_num; 00156 op_type op[MAXOPERATORS]; 00157 00158 Bits int_samplerate; 00159 00160 Bit8u status; 00161 Bit32u opl_index; 00162 #if defined(OPLTYPE_IS_OPL3) 00163 Bit8u adlibreg[512]; // adlib register set (including second set) 00164 Bit8u wave_sel[44]; // waveform selection 00165 #else 00166 Bit8u adlibreg[256]; // adlib register set 00167 Bit8u wave_sel[22]; // waveform selection 00168 #endif 00169 00170 00171 // vibrato/tremolo increment/counter 00172 Bit32u vibtab_pos; 00173 Bit32u vibtab_add; 00174 Bit32u tremtab_pos; 00175 Bit32u tremtab_add; 00176 00177 00178 // enable an operator 00179 void enable_operator(Bitu regbase, op_type* op_pt); 00180 00181 // functions to change parameters of an operator 00182 void change_frequency(Bitu chanbase, Bitu regbase, op_type* op_pt); 00183 00184 void change_attackrate(Bitu regbase, op_type* op_pt); 00185 void change_decayrate(Bitu regbase, op_type* op_pt); 00186 void change_releaserate(Bitu regbase, op_type* op_pt); 00187 void change_sustainlevel(Bitu regbase, op_type* op_pt); 00188 void change_waveform(Bitu regbase, op_type* op_pt); 00189 void change_keepsustain(Bitu regbase, op_type* op_pt); 00190 void change_vibrato(Bitu regbase, op_type* op_pt); 00191 void change_feedback(Bitu chanbase, op_type* op_pt); 00192 00193 // general functions 00194 void adlib_init(Bit32u samplerate); 00195 void adlib_write(Bitu idx, Bit8u val); 00196 void adlib_getsample(Bit16s* sndptr, Bits numsamples); 00197 00198 Bitu adlib_reg_read(Bitu port); 00199 void adlib_write_index(Bitu port, Bit8u val); 00200 00201 static Bit32u generator_add; // should be a chip parameter