@modplayjs/fmt-sid 0.0.0-stage → 0.2.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (98) hide show
  1. package/README.md +111 -2
  2. package/dist/c64.d.ts +8 -0
  3. package/dist/c64.d.ts.map +1 -0
  4. package/dist/c64.js +325 -0
  5. package/dist/c64.js.map +1 -0
  6. package/dist/c64types.d.ts +209 -0
  7. package/dist/c64types.d.ts.map +1 -0
  8. package/dist/c64types.js +181 -0
  9. package/dist/c64types.js.map +1 -0
  10. package/dist/cia.d.ts +19 -0
  11. package/dist/cia.d.ts.map +1 -0
  12. package/dist/cia.js +160 -0
  13. package/dist/cia.js.map +1 -0
  14. package/dist/combiwaves.d.ts +9 -0
  15. package/dist/combiwaves.d.ts.map +1 -0
  16. package/dist/combiwaves.js +533 -0
  17. package/dist/combiwaves.js.map +1 -0
  18. package/dist/config.d.ts +15 -0
  19. package/dist/config.d.ts.map +1 -0
  20. package/dist/config.js +23 -0
  21. package/dist/config.js.map +1 -0
  22. package/dist/cpu.d.ts +12 -0
  23. package/dist/cpu.d.ts.map +1 -0
  24. package/dist/cpu.js +848 -0
  25. package/dist/cpu.js.map +1 -0
  26. package/dist/filtercurves.d.ts +13 -0
  27. package/dist/filtercurves.d.ts.map +1 -0
  28. package/dist/filtercurves.js +546 -0
  29. package/dist/filtercurves.js.map +1 -0
  30. package/dist/host.d.ts +4 -0
  31. package/dist/host.d.ts.map +1 -0
  32. package/dist/host.js +14 -0
  33. package/dist/host.js.map +1 -0
  34. package/dist/index.d.ts +7 -0
  35. package/dist/index.d.ts.map +1 -0
  36. package/dist/index.js +36 -0
  37. package/dist/index.js.map +1 -0
  38. package/dist/instance.d.ts +119 -0
  39. package/dist/instance.d.ts.map +1 -0
  40. package/dist/instance.js +51 -0
  41. package/dist/instance.js.map +1 -0
  42. package/dist/loader.d.ts +26 -0
  43. package/dist/loader.d.ts.map +1 -0
  44. package/dist/loader.js +383 -0
  45. package/dist/loader.js.map +1 -0
  46. package/dist/mem.d.ts +30 -0
  47. package/dist/mem.d.ts.map +1 -0
  48. package/dist/mem.js +187 -0
  49. package/dist/mem.js.map +1 -0
  50. package/dist/psiddigi.d.ts +3 -0
  51. package/dist/psiddigi.d.ts.map +1 -0
  52. package/dist/psiddigi.js +73 -0
  53. package/dist/psiddigi.js.map +1 -0
  54. package/dist/settings.d.ts +41 -0
  55. package/dist/settings.d.ts.map +1 -0
  56. package/dist/settings.js +64 -0
  57. package/dist/settings.js.map +1 -0
  58. package/dist/sid.d.ts +21 -0
  59. package/dist/sid.d.ts.map +1 -0
  60. package/dist/sid.js +78 -0
  61. package/dist/sid.js.map +1 -0
  62. package/dist/sidadsr.d.ts +9 -0
  63. package/dist/sidadsr.d.ts.map +1 -0
  64. package/dist/sidadsr.js +105 -0
  65. package/dist/sidadsr.js.map +1 -0
  66. package/dist/sidoscwaves.d.ts +15 -0
  67. package/dist/sidoscwaves.d.ts.map +1 -0
  68. package/dist/sidoscwaves.js +475 -0
  69. package/dist/sidoscwaves.js.map +1 -0
  70. package/dist/sidoutputs.d.ts +17 -0
  71. package/dist/sidoutputs.d.ts.map +1 -0
  72. package/dist/sidoutputs.js +185 -0
  73. package/dist/sidoutputs.js.map +1 -0
  74. package/dist/sidplugin.d.ts +18 -0
  75. package/dist/sidplugin.d.ts.map +1 -0
  76. package/dist/sidplugin.js +174 -0
  77. package/dist/sidplugin.js.map +1 -0
  78. package/dist/sidrouting.d.ts +8 -0
  79. package/dist/sidrouting.d.ts.map +1 -0
  80. package/dist/sidrouting.js +560 -0
  81. package/dist/sidrouting.js.map +1 -0
  82. package/dist/sidseek.d.ts +8 -0
  83. package/dist/sidseek.d.ts.map +1 -0
  84. package/dist/sidseek.js +60 -0
  85. package/dist/sidseek.js.map +1 -0
  86. package/dist/sincwindow.d.ts +3 -0
  87. package/dist/sincwindow.d.ts.map +1 -0
  88. package/dist/sincwindow.js +78 -0
  89. package/dist/sincwindow.js.map +1 -0
  90. package/dist/songlengths.d.ts +20 -0
  91. package/dist/songlengths.d.ts.map +1 -0
  92. package/dist/songlengths.js +81 -0
  93. package/dist/songlengths.js.map +1 -0
  94. package/dist/vic.d.ts +14 -0
  95. package/dist/vic.d.ts.map +1 -0
  96. package/dist/vic.js +63 -0
  97. package/dist/vic.js.map +1 -0
  98. package/package.json +48 -4
