aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--CMakeLists.txt9
-rw-r--r--fm_banks/adldata-cache.datbin576392 -> 576512 bytes
-rw-r--r--fm_banks/wopl_files/DMXOPL3-by-sneakernets-GS.woplbin118767 -> 118767 bytes
-rw-r--r--fm_banks/wopl_files/DMXOPL3-by-sneakernets.woplbin16983 -> 0 bytes
-rw-r--r--include/adlmidi.h3
-rw-r--r--src/adldata.cpp473
-rw-r--r--src/adlmidi.cpp22
-rw-r--r--src/adlmidi_load.cpp2
-rw-r--r--src/adlmidi_midiplay.cpp15
-rw-r--r--src/adlmidi_opl3.cpp30
-rw-r--r--src/adlmidi_private.cpp7
-rw-r--r--src/adlmidi_private.hpp12
-rw-r--r--src/chips/dosbox_opl3.cpp4
-rw-r--r--src/chips/dosbox_opl3.h1
-rw-r--r--src/chips/nuked_opl3.h1
-rw-r--r--src/chips/nuked_opl3_v174.h1
-rw-r--r--src/chips/opl_chip_base.h30
-rw-r--r--src/chips/opl_chip_base.tcc84
-rw-r--r--utils/adlmidi-2/midiplay.cc12
-rw-r--r--utils/midiplay/adlmidiplay.cpp56
20 files changed, 493 insertions, 269 deletions
diff --git a/CMakeLists.txt b/CMakeLists.txt
index c26d5ee..d75342f 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -312,12 +312,12 @@ if(WITH_MIDIPLAY)
)
if(MIDIPLAY_WAVE_ONLY)
- target_compile_options(adlmidiplay PUBLIC "-DOUTPUT_WAVE_ONLY")
+ target_compile_definitions(adlmidiplay PUBLIC "-DOUTPUT_WAVE_ONLY")
message("Demo tool will only output WAVE file, no playing support.")
endif()
if(MSDOS OR DJGPP)
- target_compile_options(adlmidiplay PUBLIC "-DHARDWARE_OPL3")
+ target_compile_definitions(adlmidiplay PUBLIC "-DHARDWARE_OPL3")
message("Turn on hardware OPL3 support on demo tool")
endif()
@@ -385,6 +385,11 @@ if(WITH_ADLMIDI2)
target_compile_definitions(adlmidi2 PUBLIC "-DSUPPORT_VIDEO_OUTPUT")
endif()
+ if(MSDOS OR DJGPP)
+ target_compile_definitions(adlmidi2 PUBLIC "-DHARDWARE_OPL3")
+ message("Turn on hardware OPL3 support on ADLMIDI2 tool")
+ endif()
+
if(WIN32)
target_link_libraries(adlmidi2 ADLMIDI winmm)
elseif(DJGPP OR MSDOS)
diff --git a/fm_banks/adldata-cache.dat b/fm_banks/adldata-cache.dat
index 53f19dc..fceb033 100644
--- a/fm_banks/adldata-cache.dat
+++ b/fm_banks/adldata-cache.dat
Binary files differ
diff --git a/fm_banks/wopl_files/DMXOPL3-by-sneakernets-GS.wopl b/fm_banks/wopl_files/DMXOPL3-by-sneakernets-GS.wopl
index 957f950..b14a68d 100644
--- a/fm_banks/wopl_files/DMXOPL3-by-sneakernets-GS.wopl
+++ b/fm_banks/wopl_files/DMXOPL3-by-sneakernets-GS.wopl
Binary files differ
diff --git a/fm_banks/wopl_files/DMXOPL3-by-sneakernets.wopl b/fm_banks/wopl_files/DMXOPL3-by-sneakernets.wopl
deleted file mode 100644
index 6cdf0c8..0000000
--- a/fm_banks/wopl_files/DMXOPL3-by-sneakernets.wopl
+++ /dev/null
Binary files differ
diff --git a/include/adlmidi.h b/include/adlmidi.h
index c64f55c..51cd968 100644
--- a/include/adlmidi.h
+++ b/include/adlmidi.h
@@ -219,6 +219,9 @@ typedef struct {
ADL_UInt16 patch;
} ADL_Version;
+/*Run emulator with PCM rate to reduce CPU usage on slow devices. May decrease sounding accuracy.*/
+extern int adl_setRunAtPcmRate(struct ADL_MIDIPlayer *device, int enabled);
+
/*Returns string which contains a version number*/
extern const char *adl_linkedLibraryVersion();
diff --git a/src/adldata.cpp b/src/adldata.cpp
index 49eb36c..7215d7c 100644
--- a/src/adldata.cpp
+++ b/src/adldata.cpp
@@ -4,7 +4,7 @@
* FROM A NUMBER OF SOURCES, MOSTLY PC GAMES.
* PREPROCESSED, CONVERTED, AND POSTPROCESSED OFF-SCREEN.
*/
-const adldata adl[4535] =
+const adldata adl[4537] =
{ // ,---------+-------- Wave select settings
// | ,-------ч-+------ Sustain/release rates
// | | ,-----ч-ч-+---- Attack/decay rates
@@ -4205,34 +4205,34 @@ const adldata adl[4535] =
{ 0x2C79613,0x4E45411, 0xD7,0x08, 0xA, +0 },
{ 0x023E133,0x0F2F131, 0xA2,0x09, 0xE, +0 },
{ 0x023F132,0x0F2F131, 0x24,0x0A, 0xE, +0 },
- { 0x5C3C404,0x1B4B519, 0xA1,0x00, 0xC, -31 },
- { 0x17A9913,0x0B4F213, 0x0F,0x00, 0x8, -19 },
- { 0x223F832,0x4055421, 0x99,0x8A, 0xC, +0 },
+ { 0x4C3C404,0x4B4B519, 0x21,0x05, 0x0, -31 },
+ { 0x17A9913,0x0B4F213, 0x0F,0x00, 0x0, -19 },
+ { 0x223F832,0x4056421, 0x99,0x8A, 0xC, +0 },
{ 0x433CB32,0x5057561, 0x9B,0x8A, 0xA, +0 },
{ 0x1029033,0x4044561, 0x5B,0x85, 0x4, +0 },
{ 0x4109033,0x2044520, 0xA8,0x85, 0xA, +0 },
- { 0x2034170,0x0043671, 0x08,0x20, 0x9, +0 },
- { 0x1022171,0x0042671, 0x0C,0x17, 0xB, +0 },
+ { 0x2034170,0x0043671, 0x0B,0x20, 0xB, +0 },
+ { 0x1024171,0x0043671, 0x0C,0x17, 0xB, +0 },
{ 0x005A061,0x0F55022, 0x69,0x06, 0x0, +0 },
{ 0x0008060,0x0F55021, 0x33,0x08, 0x0, +12 },
{ 0x239B420,0x0076121, 0x50,0x05, 0x6, +0 },
{ 0x139B462,0x00D7161, 0x91,0x14, 0x0, +0 },
- { 0x05470F1,0x07460B1, 0x5A,0x80, 0x0, +0 },
- { 0x054A0F1,0x07460B1, 0x5E,0x80, 0x0, +0 },
- { 0x2436110,0x114D211, 0x90,0x00, 0xC, +0 },
- { 0x1436192,0x145F312, 0x8F,0x00, 0xC, +0 },
+ { 0x05470F1,0x07440B1, 0x69,0x80, 0x0, +0 },
+ { 0x054A0F1,0x07430B1, 0x5E,0x80, 0x0, +0 },
+ { 0x2436110,0x714D211, 0xCD,0x00, 0xA, +0 },
+ { 0x5436192,0x745F312, 0xCB,0x00, 0xA, +0 },
{ 0x0147421,0x0077521, 0x94,0x04, 0xE, +0 },
{ 0x0178461,0x008AF28, 0x10,0xA6, 0xC, +0 },
{ 0x0235271,0x0198161, 0x1E,0x08, 0xE, +0 },
{ 0x0235361,0x0196161, 0x1D,0x03, 0xE, +0 },
{ 0x0155331,0x0378261, 0x94,0x00, 0xA, +0 },
{ 0x118543A,0x5177472, 0x1E,0x00, 0x4, -12 },
- { 0x0364121,0x02B7221, 0x21,0x08, 0xC, +0 },
- { 0x026F021,0x0056121, 0x26,0x03, 0xC, +0 },
+ { 0x0365121,0x0257221, 0x1E,0x08, 0x0, +0 },
+ { 0x2844521,0x20592A0, 0x23,0x03, 0x0, +0 },
{ 0x0578321,0x117C021, 0x19,0x03, 0xC, +0 },
{ 0x2E77530,0x307F520, 0x10,0x08, 0x8, +0 },
- { 0x036F121,0x337F121, 0x92,0x08, 0xE, +0 },
- { 0x0368121,0x037F121, 0x92,0x08, 0xE, +0 },
+ { 0x036F121,0x337F121, 0x95,0x08, 0xE, +0 },
+ { 0x0368121,0x037F121, 0x95,0x08, 0xE, +0 },
{ 0x0A66121,0x0976121, 0x9B,0x08, 0xE, +0 },
{ 0x5237731,0x1F65012, 0x4B,0x00, 0xA, +0 },
{ 0x0137732,0x0F65011, 0xC7,0x0A, 0xA, +0 },
@@ -4300,8 +4300,8 @@ const adldata adl[4535] =
{ 0x5522363,0x0131331, 0x1A,0x8D, 0x7, +0 },
{ 0x0B67061,0x0928032, 0x9C,0x11, 0xA, +0 },
{ 0x0057F21,0x0038F62, 0x9C,0x11, 0xA, +0 },
- { 0x0025511,0x1748201, 0x94,0x06, 0xE, +0 },
- { 0x2045501,0x2445501, 0x15,0x0D, 0xA, +0 },
+ { 0x0625331,0x1648221, 0x94,0x06, 0xE, +0 },
+ { 0x2645321,0x2445521, 0x15,0x0D, 0xA, +0 },
{ 0x0B37121,0x5F48221, 0x16,0x08, 0x2, +0 },
{ 0x2B37102,0x5F48221, 0x90,0x08, 0x6, +0 },
{ 0x1127533,0x4F4F211, 0x58,0x03, 0x6, +0 },
@@ -4355,12 +4355,14 @@ const adldata adl[4535] =
{ 0x048FA00,0x008F900, 0x00,0x00, 0x6, +12 },
{ 0x287F702,0x678F802, 0x80,0x88, 0xE, +12 },
{ 0x2F7F602,0x0F8F802, 0x00,0x88, 0xE, +12 },
+ { 0x008F700,0x007F609, 0x00,0x00, 0xD, -24 },
+ { 0x0F1F105,0x0078407, 0x00,0x08, 0xC, -12 },
{ 0x05476C1,0x30892C5, 0x80,0x08, 0x0, +0 },
{ 0x05477C1,0x30892C5, 0x00,0x08, 0xA, -2 },
{ 0x007C604,0x007C604, 0x08,0x08, 0x1, +0 },
{ 0x201F302,0x057AB09, 0x03,0x07, 0xC, +12 },
- { 0x254F307,0x307F905, 0x04,0x08, 0x6, -5 },
- { 0x254F307,0x207F905, 0x04,0x08, 0x8, +0 },
+ { 0x058F30B,0x308F90D, 0x04,0x08, 0x6, +0 },
+ { 0x255F308,0x308F909, 0x04,0x08, 0x8, +4 },
{ 0x006C604,0x007C604, 0x08,0x08, 0x1, +0 },
{ 0x201F312,0x057AB09, 0x03,0x07, 0xC, +12 },
{ 0x254D307,0x3288905, 0x04,0x03, 0xA, -5 },
@@ -4552,7 +4554,7 @@ const adldata adl[4535] =
{ 0x07BF003,0x07BF502, 0x8A,0x80, 0x8, +0 },
{ 0x07BF003,0x07BF402, 0x8A,0x80, 0x8, +0 },
};
-const struct adlinsdata adlins[4803] =
+const struct adlinsdata adlins[4804] =
{
{ 0, 0, 0, 0, 9006, 133,0 },
{ 1, 1, 0, 0, 9206, 146,0 },
@@ -9068,20 +9070,20 @@ const struct adlinsdata adlins[4803] =
{4183,4184, 0, 1, 40000, 440,0.078125 },
{4185,4186, 0, 1, 2160, 606,0.109375 },
{4187,4188, 0, 1, 14753, 2400,0.03125 },
- {4189,4190, 0, 1, 7693, 0,0.03125 },
+ {4189,4190, 0, 1, 7680, 646,0.03125 },
{4191,4192, 0, 1, 40000, 446,0.0625 },
{4193,4194, 0, 1, 40000, 866,-0.0625 },
- {4195,4195, 0, 1, 40000, 1226,0.109375 },
- {4196,4196, 0, 1, 40000, 1960,0.109375 },
+ {4195,4195, 0, 1, 40000, 1220,0.078125 },
+ {4196,4196, 0, 1, 40000, 1960,0.0625 },
{4197,4198, 0, 1, 40000, 433,0.125 },
{4199,4200, 0, 1, 40000, 140,0.140625 },
- {4201,4202, 0, 1, 40000, 706,0.15625 },
- {4203,4204, 0, 1, 1640, 0,0.125 },
+ {4201,4202, 0, 1, 40000, 806,0.109375 },
+ {4203,4204, 0, 1, 2040, 486,0.125 },
{4205,4206, 0, 1, 40000, 86,0 },
{4207,4208, 0, 1, 40000, 80,0.03125 },
{4209,4209, 0, 0, 40000, 73,0 },
{4210,4210, 0, 0, 40000, 126,0 },
- {4211,4212, 0, 1, 40000, 353,0.03125 },
+ {4211,4212, 0, 1, 40000, 400,0.0625 },
{4213,4214, 0, 1, 40000, 120,0.0625 },
{4215,4216, 0, 1, 40000, 0,0.09375 },
{4217,4217, 0, 1, 40000, 0,0.125 },
@@ -9124,7 +9126,7 @@ const struct adlinsdata adlins[4803] =
{4278,4279, 0, 1, 9000, 3186,0.125 },
{4280,4281, 0, 1, 40000, 1073,-0.078125 },
{4282,4283, 0, 1, 40000, 2093,0.140625 },
- {4284,4285, 0, 1, 5640, 440,0.078125 },
+ {4284,4285, 0, 1, 40000, 0,0.078125 },
{4286,4287, 0, 1, 9580, 713,0.03125 },
{4288,4289, 0, 1, 6286, 380,0 },
{4290,4291, 0, 1, 2220, 426,0.03125 },
@@ -9160,203 +9162,204 @@ const struct adlinsdata adlins[4803] =
{4334,4335, 25, 1, 313, 153,0 },
{4336,4335, 25, 1, 206, 100,0 },
{4337,4338, 61, 1, 153, 93,0 },
- {4339,4340, 37, 1, 206, 93,0 },
- {4341,4342, 15, 1, 346, 153,0 },
- {4343,4344, 48, 1, 280, 133,-1.90625 },
- {4345,4346, 19, 1, 553, 200,0 },
- {4347,4347, 48, 0, 180, 86,0 },
- {4348,4349, 15, 1, 333, 153,0 },
- {4350,4351, 12, 1, 340, 146,0 },
- {4352,4353, 11, 1, 346, 146,0 },
- {4354,4355, 61, 1, 2706, 1033,0.09375 },
- {4356,4353, 8, 1, 340, 146,0 },
- {4357,4358, 91, 1, 1166, 366,-0.046875 },
- {4359,4359, 70, 0, 966, 346,0 },
- {4360,4361, 80, 1, 300, 93,0.125 },
- {4362,4362, 58, 0, 206, 53,0 },
- {4363,4355, 62, 1, 2333, 820,0.09375 },
- {4364,4365, 31, 1, 773, 200,0 },
- {4366,4358, 91, 1, 1160, 360,-0.03125 },
- {4367,4368, 41, 1, 373, 113,0 },
- {4369,4370, 35, 1, 406, 126,0 },
- {4371,4372, 29, 1, 146, 106,0 },
- {4373,4374, 41, 1, 400, 126,0 },
- {4373,4374, 37, 1, 400, 126,0 },
- {4375,4376, 54, 1, 286, 133,0 },
- {4375,4377, 48, 1, 286, 126,0 },
- {4378,4379, 77, 1, 193, 93,0 },
- {4380,4381, 72, 1, 200, 93,0 },
- {4382,4382, 40, 0, 513, 0,0 },
- {4383,4383, 38, 0, 200, 20,0 },
- {4384,4384, 36, 0, 620, 20,0 },
- {4385,4386, 60, 1, 120, 80,0 },
- {4386,4387, 60, 1, 380, 80,0 },
- {4388,4388, 73, 0, 166, 33,0 },
- {4389,4390, 68, 1, 153, 40,0 },
- {4391,4392, 18, 1, 200, 80,0 },
- {4393,4394, 18, 1, 253, 73,0 },
- {4395,4395, 90, 0, 193, 20,0 },
- {4396,4396, 90, 0, 793, 40,0 },
- {4397,4398, 64, 1, 373, 73,0.03125 },
- {4399,4400, 80, 1, 406, 153,0.03125 },
- {4401,4402, 64, 1, 1866, 606,0 },
- {4403,4403, 67, 0, 106, 26,0 },
- {4404,4405, 50, 1, 173, 0,0 },
- {4406,4406, 36, 0, 4646, 0,0 },
- {4407,4407, 0, 0, 40000, 86,0 },
- {4408,4408, 0, 0, 40000, 73,0 },
- {4409,4409, 0, 0, 2433, 700,0 },
- {4410,4410, 0, 0, 1233, 26,0 },
- {4411,4411, 0, 0, 40000, 66,0 },
- {4412,4412, 0, 0, 40000, 60,0 },
- {4413,4413, 0, 0, 40000, 60,0 },
- {4414,4414, 0, 0, 40000, 66,0 },
- {4415,4415, 0, 0, 40000, 66,0 },
- {4416,4416, 0, 0, 40000, 0,0 },
- {4416,4416, 73, 0, 40000, 0,0 },
- {4417,4417, 0, 0, 40000, 60,0 },
- {4418,4418, 0, 0, 40000, 60,0 },
- {4419,4419, 0, 0, 7326, 2486,0 },
- {4420,4420, 0, 0, 4886, 1586,0 },
- {4421,4421, 0, 0, 646, 20,0 },
- {4422,4422, 0, 0, 253, 20,0 },
- {4422,4422, 12, 0, 253, 20,0 },
- {4423,4423, 0, 0, 640, 100,0 },
- {4423,4423, 1, 0, 640, 106,0 },
- {4424,4424, 0, 0, 133, 106,0 },
- {4424,4424, 23, 0, 133, 106,0 },
- {4425,4425, 0, 0, 653, 100,0 },
- {4426,4426, 0, 0, 4166, 1546,0 },
- {4427,4427, 0, 0, 40000, 73,0 },
- {4428,4428, 0, 0, 40000, 60,0 },
- {4429,4429, 0, 0, 40000, 53,0 },
- {4430,4430, 0, 0, 40000, 0,0 },
- {4431,4431, 0, 0, 246, 20,0 },
- {4432,4432, 0, 2, 6, 0,0 },
- {4433,4433, 0, 0, 4946, 233,0 },
- {4434,4434, 0, 0, 4946, 233,0 },
- {4435,4435, 0, 0, 4953, 240,0 },
+ {4339,4340, 38, 1, 340, 133,0 },
+ {4341,4342, 37, 1, 206, 93,0 },
+ {4343,4344, 15, 1, 346, 153,0 },
+ {4345,4346,100, 1, 146, 0,0.140625 },
+ {4347,4348, 19, 1, 553, 200,0 },
+ {4349,4349, 48, 0, 180, 86,0 },
+ {4350,4351, 15, 1, 333, 153,0 },
+ {4352,4353, 12, 1, 340, 146,0 },
+ {4354,4355, 11, 1, 346, 146,0 },
+ {4356,4357, 61, 1, 2706, 1033,0.09375 },
+ {4358,4355, 8, 1, 340, 146,0 },
+ {4359,4360, 91, 1, 1166, 366,-0.046875 },
+ {4361,4361, 70, 0, 966, 346,0 },
+ {4362,4363, 80, 1, 300, 93,0.125 },
+ {4364,4364, 58, 0, 206, 53,0 },
+ {4365,4357, 62, 1, 2333, 820,0.09375 },
+ {4366,4367, 31, 1, 773, 200,0 },
+ {4368,4360, 91, 1, 1160, 360,-0.03125 },
+ {4369,4370, 41, 1, 373, 113,0 },
+ {4371,4372, 35, 1, 406, 126,0 },
+ {4373,4374, 29, 1, 146, 106,0 },
+ {4375,4376, 41, 1, 400, 126,0 },
+ {4375,4376, 37, 1, 400, 126,0 },
+ {4377,4378, 54, 1, 286, 133,0 },
+ {4377,4379, 48, 1, 286, 126,0 },
+ {4380,4381, 77, 1, 193, 93,0 },
+ {4382,4383, 72, 1, 200, 93,0 },
+ {4384,4384, 40, 0, 513, 0,0 },
+ {4385,4385, 38, 0, 200, 20,0 },
+ {4386,4386, 36, 0, 620, 20,0 },
+ {4387,4388, 60, 1, 120, 80,0 },
+ {4388,4389, 60, 1, 380, 80,0 },
+ {4390,4390, 73, 0, 166, 33,0 },
+ {4391,4392, 68, 1, 153, 40,0 },
+ {4393,4394, 18, 1, 200, 80,0 },
+ {4395,4396, 18, 1, 253, 73,0 },
+ {4397,4397, 90, 0, 193, 20,0 },
+ {4398,4398, 90, 0, 793, 40,0 },
+ {4399,4400, 64, 1, 373, 73,0.03125 },
+ {4401,4402, 80, 1, 406, 153,0.03125 },
+ {4403,4404, 64, 1, 1866, 606,0 },
+ {4405,4405, 67, 0, 106, 26,0 },
+ {4406,4407, 50, 1, 173, 0,0 },
+ {4408,4408, 36, 0, 4646, 0,0 },
+ {4409,4409, 0, 0, 40000, 86,0 },
+ {4410,4410, 0, 0, 40000, 73,0 },
+ {4411,4411, 0, 0, 2433, 700,0 },
+ {4412,4412, 0, 0, 1233, 26,0 },
+ {4413,4413, 0, 0, 40000, 66,0 },
+ {4414,4414, 0, 0, 40000, 60,0 },
+ {4415,4415, 0, 0, 40000, 60,0 },
+ {4416,4416, 0, 0, 40000, 66,0 },
+ {4417,4417, 0, 0, 40000, 66,0 },
+ {4418,4418, 0, 0, 40000, 0,0 },
+ {4418,4418, 73, 0, 40000, 0,0 },
+ {4419,4419, 0, 0, 40000, 60,0 },
+ {4420,4420, 0, 0, 40000, 60,0 },
+ {4421,4421, 0, 0, 7326, 2486,0 },
+ {4422,4422, 0, 0, 4886, 1586,0 },
+ {4423,4423, 0, 0, 646, 20,0 },
+ {4424,4424, 0, 0, 253, 20,0 },
+ {4424,4424, 12, 0, 253, 20,0 },
+ {4425,4425, 0, 0, 640, 100,0 },
+ {4425,4425, 1, 0, 640, 106,0 },
+ {4426,4426, 0, 0, 133, 106,0 },
+ {4426,4426, 23, 0, 133, 106,0 },
+ {4427,4427, 0, 0, 653, 100,0 },
+ {4428,4428, 0, 0, 4166, 1546,0 },
+ {4429,4429, 0, 0, 40000, 73,0 },
+ {4430,4430, 0, 0, 40000, 60,0 },
+ {4431,4431, 0, 0, 40000, 53,0 },
+ {4432,4432, 0, 0, 40000, 0,0 },
+ {4433,4433, 0, 0, 246, 20,0 },
+ {4434,4434, 0, 2, 6, 0,0 },
+ {4435,4435, 0, 0, 4946, 233,0 },
{4436,4436, 0, 0, 4946, 233,0 },
- {4437,4437, 0, 0, 18233, 46,0 },
- {4438,4438, 0, 0, 2386, 26,0 },
- {4439,4439, 0, 0, 4640, 633,0 },
- {4440,4440, 0, 0, 18466, 100,0 },
- {4441,4441, 0, 0, 18440, 66,-2 },
- {4442,4442, 0, 0, 18440, 6140,-2 },
- {4443,4443, 0, 0, 1206, 433,-2 },
- {4444,4444, 0, 0, 4626, 240,0 },
- {4445,4445, 0, 0, 726, 400,0 },
- {4446,4446, 0, 0, 5866, 73,0 },
- {4447,4447, 0, 0, 40000, 73,0 },
- {4448,4448, 0, 0, 40000, 73,0 },
+ {4437,4437, 0, 0, 4953, 240,0 },
+ {4438,4438, 0, 0, 4946, 233,0 },
+ {4439,4439, 0, 0, 18233, 46,0 },
+ {4440,4440, 0, 0, 2386, 26,0 },
+ {4441,4441, 0, 0, 4640, 633,0 },
+ {4442,4442, 0, 0, 18466, 100,0 },
+ {4443,4443, 0, 0, 18440, 66,-2 },
+ {4444,4444, 0, 0, 18440, 6140,-2 },
+ {4445,4445, 0, 0, 1206, 433,-2 },
+ {4446,4446, 0, 0, 4626, 240,0 },
+ {4447,4447, 0, 0, 726, 400,0 },
+ {4448,4448, 0, 0, 5866, 73,0 },
{4449,4449, 0, 0, 40000, 73,0 },
{4450,4450, 0, 0, 40000, 73,0 },
- {4451,4451, 0, 0, 6500, 346,0 },
- {4452,4452, 0, 0, 6506, 346,0 },
- {4453,4453, 0, 0, 40000, 66,-2 },
- {4454,4454, 0, 0, 40000, 66,-2 },
- {4455,4455, 0, 0, 40000, 0,0 },
- {4456,4456, 0, 0, 40000, 46,0 },
+ {4451,4451, 0, 0, 40000, 73,0 },
+ {4452,4452, 0, 0, 40000, 73,0 },
+ {4453,4453, 0, 0, 6500, 346,0 },
+ {4454,4454, 0, 0, 6506, 346,0 },
+ {4455,4455, 0, 0, 40000, 66,-2 },
+ {4456,4456, 0, 0, 40000, 66,-2 },
{4457,4457, 0, 0, 40000, 0,0 },
- {4457,4457, 0, 0, 40000, 0,-2 },
- {4458,4458, 0, 0, 2386, 26,0 },
- {4459,4459, 0, 0, 40000, 73,-2 },
- {4460,4460, 0, 0, 5866, 26,-2 },
- {4461,4461, 0, 0, 40000, 133,0 },
- {4462,4462, 0, 0, 40000, 133,0 },
- {4463,4463, 0, 0, 40000, 126,0 },
- {4464,4464, 0, 0, 253, 20,0 },
- {4465,4465, 0, 0, 8866, 1366,0 },
- {4466,4466, 0, 0, 1040, 766,0 },
- {4467,4467, 0, 0, 40000, 146,-2 },
- {4468,4468, 0, 0, 40000, 153,-2 },
- {4469,4469, 0, 0, 40000, 466,-2 },
- {4470,4470, 0, 0, 40000, 66,0 },
- {4471,4471, 0, 0, 2333, 566,0 },
- {4472,4472, 0, 0, 40000, 140,-2 },
- {4473,4473, 0, 0, 40000, 100,-2 },
- {4474,4474, 0, 0, 40000, 226,-2 },
- {4475,4475, 0, 0, 40000, 0,0 },
+ {4458,4458, 0, 0, 40000, 46,0 },
+ {4459,4459, 0, 0, 40000, 0,0 },
+ {4459,4459, 0, 0, 40000, 0,-2 },
+ {4460,4460, 0, 0, 2386, 26,0 },
+ {4461,4461, 0, 0, 40000, 73,-2 },
+ {4462,4462, 0, 0, 5866, 26,-2 },
+ {4463,4463, 0, 0, 40000, 133,0 },
+ {4464,4464, 0, 0, 40000, 133,0 },
+ {4465,4465, 0, 0, 40000, 126,0 },
+ {4466,4466, 0, 0, 253, 20,0 },
+ {4467,4467, 0, 0, 8866, 1366,0 },
+ {4468,4468, 0, 0, 1040, 766,0 },
+ {4469,4469, 0, 0, 40000, 146,-2 },
+ {4470,4470, 0, 0, 40000, 153,-2 },
+ {4471,4471, 0, 0, 40000, 466,-2 },
+ {4472,4472, 0, 0, 40000, 66,0 },
+ {4473,4473, 0, 0, 2333, 566,0 },
+ {4474,4474, 0, 0, 40000, 140,-2 },
+ {4475,4475, 0, 0, 40000, 100,-2 },
+ {4476,4476, 0, 0, 40000, 226,-2 },
+ {4477,4477, 0, 0, 40000, 0,0 },
{3712,3712, 0, 0, 40000, 226,-2 },
- {4476,4476, 0, 0, 40000, 140,-2 },
- {4477,4477, 0, 0, 40000, 66,0 },
- {4478,4478, 0, 0, 40000, 73,0 },
- {4479,4479, 0, 0, 40000, 73,0 },
- {4480,4480, 0, 0, 40000, 86,-2 },
- {4481,4481, 0, 0, 40000, 80,0 },
- {4482,4482, 0, 0, 40000, 73,-2 },
- {4483,4483, 0, 0, 40000, 80,-2 },
+ {4478,4478, 0, 0, 40000, 140,-2 },
+ {4479,4479, 0, 0, 40000, 66,0 },
+ {4480,4480, 0, 0, 40000, 73,0 },
+ {4481,4481, 0, 0, 40000, 73,0 },
+ {4482,4482, 0, 0, 40000, 86,-2 },
+ {4483,4483, 0, 0, 40000, 80,0 },
{4484,4484, 0, 0, 40000, 73,-2 },
- {4485,4485, 0, 0, 40000, 73,0 },
- {4486,4486, 0, 0, 40000, 73,0 },
- {4487,4487, 0, 0, 40000, 93,0 },
+ {4485,4485, 0, 0, 40000, 80,-2 },
+ {4486,4486, 0, 0, 40000, 73,-2 },
+ {4487,4487, 0, 0, 40000, 73,0 },
{4488,4488, 0, 0, 40000, 73,0 },
- {4489,4489, 0, 0, 11946, 13,0 },
+ {4489,4489, 0, 0, 40000, 93,0 },
{4490,4490, 0, 0, 40000, 73,0 },
- {4460,4460, 0, 0, 5866, 26,0 },
- {4491,4491, 0, 0, 40000, 820,0 },
- {4492,4492, 0, 0, 2153, 873,0 },
+ {4491,4491, 0, 0, 11946, 13,0 },
+ {4492,4492, 0, 0, 40000, 73,0 },
+ {4462,4462, 0, 0, 5866, 26,0 },
+ {4493,4493, 0, 0, 40000, 820,0 },
+ {4494,4494, 0, 0, 2153, 873,0 },
{1221,1221, 0, 0, 40000, 293,0.171875 },
- {4493,4493, 0, 0, 1620, 120,0 },
- {4494,4494, 0, 0, 15120, 93,0 },
- {4495,4495, 0, 0, 14613, 93,0 },
- {4496,4496, 0, 0, 2346, 793,0 },
- {4497,4497, 0, 0, 40000, 2380,0 },
- {4498,4498, 0, 0, 40000, 1280,0 },
- {4499,4499, 0, 0, 40000, 1460,0 },
- {4500,4500, 0, 0, 40000, 2513,0 },
- {4501,4501, 0, 0, 14840, 1266,0 },
- {4502,4502, 0, 0, 4513, 640,0 },
- {4503,4503, 0, 0, 4680, 806,0 },
- {4504,4504, 0, 0, 40000, 100,0 },
- {4505,4505, 0, 0, 40000, 66,0 },
- {4506,4506, 0, 0, 2420, 413,0 },
- {4507,4507, 0, 0, 406, 73,-2 },
- {4508,4508, 0, 0, 1166, 400,0 },
- {4509,4509, 0, 0, 1213, 106,0 },
- {4510,4510, 0, 0, 273, 60,-2 },
- {4511,4511, 0, 0, 40000, 2380,0 },
- {4512,4512, 0, 0, 40000, 440,0 },
+ {4495,4495, 0, 0, 1620, 120,0 },
+ {4496,4496, 0, 0, 15120, 93,0 },
+ {4497,4497, 0, 0, 14613, 93,0 },
+ {4498,4498, 0, 0, 2346, 793,0 },
+ {4499,4499, 0, 0, 40000, 2380,0 },
+ {4500,4500, 0, 0, 40000, 1280,0 },
+ {4501,4501, 0, 0, 40000, 1460,0 },
+ {4502,4502, 0, 0, 40000, 2513,0 },
+ {4503,4503, 0, 0, 14840, 1266,0 },
+ {4504,4504, 0, 0, 4513, 640,0 },
+ {4505,4505, 0, 0, 4680, 806,0 },
+ {4506,4506, 0, 0, 40000, 100,0 },
+ {4507,4507, 0, 0, 40000, 66,0 },
+ {4508,4508, 0, 0, 2420, 413,0 },
+ {4509,4509, 0, 0, 406, 73,-2 },
+ {4510,4510, 0, 0, 1166, 400,0 },
+ {4511,4511, 0, 0, 1213, 106,0 },
+ {4512,4512, 0, 0, 273, 60,-2 },
+ {4513,4513, 0, 0, 40000, 2380,0 },
+ {4514,4514, 0, 0, 40000, 440,0 },
{1261,1261, 0, 0, 40000, 2960,0 },
- {4513,4513, 37, 0, 973, 73,-2 },
- {4514,4514, 48, 0, 106, 0,-2 },
- {4515,4515, 48, 0, 286, 133,-2 },
- {4516,4516, 62, 0, 166, 60,0 },
- {4517,4517, 44, 0, 980, 360,0 },
- {4518,4518, 80, 0, 100, 0,0 },
- {4517,4517, 50, 0, 980, 346,0 },
- {4519,4519, 48, 0, 106, 0,-2 },
- {4517,4517, 55, 0, 973, 360,0 },
- {4520,4520, 61, 0, 513, 20,0 },
- {4517,4517, 58, 0, 966, 353,0 },
- {4517,4517, 63, 0, 973, 353,0 },
- {4521,4521, 71, 0, 1366, 580,0 },
- {4517,4517, 72, 0, 820, 306,0 },
- {4522,4522, 70, 0, 1886, 666,0 },
- {4521,4521, 88, 0, 1353, 560,0 },
- {4523,4523, 76, 0, 1873, 653,0 },
- {4524,4524, 84, 0, 260, 113,0 },
- {4521,4521, 68, 0, 1366, 553,0 },
- {4525,4525, 72, 0, 153, 53,0 },
- {4526,4526, 28, 0, 1193, 413,0 },
- {4522,4522, 81, 0, 1353, 480,0 },
- {4527,4527, 58, 0, 246, 120,-2 },
- {4527,4527, 55, 0, 246, 120,-2 },
- {4527,4527, 44, 0, 246, 120,-2 },
- {4527,4527, 49, 0, 246, 120,-2 },
- {4527,4527, 40, 0, 286, 133,-2 },
- {4528,4528, 55, 0, 740, 560,-2 },
- {4528,4528, 48, 0, 893, 693,-2 },
- {4529,4529, 52, 0, 513, 206,0 },
- {4529,4529, 45, 0, 513, 206,0 },
- {4530,4530, 48, 0, 173, 100,-2 },
- {4531,4531, 48, 0, 120, 266,-2 },
- {4532,4532, 48, 0, 253, 60,-2 },
- {4507,4507, 73, 0, 160, 20,-2 },
- {4507,4507, 68, 0, 160, 20,-2 },
- {4507,4507, 63, 0, 193, 20,-2 },
- {4533,4533,108, 0, 406, 26,0 },
- {4534,4534,108, 0, 740, 26,0 },
+ {4515,4515, 37, 0, 973, 73,-2 },
+ {4516,4516, 48, 0, 106, 0,-2 },
+ {4517,4517, 48, 0, 286, 133,-2 },
+ {4518,4518, 62, 0, 166, 60,0 },
+ {4519,4519, 44, 0, 980, 360,0 },
+ {4520,4520, 80, 0, 100, 0,0 },
+ {4519,4519, 50, 0, 980, 346,0 },
+ {4521,4521, 48, 0, 106, 0,-2 },
+ {4519,4519, 55, 0, 973, 360,0 },
+ {4522,4522, 61, 0, 513, 20,0 },
+ {4519,4519, 58, 0, 966, 353,0 },
+ {4519,4519, 63, 0, 973, 353,0 },
+ {4523,4523, 71, 0, 1366, 580,0 },
+ {4519,4519, 72, 0, 820, 306,0 },
+ {4524,4524, 70, 0, 1886, 666,0 },
+ {4523,4523, 88, 0, 1353, 560,0 },
+ {4525,4525, 76, 0, 1873, 653,0 },
+ {4526,4526, 84, 0, 260, 113,0 },
+ {4523,4523, 68, 0, 1366, 553,0 },
+ {4527,4527, 72, 0, 153, 53,0 },
+ {4528,4528, 28, 0, 1193, 413,0 },
+ {4524,4524, 81, 0, 1353, 480,0 },
+ {4529,4529, 58, 0, 246, 120,-2 },
+ {4529,4529, 55, 0, 246, 120,-2 },
+ {4529,4529, 44, 0, 246, 120,-2 },
+ {4529,4529, 49, 0, 246, 120,-2 },
+ {4529,4529, 40, 0, 286, 133,-2 },
+ {4530,4530, 55, 0, 740, 560,-2 },
+ {4530,4530, 48, 0, 893, 693,-2 },
+ {4531,4531, 52, 0, 513, 206,0 },
+ {4531,4531, 45, 0, 513, 206,0 },
+ {4532,4532, 48, 0, 173, 100,-2 },
+ {4533,4533, 48, 0, 120, 266,-2 },
+ {4534,4534, 48, 0, 253, 60,-2 },
+ {4509,4509, 73, 0, 160, 20,-2 },
+ {4509,4509, 68, 0, 160, 20,-2 },
+ {4509,4509, 63, 0, 193, 20,-2 },
+ {4535,4535,108, 0, 406, 26,0 },
+ {4536,4536,108, 0, 740, 26,0 },
};
@@ -10753,16 +10756,16 @@ const unsigned short banks[75][256] =
4579,4580,4581,4582,4583,4584,4585,4586,4587,4588,4589,4590,4591,4592,4593,4594,
295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295,
295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295,4595,4596,4597,4598,4599,
-4600,4601,4602,4603,4604,4605,4345,4606,4346,4607,4608,4609,4610,4611,4349,4612,
-4613,4614,4615,4616,4352,4617,4618,4354,4619,4620,4621,4622,4623,4624,4625,4626,
-4627,4628,4629,4630,4631, 320,4632,4633,4634,4635,4636,4637,4638,1374,4639,4640,
-4641,4642,4643,4644,4645,4646,4647,4648, 295, 295, 295, 295, 295, 295, 295, 295,
+4600,4601,4602,4603,4604,4605,4606,4607,4346,4608,4609,4610,4611,4612,4349,4613,
+4614,4615,4616,4617,4352,4618,4619,4354,4620,4621,4622,4623,4624,4625,4626,4627,
+4628,4629,4630,4631,4632, 320,4633,4634,4635,4636,4637,4638,4639,1374,4640,4641,
+4642,4643,4644,4645,4646,4647,4648,4649, 295, 295, 295, 295, 295, 295, 295, 295,
295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295,
295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295,
},
{
-4649,4650,4651,4652,4650,4653,4654,4655,4656,4657,4658,4660,4661,4662,4663,4664,
-4665,4667,4669,4662,4671,4672,4673,4674,4675,4676,4677, 295, 28, 29, 30, 31,
+4650,4651,4652,4653,4651,4654,4655,4656,4657,4658,4659,4661,4662,4663,4664,4665,
+4666,4668,4670,4663,4672,4673,4674,4675,4676,4677,4678, 295, 28, 29, 30, 31,
32, 33, 34, 35, 36, 37, 38, 33, 39, 40, 41, 42, 43, 44, 45, 46,
47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62,
63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78,
@@ -10771,28 +10774,28 @@ const unsigned short banks[75][256] =
111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, 126,
295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295,
295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295,
- 295, 295, 295, 127,4666, 128,4668, 130, 131, 132,4670, 134, 135, 136, 137, 138,
- 139, 140, 141, 142, 143, 144,4659, 146, 147, 148, 149, 150, 151, 152, 153, 154,
+ 295, 295, 295, 127,4667, 128,4669, 130, 131, 132,4671, 134, 135, 136, 137, 138,
+ 139, 140, 141, 142, 143, 144,4660, 146, 147, 148, 149, 150, 151, 152, 153, 154,
155, 156, 157, 158, 159, 160, 161, 162, 163, 164, 165, 166, 167, 168, 169, 170,
295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295,
295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295,
295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295,
},
{
-4679,4680,4681,4682,4683,4684,4685,4686,4687,4688,4689,4690,4691,3423,4688,4692,
-3426,4693,4694,3426,4695,4696,4696,4696, 868, 869, 870,4697,4698,4699,4700,4701,
-4702,4703,4704,4704,4705,4702,4706,4707,3970,4708,4709,4709,4710,4711,4712,4713,
-4714,4715,4716,4716,4717,4224,3450,4718,4719,4720,4721,4722,4723,4719,4719,4724,
-3457, 769,3458,3459,4725,4726,4727,4728,4729,4730,4731,4732,4733,4730,1300,4734,
-4735,4736,4730,4695,4737,4719,4738,4739,3475,4740,4741,4742,4743,1314,4744,4745,
-4746,4747,4748,4741,4741,1322,4749,4750,4751,4752,4753,4752,3423,4754,3970,4755,
-4756,1334,4756,4757,4758,4759, 792,4760,1341,1342,1343,1344,4761,4762,4763,1348,
- 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295,
- 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295,
- 295, 295, 295,4764,4764,4765,4766,4765,4767,4768,4769,4770,4771,4772,4773,4774,
-4775,4776,4777,4778,4779,4780,4781,4782,4783,4776,4784,4785,4786,4787,4788,4789,
-4790,4791,4792,4793,4794,4795,4796,4793,4794,4795,4797,4798,4799,4800,1375, 295,
-4801,4802, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295,
+4680,4681,4682,4683,4684,4685,4686,4687,4688,4689,4690,4691,4692,3423,4689,4693,
+3426,4694,4695,3426,4696,4697,4697,4697, 868, 869, 870,4698,4699,4700,4701,4702,
+4703,4704,4705,4705,4706,4703,4707,4708,3970,4709,4710,4710,4711,4712,4713,4714,
+4715,4716,4717,4717,4718,4224,3450,4719,4720,4721,4722,4723,4724,4720,4720,4725,
+3457, 769,3458,3459,4726,4727,4728,4729,4730,4731,4732,4733,4734,4731,1300,4735,
+4736,4737,4731,4696,4738,4720,4739,4740,3475,4741,4742,4743,4744,1314,4745,4746,
+4747,4748,4749,4742,4742,1322,4750,4751,4752,4753,4754,4753,3423,4755,3970,4756,
+4757,1334,4757,4758,4759,4760, 792,4761,1341,1342,1343,1344,4762,4763,4764,1348,
+ 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295,
+ 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295,
+ 295, 295, 295,4765,4765,4766,4767,4766,4768,4769,4770,4771,4772,4773,4774,4775,
+4776,4777,4778,4779,4780,4781,4782,4783,4784,4777,4785,4786,4787,4788,4789,4790,
+4791,4792,4793,4794,4795,4796,4797,4794,4795,4796,4798,4799,4800,4801,1375, 295,
+4802,4803, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295,
295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295,
295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295,
},
diff --git a/src/adlmidi.cpp b/src/adlmidi.cpp
index a0c7d8a..9210b5b 100644
--- a/src/adlmidi.cpp
+++ b/src/adlmidi.cpp
@@ -511,11 +511,28 @@ ADLMIDI_EXPORT int adl_switchEmulator(struct ADL_MIDIPlayer *device, int emulato
adl_reset(device);
return 0;
}
- play->setErrorString("OPN2 MIDI: Unknown emulation core!");
+ play->setErrorString("OPL3 MIDI: Unknown emulation core!");
}
return -1;
}
+
+ADLMIDI_EXPORT int adl_setRunAtPcmRate(ADL_MIDIPlayer *device, int enabled)
+{
+ if(device)
+ {
+ MIDIplay *play = reinterpret_cast<MIDIplay *>(device->adl_midiPlayer);
+ if(play)
+ {
+ play->m_setup.runAtPcmRate = (enabled != 0);
+ adl_reset(device);
+ return 0;
+ }
+ }
+ return -1;
+}
+
+
ADLMIDI_EXPORT const char *adl_linkedLibraryVersion()
{
#if !defined(ADLMIDI_ENABLE_HQ_RESAMPLER)
@@ -574,7 +591,8 @@ ADLMIDI_EXPORT void adl_reset(struct ADL_MIDIPlayer *device)
return;
MIDIplay *play = reinterpret_cast<MIDIplay *>(device->adl_midiPlayer);
play->m_setup.tick_skip_samples_delay = 0;
- play->opl.Reset(play->m_setup.emulator, play->m_setup.PCM_RATE);
+ play->opl.runAtPcmRate = play->m_setup.runAtPcmRate;
+ play->opl.Reset(play->m_setup.emulator, play->m_setup.PCM_RATE, play);
play->ch.clear();
play->ch.resize((size_t)play->opl.NumChannels);
}
diff --git a/src/adlmidi_load.cpp b/src/adlmidi_load.cpp
index 9e19ab6..7f69e25 100644
--- a/src/adlmidi_load.cpp
+++ b/src/adlmidi_load.cpp
@@ -714,7 +714,7 @@ riffskip:
return false;
}
- opl.Reset(m_setup.emulator, m_setup.PCM_RATE); // Reset OPL3 chip
+ opl.Reset(m_setup.emulator, m_setup.PCM_RATE, this); // Reset OPL3 chip
//opl.Reset(); // ...twice (just in case someone misprogrammed OPL3 previously)
ch.clear();
ch.resize(opl.NumChannels);
diff --git a/src/adlmidi_midiplay.cpp b/src/adlmidi_midiplay.cpp
index 0623ce7..89c1a73 100644
--- a/src/adlmidi_midiplay.cpp
+++ b/src/adlmidi_midiplay.cpp
@@ -680,7 +680,8 @@ bool MIDIplay::buildTrackData()
MIDIplay::MIDIplay(unsigned long sampleRate):
cmf_percussion_mode(false),
- m_arpeggioCounter(0)
+ m_arpeggioCounter(0),
+ m_audioTickCounter(0)
#ifndef ADLMIDI_DISABLE_MIDI_SEQUENCER
, fullSongTimeLength(0.0),
postSongWaitDelay(1.0),
@@ -696,6 +697,7 @@ MIDIplay::MIDIplay(unsigned long sampleRate):
devices.clear();
m_setup.emulator = ADLMIDI_EMU_NUKED;
+ m_setup.runAtPcmRate = false;
m_setup.PCM_RATE = sampleRate;
m_setup.mindelay = 1.0 / (double)m_setup.PCM_RATE;
@@ -726,6 +728,8 @@ void MIDIplay::applySetup()
{
m_setup.tick_skip_samples_delay = 0;
+ opl.runAtPcmRate = m_setup.runAtPcmRate;
+
if(opl.AdlBank != ~0u)
opl.dynamic_bank_setup = adlbanksetup[m_setup.AdlBank];
@@ -752,7 +756,7 @@ void MIDIplay::applySetup()
opl.NumFourOps = m_setup.NumFourOps;
cmf_percussion_mode = false;
- opl.Reset(m_setup.emulator, m_setup.PCM_RATE);
+ opl.Reset(m_setup.emulator, m_setup.PCM_RATE, this);
ch.clear();
ch.resize(opl.NumChannels);
@@ -1435,6 +1439,13 @@ void MIDIplay::realTime_panic()
KillSustainingNotes(-1, -1);
}
+void MIDIplay::AudioTick(uint32_t chipId, uint32_t /*rate*/)
+{
+ if(chipId != 0) // do first chip ticks only
+ return;
+
+ /*uint32_t tickNumber = */m_audioTickCounter++;
+}
void MIDIplay::NoteUpdate(uint16_t MidCh,
MIDIplay::MIDIchannel::activenoteiterator i,
diff --git a/src/adlmidi_opl3.cpp b/src/adlmidi_opl3.cpp
index 16a481d..49e2e76 100644
--- a/src/adlmidi_opl3.cpp
+++ b/src/adlmidi_opl3.cpp
@@ -484,20 +484,24 @@ void OPL3::ClearChips()
}
#endif
-void OPL3::Reset(int emulator, unsigned long PCM_RATE)
+void OPL3::Reset(int emulator, unsigned long PCM_RATE, void *audioTickHandler)
{
- #ifndef ADLMIDI_HW_OPL
+#ifndef ADLMIDI_HW_OPL
ClearChips();
- #endif
+#else
(void)emulator;
(void)PCM_RATE;
+#endif
+#if !defined(ADLMIDI_AUDIO_TICK_HANDLER)
+ (void)audioTickHandler;
+#endif
ins.clear();
pit.clear();
regBD.clear();
- #ifndef ADLMIDI_HW_OPL
+#ifndef ADLMIDI_HW_OPL
cardsOP2.resize(NumCards, AdlMIDI_SPtr<OPLChipBase>());
- #endif
+#endif
NumChannels = NumCards * 23;
ins.resize(NumChannels, adl[adlDefaultNumber]);
@@ -522,24 +526,32 @@ void OPL3::Reset(int emulator, unsigned long PCM_RATE)
for(size_t i = 0; i < NumCards; ++i)
{
#ifndef ADLMIDI_HW_OPL
+ OPLChipBase *chip;
switch(emulator)
{
default:
#ifndef ADLMIDI_DISABLE_NUKED_EMULATOR
case ADLMIDI_EMU_NUKED: /* Latest Nuked OPL3 */
- cardsOP2[i].reset(new NukedOPL3());
+ chip = new NukedOPL3;
break;
case ADLMIDI_EMU_NUKED_174: /* Old Nuked OPL3 1.4.7 modified and optimized */
- cardsOP2[i].reset(new NukedOPL3v174());
+ chip = new NukedOPL3v174;
break;
#endif
#ifndef ADLMIDI_DISABLE_DOSBOX_EMULATOR
case ADLMIDI_EMU_DOSBOX:
- cardsOP2[i].reset(new DosBoxOPL3());
+ chip = new DosBoxOPL3;
break;
#endif
}
- cardsOP2[i]->setRate((uint32_t)PCM_RATE);
+ cardsOP2[i].reset(chip);
+ chip->setChipId(i);
+ chip->setRate((uint32_t)PCM_RATE);
+ if(runAtPcmRate)
+ chip->setRunningAtPcmRate(true);
+# if defined(ADLMIDI_AUDIO_TICK_HANDLER)
+ chip->setAudioTickHandlerInstance(audioTickHandler);
+# endif
#endif // ADLMIDI_HW_OPL
for(unsigned a = 0; a < 18; ++a) Poke(i, 0xB0 + Channels[a], 0x00);
diff --git a/src/adlmidi_private.cpp b/src/adlmidi_private.cpp
index 77319d7..1ee7c4a 100644
--- a/src/adlmidi_private.cpp
+++ b/src/adlmidi_private.cpp
@@ -25,6 +25,13 @@
std::string ADLMIDI_ErrorString;
+// Generator callback on audio rate ticks
+
+void adl_audioTickHandler(void *instance, uint32_t chipId, uint32_t rate)
+{
+ reinterpret_cast<MIDIplay *>(instance)->AudioTick(chipId, rate);
+}
+
int adlRefreshNumCards(ADL_MIDIPlayer *device)
{
unsigned n_fourop[2] = {0, 0}, n_total[2] = {0, 0};
diff --git a/src/adlmidi_private.hpp b/src/adlmidi_private.hpp
index 2499bad..0e63b5a 100644
--- a/src/adlmidi_private.hpp
+++ b/src/adlmidi_private.hpp
@@ -245,6 +245,8 @@ public:
bool AdlPercussionMode;
//! Carriers-only are scaled by default by volume level. This flag will tell to scale modulators too.
bool ScaleModulators;
+ //! Run emulator at PCM rate if that possible. Reduces sounding accuracy, but decreases CPU usage on lower rates.
+ bool runAtPcmRate;
// ! Required to play CMF files. Can be turned on by using of "CMF" volume model
//bool LogarithmicVolumes; //[REPLACED WITH "m_volumeScale == VOLUME_NATIVE", DEPRECATED!!!]
// ! Required to play EA-MUS files [REPLACED WITH "m_musicMode", DEPRECATED!!!]
@@ -294,7 +296,7 @@ public:
#ifndef ADLMIDI_HW_OPL
void ClearChips();
#endif
- void Reset(int emulator, unsigned long PCM_RATE);
+ void Reset(int emulator, unsigned long PCM_RATE, void *audioTickHandler);
};
@@ -933,6 +935,7 @@ public:
struct Setup
{
int emulator;
+ bool runAtPcmRate;
unsigned int AdlBank;
unsigned int NumFourOps;
unsigned int NumCards;
@@ -984,6 +987,9 @@ private:
//! Counter of arpeggio processing
size_t m_arpeggioCounter;
+ //! Audio tick counter
+ uint32_t m_audioTickCounter;
+
#ifndef ADLMIDI_DISABLE_MIDI_SEQUENCER
std::vector<std::vector<uint8_t> > TrackData;
@@ -1181,6 +1187,9 @@ public:
void realTime_panic();
+ // Audio rate tick handler
+ void AudioTick(uint32_t chipId, uint32_t rate);
+
private:
enum
{
@@ -1249,6 +1258,7 @@ struct FourChars
};
*/
+extern void adl_audioTickHandler(void *instance, uint32_t chipId, uint32_t rate);
extern int adlRefreshNumCards(ADL_MIDIPlayer *device);
diff --git a/src/chips/dosbox_opl3.cpp b/src/chips/dosbox_opl3.cpp
index af4cb08..30fa38e 100644
--- a/src/chips/dosbox_opl3.cpp
+++ b/src/chips/dosbox_opl3.cpp
@@ -23,7 +23,7 @@ void DosBoxOPL3::setRate(uint32_t rate)
DBOPL::Handler *chip_r = reinterpret_cast<DBOPL::Handler*>(m_chip);
chip_r->~Handler();
new(chip_r) DBOPL::Handler;
- chip_r->Init(49716);
+ chip_r->Init(effectiveRate());
}
void DosBoxOPL3::reset()
@@ -32,7 +32,7 @@ void DosBoxOPL3::reset()
DBOPL::Handler *chip_r = reinterpret_cast<DBOPL::Handler*>(m_chip);
chip_r->~Handler();
new(chip_r) DBOPL::Handler;
- chip_r->Init(49716);
+ chip_r->Init(effectiveRate());
}
void DosBoxOPL3::writeReg(uint16_t addr, uint8_t data)
diff --git a/src/chips/dosbox_opl3.h b/src/chips/dosbox_opl3.h
index f4c68da..1928026 100644
--- a/src/chips/dosbox_opl3.h
+++ b/src/chips/dosbox_opl3.h
@@ -10,6 +10,7 @@ public:
DosBoxOPL3();
~DosBoxOPL3() override;
+ bool canRunAtPcmRate() const override { return true; }
void setRate(uint32_t rate) override;
void reset() override;
void writeReg(uint16_t addr, uint8_t data) override;
diff --git a/src/chips/nuked_opl3.h b/src/chips/nuked_opl3.h
index 25d9ed5..1b34e9a 100644
--- a/src/chips/nuked_opl3.h
+++ b/src/chips/nuked_opl3.h
@@ -10,6 +10,7 @@ public:
NukedOPL3();
~NukedOPL3() override;
+ bool canRunAtPcmRate() const override { return false; }
void setRate(uint32_t rate) override;
void reset() override;
void writeReg(uint16_t addr, uint8_t data) override;
diff --git a/src/chips/nuked_opl3_v174.h b/src/chips/nuked_opl3_v174.h
index b9c5ba6..f14221f 100644
--- a/src/chips/nuked_opl3_v174.h
+++ b/src/chips/nuked_opl3_v174.h
@@ -10,6 +10,7 @@ public:
NukedOPL3v174();
~NukedOPL3v174() override;
+ bool canRunAtPcmRate() const override { return false; }
void setRate(uint32_t rate) override;
void reset() override;
void writeReg(uint16_t addr, uint8_t data) override;
diff --git a/src/chips/opl_chip_base.h b/src/chips/opl_chip_base.h
index 5721a81..879d6da 100644
--- a/src/chips/opl_chip_base.h
+++ b/src/chips/opl_chip_base.h
@@ -13,15 +13,33 @@
class VResampler;
#endif
+#if defined(ADLMIDI_AUDIO_TICK_HANDLER)
+extern void adl_audioTickHandler(void *instance, uint32_t chipId, uint32_t rate);
+#endif
+
class OPLChipBase
{
+public:
+ enum { nativeRate = 49716 };
protected:
+ uint32_t m_id;
uint32_t m_rate;
public:
OPLChipBase();
virtual ~OPLChipBase();
+ uint32_t chipId() const { return m_id; }
+ void setChipId(uint32_t id) { m_id = id; }
+
+ virtual bool canRunAtPcmRate() const = 0;
+ virtual bool isRunningAtPcmRate() const = 0;
+ virtual bool setRunningAtPcmRate(bool r) = 0;
+#if defined(ADLMIDI_AUDIO_TICK_HANDLER)
+ virtual void setAudioTickHandlerInstance(void *instance) = 0;
+#endif
+
virtual void setRate(uint32_t rate) = 0;
+ virtual uint32_t effectiveRate() const = 0;
virtual void reset() = 0;
virtual void writeReg(uint16_t addr, uint8_t data) = 0;
@@ -49,13 +67,25 @@ public:
OPLChipBaseT();
virtual ~OPLChipBaseT();
+ bool isRunningAtPcmRate() const override;
+ bool setRunningAtPcmRate(bool r) override;
+#if defined(ADLMIDI_AUDIO_TICK_HANDLER)
+ void setAudioTickHandlerInstance(void *instance);
+#endif
+
virtual void setRate(uint32_t rate) override;
+ uint32_t effectiveRate() const override;
virtual void reset() override;
void generate(int16_t *output, size_t frames) override;
void generateAndMix(int16_t *output, size_t frames) override;
void generate32(int32_t *output, size_t frames) override;
void generateAndMix32(int32_t *output, size_t frames) override;
private:
+ bool m_runningAtPcmRate;
+#if defined(ADLMIDI_AUDIO_TICK_HANDLER)
+ void *m_audioTickHandlerInstance;
+#endif
+ void nativeTick(int16_t *frame);
void setupResampler(uint32_t rate);
void resetResampler();
void resampledGenerate(int32_t *output);
diff --git a/src/chips/opl_chip_base.tcc b/src/chips/opl_chip_base.tcc
index 58145bc..48ad103 100644
--- a/src/chips/opl_chip_base.tcc
+++ b/src/chips/opl_chip_base.tcc
@@ -5,9 +5,22 @@
#include <zita-resampler/vresampler.h>
#endif
+#if !defined(LIKELY) && defined(__GNUC__)
+#define LIKELY(x) __builtin_expect((x), 1)
+#elif !defined(LIKELY)
+#define LIKELY(x) (x)
+#endif
+
+#if !defined(UNLIKELY) && defined(__GNUC__)
+#define UNLIKELY(x) __builtin_expect((x), 0)
+#elif !defined(UNLIKELY)
+#define UNLIKELY(x) (x)
+#endif
+
/* OPLChipBase */
inline OPLChipBase::OPLChipBase() :
+ m_id(0),
m_rate(44100)
{
}
@@ -20,7 +33,12 @@ inline OPLChipBase::~OPLChipBase()
template <class T>
OPLChipBaseT<T>::OPLChipBaseT()
- : OPLChipBase()
+ : OPLChipBase(),
+ m_runningAtPcmRate(false)
+#if defined(ADLMIDI_AUDIO_TICK_HANDLER)
+ ,
+ m_audioTickHandlerInstance(NULL)
+#endif
{
#if defined(ADLMIDI_ENABLE_HQ_RESAMPLER)
m_resampler = new VResampler;
@@ -37,6 +55,33 @@ OPLChipBaseT<T>::~OPLChipBaseT()
}
template <class T>
+bool OPLChipBaseT<T>::isRunningAtPcmRate() const
+{
+ return m_runningAtPcmRate;
+}
+
+template <class T>
+bool OPLChipBaseT<T>::setRunningAtPcmRate(bool r)
+{
+ if(r != m_runningAtPcmRate)
+ {
+ if(r && !static_cast<T *>(this)->canRunAtPcmRate())
+ return false;
+ m_runningAtPcmRate = r;
+ static_cast<T *>(this)->setRate(m_rate);
+ }
+ return true;
+}
+
+#if defined(ADLMIDI_AUDIO_TICK_HANDLER)
+template <class T>
+void OPLChipBaseT<T>::setAudioTickHandlerInstance(void *instance)
+{
+ m_audioTickHandlerInstance = instance;
+}
+#endif
+
+template <class T>
void OPLChipBaseT<T>::setRate(uint32_t rate)
{
uint32_t oldRate = m_rate;
@@ -48,6 +93,12 @@ void OPLChipBaseT<T>::setRate(uint32_t rate)
}
template <class T>
+uint32_t OPLChipBaseT<T>::effectiveRate() const
+{
+ return m_runningAtPcmRate ? m_rate : (uint32_t)nativeRate;
+}
+
+template <class T>
void OPLChipBaseT<T>::reset()
{
resetResampler();
@@ -119,6 +170,15 @@ void OPLChipBaseT<T>::generateAndMix32(int32_t *output, size_t frames)
}
template <class T>
+void OPLChipBaseT<T>::nativeTick(int16_t *frame)
+{
+#if defined(ADLMIDI_AUDIO_TICK_HANDLER)
+ adl_audioTickHandler(m_audioTickHandlerInstance, m_id, effectiveRate());
+#endif
+ static_cast<T *>(this)->nativeGenerate(frame);
+}
+
+template <class T>
void OPLChipBaseT<T>::setupResampler(uint32_t rate)
{
#if defined(ADLMIDI_ENABLE_HQ_RESAMPLER)
@@ -147,6 +207,15 @@ void OPLChipBaseT<T>::resetResampler()
template <class T>
void OPLChipBaseT<T>::resampledGenerate(int32_t *output)
{
+ if(UNLIKELY(m_runningAtPcmRate))
+ {
+ int16_t in[2];
+ static_cast<T *>(this)->nativeTick(in);
+ output[0] = (int32_t)in[0] * T::resamplerPreAmplify / T::resamplerPostAttenuate;
+ output[1] = (int32_t)in[1] * T::resamplerPreAmplify / T::resamplerPostAttenuate;
+ return;
+ }
+
VResampler *rsm = m_resampler;
float scale = (float)T::resamplerPreAmplify /
(float)T::resamplerPostAttenuate;
@@ -159,7 +228,7 @@ void OPLChipBaseT<T>::resampledGenerate(int32_t *output)
while(rsm->process(), rsm->out_count != 0)
{
int16_t in[2];
- static_cast<T *>(this)->nativeGenerate(in);
+ static_cast<T *>(this)->nativeTick(in);
f_in[0] = scale * (float)in[0];
f_in[1] = scale * (float)in[1];
rsm->inp_count = 1;
@@ -174,6 +243,15 @@ void OPLChipBaseT<T>::resampledGenerate(int32_t *output)
template <class T>
void OPLChipBaseT<T>::resampledGenerate(int32_t *output)
{
+ if(UNLIKELY(m_runningAtPcmRate))
+ {
+ int16_t in[2];
+ static_cast<T *>(this)->nativeTick(in);
+ output[0] = (int32_t)in[0] * T::resamplerPreAmplify / T::resamplerPostAttenuate;
+ output[1] = (int32_t)in[1] * T::resamplerPreAmplify / T::resamplerPostAttenuate;
+ return;
+ }
+
int32_t samplecnt = m_samplecnt;
const int32_t rateratio = m_rateratio;
while(samplecnt >= rateratio)
@@ -181,7 +259,7 @@ void OPLChipBaseT<T>::resampledGenerate(int32_t *output)
m_oldsamples[0] = m_samples[0];
m_oldsamples[1] = m_samples[1];
int16_t buffer[2];
- static_cast<T *>(this)->nativeGenerate(buffer);
+ static_cast<T *>(this)->nativeTick(buffer);
m_samples[0] = buffer[0] * T::resamplerPreAmplify;
m_samples[1] = buffer[1] * T::resamplerPreAmplify;
samplecnt -= rateratio;
diff --git a/utils/adlmidi-2/midiplay.cc b/utils/adlmidi-2/midiplay.cc
index 74806eb..8fe1c8a 100644
--- a/utils/adlmidi-2/midiplay.cc
+++ b/utils/adlmidi-2/midiplay.cc
@@ -1551,6 +1551,7 @@ static bool is_number(const std::string &s)
int main(int argc, char **argv)
{
+#ifndef HARDWARE_OPL3
// How long is SDL buffer, in seconds?
// The smaller the value, the more often AdlAudioCallBack()
// is called.
@@ -1560,8 +1561,9 @@ int main(int argc, char **argv)
const double OurHeadRoomLength = 0.1;
// The lag between visual content and audio content equals
// the sum of these two buffers.
+#endif
- #ifndef _WIN32
+#ifndef _WIN32
WritingToTTY = isatty(STDOUT_FILENO);
if(WritingToTTY)
{
@@ -1573,9 +1575,9 @@ int main(int argc, char **argv)
#endif
);
}
- #else
+#else
WritingToTTY = true;
- #endif
+#endif
if(WritingToTTY)
{
UI.Print(0, 3, true, "(C) -- http://iki.fi/bisqwit/source/adlmidi.html");
@@ -1584,9 +1586,9 @@ int main(int argc, char **argv)
std::fflush(stderr);
signal(SIGINT, TidyupAndExit);
- #ifdef __DJGPP__
+#ifdef __DJGPP__
signal(SIGQUIT, TidyupAndExit);
- #endif
+#endif
if(argc < 2 || std::string(argv[1]) == "--help" || std::string(argv[1]) == "-h")
{
diff --git a/utils/midiplay/adlmidiplay.cpp b/utils/midiplay/adlmidiplay.cpp
index 8bffc50..be4c7ee 100644
--- a/utils/midiplay/adlmidiplay.cpp
+++ b/utils/midiplay/adlmidiplay.cpp
@@ -204,6 +204,21 @@ static void debugPrintEvent(void * /*userdata*/, ADL_UInt8 type, ADL_UInt8 subty
}
#endif
+static inline void secondsToHMSM(double seconds_full, char *hmsm_buffer, size_t hmsm_buffer_size)
+{
+ double seconds_integral;
+ double seconds_fractional = std::modf(seconds_full, &seconds_integral);
+ unsigned int milliseconds = static_cast<unsigned int>(std::floor(seconds_fractional * 1000.0));
+ unsigned int seconds = std::fmod(seconds_full, 60.0);
+ unsigned int minutes = static_cast<unsigned int>(std::floor(seconds_full / 60));
+ unsigned int hours = static_cast<unsigned int>(std::floor(seconds_full / 3600));
+ std::memset(hmsm_buffer, 0, hmsm_buffer_size);
+ if (hours > 0)
+ snprintf(hmsm_buffer, hmsm_buffer_size, "%02u:%02u:%02u,%03u", hours, minutes, seconds, milliseconds);
+ else
+ snprintf(hmsm_buffer, hmsm_buffer_size, "%02u:%02u,%03u", minutes, seconds, milliseconds);
+}
+
int main(int argc, char **argv)
{
std::fprintf(stdout, "==========================================\n"
@@ -572,6 +587,15 @@ int main(int argc, char **argv)
#ifndef OUTPUT_WAVE_ONLY
double loopStart = adl_loopStartTime(myDevice);
double loopEnd = adl_loopEndTime(myDevice);
+ char totalHMS[25];
+ char loopStartHMS[25];
+ char loopEndHMS[25];
+ secondsToHMSM(total, totalHMS, 25);
+ if(loopStart >= 0.0 && loopEnd >= 0.0)
+ {
+ secondsToHMSM(loopStart, loopStartHMS, 25);
+ secondsToHMSM(loopEnd, loopEndHMS, 25);
+ }
#ifndef HARDWARE_OPL3
if(!recordWave)
@@ -593,10 +617,14 @@ int main(int argc, char **argv)
flushout(stdout);
#endif
+ #ifndef HARDWARE_OPL3
+ Uint8 buff[16384];
+ #endif
+ char posHMS[25];
+ uint64_t milliseconds_prev = -1;
while(!stop)
{
#ifndef HARDWARE_OPL3
- Uint8 buff[16384];
size_t got = (size_t)adl_playFormat(myDevice, 4096,
buff,
buff + g_audioFormat.containerSize,
@@ -606,9 +634,17 @@ int main(int argc, char **argv)
#endif
#ifndef DEBUG_TRACE_ALL_EVENTS
+ double time_pos = adl_positionTell(myDevice);
std::fprintf(stdout, " \r");
- std::fprintf(stdout, "Time position: %10f / %10f\r", adl_positionTell(myDevice), total);
- flushout(stdout);
+ uint64_t milliseconds = static_cast<uint64_t>(time_pos * 1000.0);
+ if(milliseconds != milliseconds_prev)
+ {
+ secondsToHMSM(time_pos, posHMS, 25);
+ std::fprintf(stdout, " \r");
+ std::fprintf(stdout, "Time position: %s / %s\r", posHMS, totalHMS);
+ flushout(stdout);
+ milliseconds_prev = milliseconds;
+ }
#endif
#ifndef HARDWARE_OPL3
@@ -684,18 +720,24 @@ int main(int argc, char **argv)
if(wave_open(sampleRate, wave_out.c_str()) == 0)
{
wave_enable_stereo();
+ short buff[4096];
+ int complete_prev = -1;
while(!stop)
{
- short buff[4096];
size_t got = (size_t)adl_play(myDevice, 4096, buff);
if(got <= 0)
break;
wave_write(buff, (long)got);
- double complete = std::floor(100.0 * adl_positionTell(myDevice) / total);
- std::fprintf(stdout, " \r");
- std::fprintf(stdout, "Recording WAV... [%d%% completed]\r", (int)complete);
+ int complete = static_cast<int>(std::floor(100.0 * adl_positionTell(myDevice) / total));
flushout(stdout);
+ if(complete_prev != complete)
+ {
+ std::fprintf(stdout, " \r");
+ std::fprintf(stdout, "Recording WAV... [%d%% completed]\r", complete);
+ std::fflush(stdout);
+ complete_prev = complete;
+ }
}
wave_close();
std::fprintf(stdout, " \n\n");