52 static constexpr
auto tl_tab = [] {
53 std::array<int, TL_TAB_LEN> result = {};
55 double m = (1 << 16) / cstd::exp2<6>((
x + 1) * (
ENV_STEP / 4.0) / 8.0);
69 result[
x * 2 + 0] = n;
70 result[
x * 2 + 1] = -result[
x * 2 + 0];
72 for (
auto i :
xrange(1, 13)) {
73 result[
x * 2 + 0 + i * 2 *
TL_RES_LEN] = result[
x * 2 + 0] >> i;
83 static constexpr
auto sin_tab = [] {
84 std::array<unsigned, SIN_LEN> result = {};
87 double m = cstd::sin<2>((i * 2 + 1) *
M_PI /
SIN_LEN);
90 double o = -8.0 * cstd::log2<8, 3>(
cstd::abs(m));
99 result[i] = n * 2 + (m >= 0.0 ? 0 : 1);
106 static constexpr
auto d1l_tab = [] {
107 std::array<unsigned, 16> result = {};
109 for (
int i = 0; i < 16; ++i) {
111 result[i] = unsigned((i != 15 ? i : i + 16) * (4.0 /
ENV_STEP));
143 16,16,16,16,16,16,16,16,
148 static constexpr
byte O(
int a) {
return a *
RATE_STEPS; }
153 O(18),O(18),O(18),O(18),O(18),O(18),O(18),O(18),
154 O(18),O(18),O(18),O(18),O(18),O(18),O(18),O(18),
155 O(18),O(18),O(18),O(18),O(18),O(18),O(18),O(18),
156 O(18),O(18),O(18),O(18),O(18),O(18),O(18),O(18),
159 O( 0),O( 1),O( 2),O( 3),
160 O( 0),O( 1),O( 2),O( 3),
161 O( 0),O( 1),O( 2),O( 3),
162 O( 0),O( 1),O( 2),O( 3),
163 O( 0),O( 1),O( 2),O( 3),
164 O( 0),O( 1),O( 2),O( 3),
165 O( 0),O( 1),O( 2),O( 3),
166 O( 0),O( 1),O( 2),O( 3),
167 O( 0),O( 1),O( 2),O( 3),
168 O( 0),O( 1),O( 2),O( 3),
169 O( 0),O( 1),O( 2),O( 3),
170 O( 0),O( 1),O( 2),O( 3),
173 O( 4),O( 5),O( 6),O( 7),
176 O( 8),O( 9),O(10),O(11),
179 O(12),O(13),O(14),O(15),
182 O(16),O(16),O(16),O(16),
185 O(16),O(16),O(16),O(16),O(16),O(16),O(16),O(16),
186 O(16),O(16),O(16),O(16),O(16),O(16),O(16),O(16),
187 O(16),O(16),O(16),O(16),O(16),O(16),O(16),O(16),
188 O(16),O(16),O(16),O(16),O(16),O(16),O(16),O(16)
197 0, 0, 0, 0, 0, 0, 0, 0,
198 0, 0, 0, 0, 0, 0, 0, 0,
199 0, 0, 0, 0, 0, 0, 0, 0,
200 0, 0, 0, 0, 0, 0, 0, 0,
229 0, 0, 0, 0, 0, 0, 0, 0,
230 0, 0, 0, 0, 0, 0, 0, 0,
231 0, 0, 0, 0, 0, 0, 0, 0,
232 0, 0, 0, 0, 0, 0, 0, 0
244 constexpr
unsigned dt2_tab[4] = { 0, 384, 500, 608 };
251 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
252 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
255 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2,
256 2, 3, 3, 3, 4, 4, 4, 5, 5, 6, 6, 7, 8, 8, 8, 8,
259 1, 1, 1, 1, 2, 2, 2, 2, 2, 3, 3, 3, 4, 4, 4, 5,
260 5, 6, 6, 7, 8, 8, 9,10,11,12,13,14,16,16,16,16,
263 2, 2, 2, 2, 2, 3, 3, 3, 4, 4, 4, 5, 5, 6, 6, 7,
264 8, 8, 9,10,11,12,13,14,16,17,19,20,22,22,22,22
268 1299,1300,1301,1302,1303,1304,1305,1306,1308,1309,1310,1311,1313,1314,1315,1316,
269 1318,1319,1320,1321,1322,1323,1324,1325,1327,1328,1329,1330,1332,1333,1334,1335,
270 1337,1338,1339,1340,1341,1342,1343,1344,1346,1347,1348,1349,1351,1352,1353,1354,
271 1356,1357,1358,1359,1361,1362,1363,1364,1366,1367,1368,1369,1371,1372,1373,1374,
272 1376,1377,1378,1379,1381,1382,1383,1384,1386,1387,1388,1389,1391,1392,1393,1394,
273 1396,1397,1398,1399,1401,1402,1403,1404,1406,1407,1408,1409,1411,1412,1413,1414,
274 1416,1417,1418,1419,1421,1422,1423,1424,1426,1427,1429,1430,1431,1432,1434,1435,
275 1437,1438,1439,1440,1442,1443,1444,1445,1447,1448,1449,1450,1452,1453,1454,1455,
276 1458,1459,1460,1461,1463,1464,1465,1466,1468,1469,1471,1472,1473,1474,1476,1477,
277 1479,1480,1481,1482,1484,1485,1486,1487,1489,1490,1492,1493,1494,1495,1497,1498,
278 1501,1502,1503,1504,1506,1507,1509,1510,1512,1513,1514,1515,1517,1518,1520,1521,
279 1523,1524,1525,1526,1528,1529,1531,1532,1534,1535,1536,1537,1539,1540,1542,1543,
280 1545,1546,1547,1548,1550,1551,1553,1554,1556,1557,1558,1559,1561,1562,1564,1565,
281 1567,1568,1569,1570,1572,1573,1575,1576,1578,1579,1580,1581,1583,1584,1586,1587,
282 1590,1591,1592,1593,1595,1596,1598,1599,1601,1602,1604,1605,1607,1608,1609,1610,
283 1613,1614,1615,1616,1618,1619,1621,1622,1624,1625,1627,1628,1630,1631,1632,1633,
284 1637,1638,1639,1640,1642,1643,1645,1646,1648,1649,1651,1652,1654,1655,1656,1657,
285 1660,1661,1663,1664,1666,1667,1669,1670,1672,1673,1675,1676,1678,1679,1681,1682,
286 1685,1686,1688,1689,1691,1692,1694,1695,1697,1698,1700,1701,1703,1704,1706,1707,
287 1709,1710,1712,1713,1715,1716,1718,1719,1721,1722,1724,1725,1727,1728,1730,1731,
288 1734,1735,1737,1738,1740,1741,1743,1744,1746,1748,1749,1751,1752,1754,1755,1757,
289 1759,1760,1762,1763,1765,1766,1768,1769,1771,1773,1774,1776,1777,1779,1780,1782,
290 1785,1786,1788,1789,1791,1793,1794,1796,1798,1799,1801,1802,1804,1806,1807,1809,
291 1811,1812,1814,1815,1817,1819,1820,1822,1824,1825,1827,1828,1830,1832,1833,1835,
292 1837,1838,1840,1841,1843,1845,1846,1848,1850,1851,1853,1854,1856,1858,1859,1861,
293 1864,1865,1867,1868,1870,1872,1873,1875,1877,1879,1880,1882,1884,1885,1887,1888,
294 1891,1892,1894,1895,1897,1899,1900,1902,1904,1906,1907,1909,1911,1912,1914,1915,
295 1918,1919,1921,1923,1925,1926,1928,1930,1932,1933,1935,1937,1939,1940,1942,1944,
296 1946,1947,1949,1951,1953,1954,1956,1958,1960,1961,1963,1965,1967,1968,1970,1972,
297 1975,1976,1978,1980,1982,1983,1985,1987,1989,1990,1992,1994,1996,1997,1999,2001,
298 2003,2004,2006,2008,2010,2011,2013,2015,2017,2019,2021,2022,2024,2026,2028,2029,
299 2032,2033,2035,2037,2039,2041,2043,2044,2047,2048,2050,2052,2054,2056,2058,2059,
300 2062,2063,2065,2067,2069,2071,2073,2074,2077,2078,2080,2082,2084,2086,2088,2089,
301 2092,2093,2095,2097,2099,2101,2103,2104,2107,2108,2110,2112,2114,2116,2118,2119,
302 2122,2123,2125,2127,2129,2131,2133,2134,2137,2139,2141,2142,2145,2146,2148,2150,
303 2153,2154,2156,2158,2160,2162,2164,2165,2168,2170,2172,2173,2176,2177,2179,2181,
304 2185,2186,2188,2190,2192,2194,2196,2197,2200,2202,2204,2205,2208,2209,2211,2213,
305 2216,2218,2220,2222,2223,2226,2227,2230,2232,2234,2236,2238,2239,2242,2243,2246,
306 2249,2251,2253,2255,2256,2259,2260,2263,2265,2267,2269,2271,2272,2275,2276,2279,
307 2281,2283,2285,2287,2288,2291,2292,2295,2297,2299,2301,2303,2304,2307,2308,2311,
308 2315,2317,2319,2321,2322,2325,2326,2329,2331,2333,2335,2337,2338,2341,2342,2345,
309 2348,2350,2352,2354,2355,2358,2359,2362,2364,2366,2368,2370,2371,2374,2375,2378,
310 2382,2384,2386,2388,2389,2392,2393,2396,2398,2400,2402,2404,2407,2410,2411,2414,
311 2417,2419,2421,2423,2424,2427,2428,2431,2433,2435,2437,2439,2442,2445,2446,2449,
312 2452,2454,2456,2458,2459,2462,2463,2466,2468,2470,2472,2474,2477,2480,2481,2484,
313 2488,2490,2492,2494,2495,2498,2499,2502,2504,2506,2508,2510,2513,2516,2517,2520,
314 2524,2526,2528,2530,2531,2534,2535,2538,2540,2542,2544,2546,2549,2552,2553,2556,
315 2561,2563,2565,2567,2568,2571,2572,2575,2577,2579,2581,2583,2586,2589,2590,2593
333 static constexpr
auto freq = [] {
334 std::array<unsigned, 11 * 768> result = {};
342 double mult = 1 << (
FREQ_SH - 10);
344 for (
auto i :
xrange(768)) {
349 result[768 + 2 * 768 + i] = int(phaseinc * mult) & 0xffffffc0;
351 for (
auto j :
xrange(2)) {
353 result[768 + j * 768 + i] = (result[768 + 2 * 768 + i] >> (2 - j)) & 0xffffffc0;
356 for (
auto j :
xrange(3, 8)) {
357 result[768 + j * 768 + i] = result[768 + 2 * 768 + i] << (j - 2);
362 for (
auto i :
xrange(768)) {
363 result[0 * 768 + i] = result[1 * 768 + 0];
367 for (
auto j :
xrange(8, 10)) {
368 for (
auto i :
xrange(768)) {
369 result[768 + j * 768 + i] = result[768 + 8 * 768 - 1];
377 static constexpr
auto dt1_freq = [] {
378 std::array<int, 8 * 32> result = {};
380 for (
auto j :
xrange(4)) {
381 for (
auto i :
xrange(32)) {
383 double phaseinc = double(
dt1_tab[j * 32 + i]) / (1 << 20) *
SIN_LEN;
386 result[(j + 0) * 32 + i] =
int(phaseinc * mult);
387 result[(j + 4) * 32 + i] = -result[(j + 0) * 32 + i];
395 static constexpr
auto noise_tab = [] {
396 std::array<unsigned, 32> result = {};
398 for (
int i = 0; i < 32; ++i) {
399 result[i] = 32 - (i != 31 ? i : 30);
419 0xFF,0xEE,0xD3,0x80,0x58,0xDA,0x7F,0x94,0x9E,0xE3,0xFA,0x00,0x4D,0xFA,0xFF,0x6A,
420 0x7A,0xDE,0x49,0xF6,0x00,0x33,0xBB,0x63,0x91,0x60,0x51,0xFF,0x00,0xD8,0x7F,0xDE,
421 0xDC,0x73,0x21,0x85,0xB2,0x9C,0x5D,0x24,0xCD,0x91,0x9E,0x76,0x7F,0x20,0xFB,0xF3,
422 0x00,0xA6,0x3E,0x42,0x27,0x69,0xAE,0x33,0x45,0x44,0x11,0x41,0x72,0x73,0xDF,0xA2,
424 0x32,0xBD,0x7E,0xA8,0x13,0xEB,0xD3,0x15,0xDD,0xFB,0xC9,0x9D,0x61,0x2F,0xBE,0x9D,
425 0x23,0x65,0x51,0x6A,0x84,0xF9,0xC9,0xD7,0x23,0xBF,0x65,0x19,0xDC,0x03,0xF3,0x24,
426 0x33,0xB6,0x1E,0x57,0x5C,0xAC,0x25,0x89,0x4D,0xC5,0x9C,0x99,0x15,0x07,0xCF,0xBA,
427 0xC5,0x9B,0x15,0x4D,0x8D,0x2A,0x1E,0x1F,0xEA,0x2B,0x2F,0x64,0xA9,0x50,0x3D,0xAB,
429 0x50,0x77,0xE9,0xC0,0xAC,0x6D,0x3F,0xCA,0xCF,0x71,0x7D,0x80,0xA6,0xFD,0xFF,0xB5,
430 0xBD,0x6F,0x24,0x7B,0x00,0x99,0x5D,0xB1,0x48,0xB0,0x28,0x7F,0x80,0xEC,0xBF,0x6F,
431 0x6E,0x39,0x90,0x42,0xD9,0x4E,0x2E,0x12,0x66,0xC8,0xCF,0x3B,0x3F,0x10,0x7D,0x79,
432 0x00,0xD3,0x1F,0x21,0x93,0x34,0xD7,0x19,0x22,0xA2,0x08,0x20,0xB9,0xB9,0xEF,0x51,
434 0x99,0xDE,0xBF,0xD4,0x09,0x75,0xE9,0x8A,0xEE,0xFD,0xE4,0x4E,0x30,0x17,0xDF,0xCE,
435 0x11,0xB2,0x28,0x35,0xC2,0x7C,0x64,0xEB,0x91,0x5F,0x32,0x0C,0x6E,0x00,0xF9,0x92,
436 0x19,0xDB,0x8F,0xAB,0xAE,0xD6,0x12,0xC4,0x26,0x62,0xCE,0xCC,0x0A,0x03,0xE7,0xDD,
437 0xE2,0x4D,0x8A,0xA6,0x46,0x95,0x0F,0x8F,0xF5,0x15,0x97,0x32,0xD4,0x28,0x1E,0x55
440 void YM2151::keyOn(YM2151Operator* op,
unsigned keySet) {
444 op->volume += (~op->volume *
445 (
eg_inc[op->eg_sel_ar + ((eg_cnt >> op->eg_sh_ar)&7)])
455 void YM2151::keyOff(YM2151Operator* op,
unsigned keyClear) {
466 void YM2151::envelopeKONKOFF(YM2151Operator* op,
int v)
471 keyOff(op + 0,
unsigned(~1));
476 keyOff(op + 1,
unsigned(~1));
481 keyOff(op + 2,
unsigned(~1));
486 keyOff(op + 3,
unsigned(~1));
490 void YM2151::setConnect(YM2151Operator* om1,
int cha,
int v)
492 YM2151Operator* om2 = om1 + 1;
493 YM2151Operator* oc1 = om1 + 2;
503 om1->mem_connect = &m2;
512 om1->mem_connect = &m2;
521 om1->mem_connect = &m2;
530 om1->mem_connect = &c2;
538 oc1->connect = &chanout[cha];
540 om1->mem_connect = &mem;
547 om1->connect =
nullptr;
548 oc1->connect = &chanout[cha];
549 om2->connect = &chanout[cha];
550 om1->mem_connect = &m2;
559 oc1->connect = &chanout[cha];
560 om2->connect = &chanout[cha];
561 om1->mem_connect = &mem;
570 om1->connect = &chanout[cha];
571 oc1->connect = &chanout[cha];
572 om2->connect = &chanout[cha];
573 om1->mem_connect = &mem;
578 void YM2151::refreshEG(YM2151Operator* op)
580 unsigned kc = op->kc;
583 unsigned v = kc >> op->ks;
584 if ((op->ar + v) < 32 + 62) {
600 if ((op->ar + v) < 32 + 62) {
616 if ((op->ar + v) < 32 + 62) {
632 if ((op->ar + v) < 32 + 62) {
651 YM2151Operator* op = &oper[(r & 0x07) * 4 + ((r & 0x18) >> 3)];
659 if (v & 2) lfo_phase = 0;
663 envelopeKONKOFF(&oper[(v & 7) * 4], v);
668 noise_f = noise_tab[v & 0x1f];
674 timer_A_val |= v << 2;
675 timer1->setValue(timer_A_val);
679 timer_A_val &= 0x03fc;
680 timer_A_val |= v & 3;
681 timer1->setValue(timer_A_val);
696 timer1->setStart((v & 4) != 0, time);
697 timer2->setStart((v & 8) != 0, time);
701 lfo_overflow = (1 << ((15 - (v >> 4)) + 3));
702 lfo_counter_add = 0x10 + (v & 0x0f);
725 op = &oper[(r & 7) * 4];
728 op->fb_shift = ((v >> 3) & 7) ? ((v >> 3) & 7) + 6 : 0;
729 pan[(r & 7) * 2 + 0] = (v & 0x40) ? ~0 : 0;
730 pan[(r & 7) * 2 + 1] = (v & 0x80) ? ~0 : 0;
731 setConnect(op, r & 7, v & 7);
737 unsigned kc_channel = (v - (v>>2))*64;
739 kc_channel |= (op->kc_i & 63);
742 (op + 0)->kc_i = kc_channel;
744 (op + 1)->kc_i = kc_channel;
746 (op + 2)->kc_i = kc_channel;
748 (op + 3)->kc_i = kc_channel;
751 (op + 0)->dt1 = dt1_freq[(op + 0)->dt1_i + kc];
752 (op + 0)->freq = ((freq[kc_channel + (op + 0)->dt2] + (op + 0)->dt1) * (op + 0)->mul) >> 1;
754 (op + 1)->dt1 = dt1_freq[(op + 1)->dt1_i + kc];
755 (op + 1)->freq = ((freq[kc_channel + (op + 1)->dt2] + (op + 1)->dt1) * (op + 1)->mul) >> 1;
757 (op + 2)->dt1 = dt1_freq[(op + 2)->dt1_i + kc];
758 (op + 2)->freq = ((freq[kc_channel + (op + 2)->dt2] + (op + 2)->dt1) * (op + 2)->mul) >> 1;
760 (op + 3)->dt1 = dt1_freq[(op + 3)->dt1_i + kc];
761 (op + 3)->freq = ((freq[kc_channel + (op + 3)->dt2] + (op + 3)->dt1) * (op + 3)->mul) >> 1;
769 if (v != (op->kc_i & 63)) {
770 unsigned kc_channel = v;
771 kc_channel |= (op->kc_i & ~63);
773 (op + 0)->kc_i = kc_channel;
774 (op + 1)->kc_i = kc_channel;
775 (op + 2)->kc_i = kc_channel;
776 (op + 3)->kc_i = kc_channel;
778 (op + 0)->freq = ((freq[kc_channel + (op + 0)->dt2] + (op + 0)->dt1) * (op + 0)->mul) >> 1;
779 (op + 1)->freq = ((freq[kc_channel + (op + 1)->dt2] + (op + 1)->dt1) * (op + 1)->mul) >> 1;
780 (op + 2)->freq = ((freq[kc_channel + (op + 2)->dt2] + (op + 2)->dt1) * (op + 2)->mul) >> 1;
781 (op + 3)->freq = ((freq[kc_channel + (op + 3)->dt2] + (op + 3)->dt1) * (op + 3)->mul) >> 1;
786 op->pms = (v >> 4) & 7;
793 unsigned olddt1_i = op->dt1_i;
794 unsigned oldmul = op->mul;
796 op->dt1_i = (v & 0x70) << 1;
797 op->mul = (v & 0x0f) ? (v & 0x0f) << 1 : 1;
799 if (olddt1_i != op->dt1_i) {
800 op->dt1 = dt1_freq[op->dt1_i + (op->kc>>2)];
802 if ((olddt1_i != op->dt1_i) || (oldmul != op->mul)) {
803 op->freq = ((freq[op->kc_i + op->dt2] + op->dt1) * op->mul) >> 1;
808 op->tl = (v & 0x7f) << (
ENV_BITS - 7);
812 unsigned oldKs = op->ks;
813 unsigned oldAr = op->ar;
814 op->ks = 5 - (v >> 6);
815 op->ar = (v & 0x1f) ? 32 + ((v & 0x1f) << 1) : 0;
817 if ((op->ar != oldAr) || (op->ks != oldKs)) {
818 if ((op->ar + (op->kc >> op->ks)) < 32 + 62) {
826 if (op->ks != oldKs) {
827 op->eg_sh_d1r =
eg_rate_shift [op->d1r + (op->kc >> op->ks)];
829 op->eg_sh_d2r =
eg_rate_shift [op->d2r + (op->kc >> op->ks)];
837 op->AMmask = (v & 0x80) ? ~0 : 0;
838 op->d1r = (v & 0x1f) ? 32 + ((v & 0x1f) << 1) : 0;
839 op->eg_sh_d1r =
eg_rate_shift [op->d1r + (op->kc >> op->ks)];
844 unsigned olddt2 = op->dt2;
846 if (op->dt2 != olddt2) {
847 op->freq = ((freq[op->kc_i + op->dt2] + op->dt1) * op->mul) >> 1;
849 op->d2r = (v & 0x1f) ? 32 + ((v & 0x1f) << 1) : 0;
850 op->eg_sh_d2r =
eg_rate_shift [op->d2r + (op->kc >> op->ks)];
855 op->d1l = d1l_tab[v >> 4];
856 op->rr = 34 + ((v & 0x0f) << 2);
868 , irq(config.getMotherBoard(),
getName() +
".IRQ")
869 , timer1(
EmuTimer::createOPM_1(config.getScheduler(), *this))
870 , timer2(
EmuTimer::createOPM_2(config.getScheduler(), *this))
875 memset(regs, 0,
sizeof(regs));
880 std::cout <<
"tl_tab:";
881 for (
const auto& e : tl_tab) std::cout <<
' ' << e;
884 std::cout <<
"sin_tab:";
885 for (
const auto& e : sin_tab) std::cout <<
' ' << e;
888 std::cout <<
"d1l_tab:";
889 for (
const auto& e : d1l_tab) std::cout <<
' ' << e;
892 std::cout <<
"freq:";
893 for (
const auto& e : freq) std::cout <<
' ' << e;
896 std::cout <<
"dt1_freq:";
897 for (
const auto& e : dt1_freq) std::cout <<
' ' << e;
900 std::cout <<
"noise_tab:";
901 for (
const auto& e : noise_tab) std::cout <<
' ' << e;
915 bool YM2151::checkMuteHelper()
923 for (
auto& op : oper) {
924 memset(&op,
'\0',
sizeof(op));
944 timer1->setStart(
false, time);
945 timer2->setStart(
false, time);
950 noise_f = noise_tab[0];
957 for (
auto i :
xrange(0x20, 0x100)) {
964 int YM2151::opCalc(YM2151Operator* OP,
unsigned env,
int pm)
973 int YM2151::opCalc1(YM2151Operator* OP,
unsigned env,
int pm)
983 unsigned YM2151::volumeCalc(YM2151Operator* OP,
unsigned AM)
985 return OP->tl + unsigned(OP->volume) + (AM & OP->AMmask);
988 void YM2151::chanCalc(
unsigned chan)
990 m2 = c1 = c2 = mem = 0;
991 YM2151Operator* op = &oper[chan*4];
992 *op->mem_connect = op->mem_value;
996 AM = lfa << (op->ams-1);
998 unsigned env = volumeCalc(op, AM);
1000 int out = op->fb_out_prev + op->fb_out_curr;
1001 op->fb_out_prev = op->fb_out_curr;
1005 mem = c1 = c2 = op->fb_out_prev;
1007 *op->connect = op->fb_out_prev;
1009 op->fb_out_curr = 0;
1011 if (!op->fb_shift) {
1014 op->fb_out_curr = opCalc1(op, env, (out << op->fb_shift));
1018 env = volumeCalc(op + 1, AM);
1020 *(op + 1)->connect += opCalc(op + 1, env, m2);
1022 env = volumeCalc(op + 2, AM);
1024 *(op + 2)->connect += opCalc(op + 2, env, c1);
1026 env = volumeCalc(op + 3, AM);
1028 chanout[chan] += opCalc(op + 3, env, c2);
1031 op->mem_value = mem;
1034 void YM2151::chan7Calc()
1036 m2 = c1 = c2 = mem = 0;
1037 YM2151Operator* op = &oper[7 * 4];
1039 *op->mem_connect = op->mem_value;
1043 AM = lfa << (op->ams - 1);
1045 unsigned env = volumeCalc(op, AM);
1047 int out = op->fb_out_prev + op->fb_out_curr;
1048 op->fb_out_prev = op->fb_out_curr;
1052 mem = c1 = c2 = op->fb_out_prev;
1055 *op->connect = op->fb_out_prev;
1057 op->fb_out_curr = 0;
1059 if (!op->fb_shift) {
1062 op->fb_out_curr = opCalc1(op, env, (out << op->fb_shift));
1066 env = volumeCalc(op + 1, AM);
1068 *(op + 1)->connect += opCalc(op + 1, env, m2);
1070 env = volumeCalc(op + 2, AM);
1072 *(op + 2)->connect += opCalc(op + 2, env, c1);
1074 env = volumeCalc(op + 3, AM);
1076 unsigned noiseout = 0;
1078 noiseout = (env ^ 0x3ff) * 2;
1080 chanout[7] += (noise_rng & 0x10000) ? noiseout :
unsigned(-
int(noiseout));
1083 chanout[7] += opCalc(op + 3, env, c2);
1087 op->mem_value = mem;
1294 void YM2151::advanceEG()
1296 if (eg_timer++ != 3) {
1304 for (
auto& op : oper) {
1307 if (!(eg_cnt & ((1 << op.eg_sh_ar) - 1))) {
1308 op.volume += (~op.volume *
1309 (
eg_inc[op.eg_sel_ar + ((eg_cnt >> op.eg_sh_ar) & 7)])
1319 if (!(eg_cnt & ((1 << op.eg_sh_d1r) - 1))) {
1320 op.volume +=
eg_inc[op.eg_sel_d1r + ((eg_cnt >> op.eg_sh_d1r) & 7)];
1321 if (
unsigned(op.volume) >= op.d1l) {
1328 if (!(eg_cnt & ((1 << op.eg_sh_d2r) - 1))) {
1329 op.volume +=
eg_inc[op.eg_sel_d2r + ((eg_cnt >> op.eg_sh_d2r) & 7)];
1338 if (!(eg_cnt & ((1 << op.eg_sh_rr) - 1))) {
1339 op.volume +=
eg_inc[op.eg_sel_rr + ((eg_cnt >> op.eg_sh_rr) & 7)];
1350 void YM2151::advance()
1356 if (lfo_timer++ >= lfo_overflow) {
1358 lfo_counter += lfo_counter_add;
1359 lfo_phase += (lfo_counter >> 4);
1365 unsigned i = lfo_phase;
1368 auto [a, p] = [&]() -> std::pair<int, int> {
1376 ((i < 128) ? i : (i - 255))
1383 ((i < 128) ? 255 : 0),
1384 ((i < 128) ? 128 : -128)
1392 ((i < 128) ? (255 - (i * 2)) : ((i * 2) - 256)),
1396 }
else if (i < 128) {
1398 }
else if (i < 192) {
1419 lfa = a * amd / 128;
1420 lfp = p * pmd / 128;
1434 unsigned j = ((noise_rng ^ (noise_rng >> 3)) & 1) ^ 1;
1435 noise_rng = (j << 16) | (noise_rng >> 1);
1439 YM2151Operator* op = &oper[0];
1446 mod_ind >>= (6 - op->pms);
1448 mod_ind <<= (op->pms - 5);
1451 unsigned kc_channel = op->kc_i + mod_ind;
1452 (op + 0)->phase += ((freq[kc_channel + (op + 0)->dt2] + (op + 0)->dt1) * (op + 0)->mul) >> 1;
1453 (op + 1)->phase += ((freq[kc_channel + (op + 1)->dt2] + (op + 1)->dt1) * (op + 1)->mul) >> 1;
1454 (op + 2)->phase += ((freq[kc_channel + (op + 2)->dt2] + (op + 2)->dt1) * (op + 2)->mul) >> 1;
1455 (op + 3)->phase += ((freq[kc_channel + (op + 3)->dt2] + (op + 3)->dt1) * (op + 3)->mul) >> 1;
1457 (op + 0)->phase += (op + 0)->freq;
1458 (op + 1)->phase += (op + 1)->freq;
1459 (op + 2)->phase += (op + 2)->freq;
1460 (op + 3)->phase += (op + 3)->freq;
1463 (op + 0)->phase += (op + 0)->freq;
1464 (op + 1)->phase += (op + 1)->freq;
1465 (op + 2)->phase += (op + 2)->freq;
1466 (op + 3)->phase += (op + 3)->freq;
1494 keyOff(op,
unsigned(~2));
1503 void YM2151::generateChannels(
float** bufs,
unsigned num)
1505 if (checkMuteHelper()) {
1507 std::fill_n(bufs, 8,
nullptr);
1511 for (
auto i :
xrange(num)) {
1514 for (
auto j :
xrange(8 - 1)) {
1521 for (
auto j :
xrange(8)) {
1522 bufs[j][2 * i + 0] += int(chanout[j] & pan[2 * j + 0]);
1523 bufs[j][2 * i + 1] += int(chanout[j] & pan[2 * j + 1]);
1529 void YM2151::callback(
byte flag)
1532 if (irq_enable & 0x04) {
1535 if (irq_enable & 0x80) {
1540 if (irq_enable & 0x08) {
1551 void YM2151::setStatus(
byte flags)
1559 void YM2151::resetStatus(
byte flags)
1568 template<
typename Archive>
1573 a.serialize(
"phase", phase,
1579 "mem_value", mem_value,
1581 "fb_out_curr", fb_out_curr,
1582 "fb_out_prev", fb_out_prev,
1598 "eg_sh_ar", eg_sh_ar,
1599 "eg_sel_ar", eg_sel_ar,
1600 "eg_sh_d1r", eg_sh_d1r,
1601 "eg_sel_d1r", eg_sel_d1r,
1602 "eg_sh_d2r", eg_sh_d2r,
1603 "eg_sel_d2r", eg_sel_d2r,
1604 "eg_sh_rr", eg_sh_rr,
1605 "eg_sel_rr", eg_sel_rr);
1608 template<
typename Archive>
1611 a.serialize(
"irq", irq,
1617 "eg_timer", eg_timer,
1618 "lfo_phase", lfo_phase,
1619 "lfo_timer", lfo_timer,
1620 "lfo_overflow", lfo_overflow,
1621 "lfo_counter", lfo_counter,
1622 "lfo_counter_add", lfo_counter_add,
1626 "noise_rng", noise_rng,
1630 "irq_enable", irq_enable,
1637 "timer_A_val", timer_A_val,
1638 "lfo_wsel", lfo_wsel,
1643 a.serialize_blob(
"registers", regs,
sizeof(regs));
1647 EmuTime::param time = timer1->getCurrentTime();
1648 for (
auto r :
xrange(0x20, 0x28)) {