mirror of
https://github.com/ZDoom/gzdoom.git
synced 2024-11-10 14:51:40 +00:00
new opl3 emulator
This commit is contained in:
parent
601852d224
commit
e9075334a3
7 changed files with 1276 additions and 2 deletions
|
@ -992,6 +992,7 @@ add_executable( zdoom WIN32
|
||||||
oplsynth/opl_mus_player.cpp
|
oplsynth/opl_mus_player.cpp
|
||||||
oplsynth/dosbox/opl.cpp
|
oplsynth/dosbox/opl.cpp
|
||||||
oplsynth/OPL3.cpp
|
oplsynth/OPL3.cpp
|
||||||
|
oplsynth/nukedopl3.cpp
|
||||||
resourcefiles/ancientzip.cpp
|
resourcefiles/ancientzip.cpp
|
||||||
resourcefiles/file_7z.cpp
|
resourcefiles/file_7z.cpp
|
||||||
resourcefiles/file_grp.cpp
|
resourcefiles/file_grp.cpp
|
||||||
|
|
|
@ -323,7 +323,7 @@ int OPLio::OPLinit(uint numchips, bool stereo, bool initopl3)
|
||||||
{
|
{
|
||||||
assert(numchips >= 1 && numchips <= countof(chips));
|
assert(numchips >= 1 && numchips <= countof(chips));
|
||||||
uint i;
|
uint i;
|
||||||
IsOPL3 = (opl_core == 1 || opl_core == 2);
|
IsOPL3 = (opl_core == 1 || opl_core == 2 || opl_core == 3);
|
||||||
|
|
||||||
memset(chips, 0, sizeof(chips));
|
memset(chips, 0, sizeof(chips));
|
||||||
if (IsOPL3)
|
if (IsOPL3)
|
||||||
|
@ -332,7 +332,7 @@ int OPLio::OPLinit(uint numchips, bool stereo, bool initopl3)
|
||||||
}
|
}
|
||||||
for (i = 0; i < numchips; ++i)
|
for (i = 0; i < numchips; ++i)
|
||||||
{
|
{
|
||||||
OPLEmul *chip = IsOPL3 ? (opl_core == 1 ? DBOPLCreate(stereo) : JavaOPLCreate(stereo)) : YM3812Create(stereo);
|
OPLEmul *chip = IsOPL3 ? (opl_core == 1 ? DBOPLCreate(stereo) : (opl_core == 2 ? JavaOPLCreate(stereo) : NukedOPL3Create(stereo))) : YM3812Create(stereo);
|
||||||
if (chip == NULL)
|
if (chip == NULL)
|
||||||
{
|
{
|
||||||
break;
|
break;
|
||||||
|
|
1145
src/oplsynth/nukedopl3.cpp
Normal file
1145
src/oplsynth/nukedopl3.cpp
Normal file
File diff suppressed because it is too large
Load diff
118
src/oplsynth/nukedopl3.h
Normal file
118
src/oplsynth/nukedopl3.h
Normal file
|
@ -0,0 +1,118 @@
|
||||||
|
/*
|
||||||
|
* Copyright (C) 2013-2014 Nuke.YKT
|
||||||
|
*
|
||||||
|
* This library is free software; you can redistribute it and/or
|
||||||
|
* modify it under the terms of the GNU Lesser General Public
|
||||||
|
* License as published by the Free Software Foundation; either
|
||||||
|
* version 2.1 of the License, or (at your option) any later version.
|
||||||
|
*
|
||||||
|
* This library is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||||
|
* Lesser General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU Lesser General Public
|
||||||
|
* License along with this library; if not, write to the Free Software
|
||||||
|
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
|
||||||
|
*/
|
||||||
|
|
||||||
|
/*
|
||||||
|
Nuked Yamaha YMF262(aka OPL3) emulator.
|
||||||
|
Thanks:
|
||||||
|
MAME Development Team:
|
||||||
|
Feedback and Rhythm part calculation information.
|
||||||
|
forums.submarine.org.uk(carbon14, opl3):
|
||||||
|
Tremolo and phase generator calculation information.
|
||||||
|
*/
|
||||||
|
|
||||||
|
//version 1.4.2
|
||||||
|
|
||||||
|
#include "opl.h"
|
||||||
|
#include "muslib.h"
|
||||||
|
|
||||||
|
typedef uintptr_t Bitu;
|
||||||
|
typedef intptr_t Bits;
|
||||||
|
typedef DWORD Bit32u;
|
||||||
|
typedef SDWORD Bit32s;
|
||||||
|
typedef WORD Bit16u;
|
||||||
|
typedef SWORD Bit16s;
|
||||||
|
typedef BYTE Bit8u;
|
||||||
|
typedef SBYTE Bit8s;
|
||||||
|
|
||||||
|
struct channel {
|
||||||
|
Bit8u con;
|
||||||
|
Bit8u chtype;
|
||||||
|
Bit8u alg;
|
||||||
|
Bit16u offset;
|
||||||
|
Bit8u feedback;
|
||||||
|
Bit16u cha, chb, chc, chd;
|
||||||
|
Bit16s out;
|
||||||
|
Bit16u f_number;
|
||||||
|
Bit8u block;
|
||||||
|
Bit8u ksv;
|
||||||
|
float panl;
|
||||||
|
float panr;
|
||||||
|
};
|
||||||
|
|
||||||
|
struct slot {
|
||||||
|
Bit32u PG_pos;
|
||||||
|
Bit32u PG_inc;
|
||||||
|
Bit16s EG_out;
|
||||||
|
Bit8u eg_inc;
|
||||||
|
Bit8u eg_gen;
|
||||||
|
Bit8u eg_gennext;
|
||||||
|
Bit16u EG_mout;
|
||||||
|
Bit8u EG_ksl;
|
||||||
|
Bit8u EG_ar;
|
||||||
|
Bit8u EG_dr;
|
||||||
|
Bit8u EG_sl;
|
||||||
|
Bit8u EG_rr;
|
||||||
|
Bit8u EG_state;
|
||||||
|
Bit8u EG_type;
|
||||||
|
Bit16s out;
|
||||||
|
Bit16s *mod;
|
||||||
|
Bit16s prevout[2];
|
||||||
|
Bit16s fbmod;
|
||||||
|
Bit16u offset;
|
||||||
|
Bit8u mult;
|
||||||
|
Bit8u vibrato;
|
||||||
|
Bit8u tremolo;
|
||||||
|
Bit8u ksr;
|
||||||
|
Bit8u EG_tl;
|
||||||
|
Bit8u ksl;
|
||||||
|
Bit8u key;
|
||||||
|
Bit8u waveform;
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
struct chip {
|
||||||
|
Bit8u opl_memory[0x200];
|
||||||
|
Bit8u newm;
|
||||||
|
Bit8u nts;
|
||||||
|
Bit8u rhythm;
|
||||||
|
Bit8u dvb;
|
||||||
|
Bit8u dam;
|
||||||
|
Bit32u noise;
|
||||||
|
Bit16u vib_pos;
|
||||||
|
Bit16u timer;
|
||||||
|
Bit8u trem_inc;
|
||||||
|
Bit8u trem_tval;
|
||||||
|
Bit8u trem_dir;
|
||||||
|
Bit8u trem_val;
|
||||||
|
channel Channels[18];
|
||||||
|
slot OPs[36];
|
||||||
|
Bit16s zm;
|
||||||
|
};
|
||||||
|
|
||||||
|
class NukedOPL3 : public OPLEmul {
|
||||||
|
private:
|
||||||
|
chip opl3;
|
||||||
|
bool FullPan;
|
||||||
|
public:
|
||||||
|
void Reset();
|
||||||
|
void Update(float* sndptr, int numsamples);
|
||||||
|
void WriteReg(int reg, int v);
|
||||||
|
void SetPanning(int c, float left, float right);
|
||||||
|
|
||||||
|
NukedOPL3(bool stereo);
|
||||||
|
};
|
|
@ -20,6 +20,7 @@ public:
|
||||||
OPLEmul *YM3812Create(bool stereo);
|
OPLEmul *YM3812Create(bool stereo);
|
||||||
OPLEmul *DBOPLCreate(bool stereo);
|
OPLEmul *DBOPLCreate(bool stereo);
|
||||||
OPLEmul *JavaOPLCreate(bool stereo);
|
OPLEmul *JavaOPLCreate(bool stereo);
|
||||||
|
OPLEmul *NukedOPL3Create(bool stereo);
|
||||||
|
|
||||||
#define OPL_SAMPLE_RATE 49716.0
|
#define OPL_SAMPLE_RATE 49716.0
|
||||||
#define CENTER_PANNING_POWER 0.70710678118 /* [RH] volume at center for EQP */
|
#define CENTER_PANNING_POWER 0.70710678118 /* [RH] volume at center for EQP */
|
||||||
|
|
|
@ -1478,6 +1478,7 @@ OptionValue OplCores
|
||||||
0, "MAME OPL2"
|
0, "MAME OPL2"
|
||||||
1, "DOSBox OPL3"
|
1, "DOSBox OPL3"
|
||||||
2, "Java OPL3"
|
2, "Java OPL3"
|
||||||
|
3, "Nuked OPL3"
|
||||||
}
|
}
|
||||||
|
|
||||||
OptionMenu AdvSoundOptions
|
OptionMenu AdvSoundOptions
|
||||||
|
|
|
@ -2632,6 +2632,14 @@
|
||||||
RelativePath=".\src\oplsynth\opl_mus_player.h"
|
RelativePath=".\src\oplsynth\opl_mus_player.h"
|
||||||
>
|
>
|
||||||
</File>
|
</File>
|
||||||
|
<File
|
||||||
|
RelativePath=".\src\oplsynth\nukedopl3.cpp"
|
||||||
|
>
|
||||||
|
</File>
|
||||||
|
<File
|
||||||
|
RelativePath=".\src\oplsynth\nukedopl3.h"
|
||||||
|
>
|
||||||
|
</File>
|
||||||
<Filter
|
<Filter
|
||||||
Name="DOSBox"
|
Name="DOSBox"
|
||||||
>
|
>
|
||||||
|
|
Loading…
Reference in a new issue