@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,475 @@
1
+ // SPDX-License-Identifier: BSD-3-Clause
2
+ // Copyright (c) 2026 Bitti09 — modplayjs contributors
3
+ // Ported from: cRSID 1.58 libcRSID/C64/SID_OscWaves.c — SID oscillators and
4
+ // waveform generation (lightweight + high-quality/oversampled variants).
5
+ // (c) Hermit (Mihaly Horvath), license: WTF ("do what the frick you want").
6
+ import { CRSpecC64 } from './c64types.js';
7
+ import { CRAudioLevels } from './c64types.js';
8
+ import { cRSID_C64 } from './instance.js';
9
+ import { CRSID_SawTriangle, CRSID_PulseTriangle, CRSID_PulseSawtooth, CRSID_PulseSawTriangle } from './combiwaves.js';
10
+ // ---------------------------------------------------------------------------
11
+ // getPW / getCombinedPW / combinedWF (SID_OscWaves.c:5-35)
12
+ // ---------------------------------------------------------------------------
13
+ /** getPW (SID_OscWaves.c:5-8) — PW=0000..FFF0 from SID-register (000..FFF). */
14
+ function getPW(C64, channelptr) {
15
+ const W = C64.IObankWR;
16
+ return ((((W[channelptr + 3] & 0xf) << 8) | W[channelptr + 2]) << 4) >>> 0;
17
+ }
18
+ /** getCombinedPW (SID_OscWaves.c:10-13) — PW=000..FFF (range for
19
+ * combined-waveform lookup) from SID-register (000..FFF). */
20
+ function getCombinedPW(C64, channelptr) {
21
+ const W = C64.IObankWR;
22
+ return (((W[channelptr + 3] & 0xf) << 8) | W[channelptr + 2]) & 0xffff;
23
+ }
24
+ // Specs of combinedWF (SID_OscWaves.c:14-28)
25
+ const COMBINEDWF_SAMPLE_RESOLUTION = 12;
26
+ const COMBINEDWF_FILT_RESOLUTION = 16; // bits
27
+ const COMBINEDWF_WAVE_RESOLUTION_8 = 8; /* COMBINEDWF_WAVE_RESOLUTION */
28
+ const CRSID_WAVE_RESOLUTION = 16; // bits
29
+ const COMBINEDWF_OSC_MSB_OFF_MASK = (1 << (COMBINEDWF_SAMPLE_RESOLUTION - 1)) - 1; // 0x7FFF
30
+ const COMBINEDWF_FILTMUL_MAX = (1 << COMBINEDWF_FILT_RESOLUTION) - 1; // 0xFFFF
31
+ const COMBINEDWF_FILT_FRACTION_SHIFTS = 16;
32
+ const COMBINEDWF_WAVE_SHIFTS8 = CRSID_WAVE_RESOLUTION - COMBINEDWF_WAVE_RESOLUTION_8; // 8
33
+ /** combinedWF (SID_OscWaves.c:14-35). */
34
+ function combinedWF(C64, SID, WFarray, oscval, channel, channelptr) {
35
+ let Pitch;
36
+ let Filt;
37
+ if (SID.ChipModel === 6581 && WFarray !== CRSID_PulseTriangle)
38
+ oscval &= COMBINEDWF_OSC_MSB_OFF_MASK; // 0x7FF; //0x7FFF;
39
+ Pitch = C64.IObankWR[channelptr + 1] || 1; // avoid division by zero
40
+ Filt = 0x7777 + divTrunc(0x8888, Pitch);
41
+ SID.PrevWavData[channel] =
42
+ (WFarray[oscval] * Filt + SID.PrevWavData[channel] * (COMBINEDWF_FILTMUL_MAX - Filt)) >>
43
+ COMBINEDWF_FILT_FRACTION_SHIFTS; // 16;
44
+ return (SID.PrevWavData[channel] << COMBINEDWF_WAVE_SHIFTS8) >>> 0; // 8;
45
+ }
46
+ // ---------------------------------------------------------------------------
47
+ // cRSID_emulateSID_light (SID_OscWaves.c:37-260)
48
+ // ---------------------------------------------------------------------------
49
+ // WaveFormBits / ControlBits / FilterBits enums (SID_OscWaves.c:38-44)
50
+ const NOISE_BITVAL = 0x80, PULSE_BITVAL = 0x40, SAW_BITVAL = 0x20, TRI_BITVAL = 0x10;
51
+ const PULSAWTRI_VAL = 0x70, PULSAW_VAL = 0x60, PULTRI_VAL = 0x50, SAWTRI_VAL = 0x30;
52
+ const TEST_BITVAL = 0x08, RING_BITVAL = 0x04, SYNC_BITVAL = 0x02 /*, GATE_BITVAL = 0x01*/;
53
+ const OFF3_BITVAL = 0x80;
54
+ // Specs (SID_OscWaves.c:45-73)
55
+ const SID_CHANNEL_SPACING = 7;
56
+ const SID_CHANNEL_COUNT = 3;
57
+ const CHANNEL2_INDEX = 2 * SID_CHANNEL_SPACING;
58
+ const SID_CHANNELS_RANGE = SID_CHANNEL_SPACING * SID_CHANNEL_COUNT;
59
+ const SID_PHASEACCU_RESOLUTION = 24;
60
+ const OSC3_WAVE_RESOLUTION = 8; // bits
61
+ const PHASEACCU_SID__RANGE = 1 << SID_PHASEACCU_RESOLUTION; // 0x1000000, covers 24 bit value-range
62
+ const LRW_CR_CLOCK_FRAC = CRSpecC64.CRSID_CLOCK_FRACTIONAL_BITS;
63
+ const PHASEACCU_RANGE_L = Math.imul(PHASEACCU_SID__RANGE, 1 << LRW_CR_CLOCK_FRAC); // 0x10000000
64
+ const PHASEACCU_MAX_L = PHASEACCU_RANGE_L - 1;
65
+ const PHASEACCU_ANDMASK_L = PHASEACCU_MAX_L;
66
+ const PHASEACCU_MSB_BITVAL_L = Math.imul(PHASEACCU_SID__RANGE >> 1, 1 << LRW_CR_CLOCK_FRAC); // 0x8000000
67
+ const CRSID_WAVE_SHIFTS_L = SID_PHASEACCU_RESOLUTION - CRSID_WAVE_RESOLUTION + LRW_CR_CLOCK_FRAC; // 12
68
+ const CRSID_WAVE_RANGE = 1 << CRSID_WAVE_RESOLUTION;
69
+ const CRSID_WAVE_MAX = CRSID_WAVE_RANGE - 1; // 0xFFFF
70
+ const CRSID_WAVE_MASK = CRSID_WAVE_MAX;
71
+ const CRSID_WAVE_MID = CRSID_WAVE_RANGE / 2;
72
+ const CRSID_WAVE_MIN = 0x0000;
73
+ const SOUNDEMON_DIGI_SEEK_WAVEFORM = 0x01;
74
+ const SOUNDEMON_DIGI_RESOLUTION = 8;
75
+ const SOUNDEMON_DIGI_SHIFTS = CRSID_WAVE_RESOLUTION - SOUNDEMON_DIGI_RESOLUTION;
76
+ const SOUNDEMON_CARRIER_ELIMINATION_SAMPLECOUNT = 2; // 4,
77
+ const SID_NOISE_CLOCK_BITVAL = 0x100000;
78
+ const NOISE_CLOCK_L = Math.imul(SID_NOISE_CLOCK_BITVAL, 1 << LRW_CR_CLOCK_FRAC); // 0x1000000 — value of phaseaccu-bit clocking the Noise-LFSR
79
+ const COMBINEDWF_SAMPLE_SHIFTS_L = SID_PHASEACCU_RESOLUTION - COMBINEDWF_SAMPLE_RESOLUTION + LRW_CR_CLOCK_FRAC; // 16
80
+ const WAVE_OSC3_SHIFTS = CRSID_WAVE_RESOLUTION - OSC3_WAVE_RESOLUTION; // 8
81
+ const STEEPNESS_FRACTION_SHIFTS = 16;
82
+ const STEEPNESS_STEPLIMIT_L = Math.imul(256, 1 << LRW_CR_CLOCK_FRAC); // 4096 — high-pitch waveform anti-aliasing by frequency-dependent wave-edge steepness control
83
+ const SID_ENVELOPE_RESOLUTION = 8 /* bits */;
84
+ const SID_ENVELOPE_MAGNITUDE = 1 << SID_ENVELOPE_RESOLUTION; // 256
85
+ const ENVELOPE_MAGNITUDE_DIV = Math.imul(SID_ENVELOPE_MAGNITUDE, CRAudioLevels.CRSID_WAVGEN_PREDIV); // 256 * 1..16 = 256..4096
86
+ void CRSpecC64;
87
+ /** FilterSwitchVal (SID_OscWaves.c:75). */
88
+ const FilterSwitchVal = new Uint8Array([1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 4]);
89
+ /**
90
+ * cRSID_emulateSID_light (SID_OscWaves.c:37-260) — lightweight (samplerate-
91
+ * paced) oscillator + waveform generation; calls the output stage at the end
92
+ * and returns the SID's master output.
93
+ *
94
+ * C static locals TestBit/Envelope/Steepness/PulsePeak are
95
+ * write-before-read per use — locals here (same semantics).
96
+ */
97
+ export function cRSID_emulateSID_light(C64, SID) {
98
+ const W = C64.IObankWR;
99
+ const R = C64.IObankRD;
100
+ let TestBit = 0;
101
+ let Envelope = 0;
102
+ let Tmp;
103
+ let Feedback;
104
+ let Utmp = 0;
105
+ let WavGenOut = 0;
106
+ let PW = 0;
107
+ let PhaseAccuStep = 0;
108
+ let MSB = 0;
109
+ let Steepness = 0;
110
+ let PulsePeak = 0;
111
+ SID.NonFiltedSample = 0;
112
+ SID.FilterInputSample = 0;
113
+ const FilterSwitchReso = W[SID.BasePtr + 0x17];
114
+ const VolumeBand = W[SID.BasePtr + 0x18];
115
+ // Waveform generator (phase accumulator and waveform-selector)
116
+ for (let Channel = 0; Channel < SID_CHANNELS_RANGE; Channel += SID_CHANNEL_SPACING) {
117
+ const ChannelPtr = SID.BasePtr + Channel;
118
+ const WF = W[ChannelPtr + 4];
119
+ TestBit = (WF & TEST_BITVAL) !== 0 ? 1 : 0;
120
+ const PhaseAccuIdx = Channel;
121
+ PhaseAccuStep = Math.imul(((W[ChannelPtr + 1] << 8) | W[ChannelPtr + 0]) >>> 0, C64.SampleClockRatio) >>> 0; // SID->cRSID_C64.SampleClockRatio;
122
+ if (TestBit || ((WF & SYNC_BITVAL) !== 0 && SID.SyncSourceMSBrise))
123
+ SID.PhaseAccu[PhaseAccuIdx] = 0;
124
+ else {
125
+ // stepping phase-accumulator (oscillator)
126
+ SID.PhaseAccu[PhaseAccuIdx] += PhaseAccuStep;
127
+ if (SID.PhaseAccu[PhaseAccuIdx] >= PHASEACCU_RANGE_L)
128
+ SID.PhaseAccu[PhaseAccuIdx] -= PHASEACCU_RANGE_L; // 0x10000000
129
+ }
130
+ SID.PhaseAccu[PhaseAccuIdx] &= PHASEACCU_ANDMASK_L; // 0xFFFFFFF;
131
+ MSB = SID.PhaseAccu[PhaseAccuIdx] & PHASEACCU_MSB_BITVAL_L; // 0x8000000;
132
+ SID.SyncSourceMSBrise = MSB > (SID.PrevPhaseAccu[PhaseAccuIdx] & PHASEACCU_MSB_BITVAL_L) ? 1 : 0;
133
+ switch (WF & 0xf0) {
134
+ // switch-case encourages computed-goto compiler-optimization
135
+ case NOISE_BITVAL: {
136
+ // noise waveform
137
+ Tmp = SID.NoiseLFSR[Channel]; // clock LFSR all time if clockrate exceeds observable at given samplerate (last term):
138
+ if ((SID.PhaseAccu[PhaseAccuIdx] & NOISE_CLOCK_L) !== (SID.PrevPhaseAccu[PhaseAccuIdx] & NOISE_CLOCK_L) ||
139
+ PhaseAccuStep >= NOISE_CLOCK_L) {
140
+ Feedback = ((Tmp & 0x400000) ^ ((Tmp & 0x20000) << 5)) !== 0 ? 1 : 0;
141
+ Tmp = Math.imul(Tmp, 2) | (Feedback | TestBit);
142
+ Tmp &= 0x7fffff; // TEST-bit turns all bits in noise LFSR to 1 (on real SID slowly, in approx. 8000 microseconds ~ 300 samples)
143
+ SID.NoiseLFSR[Channel] = Tmp;
144
+ } // we simply zero output when other waveform is mixed with noise. On real SID LFSR continuously gets filled by zero and locks up. ($C1 waveform with pw<8 can keep it for a while.)
145
+ WavGenOut =
146
+ /* (WF & 0x70) ? 0 : */ ((Tmp & 0x100000) >>> 5) |
147
+ (Tmp & 0x40000) >>> 4 |
148
+ (Tmp & 0x4000) >>> 1 |
149
+ ((Tmp & 0x800) << 1) |
150
+ ((Tmp & 0x200) << 2) |
151
+ ((Tmp & 0x20) << 5) |
152
+ ((Tmp & 0x04) << 7) |
153
+ ((Tmp & 0x01) << 8);
154
+ break;
155
+ }
156
+ case PULSE_BITVAL: {
157
+ // simple pulse
158
+ PW = getPW(C64, ChannelPtr); // PW=0000..FFF0 from SID-register
159
+ Utmp = PhaseAccuStep >>> (CRSID_WAVE_SHIFTS_L + 1);
160
+ if (0 < PW && PW < Utmp)
161
+ PW = Utmp; // Too thin pulsewidth? Correct...
162
+ Utmp = Utmp ^ CRSID_WAVE_MAX;
163
+ if (PW > Utmp)
164
+ PW = Utmp; // Too thin pulsewidth? Correct it to a value representable at the current samplerate
165
+ Utmp = SID.PhaseAccu[PhaseAccuIdx] >>> CRSID_WAVE_SHIFTS_L; // 12;
166
+ // simple pulse, most often used waveform, make it sound as clean as possible (by making it trapezoid)
167
+ Steepness = PhaseAccuStep >= STEEPNESS_STEPLIMIT_L ? divTrunc(PHASEACCU_MAX_L, PhaseAccuStep) : CRSID_WAVE_MAX; // rising/falling-edge steepness (add/sub at samples)
168
+ if (TestBit)
169
+ WavGenOut = CRSID_WAVE_MAX; // 0xFFFF;
170
+ else if (Utmp < PW) {
171
+ // rising edge (interpolation)
172
+ PulsePeak = Math.imul(CRSID_WAVE_MAX - PW, Steepness); // very thin pulses don't make a full swing between 0 and max but make a little spike
173
+ if (PulsePeak > CRSID_WAVE_MAX)
174
+ PulsePeak = CRSID_WAVE_MAX; // but adequately thick trapezoid pulses reach the maximum level
175
+ Tmp = PulsePeak - (PW - Utmp) * Steepness; // draw the slope from the peak
176
+ WavGenOut = Tmp < CRSID_WAVE_MIN ? CRSID_WAVE_MIN : Tmp; // but stop at 0-level
177
+ }
178
+ else {
179
+ // falling edge (interpolation)
180
+ PulsePeak = Math.imul(PW, Steepness); // very thin pulses don't make a full swing between 0 and max but make a little spike
181
+ if (PulsePeak > CRSID_WAVE_MAX)
182
+ PulsePeak = CRSID_WAVE_MAX; // adequately thick trapezoid pulses reach the maximum level
183
+ Tmp = (CRSID_WAVE_MAX - Utmp) * Steepness - PulsePeak; // draw the slope from the peak
184
+ WavGenOut = Tmp >= 0 ? CRSID_WAVE_MAX : Tmp; // but stop at max-level
185
+ }
186
+ break;
187
+ }
188
+ case PULSAWTRI_VAL: {
189
+ // combined pulse (pulse+saw+triangle, waveform nearly identical to tri+saw)
190
+ Utmp = SID.PhaseAccu[PhaseAccuIdx] >>> COMBINEDWF_SAMPLE_SHIFTS_L; // 16;
191
+ WavGenOut =
192
+ Utmp >= getCombinedPW(C64, ChannelPtr) || TestBit
193
+ ? combinedWF(C64, SID, CRSID_PulseSawTriangle, Utmp, Channel, ChannelPtr)
194
+ : CRSID_WAVE_MIN; // 0;
195
+ break;
196
+ }
197
+ case PULSAW_VAL: {
198
+ // pulse+saw
199
+ Utmp = SID.PhaseAccu[PhaseAccuIdx] >>> COMBINEDWF_SAMPLE_SHIFTS_L; // 16;
200
+ WavGenOut =
201
+ Utmp >= getCombinedPW(C64, ChannelPtr)
202
+ // || RARELY(TestBit)
203
+ ? combinedWF(C64, SID, CRSID_PulseSawtooth, Utmp, Channel, ChannelPtr)
204
+ : CRSID_WAVE_MIN; // 0;
205
+ break;
206
+ }
207
+ case PULTRI_VAL: {
208
+ // pulse+triangle
209
+ Tmp = SID.PhaseAccu[PhaseAccuIdx] ^ ((WF & RING_BITVAL) !== 0 ? SID.RingSourceMSB : 0);
210
+ WavGenOut =
211
+ (SID.PhaseAccu[PhaseAccuIdx] >>> COMBINEDWF_SAMPLE_SHIFTS_L) >= getCombinedPW(C64, ChannelPtr) || TestBit
212
+ ? combinedWF(C64, SID, CRSID_PulseTriangle, Tmp >>> COMBINEDWF_SAMPLE_SHIFTS_L, Channel, ChannelPtr)
213
+ : CRSID_WAVE_MIN; // 0;
214
+ break;
215
+ }
216
+ case SAWTRI_VAL: {
217
+ // saw+triangle
218
+ WavGenOut = combinedWF(C64, SID, CRSID_SawTriangle, SID.PhaseAccu[PhaseAccuIdx] >>> COMBINEDWF_SAMPLE_SHIFTS_L, Channel, ChannelPtr);
219
+ break;
220
+ }
221
+ case SAW_BITVAL: {
222
+ // sawtooth
223
+ WavGenOut = SID.PhaseAccu[PhaseAccuIdx] >>> CRSID_WAVE_SHIFTS_L; // 12; (this row would be enough for simple but aliased-at-high-pitch saw)
224
+ Steepness = (PhaseAccuStep >>> LRW_CR_CLOCK_FRAC) / 288;
225
+ if (Steepness === 0)
226
+ Steepness = 1; // avoid division by zero in next steps
227
+ WavGenOut += Math.imul(WavGenOut, Steepness) >>> STEEPNESS_FRACTION_SHIFTS; // 1st half (rising edge) of asymmetric triangle-like saw waveform
228
+ if (WavGenOut > CRSID_WAVE_MAX)
229
+ WavGenOut = CRSID_WAVE_MAX - divTrunc((WavGenOut - CRSID_WAVE_RANGE) << STEEPNESS_FRACTION_SHIFTS, Steepness); // 2nd half (falling edge, reciprocal steepness
230
+ break;
231
+ }
232
+ case TRI_BITVAL: {
233
+ // triangle (this waveform has no harsh edges, so it doesn't suffer from strong aliasing at high pitches)
234
+ if (!C64.RealSIDmode || SID.PrevSounDemonDigiWF[Channel] <= 0) {
235
+ // != SOUNDEMON_DIGI_SEEK_WAVEFORM
236
+ Tmp = SID.PhaseAccu[PhaseAccuIdx] ^ ((WF & RING_BITVAL) !== 0 ? SID.RingSourceMSB : 0);
237
+ WavGenOut = (Tmp ^ (Tmp & PHASEACCU_MSB_BITVAL_L ? PHASEACCU_MAX_L : 0)) >>> (CRSID_WAVE_SHIFTS_L - 1); // 11;
238
+ } // SounDemon digi hack: if previous waveform was 01, don't modify output in this round:
239
+ else {
240
+ WavGenOut = SID.PrevWavGenOut[Channel];
241
+ --SID.PrevSounDemonDigiWF[Channel];
242
+ } // (so carrier noise won't be heard due to non 1MHz emulation)
243
+ break;
244
+ }
245
+ case 0x00: {
246
+ // emulate waveform 00 floating wave-DAC (utilized by SounDemon digis)
247
+ // (on real SID waveform00 decays after about 5 seconds, here we just simply keep the value to avoid clicks)
248
+ // (Our jittery 'seeking' waveform=$01 part of SounDemon-digi is substituted directly by frequency-high register's value (as in SwinSID))
249
+ if (C64.RealSIDmode && WF === SOUNDEMON_DIGI_SEEK_WAVEFORM) {
250
+ WavGenOut = Math.imul(W[ChannelPtr + 1], 1 << SOUNDEMON_DIGI_SHIFTS) >>> 0;
251
+ SID.PrevSounDemonDigiWF[Channel] = SOUNDEMON_CARRIER_ELIMINATION_SAMPLECOUNT;
252
+ }
253
+ else
254
+ WavGenOut = SID.PrevWavGenOut[Channel];
255
+ break;
256
+ }
257
+ default:
258
+ WavGenOut = CRSID_WAVE_MIN;
259
+ break; // noise plus pulse/saw/triangle mostly yields silence
260
+ }
261
+ // SID.PrevSounDemonDigiWF[Channel] = WF;
262
+ WavGenOut &= CRSID_WAVE_MASK; // 0xFFFF;
263
+ /* if (WF&0xF0) */ SID.PrevWavGenOut[Channel] = WavGenOut >>> 0; // emulate waveform 00 floating wave-DAC (utilized by SounDemon digis)
264
+ // else WavGenOut = SID.PrevWavGenOut[Channel]; (on real SID waveform00 decays, we just simply keep the value to avoid clicks)
265
+ SID.PrevPhaseAccu[PhaseAccuIdx] = SID.PhaseAccu[PhaseAccuIdx];
266
+ SID.RingSourceMSB = MSB;
267
+ // routing the channel signal to either the filter or the unfiltered
268
+ // master output depending on filter-switch SID-registers
269
+ Envelope = SID.ChipModel === 8580 ? SID.EnvelopeCounter[Channel] : cRSID_ADSR_DAC_6581[SID.EnvelopeCounter[Channel]];
270
+ if (FilterSwitchReso & FilterSwitchVal[Channel]) {
271
+ SID.FilterInputSample += divTrunc((WavGenOut - CRSID_WAVE_MID) * Envelope, ENVELOPE_MAGNITUDE_DIV); // >> 8;
272
+ }
273
+ else if (Channel !== 14 || !(VolumeBand & OFF3_BITVAL)) {
274
+ SID.NonFiltedSample += divTrunc((WavGenOut - CRSID_WAVE_MID) * Envelope, ENVELOPE_MAGNITUDE_DIV); // >> 8;
275
+ }
276
+ }
277
+ // update readable SID1-registers (some SID tunes might use 3rd channel ENV3/OSC3 value as control)
278
+ R[SID.BasePtrRD + 0x1b] = WavGenOut >>> WAVE_OSC3_SHIFTS; // OSC3, ENV3 (some players rely on it, unfortunately even for timing)
279
+ R[SID.BasePtrRD + 0x1c] = SID.EnvelopeCounter[CHANNEL2_INDEX]; // Envelope
280
+ // cRSID_C64.IObankRD[SID->BaseAddress+0x1F] = (cRSID.SelectedSIDmodel==8580); — this doesn't exist in real SID but SID-Wizard code removes comment-marks and uses it as identification workaround
281
+ return cRSID_emulateSIDoutputStage(C64, SID);
282
+ }
283
+ /** C integer division (truncates toward zero; JS `/` is not integer and
284
+ * `Math.floor` rounds down — not the same for negative operands). */
285
+ function divTrunc(a, b) {
286
+ return Math.trunc(a / b);
287
+ }
288
+ // re-export for the output stage (SID_Outputs.c include chain) to keep the
289
+ // same call-graph as C (SID.c includes SID_ADSR.c + SID_OscWaves.c +
290
+ // SID_Outputs.c)
291
+ import { cRSID_emulateSIDoutputStage } from './sidoutputs.js';
292
+ import { cRSID_ADSR_DAC_6581 } from './sidadsr.js';
293
+ // ---------------------------------------------------------------------------
294
+ // HQcombinedWF (SID_OscWaves.c:262-279) + cRSID_emulateHQwaves (…:281-445ish)
295
+ // ---------------------------------------------------------------------------
296
+ /** HQcombinedWF (SID_OscWaves.c:262-279). */
297
+ function HQcombinedWF(C64, SID, WFarray, oscval) {
298
+ void C64;
299
+ // Specs (SID_OscWaves.c:263-271) — same values as the light-variant ones 1:1
300
+ if (SID.ChipModel === 6581 && WFarray !== CRSID_PulseTriangle)
301
+ oscval &= COMBINEDWF_OSC_MSB_OFF_MASK; // 0x7FF;
302
+ return (WFarray[oscval] << COMBINEDWF_WAVE_SHIFTS8) >>> 0; // 8
303
+ }
304
+ // Specs T of cRSID_emulateHQwaves (SID_OscWaves.c:283-310)
305
+ const PHASEACCU_RANGE_H = PHASEACCU_SID__RANGE; // 0x1000000
306
+ const PHASEACCU_MAX_H = PHASEACCU_RANGE_H - 1;
307
+ const PHASEACCU_ANDMASK_H = PHASEACCU_MAX_H;
308
+ const PHASEACCU_MSB_BITVAL_H = PHASEACCU_RANGE_H >>> 1; // 0x800000
309
+ const CRSID_WAVE_SHIFTS_H = SID_PHASEACCU_RESOLUTION - CRSID_WAVE_RESOLUTION;
310
+ const SOUNDEMON_DIGI_SHIFTS_H = SOUNDEMON_DIGI_SHIFTS;
311
+ const SOUNDEMON_CARRIER_ELIMINATION_CYCLECOUNT = 24;
312
+ const COMBINEDWF_SAMPLE_SHIFTS_H = SID_PHASEACCU_RESOLUTION - COMBINEDWF_SAMPLE_RESOLUTION;
313
+ const NOISE_CLOCK_H = 0x100000;
314
+ void NOISE_CLOCK_H;
315
+ const _unused_h = [CRSID_WAVE_SHIFTS_H, SOUNDEMON_DIGI_SHIFTS_H, COMBINEDWF_SAMPLE_SHIFTS_H];
316
+ void _unused_h;
317
+ /** cRSID_emulateHQwaves (SID_OscWaves.c:281-445).
318
+ * C static locals TestBit/Envelope/SIDwavOutput are write-before-read per
319
+ * call — SIDwavOutput is returned, TestBit/Envelope are locals here. */
320
+ export function cRSID_emulateHQwaves(C64, SID, cycles) {
321
+ const W = C64.IObankWR;
322
+ const R = C64.IObankRD;
323
+ let TestBit = 0;
324
+ let Envelope = 0;
325
+ let Tmp;
326
+ let Feedback;
327
+ let Utmp = 0;
328
+ let PW = 0;
329
+ void PW;
330
+ let WavGenOut = 0;
331
+ let PhaseAccuStep = 0;
332
+ let MSB = 0;
333
+ const SIDwavOutput = { FilterInput: 0, NonFilted: 0 };
334
+ void WAVE_OSC3_SHIFTS;
335
+ const FilterSwitchReso = W[SID.BasePtr + 0x17];
336
+ const VolumeBand = W[SID.BasePtr + 0x18];
337
+ for (let Channel = 0; Channel < SID_CHANNELS_RANGE; Channel += SID_CHANNEL_SPACING) {
338
+ const ChannelPtr = SID.BasePtr + Channel;
339
+ const WF = W[ChannelPtr + 4];
340
+ TestBit = (WF & TEST_BITVAL) !== 0 ? 1 : 0;
341
+ const PhaseAccuIdx = Channel;
342
+ PhaseAccuStep = Math.imul(((W[ChannelPtr + 1] << 8) | W[ChannelPtr + 0]) >>> 0, cycles) >>> 0; // oscillator pitch
343
+ if (TestBit || ((WF & SYNC_BITVAL) !== 0 && SID.SyncSourceMSBrise))
344
+ SID.PhaseAccu[PhaseAccuIdx] = 0; // oscillator-sync
345
+ else {
346
+ // stepping phase-accumulator (oscillator)
347
+ SID.PhaseAccu[PhaseAccuIdx] += PhaseAccuStep;
348
+ if (SID.PhaseAccu[PhaseAccuIdx] >= PHASEACCU_RANGE_H)
349
+ SID.PhaseAccu[PhaseAccuIdx] -= PHASEACCU_RANGE_H; // 0x1000000;
350
+ }
351
+ SID.PhaseAccu[PhaseAccuIdx] &= PHASEACCU_ANDMASK_H;
352
+ MSB = SID.PhaseAccu[PhaseAccuIdx] & PHASEACCU_MSB_BITVAL_H;
353
+ SID.SyncSourceMSBrise = MSB > (SID.PrevPhaseAccu[PhaseAccuIdx] & PHASEACCU_MSB_BITVAL_H) ? 1 : 0;
354
+ switch (WF & 0xf0) {
355
+ case NOISE_BITVAL: {
356
+ // noise waveform
357
+ Tmp = SID.NoiseLFSR[Channel]; // clock LFSR all time if clockrate exceeds observable at given samplerate (last term):
358
+ if ((SID.PhaseAccu[PhaseAccuIdx] & NOISE_CLOCK_H) !== (SID.PrevPhaseAccu[PhaseAccuIdx] & NOISE_CLOCK_H)) {
359
+ Feedback = ((Tmp & 0x400000) ^ ((Tmp & 0x20000) << 5)) !== 0 ? 1 : 0;
360
+ Tmp = Math.imul(Tmp, 2) | (Feedback | TestBit);
361
+ Tmp &= 0x7fffff; // TEST-bit turns all bits in noise LFSR to 1 (on real SID slowly, in approx. 8000 microseconds ~ 300 samples)
362
+ SID.NoiseLFSR[Channel] = Tmp;
363
+ } // we simply zero output below when other waveform is mixed with noise. On real SID LFSR continuously gets filled by zero and locks up. ($C1 waveform with pw<8 can keep it for a while.)
364
+ SID.PrevWavGenOut[Channel] =
365
+ /* (WF & 0x70) ? 0 : */ ((Tmp & 0x100000) >>> 5) |
366
+ (Tmp & 0x40000) >>> 4 |
367
+ (Tmp & 0x4000) >>> 1 |
368
+ ((Tmp & 0x800) << 1) |
369
+ ((Tmp & 0x200) << 2) |
370
+ ((Tmp & 0x20) << 5) |
371
+ ((Tmp & 0x04) << 7) |
372
+ ((Tmp & 0x01) << 8);
373
+ break;
374
+ }
375
+ case PULSAWTRI_VAL: {
376
+ // pulse+saw+triangle (waveform nearly identical to tri+saw)
377
+ Utmp = SID.PhaseAccu[PhaseAccuIdx] >>> COMBINEDWF_SAMPLE_SHIFTS_H; // 12;
378
+ SID.PrevWavGenOut[Channel] =
379
+ Utmp >= getCombinedPW(C64, ChannelPtr) || TestBit
380
+ ? HQcombinedWF(C64, SID, CRSID_PulseSawTriangle, Utmp)
381
+ : CRSID_WAVE_MIN; // 0;
382
+ break;
383
+ }
384
+ case PULSAW_VAL: {
385
+ // pulse+saw
386
+ Utmp = SID.PhaseAccu[PhaseAccuIdx] >>> COMBINEDWF_SAMPLE_SHIFTS_H; // 12;
387
+ SID.PrevWavGenOut[Channel] =
388
+ Utmp >= getCombinedPW(C64, ChannelPtr) || TestBit
389
+ ? HQcombinedWF(C64, SID, CRSID_PulseSawtooth, Utmp)
390
+ : CRSID_WAVE_MIN; // 0;
391
+ break;
392
+ }
393
+ case PULTRI_VAL: {
394
+ // pulse+triangle
395
+ Tmp = SID.PhaseAccu[PhaseAccuIdx] ^ ((WF & RING_BITVAL) !== 0 ? SID.RingSourceMSB : 0);
396
+ SID.PrevWavGenOut[Channel] =
397
+ (SID.PhaseAccu[PhaseAccuIdx] >>> COMBINEDWF_SAMPLE_SHIFTS_H) >= getCombinedPW(C64, ChannelPtr) || TestBit
398
+ ? HQcombinedWF(C64, SID, CRSID_PulseTriangle, Tmp >>> COMBINEDWF_SAMPLE_SHIFTS_H)
399
+ : CRSID_WAVE_MIN; // 0;
400
+ break;
401
+ }
402
+ case PULSE_BITVAL: {
403
+ // simple pulse or pulse+combined
404
+ SID.PrevWavGenOut[Channel] =
405
+ (SID.PhaseAccu[PhaseAccuIdx] >>> CRSID_WAVE_SHIFTS_H) >= getPW(C64, ChannelPtr) || TestBit
406
+ ? CRSID_WAVE_MAX
407
+ : CRSID_WAVE_MIN; // 0xFFFF : 0;
408
+ break;
409
+ }
410
+ case SAWTRI_VAL: {
411
+ // saw+triangle
412
+ SID.PrevWavGenOut[Channel] = HQcombinedWF(C64, SID, CRSID_SawTriangle, SID.PhaseAccu[PhaseAccuIdx] >>> COMBINEDWF_SAMPLE_SHIFTS_H);
413
+ break;
414
+ }
415
+ case SAW_BITVAL: {
416
+ // sawtooth
417
+ SID.PrevWavGenOut[Channel] = SID.PhaseAccu[PhaseAccuIdx] >>> CRSID_WAVE_SHIFTS_H; // 8;
418
+ // if (WF & TRI_BITVAL) WavGenOut = HQcombinedWF( SID, cRSID_SawTriangle, WavGenOut ); //saw+triangle
419
+ break;
420
+ }
421
+ case TRI_BITVAL: {
422
+ // triangle (this waveform has no harsh edges, so it doesn't suffer from strong aliasing at high pitches)
423
+ if (!C64.RealSIDmode || SID.PrevSounDemonDigiWF[Channel] <= 0) {
424
+ // != SOUNDEMON_DIGI_SEEK_WAVEFORM
425
+ Tmp = SID.PhaseAccu[PhaseAccuIdx] ^ ((WF & RING_BITVAL) !== 0 ? SID.RingSourceMSB : 0);
426
+ SID.PrevWavGenOut[Channel] =
427
+ (((Tmp ^ (Tmp & PHASEACCU_MSB_BITVAL_H ? PHASEACCU_MAX_H : 0)) >>> (CRSID_WAVE_SHIFTS_H - 1)) & CRSID_WAVE_MASK) >>> 0; // 0xFFFF;
428
+ } // SounDemon digi hack: if previous waveform was 01, don't modify output in these rounds:
429
+ else {
430
+ SID.PrevSounDemonDigiWF[Channel] -= cycles; // (so carrier noise won't be heard in Fanta_in_Space.sid/etc due to non-1MHz emulation)
431
+ }
432
+ break;
433
+ }
434
+ case 0x00: {
435
+ // emulate waveform 00 floating wave-DAC (utilized by SounDemon digis)
436
+ // (on real SID waveform00 decays, we just simply keep the value to avoid clicks)
437
+ // (Our jittery 'seeking' waveform=$01 part of SounDemon-digi is substituted directly by frequency-high register's value (as in SwinSID))
438
+ if (C64.RealSIDmode && WF === SOUNDEMON_DIGI_SEEK_WAVEFORM) {
439
+ SID.PrevWavGenOut[Channel] = Math.imul(W[ChannelPtr + 1], 1 << SOUNDEMON_DIGI_SHIFTS_H) >>> 0;
440
+ SID.PrevSounDemonDigiWF[Channel] = SOUNDEMON_CARRIER_ELIMINATION_CYCLECOUNT;
441
+ }
442
+ break;
443
+ }
444
+ default:
445
+ SID.PrevWavGenOut[Channel] = CRSID_WAVE_MIN; // noise with pulse/saw/triangle mostly yields silence
446
+ break;
447
+ }
448
+ WavGenOut = SID.PrevWavGenOut[Channel];
449
+ SID.PrevPhaseAccu[PhaseAccuIdx] = SID.PhaseAccu[PhaseAccuIdx];
450
+ SID.RingSourceMSB = MSB;
451
+ // routing the channel signal to either the filter or the unfiltered
452
+ // master output depending on filter-switch SID-registers
453
+ Envelope = SID.ChipModel === 8580 ? SID.EnvelopeCounter[Channel] : cRSID_ADSR_DAC_6581[SID.EnvelopeCounter[Channel]];
454
+ if (FilterSwitchReso & FilterSwitchVal[Channel]) {
455
+ SIDwavOutput.FilterInput += divTrunc((WavGenOut - CRSID_WAVE_MID) * Envelope, ENVELOPE_MAGNITUDE_DIV); // >> 8;
456
+ }
457
+ else if (Channel !== 14 || !(VolumeBand & OFF3_BITVAL)) {
458
+ SIDwavOutput.NonFilted += divTrunc((WavGenOut - CRSID_WAVE_MID) * Envelope, ENVELOPE_MAGNITUDE_DIV); // >> 8;
459
+ }
460
+ }
461
+ // update readable SID1-registers (some SID tunes might use 3rd channel ENV3/OSC3 value as control)
462
+ R[SID.BasePtrRD + 0x1b] = WavGenOut >>> WAVE_OSC3_SHIFTS; // OSC3, ENV3 (some players rely on it, unfortunately even for timing)
463
+ R[SID.BasePtrRD + 0x1c] = SID.EnvelopeCounter[CHANNEL2_INDEX]; // Envelope
464
+ // cRSID_C64.IObankRD[SID->BaseAddress+0x1F] = (cRSID.SelectedSIDmodel==8580); — this doesn't exist in real SID but SID-Wizard code removes comment-marks and uses it as identification workaround
465
+ // if (filter) {
466
+ // cRSID_emulateHQresampledSIDfilter( SID );
467
+ // SIDwavOutput.Mix = (SIDwavOutput.NonFilted + FilterOutput) * (VolumeBand & 0xF);
468
+ // }
469
+ return SIDwavOutput; // NonFilted; //+FilterInput; //WavGenOut; //(*PhaseAccuPtr)>>8;
470
+ }
471
+ // The `cRSID_C64` import is used by C's static function-scope emulations via
472
+ // the file-global object; the TS port passes C64 explicitly everywhere — the
473
+ // import is kept for the (rare) places that read the global in parity notes.
474
+ void cRSID_C64;
475
+ //# sourceMappingURL=sidoscwaves.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sidoscwaves.js","sourceRoot":"","sources":["../src/sidoscwaves.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,17 @@
1
+ import type { CRC64instance, CRSIDinstance, CRSIDwavOutput } from './c64types.js';
2
+ /** cRSID_emulateSIDoutputStage (SID_Outputs.c:23-101) — filter + output-
3
+ * mixing (main-volume / attenuator) stage. */
4
+ export declare function cRSID_emulateSIDoutputStage(C64: CRC64instance, SID: CRSIDinstance): number;
5
+ /** cRSID_precalculateHQoutputParameters (SID_Outputs.c:103-157) — called by
6
+ * resampler at samplerate-pace. */
7
+ export declare function cRSID_precalculateHQoutputParameters(C64: CRC64instance, SID: CRSIDinstance): void;
8
+ /** cRSID_emulateHQresampledSIDoutputStage (SID_Outputs.c:159-206) — called by
9
+ * resampler at oversample-rate. */
10
+ export declare function cRSID_emulateHQresampledSIDoutputStage(C64: CRC64instance, SID: CRSIDinstance, waves: CRSIDwavOutput): number;
11
+ /** cRSID_emulateHQresampledSIDdigi (SID_Outputs.c:208-260) — called by
12
+ * resampler at samplerate-pace, only digis. */
13
+ export declare function cRSID_emulateHQresampledSIDdigi(C64: CRC64instance, SID: CRSIDinstance, signal: {
14
+ L: number;
15
+ R: number;
16
+ }): void;
17
+ //# sourceMappingURL=sidoutputs.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sidoutputs.d.ts","sourceRoot":"","sources":["../src/sidoutputs.ts"],"names":[],"mappings":"AAWA,OAAO,KAAK,EAAE,aAAa,EAAE,aAAa,EAAE,cAAc,EAAE,MAAM,eAAe,CAAC;AAgClF;+CAC+C;AAC/C,wBAAgB,2BAA2B,CAAC,GAAG,EAAE,aAAa,EAAE,GAAG,EAAE,aAAa,GAAG,MAAM,CAmE1F;AAED;oCACoC;AACpC,wBAAgB,oCAAoC,CAAC,GAAG,EAAE,aAAa,EAAE,GAAG,EAAE,aAAa,GAAG,IAAI,CA8BjG;AAED;oCACoC;AACpC,wBAAgB,sCAAsC,CACpD,GAAG,EAAE,aAAa,EAClB,GAAG,EAAE,aAAa,EAClB,KAAK,EAAE,cAAc,GACpB,MAAM,CA8BR;AAED;gDACgD;AAChD,wBAAgB,+BAA+B,CAAC,GAAG,EAAE,aAAa,EAAE,GAAG,EAAE,aAAa,EAAE,MAAM,EAAE;IAAE,CAAC,EAAE,MAAM,CAAC;IAAC,CAAC,EAAE,MAAM,CAAA;CAAE,GAAG,IAAI,CAW9H"}