diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/adldata.cpp | 1122 | ||||
-rw-r--r-- | src/adlmidi.cpp | 249 | ||||
-rw-r--r-- | src/adlmidi_opl3.cpp | 18 | ||||
-rw-r--r-- | src/adlmidi_private.hpp | 6 | ||||
-rw-r--r-- | src/chips/dosbox/dbopl.cpp | 143 | ||||
-rw-r--r-- | src/chips/dosbox/dbopl.h | 6 | ||||
-rw-r--r-- | src/midi_sequencer.hpp | 13 | ||||
-rw-r--r-- | src/midi_sequencer_impl.hpp | 92 |
8 files changed, 919 insertions, 730 deletions
diff --git a/src/adldata.cpp b/src/adldata.cpp index d99ee74..64280aa 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[4537] = +const adldata adl[4528] = { // ,---------+-------- Wave select settings // | ,-------ч-+------ Sustain/release rates // | | ,-----ч-ч-+---- Attack/decay rates @@ -3969,8 +3969,8 @@ const adldata adl[4537] = { 0x185DC85,0x055F401, 0x91,0x0E, 0x3, +0 }, { 0x0F6E181,0x0F6E798, 0x00,0x2B, 0x1, +0 }, { 0x0F4F194,0x0A7E98A, 0x00,0x15, 0x1, +0 }, - { 0x0B3D407,0x0B4C202, 0xA0,0x00, 0xA, -12 }, - { 0x082D307,0x0E3A302, 0x58,0x80, 0xB, +0 }, + { 0x0B3D407,0x0B4C202, 0x9A,0x00, 0xA, -12 }, + { 0x082D307,0x0E3A302, 0x9A,0x00, 0xA, -12 }, { 0x156940A,0x132F411, 0xA7,0x05, 0x5, +0 }, { 0x027A2A0,0x023A522, 0x85,0x9E, 0x7, +0 }, { 0x02AA5A2,0x02AA168, 0x80,0x8F, 0x7, +0 }, @@ -3982,7 +3982,8 @@ const adldata adl[4537] = { 0x013C321,0x00B7022, 0x22,0x00, 0xE, +0 }, { 0x0F4F505,0x0F9F200, 0x29,0x1E, 0x6, +12 }, { 0x0F1F101,0x0F7F100, 0x2F,0x00, 0x6, +0 }, - { 0x0F4F405,0x0F6F100, 0x20,0x19, 0x6, +12 }, + { 0x0F4F405,0x0F6F110, 0x29,0x19, 0x6, +12 }, + { 0x0F1F111,0x0F7F100, 0x31,0x00, 0x6, +0 }, { 0x19F53C8,0x07FFAE4, 0x1C,0x03, 0x9, +0 }, { 0x0049420,0x0A5C523, 0x2A,0x24, 0xE, +12 }, { 0x0F9F200,0x0F8F101, 0x21,0x00, 0xE, +0 }, @@ -4005,15 +4006,20 @@ const adldata adl[4537] = { 0x0049100,0x2045240, 0x0F,0x00, 0x9, +0 }, { 0x0157620,0x0368261, 0x94,0x00, 0xC, +12 }, { 0x02661B1,0x0276171, 0xD3,0x80, 0xD, +0 }, + { 0x118543A,0x5177472, 0x1E,0x00, 0x4, -12 }, { 0x04A6121,0x00B7F21, 0x9F,0x00, 0xE, +0 }, { 0x00A65A1,0x0067F61, 0xA2,0x00, 0xF, +0 }, { 0x0277221,0x0067F21, 0x16,0x05, 0xC, +0 }, { 0x0866131,0x0D6C261, 0x1A,0x00, 0xE, +0 }, - { 0x0678221,0x0179222, 0x17,0x00, 0xE, +0 }, + { 0x0866131,0x0D6C261, 0x16,0x00, 0xF, +0 }, + { 0x0678221,0x0179222, 0x1A,0x00, 0xE, +0 }, + { 0x0678221,0x0179222, 0x15,0x0A, 0x7, +0 }, { 0x00AD961,0x006A861, 0x28,0x1E, 0xE, +0 }, { 0x0069A21,0x00ACF24, 0x25,0x00, 0xE, +0 }, { 0x02A9B32,0x0177221, 0x90,0x00, 0x4, +0 }, { 0x01CB632,0x01B66E1, 0x92,0x82, 0x5, +0 }, + { 0x00457F2,0x0375761, 0xA8,0x00, 0xE, +0 }, + { 0x2545C73,0x0776821, 0x00,0x0D, 0xE, +0 }, { 0x00FFF61,0x00FFF22, 0x1C,0x00, 0xE, +0 }, { 0x00FFF21,0x009CF62, 0x1C,0x00, 0xF, +0 }, { 0x0559622,0x0187421, 0x46,0x80, 0xF, +0 }, @@ -4023,31 +4029,50 @@ const adldata adl[4537] = { 0x2164460,0x00450E1, 0xAB,0x01, 0xB, +0 }, { 0x0022A55,0x0F34212, 0x97,0x86, 0x1, +0 }, { 0x1623524,0x1023171, 0x20,0x05, 0x1, +0 }, + { 0x155F261,0x0A5F242, 0x4D,0x00, 0x0, +0 }, + { 0x2343161,0x00532A1, 0x9D,0x80, 0xD, +0 }, { 0x011A131,0x0137D16, 0x87,0x08, 0x1, +0 }, - { 0x0F0A101,0x0437516, 0x0C,0x03, 0x1, +0 }, - { 0x053F201,0x052F317, 0x8F,0x09, 0x5, +0 }, + { 0x1127533,0x4F4F211, 0x58,0x03, 0x6, +0 }, + { 0x3F0F014,0x6F7F611, 0x40,0x43, 0xA, +0 }, + { 0x033F201,0x373F402, 0xD1,0x8A, 0x0, +0 }, + { 0x6A7F907,0x229A904, 0x1A,0x00, 0xA, -12 }, { 0x055C902,0x024A601, 0x1A,0x05, 0xD, +0 }, - { 0x0175E31,0x20C7B21, 0x18,0x08, 0x7, +0 }, + { 0x1397931,0x2099B22, 0x80,0x00, 0x6, +0 }, + { 0x2137931,0x1079B22, 0x42,0xC2, 0xA, +0 }, { 0x119FFA1,0x0089024, 0x0C,0x11, 0x7, +0 }, { 0x004F007,0x004F081, 0x51,0x13, 0x7, +0 }, { 0x026EC07,0x016F801, 0x15,0x00, 0xA, +0 }, { 0x001FF17,0x0057A12, 0x1C,0x0B, 0xB, +0 }, + { 0x4046306,0x005A902, 0xCA,0x08, 0x6, +0 }, + { 0x0045413,0x005A601, 0x51,0x08, 0xA, +0 }, { 0x09FF831,0x004FF10, 0x8B,0x05, 0x7, +0 }, + { 0x5C8FB00,0x0B7E601, 0x00,0x00, 0x0, +0 }, + { 0x2F0F00F,0x0F8F800, 0x00,0x40, 0xE, +12 }, { 0x001FF0E,0x20F2F01, 0x00,0x0D, 0xE, +0 }, - { 0x2077405,0x106F403, 0x80,0x0F, 0xF, +0 }, + { 0x0534313,0x7574A1F, 0x20,0x03, 0xE, -14 }, { 0x003FF15,0x0934511, 0x09,0x1F, 0xF, +0 }, - { 0x000200E,0x0022F0E, 0x00,0x0F, 0xF, +0 }, + { 0x200C327,0x6021300, 0x80,0x12, 0xE, -23 }, + { 0x200C32B,0x6021300, 0x80,0x12, 0xE, -24 }, { 0x060F209,0x072F214, 0x4F,0x19, 0xB, +0 }, { 0x1111EF0,0x11311E2, 0x00,0xC5, 0xF, +0 }, { 0x000FFEE,0x30318EE, 0x00,0x00, 0xE, +0 }, + { 0x059F802,0x01CF600, 0x11,0x00, 0xC, +0 }, + { 0x2159506,0x65AB701, 0x00,0x04, 0xE, +0 }, + { 0x10F5F81,0x0164611, 0x00,0x0A, 0x6, +0 }, + { 0x00F5F01,0x20F5F00, 0x00,0x00, 0x8, +0 }, + { 0x0D6D725,0x3A9A909, 0x1F,0x00, 0xE, -9 }, + { 0x0F0A00F,0x0F8F80F, 0x80,0x8C, 0xF, +0 }, + { 0x2FDFD00,0x6FAFA00, 0x00,0x00, 0xE, +0 }, + { 0x4F1F103,0x6FAFA07, 0x00,0x00, 0x8, +0 }, + { 0x0F0F007,0x2F6F60F, 0x27,0x00, 0x0, +21 }, { 0x0F7B710,0x005F011, 0x42,0x00, 0x8, +0 }, { 0x6EF8801,0x608B502, 0x0D,0x00, 0x0, +0 }, { 0x0F1F10F,0x007840F, 0x00,0x08, 0xC, +12 }, { 0x6EF8800,0x608F502, 0x13,0x00, 0x0, +8 }, { 0x0F1D101,0x0078400, 0x00,0x00, 0xE, +1 }, - { 0x254F307,0x307F905, 0x04,0x0B, 0x6, -5 }, - { 0x254F307,0x207F905, 0x04,0x0B, 0x8, +0 }, - { 0x25CD808,0x32B8A06, 0x04,0x08, 0xC, +0 }, + { 0x254F307,0x307F905, 0x04,0x08, 0x6, -5 }, + { 0x254F307,0x207F905, 0x04,0x08, 0x8, +0 }, + { 0x254D307,0x3288905, 0x04,0x03, 0xA, -5 }, { 0x2F2E327,0x3F5C525, 0x04,0x08, 0xA, -5 }, { 0x2F2F326,0x2F5C525, 0x04,0x08, 0x8, +0 }, { 0x292F108,0x354F201, 0x00,0x08, 0x8, +12 }, @@ -4057,17 +4082,24 @@ const adldata adl[4537] = { 0x251F206,0x263C504, 0x04,0x09, 0xA, +0 }, { 0x241F287,0x353B502, 0x05,0x09, 0xA, +1 }, { 0x292F108,0x354F201, 0x00,0x03, 0x8, +12 }, - { 0x456FB02,0x017F700, 0x81,0x00, 0x0, +12 }, - { 0x556FA01,0x117F701, 0x00,0x0D, 0x6, +10 }, - { 0x556FB02,0x117F701, 0x81,0x0D, 0x6, +10 }, - { 0x106F680,0x016F610, 0x00,0x00, 0xC, +0 }, - { 0x20F6F00,0x20F6F00, 0x00,0x00, 0x0, +0 }, - { 0x106F680,0x016F610, 0x00,0x00, 0x6, +0 }, - { 0x20F4F00,0x20F4F00, 0x00,0x00, 0x6, +0 }, - { 0x1DC5D01,0x06FF79F, 0x0B,0x00, 0xA, +12 }, - { 0x1C7C900,0x05FF49F, 0x07,0x00, 0xA, +12 }, + { 0x456FB02,0x017F700, 0x81,0x00, 0xC, +12 }, + { 0x556FA01,0x117F701, 0x00,0x0D, 0xA, +10 }, + { 0x556FB02,0x117F701, 0x81,0x0D, 0xA, +10 }, + { 0x0F00000,0x0F00000, 0x3F,0x3F, 0xC, +0 }, + { 0x000F020,0x40A8A00, 0x0A,0x00, 0xE, +0 }, + { 0x70F5F20,0x70F4F00, 0x00,0x00, 0x2, -12 }, + { 0x0D1F815,0x078F512, 0x44,0x00, 0x8, +12 }, + { 0x2D1F213,0x098F614, 0x9D,0x00, 0x0, +0 }, + { 0x2D1F213,0x098F614, 0x9D,0x21, 0x0, -2 }, + { 0x0985900,0x039870F, 0x07,0x00, 0x8, +13 }, + { 0x2F3F307,0x09C9B0F, 0x1D,0x00, 0x0, +13 }, + { 0x09C4B00,0x43A6705, 0x21,0x00, 0xC, +13 }, + { 0x0F7F907,0x2987805, 0x1C,0x00, 0x0, +13 }, { 0x3F0E00A,0x0F7F21F, 0x7C,0x40, 0x8, +0 }, { 0x3E0F50A,0x0FAF31F, 0x7C,0x40, 0x9, +0 }, + { 0x227A305,0x36A560A, 0x87,0x08, 0xE, +12 }, + { 0x247C345,0x3697809, 0x87,0x08, 0xE, +12 }, + { 0x037A309,0x06DF904, 0x11,0x00, 0xE, +0 }, { 0x1F5F213,0x0F5F111, 0xC6,0x0A, 0x0, +0 }, { 0x019F603,0x0F4F212, 0x30,0x10, 0xF, +0 }, { 0x1069FB2,0x10F94B0, 0xC0,0x86, 0x9, +0 }, @@ -4226,7 +4258,6 @@ const adldata adl[4537] = { 0x0235271,0x0198161, 0x1E,0x08, 0xE, +0 }, { 0x0235361,0x0196161, 0x1D,0x03, 0xE, +0 }, { 0x0155331,0x0378261, 0x94,0x00, 0xA, +0 }, - { 0x118543A,0x5177472, 0x1E,0x00, 0x4, -12 }, { 0x0365121,0x0257221, 0x1E,0x08, 0x0, +0 }, { 0x2844521,0x20592A0, 0x23,0x03, 0x0, +0 }, { 0x0578321,0x117C021, 0x19,0x03, 0xC, +0 }, @@ -4250,8 +4281,6 @@ const adldata adl[4537] = { 0x2176522,0x0277421, 0x5A,0x00, 0x6, +0 }, { 0x1267532,0x0166531, 0x8D,0x05, 0x4, +0 }, { 0x2F0F011,0x0987801, 0x03,0x17, 0xA, +0 }, - { 0x00457F2,0x0375761, 0xA8,0x00, 0xE, +0 }, - { 0x2545C73,0x0776821, 0x00,0x0D, 0xE, +0 }, { 0x5543737,0x25D67A1, 0x28,0x00, 0x8, +0 }, { 0x6243371,0x46D6331, 0x20,0x00, 0x6, +0 }, { 0x00F31D1,0x0053271, 0xC7,0x00, 0xB, +0 }, @@ -4304,35 +4333,22 @@ const adldata adl[4537] = { 0x2645321,0x2445521, 0x15,0x0D, 0xA, +0 }, { 0x0B37121,0x5F48221, 0x16,0x08, 0x2, +0 }, { 0x2B37102,0x5F48221, 0x90,0x08, 0x6, +0 }, - { 0x1127533,0x4F4F211, 0x58,0x03, 0x6, +0 }, - { 0x3F0F014,0x6F7F611, 0x40,0x43, 0xA, +0 }, - { 0x033F201,0x373F402, 0xD1,0x8A, 0x0, +0 }, - { 0x6A7F907,0x229A904, 0x1A,0x00, 0xA, -12 }, { 0x5E2F321,0x6E4F523, 0x1B,0x08, 0x8, +0 }, { 0x455F71C,0x0D68501, 0xA3,0x08, 0x6, +0 }, { 0x055F718,0x0D6E501, 0x23,0x08, 0x0, +0 }, - { 0x1397931,0x2099B22, 0x80,0x00, 0x6, +0 }, - { 0x2137931,0x1079B22, 0x42,0xC2, 0xA, +0 }, { 0x302A130,0x0266221, 0x1E,0x00, 0xE, +0 }, { 0x0136031,0x1169131, 0x12,0x80, 0x8, +0 }, { 0x032A115,0x172B212, 0x00,0x80, 0x1, +5 }, { 0x001E79A,0x067961C, 0x81,0x00, 0x4, +0 }, - { 0x4046306,0x005A902, 0xCA,0x08, 0x6, +0 }, - { 0x0045413,0x005A601, 0x51,0x08, 0xA, +0 }, { 0x4D1F214,0x098F715, 0xA0,0x00, 0xC, +0 }, { 0x008F312,0x004F600, 0x08,0xC8, 0x4, -12 }, { 0x27CFA01,0x004F200, 0x08,0x08, 0x0, +0 }, - { 0x5C8FB00,0x0B7E601, 0x00,0x00, 0x0, +0 }, - { 0x2F0F00F,0x0F8F800, 0x00,0x40, 0xE, +12 }, { 0x518F890,0x0E7F310, 0x00,0x00, 0x8, -12 }, { 0x250F610,0x0E7F510, 0x00,0xC8, 0x6, +0 }, { 0x2114109,0x51D2101, 0x05,0x80, 0xA, +0 }, { 0x2114108,0x31D2101, 0x05,0x80, 0xA, +12 }, - { 0x0534313,0x7574A1F, 0x20,0x03, 0xE, -14 }, { 0x00437D2,0x0343471, 0xA1,0x07, 0xC, +0 }, { 0x0F0F00C,0x0F66700, 0x00,0xCD, 0xE, +0 }, - { 0x200C327,0x6021300, 0x80,0x12, 0xE, -23 }, - { 0x200C32B,0x6021300, 0x80,0x12, 0xE, -24 }, { 0x003EBD7,0x06845D8, 0xD4,0x00, 0x7, +12 }, { 0x62FDA20,0x614B009, 0x42,0x48, 0x4, -24 }, { 0x62FDA20,0x614B009, 0x82,0x48, 0x4, -20 }, @@ -4341,15 +4357,7 @@ const adldata adl[4537] = { 0x200832F,0x6044020, 0x80,0x00, 0xE, -36 }, { 0x200832F,0x6044020, 0x80,0x00, 0xE, -35 }, { 0x2305431,0x6E7F600, 0x00,0x00, 0xE, +0 }, - { 0x059F802,0x01CF600, 0x11,0x00, 0xC, +0 }, - { 0x2159506,0x65AB701, 0x00,0x04, 0xE, +0 }, - { 0x10F5F81,0x0164611, 0x00,0x0A, 0x6, +0 }, - { 0x00F5F01,0x20F5F00, 0x00,0x00, 0x8, +0 }, - { 0x0D6D725,0x3A9A909, 0x1F,0x00, 0xE, -9 }, { 0x0F0A00F,0x0F8F80F, 0x00,0x0C, 0xE, +0 }, - { 0x2FDFD00,0x6FAFA00, 0x00,0x00, 0xE, +0 }, - { 0x4F1F103,0x6FAFA07, 0x00,0x00, 0x8, +0 }, - { 0x0F0F007,0x2F6F60F, 0x27,0x00, 0x0, +21 }, { 0x559FA00,0x047F800, 0x00,0x00, 0x4, +0 }, { 0x3F1F102,0x0078400, 0x00,0x26, 0xC, +0 }, { 0x048FA00,0x008F900, 0x00,0x00, 0x6, +12 }, @@ -4365,7 +4373,6 @@ const adldata adl[4537] = { 0x255F308,0x308F909, 0x04,0x08, 0x8, +4 }, { 0x006C604,0x007C604, 0x08,0x08, 0x1, +0 }, { 0x201F312,0x057AB09, 0x03,0x07, 0xC, +12 }, - { 0x254D307,0x3288905, 0x04,0x03, 0xA, -5 }, { 0x0015500,0x007C716, 0x0C,0x00, 0x0, +0 }, { 0x201F312,0x057AB09, 0x00,0x07, 0xC, +12 }, { 0x0015500,0x007C718, 0x0C,0x00, 0x0, +0 }, @@ -4393,9 +4400,6 @@ const adldata adl[4537] = { 0x0A5F7E9,0x0D8994A, 0x29,0x08, 0xC, +10 }, { 0x2A8F9E2,0x0779642, 0x1E,0x00, 0xE, +8 }, { 0x0A5F7E9,0x5D8994A, 0x08,0x00, 0xC, +0 }, - { 0x456FB02,0x017F700, 0x81,0x00, 0xC, +12 }, - { 0x556FA01,0x117F701, 0x00,0x0D, 0xA, +10 }, - { 0x556FB02,0x117F701, 0x81,0x0D, 0xA, +10 }, { 0x367FE06,0x668F701, 0x09,0x08, 0x8, +12 }, { 0x367FD10,0x098F901, 0x00,0x0D, 0x8, +6 }, { 0x367FE05,0x678F701, 0x09,0x08, 0x8, +12 }, @@ -4403,25 +4407,12 @@ const adldata adl[4537] = { 0x098600F,0x3FC8590, 0x08,0xC0, 0xE, +12 }, { 0x009F020,0x27DA788, 0x25,0x00, 0x0, +12 }, { 0x00FC020,0x22DA388, 0x25,0x00, 0xA, +12 }, - { 0x0F00000,0x0F00000, 0x3F,0x3F, 0xC, +0 }, - { 0x000F020,0x40A8A00, 0x0A,0x00, 0xE, +0 }, - { 0x70F5F20,0x70F4F00, 0x00,0x00, 0x2, -12 }, - { 0x0D1F815,0x078F512, 0x44,0x00, 0x8, +12 }, - { 0x2D1F213,0x098F614, 0x9D,0x00, 0x0, +0 }, - { 0x2D1F213,0x098F614, 0x9D,0x21, 0x0, -2 }, - { 0x0985900,0x039870F, 0x07,0x00, 0x8, +13 }, - { 0x2F3F307,0x09C9B0F, 0x1D,0x00, 0x0, +13 }, - { 0x09C4B00,0x43A6705, 0x21,0x00, 0xC, +13 }, - { 0x0F7F907,0x2987805, 0x1C,0x00, 0x0, +13 }, { 0x160F2C6,0x07AF4D4, 0x4F,0x80, 0x8, +12 }, { 0x160F286,0x0B7F294, 0x4F,0x80, 0x8, +12 }, - { 0x227A305,0x36A560A, 0x87,0x08, 0xE, +12 }, - { 0x247C345,0x3697809, 0x87,0x08, 0xE, +12 }, { 0x4755406,0x3667601, 0x87,0x08, 0x6, +12 }, { 0x275A346,0x3667601, 0x87,0x08, 0x6, +12 }, { 0x6E4840B,0x6E4B409, 0x12,0x09, 0x1, +0 }, { 0x6E4440B,0x6E46407, 0x21,0x13, 0x1, +3 }, - { 0x037A309,0x06DF904, 0x11,0x00, 0xE, +0 }, { 0x6F9A902,0x2F7C801, 0x00,0x40, 0x8, +0 }, { 0x4F9F901,0x4F7C713, 0x1F,0x48, 0x0, -7 }, { 0x4B7C720,0x1F3F300, 0x0B,0x00, 0x0, +0 }, @@ -4554,7 +4545,7 @@ const adldata adl[4537] = { 0x07BF003,0x07BF502, 0x8A,0x80, 0x8, +0 }, { 0x07BF003,0x07BF402, 0x8A,0x80, 0x8, +0 }, }; -const struct adlinsdata adlins[4687] = +const struct adlinsdata adlins[4678] = { { 0, 0, 0, 0, 9006, 133, 0, 0 }, { 1, 1, 0, 0, 9206, 146, 0, 0 }, @@ -8732,77 +8723,95 @@ const struct adlinsdata adlins[4687] = {3948,3949, 0, 4, 9320, 133, 0, 0 }, { 9,3950, 0, 4, 1606, 426, 0, 0 }, {3951,3952, 0, 4, 18373, 240, 0, 0 }, - {3953,3954, 0, 4, 4640, 1486, 0, 0 }, + {3953,3954, 0, 1, 7440, 1100, 0, 0.0625 }, { 15,3955, 0, 4, 5640, 1986, 0, 0 }, {3956,3957, 0, 4, 40000, 100, 0, 0 }, {3958,3959, 0, 4, 40000, 73, 0, 0 }, {3960,3961, 0, 4, 40000, 73, 0, 0 }, {3962,3963, 0, 4, 40000, 73, 0, 0 }, {3964,3965, 0, 4, 18186, 153, 0, 0 }, - {3966,3965, 0, 4, 18546, 160, 0, 0 }, - { 31,3967, 0, 4, 40000, 0, 0, 0 }, - {3968,3969, 0, 4, 17886, 100, 0, 0 }, - {3970,3971, 0, 4, 40000, 66, 0, 0 }, - {3972,3971, 0, 4, 40000, 66, 0, 0 }, - {3973,3974, 0, 4, 40000, 46, 0, 0 }, - {3975,3976, 0, 4, 18553, 106, 0, 0 }, - {3977,3976, 0, 4, 18460, 106, 0, 0 }, - {3978,3979, 0, 4, 9366, 106, 0, 0 }, - {3980,3981, 0, 4, 9073, 226, 0, 0 }, - {3982,3983, 0, 4, 40000, 140, 0, 0 }, - {3984,3985, 0, 4, 40000, 800, 0, 0 }, - { 54,3986, 0, 4, 2513, 706, 0, 0 }, - {3987,3988, 0, 4, 40000, 86, 0, 0 }, - {3989,3990, 0, 4, 40000, 233, 0, 0 }, - {3991, 253, 0, 4, 40000, 66, 0, 0 }, - {3992,3992, 0, 0, 40000, 0, 0, 0 }, - {3993,3993, 0, 0, 40000, 120, 0, 0 }, - {3994,3995, 0, 4, 40000, 80, 0, 0 }, - {3996,3997, 0, 4, 40000, 73, 0, 0 }, - {3998,3999, 0, 4, 40000, 86, 0, 0 }, - {1503,4000, 0, 4, 40000, 93, 0, 0 }, - { 88,4001, 0, 4, 40000, 1220, 0, 0 }, - {3743,4002, 0, 4, 7646, 1260, 0, 0 }, - { 92,4003, 0, 4, 40000, 186, 0, 0 }, - { 93,4004, 0, 4, 40000, 813, 0, 0 }, - { 94,4005, 0, 4, 7660, 1260, 0, 0 }, - { 96,4006, 0, 4, 40000, 2460, 0, 0 }, - { 103,4007, 0, 4, 3673, 1240, 0, 0 }, - { 104,4008, 0, 4, 2993, 1226, 0, 0 }, - { 105,4009, 0, 4, 6000, 2453, 0, 0 }, - { 107,4010, 0, 4, 2086, 760, 0, 0 }, - { 108,4011, 0, 4, 40000, 73, 0, 0 }, - { 110,4012, 0, 4, 40000, 100, 0, 0 }, - { 111,4013, 0, 4, 2300, 820, 0, 0 }, - {4014,4015, 0, 4, 1013, 326, 0, 0 }, - { 115,4016, 0, 4, 1813, 0, 0, 0 }, - { 118,4017, 0, 4, 1553, 53, 0, 0 }, - { 119,4018, 0, 4, 580, 0, 0, 0 }, - { 120,4019, 0, 4, 2126, 1166, 0, 0 }, - { 121,4020, 0, 4, 10500, 2986, 0, 0 }, - { 123,4021, 0, 4, 7080, 2473, 0, 0 }, - { 124,4022, 0, 4, 40000, 1126, 0, 0 }, - { 125,4023, 0, 4, 40000, 1546, 0, 0 }, - {4024,4024, 35, 0, 706, 266, 0, 0 }, - {4025,4026, 38, 1, 273, 106, 0, 0 }, - {4027,4028, 38, 1, 366, 133, 0, 0 }, - {4029,4030, 48, 1, 280, 133, 0, -1.90625 }, - {4031,4031, 51, 0, 113, 80, 0, 0 }, - {4032,4033, 48, 1, 953, 346, 0, -1.90625 }, - {4034,4034, 61, 1, 3200, 540, 0, 0.09375 }, + {3966,3967, 0, 4, 18453, 153, 0, 0 }, + { 31,3968, 0, 4, 40000, 0, 0, 0 }, + {3969,3970, 0, 4, 17886, 100, 0, 0 }, + {3971,3972, 0, 4, 40000, 66, 0, 0 }, + {3973,3972, 0, 4, 40000, 66, 0, 0 }, + {3974,3975, 0, 4, 40000, 46, 0, 0 }, + {3976,3977, 0, 4, 18553, 106, 0, 0 }, + {3978,3977, 0, 4, 18460, 106, 0, 0 }, + {3979,3980, 0, 4, 9366, 106, 0, 0 }, + {3981,3982, 0, 4, 9073, 226, 0, 0 }, + {3983,3984, 0, 4, 40000, 140, 0, 0 }, + {3985,3986, 0, 4, 40000, 800, 0, 0 }, + { 54,3987, 0, 4, 2513, 706, 0, 0 }, + {3988,3989, 0, 4, 40000, 86, 0, 0 }, + {3990,3990, 0, 0, 40000, 126, 0, 0 }, + {3991,3992, 0, 4, 40000, 233, 0, 0 }, + {3993, 253, 0, 4, 40000, 66, 0, 0 }, + {3994,3995, 0, 4, 40000, 0, 0, 0 }, + {3996,3997, 0, 4, 40000, 126, 0, 0 }, + {3998,3999, 0, 4, 40000, 80, 0, 0 }, + {4000,4001, 0, 4, 40000, 73, 0, 0 }, + {4002,4003, 0, 1, 40000, 86, 0, 0.046875 }, + {4004,4005, 0, 4, 40000, 86, 0, 0 }, + {1503,4006, 0, 4, 40000, 93, 0, 0 }, + { 88,4007, 0, 4, 40000, 1220, 0, 0 }, + {3743,4008, 0, 4, 7646, 1260, 0, 0 }, + { 92,4009, 0, 4, 40000, 186, 0, 0 }, + { 93,4010, 0, 4, 40000, 813, 0, 0 }, + { 94,4011, 0, 4, 7660, 1260, 0, 0 }, + { 96,4012, 0, 4, 40000, 2460, 0, 0 }, + {4013,4014, 0, 4, 40000, 420, 0, 0 }, + { 103,4015, 0, 4, 3673, 1240, 0, 0 }, + {4016,4017, 0, 1, 6286, 380, 0, 0 }, + {4018,4019, 0, 1, 2220, 426, 0, 0.03125 }, + { 107,4020, 0, 4, 2086, 760, 0, 0 }, + {4021,4022, 0, 1, 40000, 100, 0, 0.0625 }, + { 110,4023, 0, 4, 40000, 100, 0, 0 }, + { 111,4024, 0, 4, 2300, 820, 0, 0 }, + {4025,4026, 0, 4, 1013, 326, 0, 0 }, + {4027,4028, 0, 1, 1220, 393, 0, 0.03125 }, + { 115,4029, 0, 4, 1813, 0, 0, 0 }, + {4030,4031, 0, 1, 566, 146, 0, 0 }, + { 118,4032, 0, 4, 1553, 53, 0, 0 }, + {4033,4033, 0, 0, 613, 60, 0, 0 }, + { 120,4034, 0, 4, 2126, 1166, 0, 0 }, + {4035,4036, 0, 1, 11880, 2993, 0, 0 }, + { 123,4037, 0, 4, 7080, 2473, 0, 0 }, + { 124,4038, 0, 4, 40000, 1126, 0, 0 }, + { 125,4039, 0, 4, 40000, 1546, 0, 0 }, + {4040,4040, 34, 0, 133, 40, 0, 0 }, + {4041,4041, 28, 0, 193, 46, 0, 0 }, + {4042,4043, 39, 1, 553, 126, 0, 0 }, + {4042,4043, 33, 1, 553, 126, 0, 0 }, + {4044,4045, 63, 4, 166, 0, 0, 0 }, + {4046,4046, 15, 0, 113, 0, 0, 0 }, + {4047,4047, 36, 0, 106, 0, 0, 0 }, + {4047,4048, 36, 1, 480, 173, 0, 0.40625 }, + {4049,4049, 35, 0, 706, 266, 0, 0 }, + {4050,4051, 38, 1, 273, 106, 0, 0 }, + {4052,4053, 38, 1, 366, 133, 0, 0 }, + {4054,4055, 48, 1, 280, 133, 0, -1.90625 }, + {4056,4056, 48, 0, 180, 86, 0, 0 }, + {4057,4058, 48, 1, 953, 346, 0, -1.90625 }, + {4059,4059, 61, 1, 3200, 540, 0, 0.09375 }, {3369,1557, 70, 4, 766, 0, 0, 0 }, - {4035,4036, 79, 1, 1306, 513, 0, 0.078125 }, - {4037,4037, 62, 0, 5200, 466, 0, 0 }, - {4038,4039, 67, 1, 2153, 1080, 0, 0.078125 }, - {4040,4040, 62, 1, 3226, 573, 0, 0.09375 }, - {4041,4042, 54, 1, 286, 133, 0, 0 }, - {4041,4043, 48, 1, 286, 126, 0, 0 }, + {4060,4061, 79, 1, 1306, 513, 0, 0.078125 }, + {4062,4062, 62, 0, 5200, 466, 0, 0 }, + {4063,4064, 67, 1, 2153, 1080, 0, 0.078125 }, + {4065,4065, 62, 1, 3226, 573, 0, 0.09375 }, + {4066,4067, 54, 1, 286, 133, 0, 0 }, + {4066,4068, 48, 1, 286, 126, 0, 0 }, + {1589,1589, 71, 0, 106, 46, 0, 0 }, { 389, 389, 42, 0, 266, 73, 0, 0 }, - {4044,4045, 48, 1, 280, 126, 0, 0 }, - {4046,4047, 48, 1, 380, 60, 0, 0 }, - {4048,4048, 16, 0, 180, 20, 0, 0 }, - {4049,4049, 16, 0, 740, 20, 0, 0 }, - {4050,4051, 64, 4, 1346, 0, 0, 0 }, + {4069,4070, 60, 1, 120, 80, 0, 0 }, + {4070,4071, 60, 1, 380, 80, 0, 0 }, + {4072,4072, 73, 0, 166, 33, 0, 0 }, + {4073,4074, 68, 1, 153, 40, 0, 0 }, + {4075,4076, 18, 1, 200, 80, 0, 0 }, + {4077,4078, 18, 1, 253, 73, 0, 0 }, + {4079,4080, 64, 4, 1346, 0, 0, 0 }, + {4081,4082, 64, 1, 373, 73, 0, 0.03125 }, + {4083,4083, 67, 0, 106, 26, 0, 0 }, { 844, 844,244, 2, 6, 0, 0, 0 }, { 855, 855,244, 2, 6, 0, 0, 0 }, { 880, 880,232, 0, 253, 80, 0, 0 }, @@ -8834,415 +8843,388 @@ const struct adlinsdata adlins[4687] = { 902, 902, 35, 0, 1093, 73, 0, 0 }, { 903, 903, 35, 0, 126, 73, 0, 0 }, {3500,3500, 35, 2, 6, 0, 0, 0 }, - {4052,4052, 0, 0, 14166, 320, 0, 0 }, - {4053,4053, 0, 0, 7413, 653, 0, 0 }, - {4054,4054, 0, 0, 40000, 146, 0, 0 }, - {4055,4055, 0, 0, 40000, 113, 0, 0 }, - {4056,4056, 0, 0, 16773, 193, 0, 0 }, - {4057,4057, 0, 0, 40000, 73, 0, 0 }, - {4058,4058, 0, 0, 40000, 0, 0, 0 }, - {4059,4059, 0, 0, 966, 373, 0, 0 }, - {4060,4060, 0, 0, 40000, 80, 0, 0 }, - {4061,4061, 0, 0, 40000, 80, 0, 0 }, - {4062,4062, 0, 0, 18473, 93, 0, 0 }, - {4063,4063, 0, 0, 40000, 60, 0, 0 }, - {4064,4064, 0, 0, 40000, 73, 0, 0 }, - {4065,4065, 0, 0, 40000, 0, 0, 0 }, - {4066,4066, 0, 0, 40000, 213, 0, 0 }, - {4067,4067, 0, 0, 40000, 66, 0, 0 }, - {4068,4068, 0, 0, 1413, 1026, 0, 0 }, - {4069,4069, 0, 0, 506, 200, 0, 0 }, - {4070,4070, 0, 0, 3793, 1106, 0, 0 }, - {4071,4071, 0, 0, 40000, 220, 0, 0 }, - {4072,4072, 0, 0, 40000, 46, 0, 0 }, - {4073,4073, 0, 0, 40000, 0, 0, 0 }, - {4074,4074, 0, 0, 40000, 60, 0, 0 }, - {4075,4075, 0, 0, 40000, 0, 0, 0 }, - {4076,4076, 0, 0, 40000, 33, 0, 0 }, - {4077,4077, 0, 0, 40000, 0, 0, 0 }, - {4078,4078, 0, 0, 40000, 146, 0, 0 }, - {4079,4079, 0, 0, 40000, 66, 0, 0 }, - {4080,4080, 0, 0, 40000, 353, 0, 0 }, - {4081,4081, 0, 0, 40000, 66, 0, 0 }, - {4082,4082, 0, 0, 40000, 53, 0, 0 }, - {4083,4083, 0, 0, 40000, 73, 0, 0 }, - {4084,4084, 0, 0, 40000, 66, 0, 0 }, - {4085,4085, 0, 0, 40000, 926, 0, 0 }, - {4086,4086, 0, 0, 2833, 200, 0, 0 }, + {4084,4084, 0, 0, 14166, 320, 0, 0 }, + {4085,4085, 0, 0, 7413, 653, 0, 0 }, + {4086,4086, 0, 0, 40000, 146, 0, 0 }, + {4087,4087, 0, 0, 40000, 113, 0, 0 }, + {4088,4088, 0, 0, 16773, 193, 0, 0 }, + {4089,4089, 0, 0, 40000, 73, 0, 0 }, + {4090,4090, 0, 0, 40000, 0, 0, 0 }, + {4091,4091, 0, 0, 966, 373, 0, 0 }, + {4092,4092, 0, 0, 40000, 80, 0, 0 }, + {4093,4093, 0, 0, 40000, 80, 0, 0 }, + {4094,4094, 0, 0, 18473, 93, 0, 0 }, + {4095,4095, 0, 0, 40000, 60, 0, 0 }, + {4096,4096, 0, 0, 40000, 73, 0, 0 }, + {4097,4097, 0, 0, 40000, 0, 0, 0 }, + {4098,4098, 0, 0, 40000, 213, 0, 0 }, + {4099,4099, 0, 0, 40000, 66, 0, 0 }, + {4100,4100, 0, 0, 1413, 1026, 0, 0 }, + {4101,4101, 0, 0, 506, 200, 0, 0 }, + {4102,4102, 0, 0, 3793, 1106, 0, 0 }, + {4103,4103, 0, 0, 40000, 220, 0, 0 }, + {4104,4104, 0, 0, 40000, 46, 0, 0 }, + {4105,4105, 0, 0, 40000, 0, 0, 0 }, + {4106,4106, 0, 0, 40000, 60, 0, 0 }, + {4107,4107, 0, 0, 40000, 0, 0, 0 }, + {4108,4108, 0, 0, 40000, 33, 0, 0 }, + {4109,4109, 0, 0, 40000, 0, 0, 0 }, + {4110,4110, 0, 0, 40000, 146, 0, 0 }, + {4111,4111, 0, 0, 40000, 66, 0, 0 }, + {4112,4112, 0, 0, 40000, 353, 0, 0 }, + {4113,4113, 0, 0, 40000, 66, 0, 0 }, + {4114,4114, 0, 0, 40000, 53, 0, 0 }, + {4115,4115, 0, 0, 40000, 73, 0, 0 }, + {4116,4116, 0, 0, 40000, 66, 0, 0 }, + {4117,4117, 0, 0, 40000, 926, 0, 0 }, + {4118,4118, 0, 0, 2833, 200, 0, 0 }, { 127, 127, 36, 0, 386, 166, 0, 0 }, - {4087,4087, 36, 0, 100, 0, 0, 0 }, + {4119,4119, 36, 0, 100, 0, 0, 0 }, {2030,2030, 36, 0, 346, 140, 0, 0 }, {3782,3782, 48, 0, 93, 0, 0, 0 }, {3783,3783, 36, 0, 146, 0, 0, 0 }, - {4088,4088, 48, 0, 1886, 653, 0, 0 }, + {4120,4120, 48, 0, 1886, 653, 0, 0 }, { 132, 132, 69, 0, 126, 66, 0, 0 }, - {4088,4088, 52, 0, 1853, 626, 0, 0 }, + {4120,4120, 52, 0, 1853, 626, 0, 0 }, { 152, 152, 48, 0, 220, 86, 0, 0 }, - {4088,4088, 55, 0, 1886, 640, 0, 0 }, + {4120,4120, 55, 0, 1886, 640, 0, 0 }, { 139, 139, 57, 0, 293, 133, 0, 0 }, - {4088,4088, 58, 0, 1860, 633, 0, 0 }, - {4088,4088, 60, 0, 1886, 633, 0, 0 }, - {4089,4089, 62, 0, 2660, 900, 0, 0 }, - {4088,4088, 63, 0, 1880, 646, 0, 0 }, + {4120,4120, 58, 0, 1860, 633, 0, 0 }, + {4120,4120, 60, 0, 1886, 633, 0, 0 }, + {4121,4121, 62, 0, 2660, 900, 0, 0 }, + {4120,4120, 63, 0, 1880, 646, 0, 0 }, { 134, 134, 70, 0, 966, 360, 0, 0 }, - {4090,4090, 70, 0, 973, 346, 0, 0 }, - {4091,4091, 53, 0, 1866, 640, 0, 0 }, + {4122,4122, 70, 0, 973, 346, 0, 0 }, + {4123,4123, 53, 0, 1866, 640, 0, 0 }, {3516,3516, 48, 0, 180, 93, 0, 0 }, - {4092,4092, 84, 0, 1360, 473, 0, 0 }, - {4093,4093, 43, 0, 513, 206, 0, 0 }, - {4094,4094, 56, 0, 1353, 480, 0, 0 }, + {4124,4124, 84, 0, 1360, 473, 0, 0 }, + {4125,4125, 43, 0, 513, 206, 0, 0 }, + {4126,4126, 56, 0, 1353, 480, 0, 0 }, {3791,3791, 24, 0, 1866, 613, 0, 0 }, { 134, 134, 65, 0, 1346, 486, 0, 0 }, { 146, 146, 48, 0, 173, 93, 0, 0 }, { 146, 146, 54, 0, 173, 93, 0, 0 }, - {4095,4095, 42, 0, 246, 140, 0, 0 }, - {4095,4095, 39, 0, 240, 133, 0, 0 }, + {4127,4127, 42, 0, 246, 140, 0, 0 }, + {4127,4127, 39, 0, 240, 133, 0, 0 }, {3816,3816, 52, 0, 306, 113, 0, 0 }, - {4096,4096, 52, 0, 413, 86, 0, 0 }, + {4128,4128, 52, 0, 413, 86, 0, 0 }, { 158, 158, 60, 0, 146, 166, 0, 0 }, { 158, 158, 66, 0, 146, 166, 0, 0 }, { 158, 158, 59, 0, 146, 166, 0, 0 }, {3538,3538, 91, 0, 773, 233, 0, 0 }, {3547,3547,109, 0, 5300, 1786, 0, 0 }, - {4097,4097, 79, 0, 560, 313, 0, 0 }, - {4098,4098, 0, 0, 10646, 73, 0, 0 }, - {4099,4100, 0, 1, 14166, 586, 0, 0.03125 }, - {4101,4102, 0, 1, 15553, 546, 0, 0.03125 }, - {4103,4104, 0, 1, 11746, 320, 0, 0.046875 }, - {4105,4106, 0, 1, 14706, 646, 0, 0.15625 }, - {4107,4108, 0, 1, 7320, 100, 0, 0.046875 }, - {4109,4110, 0, 1, 40000, 0, 0, 0.0625 }, - {4111,4112, 0, 1, 13660, 260, 0, 0 }, - {4113,4114, 0, 1, 15026, 133, 0, 0 }, - {4115,4116, 0, 1, 40000, 0, 0, 2.5e-05 }, - {4117,4118, 0, 1, 4980, 3400, 0, 0 }, - {4119,4120, 0, 1, 7840, 2660, 0, 0.046875 }, - {4121,4122, 0, 1, 8326, 180, 0, 0 }, - {4123,4124, 0, 1, 1093, 140, 0, 0 }, - {4125,4126, 0, 1, 2280, 400, 0, 0 }, - {4127,4128, 0, 1, 4553, 1486, 0, 0.03125 }, - {4129,4129, 0, 1, 40000, 0, 0, 0.03125 }, - {4130,4131, 0, 1, 40000, 60, 0, 0.15625 }, - {4132,4133, 0, 1, 40000, 93, 0, 0.078125 }, - {4134,4135, 0, 1, 40000, 86, 0, 0.15625 }, - {4136,4137, 0, 1, 40000, 520, 0, 0.03125 }, - {4138,4139, 0, 1, 40000, 140, 0, 0.0625 }, - {4140,4141, 0, 1, 40000, 133, 0, 0.140625 }, - {4142,4143, 0, 1, 40000, 73, 0, 0 }, - {4144,4145, 0, 1, 40000, 346, 0, 0.109375 }, - {4146,4147, 0, 1, 3693, 86, 0, 0 }, - {4148,4149, 0, 1, 6586, 460, 0, 2.5e-05 }, - {4150,4151, 0, 1, 4320, 93, 0, 0 }, - {4152,4153, 0, 1, 7346, 126, 0, 0.046875 }, - {4154,4155, 0, 1, 3633, 260, 0, 0 }, - {4156,4157, 0, 1, 40000, 126, 0, -1.95312 }, - {4158,4159, 0, 1, 40000, 126, 0, -1.9375 }, - {4160,4161, 0, 1, 40000, 46, 0, 0.234375 }, - {4162,4163, 0, 1, 40000, 0, 0, 0.03125 }, - {4164,4165, 0, 1, 10320, 86, 0, 0 }, - {4166,4167, 0, 1, 12933, 133, 0, 0 }, - {4168,4169, 0, 1, 11820, 240, 0, 0.046875 }, - {4170,4171, 0, 1, 3966, 166, 0, 0 }, - {4172,4173, 0, 1, 40000, 0, 0, 0 }, - {4174,4174, 0, 0, 2666, 160, 0, 0 }, - {4175,4176, 0, 1, 15046, 93, 0, 0.078125 }, - {4177,4178, 0, 1, 40000, 100, 0, 0 }, - {4179,4179, 0, 0, 40000, 260, 0, 0 }, - {4180,4181, 0, 1, 40000, 126, 0, 2.5e-05 }, - {4182,4182, 0, 0, 40000, 233, 0, 0 }, - {4183,4184, 0, 1, 40000, 440, 0, 0.078125 }, - {4185,4186, 0, 1, 2160, 606, 0, 0.109375 }, - {4187,4188, 0, 1, 14753, 2400, 0, 0.03125 }, - {4189,4190, 0, 1, 7680, 646, 0, 0.03125 }, - {4191,4192, 0, 1, 40000, 446, 0, 0.0625 }, - {4193,4194, 0, 1, 40000, 866, 0, -0.0625 }, - {4195,4195, 0, 1, 40000, 1220, 0, 0.078125 }, - {4196,4196, 0, 1, 40000, 1960, 0, 0.0625 }, - {4197,4198, 0, 1, 40000, 433, 0, 0.125 }, - {4199,4200, 0, 1, 40000, 140, 0, 0.140625 }, - {4201,4202, 0, 1, 40000, 806, 0, 0.109375 }, - {4203,4204, 0, 1, 2040, 486, 0, 0.125 }, - {4205,4206, 0, 1, 40000, 86, 0, 0 }, - {4207,4208, 0, 1, 40000, 80, 0, 0.03125 }, - {4209,4209, 0, 0, 40000, 73, 0, 0 }, - {4210,4210, 0, 0, 40000, 126, 0, 0 }, - {4211,4212, 0, 1, 40000, 400, 0, 0.0625 }, - {4213,4214, 0, 1, 40000, 120, 0, 0.0625 }, - {4215,4216, 0, 1, 40000, 0, 0, 0.09375 }, - {4217,4217, 0, 1, 40000, 0, 0, 0.125 }, - {4218,4219, 0, 1, 40000, 186, 0, 0 }, - {4220,4220, 0, 0, 40000, 166, 0, 0 }, - {4221,4221, 0, 0, 40000, 73, 0, 0 }, - {4222,4222, 0, 0, 40000, 60, 0, 0 }, - {4223,4224, 0, 1, 40000, 140, 0, 0 }, - {4225,4225, 0, 0, 40000, 140, 0, 0 }, - {4226,4226, 0, 0, 40000, 66, 0, 0 }, - {4227,4228, 0, 1, 40000, 133, 0, 0 }, - {4229,4229, 0, 0, 40000, 86, 0, 0 }, - {4230,4230, 0, 0, 40000, 73, 0, 0 }, - {4231,4231, 0, 0, 40000, 106, 0, 0 }, - {4232,4233, 0, 1, 40000, 186, 0, 0.03125 }, - {4234,4235, 0, 1, 40000, 86, 0, 0.046875 }, - {4236,4237, 0, 1, 40000, 0, 0, 0.03125 }, - {4238,4238, 0, 0, 40000, 300, 0, 0 }, - {4239,4239, 0, 0, 40000, 66, 0, 0 }, - {4240,4241, 0, 1, 40000, 73, 0, 0.125 }, - {4242,4243, 0, 1, 40000, 86, 0, 0.109375 }, - {4244,4245, 0, 1, 40000, 146, 0, 0.109375 }, - {4246,4247, 0, 1, 40000, 66, 0, -0.03125 }, - {4248,4248, 0, 0, 40000, 60, 0, 0 }, - {4249,4250, 0, 1, 40000, 213, 0, 0.15625 }, - {4251,4252, 0, 1, 40000, 66, 0, 0.125 }, - {4253,4254, 0, 1, 40000, 100, 0, 0.03125 }, - {4255,4256, 0, 1, 40000, 1513, 0, 0.078125 }, - {4257,4258, 0, 1, 40000, 353, 0, 0.109375 }, - {4259,4260, 0, 1, 40000, 133, 0, 0.078125 }, - {4261,4262, 0, 1, 40000, 746, 0, 0.140625 }, - {4263,4264, 0, 1, 40000, 0, 0, 0.109375 }, - {4265,4266, 0, 1, 5033, 1606, 0, 0.0625 }, - {4267,4268, 0, 1, 40000, 1146, 0, 0.09375 }, - {4269,4270, 0, 1, 40000, 1586, 0, 0.109375 }, - {4271,4272, 0, 1, 40000, 0, 0, 0.09375 }, - {4273,4274, 0, 1, 40000, 1006, 0, 0.125 }, - {4275,4275, 0, 1, 2680, 793, 0, 0.109375 }, - {4276,4277, 0, 1, 40000, 0, 0, -0.046875 }, - {4278,4279, 0, 1, 9000, 3186, 0, 0.125 }, - {4280,4281, 0, 1, 40000, 1073, 0, -0.078125 }, - {4282,4283, 0, 1, 40000, 2093, 0, 0.140625 }, - {4284,4285, 0, 1, 40000, 0, 0, 0.078125 }, - {4286,4287, 0, 1, 9580, 713, 0, 0.03125 }, - {4288,4289, 0, 1, 6286, 380, 0, 0 }, - {4290,4291, 0, 1, 2220, 426, 0, 0.03125 }, - {4292,4292, 0, 0, 1166, 760, 0, 0 }, - {4293,4294, 0, 1, 1186, 240, 0, 0 }, - {4295,4296, 0, 1, 40000, 100, 0, 0.0625 }, - {4297,4297, 0, 0, 40000, 160, 0, 0 }, - {4298,4298, 0, 0, 40000, 120, 0, 0 }, - {4299,4299, 0, 0, 8673, 2413, 0, 0 }, - {4300,4300, 0, 0, 393, 126, 0, 0 }, - {4301,4302, 0, 1, 1220, 393, 0, 0.03125 }, - {4303,4303, 0, 0, 246, 93, 0, 0 }, - {4304,4305, 0, 1, 1953, 393, 0, 0 }, - {4306,4307, 0, 1, 566, 146, 0, 0 }, - {4308,4309, 0, 1, 4220, 133, 0, 0 }, - {4310,4311, 0, 1, 2873, 73, 0, 0.109375 }, - {4312,4312, 0, 0, 613, 60, 0, 0 }, - {4313,4314, 0, 1, 40000, 186, 0, 0 }, - {4315,4316, 0, 1, 11880, 2993, 0, 0 }, - {4317,4317, 0, 0, 1573, 86, 0, 0 }, - {4318,4319, 0, 1, 40000, 793, 0, 0 }, - {4320,4321, 0, 1, 40000, 173, 0, 0 }, - {4322,4323, 0, 1, 40000, 793, 0, 0 }, - {4324,4324, 0, 0, 606, 133, 0, 0 }, - {4325,4325, 34, 0, 133, 40, 0, 0 }, - {4326,4326, 28, 0, 193, 46, 0, 0 }, - {4327,4328, 39, 1, 553, 126, 0, 0 }, - {4327,4328, 33, 1, 553, 126, 0, 0 }, - {4329,4330, 63, 1, 160, 80, 0, 0 }, - {4331,4331, 15, 0, 113, 0, 0, 0 }, - {4332,4332, 36, 0, 106, 0, 0, 0 }, - {4332,4333, 36, 1, 480, 173, 0, 0.40625 }, - {4334,4335, 25, 1, 313, 153, 0, 0 }, - {4336,4335, 25, 1, 206, 100, 0, 0 }, - {4337,4338, 61, 1, 153, 93, 0, 0 }, - {4339,4340, 38, 1, 340, 133, 0, 0 }, - {4341,4342, 37, 1, 206, 93, 0, 0 }, - {4343,4344, 15, 1, 346, 153, 10, 0 }, - {4345,4346,100, 1, 146, 0, 0, 0.140625 }, - {4347,4348, 19, 1, 553, 200, 10, 0 }, - {4349,4349, 48, 0, 180, 86, 0, 0 }, - {4350,4351, 15, 1, 333, 153, 20, 0 }, - {4352,4353, 12, 1, 340, 146, 20, 0 }, - {4354,4355, 11, 1, 346, 146, 20, 0 }, - {4356,4357, 61, 1, 2706, 1033, 0, 0.09375 }, - {4358,4355, 8, 1, 340, 146, 20, 0 }, - {4359,4360, 91, 1, 1166, 366, 0, -0.046875 }, - {4361,4361, 70, 0, 966, 346, 0, 0 }, - {4362,4363, 80, 1, 300, 93, 0, 0.125 }, - {4364,4364, 58, 0, 206, 53, 0, 0 }, - {4365,4357, 62, 1, 2333, 820, 0, 0.09375 }, - {4366,4367, 31, 1, 773, 200, 0, 0 }, - {4368,4360, 91, 1, 1160, 360, 0, -0.03125 }, - {4369,4370, 41, 1, 373, 113, 0, 0 }, - {4371,4372, 35, 1, 406, 126, 0, 0 }, - {4373,4374, 29, 1, 146, 106, 0, 0 }, - {4375,4376, 41, 1, 400, 126, 0, 0 }, - {4375,4376, 37, 1, 400, 126, 0, 0 }, - {4377,4378, 54, 1, 286, 133, 0, 0 }, - {4377,4379, 48, 1, 286, 126, 0, 0 }, - {4380,4381, 77, 1, 193, 93, 0, 0 }, - {4382,4383, 72, 1, 200, 93, 0, 0 }, - {4384,4384, 40, 0, 513, 0, 0, 0 }, - {4385,4385, 38, 0, 200, 20, 0, 0 }, - {4386,4386, 36, 0, 620, 20, 0, 0 }, - {4387,4388, 60, 1, 120, 80, 0, 0 }, - {4388,4389, 60, 1, 380, 80, 0, 0 }, - {4390,4390, 73, 0, 166, 33, 0, 0 }, - {4391,4392, 68, 1, 153, 40, 0, 0 }, - {4393,4394, 18, 1, 200, 80, 0, 0 }, - {4395,4396, 18, 1, 253, 73, 0, 0 }, - {4397,4397, 90, 0, 193, 20, 0, 0 }, - {4398,4398, 90, 0, 793, 40, 0, 0 }, - {4399,4400, 64, 1, 373, 73, 0, 0.03125 }, - {4401,4402, 80, 1, 406, 153, 0, 0.03125 }, - {4403,4404, 64, 1, 1866, 606, 0, 0 }, - {4405,4405, 67, 0, 106, 26, 0, 0 }, - {4406,4407, 50, 1, 173, 0, 0, 0 }, - {4408,4408, 36, 0, 4646, 0, 0, 0 }, - {4409,4409, 0, 0, 40000, 86, 0, 0 }, - {4410,4410, 0, 0, 40000, 73, 0, 0 }, - {4411,4411, 0, 0, 2433, 700, 0, 0 }, - {4412,4412, 0, 0, 1233, 26, 0, 0 }, - {4413,4413, 0, 0, 40000, 66, 0, 0 }, - {4414,4414, 0, 0, 40000, 60, 0, 0 }, - {4415,4415, 0, 0, 40000, 60, 0, 0 }, - {4416,4416, 0, 0, 40000, 66, 0, 0 }, - {4417,4417, 0, 0, 40000, 66, 0, 0 }, - {4418,4418, 0, 0, 40000, 0, 0, 0 }, - {4418,4418, 73, 0, 40000, 0, 0, 0 }, - {4419,4419, 0, 0, 40000, 60, 0, 0 }, - {4420,4420, 0, 0, 40000, 60, 0, 0 }, - {4421,4421, 0, 0, 7326, 2486, 0, 0 }, - {4422,4422, 0, 0, 4886, 1586, 0, 0 }, - {4423,4423, 0, 0, 646, 20, 0, 0 }, - {4424,4424, 0, 0, 253, 20, 0, 0 }, - {4424,4424, 12, 0, 253, 20, 0, 0 }, - {4425,4425, 0, 0, 640, 100, 0, 0 }, - {4425,4425, 1, 0, 640, 106, 0, 0 }, - {4426,4426, 0, 0, 133, 106, 0, 0 }, - {4426,4426, 23, 0, 133, 106, 0, 0 }, - {4427,4427, 0, 0, 653, 100, 0, 0 }, - {4428,4428, 0, 0, 4166, 1546, 0, 0 }, - {4429,4429, 0, 0, 40000, 73, 0, 0 }, - {4430,4430, 0, 0, 40000, 60, 0, 0 }, - {4431,4431, 0, 0, 40000, 53, 0, 0 }, - {4432,4432, 0, 0, 40000, 0, 0, 0 }, - {4433,4433, 0, 0, 246, 20, 0, 0 }, - {4434,4434, 0, 2, 6, 0, 0, 0 }, - {4435,4435, 0, 0, 4946, 233, 0, 0 }, - {4436,4436, 0, 0, 4946, 233, 0, 0 }, - {4437,4437, 0, 0, 4953, 240, 0, 0 }, - {4438,4438, 0, 0, 4946, 233, 0, 0 }, - {4439,4439, 0, 0, 18233, 46, 0, 0 }, - {4440,4440, 0, 0, 2386, 26, 0, 0 }, - {4441,4441, 0, 0, 4640, 633, 0, 0 }, - {4442,4442, 0, 0, 18466, 100, 0, 0 }, - {4443,4443, 0, 0, 18440, 66, 0, -2 }, - {4444,4444, 0, 0, 18440, 6140, 0, -2 }, - {4445,4445, 0, 0, 1206, 433, 0, -2 }, - {4446,4446, 0, 0, 4626, 240, 0, 0 }, - {4447,4447, 0, 0, 726, 400, 0, 0 }, - {4448,4448, 0, 0, 5866, 73, 0, 0 }, - {4449,4449, 0, 0, 40000, 73, 0, 0 }, - {4450,4450, 0, 0, 40000, 73, 0, 0 }, - {4451,4451, 0, 0, 40000, 73, 0, 0 }, - {4452,4452, 0, 0, 40000, 73, 0, 0 }, - {4453,4453, 0, 0, 6500, 346, 0, 0 }, - {4454,4454, 0, 0, 6506, 346, 0, 0 }, - {4455,4455, 0, 0, 40000, 66, 0, -2 }, - {4456,4456, 0, 0, 40000, 66, 0, -2 }, - {4457,4457, 0, 0, 40000, 0, 0, 0 }, - {4458,4458, 0, 0, 40000, 46, 0, 0 }, - {4459,4459, 0, 0, 40000, 0, 0, 0 }, - {4459,4459, 0, 0, 40000, 0, 0, -2 }, - {4460,4460, 0, 0, 2386, 26, 0, 0 }, - {4461,4461, 0, 0, 40000, 73, 0, -2 }, - {4462,4462, 0, 0, 5866, 26, 0, -2 }, - {4463,4463, 0, 0, 40000, 133, 0, 0 }, - {4464,4464, 0, 0, 40000, 133, 0, 0 }, - {4465,4465, 0, 0, 40000, 126, 0, 0 }, - {4466,4466, 0, 0, 253, 20, 0, 0 }, - {4467,4467, 0, 0, 8866, 1366, 0, 0 }, - {4468,4468, 0, 0, 1040, 766, 0, 0 }, - {4469,4469, 0, 0, 40000, 146, 0, -2 }, - {4470,4470, 0, 0, 40000, 153, 0, -2 }, - {4471,4471, 0, 0, 40000, 466, 0, -2 }, - {4472,4472, 0, 0, 40000, 66, 0, 0 }, - {4473,4473, 0, 0, 2333, 566, 0, 0 }, - {4474,4474, 0, 0, 40000, 140, 0, -2 }, - {4475,4475, 0, 0, 40000, 100, 0, -2 }, - {4476,4476, 0, 0, 40000, 226, 0, -2 }, - {4477,4477, 0, 0, 40000, 0, 0, 0 }, + {4129,4129, 79, 0, 560, 313, 0, 0 }, + {4130,4130, 0, 0, 10646, 73, 0, 0 }, + {4131,4132, 0, 1, 14166, 586, 0, 0.03125 }, + {4133,4134, 0, 1, 15553, 546, 0, 0.03125 }, + {4135,4136, 0, 1, 11746, 320, 0, 0.046875 }, + {4137,4138, 0, 1, 14706, 646, 0, 0.15625 }, + {4139,4140, 0, 1, 7320, 100, 0, 0.046875 }, + {4141,4142, 0, 1, 40000, 0, 0, 0.0625 }, + {4143,4144, 0, 1, 13660, 260, 0, 0 }, + {4145,4146, 0, 1, 15026, 133, 0, 0 }, + {4147,4148, 0, 1, 40000, 0, 0, 2.5e-05 }, + {4149,4150, 0, 1, 4980, 3400, 0, 0 }, + {4151,4152, 0, 1, 7840, 2660, 0, 0.046875 }, + {4153,4154, 0, 1, 8326, 180, 0, 0 }, + {4155,4156, 0, 1, 1093, 140, 0, 0 }, + {4157,4158, 0, 1, 2280, 400, 0, 0 }, + {4159,4160, 0, 1, 4553, 1486, 0, 0.03125 }, + {4161,4161, 0, 1, 40000, 0, 0, 0.03125 }, + {4162,4163, 0, 1, 40000, 60, 0, 0.15625 }, + {4164,4165, 0, 1, 40000, 93, 0, 0.078125 }, + {4166,4167, 0, 1, 40000, 86, 0, 0.15625 }, + {4168,4169, 0, 1, 40000, 520, 0, 0.03125 }, + {4170,4171, 0, 1, 40000, 140, 0, 0.0625 }, + {4172,4173, 0, 1, 40000, 133, 0, 0.140625 }, + {4174,4175, 0, 1, 40000, 73, 0, 0 }, + {4176,4177, 0, 1, 40000, 346, 0, 0.109375 }, + {4178,4179, 0, 1, 3693, 86, 0, 0 }, + {4180,4181, 0, 1, 6586, 460, 0, 2.5e-05 }, + {4182,4183, 0, 1, 4320, 93, 0, 0 }, + {4184,4185, 0, 1, 7346, 126, 0, 0.046875 }, + {4186,4187, 0, 1, 3633, 260, 0, 0 }, + {4188,4189, 0, 1, 40000, 126, 0, -1.95312 }, + {4190,4191, 0, 1, 40000, 126, 0, -1.9375 }, + {4192,4193, 0, 1, 40000, 46, 0, 0.234375 }, + {4194,4195, 0, 1, 40000, 0, 0, 0.03125 }, + {4196,4197, 0, 1, 10320, 86, 0, 0 }, + {4198,4199, 0, 1, 12933, 133, 0, 0 }, + {4200,4201, 0, 1, 11820, 240, 0, 0.046875 }, + {4202,4203, 0, 1, 3966, 166, 0, 0 }, + {4204,4205, 0, 1, 40000, 0, 0, 0 }, + {4206,4206, 0, 0, 2666, 160, 0, 0 }, + {4207,4208, 0, 1, 15046, 93, 0, 0.078125 }, + {4209,4210, 0, 1, 40000, 100, 0, 0 }, + {4211,4211, 0, 0, 40000, 260, 0, 0 }, + {4212,4213, 0, 1, 40000, 126, 0, 2.5e-05 }, + {4214,4214, 0, 0, 40000, 233, 0, 0 }, + {4215,4216, 0, 1, 40000, 440, 0, 0.078125 }, + {4217,4218, 0, 1, 2160, 606, 0, 0.109375 }, + {4219,4220, 0, 1, 14753, 2400, 0, 0.03125 }, + {4221,4222, 0, 1, 7680, 646, 0, 0.03125 }, + {4223,4224, 0, 1, 40000, 446, 0, 0.0625 }, + {4225,4226, 0, 1, 40000, 866, 0, -0.0625 }, + {4227,4227, 0, 1, 40000, 1220, 0, 0.078125 }, + {4228,4228, 0, 1, 40000, 1960, 0, 0.0625 }, + {4229,4230, 0, 1, 40000, 433, 0, 0.125 }, + {4231,4232, 0, 1, 40000, 140, 0, 0.140625 }, + {4233,4234, 0, 1, 40000, 806, 0, 0.109375 }, + {4235,4236, 0, 1, 2040, 486, 0, 0.125 }, + {4237,4238, 0, 1, 40000, 86, 0, 0 }, + {4239,4240, 0, 1, 40000, 80, 0, 0.03125 }, + {4241,4241, 0, 0, 40000, 73, 0, 0 }, + {4242,4243, 0, 1, 40000, 400, 0, 0.0625 }, + {4244,4245, 0, 1, 40000, 120, 0, 0.0625 }, + {4246,4247, 0, 1, 40000, 0, 0, 0.09375 }, + {4248,4248, 0, 1, 40000, 0, 0, 0.125 }, + {4249,4250, 0, 1, 40000, 186, 0, 0 }, + {4251,4251, 0, 0, 40000, 166, 0, 0 }, + {4252,4252, 0, 0, 40000, 73, 0, 0 }, + {4253,4253, 0, 0, 40000, 60, 0, 0 }, + {4254,4255, 0, 1, 40000, 140, 0, 0 }, + {4256,4256, 0, 0, 40000, 140, 0, 0 }, + {4257,4257, 0, 0, 40000, 66, 0, 0 }, + {4258,4259, 0, 1, 40000, 133, 0, 0 }, + {4260,4260, 0, 0, 40000, 86, 0, 0 }, + {4261,4261, 0, 0, 40000, 73, 0, 0 }, + {4262,4262, 0, 0, 40000, 106, 0, 0 }, + {4263,4264, 0, 1, 40000, 186, 0, 0.03125 }, + {4265,4266, 0, 1, 40000, 0, 0, 0.03125 }, + {4267,4267, 0, 0, 40000, 300, 0, 0 }, + {4268,4268, 0, 0, 40000, 66, 0, 0 }, + {4269,4270, 0, 1, 40000, 73, 0, 0.125 }, + {4271,4272, 0, 1, 40000, 86, 0, 0.109375 }, + {4273,4274, 0, 1, 40000, 146, 0, 0.109375 }, + {4275,4276, 0, 1, 40000, 66, 0, -0.03125 }, + {4277,4277, 0, 0, 40000, 60, 0, 0 }, + {4278,4279, 0, 1, 40000, 213, 0, 0.15625 }, + {4280,4281, 0, 1, 40000, 66, 0, 0.125 }, + {4282,4283, 0, 1, 40000, 100, 0, 0.03125 }, + {4284,4285, 0, 1, 40000, 1513, 0, 0.078125 }, + {4286,4287, 0, 1, 40000, 353, 0, 0.109375 }, + {4288,4289, 0, 1, 40000, 133, 0, 0.078125 }, + {4290,4291, 0, 1, 40000, 746, 0, 0.140625 }, + {4292,4293, 0, 1, 40000, 0, 0, 0.109375 }, + {4294,4295, 0, 1, 5033, 1606, 0, 0.0625 }, + {4296,4297, 0, 1, 40000, 1146, 0, 0.09375 }, + {4298,4299, 0, 1, 40000, 1586, 0, 0.109375 }, + {4300,4301, 0, 1, 40000, 0, 0, 0.09375 }, + {4302,4303, 0, 1, 40000, 1006, 0, 0.125 }, + {4304,4304, 0, 1, 2680, 793, 0, 0.109375 }, + {4305,4306, 0, 1, 40000, 0, 0, -0.046875 }, + {4307,4308, 0, 1, 9000, 3186, 0, 0.125 }, + {4309,4310, 0, 1, 40000, 1073, 0, -0.078125 }, + {4311,4312, 0, 1, 40000, 2093, 0, 0.140625 }, + {4313,4314, 0, 1, 40000, 0, 0, 0.078125 }, + {4315,4316, 0, 1, 9580, 713, 0, 0.03125 }, + {4317,4317, 0, 0, 1166, 760, 0, 0 }, + {4318,4319, 0, 1, 1186, 240, 0, 0 }, + {4320,4320, 0, 0, 40000, 160, 0, 0 }, + {4321,4321, 0, 0, 40000, 120, 0, 0 }, + {4322,4322, 0, 0, 8673, 2413, 0, 0 }, + {4323,4323, 0, 0, 393, 126, 0, 0 }, + {4324,4324, 0, 0, 246, 93, 0, 0 }, + {4325,4326, 0, 1, 1953, 393, 0, 0 }, + {4327,4328, 0, 1, 4220, 133, 0, 0 }, + {4329,4330, 0, 1, 2873, 73, 0, 0.109375 }, + {4331,4332, 0, 1, 40000, 186, 0, 0 }, + {4333,4333, 0, 0, 1573, 86, 0, 0 }, + {4334,4335, 0, 1, 40000, 793, 0, 0 }, + {4336,4337, 0, 1, 40000, 173, 0, 0 }, + {4338,4339, 0, 1, 40000, 793, 0, 0 }, + {4340,4340, 0, 0, 606, 133, 0, 0 }, + {4044,4341, 63, 1, 160, 80, 0, 0 }, + {4342,4343, 25, 1, 313, 153, 0, 0 }, + {4344,4343, 25, 1, 206, 100, 0, 0 }, + {4345,4346, 61, 1, 153, 93, 0, 0 }, + {4347,4348, 38, 1, 340, 133, 0, 0 }, + {4349,4350, 37, 1, 206, 93, 0, 0 }, + {4351,4352, 15, 1, 346, 153, 10, 0 }, + {4353,4354,100, 1, 146, 0, 0, 0.140625 }, + {4355,4356, 19, 1, 553, 200, 10, 0 }, + {4357,4358, 15, 1, 333, 153, 20, 0 }, + {4359,4360, 12, 1, 340, 146, 20, 0 }, + {4361,4362, 11, 1, 346, 146, 20, 0 }, + {4363,4364, 61, 1, 2706, 1033, 0, 0.09375 }, + {4365,4362, 8, 1, 340, 146, 20, 0 }, + {4366,4367, 91, 1, 1166, 366, 0, -0.046875 }, + {4368,4368, 70, 0, 966, 346, 0, 0 }, + {4369,4370, 80, 1, 300, 93, 0, 0.125 }, + {4371,4371, 58, 0, 206, 53, 0, 0 }, + {4372,4364, 62, 1, 2333, 820, 0, 0.09375 }, + {4373,4374, 31, 1, 773, 200, 0, 0 }, + {4375,4367, 91, 1, 1160, 360, 0, -0.03125 }, + {4376,4377, 41, 1, 373, 113, 0, 0 }, + {4378,4379, 35, 1, 406, 126, 0, 0 }, + {4380,4381, 29, 1, 146, 106, 0, 0 }, + {4382,4383, 41, 1, 400, 126, 0, 0 }, + {4382,4383, 37, 1, 400, 126, 0, 0 }, + {4384,4385, 77, 1, 193, 93, 0, 0 }, + {4386,4387, 72, 1, 200, 93, 0, 0 }, + {4388,4388, 40, 0, 513, 0, 0, 0 }, + {4389,4389, 38, 0, 200, 20, 0, 0 }, + {4390,4390, 36, 0, 620, 20, 0, 0 }, + {4391,4391, 90, 0, 193, 20, 0, 0 }, + {4392,4392, 90, 0, 793, 40, 0, 0 }, + {4393,4394, 80, 1, 406, 153, 0, 0.03125 }, + {4395,4396, 64, 1, 1866, 606, 0, 0 }, + {4397,4398, 50, 1, 173, 0, 0, 0 }, + {4399,4399, 36, 0, 4646, 0, 0, 0 }, + {4400,4400, 0, 0, 40000, 86, 0, 0 }, + {4401,4401, 0, 0, 40000, 73, 0, 0 }, + {4402,4402, 0, 0, 2433, 700, 0, 0 }, + {4403,4403, 0, 0, 1233, 26, 0, 0 }, + {4404,4404, 0, 0, 40000, 66, 0, 0 }, + {4405,4405, 0, 0, 40000, 60, 0, 0 }, + {4406,4406, 0, 0, 40000, 60, 0, 0 }, + {4407,4407, 0, 0, 40000, 66, 0, 0 }, + {4408,4408, 0, 0, 40000, 66, 0, 0 }, + {4409,4409, 0, 0, 40000, 0, 0, 0 }, + {4409,4409, 73, 0, 40000, 0, 0, 0 }, + {4410,4410, 0, 0, 40000, 60, 0, 0 }, + {4411,4411, 0, 0, 40000, 60, 0, 0 }, + {4412,4412, 0, 0, 7326, 2486, 0, 0 }, + {4413,4413, 0, 0, 4886, 1586, 0, 0 }, + {4414,4414, 0, 0, 646, 20, 0, 0 }, + {4415,4415, 0, 0, 253, 20, 0, 0 }, + {4415,4415, 12, 0, 253, 20, 0, 0 }, + {4416,4416, 0, 0, 640, 100, 0, 0 }, + {4416,4416, 1, 0, 640, 106, 0, 0 }, + {4417,4417, 0, 0, 133, 106, 0, 0 }, + {4417,4417, 23, 0, 133, 106, 0, 0 }, + {4418,4418, 0, 0, 653, 100, 0, 0 }, + {4419,4419, 0, 0, 4166, 1546, 0, 0 }, + {4420,4420, 0, 0, 40000, 73, 0, 0 }, + {4421,4421, 0, 0, 40000, 60, 0, 0 }, + {4422,4422, 0, 0, 40000, 53, 0, 0 }, + {4423,4423, 0, 0, 40000, 0, 0, 0 }, + {4424,4424, 0, 0, 246, 20, 0, 0 }, + {4425,4425, 0, 2, 6, 0, 0, 0 }, + {4426,4426, 0, 0, 4946, 233, 0, 0 }, + {4427,4427, 0, 0, 4946, 233, 0, 0 }, + {4428,4428, 0, 0, 4953, 240, 0, 0 }, + {4429,4429, 0, 0, 4946, 233, 0, 0 }, + {4430,4430, 0, 0, 18233, 46, 0, 0 }, + {4431,4431, 0, 0, 2386, 26, 0, 0 }, + {4432,4432, 0, 0, 4640, 633, 0, 0 }, + {4433,4433, 0, 0, 18466, 100, 0, 0 }, + {4434,4434, 0, 0, 18440, 66, 0, -2 }, + {4435,4435, 0, 0, 18440, 6140, 0, -2 }, + {4436,4436, 0, 0, 1206, 433, 0, -2 }, + {4437,4437, 0, 0, 4626, 240, 0, 0 }, + {4438,4438, 0, 0, 726, 400, 0, 0 }, + {4439,4439, 0, 0, 5866, 73, 0, 0 }, + {4440,4440, 0, 0, 40000, 73, 0, 0 }, + {4441,4441, 0, 0, 40000, 73, 0, 0 }, + {4442,4442, 0, 0, 40000, 73, 0, 0 }, + {4443,4443, 0, 0, 40000, 73, 0, 0 }, + {4444,4444, 0, 0, 6500, 346, 0, 0 }, + {4445,4445, 0, 0, 6506, 346, 0, 0 }, + {4446,4446, 0, 0, 40000, 66, 0, -2 }, + {4447,4447, 0, 0, 40000, 66, 0, -2 }, + {4448,4448, 0, 0, 40000, 0, 0, 0 }, + {4449,4449, 0, 0, 40000, 46, 0, 0 }, + {4450,4450, 0, 0, 40000, 0, 0, 0 }, + {4450,4450, 0, 0, 40000, 0, 0, -2 }, + {4451,4451, 0, 0, 2386, 26, 0, 0 }, + {4452,4452, 0, 0, 40000, 73, 0, -2 }, + {4453,4453, 0, 0, 5866, 26, 0, -2 }, + {4454,4454, 0, 0, 40000, 133, 0, 0 }, + {4455,4455, 0, 0, 40000, 133, 0, 0 }, + {4456,4456, 0, 0, 40000, 126, 0, 0 }, + {4457,4457, 0, 0, 253, 20, 0, 0 }, + {4458,4458, 0, 0, 8866, 1366, 0, 0 }, + {4459,4459, 0, 0, 1040, 766, 0, 0 }, + {4460,4460, 0, 0, 40000, 146, 0, -2 }, + {4461,4461, 0, 0, 40000, 153, 0, -2 }, + {4462,4462, 0, 0, 40000, 466, 0, -2 }, + {4463,4463, 0, 0, 40000, 66, 0, 0 }, + {4464,4464, 0, 0, 2333, 566, 0, 0 }, + {4465,4465, 0, 0, 40000, 140, 0, -2 }, + {4466,4466, 0, 0, 40000, 100, 0, -2 }, + {4467,4467, 0, 0, 40000, 226, 0, -2 }, + {4468,4468, 0, 0, 40000, 0, 0, 0 }, {3712,3712, 0, 0, 40000, 226, 0, -2 }, - {4478,4478, 0, 0, 40000, 140, 0, -2 }, - {4479,4479, 0, 0, 40000, 66, 0, 0 }, - {4480,4480, 0, 0, 40000, 73, 0, 0 }, + {4469,4469, 0, 0, 40000, 140, 0, -2 }, + {4470,4470, 0, 0, 40000, 66, 0, 0 }, + {4471,4471, 0, 0, 40000, 73, 0, 0 }, + {4472,4472, 0, 0, 40000, 73, 0, 0 }, + {4473,4473, 0, 0, 40000, 86, 0, -2 }, + {4474,4474, 0, 0, 40000, 80, 0, 0 }, + {4475,4475, 0, 0, 40000, 73, 0, -2 }, + {4476,4476, 0, 0, 40000, 80, 0, -2 }, + {4477,4477, 0, 0, 40000, 73, 0, -2 }, + {4478,4478, 0, 0, 40000, 73, 0, 0 }, + {4479,4479, 0, 0, 40000, 73, 0, 0 }, + {4480,4480, 0, 0, 40000, 93, 0, 0 }, {4481,4481, 0, 0, 40000, 73, 0, 0 }, - {4482,4482, 0, 0, 40000, 86, 0, -2 }, - {4483,4483, 0, 0, 40000, 80, 0, 0 }, - {4484,4484, 0, 0, 40000, 73, 0, -2 }, - {4485,4485, 0, 0, 40000, 80, 0, -2 }, - {4486,4486, 0, 0, 40000, 73, 0, -2 }, - {4487,4487, 0, 0, 40000, 73, 0, 0 }, - {4488,4488, 0, 0, 40000, 73, 0, 0 }, - {4489,4489, 0, 0, 40000, 93, 0, 0 }, - {4490,4490, 0, 0, 40000, 73, 0, 0 }, - {4491,4491, 0, 0, 11946, 13, 0, 0 }, - {4492,4492, 0, 0, 40000, 73, 0, 0 }, - {4462,4462, 0, 0, 5866, 26, 0, 0 }, - {4493,4493, 0, 0, 40000, 820, 0, 0 }, - {4494,4494, 0, 0, 2153, 873, 0, 0 }, + {4482,4482, 0, 0, 11946, 13, 0, 0 }, + {4483,4483, 0, 0, 40000, 73, 0, 0 }, + {4453,4453, 0, 0, 5866, 26, 0, 0 }, + {4484,4484, 0, 0, 40000, 820, 0, 0 }, + {4485,4485, 0, 0, 2153, 873, 0, 0 }, {1221,1221, 0, 0, 40000, 293, 0, 0.171875 }, - {4495,4495, 0, 0, 1620, 120, 0, 0 }, - {4496,4496, 0, 0, 15120, 93, 0, 0 }, - {4497,4497, 0, 0, 14613, 93, 0, 0 }, - {4498,4498, 0, 0, 2346, 793, 0, 0 }, - {4499,4499, 0, 0, 40000, 2380, 0, 0 }, - {4500,4500, 0, 0, 40000, 1280, 0, 0 }, - {4501,4501, 0, 0, 40000, 1460, 0, 0 }, - {4502,4502, 0, 0, 40000, 2513, 0, 0 }, - {4503,4503, 0, 0, 14840, 1266, 0, 0 }, - {4504,4504, 0, 0, 4513, 640, 0, 0 }, - {4505,4505, 0, 0, 4680, 806, 0, 0 }, - {4506,4506, 0, 0, 40000, 100, 0, 0 }, - {4507,4507, 0, 0, 40000, 66, 0, 0 }, - {4508,4508, 0, 0, 2420, 413, 0, 0 }, - {4509,4509, 0, 0, 406, 73, 0, -2 }, - {4510,4510, 0, 0, 1166, 400, 0, 0 }, - {4511,4511, 0, 0, 1213, 106, 0, 0 }, - {4512,4512, 0, 0, 273, 60, 0, -2 }, - {4513,4513, 0, 0, 40000, 2380, 0, 0 }, - {4514,4514, 0, 0, 40000, 440, 0, 0 }, + {4486,4486, 0, 0, 1620, 120, 0, 0 }, + {4487,4487, 0, 0, 15120, 93, 0, 0 }, + {4488,4488, 0, 0, 14613, 93, 0, 0 }, + {4489,4489, 0, 0, 2346, 793, 0, 0 }, + {4490,4490, 0, 0, 40000, 2380, 0, 0 }, + {4491,4491, 0, 0, 40000, 1280, 0, 0 }, + {4492,4492, 0, 0, 40000, 1460, 0, 0 }, + {4493,4493, 0, 0, 40000, 2513, 0, 0 }, + {4494,4494, 0, 0, 14840, 1266, 0, 0 }, + {4495,4495, 0, 0, 4513, 640, 0, 0 }, + {4496,4496, 0, 0, 4680, 806, 0, 0 }, + {4497,4497, 0, 0, 40000, 100, 0, 0 }, + {4498,4498, 0, 0, 40000, 66, 0, 0 }, + {4499,4499, 0, 0, 2420, 413, 0, 0 }, + {4500,4500, 0, 0, 406, 73, 0, -2 }, + {4501,4501, 0, 0, 1166, 400, 0, 0 }, + {4502,4502, 0, 0, 1213, 106, 0, 0 }, + {4503,4503, 0, 0, 273, 60, 0, -2 }, + {4504,4504, 0, 0, 40000, 2380, 0, 0 }, + {4505,4505, 0, 0, 40000, 440, 0, 0 }, {1261,1261, 0, 0, 40000, 2960, 0, 0 }, - {4515,4515, 37, 0, 973, 73, 0, -2 }, - {4516,4516, 48, 0, 106, 0, 0, -2 }, - {4517,4517, 48, 0, 286, 133, 0, -2 }, - {4518,4518, 62, 0, 166, 60, 0, 0 }, - {4519,4519, 44, 0, 980, 360, 0, 0 }, - {4520,4520, 80, 0, 100, 0, 0, 0 }, - {4519,4519, 50, 0, 980, 346, 0, 0 }, - {4521,4521, 48, 0, 106, 0, 0, -2 }, - {4519,4519, 55, 0, 973, 360, 0, 0 }, - {4522,4522, 61, 0, 513, 20, 0, 0 }, - {4519,4519, 58, 0, 966, 353, 0, 0 }, - {4519,4519, 63, 0, 973, 353, 0, 0 }, - {4523,4523, 71, 0, 1366, 580, 0, 0 }, - {4519,4519, 72, 0, 820, 306, 0, 0 }, - {4524,4524, 70, 0, 1886, 666, 0, 0 }, - {4523,4523, 88, 0, 1353, 560, 0, 0 }, - {4525,4525, 76, 0, 1873, 653, 0, 0 }, - {4526,4526, 84, 0, 260, 113, 0, 0 }, - {4523,4523, 68, 0, 1366, 553, 0, 0 }, - {4527,4527, 72, 0, 153, 53, 0, 0 }, - {4528,4528, 28, 0, 1193, 413, 0, 0 }, - {4524,4524, 81, 0, 1353, 480, 0, 0 }, - {4529,4529, 58, 0, 246, 120, 0, -2 }, - {4529,4529, 55, 0, 246, 120, 0, -2 }, - {4529,4529, 44, 0, 246, 120, 0, -2 }, - {4529,4529, 49, 0, 246, 120, 0, -2 }, - {4529,4529, 40, 0, 286, 133, 0, -2 }, - {4530,4530, 55, 0, 740, 560, 0, -2 }, - {4530,4530, 48, 0, 893, 693, 0, -2 }, - {4531,4531, 52, 0, 513, 206, 0, 0 }, - {4531,4531, 45, 0, 513, 206, 0, 0 }, - {4532,4532, 48, 0, 173, 100, 0, -2 }, - {4533,4533, 48, 0, 120, 266, 0, -2 }, - {4534,4534, 48, 0, 253, 60, 0, -2 }, - {4509,4509, 73, 0, 160, 20, 0, -2 }, - {4509,4509, 68, 0, 160, 20, 0, -2 }, - {4509,4509, 63, 0, 193, 20, 0, -2 }, - {4535,4535,108, 0, 406, 26, 0, 0 }, - {4536,4536,108, 0, 740, 26, 0, 0 }, + {4506,4506, 37, 0, 973, 73, 0, -2 }, + {4507,4507, 48, 0, 106, 0, 0, -2 }, + {4508,4508, 48, 0, 286, 133, 0, -2 }, + {4509,4509, 62, 0, 166, 60, 0, 0 }, + {4510,4510, 44, 0, 980, 360, 0, 0 }, + {4511,4511, 80, 0, 100, 0, 0, 0 }, + {4510,4510, 50, 0, 980, 346, 0, 0 }, + {4512,4512, 48, 0, 106, 0, 0, -2 }, + {4510,4510, 55, 0, 973, 360, 0, 0 }, + {4513,4513, 61, 0, 513, 20, 0, 0 }, + {4510,4510, 58, 0, 966, 353, 0, 0 }, + {4510,4510, 63, 0, 973, 353, 0, 0 }, + {4514,4514, 71, 0, 1366, 580, 0, 0 }, + {4510,4510, 72, 0, 820, 306, 0, 0 }, + {4515,4515, 70, 0, 1886, 666, 0, 0 }, + {4514,4514, 88, 0, 1353, 560, 0, 0 }, + {4516,4516, 76, 0, 1873, 653, 0, 0 }, + {4517,4517, 84, 0, 260, 113, 0, 0 }, + {4514,4514, 68, 0, 1366, 553, 0, 0 }, + {4518,4518, 72, 0, 153, 53, 0, 0 }, + {4519,4519, 28, 0, 1193, 413, 0, 0 }, + {4515,4515, 81, 0, 1353, 480, 0, 0 }, + {4520,4520, 58, 0, 246, 120, 0, -2 }, + {4520,4520, 55, 0, 246, 120, 0, -2 }, + {4520,4520, 44, 0, 246, 120, 0, -2 }, + {4520,4520, 49, 0, 246, 120, 0, -2 }, + {4520,4520, 40, 0, 286, 133, 0, -2 }, + {4521,4521, 55, 0, 740, 560, 0, -2 }, + {4521,4521, 48, 0, 893, 693, 0, -2 }, + {4522,4522, 52, 0, 513, 206, 0, 0 }, + {4522,4522, 45, 0, 513, 206, 0, 0 }, + {4523,4523, 48, 0, 173, 100, 0, -2 }, + {4524,4524, 48, 0, 120, 266, 0, -2 }, + {4525,4525, 48, 0, 253, 60, 0, -2 }, + {4500,4500, 73, 0, 160, 20, 0, -2 }, + {4500,4500, 68, 0, 160, 20, 0, -2 }, + {4500,4500, 63, 0, 193, 20, 0, -2 }, + {4526,4526,108, 0, 406, 26, 0, 0 }, + {4527,4527,108, 0, 740, 26, 0, 0 }, }; @@ -10562,17 +10544,17 @@ const unsigned short banks[75][256] = 4170,4171,1553,1554, 181,4172,4173,1555, 185,4174,3497,4175,1559, 188,4176,4177, 4178,1562,4179,4180,1565, 195,4181, 197,4182,4183, 200, 201, 28,1566,1567,4184, 4185,4186,4187,4188,4189,4190,4191,4192,1572,1573, 214, 215, 216, 217, 218, 219, - 220,4193,4194,1575,1576,1577,1578,4195,1579,1580,4196,1581,4197,4198,4199,4200, - 232, 233, 234, 235,4201, 237, 238,4202,1584,1585, 240,1586, 242, 243, 244,1587, - 246,4203,4204,1589, 249, 250, 251,1590, 252,4205, 254, 255,4206,4207,4208,4209, -1595,4210,1596,1597,1598,1599,1600,1601,4211,4212,4213, 267,4214,4215, 270,4216, -4217,4218, 273,1603,4219,1605, 276,4220,4221,4222,4223,1610,4224,4225,4226, 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,4227,1470,1613,4228,1615,4229,1475,4230,1477,4231,1479,4232,1481, -1482,4233,1484,4234,4235,4236,1630,4237,2291,4238,1634,3514,1636,1637,1638,1639, -1640,4239,4240,1643,1644,1645,1646,4241, 342,4242,4243,1651,1652,1653,4244,4245, -1656,4246,1658,1659,1660,1661,1662,1663, 295, 295, 295, 295, 295, 295, 295, 295, + 220,4193,4194,1575,1576,3852,1578,4195,1579,1580,4196,4197,4198,4199,4200,4201, + 232, 233, 234, 235,4202, 237, 238,4203,1584,1585, 240,1586,4204, 243, 244,1587, + 246,4205,4206,1589, 249, 250, 251,1590, 252,4207, 254,3889,4208,4209,4210,4211, +1595,4212,1596,1597,4213,1599,1600,1601,4214,4215,4216, 267,4217,4218, 270,4219, +4220,4221,4222,1603,4223,4224, 276,4225,4226,4227,4228,1610,4229,4230,4231, 126, + 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295,1662,1663, 295, + 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295,4232,4233,4234,4235,4236, +4237,4238,4239,4240,1470,1613,4241,1615,4242,1475,4243,1477,4244,1479,4245,1481, +1482,4246,1484,4247,4248,4249,1630,4250,2291,4251,1634,3514,1636,1637,1638,1639, +1640,4252,4253,1643,1644, 320,4254,4255, 342,4256,4257,4258,4259,1374,4260,4261, +1656,4262,4263,1659,1660,4264,1662,1663, 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, }, @@ -10584,9 +10566,9 @@ const unsigned short banks[75][256] = 2224, 909,2225, 911, 912,2226,2227, 915, 916,2228,2229, 919, 920, 921, 922, 923, 2230, 925, 926, 927, 928, 929, 295, 931, 932, 933, 934, 935,2232,2233, 938,2234, 940, 295, 942, 943, 944, 945, 946, 947, 948, 949, 950, 951, 952, 953, 954, 955, - 956, 957, 958, 959, 960, 961, 962, 963, 964, 965, 966,4249, 968,4250, 295, 295, -4251,4252,4253,4254,4255,4256,4257, 978,4258,4259,4260,4261,4262,4263,4264,4265, -4266,4267,4268,4269,4270,4271,4272,4273,4274,4275,4276, 975, 971, 972, 973, 974, + 956, 957, 958, 959, 960, 961, 962, 963, 964, 965, 966,4267, 968,4268, 295, 295, +4269,4270,4271,4272,4273,4274,4275, 978,4276,4277,4278,4279,4280,4281,4282,4283, +4284,4285,4286,4287,4288,4289,4290,4291,4292,4293,4294, 975, 971, 972, 973, 974, 975, 310, 976, 977, 978, 974,2239, 980,2240, 982,2241, 984,2242, 985,2243, 987, 988,2244, 990, 325,2244, 325, 991,2244,2245,2246, 330, 993,2247,2248,2249, 997, 998,2250,2251,1001,1002,1003, 340,1004,1005,1006,1007,1008,1009, 310,1010,1011, @@ -10595,20 +10577,20 @@ const unsigned short banks[75][256] = 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, }, { -3287,4278,3196,3196,4279,3196,3196,3196,3196,3196,3196, 378,3196,3196,3694,3196, -3196,4280,3196,4281,4282,4283,3196,3196,3196, 370,3196,4284,4285,4286,4287,4288, -3196,4289,4290,4291,3310,3310,4292, 442,4293,3196,3196,4294,4295,4294, 676,4296, -4297,3196,3196,4298, 51,3196,3196,3196,4299,3324,4300,3196, 59,4301,4299, 62, -3196,4302,4302,4303, 67,3196, 664,4304,3196,2316,3196,4305, 70,3196,4306, 78, -4307,4308, 81,3196,3196,3196,3196,3196,3196,3196,3196, 90,3196,4309, 93,4310, -3196,3196,3196,3196,3196,3196,3196,4311,3196,3196,3196,3196,3196,3196,3196,3196, -3196,3196,3196,3196,3196,4112,3196,4312,3196,3196,3196,3196,3196,3196,3196,3196, +3287,4296,3196,3196,4297,3196,3196,3196,3196,3196,3196, 378,3196,3196,3694,3196, +3196,4298,3196,4299,4300,4301,3196,3196,3196, 370,3196,4302,4303,4304,4305,4306, +3196,4307,4308,4309,3310,3310,4310, 442,4311,3196,3196,4312,4313,4312, 676,4314, +4315,3196,3196,4316, 51,3196,3196,3196,4317,3324,4318,3196, 59,4319,4317, 62, +3196,4320,4320,4321, 67,3196, 664,4322,3196,2316,3196,4323, 70,3196,4324, 78, +4325,4326, 81,3196,3196,3196,3196,3196,3196,3196,3196, 90,3196,4327, 93,4328, +3196,3196,3196,3196,3196,3196,3196,4329,3196,3196,3196,3196,3196,3196,3196,3196, +3196,3196,3196,3196,3196,4112,3196,4330,3196,3196,3196,3196,3196,3196,3196,3196, 3196,3196,3196,3196,3196,3196,3196,3196,3196,3196,3196,3196,3196,3196,3196,3196, 3196,3196,3196,3196,3196,3196,3196,3196,3196,3196,3196,3196,3196,3196,3196,3196, -3196,3196,3196,4313,4313,4314,4315,4316,4317,4318,4319,4320,4321,4322,4323,4324, -4325,4326,4327,4328,4329,4330,4331,4332,4333,4334,4335,4336,3196,3196,4337, 154, -4338,4339,4340,3196,3196, 160,3196,3196,3196,4341,4342,4343,4344,4345,4346,3196, -3196,4347, 160,4348,3196,3196,3196,3196,3196,3196,3196,3196,3196,3196,3196,3196, +3196,3196,3196,4331,4331,4332,4333,4334,4335,4336,4337,4338,4339,4340,4341,4342, +4343,4344,4345,4346,4347,4348,4349,4350,4351,4352,4353,4354,3196,3196,4355, 154, +4356,4357,4358,3196,3196, 160,3196,3196,3196,4359,4360,4361,4362,4363,4364,3196, +3196,4365, 160,4366,3196,3196,3196,3196,3196,3196,3196,3196,3196,3196,3196,3196, 3196,3196,3196,3196,3196,3196,3196,3196,3196,3196,3196,3196,3196,3196,3196,3196, 3196,3196,3196,3196,3196,3196,3196,3196,3196,3196,3196,3196,3196,3196,3196,3196, }, @@ -10620,7 +10602,7 @@ const unsigned short banks[75][256] = 3863,3864,3864,3865,3866,3867,3868,3869,3870,3871,3872,3873,3874,3875,3876,3877, 3878,3879,3880,3881,3882,3883,3884,3885,3886,3887,3888,3889,3890,3891,3892,3893, 3894,3895,3896,3897,3898,3899,3900,3901,3902,3903,3904,3905,3906,3907,3908,3909, -3910,3911,3912,3913,3914,3915,3916,3917,3918,3919,4349,3921,3922,3923,3924,3925, +3910,3911,3912,3913,3914,3915,3916,3917,3918,3919,4367,3921,3922,3923,3924,3925, 3986,3986,3986,3986,3986,3986,3986,3986,3986,3986,3986,3986,3986,3986,3986,3986, 3986,3986,3986,3986,3986,3986,3986,3986,3986,3986,3986,3987,3987,3987,3987,3987, 3987,3987,3987,3927,3928,3929,3930,3931,3932,3933,3934,3935,3936,3937,3938,3939, @@ -10631,26 +10613,26 @@ const unsigned short banks[75][256] = 3996,3996,3996,3996,3996,3996,3996,3996,3996,3996,3996,3996,3996,3996,3996,3996, }, { -4350,4351,4352,4353,4354,4355,4356,4357,4358,4359,4360,4361,4362,4363,4364,4365, -4366,4367,4368,4369,4370,4371,4372,4373,4374,4375,4376,4377,4378,4379,4380,4381, -4382,4383,4384,4385,4386,4387,4388,4389,4390,4391,4392,4393,4394,4395,4396,4397, -4398,4399,4400,4401,4402,4403,4404,4405,4406,4407,4408,4409,4410,4411,4412,4413, -4414,4415,4416,4417,4418,4419,4420,4421,4422,4423,4424,4425,4426,4427,4428,4429, -4430,4431,4432,4433,4434,4435,4436,4437,4438,4439,4440,4441,4442,4443,4444,4445, +4368,4369,4370,4371,4372,4373,4374,4375,4376,4377,4378,4379,4380,4381,4382,4383, +4384,4385,4386,4387,4388,4389,4390,4391,4392,4393,4394,4395,4396,4397,4398,4399, +4400,4401,4402,4403,4404,4405,4406,4407,4408,4409,4410,4411,4412,4413,4414,4415, +4416,4417,4418,4419,4420,4421,4422,4423,4424,4425,4426,4197,4427,4428,4429,4430, +4431,4432,4433,4434,4435,4436,4437,4438,4439,4440,4441,4442,4204,4443,4444,4445, 4446,4447,4448,4449,4450,4451,4452,4453,4454,4455,4456,4457,4458,4459,4460,4461, -4462,4463,4464,4465,4466,4467,4468,4469,4470,4471,4472,4473,4474,4475,4476,4477, +4462,4463,4464,4465,4466,4467,4468,4469,4470,4215,4216,4471,4472,4218,4473,4474, +4475,4476,4222,4477,4478,4224,4479,4480,4226,4481,4228,4482,4483,4484,4485,4486, 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,4478,4479,4480,4481,4482, -4483,4484,4485,4486,4487,4488,4489,4490,4229,4491,4492,4493,4494,4495,4232,4496, -4497,4498,4499,4500,4235,4501,4502,4237,4503,4504,4505,4506,4507,4508,4509,4510, -4511,4512,4513,4514,4515, 320,4516,4517,4518,4519,4520,4521,4522,1374,4523,4524, -4525,4526,4527,4528,4529,4530,4531,4532, 295, 295, 295, 295, 295, 295, 295, 295, + 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295,4232,4233,4234,4235,4487, +4237,4238,4239,4488,4489,4490,4491,4492,4242,4493,4494,4495,4244,4496,4245,4497, +4498,4499,4500,4501,4248,4502,4503,4250,4504,4505,4506,4507,4508,4509,4510,4511, +4512,4252,4253,4513,4514, 320,4515,4516,4517,4256,4257,4258,4259,1374,4260,4261, +4518,4519,4263,4520,4521,4264,4522,4523, 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, }, { -4533,4534,4535,4536,4534,4537,4538,4539,4540,4541,4542,4544,4545,4546,4547,4548, -4549,4551,4553,4546,4555,4556,4557,4558,4559,4560,4561, 295, 28, 29, 30, 31, +4524,4525,4526,4527,4525,4528,4529,4530,4531,4532,4533,4535,4536,4537,4538,4539, +4540,4542,4544,4537,4546,4547,4548,4549,4550,4551,4552, 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, @@ -10659,28 +10641,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,4550, 128,4552, 130, 131, 132,4554, 134, 135, 136, 137, 138, - 139, 140, 141, 142, 143, 144,4543, 146, 147, 148, 149, 150, 151, 152, 153, 154, + 295, 295, 295, 127,4541, 128,4543, 130, 131, 132,4545, 134, 135, 136, 137, 138, + 139, 140, 141, 142, 143, 144,4534, 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, }, { -4563,4564,4565,4566,4567,4568,4569,4570,4571,4572,4573,4574,4575,3295,4572,4576, -3298,4577,4578,3298,4579,4580,4580,4580, 868, 869, 870,4581,4582,4583,4584,4585, -4586,4587,4588,4588,4589,4586,4590,4591,3842,4592,4593,4593,4594,4595,4596,4597, -4598,4599,4600,4600,4601,4107,3322,4602,4603,4604,4605,4606,4607,4603,4603,4608, -3329, 769,3330,3331,4609,4610,4611,4612,4613,4614,4615,4616,4617,4614,1300,4618, -4619,4620,4614,4579,4621,4603,4622,4623,3347,4624,4625,4626,4627,1314,4628,4629, -4630,4631,4632,4625,4625,1322,4633,4634,4635,4636,4637,4636,3295,4638,3842,4639, -4640,1334,4640,4641,4642,4643, 792,4644,1341,1342,1343,1344,4645,4646,4647,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,4648,4648,4649,4650,4649,4651,4652,4653,4654,4655,4656,4657,4658, -4659,4660,4661,4662,4663,4664,4665,4666,4667,4660,4668,4669,4670,4671,4672,4673, -4674,4675,4676,4677,4678,4679,4680,4677,4678,4679,4681,4682,4683,4684,1375, 295, -4685,4686, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, +4554,4555,4556,4557,4558,4559,4560,4561,4562,4563,4564,4565,4566,3295,4563,4567, +3298,4568,4569,3298,4570,4571,4571,4571, 868, 869, 870,4572,4573,4574,4575,4576, +4577,4578,4579,4579,4580,4577,4581,4582,3842,4583,4584,4584,4585,4586,4587,4588, +4589,4590,4591,4591,4592,4107,3322,4593,4594,4595,4596,4597,4598,4594,4594,4599, +3329, 769,3330,3331,4600,4601,4602,4603,4604,4605,4606,4607,4608,4605,1300,4609, +4610,4611,4605,4570,4612,4594,4613,4614,3347,4615,4616,4617,4618,1314,4619,4620, +4621,4622,4623,4616,4616,1322,4624,4625,4626,4627,4628,4627,3295,4629,3842,4630, +4631,1334,4631,4632,4633,4634, 792,4635,1341,1342,1343,1344,4636,4637,4638,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,4639,4639,4640,4641,4640,4642,4643,4644,4645,4646,4647,4648,4649, +4650,4651,4652,4653,4654,4655,4656,4657,4658,4651,4659,4660,4661,4662,4663,4664, +4665,4666,4667,4668,4669,4670,4671,4668,4669,4670,4672,4673,4674,4675,1375, 295, +4676,4677, 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 26a21e4..bde8757 100644 --- a/src/adlmidi.cpp +++ b/src/adlmidi.cpp @@ -60,7 +60,7 @@ ADLMIDI_EXPORT struct ADL_MIDIPlayer *adl_init(long sample_rate) return NULL; } - MIDIplay *player = new MIDIplay(static_cast<unsigned long>(sample_rate)); + MIDIplay *player = new(std::nothrow) MIDIplay(static_cast<unsigned long>(sample_rate)); if(!player) { free(midi_device); @@ -76,9 +76,9 @@ ADLMIDI_EXPORT void adl_close(struct ADL_MIDIPlayer *device) { if(!device) return; - MIDIplay * play = reinterpret_cast<MIDIplay *>(device->adl_midiPlayer); - if(play) - delete play; + MidiPlayer *play = GET_MIDI_PLAYER(device); + assert(play); + delete play; device->adl_midiPlayer = NULL; free(device); device = NULL; @@ -89,8 +89,7 @@ ADLMIDI_EXPORT int adl_setDeviceIdentifier(ADL_MIDIPlayer *device, unsigned id) if(!device || id > 0x0f) return -1; MidiPlayer *play = GET_MIDI_PLAYER(device); - if(!play) - return -1; + assert(play); play->setDeviceId(static_cast<uint8_t>(id)); return 0; } @@ -101,6 +100,7 @@ ADLMIDI_EXPORT int adl_setNumChips(ADL_MIDIPlayer *device, int numChips) return -2; MidiPlayer *play = GET_MIDI_PLAYER(device); + assert(play); #ifdef ADLMIDI_HW_OPL ADL_UNUSED(numChips); play->m_setup.numChips = 1; @@ -124,9 +124,8 @@ ADLMIDI_EXPORT int adl_getNumChips(struct ADL_MIDIPlayer *device) if(device == NULL) return -2; MidiPlayer *play = GET_MIDI_PLAYER(device); - if(play) - return (int)play->m_setup.numChips; - return -2; + assert(play); + return (int)play->m_setup.numChips; } ADLMIDI_EXPORT int adl_setBank(ADL_MIDIPlayer *device, int bank) @@ -134,6 +133,7 @@ ADLMIDI_EXPORT int adl_setBank(ADL_MIDIPlayer *device, int bank) #ifdef DISABLE_EMBEDDED_BANKS ADL_UNUSED(bank); MidiPlayer *play = GET_MIDI_PLAYER(device); + assert(play); play->setErrorString("This build of libADLMIDI has no embedded banks. " "Please load banks by using adl_openBankFile() or " "adl_openBankData() functions instead of adl_setBank()."); @@ -146,6 +146,7 @@ ADLMIDI_EXPORT int adl_setBank(ADL_MIDIPlayer *device, int bank) bankno = 0; MidiPlayer *play = GET_MIDI_PLAYER(device); + assert(play); if(static_cast<uint32_t>(bankno) >= NumBanks) { char errBuf[150]; @@ -185,6 +186,7 @@ ADLMIDI_EXPORT int adl_reserveBanks(ADL_MIDIPlayer *device, unsigned banks) if(!device) return -1; MidiPlayer *play = GET_MIDI_PLAYER(device); + assert(play); OPL3::BankMap &map = play->m_synth.m_insBanks; map.reserve(banks); return (int)map.capacity(); @@ -201,6 +203,7 @@ ADLMIDI_EXPORT int adl_getBank(ADL_MIDIPlayer *device, const ADL_BankId *idp, in size_t idnumber = ((id.msb << 8) | id.lsb | (id.percussive ? size_t(OPL3::PercussionTag) : 0)); MidiPlayer *play = GET_MIDI_PLAYER(device); + assert(play); OPL3::BankMap &map = play->m_synth.m_insBanks; OPL3::BankMap::iterator it; @@ -253,6 +256,7 @@ ADLMIDI_EXPORT int adl_removeBank(ADL_MIDIPlayer *device, ADL_Bank *bank) return -1; MidiPlayer *play = GET_MIDI_PLAYER(device); + assert(play); OPL3::BankMap &map = play->m_synth.m_insBanks; OPL3::BankMap::iterator it = OPL3::BankMap::iterator::from_ptrs(bank->pointer); size_t size = map.size(); @@ -266,6 +270,7 @@ ADLMIDI_EXPORT int adl_getFirstBank(ADL_MIDIPlayer *device, ADL_Bank *bank) return -1; MidiPlayer *play = GET_MIDI_PLAYER(device); + assert(play); OPL3::BankMap &map = play->m_synth.m_insBanks; OPL3::BankMap::iterator it = map.begin(); @@ -282,6 +287,7 @@ ADLMIDI_EXPORT int adl_getNextBank(ADL_MIDIPlayer *device, ADL_Bank *bank) return -1; MidiPlayer *play = GET_MIDI_PLAYER(device); + assert(play); OPL3::BankMap &map = play->m_synth.m_insBanks; OPL3::BankMap::iterator it = OPL3::BankMap::iterator::from_ptrs(bank->pointer); @@ -295,7 +301,7 @@ ADLMIDI_EXPORT int adl_getNextBank(ADL_MIDIPlayer *device, ADL_Bank *bank) ADLMIDI_EXPORT int adl_getInstrument(ADL_MIDIPlayer *device, const ADL_Bank *bank, unsigned index, ADL_Instrument *ins) { if(!device || !bank || index > 127 || !ins) - return 1; + return -1; OPL3::BankMap::iterator it = OPL3::BankMap::iterator::from_ptrs(bank->pointer); cvt_FMIns_to_ADLI(*ins, it->second.ins[index]); @@ -306,10 +312,10 @@ ADLMIDI_EXPORT int adl_getInstrument(ADL_MIDIPlayer *device, const ADL_Bank *ban ADLMIDI_EXPORT int adl_setInstrument(ADL_MIDIPlayer *device, ADL_Bank *bank, unsigned index, const ADL_Instrument *ins) { if(!device || !bank || index > 127 || !ins) - return 1; + return -1; if(ins->version != 0) - return 1; + return -1; OPL3::BankMap::iterator it = OPL3::BankMap::iterator::from_ptrs(bank->pointer); cvt_ADLI_to_FMIns(it->second.ins[index], *ins); @@ -320,13 +326,12 @@ ADLMIDI_EXPORT int adl_loadEmbeddedBank(struct ADL_MIDIPlayer *device, ADL_Bank { if(!device) return -1; - MidiPlayer *play = GET_MIDI_PLAYER(device); - if (!play) - return -1; #ifdef DISABLE_EMBEDDED_BANKS ADL_UNUSED(bank); ADL_UNUSED(num); + MidiPlayer *play = GET_MIDI_PLAYER(device); + assert(play); play->setErrorString("This build of libADLMIDI has no embedded banks. " "Please load banks by using adl_openBankFile() or " "adl_openBankData() functions instead of adl_loadEmbeddedBank()."); @@ -356,6 +361,7 @@ ADLMIDI_EXPORT int adl_setNumFourOpsChn(ADL_MIDIPlayer *device, int ops4) return adlRefreshNumCards(device); MidiPlayer *play = GET_MIDI_PLAYER(device); + assert(play); if((unsigned int)ops4 > 6 * play->m_setup.numChips) { char errBuff[250]; @@ -376,15 +382,15 @@ ADLMIDI_EXPORT int adl_getNumFourOpsChn(struct ADL_MIDIPlayer *device) if(!device) return -1; MidiPlayer *play = GET_MIDI_PLAYER(device); - if(play) - return (int)play->m_setup.numFourOps; - return -1; + assert(play); + return (int)play->m_setup.numFourOps; } ADLMIDI_EXPORT void adl_setPercMode(ADL_MIDIPlayer *device, int percmod) { if(!device) return; MidiPlayer *play = GET_MIDI_PLAYER(device); + assert(play); play->m_setup.rhythmMode = percmod; play->m_synth.m_rhythmMode = play->m_setup.rhythmMode < 0 ? (play->m_synth.m_insBankSetup.adLibPercussions) : @@ -396,6 +402,7 @@ ADLMIDI_EXPORT void adl_setHVibrato(ADL_MIDIPlayer *device, int hvibro) { if(!device) return; MidiPlayer *play = GET_MIDI_PLAYER(device); + assert(play); play->m_setup.deepVibratoMode = hvibro; play->m_synth.m_deepVibratoMode = play->m_setup.deepVibratoMode < 0 ? play->m_synth.m_insBankSetup.deepVibrato : @@ -403,10 +410,19 @@ ADLMIDI_EXPORT void adl_setHVibrato(ADL_MIDIPlayer *device, int hvibro) play->m_synth.commitDeepFlags(); } +ADLMIDI_EXPORT int adl_getHVibrato(struct ADL_MIDIPlayer *device) +{ + if(!device) return -1; + MidiPlayer *play = GET_MIDI_PLAYER(device); + assert(play); + return play->m_synth.m_deepVibratoMode; +} + ADLMIDI_EXPORT void adl_setHTremolo(ADL_MIDIPlayer *device, int htremo) { if(!device) return; MidiPlayer *play = GET_MIDI_PLAYER(device); + assert(play); play->m_setup.deepTremoloMode = htremo; play->m_synth.m_deepTremoloMode = play->m_setup.deepTremoloMode < 0 ? play->m_synth.m_insBankSetup.deepTremolo : @@ -414,13 +430,20 @@ ADLMIDI_EXPORT void adl_setHTremolo(ADL_MIDIPlayer *device, int htremo) play->m_synth.commitDeepFlags(); } +ADLMIDI_EXPORT int adl_getHTremolo(struct ADL_MIDIPlayer *device) +{ + if(!device) return -1; + MidiPlayer *play = GET_MIDI_PLAYER(device); + assert(play); + return play->m_synth.m_deepTremoloMode; +} + ADLMIDI_EXPORT void adl_setScaleModulators(ADL_MIDIPlayer *device, int smod) { if(!device) return; MidiPlayer *play = GET_MIDI_PLAYER(device); - if(!play) - return; + assert(play); play->m_setup.scaleModulators = smod; play->m_synth.m_scaleModulators = play->m_setup.scaleModulators < 0 ? play->m_synth.m_insBankSetup.scaleModulators : @@ -432,8 +455,7 @@ ADLMIDI_EXPORT void adl_setFullRangeBrightness(struct ADL_MIDIPlayer *device, in if(!device) return; MidiPlayer *play = GET_MIDI_PLAYER(device); - if(!play) - return; + assert(play); play->m_setup.fullRangeBrightnessCC74 = (fr_brightness != 0); } @@ -442,8 +464,7 @@ ADLMIDI_EXPORT void adl_setLoopEnabled(ADL_MIDIPlayer *device, int loopEn) if(!device) return; MidiPlayer *play = GET_MIDI_PLAYER(device); - if(!play) - return; + assert(play); #ifndef ADLMIDI_DISABLE_MIDI_SEQUENCER play->m_sequencer.setLoopEnabled(loopEn != 0); #else @@ -456,8 +477,7 @@ ADLMIDI_EXPORT void adl_setSoftPanEnabled(ADL_MIDIPlayer *device, int softPanEn) if(!device) return; MidiPlayer *play = GET_MIDI_PLAYER(device); - if(!play) - return; + assert(play); play->m_synth.m_softPanning = (softPanEn != 0); } @@ -467,8 +487,7 @@ ADLMIDI_EXPORT void adl_setLogarithmicVolumes(struct ADL_MIDIPlayer *device, int if(!device) return; MidiPlayer *play = GET_MIDI_PLAYER(device); - if(!play) - return; + assert(play); play->m_setup.logarithmicVolumes = (logvol != 0); if(play->m_setup.logarithmicVolumes) play->m_synth.setVolumeScaleModel(ADLMIDI_VolumeModel_NativeOPL3); @@ -481,8 +500,7 @@ ADLMIDI_EXPORT void adl_setVolumeRangeModel(struct ADL_MIDIPlayer *device, int v if(!device) return; MidiPlayer *play = GET_MIDI_PLAYER(device); - if(!play) - return; + assert(play); play->m_setup.volumeScaleModel = volumeModel; if(play->m_setup.volumeScaleModel == ADLMIDI_VolumeModel_AUTO)//Use bank default volume model play->m_synth.m_volumeScale = (OPL3::VolumesScale)play->m_synth.m_insBankSetup.volumeModel; @@ -490,11 +508,21 @@ ADLMIDI_EXPORT void adl_setVolumeRangeModel(struct ADL_MIDIPlayer *device, int v play->m_synth.setVolumeScaleModel(static_cast<ADLMIDI_VolumeModels>(volumeModel)); } +ADLMIDI_EXPORT int adl_getVolumeRangeModel(struct ADL_MIDIPlayer *device) +{ + if(!device) + return -1; + MidiPlayer *play = GET_MIDI_PLAYER(device); + assert(play); + return play->m_synth.getVolumeScaleModel(); +} + ADLMIDI_EXPORT int adl_openBankFile(struct ADL_MIDIPlayer *device, const char *filePath) { - if(device && device->adl_midiPlayer) + if(device) { MidiPlayer *play = GET_MIDI_PLAYER(device); + assert(play); play->m_setup.tick_skip_samples_delay = 0; if(!play->LoadBank(filePath)) { @@ -512,11 +540,10 @@ ADLMIDI_EXPORT int adl_openBankFile(struct ADL_MIDIPlayer *device, const char *f ADLMIDI_EXPORT int adl_openBankData(struct ADL_MIDIPlayer *device, const void *mem, unsigned long size) { - if(device && device->adl_midiPlayer) + if(device) { MidiPlayer *play = GET_MIDI_PLAYER(device); - if(!play) - return -1; + assert(play); play->m_setup.tick_skip_samples_delay = 0; if(!play->LoadBank(mem, static_cast<size_t>(size))) { @@ -534,11 +561,10 @@ ADLMIDI_EXPORT int adl_openBankData(struct ADL_MIDIPlayer *device, const void *m ADLMIDI_EXPORT int adl_openFile(ADL_MIDIPlayer *device, const char *filePath) { - if(device && device->adl_midiPlayer) + if(device) { MidiPlayer *play = GET_MIDI_PLAYER(device); - if(!play) - return -1; + assert(play); #ifndef ADLMIDI_DISABLE_MIDI_SEQUENCER play->m_setup.tick_skip_samples_delay = 0; if(!play->LoadMIDI(filePath)) @@ -562,11 +588,10 @@ ADLMIDI_EXPORT int adl_openFile(ADL_MIDIPlayer *device, const char *filePath) ADLMIDI_EXPORT int adl_openData(ADL_MIDIPlayer *device, const void *mem, unsigned long size) { - if(device && device->adl_midiPlayer) + if(device) { MidiPlayer *play = GET_MIDI_PLAYER(device); - if(!play) - return -1; + assert(play); #ifndef ADLMIDI_DISABLE_MIDI_SEQUENCER play->m_setup.tick_skip_samples_delay = 0; if(!play->LoadMIDI(mem, static_cast<size_t>(size))) @@ -600,9 +625,10 @@ ADLMIDI_EXPORT const char *adl_chipEmulatorName(struct ADL_MIDIPlayer *device) { #ifndef ADLMIDI_HW_OPL MidiPlayer *play = GET_MIDI_PLAYER(device); - if(play && !play->m_synth.m_chips.empty()) + assert(play); + if(!play->m_synth.m_chips.empty()) return play->m_synth.m_chips[0]->emulatorName(); - #else +#else return "Hardware OPL3 chip on 0x330"; #endif } @@ -615,8 +641,6 @@ ADLMIDI_EXPORT int adl_switchEmulator(struct ADL_MIDIPlayer *device, int emulato { MidiPlayer *play = GET_MIDI_PLAYER(device); assert(play); - if(!play) - return -1; if(adl_isEmulatorAvailable(emulator)) { play->m_setup.emulator = emulator; @@ -634,12 +658,10 @@ ADLMIDI_EXPORT int adl_setRunAtPcmRate(ADL_MIDIPlayer *device, int enabled) if(device) { MidiPlayer *play = GET_MIDI_PLAYER(device); - if(play) - { - play->m_setup.runAtPcmRate = (enabled != 0); - play->partialReset(); - return 0; - } + assert(play); + play->m_setup.runAtPcmRate = (enabled != 0); + play->partialReset(); + return 0; } return -1; } @@ -679,6 +701,7 @@ ADLMIDI_EXPORT void adl_reset(struct ADL_MIDIPlayer *device) if(!device) return; MidiPlayer *play = GET_MIDI_PLAYER(device); + assert(play); play->partialReset(); play->resetMIDI(); } @@ -689,8 +712,7 @@ ADLMIDI_EXPORT double adl_totalTimeLength(struct ADL_MIDIPlayer *device) if(!device) return -1.0; MidiPlayer *play = GET_MIDI_PLAYER(device); - if(!play) - return -1.0; + assert(play); return play->m_sequencer.timeLength(); #else ADL_UNUSED(device); @@ -704,8 +726,7 @@ ADLMIDI_EXPORT double adl_loopStartTime(struct ADL_MIDIPlayer *device) if(!device) return -1.0; MidiPlayer *play = GET_MIDI_PLAYER(device); - if(!play) - return -1.0; + assert(play); return play->m_sequencer.getLoopStart(); #else ADL_UNUSED(device); @@ -719,8 +740,7 @@ ADLMIDI_EXPORT double adl_loopEndTime(struct ADL_MIDIPlayer *device) if(!device) return -1.0; MidiPlayer *play = GET_MIDI_PLAYER(device); - if(!play) - return -1.0; + assert(play); return play->m_sequencer.getLoopEnd(); #else ADL_UNUSED(device); @@ -734,8 +754,7 @@ ADLMIDI_EXPORT double adl_positionTell(struct ADL_MIDIPlayer *device) if(!device) return -1.0; MidiPlayer *play = GET_MIDI_PLAYER(device); - if(!play) - return -1.0; + assert(play); return play->m_sequencer.tell(); #else ADL_UNUSED(device); @@ -751,8 +770,7 @@ ADLMIDI_EXPORT void adl_positionSeek(struct ADL_MIDIPlayer *device, double secon if(!device) return; MidiPlayer *play = GET_MIDI_PLAYER(device); - if(!play) - return; + assert(play); play->realTime_panic(); play->m_setup.delay = play->m_sequencer.seek(seconds, play->m_setup.mindelay); play->m_setup.carry = 0.0; @@ -768,8 +786,7 @@ ADLMIDI_EXPORT void adl_positionRewind(struct ADL_MIDIPlayer *device) if(!device) return; MidiPlayer *play = GET_MIDI_PLAYER(device); - if(!play) - return; + assert(play); play->realTime_panic(); play->m_sequencer.rewind(); #else @@ -783,8 +800,7 @@ ADLMIDI_EXPORT void adl_setTempo(struct ADL_MIDIPlayer *device, double tempo) if(!device || (tempo <= 0.0)) return; MidiPlayer *play = GET_MIDI_PLAYER(device); - if(!play) - return; + assert(play); play->m_sequencer.setTempo(tempo); #else ADL_UNUSED(device); @@ -797,9 +813,8 @@ ADLMIDI_EXPORT int adl_describeChannels(struct ADL_MIDIPlayer *device, char *str { if(!device) return -1; - MIDIplay *play = reinterpret_cast<MIDIplay *>(device->adl_midiPlayer); - if(!play) - return -1; + MidiPlayer *play = GET_MIDI_PLAYER(device); + assert(play); play->describeChannels(str, attr, size); return 0; } @@ -811,8 +826,7 @@ ADLMIDI_EXPORT const char *adl_metaMusicTitle(struct ADL_MIDIPlayer *device) if(!device) return ""; MidiPlayer *play = GET_MIDI_PLAYER(device); - if(!play) - return ""; + assert(play); return play->m_sequencer.getMusicTitle().c_str(); #else ADL_UNUSED(device); @@ -827,8 +841,7 @@ ADLMIDI_EXPORT const char *adl_metaMusicCopyright(struct ADL_MIDIPlayer *device) if(!device) return ""; MidiPlayer *play = GET_MIDI_PLAYER(device); - if(!play) - return ""; + assert(play); return play->m_sequencer.getMusicCopyright().c_str(); #else ADL_UNUSED(device); @@ -842,8 +855,7 @@ ADLMIDI_EXPORT size_t adl_metaTrackTitleCount(struct ADL_MIDIPlayer *device) if(!device) return 0; MidiPlayer *play = GET_MIDI_PLAYER(device); - if(!play) - return 0; + assert(play); return play->m_sequencer.getTrackTitles().size(); #else ADL_UNUSED(device); @@ -857,6 +869,7 @@ ADLMIDI_EXPORT const char *adl_metaTrackTitle(struct ADL_MIDIPlayer *device, siz if(!device) return ""; MidiPlayer *play = GET_MIDI_PLAYER(device); + assert(play); const std::vector<std::string> &titles = play->m_sequencer.getTrackTitles(); if(index >= titles.size()) return "INVALID"; @@ -875,8 +888,7 @@ ADLMIDI_EXPORT size_t adl_metaMarkerCount(struct ADL_MIDIPlayer *device) if(!device) return 0; MidiPlayer *play = GET_MIDI_PLAYER(device); - if(!play) - return 0; + assert(play); return play->m_sequencer.getMarkers().size(); #else ADL_UNUSED(device); @@ -887,23 +899,32 @@ ADLMIDI_EXPORT size_t adl_metaMarkerCount(struct ADL_MIDIPlayer *device) ADLMIDI_EXPORT Adl_MarkerEntry adl_metaMarker(struct ADL_MIDIPlayer *device, size_t index) { struct Adl_MarkerEntry marker; + #ifndef ADLMIDI_DISABLE_MIDI_SEQUENCER - MidiPlayer *play = GET_MIDI_PLAYER(device); - const std::vector<MidiSequencer::MIDI_MarkerEntry> &markers = play->m_sequencer.getMarkers(); - if(!device || !play || (index >= markers.size())) + if(!device) { marker.label = "INVALID"; marker.pos_time = 0.0; marker.pos_ticks = 0; return marker; } - else + + MidiPlayer *play = GET_MIDI_PLAYER(device); + assert(play); + + const std::vector<MidiSequencer::MIDI_MarkerEntry> &markers = play->m_sequencer.getMarkers(); + if(index >= markers.size()) { - const MidiSequencer::MIDI_MarkerEntry &mk = markers[index]; - marker.label = mk.label.c_str(); - marker.pos_time = mk.pos_time; - marker.pos_ticks = (unsigned long)mk.pos_ticks; + marker.label = "INVALID"; + marker.pos_time = 0.0; + marker.pos_ticks = 0; + return marker; } + + const MidiSequencer::MIDI_MarkerEntry &mk = markers[index]; + marker.label = mk.label.c_str(); + marker.pos_time = mk.pos_time; + marker.pos_ticks = (unsigned long)mk.pos_ticks; #else ADL_UNUSED(device); ADL_UNUSED(index); @@ -920,6 +941,7 @@ ADLMIDI_EXPORT void adl_setRawEventHook(struct ADL_MIDIPlayer *device, ADL_RawEv if(!device) return; MidiPlayer *play = GET_MIDI_PLAYER(device); + assert(play); play->m_sequencerInterface.onEvent = rawEventHook; play->m_sequencerInterface.onEvent_userData = userData; #else @@ -935,6 +957,7 @@ ADLMIDI_EXPORT void adl_setNoteHook(struct ADL_MIDIPlayer *device, ADL_NoteHook if(!device) return; MidiPlayer *play = GET_MIDI_PLAYER(device); + assert(play); play->hooks.onNote = noteHook; play->hooks.onNote_userData = userData; } @@ -945,6 +968,7 @@ ADLMIDI_EXPORT void adl_setDebugMessageHook(struct ADL_MIDIPlayer *device, ADL_D if(!device) return; MidiPlayer *play = GET_MIDI_PLAYER(device); + assert(play); play->hooks.onDebugMessage = debugMessageHook; play->hooks.onDebugMessage_userData = userData; #ifndef ADLMIDI_DISABLE_MIDI_SEQUENCER @@ -1169,6 +1193,7 @@ ADLMIDI_EXPORT int adl_playFormat(ADL_MIDIPlayer *device, int sampleCount, return 0; MidiPlayer *player = GET_MIDI_PLAYER(device); + assert(player); MidiPlayer::Setup &setup = player->m_setup; ssize_t gotten_len = 0; @@ -1275,6 +1300,7 @@ ADLMIDI_EXPORT int adl_generateFormat(struct ADL_MIDIPlayer *device, int sampleC return 0; MidiPlayer *player = GET_MIDI_PLAYER(device); + assert(player); MidiPlayer::Setup &setup = player->m_setup; ssize_t gotten_len = 0; @@ -1335,8 +1361,7 @@ ADLMIDI_EXPORT double adl_tickEvents(struct ADL_MIDIPlayer *device, double secon if(!device) return -1.0; MidiPlayer *play = GET_MIDI_PLAYER(device); - if(!play) - return -1.0; + assert(play); return play->Tick(seconds, granulality); #else ADL_UNUSED(device); @@ -1352,8 +1377,7 @@ ADLMIDI_EXPORT int adl_atEnd(struct ADL_MIDIPlayer *device) if(!device) return 1; MidiPlayer *play = GET_MIDI_PLAYER(device); - if(!play) - return 1; + assert(play); return (int)play->m_sequencer.positionAtEnd(); #else ADL_UNUSED(device); @@ -1367,8 +1391,7 @@ ADLMIDI_EXPORT size_t adl_trackCount(struct ADL_MIDIPlayer *device) if(!device) return 0; MidiPlayer *play = GET_MIDI_PLAYER(device); - if(!play) - return 0; + assert(play); return play->m_sequencer.getTrackCount(); #else ADL_UNUSED(device); @@ -1382,8 +1405,7 @@ ADLMIDI_EXPORT int adl_setTrackOptions(struct ADL_MIDIPlayer *device, size_t tra if(!device) return -1; MidiPlayer *play = GET_MIDI_PLAYER(device); - if(!play) - return -1; + assert(play); MidiSequencer &seq = play->m_sequencer; unsigned enableFlag = trackOptions & 3; @@ -1424,8 +1446,7 @@ ADLMIDI_EXPORT int adl_setTriggerHandler(struct ADL_MIDIPlayer *device, ADL_Trig if(!device) return -1; MidiPlayer *play = GET_MIDI_PLAYER(device); - if(!play) - return -1; + assert(play); MidiSequencer &seq = play->m_sequencer; seq.setTriggerHandler(handler, userData); return 0; @@ -1442,8 +1463,7 @@ ADLMIDI_EXPORT void adl_panic(struct ADL_MIDIPlayer *device) if(!device) return; MidiPlayer *play = GET_MIDI_PLAYER(device); - if(!play) - return; + assert(play); play->realTime_panic(); } @@ -1452,8 +1472,7 @@ ADLMIDI_EXPORT void adl_rt_resetState(struct ADL_MIDIPlayer *device) if(!device) return; MidiPlayer *play = GET_MIDI_PLAYER(device); - if(!play) - return; + assert(play); play->realTime_ResetState(); } @@ -1462,8 +1481,7 @@ ADLMIDI_EXPORT int adl_rt_noteOn(struct ADL_MIDIPlayer *device, ADL_UInt8 channe if(!device) return 0; MidiPlayer *play = GET_MIDI_PLAYER(device); - if(!play) - return 0; + assert(play); return (int)play->realTime_NoteOn(channel, note, velocity); } @@ -1472,8 +1490,7 @@ ADLMIDI_EXPORT void adl_rt_noteOff(struct ADL_MIDIPlayer *device, ADL_UInt8 chan if(!device) return; MidiPlayer *play = GET_MIDI_PLAYER(device); - if(!play) - return; + assert(play); play->realTime_NoteOff(channel, note); } @@ -1482,8 +1499,7 @@ ADLMIDI_EXPORT void adl_rt_noteAfterTouch(struct ADL_MIDIPlayer *device, ADL_UIn if(!device) return; MidiPlayer *play = GET_MIDI_PLAYER(device); - if(!play) - return; + assert(play); play->realTime_NoteAfterTouch(channel, note, atVal); } @@ -1492,8 +1508,7 @@ ADLMIDI_EXPORT void adl_rt_channelAfterTouch(struct ADL_MIDIPlayer *device, ADL_ if(!device) return; MidiPlayer *play = GET_MIDI_PLAYER(device); - if(!play) - return; + assert(play); play->realTime_ChannelAfterTouch(channel, atVal); } @@ -1502,8 +1517,7 @@ ADLMIDI_EXPORT void adl_rt_controllerChange(struct ADL_MIDIPlayer *device, ADL_U if(!device) return; MidiPlayer *play = GET_MIDI_PLAYER(device); - if(!play) - return; + assert(play); play->realTime_Controller(channel, type, value); } @@ -1512,8 +1526,7 @@ ADLMIDI_EXPORT void adl_rt_patchChange(struct ADL_MIDIPlayer *device, ADL_UInt8 if(!device) return; MidiPlayer *play = GET_MIDI_PLAYER(device); - if(!play) - return; + assert(play); play->realTime_PatchChange(channel, patch); } @@ -1522,8 +1535,7 @@ ADLMIDI_EXPORT void adl_rt_pitchBend(struct ADL_MIDIPlayer *device, ADL_UInt8 ch if(!device) return; MidiPlayer *play = GET_MIDI_PLAYER(device); - if(!play) - return; + assert(play); play->realTime_PitchBend(channel, pitch); } @@ -1532,8 +1544,7 @@ ADLMIDI_EXPORT void adl_rt_pitchBendML(struct ADL_MIDIPlayer *device, ADL_UInt8 if(!device) return; MidiPlayer *play = GET_MIDI_PLAYER(device); - if(!play) - return; + assert(play); play->realTime_PitchBend(channel, msb, lsb); } @@ -1542,8 +1553,7 @@ ADLMIDI_EXPORT void adl_rt_bankChangeLSB(struct ADL_MIDIPlayer *device, ADL_UInt if(!device) return; MidiPlayer *play = GET_MIDI_PLAYER(device); - if(!play) - return; + assert(play); play->realTime_BankChangeLSB(channel, lsb); } @@ -1552,8 +1562,7 @@ ADLMIDI_EXPORT void adl_rt_bankChangeMSB(struct ADL_MIDIPlayer *device, ADL_UInt if(!device) return; MidiPlayer *play = GET_MIDI_PLAYER(device); - if(!play) - return; + assert(play); play->realTime_BankChangeMSB(channel, msb); } @@ -1562,8 +1571,7 @@ ADLMIDI_EXPORT void adl_rt_bankChange(struct ADL_MIDIPlayer *device, ADL_UInt8 c if(!device) return; MidiPlayer *play = GET_MIDI_PLAYER(device); - if(!play) - return; + assert(play); play->realTime_BankChange(channel, (uint16_t)bank); } @@ -1572,7 +1580,6 @@ ADLMIDI_EXPORT int adl_rt_systemExclusive(struct ADL_MIDIPlayer *device, const A if(!device) return -1; MidiPlayer *play = GET_MIDI_PLAYER(device); - if(!play) - return -1; + assert(play); return play->realTime_SysEx(msg, size); } diff --git a/src/adlmidi_opl3.cpp b/src/adlmidi_opl3.cpp index aff879a..e486dd6 100644 --- a/src/adlmidi_opl3.cpp +++ b/src/adlmidi_opl3.cpp @@ -631,6 +631,24 @@ void OPL3::setVolumeScaleModel(ADLMIDI_VolumeModels volumeModel) } } +ADLMIDI_VolumeModels OPL3::getVolumeScaleModel() +{ + switch(m_volumeScale) + { + default: + case OPL3::VOLUME_Generic: + return ADLMIDI_VolumeModel_Generic; + case OPL3::VOLUME_NATIVE: + return ADLMIDI_VolumeModel_NativeOPL3; + case OPL3::VOLUME_DMX: + return ADLMIDI_VolumeModel_DMX; + case OPL3::VOLUME_APOGEE: + return ADLMIDI_VolumeModel_APOGEE; + case OPL3::VOLUME_9X: + return ADLMIDI_VolumeModel_9X; + } +} + #ifndef ADLMIDI_HW_OPL void OPL3::clearChips() { diff --git a/src/adlmidi_private.hpp b/src/adlmidi_private.hpp index 2fc12a4..c5b70ee 100644 --- a/src/adlmidi_private.hpp +++ b/src/adlmidi_private.hpp @@ -82,6 +82,7 @@ typedef int32_t ssize_t; //#else #include <map> #include <set> +#include <new> // nothrow //#endif #include <cstdlib> #include <cstring> @@ -448,6 +449,11 @@ public: */ void setVolumeScaleModel(ADLMIDI_VolumeModels volumeModel); + /** + * @brief Get the volume scaling model + */ + ADLMIDI_VolumeModels getVolumeScaleModel(); + #ifndef ADLMIDI_HW_OPL /** * @brief Clean up all running emulated chip instances diff --git a/src/chips/dosbox/dbopl.cpp b/src/chips/dosbox/dbopl.cpp index 4eb79f8..2d31708 100644 --- a/src/chips/dosbox/dbopl.cpp +++ b/src/chips/dosbox/dbopl.cpp @@ -37,6 +37,7 @@ #include <math.h> #include <stdlib.h> #include <string.h> +#include <vector> #include "dbopl.h" #if defined(__GNUC__) && __GNUC__ > 3 @@ -70,6 +71,36 @@ #define PI 3.14159265358979323846 #endif +struct NoCopy { + NoCopy() {} +private: + NoCopy(const NoCopy &); + NoCopy &operator=(const NoCopy &); +}; +#if !defined(_WIN32) +#include <pthread.h> +struct Mutex : NoCopy { + Mutex() : m(PTHREAD_MUTEX_INITIALIZER) {} + void lock() { pthread_mutex_lock(&m); } + void unlock() { pthread_mutex_unlock(&m); } + pthread_mutex_t m; +}; +#else +#include <windows.h> +struct Mutex : NoCopy { + Mutex() { InitializeCriticalSection(&m); } + ~Mutex() { DeleteCriticalSection(&m); } + void lock() { EnterCriticalSection(&m); } + void unlock() { LeaveCriticalSection(&m); } + CRITICAL_SECTION m; +}; +#endif +struct MutexHolder : NoCopy { + explicit MutexHolder(Mutex &m) : m(m) { m.lock(); } + ~MutexHolder() { m.unlock(); } + Mutex &m; +}; + namespace DBOPL { #define OPLRATE ((double)(14318180.0 / 288.0)) @@ -222,24 +253,24 @@ static const Bit8u KslShiftTable[4] = { // Pan law table static const Bit16u PanLawTable[] = { - 65535, 65529, 65514, 65489, 65454, 65409, 65354, 65289, - 65214, 65129, 65034, 64929, 64814, 64689, 64554, 64410, - 64255, 64091, 63917, 63733, 63540, 63336, 63123, 62901, - 62668, 62426, 62175, 61914, 61644, 61364, 61075, 60776, - 60468, 60151, 59825, 59489, 59145, 58791, 58428, 58057, - 57676, 57287, 56889, 56482, 56067, 55643, 55211, 54770, - 54320, 53863, 53397, 52923, 52441, 51951, 51453, 50947, - 50433, 49912, 49383, 48846, 48302, 47750, 47191, - 46340, /* Center left */ - 46340, /* Center right */ - 45472, 44885, 44291, 43690, 43083, 42469, 41848, 41221, - 40588, 39948, 39303, 38651, 37994, 37330, 36661, 35986, - 35306, 34621, 33930, 33234, 32533, 31827, 31116, 30400, - 29680, 28955, 28225, 27492, 26754, 26012, 25266, 24516, - 23762, 23005, 22244, 21480, 20713, 19942, 19169, 18392, - 17613, 16831, 16046, 15259, 14469, 13678, 12884, 12088, - 11291, 10492, 9691, 8888, 8085, 7280, 6473, 5666, - 4858, 4050, 3240, 2431, 1620, 810, 0 + 65535, 65529, 65514, 65489, 65454, 65409, 65354, 65289, + 65214, 65129, 65034, 64929, 64814, 64689, 64554, 64410, + 64255, 64091, 63917, 63733, 63540, 63336, 63123, 62901, + 62668, 62426, 62175, 61914, 61644, 61364, 61075, 60776, + 60468, 60151, 59825, 59489, 59145, 58791, 58428, 58057, + 57676, 57287, 56889, 56482, 56067, 55643, 55211, 54770, + 54320, 53863, 53397, 52923, 52441, 51951, 51453, 50947, + 50433, 49912, 49383, 48846, 48302, 47750, 47191, + 46340, /* Center left */ + 46340, /* Center right */ + 45472, 44885, 44291, 43690, 43083, 42469, 41848, 41221, + 40588, 39948, 39303, 38651, 37994, 37330, 36661, 35986, + 35306, 34621, 33930, 33234, 32533, 31827, 31116, 30400, + 29680, 28955, 28225, 27492, 26754, 26012, 25266, 24516, + 23762, 23005, 22244, 21480, 20713, 19942, 19169, 18392, + 17613, 16831, 16046, 15259, 14469, 13678, 12884, 12088, + 11291, 10492, 9691, 8888, 8085, 7280, 6473, 5666, + 4858, 4050, 3240, 2431, 1620, 810, 0 }; //Generate a table index and table shift value using input value from a selected rate @@ -465,7 +496,7 @@ Bits Operator::TemplateVolume( ) { return vol; } //In sustain phase, but not sustaining, do regular release - /* fall through */ + /* fall through */ case RELEASE: vol += RateForward( releaseAdd );; if ( GCC_UNLIKELY(vol >= ENV_MAX) ) { @@ -1294,21 +1325,40 @@ void Chip::GenerateBlock3_Mix( Bitu total, Bit32s* output ) { } } -void Chip::Setup( Bit32u rate ) { +struct CacheEntry { + Bit32u rate; + Bit32u freqMul[16]; + Bit32u linearRates[76]; + Bit32u attackRates[76]; +}; +static std::vector<CacheEntry> cache; +static Mutex cacheMutex; + +static const CacheEntry *CacheLookupRateDependent( Bit32u rate ) +{ + for ( size_t i = 0, n = cache.size(); i < n; ++i ) { + if (cache[i].rate == rate) + return &cache[i]; + } + return NULL; +} + +static const CacheEntry &ComputeRateDependent( Bit32u rate ) +{ + { + MutexHolder lock( cacheMutex ); + if (const CacheEntry *entry = CacheLookupRateDependent( rate )) + return *entry; + } + double original = OPLRATE; -// double original = rate; double scale = original / (double)rate; - //Noise counter is run at the same precision as general waves - noiseAdd = (Bit32u)( 0.5 + scale * ( 1 << LFO_SH ) ); - noiseCounter = 0; - noiseValue = 1; //Make sure it triggers the noise xor the first time - //The low frequency oscillation counter - //Every time his overflows vibrato and tremoloindex are increased - lfoAdd = (Bit32u)( 0.5 + scale * ( 1 << LFO_SH ) ); - lfoCounter = 0; - vibratoIndex = 0; - tremoloIndex = 0; + CacheEntry entry; + entry.rate = rate; + Bit32u *freqMul = entry.freqMul; + Bit32u *linearRates = entry.linearRates; + Bit32u *attackRates = entry.attackRates; //With higher octave this gets shifted up //-1 since the freqCreateTable = *2 @@ -1330,6 +1380,7 @@ void Chip::Setup( Bit32u rate ) { EnvelopeSelect( i, index, shift ); linearRates[i] = (Bit32u)( scale * (EnvelopeIncreaseTable[ index ] << ( RATE_SH + ENV_EXTRA - shift - 3 ))); } + // Bit32s attackDiffs[62]; //Generate the best matching attack rate for ( Bit8u i = 0; i < 62; i++ ) { @@ -1382,6 +1433,36 @@ void Chip::Setup( Bit32u rate ) { //This should provide instant volume maximizing attackRates[i] = 8 << RATE_SH; } + + MutexHolder lock( cacheMutex ); + if (const CacheEntry *entry = CacheLookupRateDependent( rate )) + return *entry; + + cache.push_back(entry); + return cache.back(); +} + +void Chip::Setup( Bit32u rate ) { + double original = OPLRATE; +// double original = rate; + double scale = original / (double)rate; + + //Noise counter is run at the same precision as general waves + noiseAdd = (Bit32u)( 0.5 + scale * ( 1 << LFO_SH ) ); + noiseCounter = 0; + noiseValue = 1; //Make sure it triggers the noise xor the first time + //The low frequency oscillation counter + //Every time his overflows vibrato and tremoloindex are increased + lfoAdd = (Bit32u)( 0.5 + scale * ( 1 << LFO_SH ) ); + lfoCounter = 0; + vibratoIndex = 0; + tremoloIndex = 0; + + const CacheEntry &entry = ComputeRateDependent( rate ); + freqMul = entry.freqMul; + linearRates = entry.linearRates; + attackRates = entry.attackRates; + //Setup the channels with the correct four op flags //Channels are accessed through a table so they appear linear here chan[ 0].fourMask = 0x00 | ( 1 << 0 ); diff --git a/src/chips/dosbox/dbopl.h b/src/chips/dosbox/dbopl.h index 429735f..89d2019 100644 --- a/src/chips/dosbox/dbopl.h +++ b/src/chips/dosbox/dbopl.h @@ -227,11 +227,11 @@ struct Chip { Bit32u noiseValue; //Frequency scales for the different multiplications - Bit32u freqMul[16]; + const Bit32u *freqMul/*[16]*/; //Rates for decay and release for rate of this chip - Bit32u linearRates[76]; + const Bit32u *linearRates/*[76]*/; //Best match attack rates for the rate of this chip - Bit32u attackRates[76]; + const Bit32u *attackRates/*[76]*/; //18 channels with 2 operators each Channel chan[18]; diff --git a/src/midi_sequencer.hpp b/src/midi_sequencer.hpp index a8cbfac..54ceeea 100644 --- a/src/midi_sequencer.hpp +++ b/src/midi_sequencer.hpp @@ -315,11 +315,24 @@ public: Format_XMIDI }; + /** + * @brief Format of loop points implemented by CC events + */ + enum LoopFormat + { + Loop_Default, + Loop_RPGMaker = 1, + Loop_EMIDI, + Loop_HMI + }; + private: //! Music file format type. MIDI is default. FileFormat m_format; //! SMF format identifier. unsigned m_smfFormat; + //! Loop points format + LoopFormat m_loopFormat; //! Current position Position m_currentPosition; diff --git a/src/midi_sequencer_impl.hpp b/src/midi_sequencer_impl.hpp index 59da621..6d6b2d8 100644 --- a/src/midi_sequencer_impl.hpp +++ b/src/midi_sequencer_impl.hpp @@ -270,6 +270,7 @@ BW_MidiSequencer::BW_MidiSequencer() : m_interface(NULL), m_format(Format_MIDI), m_smfFormat(0), + m_loopFormat(Loop_Default), m_loopEnabled(false), m_fullSongTimeLength(0.0), m_postSongWaitDelay(1.0), @@ -399,6 +400,7 @@ void BW_MidiSequencer::buildSmfSetupReset(size_t trackCount) m_fullSongTimeLength = 0.0; m_loopStartTime = -1.0; m_loopEndTime = -1.0; + m_loopFormat = Loop_Default; m_trackDisable.clear(); m_trackSolo = ~(size_t)0; m_musTitle.clear(); @@ -1374,12 +1376,92 @@ BW_MidiSequencer::MidiEvent BW_MidiSequencer::parseEvent(const uint8_t **pptr, c if(evType == MidiEvent::T_CTRLCHANGE) { //111'th loopStart controller (RPG Maker and others) - if((m_format == Format_MIDI) && (evt.data[0] == 111)) + if(m_format == Format_MIDI) { - //Change event type to custom Loop Start event and clear data - evt.type = MidiEvent::T_SPECIAL; - evt.subtype = MidiEvent::ST_LOOPSTART; - evt.data.clear(); + switch(evt.data[0]) + { + case 110: + if(m_loopFormat == Loop_Default) + { + //Change event type to custom Loop Start event and clear data + evt.type = MidiEvent::T_SPECIAL; + evt.subtype = MidiEvent::ST_LOOPSTART; + evt.data.clear(); + m_loopFormat = Loop_HMI; + } + else if(m_loopFormat == Loop_HMI) + { + // Repeating of 110'th point is BAD practice, treat as EMIDI + m_loopFormat = Loop_EMIDI; + } + break; + + case 111: + if(m_loopFormat == Loop_HMI) + { + //Change event type to custom Loop End event and clear data + evt.type = MidiEvent::T_SPECIAL; + evt.subtype = MidiEvent::ST_LOOPEND; + evt.data.clear(); + } + else if(m_loopFormat != Loop_EMIDI) + { + // Change event type to custom Loop Start event and clear data + evt.type = MidiEvent::T_SPECIAL; + evt.subtype = MidiEvent::ST_LOOPSTART; + evt.data.clear(); + } + break; + + case 113: + if(m_loopFormat == Loop_EMIDI) + { + //EMIDI does using of CC113 with same purpose as CC7 + evt.data[0] = 7; + } + break; +#if 0 //WIP + case 116: + if(m_loopFormat == Loop_EMIDI) + { + evt.type = MidiEvent::T_SPECIAL; + evt.subtype = MidiEvent::ST_LOOPSTACK_BEGIN; + evt.data[0] = evt.data[1]; + evt.data.pop_back(); + + if(m_interface->onDebugMessage) + { + m_interface->onDebugMessage( + m_interface->onDebugMessage_userData, + "Stack EMIDI Loop Start at %d to %d level with %d loops", + m_loop.stackLevel, + m_loop.stackLevel + 1, + evt.data[0] + ); + } + } + break; + + case 117: // Next/Break Loop Controller + if(m_loopFormat == Loop_EMIDI) + { + evt.type = MidiEvent::T_SPECIAL; + evt.subtype = MidiEvent::ST_LOOPSTACK_END; + evt.data.clear(); + + if(m_interface->onDebugMessage) + { + m_interface->onDebugMessage( + m_interface->onDebugMessage_userData, + "Stack EMIDI Loop End at %d to %d level", + m_loop.stackLevel, + m_loop.stackLevel - 1 + ); + } + } + break; +#endif + } } if(m_format == Format_XMIDI) |