@modplayjs/fmt-sid 0.0.0-stage → 0.2.1

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,560 @@
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 — mono/stereo/narrow
4
+ // routing of the SID chips' outputs at the three emulation quality levels,
5
+ // plus the PSID $D4xx digi player.
6
+ // (c) Hermit (Mihaly Horvath), license: WTF ("do what the frick you want").
7
+ /** C integer division (truncates toward zero; JS `/` is not integer and
8
+ * `Math.floor` rounds down — not the same for negative operands). */
9
+ function divTrunc(a, b) {
10
+ return Math.trunc(a / b);
11
+ }
12
+ import { CRSpecC64, CRChannel, CRAudioLevels, CRSID_BYTE_LOG2, } from './c64types.js';
13
+ import { CRSID_RESAMPLER_SINCWINDOW_PERIODS, CRSID_RESAMPLER_SINCPERIOD_SAMPLES, CRSID_RESAMPLER_SINCWINDOW_MAGNITUDE, } from './config.js';
14
+ import { SincWindow } from './sincwindow.js';
15
+ import { cRSID_emulateSID_light, cRSID_emulateHQwaves } from './sidoscwaves.js';
16
+ import { cRSID_emulateSIDoutputStage, cRSID_precalculateHQoutputParameters, cRSID_emulateHQresampledSIDdigi, } from './sidoutputs.js';
17
+ import { cRSID_emulateHQresampledSID } from './sid.js';
18
+ // ---------------------------------------------------------------------------
19
+ // cRSID_emulateLightSIDs (C64_SIDrouting.c:4-82) — lightweight (all at
20
+ // samplerate-pace) SID-emulations: oscillators, waveforms, filter and
21
+ // complete output stages
22
+ // ---------------------------------------------------------------------------
23
+ export function cRSID_emulateLightSIDs(C64) {
24
+ let Tmp, Tmp2;
25
+ const Output = { L: 0, R: 0 };
26
+ switch (C64.Stereo) {
27
+ case 0 /* CRSID_CHANNELMODE_MONO */: {
28
+ Output.L = cRSID_emulateSID_light(C64, C64.SID[1]);
29
+ if (C64.SID[2].BaseAddress !== 0)
30
+ Output.L += cRSID_emulateSID_light(C64, C64.SID[2]);
31
+ if (C64.SID[3].BaseAddress !== 0)
32
+ Output.L += cRSID_emulateSID_light(C64, C64.SID[3]);
33
+ if (C64.SID[4].BaseAddress !== 0)
34
+ Output.L += cRSID_emulateSID_light(C64, C64.SID[4]);
35
+ Output.R = Output.L = divTrunc(Output.L, C64.Attenuation);
36
+ break;
37
+ }
38
+ case 1 /* CRSID_CHANNELMODE_STEREO */: {
39
+ Tmp = cRSID_emulateSID_light(C64, C64.SID[1]);
40
+ if (C64.SID[1].Channel === CRChannel.CRSID_CHANNEL_LEFT) {
41
+ Output.L = Tmp * 2;
42
+ Output.R = 0;
43
+ }
44
+ else if (C64.SID[1].Channel === CRChannel.CRSID_CHANNEL_RIGHT) {
45
+ Output.R = Tmp * 2;
46
+ Output.L = 0;
47
+ }
48
+ else
49
+ Output.L = Output.R = Tmp;
50
+ if (C64.SID[2].BaseAddress !== 0) {
51
+ Tmp = cRSID_emulateSID_light(C64, C64.SID[2]);
52
+ if (C64.SID[2].Channel === CRChannel.CRSID_CHANNEL_LEFT)
53
+ Output.L += Tmp * 2;
54
+ else if (C64.SID[2].Channel === CRChannel.CRSID_CHANNEL_RIGHT)
55
+ Output.R += Tmp * 2;
56
+ else {
57
+ Output.L += Tmp;
58
+ Output.R += Tmp;
59
+ }
60
+ }
61
+ if (C64.SID[3].BaseAddress !== 0) {
62
+ Tmp = cRSID_emulateSID_light(C64, C64.SID[3]);
63
+ if (C64.SID[3].Channel === CRChannel.CRSID_CHANNEL_LEFT)
64
+ Output.L += Tmp * 2;
65
+ else if (C64.SID[3].Channel === CRChannel.CRSID_CHANNEL_RIGHT)
66
+ Output.R += Tmp * 2;
67
+ else {
68
+ Output.L += Tmp;
69
+ Output.R += Tmp;
70
+ }
71
+ }
72
+ if (C64.SID[4].BaseAddress !== 0) {
73
+ Tmp = cRSID_emulateSID_light(C64, C64.SID[4]);
74
+ if (C64.SID[4].Channel === CRChannel.CRSID_CHANNEL_LEFT)
75
+ Output.L += Tmp * 2;
76
+ else if (C64.SID[4].Channel === CRChannel.CRSID_CHANNEL_RIGHT)
77
+ Output.R += Tmp * 2;
78
+ else {
79
+ Output.L += Tmp;
80
+ Output.R += Tmp;
81
+ }
82
+ }
83
+ Output.L = divTrunc(Output.L, C64.Attenuation);
84
+ Output.R = divTrunc(Output.R, C64.Attenuation);
85
+ break;
86
+ }
87
+ default /* CRSID_CHANNELMODE_NARROW (3) */: {
88
+ Tmp = cRSID_emulateSID_light(C64, C64.SID[1]);
89
+ if (C64.SID[1].Channel === CRChannel.CRSID_CHANNEL_LEFT) {
90
+ Tmp2 = Tmp >> CRChannel.CRSID_CHANNELPANNING_DIVSHIFTS;
91
+ Output.L = Tmp + Tmp2;
92
+ Output.R = Tmp - Tmp2;
93
+ }
94
+ else if (C64.SID[1].Channel === CRChannel.CRSID_CHANNEL_RIGHT) {
95
+ Tmp2 = Tmp >> CRChannel.CRSID_CHANNELPANNING_DIVSHIFTS;
96
+ Output.R = Tmp + Tmp2;
97
+ Output.L = Tmp - Tmp2;
98
+ }
99
+ else
100
+ Output.L = Output.R = Tmp;
101
+ if (C64.SID[2].BaseAddress !== 0) {
102
+ Tmp = cRSID_emulateSID_light(C64, C64.SID[2]);
103
+ if (C64.SID[2].Channel === CRChannel.CRSID_CHANNEL_LEFT) {
104
+ Tmp2 = Tmp >> CRChannel.CRSID_CHANNELPANNING_DIVSHIFTS;
105
+ Output.L += Tmp + Tmp2;
106
+ Output.R += Tmp - Tmp2;
107
+ }
108
+ else if (C64.SID[2].Channel === CRChannel.CRSID_CHANNEL_RIGHT) {
109
+ Tmp2 = Tmp >> CRChannel.CRSID_CHANNELPANNING_DIVSHIFTS;
110
+ Output.R += Tmp + Tmp2;
111
+ Output.L += Tmp - Tmp2;
112
+ }
113
+ else {
114
+ Output.L += Tmp;
115
+ Output.R += Tmp;
116
+ }
117
+ }
118
+ if (C64.SID[3].BaseAddress !== 0) {
119
+ Tmp = cRSID_emulateSID_light(C64, C64.SID[3]);
120
+ if (C64.SID[3].Channel === CRChannel.CRSID_CHANNEL_LEFT) {
121
+ Tmp2 = Tmp >> CRChannel.CRSID_CHANNELPANNING_DIVSHIFTS;
122
+ Output.L += Tmp + Tmp2;
123
+ Output.R += Tmp - Tmp2;
124
+ }
125
+ else if (C64.SID[3].Channel === CRChannel.CRSID_CHANNEL_RIGHT) {
126
+ Tmp2 = Tmp >> CRChannel.CRSID_CHANNELPANNING_DIVSHIFTS;
127
+ Output.R += Tmp + Tmp2;
128
+ Output.L += Tmp - Tmp2;
129
+ }
130
+ else {
131
+ Output.L += Tmp;
132
+ Output.R += Tmp;
133
+ }
134
+ }
135
+ if (C64.SID[4].BaseAddress !== 0) {
136
+ Tmp = cRSID_emulateSID_light(C64, C64.SID[4]);
137
+ if (C64.SID[4].Channel === CRChannel.CRSID_CHANNEL_LEFT) {
138
+ Tmp2 = Tmp >> CRChannel.CRSID_CHANNELPANNING_DIVSHIFTS;
139
+ Output.L += Tmp + Tmp2;
140
+ Output.R += Tmp - Tmp2;
141
+ }
142
+ else if (C64.SID[4].Channel === CRChannel.CRSID_CHANNEL_RIGHT) {
143
+ Tmp2 = Tmp >> CRChannel.CRSID_CHANNELPANNING_DIVSHIFTS;
144
+ Output.R += Tmp + Tmp2;
145
+ Output.L += Tmp - Tmp2;
146
+ }
147
+ else {
148
+ Output.L += Tmp;
149
+ Output.R += Tmp;
150
+ }
151
+ }
152
+ Output.L = divTrunc(Output.L, C64.Attenuation);
153
+ Output.R = divTrunc(Output.R, C64.Attenuation);
154
+ break;
155
+ }
156
+ }
157
+ return Output;
158
+ }
159
+ // ---------------------------------------------------------------------------
160
+ // cRSID_emulateOversampledSIDwaves (C64_SIDrouting.c:84-171) — averaging
161
+ // oversampler, only oscillators & waveforms (called at samplerate-pace)
162
+ // ---------------------------------------------------------------------------
163
+ export function cRSID_emulateOversampledSIDwaves(C64) {
164
+ let HQsampleCount = 0;
165
+ let Temp;
166
+ let SIDwavOutput;
167
+ // 2-pole Chebyshev filter derivation: (C64_SIDrouting.c:86-110, comments)
168
+ // *** Resulting even more simplified formula: output += ( input + output * 3 - (prevoutput << 2) ) >> 3;
169
+ // C: static ints persist across calls; the four SID channels each keep a
170
+ // 2nd-order filter state that MUST persist. The TS port stores them on the
171
+ // instance via a scratch object (same lifetime as C's statics).
172
+ const st = getOversampleState(C64);
173
+ HQsampleCount = 0;
174
+ C64.SID[1].NonFiltedSample = C64.SID[1].FilterInputSample = 0;
175
+ C64.SID[2].NonFiltedSample = C64.SID[2].FilterInputSample = 0;
176
+ C64.SID[3].NonFiltedSample = C64.SID[3].FilterInputSample = 0;
177
+ C64.SID[4].NonFiltedSample = C64.SID[4].FilterInputSample = 0;
178
+ while (C64.OverSampleCycleCnt <= C64.SampleClockRatio) {
179
+ SIDwavOutput = cRSID_emulateHQwaves(C64, C64.SID[1], CRSpecC64.CRSID_OVERSAMPLING_CYCLES);
180
+ Temp = st.PrevNonFiltSample1;
181
+ st.PrevNonFiltSample1 = st.NonFiltSample1;
182
+ st.NonFiltSample1 += (SIDwavOutput.NonFilted + st.NonFiltSample1 * 3 - (Temp << 2)) >> 3;
183
+ Temp = st.PrevFiltSample1;
184
+ st.PrevFiltSample1 = st.FiltSample1;
185
+ st.FiltSample1 += (SIDwavOutput.FilterInput + st.FiltSample1 * 3 - (Temp << 2)) >> 3;
186
+ C64.SID[1].NonFiltedSample += st.NonFiltSample1;
187
+ C64.SID[1].FilterInputSample += st.FiltSample1;
188
+ // 2-pole Chebyshev-based fast integer-only fixed-point ~18kHz
189
+ // Nyquist/antialiasing-filters for all SIDs
190
+ if (C64.SID[2].BaseAddress !== 0) {
191
+ SIDwavOutput = cRSID_emulateHQwaves(C64, C64.SID[2], CRSpecC64.CRSID_OVERSAMPLING_CYCLES);
192
+ Temp = st.PrevNonFiltSample2;
193
+ st.PrevNonFiltSample2 = st.NonFiltSample2;
194
+ st.NonFiltSample2 += (SIDwavOutput.NonFilted + st.NonFiltSample2 * 3 - (Temp << 2)) >> 3;
195
+ Temp = st.PrevFiltSample2;
196
+ st.PrevFiltSample2 = st.FiltSample2;
197
+ st.FiltSample2 += (SIDwavOutput.FilterInput + st.FiltSample2 * 3 - (Temp << 2)) >> 3;
198
+ C64.SID[2].NonFiltedSample += st.NonFiltSample2;
199
+ C64.SID[2].FilterInputSample += st.FiltSample2; // SIDwavOutput.FilterInput;
200
+ }
201
+ if (C64.SID[3].BaseAddress !== 0) {
202
+ SIDwavOutput = cRSID_emulateHQwaves(C64, C64.SID[3], CRSpecC64.CRSID_OVERSAMPLING_CYCLES);
203
+ Temp = st.PrevNonFiltSample3;
204
+ st.PrevNonFiltSample3 = st.NonFiltSample3;
205
+ st.NonFiltSample3 += (SIDwavOutput.NonFilted + st.NonFiltSample3 * 3 - (Temp << 2)) >> 3;
206
+ Temp = st.PrevFiltSample3;
207
+ st.PrevFiltSample3 = st.FiltSample3;
208
+ st.FiltSample3 += (SIDwavOutput.FilterInput + st.FiltSample3 * 3 - (Temp << 2)) >> 3;
209
+ C64.SID[3].NonFiltedSample += st.NonFiltSample3;
210
+ C64.SID[3].FilterInputSample += st.FiltSample3; // SIDwavOutput.FilterInput;
211
+ }
212
+ if (C64.SID[4].BaseAddress !== 0) {
213
+ SIDwavOutput = cRSID_emulateHQwaves(C64, C64.SID[4], CRSpecC64.CRSID_OVERSAMPLING_CYCLES);
214
+ Temp = st.PrevNonFiltSample4;
215
+ st.PrevNonFiltSample4 = st.NonFiltSample4;
216
+ st.NonFiltSample4 += (SIDwavOutput.NonFilted + st.NonFiltSample4 * 3 - (Temp << 2)) >> 3;
217
+ Temp = st.PrevFiltSample4;
218
+ st.PrevFiltSample4 = st.FiltSample4;
219
+ st.FiltSample4 += (SIDwavOutput.FilterInput + st.FiltSample4 * 3 - (Temp << 2)) >> 3;
220
+ C64.SID[4].NonFiltedSample += st.NonFiltSample4;
221
+ C64.SID[4].FilterInputSample += st.FiltSample3; // SIDwavOutput.FilterInput; (sic — C uses FiltSample3 here, kept 1:1)
222
+ }
223
+ ++HQsampleCount;
224
+ C64.OverSampleCycleCnt += CRSpecC64.CRSID_OVERSAMPLING_CYCLES << CRSpecC64.CRSID_CLOCK_FRACTIONAL_BITS;
225
+ }
226
+ C64.OverSampleCycleCnt -= C64.SampleClockRatio;
227
+ // fast resampler - averaging of accumulated samples, decreases
228
+ // sound-aliasing further:
229
+ C64.SID[1].NonFiltedSample = divTrunc(C64.SID[1].NonFiltedSample, HQsampleCount);
230
+ C64.SID[1].FilterInputSample = divTrunc(C64.SID[1].FilterInputSample, HQsampleCount);
231
+ if (C64.SID[2].BaseAddress !== 0) {
232
+ C64.SID[2].NonFiltedSample = divTrunc(C64.SID[2].NonFiltedSample, HQsampleCount);
233
+ C64.SID[2].FilterInputSample = divTrunc(C64.SID[2].FilterInputSample, HQsampleCount);
234
+ }
235
+ if (C64.SID[3].BaseAddress !== 0) {
236
+ C64.SID[3].NonFiltedSample = divTrunc(C64.SID[3].NonFiltedSample, HQsampleCount);
237
+ C64.SID[3].FilterInputSample = divTrunc(C64.SID[3].FilterInputSample, HQsampleCount);
238
+ }
239
+ if (C64.SID[4].BaseAddress !== 0) {
240
+ C64.SID[4].NonFiltedSample = divTrunc(C64.SID[4].NonFiltedSample, HQsampleCount);
241
+ C64.SID[4].FilterInputSample = divTrunc(C64.SID[4].FilterInputSample, HQsampleCount);
242
+ }
243
+ }
244
+ const oversampleStates = new WeakMap();
245
+ function getOversampleState(C64) {
246
+ let st = oversampleStates.get(C64);
247
+ if (!st) {
248
+ st = {
249
+ NonFiltSample1: 0, FiltSample1: 0, PrevNonFiltSample1: 0, PrevFiltSample1: 0,
250
+ NonFiltSample2: 0, FiltSample2: 0, PrevNonFiltSample2: 0, PrevFiltSample2: 0,
251
+ NonFiltSample3: 0, FiltSample3: 0, PrevNonFiltSample3: 0, PrevFiltSample3: 0,
252
+ NonFiltSample4: 0, FiltSample4: 0, PrevNonFiltSample4: 0, PrevFiltSample4: 0,
253
+ };
254
+ oversampleStates.set(C64, st);
255
+ }
256
+ return st;
257
+ }
258
+ // ---------------------------------------------------------------------------
259
+ // cRSID_emulateOversampledSIDoutputs (C64_SIDrouting.c:173-259)
260
+ // ---------------------------------------------------------------------------
261
+ export function cRSID_emulateOversampledSIDoutputs(C64) {
262
+ let Tmp, Tmp2;
263
+ const Output = { L: 0, R: 0 };
264
+ switch (C64.Stereo) {
265
+ // if ( MOSTLY (cRSID_C64.Stereo==CRSID_CHANNELMODE_MONO ...) ) { //mono
266
+ case 0: {
267
+ Output.L = cRSID_emulateSIDoutputStage(C64, C64.SID[1]); // , cRSID_C64.HighQualityResampler );
268
+ if (C64.SID[2].BaseAddress !== 0)
269
+ Output.L += cRSID_emulateSIDoutputStage(C64, C64.SID[2]);
270
+ if (C64.SID[3].BaseAddress !== 0)
271
+ Output.L += cRSID_emulateSIDoutputStage(C64, C64.SID[3]);
272
+ if (C64.SID[4].BaseAddress !== 0)
273
+ Output.L += cRSID_emulateSIDoutputStage(C64, C64.SID[4]);
274
+ Output.R = Output.L = divTrunc(Output.L, C64.Attenuation);
275
+ break;
276
+ }
277
+ case 1: {
278
+ Tmp = cRSID_emulateSIDoutputStage(C64, C64.SID[1]);
279
+ if (C64.SID[1].Channel === CRChannel.CRSID_CHANNEL_LEFT) {
280
+ Output.L = Tmp * 2;
281
+ Output.R = 0;
282
+ }
283
+ else if (C64.SID[1].Channel === CRChannel.CRSID_CHANNEL_RIGHT) {
284
+ Output.R = Tmp * 2;
285
+ Output.L = 0;
286
+ }
287
+ else
288
+ Output.L = Output.R = Tmp;
289
+ if (C64.SID[2].BaseAddress !== 0) {
290
+ Tmp = cRSID_emulateSIDoutputStage(C64, C64.SID[2]);
291
+ if (C64.SID[2].Channel === CRChannel.CRSID_CHANNEL_LEFT)
292
+ Output.L += Tmp * 2;
293
+ else if (C64.SID[2].Channel === CRChannel.CRSID_CHANNEL_RIGHT)
294
+ Output.R += Tmp * 2;
295
+ else {
296
+ Output.L += Tmp;
297
+ Output.R += Tmp;
298
+ }
299
+ }
300
+ if (C64.SID[3].BaseAddress !== 0) {
301
+ Tmp = cRSID_emulateSIDoutputStage(C64, C64.SID[3]);
302
+ if (C64.SID[3].Channel === CRChannel.CRSID_CHANNEL_LEFT)
303
+ Output.L += Tmp * 2;
304
+ else if (C64.SID[3].Channel === CRChannel.CRSID_CHANNEL_RIGHT)
305
+ Output.R += Tmp * 2;
306
+ else {
307
+ Output.L += Tmp;
308
+ Output.R += Tmp;
309
+ }
310
+ }
311
+ if (C64.SID[4].BaseAddress !== 0) {
312
+ Tmp = cRSID_emulateSIDoutputStage(C64, C64.SID[4]);
313
+ if (C64.SID[4].Channel === CRChannel.CRSID_CHANNEL_LEFT)
314
+ Output.L += Tmp * 2;
315
+ else if (C64.SID[4].Channel === CRChannel.CRSID_CHANNEL_RIGHT)
316
+ Output.R += Tmp * 2;
317
+ else {
318
+ Output.L += Tmp;
319
+ Output.R += Tmp;
320
+ }
321
+ }
322
+ Output.L = divTrunc(Output.L, C64.Attenuation);
323
+ Output.R = divTrunc(Output.R, C64.Attenuation);
324
+ break;
325
+ }
326
+ default: {
327
+ // narrowed stereo (channels are closer to each other and the center)
328
+ Tmp = cRSID_emulateSIDoutputStage(C64, C64.SID[1]);
329
+ if (C64.SID[1].Channel === CRChannel.CRSID_CHANNEL_LEFT) {
330
+ Tmp2 = Tmp >> CRChannel.CRSID_CHANNELPANNING_DIVSHIFTS;
331
+ Output.L = Tmp + Tmp2;
332
+ Output.R = Tmp - Tmp2;
333
+ }
334
+ else if (C64.SID[1].Channel === CRChannel.CRSID_CHANNEL_RIGHT) {
335
+ Tmp2 = Tmp >> CRChannel.CRSID_CHANNELPANNING_DIVSHIFTS;
336
+ Output.R = Tmp + Tmp2;
337
+ Output.L = Tmp - Tmp2;
338
+ }
339
+ else
340
+ Output.L = Output.R = Tmp;
341
+ if (C64.SID[2].BaseAddress !== 0) {
342
+ Tmp = cRSID_emulateSIDoutputStage(C64, C64.SID[2]);
343
+ if (C64.SID[2].Channel === CRChannel.CRSID_CHANNEL_LEFT) {
344
+ Tmp2 = Tmp >> CRChannel.CRSID_CHANNELPANNING_DIVSHIFTS;
345
+ Output.L += Tmp + Tmp2;
346
+ Output.R += Tmp - Tmp2;
347
+ }
348
+ else if (C64.SID[2].Channel === CRChannel.CRSID_CHANNEL_RIGHT) {
349
+ Tmp2 = Tmp >> CRChannel.CRSID_CHANNELPANNING_DIVSHIFTS;
350
+ Output.R += Tmp + Tmp2;
351
+ Output.L += Tmp - Tmp2;
352
+ }
353
+ else {
354
+ Output.L += Tmp;
355
+ Output.R += Tmp;
356
+ }
357
+ }
358
+ if (C64.SID[3].BaseAddress !== 0) {
359
+ Tmp = cRSID_emulateSIDoutputStage(C64, C64.SID[3]);
360
+ if (C64.SID[3].Channel === CRChannel.CRSID_CHANNEL_LEFT) {
361
+ Tmp2 = Tmp >> CRChannel.CRSID_CHANNELPANNING_DIVSHIFTS;
362
+ Output.L += Tmp + Tmp2;
363
+ Output.R += Tmp - Tmp2;
364
+ }
365
+ else if (C64.SID[3].Channel === CRChannel.CRSID_CHANNEL_RIGHT) {
366
+ Tmp2 = Tmp >> CRChannel.CRSID_CHANNELPANNING_DIVSHIFTS;
367
+ Output.R += Tmp + Tmp2;
368
+ Output.L += Tmp - Tmp2;
369
+ }
370
+ else {
371
+ Output.L += Tmp;
372
+ Output.R += Tmp;
373
+ }
374
+ }
375
+ if (C64.SID[4].BaseAddress !== 0) {
376
+ Tmp = cRSID_emulateSIDoutputStage(C64, C64.SID[4]);
377
+ if (C64.SID[4].Channel === CRChannel.CRSID_CHANNEL_LEFT) {
378
+ Tmp2 = Tmp >> CRChannel.CRSID_CHANNELPANNING_DIVSHIFTS;
379
+ Output.L += Tmp + Tmp2;
380
+ Output.R += Tmp - Tmp2;
381
+ }
382
+ else if (C64.SID[4].Channel === CRChannel.CRSID_CHANNEL_RIGHT) {
383
+ Tmp2 = Tmp >> CRChannel.CRSID_CHANNELPANNING_DIVSHIFTS;
384
+ Output.R += Tmp + Tmp2;
385
+ Output.L += Tmp - Tmp2;
386
+ }
387
+ else {
388
+ Output.L += Tmp;
389
+ Output.R += Tmp;
390
+ }
391
+ }
392
+ Output.L = divTrunc(Output.L, C64.Attenuation);
393
+ Output.R = divTrunc(Output.R, C64.Attenuation);
394
+ break;
395
+ }
396
+ }
397
+ return Output;
398
+ }
399
+ // ---------------------------------------------------------------------------
400
+ // cRSID_emulateHQresampledSIDs (C64_SIDrouting.c:261-354) — oscillators,
401
+ // waveforms, filter and attenuation (main-volume) (called at samplerate-pace,
402
+ // but core at oversampled rate)
403
+ // ---------------------------------------------------------------------------
404
+ export function cRSID_emulateHQresampledSIDs(C64) {
405
+ // AudioResamplerParameters (C64_SIDrouting.c:263-283)
406
+ const FRACTIONAL_MUL = 1 << CRSpecC64.CRSID_RESAMPLER_FRACTIONAL_BITS; // 4096 $1000
407
+ const FRACTIONAL_AND = FRACTIONAL_MUL - 1; // 4095 $0FFF
408
+ const INTEGER_AND = -FRACTIONAL_MUL; // $F000
409
+ const RESAMPLEBUFFER_SIZE = 16; // entries
410
+ const RESAMPLEBUFFER_SIZE_MUL = RESAMPLEBUFFER_SIZE << CRSpecC64.CRSID_RESAMPLER_FRACTIONAL_BITS;
411
+ const SINCWINDOW_PERIODS = CRSID_RESAMPLER_SINCWINDOW_PERIODS; // 12, //half-sines
412
+ const SINCWINDOW_HALF1_LAST_PERIOD = SINCWINDOW_PERIODS / 2 - 1;
413
+ const SINCPERIOD_SAMPLES = CRSID_RESAMPLER_SINCPERIOD_SAMPLES; // 128, //entries
414
+ const SINCWINDOW_SIZE = SINCWINDOW_PERIODS * SINCPERIOD_SAMPLES; // 1536
415
+ const SINCPERIOD_BITS = CRSID_BYTE_LOG2(SINCPERIOD_SAMPLES); // 7, //log2(SINCPERIOD_SAMPLES)
416
+ const SINCPERIOD_BITS_REVERSE = CRSpecC64.CRSID_RESAMPLER_FRACTIONAL_BITS - SINCPERIOD_BITS;
417
+ const SINCWINDOW_MAGNITUDE = CRSID_RESAMPLER_SINCWINDOW_MAGNITUDE; // (1 << SINCWINDOW_RESOLUTION) //SINCWINDOW_VALUE_MAX = 2048
418
+ void CRAudioLevels;
419
+ let Tmp, Left, Right;
420
+ const Mono = C64.Stereo === 0 /* CRSID_CHANNELMODE_MONO */ ? 1 : 0;
421
+ let ResampleBufWritePos = 0;
422
+ const st = getResampleState(C64);
423
+ const { ResampleBufferL, ResampleBufferR } = st;
424
+ cRSID_precalculateHQoutputParameters(C64, C64.SID[1]);
425
+ if (C64.SID[2].BaseAddress !== 0)
426
+ cRSID_precalculateHQoutputParameters(C64, C64.SID[2]);
427
+ if (C64.SID[3].BaseAddress !== 0)
428
+ cRSID_precalculateHQoutputParameters(C64, C64.SID[3]);
429
+ if (C64.SID[4].BaseAddress !== 0)
430
+ cRSID_precalculateHQoutputParameters(C64, C64.SID[4]);
431
+ while (st.ResampleBufPos < st.NextResampleBufPos) {
432
+ ResampleBufWritePos = (st.ResampleBufPos >>> CRSpecC64.CRSID_RESAMPLER_FRACTIONAL_BITS) - SINCWINDOW_HALF1_LAST_PERIOD;
433
+ if (ResampleBufWritePos < 0)
434
+ ResampleBufWritePos += RESAMPLEBUFFER_SIZE;
435
+ const SincWindowPos0 = SINCPERIOD_SAMPLES - ((st.ResampleBufPos & FRACTIONAL_AND) >>> SINCPERIOD_BITS_REVERSE);
436
+ if (Mono) {
437
+ // mono
438
+ Left = cRSID_emulateHQresampledSID(C64, C64.SID[1], CRSpecC64.CRSID_OVERSAMPLING_CYCLES); // .Mix;
439
+ if (C64.SID[2].BaseAddress !== 0)
440
+ Left += cRSID_emulateHQresampledSID(C64, C64.SID[2], CRSpecC64.CRSID_OVERSAMPLING_CYCLES);
441
+ if (C64.SID[3].BaseAddress !== 0)
442
+ Left += cRSID_emulateHQresampledSID(C64, C64.SID[3], CRSpecC64.CRSID_OVERSAMPLING_CYCLES);
443
+ if (C64.SID[4].BaseAddress !== 0)
444
+ Left += cRSID_emulateHQresampledSID(C64, C64.SID[4], CRSpecC64.CRSID_OVERSAMPLING_CYCLES);
445
+ // Right = Left;
446
+ let SincWindowPos = SincWindowPos0;
447
+ while (SincWindowPos < SINCWINDOW_SIZE) {
448
+ // Resampling subsequent stereo samples to output-sample-buffer
449
+ ResampleBufferL[ResampleBufWritePos] += divTrunc(Left * SincWindow[SincWindowPos], SINCWINDOW_MAGNITUDE);
450
+ ++ResampleBufWritePos;
451
+ if (ResampleBufWritePos >= RESAMPLEBUFFER_SIZE)
452
+ ResampleBufWritePos = 0;
453
+ SincWindowPos += SINCPERIOD_SAMPLES;
454
+ }
455
+ }
456
+ else {
457
+ // stereo
458
+ Tmp = cRSID_emulateHQresampledSID(C64, C64.SID[1], CRSpecC64.CRSID_OVERSAMPLING_CYCLES);
459
+ if (C64.SID[1].Channel === CRChannel.CRSID_CHANNEL_LEFT) {
460
+ Left = Tmp * 2;
461
+ Right = 0;
462
+ }
463
+ else if (C64.SID[1].Channel === CRChannel.CRSID_CHANNEL_RIGHT) {
464
+ Right = Tmp * 2;
465
+ Left = 0;
466
+ }
467
+ else
468
+ Left = Right = Tmp;
469
+ if (C64.SID[2].BaseAddress !== 0) {
470
+ Tmp = cRSID_emulateHQresampledSID(C64, C64.SID[2], CRSpecC64.CRSID_OVERSAMPLING_CYCLES);
471
+ if (C64.SID[2].Channel === CRChannel.CRSID_CHANNEL_LEFT)
472
+ Left += Tmp * 2;
473
+ else if (C64.SID[2].Channel === CRChannel.CRSID_CHANNEL_RIGHT)
474
+ Right += Tmp * 2;
475
+ else {
476
+ Left += Tmp;
477
+ Right += Tmp;
478
+ }
479
+ }
480
+ if (C64.SID[3].BaseAddress !== 0) {
481
+ Tmp = cRSID_emulateHQresampledSID(C64, C64.SID[3], CRSpecC64.CRSID_OVERSAMPLING_CYCLES);
482
+ if (C64.SID[3].Channel === CRChannel.CRSID_CHANNEL_LEFT)
483
+ Left += Tmp * 2;
484
+ else if (C64.SID[3].Channel === CRChannel.CRSID_CHANNEL_RIGHT)
485
+ Right += Tmp * 2;
486
+ else {
487
+ Left += Tmp;
488
+ Right += Tmp;
489
+ }
490
+ }
491
+ if (C64.SID[4].BaseAddress !== 0) {
492
+ Tmp = cRSID_emulateHQresampledSID(C64, C64.SID[4], CRSpecC64.CRSID_OVERSAMPLING_CYCLES);
493
+ if (C64.SID[4].Channel === CRChannel.CRSID_CHANNEL_LEFT)
494
+ Left += Tmp * 2;
495
+ else if (C64.SID[4].Channel === CRChannel.CRSID_CHANNEL_RIGHT)
496
+ Right += Tmp * 2;
497
+ else {
498
+ Left += Tmp;
499
+ Right += Tmp;
500
+ }
501
+ }
502
+ let SincWindowPos = SincWindowPos0;
503
+ while (SincWindowPos < SINCWINDOW_SIZE) {
504
+ // Resampling subsequent stereo samples to output-sample-buffer
505
+ ResampleBufferL[ResampleBufWritePos] += divTrunc(Left * SincWindow[SincWindowPos], SINCWINDOW_MAGNITUDE);
506
+ ResampleBufferR[ResampleBufWritePos] += divTrunc(Right * SincWindow[SincWindowPos], SINCWINDOW_MAGNITUDE);
507
+ ++ResampleBufWritePos;
508
+ if (ResampleBufWritePos >= RESAMPLEBUFFER_SIZE)
509
+ ResampleBufWritePos = 0;
510
+ SincWindowPos += SINCPERIOD_SAMPLES;
511
+ }
512
+ }
513
+ st.ResampleBufPos += C64.OversampleClockRatio;
514
+ }
515
+ if (st.ResampleBufPos >= RESAMPLEBUFFER_SIZE_MUL)
516
+ st.ResampleBufPos -= RESAMPLEBUFFER_SIZE_MUL;
517
+ st.NextResampleBufPos = (st.ResampleBufPos & INTEGER_AND) + FRACTIONAL_MUL;
518
+ C64.ResampledOutput.L = divTrunc(ResampleBufferL[ResampleBufWritePos], C64.OversampleClockRatioReciproc);
519
+ ResampleBufferL[ResampleBufWritePos] = 0;
520
+ if (!Mono) {
521
+ // stereo
522
+ C64.ResampledOutput.R = divTrunc(ResampleBufferR[ResampleBufWritePos], C64.OversampleClockRatioReciproc);
523
+ ResampleBufferR[ResampleBufWritePos] = 0;
524
+ }
525
+ }
526
+ const resampleStates = new WeakMap();
527
+ function getResampleState(C64) {
528
+ let st = resampleStates.get(C64);
529
+ if (!st) {
530
+ st = {
531
+ ResampleBufPos: 0,
532
+ NextResampleBufPos: 1 << CRSpecC64.CRSID_RESAMPLER_FRACTIONAL_BITS,
533
+ ResampleBufferL: new Int32Array(16),
534
+ ResampleBufferR: new Int32Array(16),
535
+ };
536
+ resampleStates.set(C64, st);
537
+ }
538
+ return st;
539
+ }
540
+ // ---------------------------------------------------------------------------
541
+ // cRSID_emulateHQresampledSIDoutputs (C64_SIDrouting.c:356-375)
542
+ // ---------------------------------------------------------------------------
543
+ export function cRSID_emulateHQresampledSIDoutputs(C64) {
544
+ const Output = { L: 0, R: 0 };
545
+ cRSID_emulateHQresampledSIDdigi(C64, C64.SID[1], C64.ResampledOutput);
546
+ if (C64.SID[2].BaseAddress !== 0)
547
+ cRSID_emulateHQresampledSIDdigi(C64, C64.SID[2], C64.ResampledOutput);
548
+ if (C64.SID[3].BaseAddress !== 0)
549
+ cRSID_emulateHQresampledSIDdigi(C64, C64.SID[3], C64.ResampledOutput);
550
+ if (C64.SID[4].BaseAddress !== 0)
551
+ cRSID_emulateHQresampledSIDdigi(C64, C64.SID[4], C64.ResampledOutput);
552
+ Output.L = divTrunc(C64.ResampledOutput.L, C64.Attenuation);
553
+ Output.R =
554
+ C64.Stereo >= 1 /* CRSID_CHANNELMODE_STEREO */
555
+ ? divTrunc(C64.ResampledOutput.R, C64.Attenuation)
556
+ : Output.L;
557
+ return Output;
558
+ }
559
+ export { cRSID_playPSIDdigi } from './psiddigi.js';
560
+ //# sourceMappingURL=sidrouting.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sidrouting.js","sourceRoot":"","sources":["../src/sidrouting.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,8 @@
1
+ /** Remember the loaded tune for backwards-seek restarts (sidStartTune
2
+ * calls this through sidplugin). */
3
+ export declare function sidRememberTune(bytes: Uint8Array, header: import('./instance.js').CRSIDheader, subtune: number, rate: number): void;
4
+ /** Engine playback time in seconds (cRSID.PlayTime). */
5
+ export declare function getSidPlayTimeSeconds(): number;
6
+ /** Seek the engine to the given runtime in seconds. */
7
+ export declare function sidSeek(seconds: number): void;
8
+ //# sourceMappingURL=sidseek.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sidseek.d.ts","sourceRoot":"","sources":["../src/sidseek.ts"],"names":[],"mappings":"AAuBA;qCACqC;AACrC,wBAAgB,eAAe,CAAC,KAAK,EAAE,UAAU,EAAE,MAAM,EAAE,OAAO,eAAe,EAAE,WAAW,EAAE,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,IAAI,CAKnI;AAED,wDAAwD;AACxD,wBAAgB,qBAAqB,IAAI,MAAM,CAE9C;AAED,uDAAuD;AACvD,wBAAgB,OAAO,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAwB7C"}