@@ -0,0 +1,60 @@
1
+ // SPDX-License-Identifier: BSD-3-Clause
2
+ // Copyright (c) 2026 Bitti09 — modplayjs contributors
3
+ // SID engine seek + engine-time reporting.
4
+ //
5
+ // cRSID has no native seek — the tune is a running machine emulation.
6
+ // Seeking = fast-forwarding the engine: render the skipped samples in
7
+ // large chunks into a discard buffer, at whatever speed the CPU manages
8
+ // (typically far faster than realtime). Backwards seeks restart the tune
9
+ // (cRSID_initSIDtune) and then fast-forward — the same approach every
10
+ // machine-based player takes.
11
+ //
12
+ // The engine's clock is cRSID.PlayTime (seconds, advanced by
13
+ // cRSID_emulateC64 per generated second of audio).
14
+ import { cRSID } from './instance.js';
15
+ import { cRSID_initSIDtune, cRSID_generateSample, cRSID_playSIDtune } from './loader.js';
16
+ /** Last-loaded tune bytes — needed to restart for backwards seeks. */
17
+ let sidTuneBytes = null;
18
+ let sidTuneHeader = null;
19
+ let sidTuneSubtune = 1;
20
+ let sidTuneRate = 44100;
21
+ /** Remember the loaded tune for backwards-seek restarts (sidStartTune
22
+ * calls this through sidplugin). */
23
+ export function sidRememberTune(bytes, header, subtune, rate) {
24
+ sidTuneBytes = bytes;
25
+ sidTuneHeader = header;
26
+ sidTuneSubtune = subtune;
27
+ sidTuneRate = rate;
28
+ }
29
+ /** Engine playback time in seconds (cRSID.PlayTime). */
30
+ export function getSidPlayTimeSeconds() {
31
+ return cRSID.PlayTime;
32
+ }
33
+ /** Seek the engine to the given runtime in seconds. */
34
+ export function sidSeek(seconds) {
35
+ if (!sidTuneBytes || !sidTuneHeader)
36
+ return;
37
+ const target = Math.max(0, seconds);
38
+ const now = cRSID.PlayTime;
39
+ if (target < now) {
40
+ // backwards: restart the tune, then fast-forward from 0
41
+ cRSID_initSIDtune(sidTuneHeader, sidTuneSubtune);
42
+ cRSID_playSIDtune();
43
+ }
44
+ // fast-forward the engine to the target in 1-second chunks
45
+ const remainSec = target - cRSID.PlayTime;
46
+ const frames = Math.max(0, Math.round(remainSec * sidTuneRate));
47
+ const CHUNK = 65536; // frames per chunk — discard buffer reused
48
+ const sink = new Int16Array(CHUNK * 2);
49
+ let left = frames;
50
+ while (left > 0) {
51
+ const take = Math.min(left, CHUNK);
52
+ for (let i = 0; i < take; ++i) {
53
+ const s = cRSID_generateSample();
54
+ sink[i * 2] = s.L > 32767 ? 32767 : s.L < -32768 ? -32768 : s.L;
55
+ sink[i * 2 + 1] = s.R > 32767 ? 32767 : s.R < -32768 ? -32768 : s.R;
56
+ }
57
+ left -= take;
58
+ }
59
+ }
60
+ //# sourceMappingURL=sidseek.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sidseek.js","sourceRoot":"","sources":["../src/sidseek.ts"],"names":[],"mappings":"AAAA,wCAAwC;AACxC,sDAAsD;AACtD,2CAA2C;AAC3C,EAAE;AACF,sEAAsE;AACtE,sEAAsE;AACtE,wEAAwE;AACxE,yEAAyE;AACzE,sEAAsE;AACtE,8BAA8B;AAC9B,EAAE;AACF,6DAA6D;AAC7D,mDAAmD;AAEnD,OAAO,EAAE,KAAK,EAAE,MAAM,eAAe,CAAC;AACtC,OAAO,EAAE,iBAAiB,EAAE,oBAAoB,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAC;AAEzF,sEAAsE;AACtE,IAAI,YAAY,GAAsB,IAAI,CAAC;AAC3C,IAAI,aAAa,GAA+C,IAAI,CAAC;AACrE,IAAI,cAAc,GAAG,CAAC,CAAC;AACvB,IAAI,WAAW,GAAG,KAAK,CAAC;AAExB;qCACqC;AACrC,MAAM,UAAU,eAAe,CAAC,KAAiB,EAAE,MAA2C,EAAE,OAAe,EAAE,IAAY;IAC3H,YAAY,GAAG,KAAK,CAAC;IACrB,aAAa,GAAG,MAAM,CAAC;IACvB,cAAc,GAAG,OAAO,CAAC;IACzB,WAAW,GAAG,IAAI,CAAC;AACrB,CAAC;AAED,wDAAwD;AACxD,MAAM,UAAU,qBAAqB;IACnC,OAAO,KAAK,CAAC,QAAQ,CAAC;AACxB,CAAC;AAED,uDAAuD;AACvD,MAAM,UAAU,OAAO,CAAC,OAAe;IACrC,IAAI,CAAC,YAAY,IAAI,CAAC,aAAa;QAAE,OAAO;IAC5C,MAAM,MAAM,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC;IACpC,MAAM,GAAG,GAAG,KAAK,CAAC,QAAQ,CAAC;IAC3B,IAAI,MAAM,GAAG,GAAG,EAAE,CAAC;QACjB,wDAAwD;QACxD,iBAAiB,CAAC,aAAa,EAAE,cAAc,CAAC,CAAC;QACjD,iBAAiB,EAAE,CAAC;IACtB,CAAC;IACD,2DAA2D;IAC3D,MAAM,SAAS,GAAG,MAAM,GAAG,KAAK,CAAC,QAAQ,CAAC;IAC1C,MAAM,MAAM,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,KAAK,CAAC,SAAS,GAAG,WAAW,CAAC,CAAC,CAAC;IAChE,MAAM,KAAK,GAAG,KAAK,CAAC,CAAC,2CAA2C;IAChE,MAAM,IAAI,GAAG,IAAI,UAAU,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC;IACvC,IAAI,IAAI,GAAG,MAAM,CAAC;IAClB,OAAO,IAAI,GAAG,CAAC,EAAE,CAAC;QAChB,MAAM,IAAI,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;QACnC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,EAAE,EAAE,CAAC,EAAE,CAAC;YAC9B,MAAM,CAAC,GAAG,oBAAoB,EAAE,CAAC;YACjC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;YAChE,IAAI,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QACtE,CAAC;QACD,IAAI,IAAI,IAAI,CAAC;IACf,CAAC;AACH,CAAC"}
@@ -0,0 +1,3 @@
1
+ /** SincWindow (C: static const signed short, 1536 entries). */
2
+ export declare const SincWindow: Int16Array<ArrayBuffer>;
3
+ //# sourceMappingURL=sincwindow.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sincwindow.d.ts","sourceRoot":"","sources":["../src/sincwindow.ts"],"names":[],"mappings":"AAWA,+DAA+D;AAC/D,eAAO,MAAM,UAAU,yBAiErB,CAAC"}
@@ -0,0 +1,78 @@
1
+ // SPDX-License-Identifier: BSD-3-Clause
2
+ // Copyright (c) 2026 Bitti09 — modplayjs contributors
3
+ // Ported from: cRSID 1.58 libcRSID/C64/SincWindow.h
4
+ // (c) Hermit (Mihaly Horvath), license: WTF ("do what the frick you want").
5
+ //
6
+ // Pre-calculated FIR nyquist-filter Sinc Hanning window for the high-quality
7
+ // resampler (PartCount:6, PartLengths:256 -> 1536 entries, Magnitude:2048).
8
+ // NOTE: the C array literally contains a 1537th value (a trailing "2048,")
9
+ // which is never read (every loop is bounded by SINCWINDOW_SIZE = 1536);
10
+ // it is dropped here.
11
+ /** SincWindow (C: static const signed short, 1536 entries). */
12
+ export const SincWindow = new Int16Array([
13
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
14
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
15
+ 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3, 3, 4, 4, 4,
16
+ 4, 4, 4, 4, 5, 5, 5, 5, 5, 6, 6, 6, 6, 6, 7, 7, 7, 7, 7, 8, 8, 8, 8, 8,
17
+ 9, 9, 9, 9, 10, 10, 10, 10, 11, 11, 11, 12, 12, 12, 12, 13, 13, 13, 13, 14, 14, 14, 15, 15,
18
+ 15, 15, 16, 16, 16, 17, 17, 17, 17, 18, 18, 18, 19, 19, 19, 20, 20, 20, 20, 21, 21, 21, 22, 22,
19
+ 22, 22, 23, 23, 23, 23, 24, 24, 24, 25, 25, 25, 25, 26, 26, 26, 26, 26, 27, 27, 27, 27, 27, 28,
20
+ 28, 28, 28, 28, 29, 29, 29, 29, 29, 29, 29, 29, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30,
21
+ 30, 30, 30, 30, 30, 30, 30, 30, 29, 29, 29, 29, 29, 29, 29, 28, 28, 28, 28, 28, 27, 27, 27, 26,
22
+ 26, 26, 25, 25, 25, 24, 24, 23, 23, 23, 22, 22, 21, 21, 20, 19, 19, 18, 18, 17, 16, 16, 15, 14,
23
+ 14, 13, 12, 11, 11, 10, 9, 8, 7, 7, 6, 5, 4, 3, 2, 1, 0, -1, -2, -3, -4, -5, -6, -7,
24
+ -9, -10, -11, -12, -13, -15, -16, -17, -18, -20, -21, -22, -24, -25, -26, -28, -29, -31, -32, -33, -35, -36, -38, -40,
25
+ -41, -43, -44, -46, -47, -49, -51, -52, -54, -56, -57, -59, -61, -63, -64, -66, -68, -70, -71, -73, -75, -77, -79, -81,
26
+ -82, -84, -86, -88, -90, -92, -94, -96, -98, -100, -102, -103, -105, -107, -109, -111, -113, -115, -117, -119, -121, -123, -125, -127,
27
+ -129, -131, -133, -135, -137, -139, -141, -143, -145, -147, -149, -151, -153, -155, -157, -159, -161, -163, -165, -167, -169, -171, -173, -175,
28
+ -177, -178, -180, -182, -184, -186, -188, -189, -191, -193, -195, -196, -198, -200, -202, -203, -205, -207, -208, -210, -211, -213, -214, -216,
29
+ -217, -219, -220, -222, -223, -224, -226, -227, -228, -229, -230, -232, -233, -234, -235, -236, -237, -238, -239, -240, -241, -241, -242, -243,
30
+ -244, -244, -245, -245, -246, -246, -247, -247, -248, -248, -248, -248, -249, -249, -249, -249, -249, -249, -249, -248, -248, -248, -248, -247,
31
+ -247, -246, -246, -245, -244, -244, -243, -242, -241, -240, -239, -238, -237, -236, -235, -233, -232, -231, -229, -228, -226, -224, -223, -221,
32
+ -219, -217, -215, -213, -211, -209, -206, -204, -202, -199, -196, -194, -191, -188, -186, -183, -180, -177, -174, -170, -167, -164, -160, -157,
33
+ -153, -150, -146, -142, -138, -134, -130, -126, -122, -118, -114, -109, -105, -100, -96, -91, -86, -81, -77, -72, -67, -61, -56, -51,
34
+ -46, -40, -35, -29, -23, -18, -12, -6, 0, 6, 12, 18, 25, 31, 37, 44, 50, 57, 64, 71, 77, 84, 91, 98,
35
+ 106, 113, 120, 127, 135, 142, 150, 158, 165, 173, 181, 189, 197, 205, 213, 221, 229, 238, 246, 254, 263, 272, 280, 289,
36
+ 298, 306, 315, 324, 333, 342, 351, 361, 370, 379, 388, 398, 407, 417, 426, 436, 446, 455, 465, 475, 485, 495, 505, 515,
37
+ 525, 535, 545, 555, 565, 575, 586, 596, 606, 617, 627, 638, 648, 659, 669, 680, 691, 701, 712, 723, 733, 744, 755, 766,
38
+ 777, 788, 798, 809, 820, 831, 842, 853, 864, 875, 886, 897, 908, 919, 930, 941, 952, 963, 974, 986, 997, 1008, 1019, 1030,
39
+ 1041, 1052, 1063, 1074, 1085, 1096, 1107, 1118, 1129, 1140, 1151, 1162, 1173, 1184, 1195, 1206, 1216, 1227, 1238, 1249, 1260, 1270, 1281, 1292,
40
+ 1302, 1313, 1323, 1334, 1344, 1355, 1365, 1376, 1386, 1396, 1407, 1417, 1427, 1437, 1447, 1457, 1467, 1477, 1487, 1497, 1506, 1516, 1526, 1535,
41
+ 1545, 1554, 1564, 1573, 1582, 1592, 1601, 1610, 1619, 1628, 1637, 1646, 1654, 1663, 1672, 1680, 1688, 1697, 1705, 1713, 1721, 1730, 1737, 1745,
42
+ 1753, 1761, 1768, 1776, 1783, 1791, 1798, 1805, 1812, 1819, 1826, 1833, 1840, 1847, 1853, 1860, 1866, 1872, 1878, 1884, 1890, 1896, 1902, 1908,
43
+ 1913, 1918, 1924, 1929, 1934, 1939, 1944, 1949, 1954, 1958, 1963, 1967, 1971, 1975, 1979, 1983, 1987, 1991, 1995, 1998, 2001, 2005, 2008, 2011,
44
+ 2014, 2016, 2019, 2022, 2024, 2026, 2029, 2031, 2033, 2035, 2036, 2038, 2039, 2041, 2042, 2043, 2044, 2045, 2046, 2047, 2047, 2047, 2048, 2048,
45
+ 2048, 2048, 2048, 2047, 2047, 2047, 2046, 2045, 2044, 2043, 2042, 2041, 2039, 2038, 2036, 2035, 2033, 2031, 2029, 2026, 2024, 2022, 2019, 2016,
46
+ 2014, 2011, 2008, 2005, 2001, 1998, 1995, 1991, 1987, 1983, 1979, 1975, 1971, 1967, 1963, 1958, 1954, 1949, 1944, 1939, 1934, 1929, 1924, 1918,
47
+ 1913, 1908, 1902, 1896, 1890, 1884, 1878, 1872, 1866, 1860, 1853, 1847, 1840, 1833, 1826, 1819, 1812, 1805, 1798, 1791, 1783, 1776, 1768, 1761,
48
+ 1753, 1745, 1737, 1730, 1721, 1713, 1705, 1697, 1688, 1680, 1672, 1663, 1654, 1646, 1637, 1628, 1619, 1610, 1601, 1592, 1582, 1573, 1564, 1554,
49
+ 1545, 1535, 1526, 1516, 1506, 1497, 1487, 1477, 1467, 1457, 1447, 1437, 1427, 1417, 1407, 1396, 1386, 1376, 1365, 1355, 1344, 1334, 1323, 1313,
50
+ 1302, 1292, 1281, 1270, 1260, 1249, 1238, 1227, 1216, 1206, 1195, 1184, 1173, 1162, 1151, 1140, 1129, 1118, 1107, 1096, 1085, 1074, 1063, 1052,
51
+ 1041, 1030, 1019, 1008, 997, 986, 974, 963, 952, 941, 930, 919, 908, 897, 886, 875, 864, 853, 842, 831, 820, 809, 798, 788,
52
+ 777, 766, 755, 744, 733, 723, 712, 701, 691, 680, 669, 659, 648, 638, 627, 617, 606, 596, 586, 575, 565, 555, 545, 535,
53
+ 525, 515, 505, 495, 485, 475, 465, 455, 446, 436, 426, 417, 407, 398, 388, 379, 370, 361, 351, 342, 333, 324, 315, 306,
54
+ 298, 289, 280, 272, 263, 254, 246, 238, 229, 221, 213, 205, 197, 189, 181, 173, 165, 158, 150, 142, 135, 127, 120, 113,
55
+ 106, 98, 91, 84, 77, 71, 64, 57, 50, 44, 37, 31, 25, 18, 12, 6, 0, -6, -12, -18, -23, -29, -35, -40,
56
+ -46, -51, -56, -61, -67, -72, -77, -81, -86, -91, -96, -100, -105, -109, -114, -118, -122, -126, -130, -134, -138, -142, -146, -150,
57
+ -153, -157, -160, -164, -167, -170, -174, -177, -180, -183, -186, -188, -191, -194, -196, -199, -202, -204, -206, -209, -211, -213, -215, -217,
58
+ -219, -221, -223, -224, -226, -228, -229, -231, -232, -233, -235, -236, -237, -238, -239, -240, -241, -242, -243, -244, -244, -245, -246, -246,
59
+ -247, -247, -248, -248, -248, -248, -249, -249, -249, -249, -249, -249, -249, -248, -248, -248, -248, -247, -247, -246, -246, -245, -245, -244,
60
+ -244, -243, -242, -241, -241, -240, -239, -238, -237, -236, -235, -234, -233, -232, -230, -229, -228, -227, -226, -224, -223, -222, -220, -219,
61
+ -217, -216, -214, -213, -211, -210, -208, -207, -205, -203, -202, -200, -198, -196, -195, -193, -191, -189, -188, -186, -184, -182, -180, -178,
62
+ -177, -175, -173, -171, -169, -167, -165, -163, -161, -159, -157, -155, -153, -151, -149, -147, -145, -143, -141, -139, -137, -135, -133, -131,
63
+ -129, -127, -125, -123, -121, -119, -117, -115, -113, -111, -109, -107, -105, -103, -102, -100, -98, -96, -94, -92, -90, -88, -86, -84,
64
+ -82, -81, -79, -77, -75, -73, -71, -70, -68, -66, -64, -63, -61, -59, -57, -56, -54, -52, -51, -49, -47, -46, -44, -43,
65
+ -41, -40, -38, -36, -35, -33, -32, -31, -29, -28, -26, -25, -24, -22, -21, -20, -18, -17, -16, -15, -13, -12, -11, -10,
66
+ -9, -7, -6, -5, -4, -3, -2, -1, 0, 1, 2, 3, 4, 5, 6, 7, 7, 8, 9, 10, 11, 11, 12, 13,
67
+ 14, 14, 15, 16, 16, 17, 18, 18, 19, 19, 20, 21, 21, 22, 22, 23, 23, 23, 24, 24, 25, 25, 25, 26,
68
+ 26, 26, 27, 27, 27, 28, 28, 28, 28, 28, 29, 29, 29, 29, 29, 29, 29, 30, 30, 30, 30, 30, 30, 30,
69
+ 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 29, 29, 29, 29, 29, 29, 29, 29, 28, 28, 28,
70
+ 28, 28, 27, 27, 27, 27, 27, 26, 26, 26, 26, 26, 25, 25, 25, 25, 24, 24, 24, 23, 23, 23, 23, 22,
71
+ 22, 22, 22, 21, 21, 21, 20, 20, 20, 20, 19, 19, 19, 18, 18, 18, 17, 17, 17, 17, 16, 16, 16, 15,
72
+ 15, 15, 15, 14, 14, 14, 13, 13, 13, 13, 12, 12, 12, 12, 11, 11, 11, 10, 10, 10, 10, 9, 9, 9,
73
+ 9, 8, 8, 8, 8, 8, 7, 7, 7, 7, 7, 6, 6, 6, 6, 6, 5, 5, 5, 5, 5, 4, 4, 4,
74
+ 4, 4, 4, 4, 3, 3, 3, 3, 3, 3, 3, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 1, 1, 1,
75
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
76
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
77
+ ]);
78
+ //# sourceMappingURL=sincwindow.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sincwindow.js","sourceRoot":"","sources":["../src/sincwindow.ts"],"names":[],"mappings":"AAAA,wCAAwC;AACxC,sDAAsD;AACtD,oDAAoD;AACpD,4EAA4E;AAC5E,EAAE;AACF,6EAA6E;AAC7E,4EAA4E;AAC5E,2EAA2E;AAC3E,yEAAyE;AACzE,sBAAsB;AAEtB,+DAA+D;AAC/D,MAAM,CAAC,MAAM,UAAU,GAAG,IAAI,UAAU,CAAC;IACvC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC;IAC/C,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC;IAC/C,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC;IAC/C,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC;IAC/C,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,EAAE,EAAC,EAAE,EAAC,EAAE,EAAC,EAAE,EAAC,EAAE,EAAC,EAAE,EAAC,EAAE,EAAC,EAAE,EAAC,EAAE,EAAC,EAAE,EAAC,EAAE,EAAC,EAAE,EAAC,EAAE,EAAC,EAAE,EAAC,EAAE,EAAC,EAAE,EAAC,EAAE,EAAC,EAAE,EAAC,EAAE,EAAC,EAAE;IACnE,EAAE,EAAC,EAAE,EAAC,EAAE,EAAC,EAAE,EAAC,EAAE,EAAC,EAAE,EAAC,EAAE,EAAC,EAAE,EAAC,EAAE,EAAC,EAAE,EAAC,EAAE,EAAC,EAAE,EAAC,EAAE,EAAC,EAAE,EAAC,EAAE,EAAC,EAAE,EAAC,EAAE,EAAC,EAAE,EAAC,EAAE,EAAC,EAAE,EAAC,EAAE,EAAC,EAAE,EAAC,EAAE,EAAC,EAAE;IACvE,EAAE,EAAC,EAAE,EAAC,EAAE,EAAC,EAAE,EAAC,EAAE,EAAC,EAAE,EAAC,EAAE,EAAC,EAAE,EAAC,EAAE,EAAC,EAAE,EAAC,EAAE,EAAC,EAAE,EAAC,EAAE,EAAC,EAAE,EAAC,EAAE,EAAC,EAAE,EAAC,EAAE,EAAC,EAAE,EAAC,EAAE,EAAC,EAAE,EAAC,EAAE,EAAC,EAAE,EAAC,EAAE,EAAC,EAAE;IACvE,EAAE,EAAC,EAAE,EAAC,EAAE,EAAC,EAAE,EAAC,EAAE,EAAC,EAAE,EAAC,EAAE,EAAC,EAAE,EAAC,EAAE,EAAC,EAAE,EAAC,EAAE,EAAC,EAAE,EAAC,EAAE,EAAC,EAAE,EAAC,EAAE,EAAC,EAAE,EAAC,EAAE,EAAC,EAAE,EAAC,EAAE,EAAC,EAAE,EAAC,EAAE,EAAC,EAAE,EAAC,EAAE,EAAC,EAAE;IACvE,EAAE,EAAC,EAAE,EAAC,EAAE,EAAC,EAAE,EAAC,EAAE,EAAC,EAAE,EAAC,EAAE,EAAC,EAAE,EAAC,EAAE,EAAC,EAAE,EAAC,EAAE,EAAC,EAAE,EAAC,EAAE,EAAC,EAAE,EAAC,EAAE,EAAC,EAAE,EAAC,EAAE,EAAC,EAAE,EAAC,EAAE,EAAC,EAAE,EAAC,EAAE,EAAC,EAAE,EAAC,EAAE,EAAC,EAAE;IACvE,EAAE,EAAC,EAAE,EAAC,EAAE,EAAC,EAAE,EAAC,EAAE,EAAC,EAAE,EAAC,EAAE,EAAC,EAAE,EAAC,EAAE,EAAC,EAAE,EAAC,EAAE,EAAC,EAAE,EAAC,EAAE,EAAC,EAAE,EAAC,EAAE,EAAC,EAAE,EAAC,EAAE,EAAC,EAAE,EAAC,EAAE,EAAC,EAAE,EAAC,EAAE,EAAC,EAAE,EAAC,EAAE,EAAC,EAAE;IACvE,EAAE,EAAC,EAAE,EAAC,EAAE,EAAC,EAAE,EAAC,EAAE,EAAC,EAAE,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,CAAC,EAAC,CAAC,CAAC,EAAC,CAAC,CAAC,EAAC,CAAC,CAAC,EAAC,CAAC,CAAC,EAAC,CAAC,CAAC,EAAC,CAAC,CAAC;IAC5D,CAAC,CAAC,EAAC,CAAC,EAAE,EAAC,CAAC,EAAE,EAAC,CAAC,EAAE,EAAC,CAAC,EAAE,EAAC,CAAC,EAAE,EAAC,CAAC,EAAE,EAAC,CAAC,EAAE,EAAC,CAAC,EAAE,EAAC,CAAC,EAAE,EAAC,CAAC,EAAE,EAAC,CAAC,EAAE,EAAC,CAAC,EAAE,EAAC,CAAC,EAAE,EAAC,CAAC,EAAE,EAAC,CAAC,EAAE,EAAC,CAAC,EAAE,EAAC,CAAC,EAAE,EAAC,CAAC,EAAE,EAAC,CAAC,EAAE,EAAC,CAAC,EAAE,EAAC,CAAC,EAAE,EAAC,CAAC,EAAE,EAAC,CAAC,EAAE;IAC9F,CAAC,EAAE,EAAC,CAAC,EAAE,EAAC,CAAC,EAAE,EAAC,CAAC,EAAE,EAAC,CAAC,EAAE,EAAC,CAAC,EAAE,EAAC,CAAC,EAAE,EAAC,CAAC,EAAE,EAAC,CAAC,EAAE,EAAC,CAAC,EAAE,EAAC,CAAC,EAAE,EAAC,CAAC,EAAE,EAAC,CAAC,EAAE,EAAC,CAAC,EAAE,EAAC,CAAC,EAAE,EAAC,CAAC,EAAE,EAAC,CAAC,EAAE,EAAC,CAAC,EAAE,EAAC,CAAC,EAAE,EAAC,CAAC,EAAE,EAAC,CAAC,EAAE,EAAC,CAAC,EAAE,EAAC,CAAC,EAAE,EAAC,CAAC,EAAE;IAC/F,CAAC,EAAE,EAAC,CAAC,EAAE,EAAC,CAAC,EAAE,EAAC,CAAC,EAAE,EAAC,CAAC,EAAE,EAAC,CAAC,EAAE,EAAC,CAAC,EAAE,EAAC,CAAC,EAAE,EAAC,CAAC,EAAE,EAAC,CAAC,GAAG,EAAC,CAAC,GAAG,EAAC,CAAC,GAAG,EAAC,CAAC,GAAG,EAAC,CAAC,GAAG,EAAC,CAAC,GAAG,EAAC,CAAC,GAAG,EAAC,CAAC,GAAG,EAAC,CAAC,GAAG,EAAC,CAAC,GAAG,EAAC,CAAC,GAAG,EAAC,CAAC,GAAG,EAAC,CAAC,GAAG,EAAC,CAAC,GAAG,EAAC,CAAC,GAAG;IAC9G,CAAC,GAAG,EAAC,CAAC,GAAG,EAAC,CAAC,GAAG,EAAC,CAAC,GAAG,EAAC,CAAC,GAAG,EAAC,CAAC,GAAG,EAAC,CAAC,GAAG,EAAC,CAAC,GAAG,EAAC,CAAC,GAAG,EAAC,CAAC,GAAG,EAAC,CAAC,GAAG,EAAC,CAAC,GAAG,EAAC,CAAC,GAAG,EAAC,CAAC,GAAG,EAAC,CAAC,GAAG,EAAC,CAAC,GAAG,EAAC,CAAC,GAAG,EAAC,CAAC,GAAG,EAAC,CAAC,GAAG,EAAC,CAAC,GAAG,EAAC,CAAC,GAAG,EAAC,CAAC,GAAG,EAAC,CAAC,GAAG,EAAC,CAAC,GAAG;IACvH,CAAC,GAAG,EAAC,CAAC,GAAG,EAAC,CAAC,GAAG,EAAC,CAAC,GAAG,EAAC,CAAC,GAAG,EAAC,CAAC,GAAG,EAAC,CAAC,GAAG,EAAC,CAAC,GAAG,EAAC,CAAC,GAAG,EAAC,CAAC,GAAG,EAAC,CAAC,GAAG,EAAC,CAAC,GAAG,EAAC,CAAC,GAAG,EAAC,CAAC,GAAG,EAAC,CAAC,GAAG,EAAC,CAAC,GAAG,EAAC,CAAC,GAAG,EAAC,CAAC,GAAG,EAAC,CAAC,GAAG,EAAC,CAAC,GAAG,EAAC,CAAC,GAAG,EAAC,CAAC,GAAG,EAAC,CAAC,GAAG,EAAC,CAAC,GAAG;IACvH,CAAC,GAAG,EAAC,CAAC,GAAG,EAAC,CAAC,GAAG,EAAC,CAAC,GAAG,EAAC,CAAC,GAAG,EAAC,CAAC,GAAG,EAAC,CAAC,GAAG,EAAC,CAAC,GAAG,EAAC,CAAC,GAAG,EAAC,CAAC,GAAG,EAAC,CAAC,GAAG,EAAC,CAAC,GAAG,EAAC,CAAC,GAAG,EAAC,CAAC,GAAG,EAAC,CAAC,GAAG,EAAC,CAAC,GAAG,EAAC,CAAC,GAAG,EAAC,CAAC,GAAG,EAAC,CAAC,GAAG,EAAC,CAAC,GAAG,EAAC,CAAC,GAAG,EAAC,CAAC,GAAG,EAAC,CAAC,GAAG,EAAC,CAAC,GAAG;IACvH,CAAC,GAAG,EAAC,CAAC,GAAG,EAAC,CAAC,GAAG,EAAC,CAAC,GAAG,EAAC,CAAC,GAAG,EAAC,CAAC,GAAG,EAAC,CAAC,GAAG,EAAC,CAAC,GAAG,EAAC,CAAC,GAAG,EAAC,CAAC,GAAG,EAAC,CAAC,GAAG,EAAC,CAAC,GAAG,EAAC,CAAC,GAAG,EAAC,CAAC,GAAG,EAAC,CAAC,GAAG,EAAC,CAAC,GAAG,EAAC,CAAC,GAAG,EAAC,CAAC,GAAG,EAAC,CAAC,GAAG,EAAC,CAAC,GAAG,EAAC,CAAC,GAAG,EAAC,CAAC,GAAG,EAAC,CAAC,GAAG,EAAC,CAAC,GAAG;IACvH,CAAC,GAAG,EAAC,CAAC,GAAG,EAAC,CAAC,GAAG,EAAC,CAAC,GAAG,EAAC,CAAC,GAAG,EAAC,CAAC,GAAG,EAAC,CAAC,GAAG,EAAC,CAAC,GAAG,EAAC,CAAC,GAAG,EAAC,CAAC,GAAG,EAAC,CAAC,GAAG,EAAC,CAAC,GAAG,EAAC,CAAC,GAAG,EAAC,CAAC,GAAG,EAAC,CAAC,GAAG,EAAC,CAAC,GAAG,EAAC,CAAC,GAAG,EAAC,CAAC,GAAG,EAAC,CAAC,GAAG,EAAC,CAAC,GAAG,EAAC,CAAC,GAAG,EAAC,CAAC,GAAG,EAAC,CAAC,GAAG,EAAC,CAAC,GAAG;IACvH,CAAC,GAAG,EAAC,CAAC,GAAG,EAAC,CAAC,GAAG,EAAC,CAAC,GAAG,EAAC,CAAC,GAAG,EAAC,CAAC,GAAG,EAAC,CAAC,GAAG,EAAC,CAAC,GAAG,EAAC,CAAC,GAAG,EAAC,CAAC,GAAG,EAAC,CAAC,GAAG,EAAC,CAAC,GAAG,EAAC,CAAC,GAAG,EAAC,CAAC,GAAG,EAAC,CAAC,GAAG,EAAC,CAAC,GAAG,EAAC,CAAC,GAAG,EAAC,CAAC,GAAG,EAAC,CAAC,GAAG,EAAC,CAAC,GAAG,EAAC,CAAC,GAAG,EAAC,CAAC,GAAG,EAAC,CAAC,GAAG,EAAC,CAAC,GAAG;IACvH,CAAC,GAAG,EAAC,CAAC,GAAG,EAAC,CAAC,GAAG,EAAC,CAAC,GAAG,EAAC,CAAC,GAAG,EAAC,CAAC,GAAG,EAAC,CAAC,GAAG,EAAC,CAAC,GAAG,EAAC,CAAC,GAAG,EAAC,CAAC,GAAG,EAAC,CAAC,GAAG,EAAC,CAAC,GAAG,EAAC,CAAC,GAAG,EAAC,CAAC,GAAG,EAAC,CAAC,EAAE,EAAC,CAAC,EAAE,EAAC,CAAC,EAAE,EAAC,CAAC,EAAE,EAAC,CAAC,EAAE,EAAC,CAAC,EAAE,EAAC,CAAC,EAAE,EAAC,CAAC,EAAE,EAAC,CAAC,EAAE,EAAC,CAAC,EAAE;IAC7G,CAAC,EAAE,EAAC,CAAC,EAAE,EAAC,CAAC,EAAE,EAAC,CAAC,EAAE,EAAC,CAAC,EAAE,EAAC,CAAC,EAAE,EAAC,CAAC,EAAE,EAAC,CAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,EAAE,EAAC,EAAE,EAAC,EAAE,EAAC,EAAE,EAAC,EAAE,EAAC,EAAE,EAAC,EAAE,EAAC,EAAE,EAAC,EAAE,EAAC,EAAE,EAAC,EAAE,EAAC,EAAE,EAAC,EAAE,EAAC,EAAE;IAC5E,GAAG,EAAC,GAAG,EAAC,GAAG,EAAC,GAAG,EAAC,GAAG,EAAC,GAAG,EAAC,GAAG,EAAC,GAAG,EAAC,GAAG,EAAC,GAAG,EAAC,GAAG,EAAC,GAAG,EAAC,GAAG,EAAC,GAAG,EAAC,GAAG,EAAC,GAAG,EAAC,GAAG,EAAC,GAAG,EAAC,GAAG,EAAC,GAAG,EAAC,GAAG,EAAC,GAAG,EAAC,GAAG,EAAC,GAAG;IAC/F,GAAG,EAAC,GAAG,EAAC,GAAG,EAAC,GAAG,EAAC,GAAG,EAAC,GAAG,EAAC,GAAG,EAAC,GAAG,EAAC,GAAG,EAAC,GAAG,EAAC,GAAG,EAAC,GAAG,EAAC,GAAG,EAAC,GAAG,EAAC,GAAG,EAAC,GAAG,EAAC,GAAG,EAAC,GAAG,EAAC,GAAG,EAAC,GAAG,EAAC,GAAG,EAAC,GAAG,EAAC,GAAG,EAAC,GAAG;IAC/F,GAAG,EAAC,GAAG,EAAC,GAAG,EAAC,GAAG,EAAC,GAAG,EAAC,GAAG,EAAC,GAAG,EAAC,GAAG,EAAC,GAAG,EAAC,GAAG,EAAC,GAAG,EAAC,GAAG,EAAC,GAAG,EAAC,GAAG,EAAC,GAAG,EAAC,GAAG,EAAC,GAAG,EAAC,GAAG,EAAC,GAAG,EAAC,GAAG,EAAC,GAAG,EAAC,GAAG,EAAC,GAAG,EAAC,GAAG;IAC/F,GAAG,EAAC,GAAG,EAAC,GAAG,EAAC,GAAG,EAAC,GAAG,EAAC,GAAG,EAAC,GAAG,EAAC,GAAG,EAAC,GAAG,EAAC,GAAG,EAAC,GAAG,EAAC,GAAG,EAAC,GAAG,EAAC,GAAG,EAAC,GAAG,EAAC,GAAG,EAAC,GAAG,EAAC,GAAG,EAAC,GAAG,EAAC,GAAG,EAAC,GAAG,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI;IAClG,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI;IACvH,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI;IACvH,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI;IACvH,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI;IACvH,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI;IACvH,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI;IACvH,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI;IACvH,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI;IACvH,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI;IACvH,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI;IACvH,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI;IACvH,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI;IACvH,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,GAAG,EAAC,GAAG,EAAC,GAAG,EAAC,GAAG,EAAC,GAAG,EAAC,GAAG,EAAC,GAAG,EAAC,GAAG,EAAC,GAAG,EAAC,GAAG,EAAC,GAAG,EAAC,GAAG,EAAC,GAAG,EAAC,GAAG,EAAC,GAAG,EAAC,GAAG,EAAC,GAAG,EAAC,GAAG,EAAC,GAAG,EAAC,GAAG;IACnG,GAAG,EAAC,GAAG,EAAC,GAAG,EAAC,GAAG,EAAC,GAAG,EAAC,GAAG,EAAC,GAAG,EAAC,GAAG,EAAC,GAAG,EAAC,GAAG,EAAC,GAAG,EAAC,GAAG,EAAC,GAAG,EAAC,GAAG,EAAC,GAAG,EAAC,GAAG,EAAC,GAAG,EAAC,GAAG,EAAC,GAAG,EAAC,GAAG,EAAC,GAAG,EAAC,GAAG,EAAC,GAAG,EAAC,GAAG;IAC/F,GAAG,EAAC,GAAG,EAAC,GAAG,EAAC,GAAG,EAAC,GAAG,EAAC,GAAG,EAAC,GAAG,EAAC,GAAG,EAAC,GAAG,EAAC,GAAG,EAAC,GAAG,EAAC,GAAG,EAAC,GAAG,EAAC,GAAG,EAAC,GAAG,EAAC,GAAG,EAAC,GAAG,EAAC,GAAG,EAAC,GAAG,EAAC,GAAG,EAAC,GAAG,EAAC,GAAG,EAAC,GAAG,EAAC,GAAG;IAC/F,GAAG,EAAC,GAAG,EAAC,GAAG,EAAC,GAAG,EAAC,GAAG,EAAC,GAAG,EAAC,GAAG,EAAC,GAAG,EAAC,GAAG,EAAC,GAAG,EAAC,GAAG,EAAC,GAAG,EAAC,GAAG,EAAC,GAAG,EAAC,GAAG,EAAC,GAAG,EAAC,GAAG,EAAC,GAAG,EAAC,GAAG,EAAC,GAAG,EAAC,GAAG,EAAC,GAAG,EAAC,GAAG,EAAC,GAAG;IAC/F,GAAG,EAAC,EAAE,EAAC,EAAE,EAAC,EAAE,EAAC,EAAE,EAAC,EAAE,EAAC,EAAE,EAAC,EAAE,EAAC,EAAE,EAAC,EAAE,EAAC,EAAE,EAAC,EAAE,EAAC,EAAE,EAAC,EAAE,EAAC,EAAE,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,CAAC,EAAC,CAAC,EAAE,EAAC,CAAC,EAAE,EAAC,CAAC,EAAE,EAAC,CAAC,EAAE,EAAC,CAAC,EAAE,EAAC,CAAC,EAAE;IAC5E,CAAC,EAAE,EAAC,CAAC,EAAE,EAAC,CAAC,EAAE,EAAC,CAAC,EAAE,EAAC,CAAC,EAAE,EAAC,CAAC,EAAE,EAAC,CAAC,EAAE,EAAC,CAAC,EAAE,EAAC,CAAC,EAAE,EAAC,CAAC,EAAE,EAAC,CAAC,EAAE,EAAC,CAAC,GAAG,EAAC,CAAC,GAAG,EAAC,CAAC,GAAG,EAAC,CAAC,GAAG,EAAC,CAAC,GAAG,EAAC,CAAC,GAAG,EAAC,CAAC,GAAG,EAAC,CAAC,GAAG,EAAC,CAAC,GAAG,EAAC,CAAC,GAAG,EAAC,CAAC,GAAG,EAAC,CAAC,GAAG,EAAC,CAAC,GAAG;IAC5G,CAAC,GAAG,EAAC,CAAC,GAAG,EAAC,CAAC,GAAG,EAAC,CAAC,GAAG,EAAC,CAAC,GAAG,EAAC,CAAC,GAAG,EAAC,CAAC,GAAG,EAAC,CAAC,GAAG,EAAC,CAAC,GAAG,EAAC,CAAC,GAAG,EAAC,CAAC,GAAG,EAAC,CAAC,GAAG,EAAC,CAAC,GAAG,EAAC,CAAC,GAAG,EAAC,CAAC,GAAG,EAAC,CAAC,GAAG,EAAC,CAAC,GAAG,EAAC,CAAC,GAAG,EAAC,CAAC,GAAG,EAAC,CAAC,GAAG,EAAC,CAAC,GAAG,EAAC,CAAC,GAAG,EAAC,CAAC,GAAG,EAAC,CAAC,GAAG;IACvH,CAAC,GAAG,EAAC,CAAC,GAAG,EAAC,CAAC,GAAG,EAAC,CAAC,GAAG,EAAC,CAAC,GAAG,EAAC,CAAC,GAAG,EAAC,CAAC,GAAG,EAAC,CAAC,GAAG,EAAC,CAAC,GAAG,EAAC,CAAC,GAAG,EAAC,CAAC,GAAG,EAAC,CAAC,GAAG,EAAC,CAAC,GAAG,EAAC,CAAC,GAAG,EAAC,CAAC,GAAG,EAAC,CAAC,GAAG,EAAC,CAAC,GAAG,EAAC,CAAC,GAAG,EAAC,CAAC,GAAG,EAAC,CAAC,GAAG,EAAC,CAAC,GAAG,EAAC,CAAC,GAAG,EAAC,CAAC,GAAG,EAAC,CAAC,GAAG;IACvH,CAAC,GAAG,EAAC,CAAC,GAAG,EAAC,CAAC,GAAG,EAAC,CAAC,GAAG,EAAC,CAAC,GAAG,EAAC,CAAC,GAAG,EAAC,CAAC,GAAG,EAAC,CAAC,GAAG,EAAC,CAAC,GAAG,EAAC,CAAC,GAAG,EAAC,CAAC,GAAG,EAAC,CAAC,GAAG,EAAC,CAAC,GAAG,EAAC,CAAC,GAAG,EAAC,CAAC,GAAG,EAAC,CAAC,GAAG,EAAC,CAAC,GAAG,EAAC,CAAC,GAAG,EAAC,CAAC,GAAG,EAAC,CAAC,GAAG,EAAC,CAAC,GAAG,EAAC,CAAC,GAAG,EAAC,CAAC,GAAG,EAAC,CAAC,GAAG;IACvH,CAAC,GAAG,EAAC,CAAC,GAAG,EAAC,CAAC,GAAG,EAAC,CAAC,GAAG,EAAC,CAAC,GAAG,EAAC,CAAC,GAAG,EAAC,CAAC,GAAG,EAAC,CAAC,GAAG,EAAC,CAAC,GAAG,EAAC,CAAC,GAAG,EAAC,CAAC,GAAG,EAAC,CAAC,GAAG,EAAC,CAAC,GAAG,EAAC,CAAC,GAAG,EAAC,CAAC,GAAG,EAAC,CAAC,GAAG,EAAC,CAAC,GAAG,EAAC,CAAC,GAAG,EAAC,CAAC,GAAG,EAAC,CAAC,GAAG,EAAC,CAAC,GAAG,EAAC,CAAC,GAAG,EAAC,CAAC,GAAG,EAAC,CAAC,GAAG;IACvH,CAAC,GAAG,EAAC,CAAC,GAAG,EAAC,CAAC,GAAG,EAAC,CAAC,GAAG,EAAC,CAAC,GAAG,EAAC,CAAC,GAAG,EAAC,CAAC,GAAG,EAAC,CAAC,GAAG,EAAC,CAAC,GAAG,EAAC,CAAC,GAAG,EAAC,CAAC,GAAG,EAAC,CAAC,GAAG,EAAC,CAAC,GAAG,EAAC,CAAC,GAAG,EAAC,CAAC,GAAG,EAAC,CAAC,GAAG,EAAC,CAAC,GAAG,EAAC,CAAC,GAAG,EAAC,CAAC,GAAG,EAAC,CAAC,GAAG,EAAC,CAAC,GAAG,EAAC,CAAC,GAAG,EAAC,CAAC,GAAG,EAAC,CAAC,GAAG;IACvH,CAAC,GAAG,EAAC,CAAC,GAAG,EAAC,CAAC,GAAG,EAAC,CAAC,GAAG,EAAC,CAAC,GAAG,EAAC,CAAC,GAAG,EAAC,CAAC,GAAG,EAAC,CAAC,GAAG,EAAC,CAAC,GAAG,EAAC,CAAC,GAAG,EAAC,CAAC,GAAG,EAAC,CAAC,GAAG,EAAC,CAAC,GAAG,EAAC,CAAC,GAAG,EAAC,CAAC,GAAG,EAAC,CAAC,GAAG,EAAC,CAAC,GAAG,EAAC,CAAC,GAAG,EAAC,CAAC,GAAG,EAAC,CAAC,GAAG,EAAC,CAAC,GAAG,EAAC,CAAC,GAAG,EAAC,CAAC,GAAG,EAAC,CAAC,GAAG;IACvH,CAAC,GAAG,EAAC,CAAC,GAAG,EAAC,CAAC,GAAG,EAAC,CAAC,GAAG,EAAC,CAAC,GAAG,EAAC,CAAC,GAAG,EAAC,CAAC,GAAG,EAAC,CAAC,GAAG,EAAC,CAAC,GAAG,EAAC,CAAC,GAAG,EAAC,CAAC,GAAG,EAAC,CAAC,GAAG,EAAC,CAAC,GAAG,EAAC,CAAC,GAAG,EAAC,CAAC,GAAG,EAAC,CAAC,GAAG,EAAC,CAAC,EAAE,EAAC,CAAC,EAAE,EAAC,CAAC,EAAE,EAAC,CAAC,EAAE,EAAC,CAAC,EAAE,EAAC,CAAC,EAAE,EAAC,CAAC,EAAE,EAAC,CAAC,EAAE;IAC/G,CAAC,EAAE,EAAC,CAAC,EAAE,EAAC,CAAC,EAAE,EAAC,CAAC,EAAE,EAAC,CAAC,EAAE,EAAC,CAAC,EAAE,EAAC,CAAC,EAAE,EAAC,CAAC,EAAE,EAAC,CAAC,EAAE,EAAC,CAAC,EAAE,EAAC,CAAC,EAAE,EAAC,CAAC,EAAE,EAAC,CAAC,EAAE,EAAC,CAAC,EAAE,EAAC,CAAC,EAAE,EAAC,CAAC,EAAE,EAAC,CAAC,EAAE,EAAC,CAAC,EAAE,EAAC,CAAC,EAAE,EAAC,CAAC,EAAE,EAAC,CAAC,EAAE,EAAC,CAAC,EAAE,EAAC,CAAC,EAAE,EAAC,CAAC,EAAE;IAC/F,CAAC,EAAE,EAAC,CAAC,EAAE,EAAC,CAAC,EAAE,EAAC,CAAC,EAAE,EAAC,CAAC,EAAE,EAAC,CAAC,EAAE,EAAC,CAAC,EAAE,EAAC,CAAC,EAAE,EAAC,CAAC,EAAE,EAAC,CAAC,EAAE,EAAC,CAAC,EAAE,EAAC,CAAC,EAAE,EAAC,CAAC,EAAE,EAAC,CAAC,EAAE,EAAC,CAAC,EAAE,EAAC,CAAC,EAAE,EAAC,CAAC,EAAE,EAAC,CAAC,EAAE,EAAC,CAAC,EAAE,EAAC,CAAC,EAAE,EAAC,CAAC,EAAE,EAAC,CAAC,EAAE,EAAC,CAAC,EAAE,EAAC,CAAC,EAAE;IAC/F,CAAC,CAAC,EAAC,CAAC,CAAC,EAAC,CAAC,CAAC,EAAC,CAAC,CAAC,EAAC,CAAC,CAAC,EAAC,CAAC,CAAC,EAAC,CAAC,CAAC,EAAC,CAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,EAAE,EAAC,EAAE,EAAC,EAAE,EAAC,EAAE,EAAC,EAAE;IAC5D,EAAE,EAAC,EAAE,EAAC,EAAE,EAAC,EAAE,EAAC,EAAE,EAAC,EAAE,EAAC,EAAE,EAAC,EAAE,EAAC,EAAE,EAAC,EAAE,EAAC,EAAE,EAAC,EAAE,EAAC,EAAE,EAAC,EAAE,EAAC,EAAE,EAAC,EAAE,EAAC,EAAE,EAAC,EAAE,EAAC,EAAE,EAAC,EAAE,EAAC,EAAE,EAAC,EAAE,EAAC,EAAE,EAAC,EAAE;IACvE,EAAE,EAAC,EAAE,EAAC,EAAE,EAAC,EAAE,EAAC,EAAE,EAAC,EAAE,EAAC,EAAE,EAAC,EAAE,EAAC,EAAE,EAAC,EAAE,EAAC,EAAE,EAAC,EAAE,EAAC,EAAE,EAAC,EAAE,EAAC,EAAE,EAAC,EAAE,EAAC,EAAE,EAAC,EAAE,EAAC,EAAE,EAAC,EAAE,EAAC,EAAE,EAAC,EAAE,EAAC,EAAE,EAAC,EAAE;IACvE,EAAE,EAAC,EAAE,EAAC,EAAE,EAAC,EAAE,EAAC,EAAE,EAAC,EAAE,EAAC,EAAE,EAAC,EAAE,EAAC,EAAE,EAAC,EAAE,EAAC,EAAE,EAAC,EAAE,EAAC,EAAE,EAAC,EAAE,EAAC,EAAE,EAAC,EAAE,EAAC,EAAE,EAAC,EAAE,EAAC,EAAE,EAAC,EAAE,EAAC,EAAE,EAAC,EAAE,EAAC,EAAE,EAAC,EAAE;IACvE,EAAE,EAAC,EAAE,EAAC,EAAE,EAAC,EAAE,EAAC,EAAE,EAAC,EAAE,EAAC,EAAE,EAAC,EAAE,EAAC,EAAE,EAAC,EAAE,EAAC,EAAE,EAAC,EAAE,EAAC,EAAE,EAAC,EAAE,EAAC,EAAE,EAAC,EAAE,EAAC,EAAE,EAAC,EAAE,EAAC,EAAE,EAAC,EAAE,EAAC,EAAE,EAAC,EAAE,EAAC,EAAE,EAAC,EAAE;IACvE,EAAE,EAAC,EAAE,EAAC,EAAE,EAAC,EAAE,EAAC,EAAE,EAAC,EAAE,EAAC,EAAE,EAAC,EAAE,EAAC,EAAE,EAAC,EAAE,EAAC,EAAE,EAAC,EAAE,EAAC,EAAE,EAAC,EAAE,EAAC,EAAE,EAAC,EAAE,EAAC,EAAE,EAAC,EAAE,EAAC,EAAE,EAAC,EAAE,EAAC,EAAE,EAAC,EAAE,EAAC,EAAE,EAAC,EAAE;IACvE,EAAE,EAAC,EAAE,EAAC,EAAE,EAAC,EAAE,EAAC,EAAE,EAAC,EAAE,EAAC,EAAE,EAAC,EAAE,EAAC,EAAE,EAAC,EAAE,EAAC,EAAE,EAAC,EAAE,EAAC,EAAE,EAAC,EAAE,EAAC,EAAE,EAAC,EAAE,EAAC,EAAE,EAAC,EAAE,EAAC,EAAE,EAAC,EAAE,EAAC,EAAE,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC;IACpE,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC;IAC/C,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC;IAC/C,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC;IAC/C,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC;CAChD,CAAC,CAAC"}
@@ -0,0 +1,20 @@
1
+ /** Parse "M:SS", "H:MM:SS" or "M:SS.mmm" → seconds (float). */
2
+ export declare function parseSongLength(tok: string): number;
3
+ /**
4
+ * Load a Songlengths.md5 database (the full text of the file). After this,
5
+ * sidStartTune/loads look up the tune by MD5 of its bytes and fill
6
+ * cRSID.SubtuneDurations — exactly like cRSID_getPlaylengths.
7
+ */
8
+ export declare function loadSidSongLengths(dbText: string): void;
9
+ /**
10
+ * Look up the current tune (by MD5 of its bytes) and populate
11
+ * cRSID.SubtuneDurations + the returned per-subtune seconds array.
12
+ * Call from the loader (processSIDfileData path). Returns seconds per
13
+ * subtune (index 1..N), entries 0 when unknown.
14
+ */
15
+ export declare function applySongLengthsFor(filedata: Uint8Array, subtuneAmount: number): number[];
16
+ /** Duration of a subtune in seconds (0 = unknown). */
17
+ export declare function getSidSubtuneDuration(subtune: number): number;
18
+ /** Whether a song-length database is loaded. */
19
+ export declare function isSidSongLengthDbLoaded(): boolean;
20
+ //# sourceMappingURL=songlengths.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"songlengths.d.ts","sourceRoot":"","sources":["../src/songlengths.ts"],"names":[],"mappings":"AAsBA,+DAA+D;AAC/D,wBAAgB,eAAe,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAMnD;AAED;;;;GAIG;AACH,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI,CASvD;AAID;;;;;GAKG;AACH,wBAAgB,mBAAmB,CAAC,QAAQ,EAAE,UAAU,EAAE,aAAa,EAAE,MAAM,GAAG,MAAM,EAAE,CAiBzF;AAED,sDAAsD;AACtD,wBAAgB,qBAAqB,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAE7D;AAED,gDAAgD;AAChD,wBAAgB,uBAAuB,IAAI,OAAO,CAEjD"}
@@ -0,0 +1,81 @@
1
+ // SPDX-License-Identifier: BSD-3-Clause
2
+ // Copyright (c) 2026 Bitti09 — modplayjs contributors
3
+ // HVSC Songlengths.md5 support — per-subtune runtime for SID tunes.
4
+ //
5
+ // The new-format database (HVSC #68+) maps MD5(full file bytes) to a list
6
+ // of per-subtune lengths "M:SS[.mmm] M:SS ...". This mirrors the C host's
7
+ // cRSID_getPlaylengths (host/file.c) which fills cRSID.SubtuneDurations
8
+ // from cRSID.SongLengths — except our hash covers the full file (the
9
+ // modern database format), while the C reference hashes it for the old
10
+ // format; for the new Songlengths.md5 the hash is md5(file bytes).
11
+ //
12
+ // Sources: DOCUMENTS/Songlengths.faq (HVSC) — "The new format has MD5
13
+ // hashes based on the full content".
14
+ import { md5Hex } from '@modplayjs/core';
15
+ import { cRSID } from './instance.js';
16
+ /** seconds per subtune (index 1..N); 0 = unknown. */
17
+ let subtuneDurations = [];
18
+ /** true when a Songlengths.md5 database is loaded. */
19
+ let dbLoaded = false;
20
+ /** Parse "M:SS", "H:MM:SS" or "M:SS.mmm" → seconds (float). */
21
+ export function parseSongLength(tok) {
22
+ const parts = tok.split(':').map((p) => parseFloat(p));
23
+ if (parts.some((n) => Number.isNaN(n)))
24
+ return 0;
25
+ let sec = 0;
26
+ for (const p of parts)
27
+ sec = sec * 60 + p;
28
+ return sec > 0 ? sec : 0;
29
+ }
30
+ /**
31
+ * Load a Songlengths.md5 database (the full text of the file). After this,
32
+ * sidStartTune/loads look up the tune by MD5 of its bytes and fill
33
+ * cRSID.SubtuneDurations — exactly like cRSID_getPlaylengths.
34
+ */
35
+ export function loadSidSongLengths(dbText) {
36
+ const map = new Map();
37
+ for (const line of dbText.split('\n')) {
38
+ const clean = line.replace(/\r$/, ''); // Songlengths.md5 has CRLF endings
39
+ const m = clean.match(/^([0-9a-f]{32})=(.*)$/i);
40
+ if (m)
41
+ map.set(m[1].toLowerCase(), m[2]);
42
+ }
43
+ songlengthLookup = map;
44
+ dbLoaded = true;
45
+ }
46
+ let songlengthLookup = null;
47
+ /**
48
+ * Look up the current tune (by MD5 of its bytes) and populate
49
+ * cRSID.SubtuneDurations + the returned per-subtune seconds array.
50
+ * Call from the loader (processSIDfileData path). Returns seconds per
51
+ * subtune (index 1..N), entries 0 when unknown.
52
+ */
53
+ export function applySongLengthsFor(filedata, subtuneAmount) {
54
+ const out = [0];
55
+ cRSID.SubtuneDurations.fill(0);
56
+ const hash = md5Hex(filedata);
57
+ const entry = songlengthLookup?.get(hash);
58
+ if (entry) {
59
+ const toks = entry.trim().split(/\s+/);
60
+ for (let i = 0; i < subtuneAmount && i < toks.length; ++i) {
61
+ const sec = parseSongLength(toks[i]);
62
+ out.push(sec);
63
+ cRSID.SubtuneDurations[i + 1] = Math.round(sec);
64
+ }
65
+ }
66
+ else {
67
+ for (let i = 0; i < subtuneAmount; ++i)
68
+ out.push(0);
69
+ }
70
+ subtuneDurations = out;
71
+ return out;
72
+ }
73
+ /** Duration of a subtune in seconds (0 = unknown). */
74
+ export function getSidSubtuneDuration(subtune) {
75
+ return subtuneDurations[subtune] ?? 0;
76
+ }
77
+ /** Whether a song-length database is loaded. */
78
+ export function isSidSongLengthDbLoaded() {
79
+ return dbLoaded;
80
+ }
81
+ //# sourceMappingURL=songlengths.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"songlengths.js","sourceRoot":"","sources":["../src/songlengths.ts"],"names":[],"mappings":"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"}
package/dist/vic.d.ts ADDED
@@ -0,0 +1,14 @@
1
+ import type { CRC64instance } from './c64types.js';
2
+ /** cRSID_createVICchip (VIC.c:4-12). */
3
+ export declare function cRSID_createVICchip(C64: CRC64instance, baseaddress: number): void;
4
+ /** cRSID_initVICchip (VIC.c:14-21). */
5
+ export declare function cRSID_initVICchip(C64: CRC64instance): void;
6
+ /** cRSID_emulateVIC (VIC.c:37-64) — returns VIC_IRQ (char in C). */
7
+ export declare function cRSID_emulateVIC(C64: CRC64instance, cycles: number): number;
8
+ /** cRSID_acknowledgeVICrasterIRQ (VIC.c:66-76).
9
+ * An 1 is to be written into the IRQ-flag (bit0) of $d019 to clear it and
10
+ * deassert IRQ signal. But oftentimes INC/LSR/etc. RMW commands are used to
11
+ * acknowledge VIC IRQ, they work on real CPU because it writes the
12
+ * unmodified original value itself to memory before writing the modified. */
13
+ export declare function cRSID_acknowledgeVICrasterIRQ(C64: CRC64instance): void;
14
+ //# sourceMappingURL=vic.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"vic.d.ts","sourceRoot":"","sources":["../src/vic.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,eAAe,CAAC;AAEnD,wCAAwC;AACxC,wBAAgB,mBAAmB,CAAC,GAAG,EAAE,aAAa,EAAE,WAAW,EAAE,MAAM,GAAG,IAAI,CAMjF;AAED,uCAAuC;AACvC,wBAAgB,iBAAiB,CAAC,GAAG,EAAE,aAAa,GAAG,IAAI,CAM1D;AAYD,oEAAoE;AACpE,wBAAgB,gBAAgB,CAAC,GAAG,EAAE,aAAa,EAAE,MAAM,EAAE,MAAM,GAAG,MAAM,CA0B3E;AAED;;;;8EAI8E;AAC9E,wBAAgB,6BAA6B,CAAC,GAAG,EAAE,aAAa,GAAG,IAAI,CAKtE"}
package/dist/vic.js ADDED
@@ -0,0 +1,63 @@
1
+ // SPDX-License-Identifier: BSD-3-Clause
2
+ // Copyright (c) 2026 Bitti09 — modplayjs contributors
3
+ // Ported from: cRSID 1.58 libcRSID/C64/VIC.c — VIC-II emulation.
4
+ // (c) Hermit (Mihaly Horvath), license: WTF ("do what the frick you want").
5
+ /** cRSID_createVICchip (VIC.c:4-12). */
6
+ export function cRSID_createVICchip(C64, baseaddress) {
7
+ C64.VIC.ChipModel = 0;
8
+ C64.VIC.BaseAddress = baseaddress;
9
+ C64.VIC.BasePtrWR = baseaddress;
10
+ C64.VIC.BasePtrRD = baseaddress;
11
+ cRSID_initVICchip(C64);
12
+ }
13
+ /** cRSID_initVICchip (VIC.c:14-21). */
14
+ export function cRSID_initVICchip(C64) {
15
+ for (let i = 0; i < 0x3f; ++i) {
16
+ C64.IObankWR[C64.VIC.BasePtrWR + i] = 0x00;
17
+ C64.IObankRD[C64.VIC.BasePtrRD + i] = 0x00;
18
+ }
19
+ C64.VIC.RowCycleCnt = 0;
20
+ }
21
+ // enum VICregisters (VIC.c:29-31)
22
+ const CONTROL = 0x11, RASTERROWL = 0x12 /*, SPRITE_ENABLE = 0x15*/;
23
+ const INTERRUPT = 0x19, INTERRUPT_ENABLE = 0x1a;
24
+ // enum ControlBitVal (VIC.c:33)
25
+ const RASTERROWMSB = 0x80 /*, DISPLAY_ENABLE = 0x10, ROWS = 0x08, YSCROLL_MASK = 0x07*/;
26
+ // enum InterruptBitVal (VIC.c:35)
27
+ const VIC_IRQ = 0x80, RASTERROW_MATCH_IRQ = 0x01;
28
+ /** cRSID_emulateVIC (VIC.c:37-64) — returns VIC_IRQ (char in C). */
29
+ export function cRSID_emulateVIC(C64, cycles) {
30
+ const W = C64.IObankWR;
31
+ const R = C64.IObankRD;
32
+ const vicWR = C64.VIC.BasePtrWR;
33
+ const vicRD = C64.VIC.BasePtrRD;
34
+ let RasterRow;
35
+ C64.VIC.RowCycleCnt += cycles;
36
+ if (C64.VIC.RowCycleCnt >= C64.VIC.RasterRowCycles) {
37
+ C64.VIC.RowCycleCnt -= C64.VIC.RasterRowCycles;
38
+ RasterRow = ((R[vicRD + CONTROL] & RASTERROWMSB) << 1) + R[vicRD + RASTERROWL];
39
+ ++RasterRow;
40
+ if (RasterRow >= C64.VIC.RasterLines)
41
+ RasterRow = 0;
42
+ R[vicRD + CONTROL] = (R[vicRD + CONTROL] & ~RASTERROWMSB) | ((RasterRow & 0x100) >> 1);
43
+ R[vicRD + RASTERROWL] = RasterRow & 0xff;
44
+ if (W[vicWR + INTERRUPT_ENABLE] & RASTERROW_MATCH_IRQ) {
45
+ if (RasterRow === ((W[vicWR + CONTROL] & RASTERROWMSB) << 1) + W[vicWR + RASTERROWL]) {
46
+ R[vicRD + INTERRUPT] |= VIC_IRQ | RASTERROW_MATCH_IRQ;
47
+ }
48
+ }
49
+ }
50
+ return R[vicRD + INTERRUPT] & VIC_IRQ;
51
+ }
52
+ /** cRSID_acknowledgeVICrasterIRQ (VIC.c:66-76).
53
+ * An 1 is to be written into the IRQ-flag (bit0) of $d019 to clear it and
54
+ * deassert IRQ signal. But oftentimes INC/LSR/etc. RMW commands are used to
55
+ * acknowledge VIC IRQ, they work on real CPU because it writes the
56
+ * unmodified original value itself to memory before writing the modified. */
57
+ export function cRSID_acknowledgeVICrasterIRQ(C64) {
58
+ const vicWR = C64.VIC.BasePtrWR;
59
+ const vicRD = C64.VIC.BasePtrRD;
60
+ C64.IObankWR[vicWR + INTERRUPT] &= ~RASTERROW_MATCH_IRQ; // prepare for next acknowledge-detection
61
+ C64.IObankRD[vicRD + INTERRUPT] &= ~(VIC_IRQ | RASTERROW_MATCH_IRQ); // remove IRQ flag and state
62
+ }
63
+ //# sourceMappingURL=vic.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"vic.js","sourceRoot":"","sources":["../src/vic.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,50 @@
1
1
  {
2
2
  "name": "@modplayjs/fmt-sid",
3
- "version": "0.0.0-stage",
4
- "stub": true,
5
- "description": "Temporary package placeholder for staged publishing"
6
- }
3
+ "version": "0.2.2",
4
+ "description": "Commodore 64 SID music (PSID/RSID) format plugin for modplayjs \u2014 pristine 1:1 TypeScript port of libcRSID 1.58 by Hermit (Mihaly Horvath).",
5
+ "type": "module",
6
+ "main": "dist/index.js",
7
+ "types": "dist/index.d.ts",
8
+ "exports": {
9
+ ".": {
10
+ "types": "./dist/index.d.ts",
11
+ "import": "./dist/index.js"
12
+ }
13
+ },
14
+ "files": [
15
+ "dist"
16
+ ],
17
+ "scripts": {
18
+ "build": "tsc -p tsconfig.build.json",
19
+ "typecheck": "tsc -p tsconfig.json --noEmit"
20
+ },
21
+ "dependencies": {
22
+ "@modplayjs/core": "^0.2.2"
23
+ },
24
+ "keywords": [
25
+ "sid",
26
+ "psid",
27
+ "rsid",
28
+ "c64",
29
+ "commodore 64",
30
+ "chiptune",
31
+ "audio",
32
+ "music",
33
+ "crsid"
34
+ ],
35
+ "sideEffects": false,
36
+ "engines": {
37
+ "node": ">=18"
38
+ },
39
+ "repository": {
40
+ "type": "git",
41
+ "url": "git+https://github.com/modplayjs/modplayjs.git",
42
+ "directory": "packages/fmt-sid"
43
+ },
44
+ "bugs": "https://github.com/modplayjs/modplayjs/issues",
45
+ "homepage": "https://github.com/modplayjs/modplayjs#readme",
46
+ "license": "BSD-3-Clause",
47
+ "publishConfig": {
48
+ "registry": "https://npm.pkg.github.com"
49
+ }
50
+ }