@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 @@
1
+ {"version":3,"file":"psiddigi.d.ts","sourceRoot":"","sources":["../src/psiddigi.ts"],"names":[],"mappings":"AAoCA,qEAAqE;AACrE,wBAAgB,kBAAkB,IAAI,MAAM,CAqC3C"}
@@ -0,0 +1,73 @@
1
+ // SPDX-License-Identifier: BSD-3-Clause
2
+ // Copyright (c) 2026 Bitti09 — modplayjs contributors
3
+ // Ported from: cRSID 1.58 libcRSID/C64/C64_SIDrouting.c:377-427 — the PSID
4
+ // $D4xx digi player (PlaySID-sample extension).
5
+ // (c) Hermit (Mihaly Horvath), license: WTF ("do what the frick you want").
6
+ import { CRSpecC64, CRAudioLevels } from './c64types.js';
7
+ import { cRSID, cRSID_C64 } from './instance.js';
8
+ // PSIDdigiSpecs (C64_SIDrouting.c:379-389)
9
+ const D418_VOL_RANGE = 0x10;
10
+ const DIGI_MAX = D418_VOL_RANGE - 1;
11
+ const DIGI_MASK = DIGI_MAX;
12
+ const DIGI_MID = D418_VOL_RANGE / 2;
13
+ const OUTPUT_RESOLUTION = 16;
14
+ const SID_CHANNELS = 3 + 1;
15
+ const NOMINAL_DIGI_RANGE = (1 << OUTPUT_RESOLUTION) / SID_CHANNELS; // 16384
16
+ const DIGI_VOLUME = 128 /* 55 */;
17
+ const DIGI_VOLUME_DENOM = 16;
18
+ const NOMINAL_DIGI_MUL = NOMINAL_DIGI_RANGE / D418_VOL_RANGE; // 1024
19
+ const DIGI_MUL = ((NOMINAL_DIGI_MUL * DIGI_VOLUME) / DIGI_VOLUME_DENOM) * CRAudioLevels.CRSID_PRESAT_ATT_DENOM / CRAudioLevels.CRSID_PRESAT_ATT_NOM;
20
+ void CRSpecC64;
21
+ /** The C function's static state (PlaybackEnabled, NybbleCounter,
22
+ * RepeatCounter, SampleAddress, Output, PeriodCounter) — kept across calls.
23
+ * The TS port stores them in a module-scope object with C semantics
24
+ * (they are reset when $D41D is written). */
25
+ const psidDigiState = {
26
+ PlaybackEnabled: 0,
27
+ NybbleCounter: 0,
28
+ RepeatCounter: 0,
29
+ SampleAddress: 0,
30
+ Output: 0,
31
+ PeriodCounter: 0,
32
+ };
33
+ /** cRSID_playPSIDdigi (C64_SIDrouting.c:377-427) — returns short. */
34
+ export function cRSID_playPSIDdigi() {
35
+ const C64 = cRSID_C64;
36
+ const st = psidDigiState;
37
+ let Shifts;
38
+ if (C64.IObankWR[0xd41d]) {
39
+ st.PlaybackEnabled = C64.IObankWR[0xd41d] >= 0xfe ? 1 : 0;
40
+ st.PeriodCounter = 0;
41
+ st.NybbleCounter = 0;
42
+ st.SampleAddress = C64.IObankWR[0xd41e] + (C64.IObankWR[0xd41f] << 8);
43
+ st.RepeatCounter = C64.IObankWR[0xd43f];
44
+ }
45
+ C64.IObankWR[0xd41d] = 0;
46
+ if (st.PlaybackEnabled) {
47
+ const RatePeriod = C64.IObankWR[0xd45d] + (C64.IObankWR[0xd45e] << 8);
48
+ if (RatePeriod)
49
+ st.PeriodCounter += Math.trunc(C64.CPUfrequency / RatePeriod);
50
+ if (st.PeriodCounter >= C64.SampleRate) {
51
+ st.PeriodCounter -= C64.SampleRate;
52
+ if (st.SampleAddress < C64.IObankWR[0xd43d] + (C64.IObankWR[0xd43e] << 8)) {
53
+ if (st.NybbleCounter) {
54
+ Shifts = C64.IObankWR[0xd47d] ? 4 : 0;
55
+ ++st.SampleAddress;
56
+ }
57
+ else
58
+ Shifts = C64.IObankWR[0xd47d] ? 0 : 4;
59
+ st.Output =
60
+ (((C64.RAMbank[st.SampleAddress] >>> Shifts) & DIGI_MASK) - DIGI_MID) * DIGI_MUL; // * DIGI_VOLUME; // * (C64.IObankWR[0xD418]&0xF);
61
+ st.NybbleCounter ^= 1;
62
+ }
63
+ else if (st.RepeatCounter) {
64
+ st.SampleAddress = C64.IObankWR[0xd47f] + (C64.IObankWR[0xd47e] << 8);
65
+ st.RepeatCounter--;
66
+ }
67
+ }
68
+ }
69
+ return Math.trunc(st.Output / C64.Attenuation);
70
+ }
71
+ // The cRSID import documents parity with C's file-global cRSID use.
72
+ void cRSID;
73
+ //# sourceMappingURL=psiddigi.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"psiddigi.js","sourceRoot":"","sources":["../src/psiddigi.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,41 @@
1
+ /** Chip model (0 = header default, 6581/8580 = forced). */
2
+ export type SidModel = 0 | 6581 | 8580;
3
+ /** Output mode: mono / full stereo / narrow stereo (2SID+ tunes only). */
4
+ export type SidStereo = 0 | 1 | 3;
5
+ /** All settable engine options. */
6
+ export interface SidSettings {
7
+ /** master volume 0..255 (C: -volume). Live. */
8
+ volume: number;
9
+ /** cycle-based oversampled waveform emulation (C: -sidhq/-sidlight). Live. */
10
+ highQualitySID: boolean;
11
+ /** Sinc FIR resampler instead of the Chebyshev+averaging decimator
12
+ * (C: -resamplehq/-resamplight). Only used when highQualitySID. Live. */
13
+ highQualityResampler: boolean;
14
+ /** channel mode for 2SID/3SID/4SID tunes (C: -mono/-stereo/-narrow). Live. */
15
+ stereo: SidStereo;
16
+ /** force a chip model (C: -sid6581/-sid8580); 0 = follow the header.
17
+ * Init-time: applied on the next sidStartTune. */
18
+ model: SidModel;
19
+ /** force the video standard 0=NTSC 1=PAL; undefined = follow the header.
20
+ * Init-time: applied on the next sidStartTune. */
21
+ videoStandard?: 0 | 1;
22
+ }
23
+ /** Read the current settings back (live values included). */
24
+ export declare function getSidSettings(): SidSettings;
25
+ /** Apply the live settings (everything except model/videoStandard). */
26
+ export declare function applySidSettingsLive(s: Pick<SidSettings, 'volume' | 'highQualitySID' | 'highQualityResampler' | 'stereo'>): void;
27
+ /** Set the init-time overrides consumed by cRSID_setC64 (model forces the
28
+ * chip selection in cRSID_setSIDmodels; ForcedVideoStandard overrides the
29
+ * header video standard after its decode). Applied on the next
30
+ * sidStartTune. */
31
+ export declare function setSidInitOverrides(model: SidModel, videoStandard?: 0 | 1): void;
32
+ /** Internal: re-apply the stored overrides after cRSID_init (which resets
33
+ * the globals). Called by sidStartTune. */
34
+ export declare function sidApplyInitOverrides(): void;
35
+ /** Apply everything: live fields immediately, init-time fields on the
36
+ * next sidStartTune call. */
37
+ export declare function applySidSettings(s: SidSettings): void;
38
+ /** Number of SID chips the loaded tune uses (1..4). The channel-mode
39
+ * setting (mono/stereo/narrow) only routes differently when > 1. */
40
+ export declare function getSidChipCount(): number;
41
+ //# sourceMappingURL=settings.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"settings.d.ts","sourceRoot":"","sources":["../src/settings.ts"],"names":[],"mappings":"AAiBA,2DAA2D;AAC3D,MAAM,MAAM,QAAQ,GAAG,CAAC,GAAG,IAAI,GAAG,IAAI,CAAC;AACvC,0EAA0E;AAC1E,MAAM,MAAM,SAAS,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;AAElC,mCAAmC;AACnC,MAAM,WAAW,WAAW;IAC1B,+CAA+C;IAC/C,MAAM,EAAE,MAAM,CAAC;IACf,8EAA8E;IAC9E,cAAc,EAAE,OAAO,CAAC;IACxB;8EAC0E;IAC1E,oBAAoB,EAAE,OAAO,CAAC;IAC9B,8EAA8E;IAC9E,MAAM,EAAE,SAAS,CAAC;IAClB;uDACmD;IACnD,KAAK,EAAE,QAAQ,CAAC;IAChB;uDACmD;IACnD,aAAa,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC;CACvB;AAED,6DAA6D;AAC7D,wBAAgB,cAAc,IAAI,WAAW,CAS5C;AAED,uEAAuE;AACvE,wBAAgB,oBAAoB,CAAC,CAAC,EAAE,IAAI,CAAC,WAAW,EAAE,QAAQ,GAAG,gBAAgB,GAAG,sBAAsB,GAAG,QAAQ,CAAC,GAAG,IAAI,CAQhI;AAMD;;;oBAGoB;AACpB,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,QAAQ,EAAE,aAAa,CAAC,EAAE,CAAC,GAAG,CAAC,GAAG,IAAI,CAGhF;AAED;4CAC4C;AAC5C,wBAAgB,qBAAqB,IAAI,IAAI,CAG5C;AAED;8BAC8B;AAC9B,wBAAgB,gBAAgB,CAAC,CAAC,EAAE,WAAW,GAAG,IAAI,CAGrD;AAED;qEACqE;AACrE,wBAAgB,eAAe,IAAI,MAAM,CAExC"}
@@ -0,0 +1,64 @@
1
+ // SPDX-License-Identifier: BSD-3-Clause
2
+ // Copyright (c) 2026 Bitti09 — modplayjs contributors
3
+ // Playback-settings surface for the cRSID engine — the C player's CLI
4
+ // options (-sid6581/-sid8580, -mono/-stereo/-narrow, -sidhq/-sidlight,
5
+ // -resamplehq/-resamplight, -volume) mapped onto the ported globals.
6
+ //
7
+ // Timing semantics (from the C source):
8
+ // - MainVolume, HighQualitySID, HighQualityResampler, Stereo are read
9
+ // through the per-sample shadow sync (host/audio.c generateSample) —
10
+ // they apply LIVE on the next sample.
11
+ // - SelectedSIDmodel and the video standard are consumed only by
12
+ // cRSID_setC64()/cRSID_setSIDmodels() during init — changing them
13
+ // requires a tune re-init (sidStartTune with overrides).
14
+ import { cRSID, cRSID_C64 } from './instance.js';
15
+ /** Read the current settings back (live values included). */
16
+ export function getSidSettings() {
17
+ return {
18
+ volume: cRSID.MainVolume,
19
+ highQualitySID: cRSID.HighQualitySID !== 0,
20
+ highQualityResampler: cRSID.HighQualityResampler !== 0,
21
+ stereo: cRSID.Stereo,
22
+ model: cRSID.SelectedSIDmodel,
23
+ videoStandard: undefined, // not tracked post-init; re-init reads cRSID.VideoStandard
24
+ };
25
+ }
26
+ /** Apply the live settings (everything except model/videoStandard). */
27
+ export function applySidSettingsLive(s) {
28
+ cRSID.MainVolume = Math.max(0, Math.min(255, Math.round(s.volume)));
29
+ cRSID.HighQualitySID = s.highQualitySID ? 1 : 0;
30
+ cRSID.HighQualityResampler = s.highQualitySID && s.highQualityResampler ? 1 : 0;
31
+ cRSID.Stereo = s.stereo;
32
+ // shadow update happens per-sample inside generateSample (loader.ts),
33
+ // matching the C host-thread sync — no action needed here.
34
+ void cRSID_C64;
35
+ }
36
+ /** Stored init-time overrides (cRSID_init resets the globals, so they are
37
+ * re-applied inside sidStartTune after cRSID_init). */
38
+ const sidInitOverrides = { model: 0 };
39
+ /** Set the init-time overrides consumed by cRSID_setC64 (model forces the
40
+ * chip selection in cRSID_setSIDmodels; ForcedVideoStandard overrides the
41
+ * header video standard after its decode). Applied on the next
42
+ * sidStartTune. */
43
+ export function setSidInitOverrides(model, videoStandard) {
44
+ sidInitOverrides.model = model;
45
+ sidInitOverrides.videoStandard = videoStandard;
46
+ }
47
+ /** Internal: re-apply the stored overrides after cRSID_init (which resets
48
+ * the globals). Called by sidStartTune. */
49
+ export function sidApplyInitOverrides() {
50
+ cRSID.SelectedSIDmodel = sidInitOverrides.model;
51
+ cRSID.ForcedVideoStandard = sidInitOverrides.videoStandard;
52
+ }
53
+ /** Apply everything: live fields immediately, init-time fields on the
54
+ * next sidStartTune call. */
55
+ export function applySidSettings(s) {
56
+ applySidSettingsLive(s);
57
+ setSidInitOverrides(s.model, s.videoStandard);
58
+ }
59
+ /** Number of SID chips the loaded tune uses (1..4). The channel-mode
60
+ * setting (mono/stereo/narrow) only routes differently when > 1. */
61
+ export function getSidChipCount() {
62
+ return cRSID_C64.SIDchipCount;
63
+ }
64
+ //# sourceMappingURL=settings.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"settings.js","sourceRoot":"","sources":["../src/settings.ts"],"names":[],"mappings":"AAAA,wCAAwC;AACxC,sDAAsD;AACtD,sEAAsE;AACtE,uEAAuE;AACvE,qEAAqE;AACrE,EAAE;AACF,wCAAwC;AACxC,uEAAuE;AACvE,wEAAwE;AACxE,yCAAyC;AACzC,kEAAkE;AAClE,qEAAqE;AACrE,4DAA4D;AAG5D,OAAO,EAAE,KAAK,EAAE,SAAS,EAAE,MAAM,eAAe,CAAC;AA0BjD,6DAA6D;AAC7D,MAAM,UAAU,cAAc;IAC5B,OAAO;QACL,MAAM,EAAE,KAAK,CAAC,UAAU;QACxB,cAAc,EAAE,KAAK,CAAC,cAAc,KAAK,CAAC;QAC1C,oBAAoB,EAAE,KAAK,CAAC,oBAAoB,KAAK,CAAC;QACtD,MAAM,EAAE,KAAK,CAAC,MAAmB;QACjC,KAAK,EAAE,KAAK,CAAC,gBAA4B;QACzC,aAAa,EAAE,SAAS,EAAE,2DAA2D;KACtF,CAAC;AACJ,CAAC;AAED,uEAAuE;AACvE,MAAM,UAAU,oBAAoB,CAAC,CAAqF;IACxH,KAAK,CAAC,UAAU,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;IACpE,KAAK,CAAC,cAAc,GAAG,CAAC,CAAC,cAAc,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IAChD,KAAK,CAAC,oBAAoB,GAAG,CAAC,CAAC,cAAc,IAAI,CAAC,CAAC,oBAAoB,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IAChF,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,MAAM,CAAC;IACxB,sEAAsE;IACtE,2DAA2D;IAC3D,KAAK,SAAS,CAAC;AACjB,CAAC;AAED;wDACwD;AACxD,MAAM,gBAAgB,GAA+C,EAAE,KAAK,EAAE,CAAC,EAAE,CAAC;AAElF;;;oBAGoB;AACpB,MAAM,UAAU,mBAAmB,CAAC,KAAe,EAAE,aAAqB;IACxE,gBAAgB,CAAC,KAAK,GAAG,KAAK,CAAC;IAC/B,gBAAgB,CAAC,aAAa,GAAG,aAAa,CAAC;AACjD,CAAC;AAED;4CAC4C;AAC5C,MAAM,UAAU,qBAAqB;IACnC,KAAK,CAAC,gBAAgB,GAAG,gBAAgB,CAAC,KAAK,CAAC;IAChD,KAAK,CAAC,mBAAmB,GAAG,gBAAgB,CAAC,aAAa,CAAC;AAC7D,CAAC;AAED;8BAC8B;AAC9B,MAAM,UAAU,gBAAgB,CAAC,CAAc;IAC7C,oBAAoB,CAAC,CAAC,CAAC,CAAC;IACxB,mBAAmB,CAAC,CAAC,CAAC,KAAK,EAAE,CAAC,CAAC,aAAa,CAAC,CAAC;AAChD,CAAC;AAED;qEACqE;AACrE,MAAM,UAAU,eAAe;IAC7B,OAAO,SAAS,CAAC,YAAY,CAAC;AAChC,CAAC"}
package/dist/sid.d.ts ADDED
@@ -0,0 +1,21 @@
1
+ import type { CRC64instance, CRSIDinstance } from './c64types.js';
2
+ /** cRSID_getSIDbase (SID.c:6-8). */
3
+ export declare function cRSID_getSIDbase(sidNumber: number): number;
4
+ /** cRSID_getSIDmodel (SID.c:10-12). */
5
+ export declare function cRSID_getSIDmodel(sidNumber: number): number;
6
+ /** cRSID_setSIDmodel (SID.c:13-15). */
7
+ export declare function cRSID_setSIDmodel(C64: CRC64instance, sidNumber: number, value: number): number;
8
+ /** cRSID_getSIDchannel (SID.c:17-19) — channel in stereo field
9
+ * (left/right/middle). */
10
+ export declare function cRSID_getSIDchannel(sidNumber: number): number;
11
+ /** cRSID_getSIDlevel (SID.c:21-23). */
12
+ export declare function cRSID_getSIDlevel(sidNumber: number): number;
13
+ /** cRSID_createSIDchip (SID.c:25-39). */
14
+ export declare function cRSID_createSIDchip(C64: CRC64instance, SID: CRSIDinstance, model: number, channel: number, baseaddress: number): void;
15
+ /** cRSID_initSIDchip (SID.c:41-56). */
16
+ export declare function cRSID_initSIDchip(_C64: CRC64instance, SID: CRSIDinstance): void;
17
+ /** cRSID_emulateHQresampledSID (SID.c:58-64).
18
+ * ('Paused' segfault-guard comment omitted: the TS port has no audio-thread
19
+ * race; see the C source for the original guard.) */
20
+ export declare function cRSID_emulateHQresampledSID(C64: CRC64instance, SID: CRSIDinstance, cycles: number): number;
21
+ //# sourceMappingURL=sid.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sid.d.ts","sourceRoot":"","sources":["../src/sid.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,aAAa,EAAE,aAAa,EAAkB,MAAM,eAAe,CAAC;AAKlF,oCAAoC;AACpC,wBAAgB,gBAAgB,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM,CAE1D;AAED,uCAAuC;AACvC,wBAAgB,iBAAiB,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM,CAE3D;AAED,uCAAuC;AACvC,wBAAgB,iBAAiB,CAAC,GAAG,EAAE,aAAa,EAAE,SAAS,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,MAAM,CAE9F;AAED;2BAC2B;AAC3B,wBAAgB,mBAAmB,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM,CAE7D;AAED,uCAAuC;AACvC,wBAAgB,iBAAiB,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM,CAE3D;AASD,yCAAyC;AACzC,wBAAgB,mBAAmB,CACjC,GAAG,EAAE,aAAa,EAClB,GAAG,EAAE,aAAa,EAClB,KAAK,EAAE,MAAM,EACb,OAAO,EAAE,MAAM,EACf,WAAW,EAAE,MAAM,GAClB,IAAI,CAcN;AAED,uCAAuC;AACvC,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,aAAa,EAAE,GAAG,EAAE,aAAa,GAAG,IAAI,CAgB/E;AAED;;sDAEsD;AACtD,wBAAgB,2BAA2B,CAAC,GAAG,EAAE,aAAa,EAAE,GAAG,EAAE,aAAa,EAAE,MAAM,EAAE,MAAM,GAAG,MAAM,CAI1G"}
package/dist/sid.js ADDED
@@ -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/SID.c — SID emulation engine core.
4
+ // (c) Hermit (Mihaly Horvath), license: WTF ("do what the frick you want").
5
+ import { CRMemAddresses } from './c64types.js';
6
+ import { cRSID_emulateHQwaves } from './sidoscwaves.js';
7
+ import { cRSID_emulateHQresampledSIDoutputStage } from './sidoutputs.js';
8
+ /** cRSID_getSIDbase (SID.c:6-8). */
9
+ export function cRSID_getSIDbase(sidNumber) {
10
+ return cRSID_C64ref().SID[sidNumber].BaseAddress;
11
+ }
12
+ /** cRSID_getSIDmodel (SID.c:10-12). */
13
+ export function cRSID_getSIDmodel(sidNumber) {
14
+ return cRSID_C64ref().SID[sidNumber].ChipModel;
15
+ }
16
+ /** cRSID_setSIDmodel (SID.c:13-15). */
17
+ export function cRSID_setSIDmodel(C64, sidNumber, value) {
18
+ return (C64.SID[sidNumber].ChipModel = value);
19
+ }
20
+ /** cRSID_getSIDchannel (SID.c:17-19) — channel in stereo field
21
+ * (left/right/middle). */
22
+ export function cRSID_getSIDchannel(sidNumber) {
23
+ return cRSID_C64ref().SID[sidNumber].Channel;
24
+ }
25
+ /** cRSID_getSIDlevel (SID.c:21-23). */
26
+ export function cRSID_getSIDlevel(sidNumber) {
27
+ return cRSID_C64ref().SID[sidNumber].Level;
28
+ }
29
+ /** Private-global access helper for the read-only getters above
30
+ * (C reads the file-global cRSID_C64 directly). */
31
+ import { cRSID_C64 } from './instance.js';
32
+ function cRSID_C64ref() {
33
+ return cRSID_C64;
34
+ }
35
+ /** cRSID_createSIDchip (SID.c:25-39). */
36
+ export function cRSID_createSIDchip(C64, SID, model, channel, baseaddress) {
37
+ SID.ChipModel = model;
38
+ SID.Channel = channel;
39
+ if (baseaddress >= 0xd400 && (baseaddress < 0xd800 || (0xde00 <= baseaddress && baseaddress <= 0xdfe0))) {
40
+ // check valid address, avoid Color-RAM
41
+ SID.BaseAddress = baseaddress;
42
+ SID.BasePtr = baseaddress;
43
+ SID.BasePtrRD = baseaddress;
44
+ }
45
+ else {
46
+ SID.BaseAddress = 0x0000;
47
+ SID.BasePtr = CRMemAddresses.CRSID_SID_SAFE_ADDRESS;
48
+ SID.BasePtrRD = CRMemAddresses.CRSID_SID_SAFE_ADDRESS;
49
+ } // NULL-ing not preferred as it can cause Segfault in sample-thread
50
+ cRSID_initSIDchip(C64, SID); // (and guarding against NULL BasePtr would take some precious cycles in SID-emulation functions)
51
+ }
52
+ /** cRSID_initSIDchip (SID.c:41-56). */
53
+ export function cRSID_initSIDchip(_C64, SID) {
54
+ for (let Channel = 0; Channel < 21; Channel += 7) {
55
+ SID.ADSRstate[Channel] = 0;
56
+ SID.RateCounter[Channel] = 0;
57
+ SID.EnvelopeCounter[Channel] = 0;
58
+ SID.ExponentCounter[Channel] = 0;
59
+ SID.PhaseAccu[Channel] = 0;
60
+ SID.PrevPhaseAccu[Channel] = 0;
61
+ SID.NoiseLFSR[Channel] = 0x7fffff;
62
+ SID.PrevWavGenOut[Channel] = 0;
63
+ SID.PrevWavData[Channel] = 0;
64
+ SID.PrevSounDemonDigiWF[Channel] = 0x00;
65
+ }
66
+ SID.SyncSourceMSBrise = 0;
67
+ SID.RingSourceMSB = 0;
68
+ SID.PrevLowPass = SID.PrevBandPass = SID.PrevVolume = 0;
69
+ }
70
+ /** cRSID_emulateHQresampledSID (SID.c:58-64).
71
+ * ('Paused' segfault-guard comment omitted: the TS port has no audio-thread
72
+ * race; see the C source for the original guard.) */
73
+ export function cRSID_emulateHQresampledSID(C64, SID, cycles) {
74
+ const waves = cRSID_emulateHQwaves(C64, SID, cycles);
75
+ SID.Output = cRSID_emulateHQresampledSIDoutputStage(C64, SID, waves); // * SID->Volume;
76
+ return SID.Output;
77
+ }
78
+ //# sourceMappingURL=sid.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sid.js","sourceRoot":"","sources":["../src/sid.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,9 @@
1
+ import type { CRC64instance, CRSIDinstance } from './c64types.js';
2
+ /** cRSID_ADSR_DAC_6581 (SID_ADSR.c:3-19) — used at output of ADSR envelope
3
+ * generator (not used for wave-generator because of 8bit-only resolution). */
4
+ export declare const cRSID_ADSR_DAC_6581: Uint8Array;
5
+ /** cRSID_emulateADSRs (SID_ADSR.c:51-89).
6
+ * C uses function-static PrevGate/AD/SR variables; they are write-before-read
7
+ * in every call so they are locals here (same semantics, no cross-call state). */
8
+ export declare function cRSID_emulateADSRs(_C64: CRC64instance, SID: CRSIDinstance, cycles: number): void;
9
+ //# sourceMappingURL=sidadsr.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sidadsr.d.ts","sourceRoot":"","sources":["../src/sidadsr.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,aAAa,EAAE,aAAa,EAAE,MAAM,eAAe,CAAC;AAGlE;+EAC+E;AAC/E,eAAO,MAAM,mBAAmB,EAAE,UAiBhC,CAAC;AA8BH;;mFAEmF;AACnF,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,aAAa,EAAE,GAAG,EAAE,aAAa,EAAE,MAAM,EAAE,MAAM,GAAG,IAAI,CAkDhG"}
@@ -0,0 +1,105 @@
1
+ // SPDX-License-Identifier: BSD-3-Clause
2
+ // Copyright (c) 2026 Bitti09 — modplayjs contributors
3
+ // Ported from: cRSID 1.58 libcRSID/C64/SID_ADSR.c — ADSR envelope emulation.
4
+ // (c) Hermit (Mihaly Horvath), license: WTF ("do what the frick you want").
5
+ import { cRSID_C64 } from './instance.js';
6
+ /** cRSID_ADSR_DAC_6581 (SID_ADSR.c:3-19) — used at output of ADSR envelope
7
+ * generator (not used for wave-generator because of 8bit-only resolution). */
8
+ export const cRSID_ADSR_DAC_6581 = new Uint8Array([
9
+ 0x00, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x09, 0x09, 0x0b, 0x0b, 0x0d, 0x0d, 0x0f, 0x10, 0x12,
10
+ 0x11, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18, 0x1a, 0x1a, 0x1c, 0x1c, 0x1e, 0x1e, 0x20, 0x21, 0x23,
11
+ 0x21, 0x23, 0x24, 0x25, 0x26, 0x27, 0x28, 0x2a, 0x2a, 0x2c, 0x2c, 0x2e, 0x2e, 0x30, 0x31, 0x33,
12
+ 0x32, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x3b, 0x3b, 0x3d, 0x3d, 0x3f, 0x3f, 0x41, 0x42, 0x44,
13
+ 0x40, 0x42, 0x42, 0x44, 0x44, 0x46, 0x47, 0x49, 0x49, 0x4a, 0x4b, 0x4d, 0x4d, 0x4f, 0x50, 0x52,
14
+ 0x51, 0x53, 0x53, 0x55, 0x55, 0x57, 0x58, 0x5a, 0x5a, 0x5b, 0x5c, 0x5e, 0x5e, 0x60, 0x61, 0x63,
15
+ 0x61, 0x62, 0x63, 0x65, 0x65, 0x67, 0x68, 0x6a, 0x69, 0x6b, 0x6c, 0x6e, 0x6e, 0x70, 0x71, 0x73,
16
+ 0x72, 0x73, 0x74, 0x76, 0x76, 0x78, 0x79, 0x7b, 0x7a, 0x7c, 0x7d, 0x7f, 0x7f, 0x81, 0x82, 0x84,
17
+ 0x7b, 0x7d, 0x7e, 0x80, 0x80, 0x82, 0x83, 0x85, 0x84, 0x86, 0x87, 0x89, 0x89, 0x8b, 0x8c, 0x8d,
18
+ 0x8c, 0x8e, 0x8f, 0x91, 0x91, 0x93, 0x94, 0x96, 0x95, 0x97, 0x98, 0x9a, 0x9a, 0x9c, 0x9d, 0x9e,
19
+ 0x9c, 0x9e, 0x9f, 0xa1, 0xa1, 0xa3, 0xa4, 0xa5, 0xa5, 0xa7, 0xa8, 0xaa, 0xaa, 0xac, 0xac, 0xae,
20
+ 0xad, 0xaf, 0xb0, 0xb2, 0xb2, 0xb4, 0xb5, 0xb6, 0xb6, 0xb8, 0xb9, 0xbb, 0xbb, 0xbd, 0xbd, 0xbf,
21
+ 0xbb, 0xbd, 0xbe, 0xc0, 0xc0, 0xc2, 0xc2, 0xc4, 0xc4, 0xc6, 0xc7, 0xc8, 0xc9, 0xca, 0xcb, 0xcd,
22
+ 0xcc, 0xce, 0xcf, 0xd1, 0xd1, 0xd3, 0xd3, 0xd5, 0xd5, 0xd7, 0xd8, 0xd9, 0xda, 0xdb, 0xdc, 0xde,
23
+ 0xdc, 0xde, 0xdf, 0xe1, 0xe1, 0xe3, 0xe3, 0xe5, 0xe5, 0xe7, 0xe8, 0xe9, 0xea, 0xeb, 0xec, 0xee,
24
+ 0xed, 0xef, 0xf0, 0xf2, 0xf2, 0xf4, 0xf4, 0xf6, 0xf6, 0xf8, 0xf9, 0xfa, 0xfb, 0xfc, 0xfd, 0xff,
25
+ ]);
26
+ // Specs (SID_ADSR.c:22-27)
27
+ const SID_CHANNEL_SPACING = 7;
28
+ const SID_CHANNEL_COUNT = 3;
29
+ const CHANNEL2_INDEX = 2 * SID_CHANNEL_SPACING;
30
+ const SID_CHANNELS_RANGE = SID_CHANNEL_SPACING * SID_CHANNEL_COUNT;
31
+ void SID_CHANNEL_COUNT;
32
+ void CHANNEL2_INDEX;
33
+ // ADSRstateBits (SID_ADSR.c:28)
34
+ const GATE_BITVAL = 0x01, ATTACK_BITVAL = 0x80, DECAYSUSTAIN_BITVAL = 0x40, HOLDZEROn_BITVAL = 0x10;
35
+ /** ADSRprescalePeriods (SID_ADSR.c:30-33). */
36
+ const ADSRprescalePeriods = new Int16Array([
37
+ 9, 32, 63, 95, 149, 220, 267, 313, 392, 977, 1954, 3126, 3907, 11720, 19532, 31251,
38
+ ]);
39
+ /** ADSRexponentPeriods (SID_ADSR.c:34-49) — pos0:1 pos6:30 pos14:16 pos26:8
40
+ * pos54:4 pos93:2. Regenerated mechanically from the C source (256 entries). */
41
+ const ADSRexponentPeriods = new Uint8Array([
42
+ 1, 30, 30, 30, 30, 30, 30, 16, 16, 16, 16, 16, 16, 16, 16, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 4, 4, 4, 4, 4,
43
+ 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 2, 2, 2, 2, 2, 2, 2, 2, 2,
44
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 1, 1,
45
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
46
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
47
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
48
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
49
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
50
+ ]);
51
+ /** cRSID_emulateADSRs (SID_ADSR.c:51-89).
52
+ * C uses function-static PrevGate/AD/SR variables; they are write-before-read
53
+ * in every call so they are locals here (same semantics, no cross-call state). */
54
+ export function cRSID_emulateADSRs(_C64, SID, cycles) {
55
+ const W = cRSID_C64.IObankWR;
56
+ for (let Channel = 0; Channel < SID_CHANNELS_RANGE; Channel += SID_CHANNEL_SPACING) {
57
+ const ChannelPtr = SID.BasePtr + Channel;
58
+ const AD = W[ChannelPtr + 5];
59
+ const SR = W[ChannelPtr + 6];
60
+ const ADSRstatePtr = Channel;
61
+ const RateCounterPtr = Channel;
62
+ const EnvelopeCounterPtr = Channel;
63
+ const ExponentCounterPtr = Channel;
64
+ const PrevGate = SID.ADSRstate[ADSRstatePtr] & GATE_BITVAL;
65
+ if (PrevGate !== (W[ChannelPtr + 4] & GATE_BITVAL)) {
66
+ // gatebit-change?
67
+ if (PrevGate)
68
+ SID.ADSRstate[ADSRstatePtr] &= ~(GATE_BITVAL | ATTACK_BITVAL | DECAYSUSTAIN_BITVAL); // falling edge
69
+ else
70
+ SID.ADSRstate[ADSRstatePtr] = GATE_BITVAL | ATTACK_BITVAL | DECAYSUSTAIN_BITVAL | HOLDZEROn_BITVAL; // rising edge
71
+ }
72
+ let PrescalePeriod;
73
+ if (SID.ADSRstate[ADSRstatePtr] & ATTACK_BITVAL)
74
+ PrescalePeriod = ADSRprescalePeriods[AD >> 4];
75
+ else if (SID.ADSRstate[ADSRstatePtr] & DECAYSUSTAIN_BITVAL)
76
+ PrescalePeriod = ADSRprescalePeriods[AD & 0x0f];
77
+ else
78
+ PrescalePeriod = ADSRprescalePeriods[SR & 0x0f];
79
+ SID.RateCounter[RateCounterPtr] += cycles;
80
+ if (SID.RateCounter[RateCounterPtr] >= 0x8000)
81
+ SID.RateCounter[RateCounterPtr] -= 0x8000; // can wrap around (ADSR delay-bug: short 1st frame)
82
+ if (PrescalePeriod <= SID.RateCounter[RateCounterPtr] && SID.RateCounter[RateCounterPtr] < PrescalePeriod + cycles) {
83
+ // ratecounter shot (matches rateperiod) (in genuine SID ratecounter is LFSR)
84
+ SID.RateCounter[RateCounterPtr] -= PrescalePeriod; // reset rate-counter on period-match
85
+ if ((SID.ADSRstate[ADSRstatePtr] & ATTACK_BITVAL) ||
86
+ ++SID.ExponentCounter[ExponentCounterPtr] === ADSRexponentPeriods[SID.EnvelopeCounter[EnvelopeCounterPtr]]) {
87
+ SID.ExponentCounter[ExponentCounterPtr] = 0;
88
+ if (SID.ADSRstate[ADSRstatePtr] & HOLDZEROn_BITVAL) {
89
+ if (SID.ADSRstate[ADSRstatePtr] & ATTACK_BITVAL) {
90
+ ++SID.EnvelopeCounter[EnvelopeCounterPtr];
91
+ if (SID.EnvelopeCounter[EnvelopeCounterPtr] === 0xff)
92
+ SID.ADSRstate[ADSRstatePtr] &= ~ATTACK_BITVAL;
93
+ }
94
+ else if (!(SID.ADSRstate[ADSRstatePtr] & DECAYSUSTAIN_BITVAL) ||
95
+ SID.EnvelopeCounter[EnvelopeCounterPtr] !== (SR & 0xf0) + (SR >> 4)) {
96
+ --SID.EnvelopeCounter[EnvelopeCounterPtr]; // resid adds 1 cycle delay, we omit that mechanism here
97
+ if (SID.EnvelopeCounter[EnvelopeCounterPtr] === 0)
98
+ SID.ADSRstate[ADSRstatePtr] &= ~HOLDZEROn_BITVAL;
99
+ }
100
+ }
101
+ }
102
+ }
103
+ }
104
+ }
105
+ //# sourceMappingURL=sidadsr.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sidadsr.js","sourceRoot":"","sources":["../src/sidadsr.ts"],"names":[],"mappings":"AAAA,wCAAwC;AACxC,sDAAsD;AACtD,6EAA6E;AAC7E,4EAA4E;AAG5E,OAAO,EAAE,SAAS,EAAE,MAAM,eAAe,CAAC;AAE1C;+EAC+E;AAC/E,MAAM,CAAC,MAAM,mBAAmB,GAAe,IAAI,UAAU,CAAC;IAC5D,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI;IAC9F,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI;IAC9F,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI;IAC9F,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI;IAC9F,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI;IAC9F,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI;IAC9F,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI;IAC9F,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI;IAC9F,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI;IAC9F,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI;IAC9F,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI;IAC9F,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI;IAC9F,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI;IAC9F,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI;IAC9F,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI;IAC9F,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI;CAC/F,CAAC,CAAC;AAEH,2BAA2B;AAC3B,MAAM,mBAAmB,GAAG,CAAC,CAAC;AAC9B,MAAM,iBAAiB,GAAG,CAAC,CAAC;AAC5B,MAAM,cAAc,GAAG,CAAC,GAAG,mBAAmB,CAAC;AAC/C,MAAM,kBAAkB,GAAG,mBAAmB,GAAG,iBAAiB,CAAC;AACnE,KAAK,iBAAiB,CAAC;AAAC,KAAK,cAAc,CAAC;AAE5C,gCAAgC;AAChC,MAAM,WAAW,GAAG,IAAI,EAAE,aAAa,GAAG,IAAI,EAAE,mBAAmB,GAAG,IAAI,EAAE,gBAAgB,GAAG,IAAI,CAAC;AAEpG,8CAA8C;AAC9C,MAAM,mBAAmB,GAAe,IAAI,UAAU,CAAC;IACrD,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK;CACnF,CAAC,CAAC;AAEH;iFACiF;AACjF,MAAM,mBAAmB,GAAe,IAAI,UAAU,CAAC;IACrD,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC;IAC5G,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC;IAC9F,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC;IAC9F,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC;IAC9F,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAA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"}
@@ -0,0 +1,15 @@
1
+ import type { CRC64instance, CRSIDinstance, CRSIDwavOutput } from './c64types.js';
2
+ /**
3
+ * cRSID_emulateSID_light (SID_OscWaves.c:37-260) — lightweight (samplerate-
4
+ * paced) oscillator + waveform generation; calls the output stage at the end
5
+ * and returns the SID's master output.
6
+ *
7
+ * C static locals TestBit/Envelope/Steepness/PulsePeak are
8
+ * write-before-read per use — locals here (same semantics).
9
+ */
10
+ export declare function cRSID_emulateSID_light(C64: CRC64instance, SID: CRSIDinstance): number;
11
+ /** cRSID_emulateHQwaves (SID_OscWaves.c:281-445).
12
+ * C static locals TestBit/Envelope/SIDwavOutput are write-before-read per
13
+ * call — SIDwavOutput is returned, TestBit/Envelope are locals here. */
14
+ export declare function cRSID_emulateHQwaves(C64: CRC64instance, SID: CRSIDinstance, cycles: number): CRSIDwavOutput;
15
+ //# sourceMappingURL=sidoscwaves.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sidoscwaves.d.ts","sourceRoot":"","sources":["../src/sidoscwaves.ts"],"names":[],"mappings":"AAQA,OAAO,KAAK,EAAE,aAAa,EAAE,aAAa,EAAE,cAAc,EAAE,MAAM,eAAe,CAAC;AAmGlF;;;;;;;GAOG;AACH,wBAAgB,sBAAsB,CAAC,GAAG,EAAE,aAAa,EAAE,GAAG,EAAE,aAAa,GAAG,MAAM,CA4LrF;AAyCD;;yEAEyE;AACzE,wBAAgB,oBAAoB,CAAC,GAAG,EAAE,aAAa,EAAE,GAAG,EAAE,aAAa,EAAE,MAAM,EAAE,MAAM,GAAG,cAAc,CAiK3G"}