History

Pushed v1.37 code

- The 4-tap cubic spline resampling interpolation has now been replaced with 8-tap windowed-sinc (polyphase) for better audio quality - The mixer is now using 64-bit float precision instead of 32-bit float precision. We only mix up to 32 channels anyway, which is not very CPU intensive - Volume/panning envelope interpolation is now using floating point precision instead of 8.8 fixed-point precision - Fixed a bug where the scopes would not shut down if you triggered an instrument that is not allocated (empty) - Small code cleanup

Olav Sørensen committed 6 years ago

Commit c8ca0711 parent c0d8c8d32 files · +1636 −1364Browse files

Unified · Split

32 files
  1. src/ft2_about.c +19 −10
  2. src/ft2_audio.c +127 −118
  3. src/ft2_audio.h +7 −8
  4. src/ft2_bmp.c +2 −3
  5. src/ft2_config.c +6 −6
  6. src/ft2_config.h +2 −2
  7. src/ft2_edit.c +1 −1
  8. src/ft2_events.c +1 −1
  9. src/ft2_header.h +3 −3
  10. src/ft2_nibbles.c +8 −1
  11. src/ft2_radiobuttons.c +6 −6
  12. src/ft2_radiobuttons.h +1 −1
  13. src/ft2_replayer.c +71 −85
  14. src/ft2_replayer.h +9 −10
  15. src/ft2_sample_ed.c +225 −35
  16. src/ft2_sample_saver.c +1 −1
  17. src/ft2_scopes.c +2 −2
  18. src/ft2_trim.c +1 −1
  19. src/helpdata/FT2.HLP +1 −1
  20. src/helpdata/ft2_help_data.h +440 −440
  21. src/mixer/ft2_center_mix.c +166 −166
  22. src/mixer/ft2_center_mix.h +12 −12
  23. src/mixer/ft2_cubicspline.c +0 −59
  24. src/mixer/ft2_cubicspline.h +0 −22
  25. src/mixer/ft2_mix.c +194 −194
  26. src/mixer/ft2_mix_macros.h +156 −117
  27. src/mixer/ft2_silence_mix.c +39 −8
  28. src/mixer/ft2_silence_mix.h +0 −47
  29. src/mixer/ft2_windowed_sinc.c +99 −0
  30. src/mixer/ft2_windowed_sinc.h +33 −0
  31. vs2019_project/ft2-clone/ft2-clone.vcxproj +2 −2
  32. vs2019_project/ft2-clone/ft2-clone.vcxproj.filters +2 −2
src/ft2_about.c+19−10
@@ -110,19 +110,22 @@ static void starfield(void) · 109 unmodified lines
110110 */
111111
112112 const float z = (matrix.x.z * star->x) + (matrix.y.z * star->y) + (matrix.z.z * star->z) + 0.5f;
113− if (z <= 0.0f) continue;
113+ if (z <= 0.0f)
114+ continue;
114115
115116 float y = (((matrix.x.y * star->x) + (matrix.y.y * star->y) + (matrix.z.y * star->z)) / z) * 400.0f;
116117 y += 2.0f + (ABOUT_SCREEN_H/2.0f);
117118
118119 const int32_t outY = (int32_t)(y + 0.5f); // rounded
119− if ((uint32_t)outY > 2+ABOUT_SCREEN_H) continue;
120+ if ((uint32_t)outY > 2+ABOUT_SCREEN_H)
121+ continue;
120122
121123 float x = (((matrix.x.x * star->x) + (matrix.y.x * star->y) + (matrix.z.x * star->z)) / z) * 400.0f;
122124 x += 2.0f + (ABOUT_SCREEN_W/2.0f);
123125
124126 const int32_t outX = (int32_t)(x + 0.5f); // rounded
125− if ((uint32_t)outX > 2+ABOUT_SCREEN_W) continue;
127+ if ((uint32_t)outX > 2+ABOUT_SCREEN_W)
128+ continue;
126129
127130 // render star pixel if the pixel under it is the background key
128131 screenBufferPos = ((uint32_t)outY * SCREEN_W) + (uint32_t)outX;
@@ -131,17 +134,23 @@ static void starfield(void) · 2 unmodified lines
131134 int32_t d = (int32_t)((255.0f - (z * 235.0f)) + 0.5f);
132135
133136 d = (d * starfieldFade) >> 8;
134− if (d <= 0) continue;
135− if (d > 255) d = 255;
137+ if (d <= 0)
138+ continue;
136139
137− int32_t r = d - 40;
138− if (r < 0) r = 0;
140+ if (d > 255)
141+ d = 255;
142+
143+ int32_t r = d - 48;
144+ if (r < 0)
145+ r = 0;
139146
140147 int32_t g = d - 14;
141− if (g < 0) g = 0;
148+ if (g < 0)
149+ g = 0;
142150
143− int32_t b = d + 69; // nice
144− if (b > 255) b = 255;
151+ int32_t b = d + 72;
152+ if (b > 255)
153+ b = 255;
145154
146155 video.frameBuffer[screenBufferPos] = RGB32(r, g, b);
147156 lastStarScreenPos[i] = screenBufferPos;
src/ft2_audio.c+127−118
@@ -26,14 +26,10 @@ static int8_t pmpCountDiv, pmpChannels = 2; · 25 unmodified lines
2626 static uint16_t smpBuffSize;
2727 static int32_t randSeed = INITIAL_DITHER_SEED;
2828 static uint32_t oldAudioFreq, tickTimeLen, tickTimeLenFrac;
29−static float fAudioNormalizeMul, fPrngStateL, fPrngStateR, fPanningTab[256+1];
29+static double dAudioNormalizeMul, dPrngStateL, dPrngStateR, dPanningTab[256+1];
3030 static voice_t voice[MAX_VOICES * 2];
3131 static void (*sendAudSamplesFunc)(uint8_t *, uint32_t, uint8_t); // "send mixed samples" routines
3232
33−static int32_t oldPeriod;
34−static uint32_t oldRevDelta;
35−static uint64_t oldDelta;
36−
3733 // globalized
3834 audio_t audio;
3935 pattSyncData_t *pattSyncEntry;
@@ -44,9 +40,16 @@ volatile bool pattQueueClearing, chQueueClearing; · 4 unmodified lines
4440
4541 void resetCachedMixerVars(void)
4642 {
47− oldPeriod = -1;
48− oldDelta = 0;
49− oldRevDelta = UINT32_MAX;
43+ stmTyp *ch = stm;
44+ for (int32_t i = 0; i < MAX_VOICES; i++, ch++)
45+ ch->oldFinalPeriod = -1;
46+
47+ voice_t *v = voice;
48+ for (int32_t i = 0; i < MAX_VOICES*2; i++, v++)
49+ {
50+ v->oldDelta = 0;
51+ v->oldRevDelta = UINT32_MAX;
52+ }
5053 }
5154
5255 void stopVoice(int32_t i)
@@ -122,11 +125,11 @@ void setAudioAmp(int16_t amp, int16_t masterVol, bool bitDepth32Flag) · 69 unmodified lines
122125 amp = CLAMP(amp, 1, 32);
123126 masterVol = CLAMP(masterVol, 0, 256);
124127
125− float fAmp = (amp * masterVol) / (32.0f * 256.0f);
128+ double dAmp = (amp * masterVol) / (32.0 * 256.0);
126129 if (!bitDepth32Flag)
127− fAmp *= 32768.0f;
130+ dAmp *= 32768.0;
128131
129− fAudioNormalizeMul = fAmp;
132+ dAudioNormalizeMul = dAmp;
130133 }
131134
132135 void setNewAudioFreq(uint32_t freq) // for song-to-WAV rendering
@@ -176,7 +179,7 @@ void P_SetSpeed(uint16_t bpm) · 43 unmodified lines
176179 tickTimeLenFrac = tickTimeLen64 & UINT32_MAX;
177180
178181 // used for calculating volume ramp length for "ticks" ramps
179− audio.fRampTickMul = audio.fRampTickMulTab[bpm];
182+ audio.dRampTickMul = audio.dRampTickMulTab[bpm];
180183 }
181184
182185 void audioSetVolRamp(bool volRamp)
@@ -197,36 +200,36 @@ void calcPanningTable(void) · 14 unmodified lines
197200 {
198201 // same formula as FT2's panning table (with 0.0f..1.0f range)
199202 for (int32_t i = 0; i <= 256; i++)
200− fPanningTab[i] = sqrtf(i / 256.0f);
203+ dPanningTab[i] = sqrt(i / 256.0);
201204 }
202205
203206 static void voiceUpdateVolumes(int32_t i, uint8_t status)
204207 {
205− float fDestVolL, fDestVolR;
208+ double dDestVolL, dDestVolR;
206209
207210 voice_t *v = &voice[i];
208211
209− const float fVolL = v->fVol * fPanningTab[256-v->pan];
210− const float fVolR = v->fVol * fPanningTab[ v->pan];
212+ const double dVolL = v->dVol * dPanningTab[256-v->pan];
213+ const double dVolR = v->dVol * dPanningTab[ v->pan];
211214
212215 if (!audio.volumeRampingFlag)
213216 {
214217 // volume ramping is disabled
215− v->fVolL = fVolL;
216− v->fVolR = fVolR;
218+ v->dVolL = dVolL;
219+ v->dVolR = dVolR;
217220 v->volRampSamples = 0;
218221 return;
219222 }
220223
221− v->fDestVolL = fVolL;
222− v->fDestVolR = fVolR;
224+ v->dDestVolL = dVolL;
225+ v->dDestVolR = dVolR;
223226
224227 if (status & IS_NyTon)
225228 {
226229 // sample is about to start, ramp out/in at the same time
227230
228231 // setup "fade out" voice (only if current voice volume > 0)
229− if (v->fVolL > 0.0f || v->fVolR > 0.0f)
232+ if (v->dVolL > 0.0 || v->dVolR > 0.0)
230233 {
231234 voice_t *f = &voice[MAX_VOICES+i];
232235
@@ -234,18 +237,18 @@ static void voiceUpdateVolumes(int32_t i, uint8_t status) · 1 unmodified line
234237
235238 f->volRampSamples = audio.quickVolRampSamples;
236239
237− fDestVolL = -f->fVolL;
238− fDestVolR = -f->fVolR;
240+ dDestVolL = -f->dVolL;
241+ dDestVolR = -f->dVolR;
239242
240− f->fVolDeltaL = fDestVolL * audio.fRampQuickVolMul;
241− f->fVolDeltaR = fDestVolR * audio.fRampQuickVolMul;
243+ f->dVolDeltaL = dDestVolL * audio.dRampQuickVolMul;
244+ f->dVolDeltaR = dDestVolR * audio.dRampQuickVolMul;
242245
243246 f->isFadeOutVoice = true;
244247 }
245248
246249 // make current voice fade in from zero when it starts
247− v->fVolL = 0.0f;
248− v->fVolR = 0.0f;
250+ v->dVolL = 0.0;
251+ v->dVolR = 0.0;
249252 }
250253
251254 // ramp volume changes
@@ -256,38 +259,38 @@ static void voiceUpdateVolumes(int32_t i, uint8_t status) · 4 unmodified lines
256259 */
257260
258261 // if destination volume and current volume is the same (and we have no sample trigger), don't do ramp
259− if (fVolL == v->fVolL && fVolR == v->fVolR && !(status & IS_NyTon))
262+ if (dVolL == v->dVolL && dVolR == v->dVolR && !(status & IS_NyTon))
260263 {
261264 // there is no volume change
262265 v->volRampSamples = 0;
263266 }
264267 else
265268 {
266− fDestVolL = fVolL - v->fVolL;
267− fDestVolR = fVolR - v->fVolR;
269+ dDestVolL = dVolL - v->dVolL;
270+ dDestVolR = dVolR - v->dVolR;
268271
269272 if (status & IS_QuickVol)
270273 {
271274 v->volRampSamples = audio.quickVolRampSamples;
272− v->fVolDeltaL = fDestVolL * audio.fRampQuickVolMul;
273− v->fVolDeltaR = fDestVolR * audio.fRampQuickVolMul;
275+ v->dVolDeltaL = dDestVolL * audio.dRampQuickVolMul;
276+ v->dVolDeltaR = dDestVolR * audio.dRampQuickVolMul;
274277 }
275278 else
276279 {
277280 v->volRampSamples = audio.samplesPerTick;
278− v->fVolDeltaL = fDestVolL * audio.fRampTickMul;
279− v->fVolDeltaR = fDestVolR * audio.fRampTickMul;
281+ v->dVolDeltaL = dDestVolL * audio.dRampTickMul;
282+ v->dVolDeltaR = dDestVolR * audio.dRampTickMul;
280283 }
281284 }
282285 }
283286
284−static void voiceTrigger(int32_t i, sampleTyp *s, int32_t position)
287+static void voiceTrigger(int32_t ch, sampleTyp *s, int32_t position)
285288 {
286289 bool sampleIs16Bit;
287290 uint8_t loopType;
288291 int32_t length, loopStart, loopLength, loopEnd;
289292
290− voice_t *v = &voice[i];
293+ voice_t *v = &voice[ch];
291294 length = s->len;
292295 loopStart = s->repS;
293296 loopLength = s->repL;
@@ -321,26 +324,15 @@ static void voiceTrigger(int32_t i, sampleTyp *s, int32_t position) · 27 unmodified lines
321324 {
322325 v->base16 = (const int16_t *)s->pek;
323326 v->revBase16 = &v->base16[loopStart + loopEnd]; // for pingpong loops
324−
325− // first tap [-1] sample for special case: if (hasLooped && pos == loopStart)
326− if (loopType == 1)
327− v->fTapFixSample = v->base16[loopEnd-1];
328− else if (loopType == 2)
329− v->fTapFixSample = v->base16[loopStart];
330327 }
331328 else
332329 {
333330 v->base8 = s->pek;
334331 v->revBase8 = &v->base8[loopStart + loopEnd]; // for pingpong loops
335−
336− // first tap [-1] sample for special case: if (hasLooped && pos == loopStart)
337− if (loopType == 1)
338− v->fTapFixSample = v->base8[loopEnd-1];
339− else if (loopType == 2)
340− v->fTapFixSample = v->base8[loopStart];
341332 }
342333
343− v->hasLooped = false; // for cubic interpolation special case (read fTapFixSample comment above)
334+ v->dLeftEdgeTaps = s->dLeftEdgeTapSamples + 3;
335+ v->hasLooped = false; // for sinc interpolation special case
344336
345337 v->backwards = false;
346338 v->loopType = loopType;
@@ -366,8 +358,8 @@ void resetRampVolumes(void) · 19 unmodified lines
366358 voice_t *v = voice;
367359 for (int32_t i = 0; i < song.antChn; i++, v++)
368360 {
369− v->fVolL = v->fDestVolL;
370− v->fVolR = v->fDestVolR;
361+ v->dVolL = v->dDestVolL;
362+ v->dVolR = v->dDestVolR;
371363 v->volRampSamples = 0;
372364 }
373365 }
@@ -388,7 +380,7 @@ void updateVoices(void) · 14 unmodified lines
388380 ch->status = 0;
389381
390382 if (status & IS_Vol)
391− v->fVol = ch->fFinalVol;
383+ v->dVol = ch->dFinalVol;
392384
393385 if (status & IS_Pan)
394386 v->pan = ch->finalPan;
@@ -399,16 +391,33 @@ void updateVoices(void) · 4 unmodified lines
399391 if (status & IS_Period)
400392 {
401393 // use cached values if possible
402− const uint16_t period = ch->finalPeriod;
403− if (period != oldPeriod)
394+ if (ch->finalPeriod != ch->oldFinalPeriod)
404395 {
405− oldPeriod = period;
406− oldDelta = getMixerDelta(period);
407− oldRevDelta = getRevMixerDelta(period);
396+ ch->oldFinalPeriod = ch->finalPeriod;
397+
398+ if (ch->finalPeriod == 0) // in FT2, period 0 -> delta 0
399+ {
400+ v->oldDelta = 0;
401+ v->oldRevDelta = UINT32_MAX;
402+ v->dSincLUT = gKaiserSinc;
403+ }
404+ else
405+ {
406+ v->oldDelta = getMixerDelta(ch->finalPeriod);
407+ v->oldRevDelta = getRevMixerDelta(ch->finalPeriod); // for calc'ing max samples in inner mix loop before sample end/loop end
408+
409+ // decide which sinc LUT to use according to resampling ratio
410+ if (v->oldDelta <= 0x130000000) // 1.1875 (32.32 fixed-point)
411+ v->dSincLUT = gKaiserSinc;
412+ else if (v->oldDelta <= 0x180000000) // 1.5 (32.32 fixed-point)
413+ v->dSincLUT = gDownSample1;
414+ else
415+ v->dSincLUT = gDownSample2;
416+ }
408417 }
409418
410− v->delta = oldDelta;
411− v->revDelta = oldRevDelta;
419+ v->delta = v->oldDelta;
420+ v->revDelta = v->oldRevDelta;
412421 }
413422
414423 if (status & IS_NyTon)
@@ -419,8 +428,8 @@ void updateVoices(void) · 4 unmodified lines
419428 void resetAudioDither(void)
420429 {
421430 randSeed = INITIAL_DITHER_SEED;
422− fPrngStateL = 0.0f;
423− fPrngStateR = 0.0f;
431+ dPrngStateL = 0.0;
432+ dPrngStateR = 0.0;
424433 }
425434
426435 static inline int32_t random32(void)
@@ -435,24 +444,24 @@ static inline int32_t random32(void) · 8 unmodified lines
435444 static void sendSamples16BitDitherStereo(uint8_t *stream, uint32_t sampleBlockLength, uint8_t numAudioChannels)
436445 {
437446 int32_t out32;
438− float fOut, fPrng;
447+ double dOut, dPrng;
439448
440449 int16_t *streamPointer16 = (int16_t *)stream;
441450 for (uint32_t i = 0; i < sampleBlockLength; i++)
442451 {
443452 // left channel - 1-bit triangular dithering
444− fPrng = random32() * (0.5f / INT32_MAX); // -0.5f .. 0.5f
445− fOut = ((audio.fMixBufferL[i] * fAudioNormalizeMul) + fPrng) - fPrngStateL;
446− fPrngStateL = fPrng;
447− out32 = (int32_t)fOut;
453+ dPrng = random32() * (0.5 / INT32_MAX); // -0.5 .. 0.5
454+ dOut = ((audio.dMixBufferL[i] * dAudioNormalizeMul) + dPrng) - dPrngStateL;
455+ dPrngStateL = dPrng;
456+ out32 = (int32_t)dOut;
448457 CLAMP16(out32);
449458 *streamPointer16++ = (int16_t)out32;
450459
451460 // right channel - 1-bit triangular dithering
452− fPrng = random32() * (0.5f / INT32_MAX); // -0.5f .. 0.5f
453− fOut = ((audio.fMixBufferR[i] * fAudioNormalizeMul) + fPrng) - fPrngStateR;
454− fPrngStateR = fPrng;
455− out32 = (int32_t)fOut;
461+ dPrng = random32() * (0.5 / INT32_MAX); // -0.5 .. 0.5
462+ dOut = ((audio.dMixBufferR[i] * dAudioNormalizeMul) + dPrng) - dPrngStateR;
463+ dPrngStateR = dPrng;
464+ out32 = (int32_t)dOut;
456465 CLAMP16(out32);
457466 *streamPointer16++ = (int16_t)out32;
458467 }
@@ -463,24 +472,24 @@ static void sendSamples16BitDitherStereo(uint8_t *stream, uint32_t sampleBlockLe · 4 unmodified lines
463472 static void sendSamples16BitDitherMultiChan(uint8_t *stream, uint32_t sampleBlockLength, uint8_t numAudioChannels)
464473 {
465474 int32_t out32;
466− float fOut, fPrng;
475+ double dOut, dPrng;
467476
468477 int16_t *streamPointer16 = (int16_t *)stream;
469478 for (uint32_t i = 0; i < sampleBlockLength; i++)
470479 {
471480 // left channel - 1-bit triangular dithering
472− fPrng = random32() * (0.5f / INT32_MAX); // -0.5f..0.5f
473− fOut = ((audio.fMixBufferL[i] * fAudioNormalizeMul) + fPrng) - fPrngStateL;
474− fPrngStateL = fPrng;
475− out32 = (int32_t)fOut;
481+ dPrng = random32() * (0.5 / INT32_MAX); // -0.5..0.5
482+ dOut = ((audio.dMixBufferL[i] * dAudioNormalizeMul) + dPrng) - dPrngStateL;
483+ dPrngStateL = dPrng;
484+ out32 = (int32_t)dOut;
476485 CLAMP16(out32);
477486 *streamPointer16++ = (int16_t)out32;
478487
479488 // right channel - 1-bit triangular dithering
480− fPrng = random32() * (0.5f / INT32_MAX); // -0.5f..0.5f
481− fOut = ((audio.fMixBufferR[i] * fAudioNormalizeMul) + fPrng) - fPrngStateR;
482− fPrngStateR = fPrng;
483− out32 = (int32_t)fOut;
489+ dPrng = random32() * (0.5 / INT32_MAX); // -0.5..0.5
490+ dOut = ((audio.dMixBufferR[i] * dAudioNormalizeMul) + dPrng) - dPrngStateR;
491+ dPrngStateR = dPrng;
492+ out32 = (int32_t)dOut;
484493 CLAMP16(out32);
485494 *streamPointer16++ = (int16_t)out32;
486495
@@ -492,20 +501,20 @@ static void sendSamples16BitDitherMultiChan(uint8_t *stream, uint32_t sampleBloc · 5 unmodified lines
492501
493502 static void sendSamples32BitStereo(uint8_t *stream, uint32_t sampleBlockLength, uint8_t numAudioChannels)
494503 {
495− float fOut;
504+ double dOut;
496505
497506 float *fStreamPointer32 = (float *)stream;
498507 for (uint32_t i = 0; i < sampleBlockLength; i++)
499508 {
500509 // left channel
501− fOut = audio.fMixBufferL[i] * fAudioNormalizeMul;
502− fOut = CLAMP(fOut, -1.0f, 1.0f);
503− *fStreamPointer32++ = fOut;
510+ dOut = audio.dMixBufferL[i] * dAudioNormalizeMul;
511+ dOut = CLAMP(dOut, -1.0, 1.0);
512+ *fStreamPointer32++ = (float)dOut;
504513
505514 // right channel
506− fOut = audio.fMixBufferR[i] * fAudioNormalizeMul;
507− fOut = CLAMP(fOut, -1.0f, 1.0f);
508− *fStreamPointer32++ = fOut;
515+ dOut = audio.dMixBufferR[i] * dAudioNormalizeMul;
516+ dOut = CLAMP(dOut, -1.0, 1.0);
517+ *fStreamPointer32++ = (float)dOut;
509518 }
510519
511520 (void)numAudioChannels;
@@ -513,20 +522,20 @@ static void sendSamples32BitStereo(uint8_t *stream, uint32_t sampleBlockLength, · 1 unmodified line
513522
514523 static void sendSamples32BitMultiChan(uint8_t *stream, uint32_t sampleBlockLength, uint8_t numAudioChannels)
515524 {
516− float fOut;
525+ double dOut;
517526
518527 float *fStreamPointer32 = (float *)stream;
519528 for (uint32_t i = 0; i < sampleBlockLength; i++)
520529 {
521530 // left channel
522− fOut = audio.fMixBufferL[i] * fAudioNormalizeMul;
523− fOut = CLAMP(fOut, -1.0f, 1.0f);
524− *fStreamPointer32++ = fOut;
531+ dOut = audio.dMixBufferL[i] * dAudioNormalizeMul;
532+ dOut = CLAMP(dOut, -1.0, 1.0);
533+ *fStreamPointer32++ = (float)dOut;
525534
526535 // right channel
527− fOut = audio.fMixBufferR[i] * fAudioNormalizeMul;
528− fOut = CLAMP(fOut, -1.0f, 1.0f);
529− *fStreamPointer32++ = fOut;
536+ dOut = audio.dMixBufferR[i] * dAudioNormalizeMul;
537+ dOut = CLAMP(dOut, -1.0, 1.0);
538+ *fStreamPointer32++ = (float)dOut;
530539
531540 // send zeroes to the rest of the channels
532541 for (uint32_t j = 2; j < numAudioChannels; j++)
@@ -548,17 +557,17 @@ static void doChannelMixing(int32_t samplesToMix) · 15 unmodified lines
548557 const bool volRampFlag = v->volRampSamples > 0;
549558 if (volRampFlag)
550559 {
551− centerMixFlag = (v->fDestVolL == v->fDestVolR) && (v->fVolDeltaL == v->fVolDeltaR);
560+ centerMixFlag = (v->dDestVolL == v->dDestVolR) && (v->dVolDeltaL == v->dVolDeltaR);
552561 }
553− else
562+ else // no volume ramping active
554563 {
555− if (v->fVolL == 0.0f && v->fVolR == 0.0f)
556− {
564+ if (v->dVolL == 0.0 && v->dVolR == 0.0)
565+ {
557566 silenceMixRoutine(v, samplesToMix);
558567 continue;
559568 }
560569
561− centerMixFlag = v->fVolL == v->fVolR;
570+ centerMixFlag = v->dVolL == v->dVolR;
562571 }
563572
564573 mixFuncTab[(centerMixFlag * 36) + (volRampFlag * 18) + v->mixFuncOffset](v, samplesToMix);
@@ -566,7 +575,7 @@ static void doChannelMixing(int32_t samplesToMix) · 1 unmodified line
566575
567576 if (r->active) // volume ramp fadeout-voice
568577 {
569− const bool centerMixFlag = (r->fDestVolL == r->fDestVolR) && (r->fVolDeltaL == r->fVolDeltaR);
578+ const bool centerMixFlag = (r->dDestVolL == r->dDestVolR) && (r->dVolDeltaL == r->dVolDeltaR);
570579 mixFuncTab[(centerMixFlag * 36) + 18 + r->mixFuncOffset](r, samplesToMix);
571580 }
572581 }
@@ -575,8 +584,8 @@ static void doChannelMixing(int32_t samplesToMix) · 2 unmodified lines
575584 static void mixAudio(uint8_t *stream, uint32_t sampleBlockLength, uint8_t numAudioChannels)
576585 {
577586 assert(sampleBlockLength <= MAX_WAV_RENDER_SAMPLES_PER_TICK);
578− memset(audio.fMixBufferL, 0, sampleBlockLength * sizeof (int32_t));
579− memset(audio.fMixBufferR, 0, sampleBlockLength * sizeof (int32_t));
587+ memset(audio.dMixBufferL, 0, sampleBlockLength * sizeof (double));
588+ memset(audio.dMixBufferR, 0, sampleBlockLength * sizeof (double));
580589
581590 doChannelMixing(sampleBlockLength);
582591
@@ -588,8 +597,8 @@ static void mixAudio(uint8_t *stream, uint32_t sampleBlockLength, uint8_t numAud · 5 unmodified lines
588597 void mixReplayerTickToBuffer(uint32_t samplesToMix, uint8_t *stream, uint8_t bitDepth)
589598 {
590599 assert(samplesToMix <= MAX_WAV_RENDER_SAMPLES_PER_TICK);
591− memset(audio.fMixBufferL, 0, samplesToMix * sizeof (int32_t));
592− memset(audio.fMixBufferR, 0, samplesToMix * sizeof (int32_t));
600+ memset(audio.dMixBufferL, 0, samplesToMix * sizeof (double));
601+ memset(audio.dMixBufferR, 0, samplesToMix * sizeof (double));
593602
594603 doChannelMixing(samplesToMix);
595604
@@ -900,7 +909,7 @@ static void fillVisualsSyncBuffer(void) · 304 unmodified lines
900909 c->sampleNr = s->sampleNr;
901910 c->envSustainActive = s->envSustainActive;
902911 c->status = s->tmpStatus;
903− c->fFinalVol = s->fFinalVol;
912+ c->dFinalVol = s->dFinalVol;
904913 c->smpStartPos = s->smpStartPos;
905914 }
906915
@@ -963,37 +972,37 @@ static void SDLCALL audioCallback(void *userdata, Uint8 *stream, int len) · 56 unmodified lines
963972
964973 static bool setupAudioBuffers(void)
965974 {
966− const uint32_t sampleSize = sizeof (int32_t);
975+ const uint32_t sampleSize = sizeof (double);
967976
968− audio.fMixBufferLUnaligned = (float *)MALLOC_PAD(MAX_WAV_RENDER_SAMPLES_PER_TICK * sampleSize, 256);
969− audio.fMixBufferRUnaligned = (float *)MALLOC_PAD(MAX_WAV_RENDER_SAMPLES_PER_TICK * sampleSize, 256);
977+ audio.dMixBufferLUnaligned = (double *)MALLOC_PAD(MAX_WAV_RENDER_SAMPLES_PER_TICK * sampleSize, 256);
978+ audio.dMixBufferRUnaligned = (double *)MALLOC_PAD(MAX_WAV_RENDER_SAMPLES_PER_TICK * sampleSize, 256);
970979
971− if (audio.fMixBufferLUnaligned == NULL || audio.fMixBufferRUnaligned == NULL)
980+ if (audio.dMixBufferLUnaligned == NULL || audio.dMixBufferRUnaligned == NULL)
972981 return false;
973982
974983 // make aligned main pointers
975− audio.fMixBufferL = (float *)ALIGN_PTR(audio.fMixBufferLUnaligned, 256);
976− audio.fMixBufferR = (float *)ALIGN_PTR(audio.fMixBufferRUnaligned, 256);
984+ audio.dMixBufferL = (double *)ALIGN_PTR(audio.dMixBufferLUnaligned, 256);
985+ audio.dMixBufferR = (double *)ALIGN_PTR(audio.dMixBufferRUnaligned, 256);
977986
978987 return true;
979988 }
980989
981990 static void freeAudioBuffers(void)
982991 {
983− if (audio.fMixBufferLUnaligned != NULL)
992+ if (audio.dMixBufferLUnaligned != NULL)
984993 {
985− free(audio.fMixBufferLUnaligned);
986− audio.fMixBufferLUnaligned = NULL;
994+ free(audio.dMixBufferLUnaligned);
995+ audio.dMixBufferLUnaligned = NULL;
987996 }
988997
989− if (audio.fMixBufferRUnaligned != NULL)
998+ if (audio.dMixBufferRUnaligned != NULL)
990999 {
991− free(audio.fMixBufferRUnaligned);
992− audio.fMixBufferRUnaligned = NULL;
1000+ free(audio.dMixBufferRUnaligned);
1001+ audio.dMixBufferRUnaligned = NULL;
9931002 }
9941003
995− audio.fMixBufferL = NULL;
996− audio.fMixBufferR = NULL;
1004+ audio.dMixBufferL = NULL;
1005+ audio.dMixBufferR = NULL;
9971006 }
9981007
9991008 void updateSendAudSamplesRoutine(bool lockMixer)
src/ft2_audio.h+7−8
@@ -11,8 +11,6 @@ enum · 10 unmodified lines
1111 FREQ_TABLE_AMIGA = 1,
1212 };
1313
14−#define NUM_FIXED_TAP_SAMPLES 2
15−
1614 #define MIN_AUDIO_FREQ 44100
1715 #define MAX_AUDIO_FREQ 192000
1816
@@ -35,8 +33,8 @@ typedef struct audio_t · 16 unmodified lines
3533 int32_t quickVolRampSamples, inputDeviceNum, outputDeviceNum, lastWorkingAudioFreq, lastWorkingAudioBits;
3634 uint32_t freq, audLatencyPerfValInt, audLatencyPerfValFrac, samplesPerTick, musicTimeSpeedVal;
3735 uint64_t tickTime64, tickTime64Frac, tickTimeTab[MAX_BPM+1];
38− float fRampQuickVolMul, fRampTickMul, fRampTickMulTab[MAX_BPM+1];
39− float *fMixBufferL, *fMixBufferR, *fMixBufferLUnaligned, *fMixBufferRUnaligned;
36+ double dRampQuickVolMul, dRampTickMul, dRampTickMulTab[MAX_BPM+1];
37+ double *dMixBufferL, *dMixBufferR, *dMixBufferLUnaligned, *dMixBufferRUnaligned;
4038 double dAudioLatencyMs, dSamplesPerTick, dTickSampleCounter, dSamplesPerTickTab[MAX_BPM+1];
4139
4240 SDL_AudioDeviceID dev;
@@ -50,10 +48,11 @@ typedef struct · 7 unmodified lines
5048 bool active, backwards, isFadeOutVoice, hasLooped;
5149 uint8_t mixFuncOffset, pan, loopType;
5250 int32_t pos, end, loopStart, loopLength;
53− uint32_t volRampSamples, revDelta;
54− uint64_t posFrac, delta;
55− float fTapFixSample; // if (loopStart > 0 && pos == loopStart) useThisForFirstTap();
56− float fVol, fDestVolL, fDestVolR, fVolL, fVolR, fVolDeltaL, fVolDeltaR;
51+ uint32_t volRampSamples, revDelta, oldRevDelta;
52+ uint64_t posFrac, delta, oldDelta;
53+ const double *dSincLUT;
54+ double *dLeftEdgeTaps; // if (loopStart > 0 && pos <= loopStart+3) useTheseTaps();
55+ double dVol, dDestVolL, dDestVolR, dVolL, dVolR, dVolDeltaL, dVolDeltaR;
5756 } voice_t;
5857
5958 typedef struct pattSyncData_t
src/ft2_bmp.c+2−3
@@ -94,9 +94,8 @@ bool loadBMPs(void) · 93 unmodified lines
9494 bmp.checkboxGfx = loadBMPTo4BitPal(checkboxGfxBMP);
9595
9696 if (bmp.ft2AboutLogo == NULL || bmp.font1 == NULL || bmp.font2 == NULL ||
97− bmp.font3 == NULL || bmp.font4 == NULL || bmp.font6 == NULL ||
98− bmp.font6 == NULL || bmp.font7 == NULL || bmp.font8 == NULL ||
99− bmp.ft2LogoBadges == NULL || bmp.ft2ByBadges == NULL ||
97+ bmp.font3 == NULL || bmp.font4 == NULL || bmp.font6 == NULL || bmp.font7 == NULL ||
98+ bmp.font8 == NULL || bmp.ft2LogoBadges == NULL || bmp.ft2ByBadges == NULL ||
10099 bmp.midiLogo == NULL || bmp.nibblesLogo == NULL || bmp.nibblesStages == NULL ||
101100 bmp.loopPins == NULL || bmp.mouseCursors == NULL || bmp.mouseCursorBusyClock == NULL ||
102101 bmp.mouseCursorBusyGlass == NULL || bmp.whitePianoKeys == NULL || bmp.blackPianoKeys == NULL ||
src/ft2_config.c+6−6
@@ -141,7 +141,7 @@ static void loadConfigFromBuffer(void) · 140 unmodified lines
141141 config.recMIDIVolSens = CLAMP(config.recMIDIVolSens, 0, 200);
142142 config.recMIDIChn = CLAMP(config.recMIDIChn, 1, 16);
143143
144− config.interpolation &= 3; // one extra bit used in FT2 clone (off, cubic, linear)
144+ config.interpolation &= 3; // one extra bit used in FT2 clone (off, sinc, linear)
145145
146146 if (config.recTrueInsert > 1)
147147 config.recTrueInsert = 1;
@@ -837,7 +837,7 @@ void setConfigIORadioButtonStates(void) // accessed by other .c files · 689 unmodified lines
837837 else if (config.interpolation == INTERPOLATION_LINEAR)
838838 tmpID = RB_CONFIG_AUDIO_INTRP_LINEAR;
839839 else
840− tmpID = RB_CONFIG_AUDIO_INTRP_CUBIC;
840+ tmpID = RB_CONFIG_AUDIO_INTRP_SINC;
841841
842842 radioButtons[tmpID].state = RADIOBUTTON_CHECKED;
843843
@@ -1168,7 +1168,7 @@ void showConfigScreen(void) · 324 unmodified lines
11681168 textOutShadow(390, 105, PAL_FORGRND, PAL_DSKTOP2, "Interpolation:");
11691169 textOutShadow(406, 118, PAL_FORGRND, PAL_DSKTOP2, "None");
11701170 textOutShadow(406, 132, PAL_FORGRND, PAL_DSKTOP2, "Linear (FT2)");
1171− textOutShadow(406, 146, PAL_FORGRND, PAL_DSKTOP2, "Cubic spline");
1171+ textOutShadow(406, 146, PAL_FORGRND, PAL_DSKTOP2, "Windowed-sinc");
11721172 textOutShadow(406, 161, PAL_FORGRND, PAL_DSKTOP2, "Volume ramping");
11731173
11741174 textOutShadow(509, 3, PAL_FORGRND, PAL_DSKTOP2, "Mixing frequency:");
@@ -1619,11 +1619,11 @@ void rbConfigAudioIntrpLinear(void) · 444 unmodified lines
16191619 checkRadioButton(RB_CONFIG_AUDIO_INTRP_LINEAR);
16201620 }
16211621
1622−void rbConfigAudioIntrpCubic(void)
1622+void rbConfigAudioIntrpSinc(void)
16231623 {
1624− config.interpolation = INTERPOLATION_CUBIC;
1624+ config.interpolation = INTERPOLATION_SINC;
16251625 audioSetInterpolationType(config.interpolation);
1626− checkRadioButton(RB_CONFIG_AUDIO_INTRP_CUBIC);
1626+ checkRadioButton(RB_CONFIG_AUDIO_INTRP_SINC);
16271627 }
16281628
16291629 void rbConfigAudio44kHz(void)
src/ft2_config.h+2−2
@@ -19,7 +19,7 @@ enum · 18 unmodified lines
1919 CONFIG_SHOW_ERRORS = 1,
2020
2121 INTERPOLATION_NONE = 0,
22− INTERPOLATION_CUBIC = 1,
22+ INTERPOLATION_SINC = 1,
2323 INTERPOLATION_LINEAR = 2,
2424
2525 MOUSE_IDLE_SHAPE_NICE = 0,
@@ -211,7 +211,7 @@ void rbConfigAudio16bit(void); · 185 unmodified lines
211211 void rbConfigAudio24bit(void);
212212 void rbConfigAudioIntrpNone(void);
213213 void rbConfigAudioIntrpLinear(void);
214−void rbConfigAudioIntrpCubic(void);
214+void rbConfigAudioIntrpSinc(void);
215215 void rbConfigAudio44kHz(void);
216216 void rbConfigAudio48kHz(void);
217217 void rbConfigAudio96kHz(void);
src/ft2_edit.c+1−1
@@ -963,7 +963,7 @@ void doTranspose(void) · 962 unmodified lines
963963 countOverflowingNotes(lastInsMode, lastTranspMode, lastTranspVal);
964964 if (transpDelNotes > 0)
965965 {
966− sprintf(text, "%d note(s) will be erased! Proceed?", transpDelNotes);
966+ sprintf(text, "%d note(s) will be erased! Proceed?", (int32_t)transpDelNotes);
967967 if (okBox(2, "System request", text) != 1)
968968 return;
969969 }
src/ft2_events.c+1−1
@@ -311,7 +311,7 @@ static LONG WINAPI exceptionHandler(EXCEPTION_POINTERS *ptr) · 310 unmodified lines
311311 // find a free filename
312312 for (i = 1; i < 1000; i++)
313313 {
314− sprintf(fileName, "backup%03d.xm", i);
314+ sprintf(fileName, "backup%03d.xm", (int32_t)i);
315315 if (stat(fileName, &statBuffer) != 0)
316316 break; // filename OK
317317 }
src/ft2_header.h+3−3
@@ -12,7 +12,7 @@ · 11 unmodified lines
1212 #endif
1313 #include "ft2_replayer.h"
1414
15−#define PROG_VER_STR "1.36"
15+#define PROG_VER_STR "1.37"
1616
1717 // do NOT change these! It will only mess things up...
1818
@@ -33,8 +33,8 @@ · 14 unmodified lines
3333 ** branchless in the inner channel mixer loop.
3434 ** Warning: Do not change this!
3535 */
36−#define LOOP_FIX_LEN 8
37−#define SMP_DAT_OFFSET 4
36+#define LOOP_FIX_LEN 32
37+#define SMP_DAT_OFFSET 8
3838
3939 #ifndef _WIN32
4040 #define _stricmp strcasecmp
src/ft2_nibbles.c+8−1
@@ -362,7 +362,14 @@ static void nibblesGenNewNumber(void) · 361 unmodified lines
362362 x = rand() % 51;
363363 y = rand() % 23;
364364
365− if (NI_Screen[x][y] == 0 && NI_Screen[x][y+1] == 0)
365+ bool blockIsSuitable;
366+
367+ if (y < 22)
368+ blockIsSuitable = NI_Screen[x][y] == 0 && NI_Screen[x][y+1] == 0;
369+ else
370+ blockIsSuitable = NI_Screen[x][y] == 0; // FT2 bugfix: prevent look-up overflow
371+
372+ if (blockIsSuitable)
366373 {
367374 NI_Number++;
368375 NI_Screen[x][y] = (uint8_t)(16 + NI_Number);
src/ft2_radiobuttons.c+6−6
@@ -74,21 +74,21 @@ radioButton_t radioButtons[NUM_RADIOBUTTONS] = · 73 unmodified lines
7474 // ------ CONFIG AUDIO ------
7575
7676 // audio buffer size
77− //x, y, w, group, funcOnUp
77+ //x, y, w, group, funcOnUp
7878 { 390, 16, 46, RB_GROUP_CONFIG_SOUND_BUFF_SIZE, rbConfigSbs512 },
7979 { 390, 30, 113, RB_GROUP_CONFIG_SOUND_BUFF_SIZE, rbConfigSbs1024 },
8080 { 390, 44, 50, RB_GROUP_CONFIG_SOUND_BUFF_SIZE, rbConfigSbs2048 },
8181
8282 // audio bit depth
83− //x, y, w, group, funcOnUp
83+ //x, y, w, group, funcOnUp
8484 { 390, 74, 107, RB_GROUP_CONFIG_AUDIO_BIT_DEPTH, rbConfigAudio16bit },
8585 { 390, 88, 83, RB_GROUP_CONFIG_AUDIO_BIT_DEPTH, rbConfigAudio24bit },
8686
8787 // audio interpolation
88− //x, y, w, group, funcOnUp
89− { 390, 117, 46, RB_GROUP_CONFIG_AUDIO_INTERPOLATION, rbConfigAudioIntrpNone },
90− { 390, 131, 91, RB_GROUP_CONFIG_AUDIO_INTERPOLATION, rbConfigAudioIntrpLinear },
91− { 390, 145, 86, RB_GROUP_CONFIG_AUDIO_INTERPOLATION, rbConfigAudioIntrpCubic },
88+ //x, y, w, group, funcOnUp
89+ { 390, 117, 46, RB_GROUP_CONFIG_AUDIO_INTERPOLATION, rbConfigAudioIntrpNone },
90+ { 390, 131, 91, RB_GROUP_CONFIG_AUDIO_INTERPOLATION, rbConfigAudioIntrpLinear },
91+ { 390, 145, 103, RB_GROUP_CONFIG_AUDIO_INTERPOLATION, rbConfigAudioIntrpSinc },
9292
9393 // audio output frequency
9494 //x, y, w, group, funcOnUp
src/ft2_radiobuttons.h+1−1
@@ -57,7 +57,7 @@ enum // RADIOBUTTONS · 56 unmodified lines
5757 // AUDIO INTERPOLATION
5858 RB_CONFIG_AUDIO_INTRP_NONE,
5959 RB_CONFIG_AUDIO_INTRP_LINEAR,
60− RB_CONFIG_AUDIO_INTRP_CUBIC,
60+ RB_CONFIG_AUDIO_INTRP_SINC,
6161
6262 // AUDIO FREQUENCY
6363 RB_CONFIG_AUDIO_44KHZ,
src/ft2_replayer.c+71−85
@@ -20,7 +20,7 @@ · 19 unmodified lines
2020 #include "ft2_sample_loader.h"
2121 #include "ft2_tables.h"
2222 #include "ft2_structs.h"
23−#include "mixer/ft2_cubicspline.h"
23+#include "mixer/ft2_windowed_sinc.h"
2424
2525 /* This is a mess, directly ported from the original FT2 code (with some modifications).
2626 ** You will experience a lot of headaches if you dig into it...
@@ -101,7 +101,7 @@ void resetChannels(void) · 74 unmodified lines
101101 {
102102 stmTyp *ch = &stm[i];
103103
104− ch->instrSeg = instr[0];
104+ ch->instrPtr = instr[0];
105105 ch->status = IS_Vol;
106106 ch->oldPan = 128;
107107 ch->outPan = 128;
@@ -293,8 +293,6 @@ static void retrigVolume(stmTyp *ch) · 185 unmodified lines
293293
294294 static void retrigEnvelopeVibrato(stmTyp *ch)
295295 {
296− instrTyp *ins;
297−
298296 if (!(ch->waveCtrl & 0x04)) ch->vibPos = 0;
299297 if (!(ch->waveCtrl & 0x40)) ch->tremPos = 0;
300298
@@ -303,7 +301,7 @@ static void retrigEnvelopeVibrato(stmTyp *ch) · 2 unmodified lines
303301
304302 ch->envSustainActive = true;
305303
306− ins = ch->instrSeg;
304+ instrTyp *ins = ch->instrPtr;
307305 assert(ins != NULL);
308306
309307 if (ins->envVTyp & 1)
@@ -340,22 +338,20 @@ static void retrigEnvelopeVibrato(stmTyp *ch) · 30 unmodified lines
340338
341339 void keyOff(stmTyp *ch)
342340 {
343− instrTyp *ins;
344−
345341 ch->envSustainActive = false;
346342
347− ins = ch->instrSeg;
343+ instrTyp *ins = ch->instrPtr;
348344 assert(ins != NULL);
349345
350346 if (!(ins->envPTyp & 1)) // yes, FT2 does this (!). Most likely a bug?
351347 {
352− if (ch->envPCnt >= ins->envPP[ch->envPPos][0])
348+ if (ch->envPCnt >= (uint16_t)ins->envPP[ch->envPPos][0])
353349 ch->envPCnt = ins->envPP[ch->envPPos][0] - 1;
354350 }
355351
356352 if (ins->envVTyp & 1)
357353 {
358− if (ch->envVCnt >= ins->envVP[ch->envVPos][0])
354+ if (ch->envVCnt >= (uint16_t)ins->envVP[ch->envVPos][0])
359355 ch->envVCnt = ins->envVP[ch->envVPos][0] - 1;
360356 }
361357 else
@@ -379,11 +375,11 @@ void calcReplayRate(int32_t audioFreq) · 17 unmodified lines
379375
380376 dHz2MixDeltaMul = (double)MIXER_FRAC_SCALE / audioFreq;
381377 audio.quickVolRampSamples = (int32_t)((audioFreq / 200.0) + 0.5); // rounded
382− audio.fRampQuickVolMul = 1.0f / audio.quickVolRampSamples;
378+ audio.dRampQuickVolMul = 1.0 / audio.quickVolRampSamples;
383379
384380 audio.dSamplesPerTickTab[0] = 0.0;
385381 audio.tickTimeTab[0] = UINT64_MAX;
386− audio.fRampTickMulTab[0] = 0.0f;
382+ audio.dRampTickMulTab[0] = 0.0;
387383
388384 for (int32_t i = MIN_BPM; i <= MAX_BPM; i++)
389385 {
@@ -402,7 +398,7 @@ void calcReplayRate(int32_t audioFreq) · 12 unmodified lines
402398
403399 // for calculating volume ramp length for tick-lenghted ramps
404400 const int32_t samplesPerTick = (int32_t)(dSamplesPerTick + 0.5); // this has to be rounded first
405− audio.fRampTickMulTab[i] = 1.0f / samplesPerTick;
401+ audio.dRampTickMulTab[i] = 1.0 / samplesPerTick;
406402 }
407403 }
408404
@@ -415,11 +411,12 @@ int64_t getMixerDelta(uint16_t period) · 6 unmodified lines
415411 {
416412 /* Precision has been tested for most extreme case (Amiga period 1, 44100Hz),
417413 ** and there is no precision loss using 64-bit double-precision here, even
418− ** though we can get very big numbers.
414+ ** though we can get VERY big numbers.
419415 */
420416 return (int64_t)((dPeriod2Hz(period) * dHz2MixDeltaMul) + 0.5); // Hz -> rounded 32.32 fixed-point mixer delta
421417 }
422418
419+// used for calculating the max safe amount of samples to mix before entering inner mix loop
423420 uint32_t getRevMixerDelta(uint16_t period)
424421 {
425422 return revMixDeltaTab[period];
@@ -467,7 +464,7 @@ static void startTone(uint8_t ton, uint8_t effTyp, uint8_t eff, stmTyp *ch) · 41 unmodified lines
467464 if (ins == NULL)
468465 ins = instr[0];
469466
470− ch->instrSeg = ins;
467+ ch->instrPtr = ins;
471468 ch->mute = ins->mute;
472469
473470 if (ton > 96) // non-FT2 security (should never happen because I clamp in the patt. loader now)
@@ -742,7 +739,7 @@ static void setEnvelopePos(stmTyp *ch, uint8_t param) · 268 unmodified lines
742739 bool envUpdate;
743740 int16_t newEnvPos;
744741
745− instrTyp *ins = ch->instrSeg;
742+ instrTyp *ins = ch->instrPtr;
746743 assert(ins != NULL);
747744
748745 // *** VOLUME ENVELOPE ***
@@ -776,10 +773,8 @@ static void setEnvelopePos(stmTyp *ch, uint8_t param) · 27 unmodified lines
776773 break;
777774 }
778775
779− ch->envVIPValue = ((ins->envVP[envPos+1][1] - ins->envVP[envPos][1]) & 0xFF) << 8;
780− ch->envVIPValue /= (ins->envVP[envPos+1][0] - ins->envVP[envPos][0]);
781−
782− ch->envVAmp = (ch->envVIPValue * (newEnvPos - 1)) + ((ins->envVP[envPos][1] & 0xFF) << 8);
776+ ch->dEnvVIPValue = (double)(ins->envVP[envPos+1][1] - ins->envVP[envPos][1]) / (ins->envVP[envPos+1][0] - ins->envVP[envPos][0]);
777+ ch->dEnvVAmp = (ch->dEnvVIPValue * (newEnvPos - 1)) + (ins->envVP[envPos][1] & 0xFF);
783778
784779 envPos++;
785780
@@ -796,8 +791,8 @@ static void setEnvelopePos(stmTyp *ch, uint8_t param) · 10 unmodified lines
796791
797792 if (envUpdate)
798793 {
799− ch->envVIPValue = 0;
800− ch->envVAmp = (ins->envVP[envPos][1] & 0xFF) << 8;
794+ ch->dEnvVIPValue = 0.0;
795+ ch->dEnvVAmp = (double)(ins->envVP[envPos][1] & 0xFF);
801796 }
802797
803798 if (envPos >= ins->envVPAnt)
@@ -841,10 +836,8 @@ static void setEnvelopePos(stmTyp *ch, uint8_t param) · 37 unmodified lines
841836 break;
842837 }
843838
844− ch->envPIPValue = ((ins->envPP[envPos+1][1] - ins->envPP[envPos][1]) & 0xFF) << 8;
845− ch->envPIPValue /= (ins->envPP[envPos+1][0] - ins->envPP[envPos][0]);
846−
847− ch->envPAmp = (ch->envPIPValue * (newEnvPos - 1)) + ((ins->envPP[envPos][1] & 0xFF) << 8);
839+ ch->dEnvPIPValue = (double)(ins->envPP[envPos+1][1] - ins->envPP[envPos][1]) / (ins->envPP[envPos+1][0] - ins->envPP[envPos][0]);
840+ ch->dEnvPAmp = (ch->dEnvPIPValue * (newEnvPos - 1)) + (ins->envPP[envPos][1] & 0xFF);
848841
849842 envPos++;
850843
@@ -861,8 +854,8 @@ static void setEnvelopePos(stmTyp *ch, uint8_t param) · 10 unmodified lines
861854
862855 if (envUpdate)
863856 {
864− ch->envPIPValue = 0;
865− ch->envPAmp = (ins->envPP[envPos][1] & 0xFF) << 8;
857+ ch->dEnvPIPValue = 0.0;
858+ ch->dEnvPAmp = (double)(ins->envPP[envPos][1] & 0xFF);
866859 }
867860
868861 if (envPos >= ins->envPPAnt)
@@ -1354,11 +1347,10 @@ static void fixaEnvelopeVibrato(stmTyp *ch) · 485 unmodified lines
13541347 bool envInterpolateFlag, envDidInterpolate;
13551348 uint8_t envPos;
13561349 int16_t autoVibVal;
1357− uint16_t tmpPeriod, autoVibAmp, envVal;
1358− float fVol;
1359− instrTyp *ins;
1350+ uint16_t tmpPeriod, autoVibAmp;
1351+ double dVol, dEnvVal;
13601352
1361− ins = ch->instrSeg;
1353+ instrTyp *ins = ch->instrPtr;
13621354 assert(ins != NULL);
13631355
13641356 // *** FADEOUT ***
@@ -1381,7 +1373,7 @@ static void fixaEnvelopeVibrato(stmTyp *ch) · 16 unmodified lines
13811373 if (!ch->mute)
13821374 {
13831375 // *** VOLUME ENVELOPE ***
1384− envVal = 0;
1376+ dEnvVal = 0.0;
13851377 if (ins->envVTyp & 1)
13861378 {
13871379 envDidInterpolate = false;
@@ -1389,7 +1381,7 @@ static void fixaEnvelopeVibrato(stmTyp *ch) · 1 unmodified line
13891381
13901382 if (++ch->envVCnt == ins->envVP[envPos][0])
13911383 {
1392− ch->envVAmp = ins->envVP[envPos][1] << 8;
1384+ ch->dEnvVAmp = ins->envVP[envPos][1];
13931385
13941386 envPos++;
13951387 if (ins->envVTyp & 4)
@@ -1402,7 +1394,7 @@ static void fixaEnvelopeVibrato(stmTyp *ch) · 6 unmodified lines
14021394 {
14031395 envPos = ins->envVRepS;
14041396 ch->envVCnt = ins->envVP[envPos][0];
1405− ch->envVAmp = ins->envVP[envPos][1] << 8;
1397+ ch->dEnvVAmp = ins->envVP[envPos][1];
14061398 }
14071399 }
14081400
@@ -1417,7 +1409,7 @@ static void fixaEnvelopeVibrato(stmTyp *ch) · 8 unmodified lines
14171409 if (envPos-1 == ins->envVSust)
14181410 {
14191411 envPos--;
1420− ch->envVIPValue = 0;
1412+ ch->dEnvVIPValue = 0.0;
14211413 envInterpolateFlag = false;
14221414 }
14231415 }
@@ -1426,66 +1418,65 @@ static void fixaEnvelopeVibrato(stmTyp *ch) · 2 unmodified lines
14261418 {
14271419 ch->envVPos = envPos;
14281420
1429− ch->envVIPValue = 0;
1421+ ch->dEnvVIPValue = 0.0;
14301422 if (ins->envVP[envPos][0] > ins->envVP[envPos-1][0])
14311423 {
1432− ch->envVIPValue = (ins->envVP[envPos][1] - ins->envVP[envPos-1][1]) << 8;
1433− ch->envVIPValue /= (ins->envVP[envPos][0] - ins->envVP[envPos-1][0]);
1424+ ch->dEnvVIPValue = (double)(ins->envVP[envPos][1] - ins->envVP[envPos-1][1]) / (ins->envVP[envPos][0] - ins->envVP[envPos-1][0]);
14341425
1435− envVal = ch->envVAmp;
1426+ dEnvVal = ch->dEnvVAmp;
14361427 envDidInterpolate = true;
14371428 }
14381429 }
14391430 }
14401431 else
14411432 {
1442− ch->envVIPValue = 0;
1433+ ch->dEnvVIPValue = 0.0;
14431434 }
14441435 }
14451436
14461437 if (!envDidInterpolate)
14471438 {
1448− ch->envVAmp += ch->envVIPValue;
1439+ ch->dEnvVAmp += ch->dEnvVIPValue;
14491440
1450− envVal = ch->envVAmp;
1451− if (envVal > 64*256)
1441+ dEnvVal = ch->dEnvVAmp;
1442+ if (dEnvVal > 64.0)
14521443 {
1453− if (envVal > 128*256)
1454− envVal = 64*256;
1444+ if (dEnvVal > 128.0)
1445+ dEnvVal = 64.0;
14551446 else
1456− envVal = 0;
1447+ dEnvVal = 0.0;
14571448
1458− ch->envVIPValue = 0;
1449+ ch->dEnvVIPValue = 0.0;
14591450 }
14601451 }
14611452
1462− fVol = song.globVol * (1.0f / 64.0f);
1463− fVol *= ch->outVol * (1.0f / 64.0f);
1464− fVol *= ch->fadeOutAmp * (1.0f / 32768.0f);
1465− fVol *= envVal * (1.0f / 16384.0f);
1453+ dVol = song.globVol * (1.0 / 64.0);
1454+ dVol *= ch->outVol * (1.0 / 64.0);
1455+ dVol *= ch->fadeOutAmp * (1.0 / 32768.0);
1456+ dVol *= dEnvVal * (1.0 / 64.0);
14661457
14671458 ch->status |= IS_Vol; // update vol every tick because vol envelope is enabled
14681459 }
14691460 else
14701461 {
1471− fVol = song.globVol * (1.0f / 64.0f);
1472− fVol *= ch->outVol * (1.0f / 64.0f);
1473− fVol *= ch->fadeOutAmp * (1.0f / 32768.0f);
1462+ dVol = song.globVol * (1.0 / 64.0);
1463+ dVol *= ch->outVol * (1.0 / 64.0);
1464+ dVol *= ch->fadeOutAmp * (1.0 / 32768.0);
14741465 }
14751466
1476− if (fVol > 1.0f) // shouldn't happen, but just in case...
1477− fVol = 1.0f;
1467+ if (dVol > 1.0) // shouldn't happen, but just in case...
1468+ dVol = 1.0;
14781469
1479− ch->fFinalVol = fVol;
1470+ ch->dFinalVol = dVol;
14801471 }
14811472 else
14821473 {
1483− ch->fFinalVol = 0.0f;
1474+ ch->dFinalVol = 0.0;
14841475 }
14851476
14861477 // *** PANNING ENVELOPE ***
14871478
1488− envVal = 0;
1479+ dEnvVal = 0.0;
14891480 if (ins->envPTyp & 1)
14901481 {
14911482 envDidInterpolate = false;
@@ -1493,7 +1484,7 @@ static void fixaEnvelopeVibrato(stmTyp *ch) · 1 unmodified line
14931484
14941485 if (++ch->envPCnt == ins->envPP[envPos][0])
14951486 {
1496− ch->envPAmp = ins->envPP[envPos][1] << 8;
1487+ ch->dEnvPAmp = ins->envPP[envPos][1];
14971488
14981489 envPos++;
14991490 if (ins->envPTyp & 4)
@@ -1507,7 +1498,7 @@ static void fixaEnvelopeVibrato(stmTyp *ch) · 7 unmodified lines
15071498 envPos = ins->envPRepS;
15081499
15091500 ch->envPCnt = ins->envPP[envPos][0];
1510− ch->envPAmp = ins->envPP[envPos][1] << 8;
1501+ ch->dEnvPAmp = ins->envPP[envPos][1];
15111502 }
15121503 }
15131504
@@ -1522,7 +1513,7 @@ static void fixaEnvelopeVibrato(stmTyp *ch) · 8 unmodified lines
15221513 if (envPos-1 == ins->envPSust)
15231514 {
15241515 envPos--;
1525− ch->envPIPValue = 0;
1516+ ch->dEnvPIPValue = 0.0;
15261517 envInterpolateFlag = false;
15271518 }
15281519 }
@@ -1531,42 +1522,41 @@ static void fixaEnvelopeVibrato(stmTyp *ch) · 2 unmodified lines
15311522 {
15321523 ch->envPPos = envPos;
15331524
1534− ch->envPIPValue = 0;
1525+ ch->dEnvPIPValue = 0.0;
15351526 if (ins->envPP[envPos][0] > ins->envPP[envPos-1][0])
15361527 {
1537− ch->envPIPValue = (ins->envPP[envPos][1] - ins->envPP[envPos-1][1]) << 8;
1538− ch->envPIPValue /= (ins->envPP[envPos][0] - ins->envPP[envPos-1][0]);
1528+ ch->dEnvPIPValue = (double)(ins->envPP[envPos][1] - ins->envPP[envPos-1][1]) / (ins->envPP[envPos][0] - ins->envPP[envPos-1][0]);
15391529
1540− envVal = ch->envPAmp;
1530+ dEnvVal = ch->dEnvPAmp;
15411531 envDidInterpolate = true;
15421532 }
15431533 }
15441534 }
15451535 else
15461536 {
1547− ch->envPIPValue = 0;
1537+ ch->dEnvPIPValue = 0.0;
15481538 }
15491539 }
15501540
15511541 if (!envDidInterpolate)
15521542 {
1553− ch->envPAmp += ch->envPIPValue;
1543+ ch->dEnvPAmp += ch->dEnvPIPValue;
15541544
1555− envVal = ch->envPAmp;
1556− if (envVal > 64*256)
1545+ dEnvVal = ch->dEnvPAmp;
1546+ if (dEnvVal > 64.0)
15571547 {
1558− if (envVal > 128*256)
1559− envVal = 64*256;
1548+ if (dEnvVal > 128.0)
1549+ dEnvVal = 64.0;
15601550 else
1561− envVal = 0;
1551+ dEnvVal = 0.0;
15621552
1563− ch->envPIPValue = 0;
1553+ ch->dEnvPIPValue = 0.0;
15641554 }
15651555 }
15661556
15671557 const int32_t panTmp = 128 - ABS(ch->outPan - 128);
1568− const int32_t panEnv = (int32_t)envVal - (32*256); // -8192..7936
1569− const int32_t panAdd = (int32_t)roundf((panTmp * panEnv) * (1.0f / 8192.0f)); // -128..124
1558+ const double dPanEnv = dEnvVal - 32.0;
1559+ const int32_t panAdd = (int32_t)round((panTmp * dPanEnv) * (1.0 / 32.0)); // -128..124
15701560 ch->finalPan = (uint8_t)CLAMP(ch->outPan + panAdd, 0, 255);
15711561
15721562 ch->status |= IS_Pan; // update pan every tick because pan envelope is enabled
@@ -2809,7 +2799,7 @@ void closeReplayer(void) · 1236 unmodified lines
28092799 instr[131] = NULL;
28102800 }
28112801
2812− freeCubicTable();
2802+ freeWindowedSincTables();
28132803 }
28142804
28152805 bool setupReplayer(void)
@@ -2839,7 +2829,7 @@ bool setupReplayer(void) · 23 unmodified lines
28392829 audio.linearFreqTable = true;
28402830 note2Period = linearPeriods;
28412831
2842− calcCubicTable();
2832+ calcWindowedSincTables();
28432833 calcPeriod2HzTable();
28442834 calcRevMixDeltaTable();
28452835 calcPanningTable();
@@ -2916,10 +2906,6 @@ void stopPlaying(void) · 70 unmodified lines
29162906 // safely kills all voices
29172907 lockMixerCallback();
29182908 unlockMixerCallback();
2919−
2920− // prevent getFrequenceValue() from calculating the rates forever
2921− for (i = 0; i < MAX_VOICES; i++)
2922− stm[i].outPeriod = 0;
29232909 }
29242910 else
29252911 {
@@ -3154,12 +3140,12 @@ void stopVoices(void) · 228 unmodified lines
31543140 ch->tonTyp = 0;
31553141 ch->relTonNr = 0;
31563142 ch->instrNr = 0;
3157− ch->instrSeg = instr[0]; // important: set instrument pointer to instr 0 (placeholder instrument)
3143+ ch->instrPtr = instr[0]; // important: set instrument pointer to instr 0 (placeholder instrument)
31583144 ch->status = IS_Vol;
31593145 ch->realVol = 0;
31603146 ch->outVol = 0;
31613147 ch->oldVol = 0;
3162− ch->fFinalVol = 0.0f;
3148+ ch->dFinalVol = 0.0;
31633149 ch->oldPan = 128;
31643150 ch->outPan = 128;
31653151 ch->finalPan = 128;
src/ft2_replayer.h+9−10
@@ -3,9 +3,7 @@ · 2 unmodified lines
33 #include <stdint.h>
44 #include <stdbool.h>
55 #include "ft2_unicode.h"
6−
7−// cubic spline requires 2 extra samples in the future to be read
8−#define NUM_FIXED_TAP_SAMPLES 2
6+#include "mixer/ft2_windowed_sinc.h"
97
108 enum
119 {
@@ -175,7 +173,8 @@ typedef struct sampleTyp_t · 163 unmodified lines
175173 bool fixed;
176174 int8_t fine, relTon, *pek, *origPek;
177175 uint8_t vol, typ, pan;
178− int16_t fixedSmp[NUM_FIXED_TAP_SAMPLES];
176+ double dLeftEdgeTapSamples[8+3];
177+ int16_t fixedSmp[SINC_RIGHT_TAPS];
179178 int32_t fixedPos, len, repS, repL;
180179 } sampleTyp;
181180
@@ -207,14 +206,14 @@ typedef struct stmTyp_t · 25 unmodified lines
207206 uint8_t portaUpSpeed, portaDownSpeed, retrigSpeed, retrigCnt, retrigVol;
208207 uint8_t volKolVol, tonNr, envPPos, eVibPos, envVPos, realVol, oldVol, outVol;
209208 uint8_t oldPan, outPan, finalPan;
210− int16_t midiPitch, envVIPValue, envPIPValue;
209+ int16_t midiPitch;
211210 uint16_t outPeriod, realPeriod, finalPeriod, tonTyp, wantPeriod, portaSpeed;
212− uint16_t envVCnt, envVAmp, envPCnt, envPAmp, eVibAmp, eVibSweep;
211+ uint16_t envVCnt, envPCnt, eVibAmp, eVibSweep;
213212 uint16_t fadeOutAmp, fadeOutSpeed, midiVibDepth;
214− float fFinalVol;
215− int32_t smpStartPos;
213+ double dEnvVIPValue, dEnvPIPValue, dEnvVAmp, dEnvPAmp, dFinalVol;
214+ int32_t oldFinalPeriod, smpStartPos;
216215 sampleTyp *smpPtr;
217− instrTyp *instrSeg;
216+ instrTyp *instrPtr;
218217 } stmTyp;
219218
220219 typedef struct songTyp_t
@@ -241,7 +240,7 @@ typedef struct syncedChannel_t // used for audio/video sync queue · 20 unmodified lines
241240 uint8_t status, sampleNr, instrNr;
242241 uint16_t finalPeriod;
243242 int32_t smpStartPos;
244− float fFinalVol;
243+ double dFinalVol;
245244 } syncedChannel_t;
246245
247246 void setNewSongPos(int32_t pos);
src/ft2_sample_ed.c+225−35
@@ -27,6 +27,7 @@ · 26 unmodified lines
2727 #include "ft2_diskop.h"
2828 #include "ft2_keyboard.h"
2929 #include "ft2_structs.h"
30+#include "mixer/ft2_windowed_sinc.h" // SINC_TAPS, SINC_NEGATIVE_TAPS
3031
3132 static const char sharpNote1Char[12] = { 'C', 'C', 'D', 'D', 'E', 'F', 'F', 'G', 'G', 'A', 'A', 'B' };
3233 static const char sharpNote2Char[12] = { '-', '#', '-', '#', '-', '-', '#', '-', '#', '-', '#', '-' };
@@ -57,6 +58,9 @@ sampleTyp *getCurSample(void) · 24 unmodified lines
5758 // modifies samples before index 0, and after loop/end (for branchless mixer interpolation (kinda))
5859 void fixSample(sampleTyp *s)
5960 {
61+ int32_t pos;
62+ bool backwards;
63+
6064 assert(s != NULL);
6165 if (s->origPek == NULL || s->pek == NULL)
6266 {
@@ -88,37 +92,46 @@ void fixSample(sampleTyp *s) · 25 unmodified lines
8892 return; // empty sample
8993 }
9094
91− // disable loop if loopLen == 0 (FT2 does this)
92− if (loopType != 0 && loopLen == 0)
95+ // treat loop as disabled if loopLen == 0 (FT2 does this)
96+ if (loopType != 0 && loopLen <= 0)
9397 {
9498 loopType = 0;
9599 loopStart = loopLen = loopEnd = 0;
96100 }
97101
98− /* The first and second tap (-1, 0) should be the same at sampling position #0
99− ** (at sample trigger), until an eventual loop cycle, where the -1 tap has a
100− ** special case in the mixer.
102+ /* All negative taps should be equal to the first sample point when at sampling
103+ ** position #0 (on sample trigger), until an eventual loop cycle, where we do
104+ ** a special left edge case with replaced tap data.
105+ ** The sample pointer is offset and has allocated data before it, so this is
106+ ** safe.
101107 */
102108 if (sample16Bit)
103− ptr16[-1] = ptr16[0];
109+ {
110+ for (int32_t i = 0; i < SINC_LEFT_TAPS; i++)
111+ ptr16[i-SINC_LEFT_TAPS] = ptr16[0];
112+ }
104113 else
105− s->pek[-1] = s->pek[0];
114+ {
115+ for (int32_t i = 0; i < SINC_LEFT_TAPS; i++)
116+ s->pek[i-SINC_LEFT_TAPS] = s->pek[0];
117+ }
106118
119+ // no loop
107120 if (loopType == 0)
108121 {
109− // no loop
110122 if (sample16Bit)
111123 {
112− for (int32_t i = 0; i < NUM_FIXED_TAP_SAMPLES; i++)
124+ for (int32_t i = 0; i < SINC_RIGHT_TAPS; i++)
113125 ptr16[len+i] = ptr16[len-1];
114126 }
115127 else
116128 {
117− for (int32_t i = 0; i < NUM_FIXED_TAP_SAMPLES; i++)
129+ for (int32_t i = 0; i < SINC_RIGHT_TAPS; i++)
118130 s->pek[len+i] = s->pek[len-1];
119131 }
120132
121− s->fixedPos = 0;
133+ s->fixedPos = 0; // this value is not used for non-looping samples, set to zero
134+
122135 s->fixed = false; // no fixed samples inside actual sample data
123136 return;
124137 }
@@ -126,13 +139,18 @@ void fixSample(sampleTyp *s) · 1 unmodified line
126139 if (s->fixed)
127140 return; // already fixed
128141
129− s->fixedPos = loopStart + loopLen;
142+ s->fixedPos = loopEnd;
143+ s->fixed = true;
130144
131− if (loopLen == 1) // too short for interpolation kernel size, fix in a different way
145+ // special-case for loop-lengt of 1
146+ if (loopLen == 1)
132147 {
133148 if (sample16Bit)
134149 {
135− for (int32_t i = 0; i < NUM_FIXED_TAP_SAMPLES; i++)
150+ for (int32_t i = 0; i < SINC_TAPS+SINC_LEFT_TAPS; i++)
151+ s->dLeftEdgeTapSamples[i] = ptr16[loopStart];
152+
153+ for (int32_t i = 0; i < SINC_RIGHT_TAPS; i++)
136154 {
137155 s->fixedSmp[i] = ptr16[loopEnd+i];
138156 ptr16[loopEnd+i] = ptr16[loopStart];
@@ -140,14 +158,16 @@ void fixSample(sampleTyp *s) · 1 unmodified line
140158 }
141159 else
142160 {
143− for (int32_t i = 0; i < NUM_FIXED_TAP_SAMPLES; i++)
161+ for (int32_t i = 0; i < SINC_TAPS+SINC_LEFT_TAPS; i++)
162+ s->dLeftEdgeTapSamples[i] = s->pek[loopStart];
163+
164+ for (int32_t i = 0; i < SINC_RIGHT_TAPS; i++)
144165 {
145166 s->fixedSmp[i] = s->pek[loopEnd+i];
146167 s->pek[loopEnd+i] = s->pek[loopStart];
147168 }
148169 }
149170
150− s->fixed = true;
151171 return;
152172 }
153173
@@ -156,18 +176,54 @@ void fixSample(sampleTyp *s) · 2 unmodified lines
156176 // forward loop
157177 if (sample16Bit)
158178 {
159− for (int32_t i = 0; i < NUM_FIXED_TAP_SAMPLES; i++)
179+ // left edge (we need SINC_LEFT_TAPS amount of extra unrolled samples)
180+ for (int32_t i = 0; i < SINC_TAPS+SINC_LEFT_TAPS; i++)
181+ {
182+ if (i < SINC_LEFT_TAPS) // negative taps
183+ {
184+ pos = loopEnd-i;
185+ if (pos <= loopStart) // XXX: Correct?
186+ pos += loopLen;
187+ }
188+ else // positive taps
189+ {
190+ pos = loopStart + ((i-SINC_LEFT_TAPS) % loopLen);
191+ }
192+
193+ s->dLeftEdgeTapSamples[i] = ptr16[pos];
194+ }
195+
196+ // right edge (change actual sample data since data after loop is never used)
197+ for (int32_t i = 0; i < SINC_RIGHT_TAPS; i++)
160198 {
161199 s->fixedSmp[i] = ptr16[loopEnd+i];
162− ptr16[loopEnd+i] = ptr16[loopStart+i];
200+ ptr16[loopEnd+i] = ptr16[loopStart + (i % loopLen)];
163201 }
164202 }
165203 else
166204 {
167− for (int32_t i = 0; i < NUM_FIXED_TAP_SAMPLES; i++)
205+ // left edge (we need SINC_LEFT_TAPS amount of extra unrolled samples)
206+ for (int32_t i = 0; i < SINC_TAPS+SINC_LEFT_TAPS; i++)
207+ {
208+ if (i < SINC_LEFT_TAPS) // negative taps
209+ {
210+ pos = loopEnd-i;
211+ if (pos <= loopStart) // XXX: Correct?
212+ pos += loopLen;
213+ }
214+ else // positive taps
215+ {
216+ pos = loopStart + ((i-SINC_LEFT_TAPS) % loopLen);
217+ }
218+
219+ s->dLeftEdgeTapSamples[i] = s->pek[pos];
220+ }
221+
222+ // right edge (change actual sample data since data after loop is never used)
223+ for (int32_t i = 0; i < SINC_RIGHT_TAPS; i++)
168224 {
169225 s->fixedSmp[i] = s->pek[loopEnd+i];
170− s->pek[loopEnd+i] = s->pek[loopStart+i];
226+ s->pek[loopEnd+i] = s->pek[loopStart + (i % loopLen)];
171227 }
172228 }
173229 }
@@ -176,25 +232,159 @@ void fixSample(sampleTyp *s) · 2 unmodified lines
176232 // pingpong loop
177233 if (sample16Bit)
178234 {
179− for (int32_t i = 0; i < NUM_FIXED_TAP_SAMPLES; i++)
235+ // left edge (we need SINC_LEFT_TAPS amount of extra unrolled samples)
236+ pos = loopStart;
237+ backwards = false;
238+ for (int32_t i = 0; i < SINC_LEFT_TAPS; i++)
239+ {
240+ if (backwards)
241+ {
242+ if (--pos < loopStart)
243+ {
244+ pos = loopStart;
245+ backwards = false;
246+ }
247+ }
248+ else
249+ {
250+ if (++pos >= loopEnd)
251+ {
252+ pos = loopEnd-1;
253+ backwards = true;
254+ }
255+ }
256+
257+ s->dLeftEdgeTapSamples[3-i] = ptr16[pos];
258+ }
259+
260+ pos = loopStart;
261+ backwards = true;
262+ for (int32_t i = 3; i < SINC_TAPS+SINC_LEFT_TAPS; i++)
263+ {
264+ if (backwards)
265+ {
266+ if (--pos < loopStart)
267+ {
268+ pos = loopStart;
269+ backwards = false;
270+ }
271+ }
272+ else
273+ {
274+ if (++pos >= loopEnd)
275+ {
276+ pos = loopEnd-1;
277+ backwards = true;
278+ }
279+ }
280+
281+ s->dLeftEdgeTapSamples[i] = ptr16[pos];
282+ }
283+
284+ // right edge (change actual sample data since data after loop is never used)
285+ pos = loopEnd-1;
286+ backwards = true;
287+ for (int32_t i = 0; i < SINC_RIGHT_TAPS; i++)
180288 {
181289 s->fixedSmp[i] = ptr16[loopEnd+i];
182− ptr16[loopEnd+i] = ptr16[loopEnd-1-i];
290+
291+ ptr16[loopEnd+i] = ptr16[pos];
292+ if (backwards)
293+ {
294+ if (--pos < loopStart)
295+ {
296+ pos = loopStart;
297+ backwards = false;
298+ }
299+ }
300+ else
301+ {
302+ if (++pos >= loopEnd)
303+ {
304+ pos = loopEnd-1;
305+ backwards = true;
306+ }
307+ }
183308 }
184309 }
185310 else
186311 {
187− for (int32_t i = 0; i < NUM_FIXED_TAP_SAMPLES; i++)
312+ // left edge (we need SINC_LEFT_TAPS amount of extra unrolled samples)
313+ pos = loopStart;
314+ backwards = false;
315+ for (int32_t i = 0; i < SINC_LEFT_TAPS; i++)
316+ {
317+ if (backwards)
318+ {
319+ if (--pos < loopStart)
320+ {
321+ pos = loopStart;
322+ backwards = false;
323+ }
324+ }
325+ else
326+ {
327+ if (++pos >= loopEnd)
328+ {
329+ pos = loopEnd-1;
330+ backwards = true;
331+ }
332+ }
333+
334+ s->dLeftEdgeTapSamples[3-i] = s->pek[pos];
335+ }
336+
337+ pos = loopStart;
338+ backwards = true;
339+ for (int32_t i = 3; i < SINC_TAPS+SINC_LEFT_TAPS; i++)
340+ {
341+ if (backwards)
342+ {
343+ if (--pos < loopStart)
344+ {
345+ pos = loopStart;
346+ backwards = false;
347+ }
348+ }
349+ else
350+ {
351+ if (++pos >= loopEnd)
352+ {
353+ pos = loopEnd-1;
354+ backwards = true;
355+ }
356+ }
357+
358+ s->dLeftEdgeTapSamples[i] = s->pek[pos];
359+ }
360+
361+ // right edge (change actual sample data since data after loop is never used)
362+ pos = loopEnd-1;
363+ backwards = true;
364+ for (int32_t i = 0; i < SINC_RIGHT_TAPS; i++)
188365 {
189366 s->fixedSmp[i] = s->pek[loopEnd+i];
190− s->pek[loopEnd+i] = s->pek[loopEnd-1-i];
367+
368+ s->pek[loopEnd+i] = s->pek[pos];
369+ if (backwards)
370+ {
371+ if (--pos < loopStart)
372+ {
373+ pos = loopStart;
374+ backwards = false;
375+ }
376+ }
377+ else
378+ {
379+ if (++pos >= loopEnd)
380+ {
381+ pos = loopEnd-1;
382+ backwards = true;
383+ }
384+ }
191385 }
192386 }
193387 }
194−
195− // -1 tap (right before loopStart) on forward/pingpong loops are handled in the mixer
196−
197− s->fixed = true;
198388 }
199389
200390 // restores interpolation tap samples after loop/end
@@ -208,14 +398,14 @@ void restoreSample(sampleTyp *s) · 7 unmodified lines
208398 {
209399 // 16-bit sample
210400 int16_t *ptr16 = (int16_t *)s->pek + s->fixedPos;
211− for (int32_t i = 0; i < NUM_FIXED_TAP_SAMPLES; i++)
401+ for (int32_t i = 0; i < SINC_RIGHT_TAPS; i++)
212402 ptr16[i] = s->fixedSmp[i];
213403 }
214404 else
215405 {
216406 // 8-bit sample
217407 int8_t *ptr8 = s->pek + s->fixedPos;
218− for (int32_t i = 0; i < NUM_FIXED_TAP_SAMPLES; i++)
408+ for (int32_t i = 0; i < SINC_RIGHT_TAPS; i++)
219409 ptr8[i] = (int8_t)s->fixedSmp[i];
220410 }
221411
@@ -594,7 +784,7 @@ static int8_t getScaledSample(sampleTyp *s, int32_t index) // for drawing sample · 372 unmodified lines
594784 ptr16 = (int16_t *)s->pek;
595785
596786 // don't read fixed mixer interpolation samples, read the prestine ones instead
597− if (index >= s->fixedPos && index < s->fixedPos+NUM_FIXED_TAP_SAMPLES && s->len > loopEnd && s->fixed)
787+ if (index >= s->fixedPos && index < s->fixedPos+SINC_RIGHT_TAPS && s->len > loopEnd && s->fixed)
598788 tmp32 = s->fixedSmp[index-s->fixedPos];
599789 else
600790 tmp32 = ptr16[index];
@@ -604,7 +794,7 @@ static int8_t getScaledSample(sampleTyp *s, int32_t index) // for drawing sample · 3 unmodified lines
604794 else
605795 {
606796 // don't read fixed mixer interpolation samples, read the prestine ones instead
607− if (index >= s->fixedPos && index < s->fixedPos+NUM_FIXED_TAP_SAMPLES && s->len > loopEnd && s->fixed)
797+ if (index >= s->fixedPos && index < s->fixedPos+SINC_RIGHT_TAPS && s->len > loopEnd && s->fixed)
608798 tmp32 = s->fixedSmp[index-s->fixedPos];
609799 else
610800 tmp32 = s->pek[index];
@@ -897,7 +1087,7 @@ static void getSpecialMinMax16(sampleTyp *s, int32_t index, int32_t scanEnd, int · 286 unmodified lines
8971087 }
8981088
8991089 // read fixed samples
900− int32_t tmpScanEnd = index+NUM_FIXED_TAP_SAMPLES;
1090+ int32_t tmpScanEnd = index+SINC_RIGHT_TAPS;
9011091 if (tmpScanEnd > scanEnd)
9021092 tmpScanEnd = scanEnd;
9031093
@@ -939,7 +1129,7 @@ static void getSpecialMinMax8(sampleTyp *s, int32_t index, int32_t scanEnd, int8 · 35 unmodified lines
9391129 }
9401130
9411131 // read fixed samples
942− int32_t tmpScanEnd = index+NUM_FIXED_TAP_SAMPLES;
1132+ int32_t tmpScanEnd = index+SINC_RIGHT_TAPS;
9431133 if (tmpScanEnd > scanEnd)
9441134 tmpScanEnd = scanEnd;
9451135
@@ -989,7 +1179,7 @@ static void getSampleDataPeak(sampleTyp *s, int32_t index, int32_t numSamples, i · 43 unmodified lines
9891179 /* If the scan area is including the fixed samples (for branchless mixer interpolation),
9901180 ** do a special procedure to scan the original non-touched samples when needed.
9911181 */
992− const bool insideRange = index >= s->fixedPos && index < s->fixedPos+NUM_FIXED_TAP_SAMPLES;
1182+ const bool insideRange = index >= s->fixedPos && index < s->fixedPos+SINC_RIGHT_TAPS;
9931183 if (insideRange || (index < s->fixedPos && scanEnd >= s->fixedPos))
9941184 {
9951185 if (s->typ & 16)
src/ft2_sample_saver.c+1−1
@@ -70,7 +70,7 @@ static void fileRestoreFixedSampleData(UNICHAR *filenameU, uint32_t sampleDataOf · 69 unmodified lines
7070 if (fixedPos >= (uint32_t)s->len)
7171 return;
7272
73− uint32_t bytesToWrite = NUM_FIXED_TAP_SAMPLES * (sample16Bit+1);
73+ uint32_t bytesToWrite = SINC_RIGHT_TAPS * (sample16Bit+1);
7474 if (fixedPos+bytesToWrite > (uint32_t)s->len)
7575 bytesToWrite = s->len - fixedPos;
7676
src/ft2_scopes.c+2−2
@@ -99,7 +99,7 @@ static void setChannel(int32_t nr, bool on) · 98 unmodified lines
9999 ch->realVol = 0;
100100 ch->outVol = 0;
101101 ch->oldVol = 0;
102− ch->fFinalVol = 0.0f;
102+ ch->dFinalVol = 0.0;
103103 ch->outPan = 128;
104104 ch->oldPan = 128;
105105 ch->finalPan = 128;
@@ -533,7 +533,7 @@ void handleScopesFromChQueue(chSyncData_t *chSyncData, uint8_t *scopeUpdateStatu · 427 unmodified lines
533533 status = scopeUpdateStatus[i];
534534
535535 if (status & IS_Vol)
536− sc->vol = (int32_t)((ch->fFinalVol * SCOPE_HEIGHT) + 0.5f); // rounded
536+ sc->vol = (int32_t)((ch->dFinalVol * SCOPE_HEIGHT) + 0.5); // rounded
537537
538538 if (status & IS_Period)
539539 {
src/ft2_trim.c+1−1
@@ -256,7 +256,7 @@ static void wipeInstrUnused(bool testWipeSize, int16_t *ai, int32_t ap, int32_t · 255 unmodified lines
256256 memcpy(tmpInst, &instr[1], MAX_INST * sizeof (instr[0]));
257257
258258 memset(&instr[1], 0, numInsts * sizeof (instr[0]));
259− memset(song.instrName[1], 0, numInsts * sizeof (song.instrName[0]));
259+ memset(song.instrName[1], 0, numInsts * sizeof (song.instrName[0])); // XXX: Is this safe?
260260
261261 for (i = 0; i < numInsts; i++)
262262 {
src/helpdata/FT2.HLP+1−1
@@ -785,7 +785,7 @@ you exit the program. · 784 unmodified lines
785785 Selects what type of resampling interpolation to use.
786786 "None" uses no interpolation (nearest neighbor), which will result in
787787 aliasing (noise) in the sound. "Linear" is what real FT2 uses, which is a
788−mediocre interpolation type. "Cubic spline" is the recommended setting
788+mediocre interpolation type. "Windowed-sinc" is the recommended setting
789789 for the best audio quality, although it may sometimes sound too filtered
790790 on low-quality samples (f.ex. Amiga MODs).
791791
src/helpdata/ft2_help_data.h+440−440
@@ -3,9 +3,9 @@ · 2 unmodified lines
33
44 #include <stdint.h>
55
6−#define HELP_DATA_LEN 26983
6+#define HELP_DATA_LEN 26984
77
8−const uint8_t helpData[26983] =
8+const uint8_t helpData[26984] =
99 {
1010 0x4C,0x3B,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,
1111 0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,
@@ -1793,469 +1793,469 @@ const uint8_t helpData[26983] = · 1781 unmodified lines
17931793 0x20,0x22,0x4C,0x69,0x6E,0x65,0x61,0x72,0x22,0x20,0x69,0x73,
17941794 0x20,0x77,0x68,0x61,0x74,0x20,0x72,0x65,0x61,0x6C,0x20,0x46,
17951795 0x54,0x32,0x20,0x75,0x73,0x65,0x73,0x2C,0x20,0x77,0x68,0x69,
1796− 0x63,0x68,0x20,0x69,0x73,0x20,0x61,0x46,0x6D,0x65,0x64,0x69,
1796+ 0x63,0x68,0x20,0x69,0x73,0x20,0x61,0x47,0x6D,0x65,0x64,0x69,
17971797 0x6F,0x63,0x72,0x65,0x20,0x69,0x6E,0x74,0x65,0x72,0x70,0x6F,
17981798 0x6C,0x61,0x74,0x69,0x6F,0x6E,0x20,0x74,0x79,0x70,0x65,0x2E,
1799− 0x20,0x22,0x43,0x75,0x62,0x69,0x63,0x20,0x73,0x70,0x6C,0x69,
1800− 0x6E,0x65,0x22,0x20,0x69,0x73,0x20,0x74,0x68,0x65,0x20,0x72,
1801− 0x65,0x63,0x6F,0x6D,0x6D,0x65,0x6E,0x64,0x65,0x64,0x20,0x73,
1802− 0x65,0x74,0x74,0x69,0x6E,0x67,0x48,0x66,0x6F,0x72,0x20,0x74,
1803− 0x68,0x65,0x20,0x62,0x65,0x73,0x74,0x20,0x61,0x75,0x64,0x69,
1804− 0x6F,0x20,0x71,0x75,0x61,0x6C,0x69,0x74,0x79,0x2C,0x20,0x61,
1805− 0x6C,0x74,0x68,0x6F,0x75,0x67,0x68,0x20,0x69,0x74,0x20,0x6D,
1806− 0x61,0x79,0x20,0x73,0x6F,0x6D,0x65,0x74,0x69,0x6D,0x65,0x73,
1807− 0x20,0x73,0x6F,0x75,0x6E,0x64,0x20,0x74,0x6F,0x6F,0x20,0x66,
1808− 0x69,0x6C,0x74,0x65,0x72,0x65,0x64,0x2A,0x6F,0x6E,0x20,0x6C,
1809− 0x6F,0x77,0x2D,0x71,0x75,0x61,0x6C,0x69,0x74,0x79,0x20,0x73,
1810− 0x61,0x6D,0x70,0x6C,0x65,0x73,0x20,0x28,0x66,0x2E,0x65,0x78,
1811− 0x2E,0x20,0x41,0x6D,0x69,0x67,0x61,0x20,0x4D,0x4F,0x44,0x73,
1812− 0x29,0x2E,0x00,0x1A,0x3E,0x40,0x58,0x30,0x34,0x30,0x40,0x43,
1813− 0x30,0x30,0x31,0x56,0x6F,0x6C,0x75,0x6D,0x65,0x20,0x72,0x61,
1814− 0x6D,0x70,0x69,0x6E,0x67,0x3A,0x0B,0x3E,0x40,0x58,0x30,0x36,
1815− 0x30,0x40,0x43,0x30,0x30,0x32,0x3B,0x45,0x6E,0x61,0x62,0x6C,
1816− 0x65,0x73,0x20,0x74,0x68,0x65,0x20,0x61,0x6E,0x74,0x69,0x2D,
1817− 0x63,0x6C,0x69,0x63,0x6B,0x20,0x73,0x79,0x73,0x74,0x65,0x6D,
1818− 0x20,0x69,0x6E,0x20,0x74,0x68,0x65,0x20,0x61,0x75,0x64,0x69,
1819− 0x6F,0x20,0x6D,0x69,0x78,0x65,0x72,0x20,0x28,0x46,0x54,0x32,
1820− 0x2E,0x30,0x38,0x2B,0x29,0x2E,0x3B,0x50,0x6C,0x65,0x61,0x73,
1821− 0x65,0x20,0x6E,0x6F,0x74,0x65,0x20,0x74,0x68,0x61,0x74,0x20,
1822− 0x6F,0x72,0x69,0x67,0x69,0x6E,0x61,0x6C,0x20,0x46,0x54,0x32,
1823− 0x20,0x63,0x61,0x6E,0x27,0x74,0x20,0x6C,0x6F,0x61,0x64,0x20,
1824− 0x74,0x68,0x69,0x73,0x20,0x63,0x6F,0x6E,0x66,0x69,0x67,0x20,
1825− 0x65,0x6E,0x74,0x72,0x79,0x2C,0x0B,0x63,0x6C,0x6F,0x6E,0x65,
1826− 0x20,0x6F,0x6E,0x6C,0x79,0x2E,0x00,0x19,0x3E,0x40,0x58,0x30,
1827− 0x34,0x30,0x40,0x43,0x30,0x30,0x31,0x41,0x6D,0x70,0x6C,0x69,
1828− 0x66,0x69,0x63,0x61,0x74,0x69,0x6F,0x6E,0x3A,0x0B,0x3E,0x40,
1829− 0x58,0x30,0x36,0x30,0x40,0x43,0x30,0x30,0x32,0x46,0x41,0x6D,
1830− 0x70,0x6C,0x69,0x66,0x69,0x65,0x73,0x20,0x74,0x68,0x65,0x20,
1831− 0x76,0x6F,0x6C,0x75,0x6D,0x65,0x20,0x77,0x68,0x65,0x6E,0x20,
1832− 0x6D,0x69,0x78,0x69,0x6E,0x67,0x2E,0x20,0x49,0x66,0x20,0x79,
1833− 0x6F,0x75,0x20,0x73,0x65,0x74,0x20,0x74,0x68,0x69,0x73,0x20,
1834− 0x6F,0x6E,0x65,0x20,0x74,0x6F,0x6F,0x20,0x68,0x69,0x67,0x68,
1835− 0x2C,0x20,0x79,0x6F,0x75,0x27,0x6C,0x6C,0x3A,0x67,0x65,0x74,
1836− 0x20,0x64,0x69,0x73,0x74,0x6F,0x72,0x74,0x69,0x6F,0x6E,0x2E,
1837− 0x20,0x33,0x32,0x58,0x20,0x65,0x71,0x75,0x61,0x6C,0x73,0x20,
1838− 0x66,0x75,0x6C,0x6C,0x20,0x61,0x6D,0x70,0x6C,0x69,0x74,0x75,
1839− 0x64,0x65,0x20,0x66,0x6F,0x72,0x20,0x6F,0x6E,0x65,0x20,0x63,
1840− 0x68,0x61,0x6E,0x6E,0x65,0x6C,0x2E,0x00,0x1B,0x3E,0x40,0x58,
1841− 0x30,0x34,0x30,0x40,0x43,0x30,0x30,0x31,0x46,0x72,0x65,0x71,
1842− 0x75,0x65,0x6E,0x63,0x79,0x20,0x74,0x61,0x62,0x6C,0x65,0x3A,
1799+ 0x20,0x22,0x57,0x69,0x6E,0x64,0x6F,0x77,0x65,0x64,0x2D,0x73,
1800+ 0x69,0x6E,0x63,0x22,0x20,0x69,0x73,0x20,0x74,0x68,0x65,0x20,
1801+ 0x72,0x65,0x63,0x6F,0x6D,0x6D,0x65,0x6E,0x64,0x65,0x64,0x20,
1802+ 0x73,0x65,0x74,0x74,0x69,0x6E,0x67,0x48,0x66,0x6F,0x72,0x20,
1803+ 0x74,0x68,0x65,0x20,0x62,0x65,0x73,0x74,0x20,0x61,0x75,0x64,
1804+ 0x69,0x6F,0x20,0x71,0x75,0x61,0x6C,0x69,0x74,0x79,0x2C,0x20,
1805+ 0x61,0x6C,0x74,0x68,0x6F,0x75,0x67,0x68,0x20,0x69,0x74,0x20,
1806+ 0x6D,0x61,0x79,0x20,0x73,0x6F,0x6D,0x65,0x74,0x69,0x6D,0x65,
1807+ 0x73,0x20,0x73,0x6F,0x75,0x6E,0x64,0x20,0x74,0x6F,0x6F,0x20,
1808+ 0x66,0x69,0x6C,0x74,0x65,0x72,0x65,0x64,0x2A,0x6F,0x6E,0x20,
1809+ 0x6C,0x6F,0x77,0x2D,0x71,0x75,0x61,0x6C,0x69,0x74,0x79,0x20,
1810+ 0x73,0x61,0x6D,0x70,0x6C,0x65,0x73,0x20,0x28,0x66,0x2E,0x65,
1811+ 0x78,0x2E,0x20,0x41,0x6D,0x69,0x67,0x61,0x20,0x4D,0x4F,0x44,
1812+ 0x73,0x29,0x2E,0x00,0x1A,0x3E,0x40,0x58,0x30,0x34,0x30,0x40,
1813+ 0x43,0x30,0x30,0x31,0x56,0x6F,0x6C,0x75,0x6D,0x65,0x20,0x72,
1814+ 0x61,0x6D,0x70,0x69,0x6E,0x67,0x3A,0x0B,0x3E,0x40,0x58,0x30,
1815+ 0x36,0x30,0x40,0x43,0x30,0x30,0x32,0x3B,0x45,0x6E,0x61,0x62,
1816+ 0x6C,0x65,0x73,0x20,0x74,0x68,0x65,0x20,0x61,0x6E,0x74,0x69,
1817+ 0x2D,0x63,0x6C,0x69,0x63,0x6B,0x20,0x73,0x79,0x73,0x74,0x65,
1818+ 0x6D,0x20,0x69,0x6E,0x20,0x74,0x68,0x65,0x20,0x61,0x75,0x64,
1819+ 0x69,0x6F,0x20,0x6D,0x69,0x78,0x65,0x72,0x20,0x28,0x46,0x54,
1820+ 0x32,0x2E,0x30,0x38,0x2B,0x29,0x2E,0x3B,0x50,0x6C,0x65,0x61,
1821+ 0x73,0x65,0x20,0x6E,0x6F,0x74,0x65,0x20,0x74,0x68,0x61,0x74,
1822+ 0x20,0x6F,0x72,0x69,0x67,0x69,0x6E,0x61,0x6C,0x20,0x46,0x54,
1823+ 0x32,0x20,0x63,0x61,0x6E,0x27,0x74,0x20,0x6C,0x6F,0x61,0x64,
1824+ 0x20,0x74,0x68,0x69,0x73,0x20,0x63,0x6F,0x6E,0x66,0x69,0x67,
1825+ 0x20,0x65,0x6E,0x74,0x72,0x79,0x2C,0x0B,0x63,0x6C,0x6F,0x6E,
1826+ 0x65,0x20,0x6F,0x6E,0x6C,0x79,0x2E,0x00,0x19,0x3E,0x40,0x58,
1827+ 0x30,0x34,0x30,0x40,0x43,0x30,0x30,0x31,0x41,0x6D,0x70,0x6C,
1828+ 0x69,0x66,0x69,0x63,0x61,0x74,0x69,0x6F,0x6E,0x3A,0x0B,0x3E,
1829+ 0x40,0x58,0x30,0x36,0x30,0x40,0x43,0x30,0x30,0x32,0x46,0x41,
1830+ 0x6D,0x70,0x6C,0x69,0x66,0x69,0x65,0x73,0x20,0x74,0x68,0x65,
1831+ 0x20,0x76,0x6F,0x6C,0x75,0x6D,0x65,0x20,0x77,0x68,0x65,0x6E,
1832+ 0x20,0x6D,0x69,0x78,0x69,0x6E,0x67,0x2E,0x20,0x49,0x66,0x20,
1833+ 0x79,0x6F,0x75,0x20,0x73,0x65,0x74,0x20,0x74,0x68,0x69,0x73,
1834+ 0x20,0x6F,0x6E,0x65,0x20,0x74,0x6F,0x6F,0x20,0x68,0x69,0x67,
1835+ 0x68,0x2C,0x20,0x79,0x6F,0x75,0x27,0x6C,0x6C,0x3A,0x67,0x65,
1836+ 0x74,0x20,0x64,0x69,0x73,0x74,0x6F,0x72,0x74,0x69,0x6F,0x6E,
1837+ 0x2E,0x20,0x33,0x32,0x58,0x20,0x65,0x71,0x75,0x61,0x6C,0x73,
1838+ 0x20,0x66,0x75,0x6C,0x6C,0x20,0x61,0x6D,0x70,0x6C,0x69,0x74,
1839+ 0x75,0x64,0x65,0x20,0x66,0x6F,0x72,0x20,0x6F,0x6E,0x65,0x20,
1840+ 0x63,0x68,0x61,0x6E,0x6E,0x65,0x6C,0x2E,0x00,0x1B,0x3E,0x40,
1841+ 0x58,0x30,0x34,0x30,0x40,0x43,0x30,0x30,0x31,0x46,0x72,0x65,
1842+ 0x71,0x75,0x65,0x6E,0x63,0x79,0x20,0x74,0x61,0x62,0x6C,0x65,
1843+ 0x3A,0x0B,0x3E,0x40,0x58,0x30,0x36,0x30,0x40,0x43,0x30,0x30,
1844+ 0x32,0x40,0x54,0x68,0x65,0x20,0x6C,0x69,0x6E,0x65,0x61,0x72,
1845+ 0x20,0x66,0x72,0x65,0x71,0x75,0x65,0x6E,0x63,0x79,0x20,0x74,
1846+ 0x61,0x62,0x6C,0x65,0x20,0x6D,0x61,0x6B,0x65,0x73,0x20,0x61,
1847+ 0x6C,0x6C,0x20,0x70,0x69,0x74,0x63,0x68,0x20,0x62,0x65,0x6E,
1848+ 0x64,0x73,0x20,0x72,0x75,0x6E,0x20,0x69,0x6E,0x20,0x63,0x6F,
1849+ 0x6E,0x73,0x74,0x61,0x6E,0x74,0x3F,0x73,0x70,0x65,0x65,0x64,
1850+ 0x2C,0x20,0x69,0x6E,0x64,0x65,0x70,0x65,0x6E,0x64,0x65,0x6E,
1851+ 0x74,0x20,0x6F,0x66,0x20,0x74,0x68,0x65,0x20,0x63,0x75,0x72,
1852+ 0x72,0x65,0x6E,0x74,0x20,0x66,0x72,0x65,0x71,0x75,0x65,0x6E,
1853+ 0x63,0x79,0x2E,0x20,0x49,0x66,0x20,0x79,0x6F,0x75,0x20,0x73,
1854+ 0x77,0x69,0x74,0x63,0x68,0x20,0x74,0x68,0x69,0x73,0x41,0x6F,
1855+ 0x6E,0x65,0x2C,0x20,0x6F,0x6E,0x20,0x61,0x20,0x66,0x69,0x6E,
1856+ 0x69,0x73,0x68,0x65,0x64,0x20,0x73,0x6F,0x6E,0x67,0x2C,0x20,
1857+ 0x69,0x74,0x20,0x6D,0x69,0x67,0x68,0x74,0x20,0x73,0x6F,0x75,
1858+ 0x6E,0x64,0x20,0x73,0x74,0x72,0x61,0x6E,0x67,0x65,0x20,0x69,
1859+ 0x66,0x20,0x74,0x68,0x65,0x20,0x73,0x6F,0x75,0x6E,0x64,0x20,
1860+ 0x75,0x73,0x65,0x73,0x0D,0x70,0x6F,0x72,0x74,0x61,0x6D,0x65,
1861+ 0x6E,0x74,0x6F,0x65,0x73,0x2E,0x00,0x20,0x40,0x58,0x30,0x32,
1862+ 0x30,0x40,0x43,0x30,0x30,0x31,0x43,0x6F,0x6E,0x66,0x69,0x67,
1863+ 0x75,0x72,0x61,0x74,0x69,0x6F,0x6E,0x2C,0x20,0x4C,0x61,0x79,
1864+ 0x6F,0x75,0x74,0x3A,0x01,0x3E,0x29,0x3E,0x40,0x58,0x30,0x34,
1865+ 0x30,0x40,0x43,0x30,0x30,0x31,0x50,0x61,0x74,0x74,0x65,0x72,
1866+ 0x6E,0x20,0x6C,0x61,0x79,0x6F,0x75,0x74,0x2C,0x20,0x68,0x65,
1867+ 0x78,0x20,0x6E,0x75,0x6D,0x62,0x65,0x72,0x69,0x6E,0x67,0x3A,
18431868 0x0B,0x3E,0x40,0x58,0x30,0x36,0x30,0x40,0x43,0x30,0x30,0x32,
1844− 0x40,0x54,0x68,0x65,0x20,0x6C,0x69,0x6E,0x65,0x61,0x72,0x20,
1845− 0x66,0x72,0x65,0x71,0x75,0x65,0x6E,0x63,0x79,0x20,0x74,0x61,
1846− 0x62,0x6C,0x65,0x20,0x6D,0x61,0x6B,0x65,0x73,0x20,0x61,0x6C,
1847− 0x6C,0x20,0x70,0x69,0x74,0x63,0x68,0x20,0x62,0x65,0x6E,0x64,
1848− 0x73,0x20,0x72,0x75,0x6E,0x20,0x69,0x6E,0x20,0x63,0x6F,0x6E,
1849− 0x73,0x74,0x61,0x6E,0x74,0x3F,0x73,0x70,0x65,0x65,0x64,0x2C,
1850− 0x20,0x69,0x6E,0x64,0x65,0x70,0x65,0x6E,0x64,0x65,0x6E,0x74,
1851− 0x20,0x6F,0x66,0x20,0x74,0x68,0x65,0x20,0x63,0x75,0x72,0x72,
1852− 0x65,0x6E,0x74,0x20,0x66,0x72,0x65,0x71,0x75,0x65,0x6E,0x63,
1853− 0x79,0x2E,0x20,0x49,0x66,0x20,0x79,0x6F,0x75,0x20,0x73,0x77,
1854− 0x69,0x74,0x63,0x68,0x20,0x74,0x68,0x69,0x73,0x41,0x6F,0x6E,
1855− 0x65,0x2C,0x20,0x6F,0x6E,0x20,0x61,0x20,0x66,0x69,0x6E,0x69,
1856− 0x73,0x68,0x65,0x64,0x20,0x73,0x6F,0x6E,0x67,0x2C,0x20,0x69,
1857− 0x74,0x20,0x6D,0x69,0x67,0x68,0x74,0x20,0x73,0x6F,0x75,0x6E,
1858− 0x64,0x20,0x73,0x74,0x72,0x61,0x6E,0x67,0x65,0x20,0x69,0x66,
1859− 0x20,0x74,0x68,0x65,0x20,0x73,0x6F,0x75,0x6E,0x64,0x20,0x75,
1860− 0x73,0x65,0x73,0x0D,0x70,0x6F,0x72,0x74,0x61,0x6D,0x65,0x6E,
1861− 0x74,0x6F,0x65,0x73,0x2E,0x00,0x20,0x40,0x58,0x30,0x32,0x30,
1862− 0x40,0x43,0x30,0x30,0x31,0x43,0x6F,0x6E,0x66,0x69,0x67,0x75,
1863− 0x72,0x61,0x74,0x69,0x6F,0x6E,0x2C,0x20,0x4C,0x61,0x79,0x6F,
1864− 0x75,0x74,0x3A,0x01,0x3E,0x29,0x3E,0x40,0x58,0x30,0x34,0x30,
1865− 0x40,0x43,0x30,0x30,0x31,0x50,0x61,0x74,0x74,0x65,0x72,0x6E,
1866− 0x20,0x6C,0x61,0x79,0x6F,0x75,0x74,0x2C,0x20,0x68,0x65,0x78,
1867− 0x20,0x6E,0x75,0x6D,0x62,0x65,0x72,0x69,0x6E,0x67,0x3A,0x0B,
1868− 0x3E,0x40,0x58,0x30,0x36,0x30,0x40,0x43,0x30,0x30,0x32,0x41,
1869− 0x49,0x66,0x20,0x79,0x6F,0x75,0x20,0x75,0x73,0x65,0x20,0x70,
1870− 0x61,0x74,0x74,0x65,0x72,0x6E,0x73,0x20,0x74,0x68,0x61,0x74,
1871− 0x20,0x61,0x72,0x65,0x20,0x6C,0x6F,0x6E,0x67,0x65,0x72,0x20,
1872− 0x74,0x68,0x61,0x6E,0x20,0x39,0x39,0x20,0x6C,0x69,0x6E,0x65,
1873− 0x73,0x2C,0x20,0x79,0x6F,0x75,0x20,0x73,0x68,0x6F,0x75,0x6C,
1874− 0x64,0x20,0x75,0x73,0x65,0x45,0x68,0x65,0x78,0x20,0x63,0x6F,
1875− 0x75,0x6E,0x74,0x69,0x6E,0x67,0x20,0x73,0x69,0x6E,0x63,0x65,
1876− 0x20,0x74,0x68,0x65,0x72,0x65,0x20,0x61,0x72,0x65,0x20,0x6F,
1877− 0x6E,0x6C,0x79,0x20,0x32,0x20,0x64,0x69,0x67,0x69,0x74,0x73,
1878− 0x20,0x69,0x6E,0x20,0x74,0x68,0x65,0x20,0x6C,0x69,0x6E,0x65,
1879− 0x20,0x6E,0x75,0x6D,0x62,0x65,0x72,0x20,0x63,0x6F,0x6C,0x75,
1880− 0x6D,0x6E,0x2E,0x00,0x12,0x3E,0x40,0x58,0x30,0x34,0x30,0x40,
1881− 0x43,0x30,0x30,0x31,0x53,0x63,0x6F,0x70,0x65,0x73,0x3A,0x0B,
1882− 0x3E,0x40,0x58,0x30,0x36,0x30,0x40,0x43,0x30,0x30,0x32,0x43,
1883− 0x22,0x53,0x74,0x64,0x2E,0x22,0x20,0x28,0x73,0x74,0x61,0x6E,
1884− 0x64,0x61,0x72,0x64,0x29,0x20,0x77,0x69,0x6C,0x6C,0x20,0x73,
1885− 0x68,0x6F,0x77,0x20,0x74,0x68,0x65,0x20,0x73,0x61,0x6D,0x70,
1886− 0x6C,0x65,0x20,0x70,0x6F,0x69,0x6E,0x74,0x73,0x20,0x61,0x73,
1887− 0x20,0x70,0x69,0x78,0x65,0x6C,0x73,0x20,0x28,0x6C,0x69,0x6B,
1888− 0x65,0x20,0x46,0x54,0x32,0x29,0x2E,0x41,0x22,0x4C,0x69,0x6E,
1889− 0x65,0x64,0x22,0x20,0x77,0x69,0x6C,0x6C,0x20,0x64,0x72,0x61,
1890− 0x77,0x20,0x6C,0x69,0x6E,0x65,0x73,0x20,0x62,0x65,0x74,0x77,
1891− 0x65,0x65,0x6E,0x20,0x74,0x68,0x65,0x20,0x70,0x6F,0x69,0x6E,
1892− 0x74,0x73,0x2C,0x20,0x6C,0x69,0x6B,0x65,0x20,0x61,0x6E,0x20,
1893− 0x6F,0x73,0x63,0x69,0x6C,0x6C,0x6F,0x73,0x63,0x6F,0x70,0x65,
1894− 0x2E,0x00,0x27,0x40,0x58,0x30,0x32,0x30,0x40,0x43,0x30,0x30,
1895− 0x31,0x43,0x6F,0x6E,0x66,0x69,0x67,0x75,0x72,0x61,0x74,0x69,
1896− 0x6F,0x6E,0x2C,0x20,0x4D,0x69,0x73,0x63,0x65,0x6C,0x6C,0x61,
1897− 0x6E,0x65,0x6F,0x75,0x73,0x3A,0x01,0x3E,0x15,0x3E,0x40,0x58,
1898− 0x30,0x34,0x30,0x40,0x43,0x30,0x30,0x31,0x56,0x53,0x79,0x6E,
1899− 0x63,0x20,0x6F,0x66,0x66,0x3A,0x0B,0x3E,0x40,0x58,0x30,0x36,
1900− 0x30,0x40,0x43,0x30,0x30,0x32,0x3F,0x54,0x65,0x6C,0x6C,0x73,
1901− 0x20,0x74,0x68,0x65,0x20,0x70,0x72,0x6F,0x67,0x72,0x61,0x6D,
1902− 0x20,0x74,0x6F,0x20,0x6E,0x6F,0x74,0x20,0x75,0x73,0x65,0x20,
1903− 0x56,0x53,0x79,0x6E,0x63,0x20,0x66,0x6F,0x72,0x20,0x76,0x69,
1904− 0x64,0x65,0x6F,0x2E,0x20,0x49,0x66,0x20,0x79,0x6F,0x75,0x72,
1905− 0x20,0x6D,0x6F,0x6E,0x69,0x74,0x6F,0x72,0x27,0x73,0x40,0x72,
1906− 0x65,0x66,0x72,0x65,0x73,0x68,0x20,0x72,0x61,0x74,0x65,0x20,
1907− 0x69,0x73,0x20,0x6E,0x6F,0x74,0x20,0x36,0x30,0x48,0x7A,0x20,
1908− 0x28,0x6F,0x72,0x20,0x35,0x39,0x48,0x7A,0x29,0x2C,0x20,0x74,
1909− 0x68,0x65,0x6E,0x20,0x56,0x53,0x79,0x6E,0x63,0x20,0x69,0x73,
1910− 0x20,0x61,0x6C,0x77,0x61,0x79,0x73,0x20,0x6F,0x66,0x66,0x20,
1911− 0x66,0x6F,0x72,0x45,0x74,0x68,0x69,0x73,0x20,0x70,0x72,0x6F,
1912− 0x67,0x72,0x61,0x6D,0x2E,0x20,0x4E,0x6F,0x74,0x20,0x68,0x61,
1913− 0x76,0x69,0x6E,0x67,0x20,0x56,0x53,0x79,0x6E,0x63,0x20,0x77,
1914− 0x69,0x6C,0x6C,0x20,0x72,0x65,0x73,0x75,0x6C,0x74,0x20,0x69,
1915− 0x6E,0x20,0x6C,0x65,0x73,0x73,0x20,0x69,0x6E,0x70,0x75,0x74,
1916− 0x2F,0x76,0x69,0x64,0x65,0x6F,0x20,0x64,0x65,0x6C,0x61,0x79,
1917− 0x2C,0x1E,0x62,0x75,0x74,0x20,0x61,0x6C,0x73,0x6F,0x20,0x70,
1918− 0x6F,0x74,0x65,0x6E,0x74,0x69,0x61,0x6C,0x20,0x73,0x74,0x75,
1919− 0x74,0x74,0x65,0x72,0x69,0x6E,0x67,0x2E,0x01,0x20,0x18,0x3E,
1920− 0x40,0x58,0x30,0x34,0x30,0x40,0x43,0x30,0x30,0x31,0x50,0x69,
1921− 0x78,0x65,0x6C,0x20,0x66,0x69,0x6C,0x74,0x65,0x72,0x3A,0x0B,
1922− 0x3E,0x40,0x58,0x30,0x36,0x30,0x40,0x43,0x30,0x30,0x32,0x43,
1923− 0x41,0x70,0x70,0x6C,0x69,0x65,0x73,0x20,0x61,0x20,0x73,0x75,
1924− 0x62,0x70,0x69,0x78,0x65,0x6C,0x20,0x66,0x69,0x6C,0x74,0x65,
1925− 0x72,0x20,0x74,0x68,0x61,0x74,0x20,0x69,0x73,0x20,0x75,0x73,
1926− 0x65,0x64,0x20,0x77,0x68,0x65,0x6E,0x20,0x74,0x68,0x65,0x20,
1927− 0x77,0x69,0x6E,0x64,0x6F,0x77,0x20,0x69,0x73,0x20,0x75,0x70,
1928− 0x73,0x63,0x61,0x6C,0x65,0x64,0x2E,0x43,0x54,0x68,0x69,0x73,
1929− 0x20,0x61,0x6C,0x73,0x6F,0x20,0x6D,0x61,0x6B,0x65,0x73,0x20,
1930− 0x66,0x75,0x6C,0x6C,0x73,0x63,0x72,0x65,0x65,0x6E,0x20,0x6D,
1931− 0x6F,0x64,0x65,0x20,0x63,0x6F,0x6D,0x70,0x6C,0x65,0x74,0x65,
1932− 0x6C,0x79,0x20,0x73,0x74,0x72,0x65,0x74,0x63,0x68,0x20,0x6F,
1933− 0x75,0x74,0x20,0x69,0x66,0x20,0x69,0x74,0x20,0x64,0x69,0x64,
1934− 0x6E,0x27,0x74,0x44,0x61,0x6C,0x72,0x65,0x61,0x64,0x79,0x2E,
1935− 0x20,0x50,0x6C,0x65,0x61,0x73,0x65,0x20,0x6B,0x65,0x65,0x70,
1936− 0x20,0x69,0x6E,0x20,0x6D,0x69,0x6E,0x64,0x20,0x74,0x68,0x61,
1937− 0x74,0x20,0x74,0x68,0x69,0x73,0x20,0x77,0x69,0x6C,0x6C,0x20,
1938− 0x6D,0x61,0x6B,0x65,0x20,0x70,0x69,0x78,0x65,0x6C,0x73,0x20,
1939− 0x6C,0x6F,0x6F,0x6B,0x20,0x62,0x6C,0x75,0x72,0x72,0x79,0x2E,
1940− 0x00,0x23,0x40,0x58,0x30,0x32,0x30,0x40,0x43,0x30,0x30,0x31,
1941− 0x41,0x64,0x76,0x61,0x6E,0x63,0x65,0x64,0x20,0x65,0x64,0x69,
1942− 0x74,0x20,0x66,0x75,0x6E,0x63,0x74,0x69,0x6F,0x6E,0x73,0x3A,
1943− 0x20,0x01,0x3E,0x1E,0x3E,0x40,0x58,0x30,0x34,0x30,0x40,0x43,
1944− 0x30,0x30,0x31,0x43,0x6F,0x70,0x79,0x2F,0x50,0x61,0x73,0x74,
1945− 0x65,0x20,0x6D,0x61,0x73,0x6B,0x69,0x6E,0x67,0x3A,0x0B,0x3E,
1946− 0x40,0x58,0x30,0x36,0x30,0x40,0x43,0x30,0x30,0x32,0x37,0x54,
1947− 0x68,0x65,0x20,0x6D,0x61,0x73,0x6B,0x69,0x6E,0x67,0x20,0x69,
1948− 0x73,0x20,0x75,0x73,0x65,0x64,0x20,0x66,0x6F,0x72,0x20,0x63,
1949− 0x6F,0x70,0x79,0x69,0x6E,0x67,0x2F,0x70,0x61,0x73,0x74,0x69,
1950− 0x6E,0x67,0x20,0x6F,0x6E,0x6C,0x79,0x20,0x70,0x61,0x72,0x74,
1951− 0x73,0x20,0x6F,0x66,0x20,0x61,0x46,0x22,0x6E,0x6F,0x74,0x65,
1952− 0x2D,0x63,0x65,0x6C,0x6C,0x22,0x2E,0x20,0x54,0x68,0x65,0x20,
1953− 0x64,0x69,0x66,0x66,0x65,0x72,0x65,0x6E,0x74,0x20,0x70,0x61,
1954− 0x72,0x74,0x73,0x20,0x6F,0x66,0x20,0x61,0x20,0x22,0x6E,0x6F,
1955− 0x74,0x65,0x2D,0x63,0x65,0x6C,0x6C,0x22,0x20,0x69,0x73,0x20,
1956− 0x4E,0x6F,0x74,0x65,0x2C,0x20,0x49,0x6E,0x73,0x74,0x72,0x2E,
1957− 0x20,0x6E,0x72,0x2E,0x2C,0x20,0x56,0x6F,0x6C,0x75,0x6D,0x65,
1958− 0x2C,0x20,0x45,0x66,0x66,0x65,0x63,0x74,0x20,0x6E,0x72,0x20,
1959− 0x26,0x20,0x45,0x66,0x66,0x65,0x63,0x74,0x20,0x64,0x61,0x74,
1960− 0x61,0x2E,0x34,0x3E,0x41,0x73,0x20,0x79,0x6F,0x75,0x20,0x63,
1961− 0x61,0x6E,0x20,0x73,0x65,0x65,0x20,0x69,0x6E,0x20,0x74,0x68,
1962− 0x65,0x20,0x77,0x69,0x6E,0x64,0x6F,0x77,0x20,0x74,0x68,0x65,
1963− 0x72,0x65,0x20,0x61,0x72,0x65,0x20,0x33,0x20,0x63,0x6F,0x6C,
1964− 0x75,0x6D,0x6E,0x73,0x20,0x6F,0x66,0x3D,0x22,0x65,0x6E,0x61,
1965− 0x62,0x6C,0x65,0x2F,0x64,0x69,0x73,0x61,0x62,0x6C,0x65,0x20,
1966− 0x62,0x75,0x74,0x74,0x6F,0x6E,0x73,0x22,0x20,0x77,0x68,0x69,
1967− 0x63,0x68,0x20,0x68,0x61,0x73,0x20,0x74,0x68,0x65,0x20,0x6C,
1968− 0x65,0x74,0x74,0x65,0x72,0x73,0x20,0x43,0x2C,0x50,0x20,0x26,
1969− 0x20,0x54,0x20,0x61,0x62,0x6F,0x76,0x65,0x2E,0x45,0x3E,0x43,
1970− 0x20,0x6D,0x65,0x61,0x6E,0x73,0x20,0x63,0x6F,0x70,0x79,0x2C,
1971− 0x20,0x69,0x74,0x20,0x63,0x6F,0x6E,0x74,0x72,0x6F,0x6C,0x73,
1869+ 0x41,0x49,0x66,0x20,0x79,0x6F,0x75,0x20,0x75,0x73,0x65,0x20,
1870+ 0x70,0x61,0x74,0x74,0x65,0x72,0x6E,0x73,0x20,0x74,0x68,0x61,
1871+ 0x74,0x20,0x61,0x72,0x65,0x20,0x6C,0x6F,0x6E,0x67,0x65,0x72,
1872+ 0x20,0x74,0x68,0x61,0x6E,0x20,0x39,0x39,0x20,0x6C,0x69,0x6E,
1873+ 0x65,0x73,0x2C,0x20,0x79,0x6F,0x75,0x20,0x73,0x68,0x6F,0x75,
1874+ 0x6C,0x64,0x20,0x75,0x73,0x65,0x45,0x68,0x65,0x78,0x20,0x63,
1875+ 0x6F,0x75,0x6E,0x74,0x69,0x6E,0x67,0x20,0x73,0x69,0x6E,0x63,
1876+ 0x65,0x20,0x74,0x68,0x65,0x72,0x65,0x20,0x61,0x72,0x65,0x20,
1877+ 0x6F,0x6E,0x6C,0x79,0x20,0x32,0x20,0x64,0x69,0x67,0x69,0x74,
1878+ 0x73,0x20,0x69,0x6E,0x20,0x74,0x68,0x65,0x20,0x6C,0x69,0x6E,
1879+ 0x65,0x20,0x6E,0x75,0x6D,0x62,0x65,0x72,0x20,0x63,0x6F,0x6C,
1880+ 0x75,0x6D,0x6E,0x2E,0x00,0x12,0x3E,0x40,0x58,0x30,0x34,0x30,
1881+ 0x40,0x43,0x30,0x30,0x31,0x53,0x63,0x6F,0x70,0x65,0x73,0x3A,
1882+ 0x0B,0x3E,0x40,0x58,0x30,0x36,0x30,0x40,0x43,0x30,0x30,0x32,
1883+ 0x43,0x22,0x53,0x74,0x64,0x2E,0x22,0x20,0x28,0x73,0x74,0x61,
1884+ 0x6E,0x64,0x61,0x72,0x64,0x29,0x20,0x77,0x69,0x6C,0x6C,0x20,
1885+ 0x73,0x68,0x6F,0x77,0x20,0x74,0x68,0x65,0x20,0x73,0x61,0x6D,
1886+ 0x70,0x6C,0x65,0x20,0x70,0x6F,0x69,0x6E,0x74,0x73,0x20,0x61,
1887+ 0x73,0x20,0x70,0x69,0x78,0x65,0x6C,0x73,0x20,0x28,0x6C,0x69,
1888+ 0x6B,0x65,0x20,0x46,0x54,0x32,0x29,0x2E,0x41,0x22,0x4C,0x69,
1889+ 0x6E,0x65,0x64,0x22,0x20,0x77,0x69,0x6C,0x6C,0x20,0x64,0x72,
1890+ 0x61,0x77,0x20,0x6C,0x69,0x6E,0x65,0x73,0x20,0x62,0x65,0x74,
1891+ 0x77,0x65,0x65,0x6E,0x20,0x74,0x68,0x65,0x20,0x70,0x6F,0x69,
1892+ 0x6E,0x74,0x73,0x2C,0x20,0x6C,0x69,0x6B,0x65,0x20,0x61,0x6E,
1893+ 0x20,0x6F,0x73,0x63,0x69,0x6C,0x6C,0x6F,0x73,0x63,0x6F,0x70,
1894+ 0x65,0x2E,0x00,0x27,0x40,0x58,0x30,0x32,0x30,0x40,0x43,0x30,
1895+ 0x30,0x31,0x43,0x6F,0x6E,0x66,0x69,0x67,0x75,0x72,0x61,0x74,
1896+ 0x69,0x6F,0x6E,0x2C,0x20,0x4D,0x69,0x73,0x63,0x65,0x6C,0x6C,
1897+ 0x61,0x6E,0x65,0x6F,0x75,0x73,0x3A,0x01,0x3E,0x15,0x3E,0x40,
1898+ 0x58,0x30,0x34,0x30,0x40,0x43,0x30,0x30,0x31,0x56,0x53,0x79,
1899+ 0x6E,0x63,0x20,0x6F,0x66,0x66,0x3A,0x0B,0x3E,0x40,0x58,0x30,
1900+ 0x36,0x30,0x40,0x43,0x30,0x30,0x32,0x3F,0x54,0x65,0x6C,0x6C,
1901+ 0x73,0x20,0x74,0x68,0x65,0x20,0x70,0x72,0x6F,0x67,0x72,0x61,
1902+ 0x6D,0x20,0x74,0x6F,0x20,0x6E,0x6F,0x74,0x20,0x75,0x73,0x65,
1903+ 0x20,0x56,0x53,0x79,0x6E,0x63,0x20,0x66,0x6F,0x72,0x20,0x76,
1904+ 0x69,0x64,0x65,0x6F,0x2E,0x20,0x49,0x66,0x20,0x79,0x6F,0x75,
1905+ 0x72,0x20,0x6D,0x6F,0x6E,0x69,0x74,0x6F,0x72,0x27,0x73,0x40,
1906+ 0x72,0x65,0x66,0x72,0x65,0x73,0x68,0x20,0x72,0x61,0x74,0x65,
1907+ 0x20,0x69,0x73,0x20,0x6E,0x6F,0x74,0x20,0x36,0x30,0x48,0x7A,
1908+ 0x20,0x28,0x6F,0x72,0x20,0x35,0x39,0x48,0x7A,0x29,0x2C,0x20,
1909+ 0x74,0x68,0x65,0x6E,0x20,0x56,0x53,0x79,0x6E,0x63,0x20,0x69,
1910+ 0x73,0x20,0x61,0x6C,0x77,0x61,0x79,0x73,0x20,0x6F,0x66,0x66,
1911+ 0x20,0x66,0x6F,0x72,0x45,0x74,0x68,0x69,0x73,0x20,0x70,0x72,
1912+ 0x6F,0x67,0x72,0x61,0x6D,0x2E,0x20,0x4E,0x6F,0x74,0x20,0x68,
1913+ 0x61,0x76,0x69,0x6E,0x67,0x20,0x56,0x53,0x79,0x6E,0x63,0x20,
1914+ 0x77,0x69,0x6C,0x6C,0x20,0x72,0x65,0x73,0x75,0x6C,0x74,0x20,
1915+ 0x69,0x6E,0x20,0x6C,0x65,0x73,0x73,0x20,0x69,0x6E,0x70,0x75,
1916+ 0x74,0x2F,0x76,0x69,0x64,0x65,0x6F,0x20,0x64,0x65,0x6C,0x61,
1917+ 0x79,0x2C,0x1E,0x62,0x75,0x74,0x20,0x61,0x6C,0x73,0x6F,0x20,
1918+ 0x70,0x6F,0x74,0x65,0x6E,0x74,0x69,0x61,0x6C,0x20,0x73,0x74,
1919+ 0x75,0x74,0x74,0x65,0x72,0x69,0x6E,0x67,0x2E,0x01,0x20,0x18,
1920+ 0x3E,0x40,0x58,0x30,0x34,0x30,0x40,0x43,0x30,0x30,0x31,0x50,
1921+ 0x69,0x78,0x65,0x6C,0x20,0x66,0x69,0x6C,0x74,0x65,0x72,0x3A,
1922+ 0x0B,0x3E,0x40,0x58,0x30,0x36,0x30,0x40,0x43,0x30,0x30,0x32,
1923+ 0x43,0x41,0x70,0x70,0x6C,0x69,0x65,0x73,0x20,0x61,0x20,0x73,
1924+ 0x75,0x62,0x70,0x69,0x78,0x65,0x6C,0x20,0x66,0x69,0x6C,0x74,
1925+ 0x65,0x72,0x20,0x74,0x68,0x61,0x74,0x20,0x69,0x73,0x20,0x75,
1926+ 0x73,0x65,0x64,0x20,0x77,0x68,0x65,0x6E,0x20,0x74,0x68,0x65,
1927+ 0x20,0x77,0x69,0x6E,0x64,0x6F,0x77,0x20,0x69,0x73,0x20,0x75,
1928+ 0x70,0x73,0x63,0x61,0x6C,0x65,0x64,0x2E,0x43,0x54,0x68,0x69,
1929+ 0x73,0x20,0x61,0x6C,0x73,0x6F,0x20,0x6D,0x61,0x6B,0x65,0x73,
1930+ 0x20,0x66,0x75,0x6C,0x6C,0x73,0x63,0x72,0x65,0x65,0x6E,0x20,
1931+ 0x6D,0x6F,0x64,0x65,0x20,0x63,0x6F,0x6D,0x70,0x6C,0x65,0x74,
1932+ 0x65,0x6C,0x79,0x20,0x73,0x74,0x72,0x65,0x74,0x63,0x68,0x20,
1933+ 0x6F,0x75,0x74,0x20,0x69,0x66,0x20,0x69,0x74,0x20,0x64,0x69,
1934+ 0x64,0x6E,0x27,0x74,0x44,0x61,0x6C,0x72,0x65,0x61,0x64,0x79,
1935+ 0x2E,0x20,0x50,0x6C,0x65,0x61,0x73,0x65,0x20,0x6B,0x65,0x65,
1936+ 0x70,0x20,0x69,0x6E,0x20,0x6D,0x69,0x6E,0x64,0x20,0x74,0x68,
1937+ 0x61,0x74,0x20,0x74,0x68,0x69,0x73,0x20,0x77,0x69,0x6C,0x6C,
1938+ 0x20,0x6D,0x61,0x6B,0x65,0x20,0x70,0x69,0x78,0x65,0x6C,0x73,
1939+ 0x20,0x6C,0x6F,0x6F,0x6B,0x20,0x62,0x6C,0x75,0x72,0x72,0x79,
1940+ 0x2E,0x00,0x23,0x40,0x58,0x30,0x32,0x30,0x40,0x43,0x30,0x30,
1941+ 0x31,0x41,0x64,0x76,0x61,0x6E,0x63,0x65,0x64,0x20,0x65,0x64,
1942+ 0x69,0x74,0x20,0x66,0x75,0x6E,0x63,0x74,0x69,0x6F,0x6E,0x73,
1943+ 0x3A,0x20,0x01,0x3E,0x1E,0x3E,0x40,0x58,0x30,0x34,0x30,0x40,
1944+ 0x43,0x30,0x30,0x31,0x43,0x6F,0x70,0x79,0x2F,0x50,0x61,0x73,
1945+ 0x74,0x65,0x20,0x6D,0x61,0x73,0x6B,0x69,0x6E,0x67,0x3A,0x0B,
1946+ 0x3E,0x40,0x58,0x30,0x36,0x30,0x40,0x43,0x30,0x30,0x32,0x37,
1947+ 0x54,0x68,0x65,0x20,0x6D,0x61,0x73,0x6B,0x69,0x6E,0x67,0x20,
1948+ 0x69,0x73,0x20,0x75,0x73,0x65,0x64,0x20,0x66,0x6F,0x72,0x20,
1949+ 0x63,0x6F,0x70,0x79,0x69,0x6E,0x67,0x2F,0x70,0x61,0x73,0x74,
1950+ 0x69,0x6E,0x67,0x20,0x6F,0x6E,0x6C,0x79,0x20,0x70,0x61,0x72,
1951+ 0x74,0x73,0x20,0x6F,0x66,0x20,0x61,0x46,0x22,0x6E,0x6F,0x74,
1952+ 0x65,0x2D,0x63,0x65,0x6C,0x6C,0x22,0x2E,0x20,0x54,0x68,0x65,
1953+ 0x20,0x64,0x69,0x66,0x66,0x65,0x72,0x65,0x6E,0x74,0x20,0x70,
1954+ 0x61,0x72,0x74,0x73,0x20,0x6F,0x66,0x20,0x61,0x20,0x22,0x6E,
1955+ 0x6F,0x74,0x65,0x2D,0x63,0x65,0x6C,0x6C,0x22,0x20,0x69,0x73,
1956+ 0x20,0x4E,0x6F,0x74,0x65,0x2C,0x20,0x49,0x6E,0x73,0x74,0x72,
1957+ 0x2E,0x20,0x6E,0x72,0x2E,0x2C,0x20,0x56,0x6F,0x6C,0x75,0x6D,
1958+ 0x65,0x2C,0x20,0x45,0x66,0x66,0x65,0x63,0x74,0x20,0x6E,0x72,
1959+ 0x20,0x26,0x20,0x45,0x66,0x66,0x65,0x63,0x74,0x20,0x64,0x61,
1960+ 0x74,0x61,0x2E,0x34,0x3E,0x41,0x73,0x20,0x79,0x6F,0x75,0x20,
1961+ 0x63,0x61,0x6E,0x20,0x73,0x65,0x65,0x20,0x69,0x6E,0x20,0x74,
1962+ 0x68,0x65,0x20,0x77,0x69,0x6E,0x64,0x6F,0x77,0x20,0x74,0x68,
1963+ 0x65,0x72,0x65,0x20,0x61,0x72,0x65,0x20,0x33,0x20,0x63,0x6F,
1964+ 0x6C,0x75,0x6D,0x6E,0x73,0x20,0x6F,0x66,0x3D,0x22,0x65,0x6E,
1965+ 0x61,0x62,0x6C,0x65,0x2F,0x64,0x69,0x73,0x61,0x62,0x6C,0x65,
1966+ 0x20,0x62,0x75,0x74,0x74,0x6F,0x6E,0x73,0x22,0x20,0x77,0x68,
1967+ 0x69,0x63,0x68,0x20,0x68,0x61,0x73,0x20,0x74,0x68,0x65,0x20,
1968+ 0x6C,0x65,0x74,0x74,0x65,0x72,0x73,0x20,0x43,0x2C,0x50,0x20,
1969+ 0x26,0x20,0x54,0x20,0x61,0x62,0x6F,0x76,0x65,0x2E,0x45,0x3E,
1970+ 0x43,0x20,0x6D,0x65,0x61,0x6E,0x73,0x20,0x63,0x6F,0x70,0x79,
1971+ 0x2C,0x20,0x69,0x74,0x20,0x63,0x6F,0x6E,0x74,0x72,0x6F,0x6C,
1972+ 0x73,0x20,0x77,0x68,0x69,0x63,0x68,0x20,0x70,0x61,0x72,0x74,
1973+ 0x73,0x20,0x74,0x68,0x61,0x74,0x20,0x67,0x6F,0x65,0x73,0x20,
1974+ 0x69,0x6E,0x74,0x6F,0x20,0x74,0x68,0x65,0x20,0x63,0x6F,0x70,
1975+ 0x79,0x62,0x75,0x66,0x66,0x65,0x72,0x2E,0x3E,0x3E,0x50,0x20,
1976+ 0x6D,0x65,0x61,0x6E,0x73,0x20,0x70,0x61,0x73,0x74,0x65,0x20,
1977+ 0x61,0x6E,0x64,0x20,0x63,0x6F,0x6E,0x74,0x72,0x6F,0x6C,0x73,
19721978 0x20,0x77,0x68,0x69,0x63,0x68,0x20,0x70,0x61,0x72,0x74,0x73,
1973− 0x20,0x74,0x68,0x61,0x74,0x20,0x67,0x6F,0x65,0x73,0x20,0x69,
1974− 0x6E,0x74,0x6F,0x20,0x74,0x68,0x65,0x20,0x63,0x6F,0x70,0x79,
1975− 0x62,0x75,0x66,0x66,0x65,0x72,0x2E,0x3E,0x3E,0x50,0x20,0x6D,
1976− 0x65,0x61,0x6E,0x73,0x20,0x70,0x61,0x73,0x74,0x65,0x20,0x61,
1977− 0x6E,0x64,0x20,0x63,0x6F,0x6E,0x74,0x72,0x6F,0x6C,0x73,0x20,
1978− 0x77,0x68,0x69,0x63,0x68,0x20,0x70,0x61,0x72,0x74,0x73,0x20,
1979− 0x74,0x68,0x61,0x74,0x20,0x67,0x6F,0x65,0x73,0x20,0x6F,0x75,
1980− 0x74,0x20,0x66,0x72,0x6F,0x6D,0x20,0x74,0x68,0x65,0x0B,0x63,
1981− 0x6F,0x70,0x79,0x62,0x75,0x66,0x66,0x65,0x72,0x2E,0x45,0x3E,
1982− 0x54,0x20,0x6D,0x65,0x61,0x6E,0x73,0x20,0x74,0x72,0x61,0x6E,
1983− 0x73,0x70,0x61,0x72,0x65,0x6E,0x63,0x79,0x2E,0x20,0x49,0x66,
1984− 0x20,0x69,0x74,0x27,0x73,0x20,0x65,0x6E,0x61,0x62,0x6C,0x65,
1985− 0x64,0x2C,0x20,0x74,0x68,0x65,0x20,0x70,0x61,0x73,0x74,0x69,
1986− 0x6E,0x67,0x20,0x64,0x6F,0x65,0x73,0x6E,0x27,0x74,0x20,0x6F,
1987− 0x76,0x65,0x72,0x77,0x72,0x69,0x74,0x65,0x3D,0x64,0x61,0x74,
1988− 0x61,0x20,0x77,0x69,0x74,0x68,0x20,0x6E,0x69,0x6C,0x2D,0x69,
1989− 0x6E,0x66,0x6F,0x72,0x6D,0x61,0x74,0x69,0x6F,0x6E,0x2C,0x20,
1990− 0x6F,0x6E,0x6C,0x79,0x20,0x77,0x69,0x74,0x68,0x20,0x61,0x20,
1991− 0x6E,0x6F,0x74,0x65,0x20,0x6F,0x72,0x20,0x61,0x20,0x6E,0x75,
1992− 0x6D,0x62,0x65,0x72,0x20,0x3C,0x3E,0x20,0x30,0x2E,0x01,0x3E,
1993− 0x40,0x3E,0x54,0x68,0x65,0x20,0x63,0x75,0x74,0x20,0x66,0x75,
1994− 0x6E,0x63,0x74,0x69,0x6F,0x6E,0x73,0x20,0x77,0x6F,0x72,0x6B,
1995− 0x73,0x20,0x6C,0x69,0x6B,0x65,0x20,0x70,0x61,0x73,0x74,0x69,
1996− 0x6E,0x67,0x20,0x77,0x69,0x74,0x68,0x20,0x7A,0x65,0x72,0x6F,
1997− 0x2D,0x64,0x61,0x74,0x61,0x2E,0x20,0x54,0x68,0x69,0x73,0x20,
1998− 0x6D,0x65,0x61,0x6E,0x73,0x3B,0x74,0x68,0x61,0x74,0x20,0x74,
1999− 0x68,0x65,0x20,0x63,0x75,0x74,0x74,0x69,0x6E,0x67,0x20,0x69,
2000− 0x73,0x20,0x63,0x6F,0x6E,0x74,0x72,0x6F,0x6C,0x6C,0x65,0x64,
2001− 0x20,0x77,0x69,0x74,0x68,0x20,0x50,0x2D,0x63,0x6F,0x6C,0x75,
2002− 0x6D,0x6E,0x20,0x28,0x6F,0x72,0x20,0x54,0x2D,0x63,0x6F,0x6C,
2003− 0x75,0x6D,0x6E,0x29,0x2E,0x3C,0x3E,0x57,0x68,0x65,0x6E,0x20,
2004− 0x79,0x6F,0x75,0x20,0x63,0x6F,0x70,0x79,0x20,0x64,0x61,0x74,
2005− 0x61,0x20,0x77,0x69,0x74,0x68,0x20,0x6D,0x61,0x73,0x6B,0x69,
2006− 0x6E,0x67,0x2C,0x20,0x74,0x68,0x65,0x20,0x64,0x69,0x73,0x61,
2007− 0x62,0x6C,0x65,0x64,0x20,0x70,0x61,0x72,0x74,0x73,0x20,0x61,
2008− 0x72,0x65,0x20,0x6E,0x6F,0x74,0x43,0x63,0x6C,0x65,0x61,0x72,
2009− 0x65,0x64,0x20,0x69,0x6E,0x20,0x74,0x68,0x65,0x20,0x63,0x6F,
2010− 0x70,0x79,0x62,0x75,0x66,0x66,0x65,0x72,0x2E,0x20,0x28,0x4D,
2011− 0x61,0x6B,0x69,0x6E,0x67,0x20,0x69,0x74,0x20,0x70,0x6F,0x73,
2012− 0x73,0x69,0x62,0x6C,0x65,0x20,0x74,0x6F,0x20,0x63,0x6F,0x6C,
2013− 0x6C,0x65,0x63,0x74,0x20,0x64,0x61,0x74,0x61,0x20,0x66,0x72,
2014− 0x6F,0x6D,0x27,0x73,0x65,0x76,0x65,0x72,0x61,0x6C,0x20,0x6C,
2015− 0x6F,0x63,0x61,0x74,0x69,0x6F,0x6E,0x73,0x20,0x69,0x6E,0x74,
2016− 0x6F,0x20,0x74,0x68,0x65,0x20,0x63,0x6F,0x70,0x79,0x62,0x75,
2017− 0x66,0x66,0x65,0x72,0x2E,0x29,0x00,0x03,0x45,0x4E,0x44,0x4C,
2018− 0x3B,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,
1979+ 0x20,0x74,0x68,0x61,0x74,0x20,0x67,0x6F,0x65,0x73,0x20,0x6F,
1980+ 0x75,0x74,0x20,0x66,0x72,0x6F,0x6D,0x20,0x74,0x68,0x65,0x0B,
1981+ 0x63,0x6F,0x70,0x79,0x62,0x75,0x66,0x66,0x65,0x72,0x2E,0x45,
1982+ 0x3E,0x54,0x20,0x6D,0x65,0x61,0x6E,0x73,0x20,0x74,0x72,0x61,
1983+ 0x6E,0x73,0x70,0x61,0x72,0x65,0x6E,0x63,0x79,0x2E,0x20,0x49,
1984+ 0x66,0x20,0x69,0x74,0x27,0x73,0x20,0x65,0x6E,0x61,0x62,0x6C,
1985+ 0x65,0x64,0x2C,0x20,0x74,0x68,0x65,0x20,0x70,0x61,0x73,0x74,
1986+ 0x69,0x6E,0x67,0x20,0x64,0x6F,0x65,0x73,0x6E,0x27,0x74,0x20,
1987+ 0x6F,0x76,0x65,0x72,0x77,0x72,0x69,0x74,0x65,0x3D,0x64,0x61,
1988+ 0x74,0x61,0x20,0x77,0x69,0x74,0x68,0x20,0x6E,0x69,0x6C,0x2D,
1989+ 0x69,0x6E,0x66,0x6F,0x72,0x6D,0x61,0x74,0x69,0x6F,0x6E,0x2C,
1990+ 0x20,0x6F,0x6E,0x6C,0x79,0x20,0x77,0x69,0x74,0x68,0x20,0x61,
1991+ 0x20,0x6E,0x6F,0x74,0x65,0x20,0x6F,0x72,0x20,0x61,0x20,0x6E,
1992+ 0x75,0x6D,0x62,0x65,0x72,0x20,0x3C,0x3E,0x20,0x30,0x2E,0x01,
1993+ 0x3E,0x40,0x3E,0x54,0x68,0x65,0x20,0x63,0x75,0x74,0x20,0x66,
1994+ 0x75,0x6E,0x63,0x74,0x69,0x6F,0x6E,0x73,0x20,0x77,0x6F,0x72,
1995+ 0x6B,0x73,0x20,0x6C,0x69,0x6B,0x65,0x20,0x70,0x61,0x73,0x74,
1996+ 0x69,0x6E,0x67,0x20,0x77,0x69,0x74,0x68,0x20,0x7A,0x65,0x72,
1997+ 0x6F,0x2D,0x64,0x61,0x74,0x61,0x2E,0x20,0x54,0x68,0x69,0x73,
1998+ 0x20,0x6D,0x65,0x61,0x6E,0x73,0x3B,0x74,0x68,0x61,0x74,0x20,
1999+ 0x74,0x68,0x65,0x20,0x63,0x75,0x74,0x74,0x69,0x6E,0x67,0x20,
2000+ 0x69,0x73,0x20,0x63,0x6F,0x6E,0x74,0x72,0x6F,0x6C,0x6C,0x65,
2001+ 0x64,0x20,0x77,0x69,0x74,0x68,0x20,0x50,0x2D,0x63,0x6F,0x6C,
2002+ 0x75,0x6D,0x6E,0x20,0x28,0x6F,0x72,0x20,0x54,0x2D,0x63,0x6F,
2003+ 0x6C,0x75,0x6D,0x6E,0x29,0x2E,0x3C,0x3E,0x57,0x68,0x65,0x6E,
2004+ 0x20,0x79,0x6F,0x75,0x20,0x63,0x6F,0x70,0x79,0x20,0x64,0x61,
2005+ 0x74,0x61,0x20,0x77,0x69,0x74,0x68,0x20,0x6D,0x61,0x73,0x6B,
2006+ 0x69,0x6E,0x67,0x2C,0x20,0x74,0x68,0x65,0x20,0x64,0x69,0x73,
2007+ 0x61,0x62,0x6C,0x65,0x64,0x20,0x70,0x61,0x72,0x74,0x73,0x20,
2008+ 0x61,0x72,0x65,0x20,0x6E,0x6F,0x74,0x43,0x63,0x6C,0x65,0x61,
2009+ 0x72,0x65,0x64,0x20,0x69,0x6E,0x20,0x74,0x68,0x65,0x20,0x63,
2010+ 0x6F,0x70,0x79,0x62,0x75,0x66,0x66,0x65,0x72,0x2E,0x20,0x28,
2011+ 0x4D,0x61,0x6B,0x69,0x6E,0x67,0x20,0x69,0x74,0x20,0x70,0x6F,
2012+ 0x73,0x73,0x69,0x62,0x6C,0x65,0x20,0x74,0x6F,0x20,0x63,0x6F,
2013+ 0x6C,0x6C,0x65,0x63,0x74,0x20,0x64,0x61,0x74,0x61,0x20,0x66,
2014+ 0x72,0x6F,0x6D,0x27,0x73,0x65,0x76,0x65,0x72,0x61,0x6C,0x20,
2015+ 0x6C,0x6F,0x63,0x61,0x74,0x69,0x6F,0x6E,0x73,0x20,0x69,0x6E,
2016+ 0x74,0x6F,0x20,0x74,0x68,0x65,0x20,0x63,0x6F,0x70,0x79,0x62,
2017+ 0x75,0x66,0x66,0x65,0x72,0x2E,0x29,0x00,0x03,0x45,0x4E,0x44,
2018+ 0x4C,0x3B,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,
20192019 0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,
20202020 0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,
20212021 0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,
20222022 0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,
20232023 0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,
2024− 0x2A,0x2A,0x2A,0x2A,0x4C,0x3B,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,
2024+ 0x2A,0x2A,0x2A,0x2A,0x2A,0x4C,0x3B,0x2A,0x2A,0x2A,0x2A,0x2A,
20252025 0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,
20262026 0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,
20272027 0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,
20282028 0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,
20292029 0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,
2030− 0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x0E,0x40,0x4C,
2031− 0x50,0x72,0x6F,0x62,0x6C,0x65,0x6D,0x73,0x2F,0x46,0x41,0x51,
2032− 0x06,0x3E,0x40,0x58,0x30,0x32,0x30,0x41,0x3E,0x40,0x43,0x30,
2033− 0x30,0x31,0x51,0x3A,0x20,0x43,0x61,0x6E,0x20,0x49,0x20,0x6D,
2034− 0x61,0x6B,0x65,0x20,0x66,0x75,0x6C,0x6C,0x73,0x63,0x72,0x65,
2035− 0x65,0x6E,0x20,0x6D,0x6F,0x64,0x65,0x20,0x73,0x74,0x72,0x65,
2036− 0x74,0x63,0x68,0x20,0x6F,0x75,0x74,0x20,0x74,0x68,0x65,0x20,
2037− 0x77,0x68,0x6F,0x6C,0x65,0x20,0x73,0x63,0x72,0x65,0x65,0x6E,
2038− 0x3F,0x3A,0x3E,0x40,0x43,0x30,0x30,0x32,0x41,0x3A,0x20,0x45,
2039− 0x6E,0x61,0x62,0x6C,0x65,0x20,0x22,0x50,0x69,0x78,0x65,0x6C,
2040− 0x20,0x66,0x69,0x6C,0x74,0x65,0x72,0x22,0x20,0x69,0x6E,0x20,
2041− 0x43,0x6F,0x6E,0x66,0x69,0x67,0x20,0x2D,0x3E,0x20,0x4D,0x69,
2042− 0x73,0x63,0x65,0x6C,0x6C,0x61,0x6E,0x65,0x6F,0x75,0x73,0x2E,
2043− 0x4D,0x3E,0x40,0x58,0x30,0x33,0x35,0x49,0x74,0x20,0x77,0x6F,
2044− 0x6E,0x27,0x74,0x20,0x6C,0x6F,0x6F,0x6B,0x20,0x70,0x72,0x65,
2045− 0x74,0x74,0x79,0x2C,0x20,0x62,0x75,0x74,0x20,0x74,0x6F,0x20,
2046− 0x73,0x6F,0x6D,0x65,0x20,0x70,0x65,0x6F,0x70,0x6C,0x65,0x20,
2047− 0x69,0x74,0x27,0x73,0x20,0x6D,0x75,0x63,0x68,0x20,0x62,0x65,
2048− 0x74,0x74,0x65,0x72,0x20,0x74,0x68,0x61,0x6E,0x20,0x6E,0x6F,
2049− 0x74,0x68,0x69,0x6E,0x67,0x2E,0x06,0x3E,0x40,0x58,0x30,0x32,
2050− 0x30,0x27,0x3E,0x40,0x43,0x30,0x30,0x31,0x51,0x3A,0x20,0x49,
2051− 0x20,0x63,0x61,0x6E,0x27,0x74,0x20,0x75,0x73,0x65,0x20,0x41,
2052− 0x4C,0x54,0x2B,0x46,0x34,0x20,0x61,0x6E,0x64,0x20,0x41,0x4C,
2053− 0x54,0x2B,0x46,0x35,0x21,0x4E,0x3E,0x40,0x43,0x30,0x30,0x32,
2054− 0x41,0x3A,0x20,0x57,0x69,0x6E,0x64,0x6F,0x77,0x73,0x3A,0x20,
2055− 0x49,0x66,0x20,0x79,0x6F,0x75,0x20,0x68,0x61,0x76,0x65,0x20,
2056− 0x47,0x65,0x46,0x6F,0x72,0x63,0x65,0x20,0x45,0x78,0x70,0x65,
2057− 0x72,0x69,0x65,0x6E,0x63,0x65,0x20,0x69,0x6E,0x73,0x74,0x61,
2058− 0x6C,0x6C,0x65,0x64,0x2C,0x20,0x79,0x6F,0x75,0x20,0x6E,0x65,
2059− 0x65,0x64,0x20,0x74,0x6F,0x20,0x63,0x68,0x61,0x6E,0x67,0x65,
2060− 0x2B,0x3E,0x40,0x58,0x30,0x33,0x35,0x74,0x68,0x65,0x20,0x6B,
2061− 0x65,0x79,0x62,0x69,0x6E,0x64,0x69,0x6E,0x67,0x73,0x20,0x69,
2062− 0x6E,0x20,0x69,0x74,0x73,0x20,0x73,0x65,0x74,0x74,0x69,0x6E,
2063− 0x67,0x73,0x20,0x70,0x61,0x67,0x65,0x2E,0x56,0x6D,0x61,0x63,
2064− 0x4F,0x53,0x2F,0x4F,0x53,0x20,0x58,0x3A,0x20,0x43,0x68,0x61,
2065− 0x6E,0x67,0x65,0x20,0x41,0x4C,0x54,0x2B,0x46,0x34,0x2F,0x41,
2066− 0x4C,0x54,0x2B,0x46,0x35,0x20,0x6B,0x65,0x79,0x73,0x20,0x69,
2067− 0x6E,0x20,0x74,0x68,0x65,0x20,0x4F,0x53,0x20,0x74,0x6F,0x20,
2068− 0x73,0x6F,0x6D,0x65,0x74,0x68,0x69,0x6E,0x67,0x20,0x65,0x6C,
2069− 0x73,0x65,0x2E,0x20,0x41,0x6C,0x73,0x6F,0x20,0x66,0x6F,0x72,
2070− 0x20,0x47,0x4E,0x55,0x2F,0x4C,0x69,0x6E,0x75,0x78,0x2E,0x06,
2071− 0x3E,0x40,0x58,0x30,0x32,0x30,0x2B,0x3E,0x40,0x43,0x30,0x30,
2072− 0x31,0x51,0x3A,0x20,0x54,0x68,0x65,0x20,0x6D,0x6F,0x75,0x73,
2073− 0x65,0x20,0x63,0x75,0x72,0x73,0x6F,0x72,0x20,0x69,0x73,0x20,
2074− 0x64,0x65,0x6C,0x61,0x79,0x65,0x64,0x2F,0x6C,0x61,0x67,0x67,
2075− 0x79,0x21,0x44,0x3E,0x40,0x43,0x30,0x30,0x32,0x41,0x3A,0x20,
2076− 0x4D,0x61,0x6B,0x65,0x20,0x73,0x75,0x72,0x65,0x20,0x22,0x53,
2077− 0x6F,0x66,0x74,0x77,0x61,0x72,0x65,0x20,0x6D,0x6F,0x75,0x73,
2078− 0x65,0x22,0x20,0x69,0x73,0x20,0x64,0x69,0x73,0x61,0x62,0x6C,
2079− 0x65,0x64,0x20,0x69,0x6E,0x20,0x43,0x6F,0x6E,0x66,0x69,0x67,
2080− 0x20,0x2D,0x3E,0x20,0x4C,0x61,0x79,0x6F,0x75,0x74,0x2E,0x4B,
2081− 0x3E,0x40,0x58,0x30,0x33,0x35,0x41,0x6C,0x74,0x65,0x72,0x6E,
2082− 0x61,0x74,0x69,0x76,0x65,0x6C,0x79,0x2C,0x20,0x79,0x6F,0x75,
2083− 0x20,0x63,0x61,0x6E,0x20,0x65,0x6E,0x61,0x62,0x6C,0x65,0x20,
2084− 0x22,0x56,0x53,0x79,0x6E,0x63,0x20,0x6F,0x66,0x66,0x22,0x20,
2085− 0x69,0x6E,0x20,0x43,0x6F,0x6E,0x66,0x69,0x67,0x20,0x2D,0x3E,
2086− 0x20,0x4D,0x69,0x73,0x63,0x65,0x6C,0x6C,0x61,0x6E,0x65,0x6F,
2087− 0x75,0x73,0x2E,0x46,0x3E,0x54,0x68,0x69,0x73,0x20,0x68,0x6F,
2088− 0x77,0x65,0x76,0x65,0x72,0x2C,0x20,0x77,0x69,0x6C,0x6C,0x20,
2089− 0x69,0x6E,0x74,0x72,0x6F,0x64,0x75,0x63,0x65,0x20,0x73,0x74,
2090− 0x75,0x74,0x74,0x65,0x72,0x69,0x6E,0x67,0x20,0x62,0x65,0x63,
2091− 0x61,0x75,0x73,0x65,0x20,0x74,0x68,0x65,0x20,0x72,0x65,0x6E,
2092− 0x64,0x65,0x72,0x69,0x6E,0x67,0x20,0x72,0x61,0x74,0x65,0x20,
2093− 0x69,0x73,0x22,0x3E,0x6E,0x6F,0x74,0x20,0x65,0x78,0x61,0x63,
2094− 0x74,0x20,0x74,0x6F,0x20,0x79,0x6F,0x75,0x72,0x20,0x6D,0x6F,
2095− 0x6E,0x69,0x74,0x6F,0x72,0x27,0x73,0x20,0x72,0x61,0x74,0x65,
2096− 0x2E,0x06,0x3E,0x40,0x58,0x30,0x32,0x30,0x33,0x3E,0x40,0x43,
2097− 0x30,0x30,0x31,0x51,0x3A,0x20,0x57,0x69,0x6C,0x6C,0x20,0x79,
2098− 0x6F,0x75,0x20,0x69,0x6D,0x70,0x6C,0x65,0x6D,0x65,0x6E,0x74,
2099− 0x20,0x4D,0x49,0x44,0x49,0x20,0x6F,0x75,0x74,0x20,0x66,0x75,
2100− 0x6E,0x63,0x74,0x69,0x6F,0x6E,0x61,0x6C,0x69,0x74,0x79,0x3F,
2101− 0x4D,0x3E,0x40,0x43,0x30,0x30,0x32,0x41,0x3A,0x20,0x4E,0x6F,
2102− 0x2C,0x20,0x73,0x6F,0x72,0x72,0x79,0x2E,0x20,0x54,0x68,0x69,
2103− 0x73,0x20,0x69,0x73,0x20,0x76,0x65,0x72,0x79,0x20,0x64,0x69,
2104− 0x66,0x66,0x69,0x63,0x75,0x6C,0x74,0x20,0x74,0x6F,0x20,0x69,
2105− 0x6D,0x70,0x6C,0x65,0x6D,0x65,0x6E,0x74,0x20,0x63,0x6F,0x72,
2106− 0x72,0x65,0x63,0x74,0x6C,0x79,0x20,0x77,0x68,0x65,0x6E,0x20,
2107− 0x68,0x61,0x76,0x69,0x6E,0x67,0x3C,0x3E,0x40,0x58,0x30,0x33,
2108− 0x35,0x68,0x69,0x67,0x68,0x65,0x72,0x20,0x61,0x75,0x64,0x69,
2109− 0x6F,0x20,0x62,0x75,0x66,0x66,0x65,0x72,0x20,0x73,0x69,0x7A,
2110− 0x65,0x73,0x20,0x28,0x62,0x75,0x66,0x66,0x65,0x72,0x65,0x64,
2111− 0x20,0x72,0x65,0x70,0x6C,0x61,0x79,0x65,0x72,0x20,0x74,0x69,
2112− 0x63,0x6B,0x73,0x29,0x2E,0x2E,0x2E,0x06,0x3E,0x40,0x58,0x30,
2113− 0x32,0x30,0x30,0x3E,0x40,0x43,0x30,0x30,0x31,0x51,0x3A,0x20,
2114− 0x57,0x68,0x65,0x72,0x65,0x20,0x69,0x73,0x20,0x74,0x68,0x65,
2030+ 0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x0E,0x40,
2031+ 0x4C,0x50,0x72,0x6F,0x62,0x6C,0x65,0x6D,0x73,0x2F,0x46,0x41,
2032+ 0x51,0x06,0x3E,0x40,0x58,0x30,0x32,0x30,0x41,0x3E,0x40,0x43,
2033+ 0x30,0x30,0x31,0x51,0x3A,0x20,0x43,0x61,0x6E,0x20,0x49,0x20,
2034+ 0x6D,0x61,0x6B,0x65,0x20,0x66,0x75,0x6C,0x6C,0x73,0x63,0x72,
2035+ 0x65,0x65,0x6E,0x20,0x6D,0x6F,0x64,0x65,0x20,0x73,0x74,0x72,
2036+ 0x65,0x74,0x63,0x68,0x20,0x6F,0x75,0x74,0x20,0x74,0x68,0x65,
2037+ 0x20,0x77,0x68,0x6F,0x6C,0x65,0x20,0x73,0x63,0x72,0x65,0x65,
2038+ 0x6E,0x3F,0x3A,0x3E,0x40,0x43,0x30,0x30,0x32,0x41,0x3A,0x20,
2039+ 0x45,0x6E,0x61,0x62,0x6C,0x65,0x20,0x22,0x50,0x69,0x78,0x65,
2040+ 0x6C,0x20,0x66,0x69,0x6C,0x74,0x65,0x72,0x22,0x20,0x69,0x6E,
2041+ 0x20,0x43,0x6F,0x6E,0x66,0x69,0x67,0x20,0x2D,0x3E,0x20,0x4D,
2042+ 0x69,0x73,0x63,0x65,0x6C,0x6C,0x61,0x6E,0x65,0x6F,0x75,0x73,
2043+ 0x2E,0x4D,0x3E,0x40,0x58,0x30,0x33,0x35,0x49,0x74,0x20,0x77,
2044+ 0x6F,0x6E,0x27,0x74,0x20,0x6C,0x6F,0x6F,0x6B,0x20,0x70,0x72,
2045+ 0x65,0x74,0x74,0x79,0x2C,0x20,0x62,0x75,0x74,0x20,0x74,0x6F,
2046+ 0x20,0x73,0x6F,0x6D,0x65,0x20,0x70,0x65,0x6F,0x70,0x6C,0x65,
2047+ 0x20,0x69,0x74,0x27,0x73,0x20,0x6D,0x75,0x63,0x68,0x20,0x62,
2048+ 0x65,0x74,0x74,0x65,0x72,0x20,0x74,0x68,0x61,0x6E,0x20,0x6E,
2049+ 0x6F,0x74,0x68,0x69,0x6E,0x67,0x2E,0x06,0x3E,0x40,0x58,0x30,
2050+ 0x32,0x30,0x27,0x3E,0x40,0x43,0x30,0x30,0x31,0x51,0x3A,0x20,
2051+ 0x49,0x20,0x63,0x61,0x6E,0x27,0x74,0x20,0x75,0x73,0x65,0x20,
2052+ 0x41,0x4C,0x54,0x2B,0x46,0x34,0x20,0x61,0x6E,0x64,0x20,0x41,
2053+ 0x4C,0x54,0x2B,0x46,0x35,0x21,0x4E,0x3E,0x40,0x43,0x30,0x30,
2054+ 0x32,0x41,0x3A,0x20,0x57,0x69,0x6E,0x64,0x6F,0x77,0x73,0x3A,
2055+ 0x20,0x49,0x66,0x20,0x79,0x6F,0x75,0x20,0x68,0x61,0x76,0x65,
2056+ 0x20,0x47,0x65,0x46,0x6F,0x72,0x63,0x65,0x20,0x45,0x78,0x70,
2057+ 0x65,0x72,0x69,0x65,0x6E,0x63,0x65,0x20,0x69,0x6E,0x73,0x74,
2058+ 0x61,0x6C,0x6C,0x65,0x64,0x2C,0x20,0x79,0x6F,0x75,0x20,0x6E,
2059+ 0x65,0x65,0x64,0x20,0x74,0x6F,0x20,0x63,0x68,0x61,0x6E,0x67,
2060+ 0x65,0x2B,0x3E,0x40,0x58,0x30,0x33,0x35,0x74,0x68,0x65,0x20,
2061+ 0x6B,0x65,0x79,0x62,0x69,0x6E,0x64,0x69,0x6E,0x67,0x73,0x20,
2062+ 0x69,0x6E,0x20,0x69,0x74,0x73,0x20,0x73,0x65,0x74,0x74,0x69,
2063+ 0x6E,0x67,0x73,0x20,0x70,0x61,0x67,0x65,0x2E,0x56,0x6D,0x61,
2064+ 0x63,0x4F,0x53,0x2F,0x4F,0x53,0x20,0x58,0x3A,0x20,0x43,0x68,
2065+ 0x61,0x6E,0x67,0x65,0x20,0x41,0x4C,0x54,0x2B,0x46,0x34,0x2F,
2066+ 0x41,0x4C,0x54,0x2B,0x46,0x35,0x20,0x6B,0x65,0x79,0x73,0x20,
2067+ 0x69,0x6E,0x20,0x74,0x68,0x65,0x20,0x4F,0x53,0x20,0x74,0x6F,
2068+ 0x20,0x73,0x6F,0x6D,0x65,0x74,0x68,0x69,0x6E,0x67,0x20,0x65,
2069+ 0x6C,0x73,0x65,0x2E,0x20,0x41,0x6C,0x73,0x6F,0x20,0x66,0x6F,
2070+ 0x72,0x20,0x47,0x4E,0x55,0x2F,0x4C,0x69,0x6E,0x75,0x78,0x2E,
2071+ 0x06,0x3E,0x40,0x58,0x30,0x32,0x30,0x2B,0x3E,0x40,0x43,0x30,
2072+ 0x30,0x31,0x51,0x3A,0x20,0x54,0x68,0x65,0x20,0x6D,0x6F,0x75,
2073+ 0x73,0x65,0x20,0x63,0x75,0x72,0x73,0x6F,0x72,0x20,0x69,0x73,
2074+ 0x20,0x64,0x65,0x6C,0x61,0x79,0x65,0x64,0x2F,0x6C,0x61,0x67,
2075+ 0x67,0x79,0x21,0x44,0x3E,0x40,0x43,0x30,0x30,0x32,0x41,0x3A,
2076+ 0x20,0x4D,0x61,0x6B,0x65,0x20,0x73,0x75,0x72,0x65,0x20,0x22,
2077+ 0x53,0x6F,0x66,0x74,0x77,0x61,0x72,0x65,0x20,0x6D,0x6F,0x75,
2078+ 0x73,0x65,0x22,0x20,0x69,0x73,0x20,0x64,0x69,0x73,0x61,0x62,
2079+ 0x6C,0x65,0x64,0x20,0x69,0x6E,0x20,0x43,0x6F,0x6E,0x66,0x69,
2080+ 0x67,0x20,0x2D,0x3E,0x20,0x4C,0x61,0x79,0x6F,0x75,0x74,0x2E,
2081+ 0x4B,0x3E,0x40,0x58,0x30,0x33,0x35,0x41,0x6C,0x74,0x65,0x72,
2082+ 0x6E,0x61,0x74,0x69,0x76,0x65,0x6C,0x79,0x2C,0x20,0x79,0x6F,
2083+ 0x75,0x20,0x63,0x61,0x6E,0x20,0x65,0x6E,0x61,0x62,0x6C,0x65,
2084+ 0x20,0x22,0x56,0x53,0x79,0x6E,0x63,0x20,0x6F,0x66,0x66,0x22,
2085+ 0x20,0x69,0x6E,0x20,0x43,0x6F,0x6E,0x66,0x69,0x67,0x20,0x2D,
2086+ 0x3E,0x20,0x4D,0x69,0x73,0x63,0x65,0x6C,0x6C,0x61,0x6E,0x65,
2087+ 0x6F,0x75,0x73,0x2E,0x46,0x3E,0x54,0x68,0x69,0x73,0x20,0x68,
2088+ 0x6F,0x77,0x65,0x76,0x65,0x72,0x2C,0x20,0x77,0x69,0x6C,0x6C,
2089+ 0x20,0x69,0x6E,0x74,0x72,0x6F,0x64,0x75,0x63,0x65,0x20,0x73,
2090+ 0x74,0x75,0x74,0x74,0x65,0x72,0x69,0x6E,0x67,0x20,0x62,0x65,
2091+ 0x63,0x61,0x75,0x73,0x65,0x20,0x74,0x68,0x65,0x20,0x72,0x65,
2092+ 0x6E,0x64,0x65,0x72,0x69,0x6E,0x67,0x20,0x72,0x61,0x74,0x65,
2093+ 0x20,0x69,0x73,0x22,0x3E,0x6E,0x6F,0x74,0x20,0x65,0x78,0x61,
2094+ 0x63,0x74,0x20,0x74,0x6F,0x20,0x79,0x6F,0x75,0x72,0x20,0x6D,
2095+ 0x6F,0x6E,0x69,0x74,0x6F,0x72,0x27,0x73,0x20,0x72,0x61,0x74,
2096+ 0x65,0x2E,0x06,0x3E,0x40,0x58,0x30,0x32,0x30,0x33,0x3E,0x40,
2097+ 0x43,0x30,0x30,0x31,0x51,0x3A,0x20,0x57,0x69,0x6C,0x6C,0x20,
2098+ 0x79,0x6F,0x75,0x20,0x69,0x6D,0x70,0x6C,0x65,0x6D,0x65,0x6E,
2099+ 0x74,0x20,0x4D,0x49,0x44,0x49,0x20,0x6F,0x75,0x74,0x20,0x66,
2100+ 0x75,0x6E,0x63,0x74,0x69,0x6F,0x6E,0x61,0x6C,0x69,0x74,0x79,
2101+ 0x3F,0x4D,0x3E,0x40,0x43,0x30,0x30,0x32,0x41,0x3A,0x20,0x4E,
2102+ 0x6F,0x2C,0x20,0x73,0x6F,0x72,0x72,0x79,0x2E,0x20,0x54,0x68,
2103+ 0x69,0x73,0x20,0x69,0x73,0x20,0x76,0x65,0x72,0x79,0x20,0x64,
2104+ 0x69,0x66,0x66,0x69,0x63,0x75,0x6C,0x74,0x20,0x74,0x6F,0x20,
2105+ 0x69,0x6D,0x70,0x6C,0x65,0x6D,0x65,0x6E,0x74,0x20,0x63,0x6F,
2106+ 0x72,0x72,0x65,0x63,0x74,0x6C,0x79,0x20,0x77,0x68,0x65,0x6E,
2107+ 0x20,0x68,0x61,0x76,0x69,0x6E,0x67,0x3C,0x3E,0x40,0x58,0x30,
2108+ 0x33,0x35,0x68,0x69,0x67,0x68,0x65,0x72,0x20,0x61,0x75,0x64,
2109+ 0x69,0x6F,0x20,0x62,0x75,0x66,0x66,0x65,0x72,0x20,0x73,0x69,
2110+ 0x7A,0x65,0x73,0x20,0x28,0x62,0x75,0x66,0x66,0x65,0x72,0x65,
2111+ 0x64,0x20,0x72,0x65,0x70,0x6C,0x61,0x79,0x65,0x72,0x20,0x74,
2112+ 0x69,0x63,0x6B,0x73,0x29,0x2E,0x2E,0x2E,0x06,0x3E,0x40,0x58,
2113+ 0x30,0x32,0x30,0x30,0x3E,0x40,0x43,0x30,0x30,0x31,0x51,0x3A,
2114+ 0x20,0x57,0x68,0x65,0x72,0x65,0x20,0x69,0x73,0x20,0x74,0x68,
2115+ 0x65,0x20,0x63,0x6F,0x6E,0x66,0x69,0x67,0x75,0x72,0x61,0x74,
2116+ 0x69,0x6F,0x6E,0x20,0x66,0x69,0x6C,0x65,0x20,0x73,0x74,0x6F,
2117+ 0x72,0x65,0x64,0x3F,0x3F,0x3E,0x40,0x43,0x30,0x30,0x32,0x41,
2118+ 0x3A,0x20,0x57,0x69,0x6E,0x64,0x6F,0x77,0x73,0x3A,0x20,0x5C,
2119+ 0x55,0x73,0x65,0x72,0x73,0x5C,0x55,0x53,0x45,0x52,0x5C,0x41,
2120+ 0x70,0x70,0x44,0x61,0x74,0x61,0x5C,0x52,0x6F,0x61,0x6D,0x69,
2121+ 0x6E,0x67,0x5C,0x46,0x54,0x32,0x20,0x63,0x6C,0x6F,0x6E,0x65,
2122+ 0x5C,0x46,0x54,0x32,0x2E,0x43,0x46,0x47,0x45,0x3E,0x40,0x58,
2123+ 0x30,0x33,0x35,0x4F,0x53,0x20,0x58,0x3A,0x20,0x2F,0x55,0x73,
2124+ 0x65,0x72,0x73,0x2F,0x55,0x53,0x45,0x52,0x2F,0x4C,0x69,0x62,
2125+ 0x72,0x61,0x72,0x79,0x2F,0x41,0x70,0x70,0x6C,0x69,0x63,0x61,
2126+ 0x74,0x69,0x6F,0x6E,0x20,0x53,0x75,0x70,0x70,0x6F,0x72,0x74,
2127+ 0x2F,0x46,0x54,0x32,0x20,0x63,0x6C,0x6F,0x6E,0x65,0x2F,0x46,
2128+ 0x54,0x32,0x2E,0x43,0x46,0x47,0x2F,0x47,0x4E,0x55,0x2F,0x4C,
2129+ 0x69,0x6E,0x75,0x78,0x3A,0x20,0x2F,0x68,0x6F,0x6D,0x65,0x2F,
2130+ 0x55,0x53,0x45,0x52,0x2F,0x2E,0x63,0x6F,0x6E,0x66,0x69,0x67,
2131+ 0x2F,0x46,0x54,0x32,0x20,0x63,0x6C,0x6F,0x6E,0x65,0x2F,0x46,
2132+ 0x54,0x32,0x2E,0x43,0x46,0x47,0x01,0x3E,0x48,0x49,0x74,0x20,
2133+ 0x77,0x69,0x6C,0x6C,0x20,0x62,0x65,0x20,0x73,0x74,0x6F,0x72,
2134+ 0x65,0x64,0x20,0x69,0x6E,0x20,0x74,0x68,0x65,0x20,0x70,0x72,
2135+ 0x6F,0x67,0x72,0x61,0x6D,0x20,0x64,0x69,0x72,0x65,0x63,0x74,
2136+ 0x6F,0x72,0x79,0x20,0x69,0x66,0x20,0x74,0x68,0x65,0x20,0x70,
2137+ 0x61,0x74,0x68,0x20,0x63,0x6F,0x75,0x6C,0x64,0x6E,0x27,0x74,
2138+ 0x20,0x62,0x65,0x20,0x75,0x73,0x65,0x64,0x2E,0x4D,0x49,0x66,
2139+ 0x20,0x79,0x6F,0x75,0x20,0x70,0x75,0x74,0x20,0x74,0x68,0x65,
21152140 0x20,0x63,0x6F,0x6E,0x66,0x69,0x67,0x75,0x72,0x61,0x74,0x69,
2116− 0x6F,0x6E,0x20,0x66,0x69,0x6C,0x65,0x20,0x73,0x74,0x6F,0x72,
2117− 0x65,0x64,0x3F,0x3F,0x3E,0x40,0x43,0x30,0x30,0x32,0x41,0x3A,
2118− 0x20,0x57,0x69,0x6E,0x64,0x6F,0x77,0x73,0x3A,0x20,0x5C,0x55,
2119− 0x73,0x65,0x72,0x73,0x5C,0x55,0x53,0x45,0x52,0x5C,0x41,0x70,
2120− 0x70,0x44,0x61,0x74,0x61,0x5C,0x52,0x6F,0x61,0x6D,0x69,0x6E,
2121− 0x67,0x5C,0x46,0x54,0x32,0x20,0x63,0x6C,0x6F,0x6E,0x65,0x5C,
2122− 0x46,0x54,0x32,0x2E,0x43,0x46,0x47,0x45,0x3E,0x40,0x58,0x30,
2123− 0x33,0x35,0x4F,0x53,0x20,0x58,0x3A,0x20,0x2F,0x55,0x73,0x65,
2124− 0x72,0x73,0x2F,0x55,0x53,0x45,0x52,0x2F,0x4C,0x69,0x62,0x72,
2125− 0x61,0x72,0x79,0x2F,0x41,0x70,0x70,0x6C,0x69,0x63,0x61,0x74,
2126− 0x69,0x6F,0x6E,0x20,0x53,0x75,0x70,0x70,0x6F,0x72,0x74,0x2F,
2127− 0x46,0x54,0x32,0x20,0x63,0x6C,0x6F,0x6E,0x65,0x2F,0x46,0x54,
2128− 0x32,0x2E,0x43,0x46,0x47,0x2F,0x47,0x4E,0x55,0x2F,0x4C,0x69,
2129− 0x6E,0x75,0x78,0x3A,0x20,0x2F,0x68,0x6F,0x6D,0x65,0x2F,0x55,
2130− 0x53,0x45,0x52,0x2F,0x2E,0x63,0x6F,0x6E,0x66,0x69,0x67,0x2F,
2131− 0x46,0x54,0x32,0x20,0x63,0x6C,0x6F,0x6E,0x65,0x2F,0x46,0x54,
2132− 0x32,0x2E,0x43,0x46,0x47,0x01,0x3E,0x48,0x49,0x74,0x20,0x77,
2133− 0x69,0x6C,0x6C,0x20,0x62,0x65,0x20,0x73,0x74,0x6F,0x72,0x65,
2134− 0x64,0x20,0x69,0x6E,0x20,0x74,0x68,0x65,0x20,0x70,0x72,0x6F,
2135− 0x67,0x72,0x61,0x6D,0x20,0x64,0x69,0x72,0x65,0x63,0x74,0x6F,
2136− 0x72,0x79,0x20,0x69,0x66,0x20,0x74,0x68,0x65,0x20,0x70,0x61,
2137− 0x74,0x68,0x20,0x63,0x6F,0x75,0x6C,0x64,0x6E,0x27,0x74,0x20,
2138− 0x62,0x65,0x20,0x75,0x73,0x65,0x64,0x2E,0x4D,0x49,0x66,0x20,
2139− 0x79,0x6F,0x75,0x20,0x70,0x75,0x74,0x20,0x74,0x68,0x65,0x20,
2140− 0x63,0x6F,0x6E,0x66,0x69,0x67,0x75,0x72,0x61,0x74,0x69,0x6F,
2141− 0x6E,0x20,0x66,0x69,0x6C,0x65,0x20,0x69,0x6E,0x20,0x74,0x68,
2142− 0x65,0x20,0x70,0x72,0x6F,0x67,0x72,0x61,0x6D,0x20,0x64,0x69,
2143− 0x72,0x65,0x63,0x74,0x6F,0x72,0x79,0x2C,0x20,0x69,0x74,0x20,
2144− 0x77,0x69,0x6C,0x6C,0x20,0x72,0x65,0x61,0x64,0x20,0x74,0x68,
2145− 0x61,0x74,0x4A,0x6F,0x6E,0x65,0x20,0x61,0x6E,0x64,0x20,0x6E,
2146− 0x6F,0x74,0x20,0x61,0x74,0x74,0x65,0x6D,0x70,0x74,0x20,0x74,
2147− 0x6F,0x20,0x63,0x72,0x65,0x61,0x74,0x65,0x20,0x63,0x6F,0x6E,
2148− 0x66,0x69,0x67,0x20,0x64,0x69,0x72,0x73,0x20,0x66,0x6F,0x72,
2149− 0x20,0x74,0x68,0x65,0x20,0x4F,0x53,0x20,0x75,0x73,0x65,0x72,
2150− 0x2E,0x20,0x28,0x70,0x6F,0x72,0x74,0x61,0x62,0x6C,0x65,0x20,
2151− 0x6D,0x6F,0x64,0x65,0x29,0x06,0x3E,0x40,0x58,0x30,0x32,0x30,
2152− 0x42,0x3E,0x40,0x43,0x30,0x30,0x31,0x51,0x3A,0x20,0x43,0x61,
2153− 0x6E,0x20,0x74,0x68,0x65,0x20,0x63,0x6C,0x6F,0x6E,0x65,0x20,
2154− 0x72,0x65,0x61,0x64,0x20,0x46,0x54,0x32,0x2E,0x43,0x46,0x47,
2155− 0x20,0x66,0x72,0x6F,0x6D,0x20,0x72,0x65,0x61,0x6C,0x20,0x46,
2156− 0x54,0x32,0x2C,0x20,0x61,0x6E,0x64,0x20,0x76,0x69,0x63,0x65,
2157− 0x20,0x76,0x65,0x72,0x73,0x61,0x3F,0x4C,0x3E,0x40,0x43,0x30,
2158− 0x30,0x32,0x41,0x3A,0x20,0x59,0x65,0x73,0x2C,0x20,0x69,0x74,
2159− 0x20,0x73,0x68,0x6F,0x75,0x6C,0x64,0x20,0x77,0x6F,0x72,0x6B,
2160− 0x20,0x6A,0x75,0x73,0x74,0x20,0x66,0x69,0x6E,0x65,0x2E,0x20,
2161− 0x50,0x75,0x74,0x20,0x69,0x74,0x20,0x69,0x6E,0x20,0x74,0x68,
2162− 0x65,0x20,0x64,0x69,0x72,0x65,0x63,0x74,0x6F,0x72,0x79,0x20,
2163− 0x73,0x68,0x6F,0x77,0x6E,0x20,0x61,0x62,0x6F,0x76,0x65,0x2E,
2164− 0x06,0x3E,0x40,0x58,0x30,0x32,0x30,0x52,0x3E,0x40,0x43,0x30,
2165− 0x30,0x31,0x51,0x3A,0x20,0x53,0x6D,0x70,0x2E,0x20,0x45,0x64,
2166− 0x2E,0x3A,0x20,0x57,0x68,0x69,0x6C,0x65,0x20,0x7A,0x6F,0x6F,
2167− 0x6D,0x69,0x6E,0x67,0x20,0x69,0x6E,0x2C,0x20,0x49,0x20,0x73,
2168− 0x6F,0x6D,0x65,0x74,0x69,0x6D,0x65,0x73,0x20,0x63,0x61,0x6E,
2169− 0x27,0x74,0x20,0x6D,0x61,0x72,0x6B,0x20,0x74,0x68,0x65,0x20,
2170− 0x6C,0x61,0x73,0x74,0x20,0x73,0x61,0x6D,0x70,0x6C,0x65,0x20,
2171− 0x70,0x6F,0x69,0x6E,0x74,0x21,0x47,0x3E,0x40,0x43,0x30,0x30,
2172− 0x32,0x41,0x3A,0x20,0x54,0x68,0x69,0x73,0x20,0x69,0x73,0x20,
2173− 0x6E,0x6F,0x72,0x6D,0x61,0x6C,0x2E,0x20,0x54,0x68,0x69,0x73,
2174− 0x20,0x69,0x73,0x20,0x61,0x20,0x6C,0x69,0x6D,0x69,0x74,0x61,
2175− 0x74,0x69,0x6F,0x6E,0x20,0x69,0x6E,0x20,0x74,0x68,0x65,0x20,
2176− 0x6E,0x61,0x74,0x75,0x72,0x65,0x20,0x6F,0x66,0x20,0x73,0x63,
2177− 0x61,0x6C,0x69,0x6E,0x67,0x2E,0x06,0x3E,0x40,0x58,0x30,0x32,
2178− 0x30,0x17,0x3E,0x40,0x43,0x30,0x30,0x31,0x51,0x3A,0x20,0x49,
2179− 0x20,0x66,0x6F,0x75,0x6E,0x64,0x20,0x61,0x20,0x62,0x75,0x67,
2180− 0x21,0x4C,0x3E,0x40,0x43,0x30,0x30,0x32,0x41,0x3A,0x20,0x50,
2181− 0x6C,0x65,0x61,0x73,0x65,0x20,0x73,0x65,0x6E,0x64,0x20,0x6D,
2182− 0x65,0x20,0x61,0x20,0x6D,0x61,0x69,0x6C,0x20,0x28,0x66,0x6F,
2183− 0x75,0x6E,0x64,0x20,0x61,0x74,0x20,0x31,0x36,0x2D,0x62,0x69,
2184− 0x74,0x73,0x2E,0x6F,0x72,0x67,0x29,0x20,0x61,0x6E,0x64,0x20,
2185− 0x74,0x72,0x79,0x20,0x74,0x6F,0x20,0x65,0x78,0x70,0x6C,0x61,
2186− 0x69,0x6E,0x20,0x69,0x74,0x2E,0x00,0x03,0x45,0x4E,0x44,0x4C,
2187− 0x3B,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,
2141+ 0x6F,0x6E,0x20,0x66,0x69,0x6C,0x65,0x20,0x69,0x6E,0x20,0x74,
2142+ 0x68,0x65,0x20,0x70,0x72,0x6F,0x67,0x72,0x61,0x6D,0x20,0x64,
2143+ 0x69,0x72,0x65,0x63,0x74,0x6F,0x72,0x79,0x2C,0x20,0x69,0x74,
2144+ 0x20,0x77,0x69,0x6C,0x6C,0x20,0x72,0x65,0x61,0x64,0x20,0x74,
2145+ 0x68,0x61,0x74,0x4A,0x6F,0x6E,0x65,0x20,0x61,0x6E,0x64,0x20,
2146+ 0x6E,0x6F,0x74,0x20,0x61,0x74,0x74,0x65,0x6D,0x70,0x74,0x20,
2147+ 0x74,0x6F,0x20,0x63,0x72,0x65,0x61,0x74,0x65,0x20,0x63,0x6F,
2148+ 0x6E,0x66,0x69,0x67,0x20,0x64,0x69,0x72,0x73,0x20,0x66,0x6F,
2149+ 0x72,0x20,0x74,0x68,0x65,0x20,0x4F,0x53,0x20,0x75,0x73,0x65,
2150+ 0x72,0x2E,0x20,0x28,0x70,0x6F,0x72,0x74,0x61,0x62,0x6C,0x65,
2151+ 0x20,0x6D,0x6F,0x64,0x65,0x29,0x06,0x3E,0x40,0x58,0x30,0x32,
2152+ 0x30,0x42,0x3E,0x40,0x43,0x30,0x30,0x31,0x51,0x3A,0x20,0x43,
2153+ 0x61,0x6E,0x20,0x74,0x68,0x65,0x20,0x63,0x6C,0x6F,0x6E,0x65,
2154+ 0x20,0x72,0x65,0x61,0x64,0x20,0x46,0x54,0x32,0x2E,0x43,0x46,
2155+ 0x47,0x20,0x66,0x72,0x6F,0x6D,0x20,0x72,0x65,0x61,0x6C,0x20,
2156+ 0x46,0x54,0x32,0x2C,0x20,0x61,0x6E,0x64,0x20,0x76,0x69,0x63,
2157+ 0x65,0x20,0x76,0x65,0x72,0x73,0x61,0x3F,0x4C,0x3E,0x40,0x43,
2158+ 0x30,0x30,0x32,0x41,0x3A,0x20,0x59,0x65,0x73,0x2C,0x20,0x69,
2159+ 0x74,0x20,0x73,0x68,0x6F,0x75,0x6C,0x64,0x20,0x77,0x6F,0x72,
2160+ 0x6B,0x20,0x6A,0x75,0x73,0x74,0x20,0x66,0x69,0x6E,0x65,0x2E,
2161+ 0x20,0x50,0x75,0x74,0x20,0x69,0x74,0x20,0x69,0x6E,0x20,0x74,
2162+ 0x68,0x65,0x20,0x64,0x69,0x72,0x65,0x63,0x74,0x6F,0x72,0x79,
2163+ 0x20,0x73,0x68,0x6F,0x77,0x6E,0x20,0x61,0x62,0x6F,0x76,0x65,
2164+ 0x2E,0x06,0x3E,0x40,0x58,0x30,0x32,0x30,0x52,0x3E,0x40,0x43,
2165+ 0x30,0x30,0x31,0x51,0x3A,0x20,0x53,0x6D,0x70,0x2E,0x20,0x45,
2166+ 0x64,0x2E,0x3A,0x20,0x57,0x68,0x69,0x6C,0x65,0x20,0x7A,0x6F,
2167+ 0x6F,0x6D,0x69,0x6E,0x67,0x20,0x69,0x6E,0x2C,0x20,0x49,0x20,
2168+ 0x73,0x6F,0x6D,0x65,0x74,0x69,0x6D,0x65,0x73,0x20,0x63,0x61,
2169+ 0x6E,0x27,0x74,0x20,0x6D,0x61,0x72,0x6B,0x20,0x74,0x68,0x65,
2170+ 0x20,0x6C,0x61,0x73,0x74,0x20,0x73,0x61,0x6D,0x70,0x6C,0x65,
2171+ 0x20,0x70,0x6F,0x69,0x6E,0x74,0x21,0x47,0x3E,0x40,0x43,0x30,
2172+ 0x30,0x32,0x41,0x3A,0x20,0x54,0x68,0x69,0x73,0x20,0x69,0x73,
2173+ 0x20,0x6E,0x6F,0x72,0x6D,0x61,0x6C,0x2E,0x20,0x54,0x68,0x69,
2174+ 0x73,0x20,0x69,0x73,0x20,0x61,0x20,0x6C,0x69,0x6D,0x69,0x74,
2175+ 0x61,0x74,0x69,0x6F,0x6E,0x20,0x69,0x6E,0x20,0x74,0x68,0x65,
2176+ 0x20,0x6E,0x61,0x74,0x75,0x72,0x65,0x20,0x6F,0x66,0x20,0x73,
2177+ 0x63,0x61,0x6C,0x69,0x6E,0x67,0x2E,0x06,0x3E,0x40,0x58,0x30,
2178+ 0x32,0x30,0x17,0x3E,0x40,0x43,0x30,0x30,0x31,0x51,0x3A,0x20,
2179+ 0x49,0x20,0x66,0x6F,0x75,0x6E,0x64,0x20,0x61,0x20,0x62,0x75,
2180+ 0x67,0x21,0x4C,0x3E,0x40,0x43,0x30,0x30,0x32,0x41,0x3A,0x20,
2181+ 0x50,0x6C,0x65,0x61,0x73,0x65,0x20,0x73,0x65,0x6E,0x64,0x20,
2182+ 0x6D,0x65,0x20,0x61,0x20,0x6D,0x61,0x69,0x6C,0x20,0x28,0x66,
2183+ 0x6F,0x75,0x6E,0x64,0x20,0x61,0x74,0x20,0x31,0x36,0x2D,0x62,
2184+ 0x69,0x74,0x73,0x2E,0x6F,0x72,0x67,0x29,0x20,0x61,0x6E,0x64,
2185+ 0x20,0x74,0x72,0x79,0x20,0x74,0x6F,0x20,0x65,0x78,0x70,0x6C,
2186+ 0x61,0x69,0x6E,0x20,0x69,0x74,0x2E,0x00,0x03,0x45,0x4E,0x44,
2187+ 0x4C,0x3B,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,
21882188 0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,
21892189 0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,
21902190 0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,
21912191 0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,
21922192 0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,
2193− 0x2A,0x2A,0x2A,0x2A,0x4C,0x3B,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,
2193+ 0x2A,0x2A,0x2A,0x2A,0x2A,0x4C,0x3B,0x2A,0x2A,0x2A,0x2A,0x2A,
21942194 0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,
21952195 0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,
21962196 0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,
21972197 0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,
21982198 0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,
2199− 0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x0C,0x40,0x4C,
2200− 0x4B,0x6E,0x6F,0x77,0x6E,0x20,0x62,0x75,0x67,0x73,0x06,0x3E,
2201− 0x40,0x58,0x30,0x31,0x30,0x2C,0x3E,0x40,0x43,0x30,0x30,0x31,
2202− 0x57,0x41,0x56,0x20,0x65,0x78,0x70,0x6F,0x72,0x74,0x69,0x6E,
2203− 0x67,0x20,0x28,0x72,0x65,0x6E,0x64,0x65,0x72,0x69,0x6E,0x67,
2204− 0x20,0x73,0x6F,0x6E,0x67,0x20,0x74,0x6F,0x20,0x57,0x41,0x56,
2205− 0x29,0x3A,0x01,0x3E,0x50,0x3E,0x40,0x43,0x30,0x30,0x32,0x2D,
2206− 0x20,0x53,0x6F,0x6E,0x67,0x73,0x20,0x74,0x68,0x61,0x74,0x20,
2207− 0x6A,0x75,0x6D,0x70,0x20,0x62,0x61,0x63,0x6B,0x20,0x74,0x6F,
2208− 0x20,0x61,0x20,0x70,0x72,0x65,0x76,0x69,0x6F,0x75,0x73,0x20,
2209− 0x70,0x61,0x74,0x74,0x65,0x72,0x6E,0x20,0x77,0x69,0x6C,0x6C,
2210− 0x20,0x72,0x65,0x6E,0x64,0x65,0x72,0x20,0x66,0x6F,0x72,0x65,
2211− 0x76,0x65,0x72,0x20,0x61,0x6E,0x64,0x20,0x65,0x76,0x65,0x72,
2212− 0x2C,0x50,0x61,0x6E,0x64,0x20,0x79,0x6F,0x75,0x20,0x6E,0x65,
2213− 0x65,0x64,0x20,0x74,0x6F,0x20,0x70,0x72,0x65,0x73,0x73,0x20,
2214− 0x61,0x20,0x6B,0x65,0x79,0x20,0x6F,0x72,0x20,0x63,0x6C,0x69,
2215− 0x63,0x6B,0x20,0x74,0x68,0x65,0x20,0x6D,0x6F,0x75,0x73,0x65,
2216− 0x20,0x74,0x6F,0x20,0x61,0x62,0x6F,0x72,0x74,0x20,0x74,0x68,
2217− 0x65,0x20,0x72,0x65,0x6E,0x64,0x65,0x72,0x20,0x77,0x68,0x65,
2218− 0x6E,0x20,0x79,0x6F,0x75,0x20,0x77,0x61,0x6E,0x74,0x06,0x69,
2219− 0x74,0x20,0x74,0x6F,0x2E,0x06,0x3E,0x40,0x58,0x30,0x31,0x30,
2220− 0x17,0x3E,0x40,0x43,0x30,0x30,0x31,0x4D,0x6F,0x75,0x73,0x65,
2221− 0x20,0x2F,0x20,0x6B,0x65,0x79,0x62,0x6F,0x61,0x72,0x64,0x3A,
2222− 0x01,0x3E,0x43,0x3E,0x40,0x43,0x30,0x30,0x32,0x2D,0x20,0x4C,
2223− 0x69,0x6E,0x75,0x78,0x3A,0x20,0x54,0x68,0x65,0x20,0x6D,0x6F,
2224− 0x75,0x73,0x65,0x20,0x63,0x75,0x72,0x73,0x6F,0x72,0x20,0x67,
2225− 0x72,0x61,0x70,0x68,0x69,0x63,0x73,0x20,0x63,0x61,0x6E,0x20,
2226− 0x62,0x65,0x20,0x67,0x6C,0x69,0x74,0x63,0x68,0x79,0x20,0x61,
2227− 0x74,0x20,0x74,0x69,0x6D,0x65,0x73,0x2E,0x2E,0x2E,0x06,0x3E,
2228− 0x40,0x58,0x30,0x31,0x30,0x0C,0x3E,0x40,0x43,0x30,0x30,0x31,
2229− 0x56,0x69,0x64,0x65,0x6F,0x3A,0x06,0x3E,0x40,0x43,0x30,0x30,
2230− 0x32,0x50,0x3E,0x40,0x58,0x30,0x31,0x30,0x2D,0x20,0x46,0x75,
2231− 0x6C,0x6C,0x73,0x63,0x72,0x65,0x65,0x6E,0x20,0x6D,0x6F,0x64,
2232− 0x65,0x20,0x63,0x61,0x6E,0x20,0x62,0x65,0x20,0x75,0x6E,0x62,
2233− 0x65,0x61,0x72,0x61,0x62,0x6C,0x79,0x20,0x73,0x6C,0x6F,0x77,
2234− 0x20,0x6F,0x6E,0x20,0x61,0x20,0x52,0x61,0x73,0x70,0x62,0x65,
2235− 0x72,0x72,0x79,0x20,0x50,0x69,0x20,0x28,0x65,0x76,0x65,0x6E,
2236− 0x20,0x6F,0x6E,0x20,0x52,0x50,0x69,0x20,0x34,0x29,0x01,0x3E,
2237− 0x52,0x3E,0x40,0x58,0x30,0x31,0x30,0x2D,0x20,0x4E,0x6F,0x74,
2238− 0x20,0x61,0x20,0x62,0x75,0x67,0x2C,0x20,0x62,0x75,0x74,0x20,
2239− 0x69,0x66,0x20,0x79,0x6F,0x75,0x72,0x20,0x6D,0x6F,0x6E,0x69,
2240− 0x74,0x6F,0x72,0x27,0x73,0x20,0x72,0x65,0x66,0x72,0x65,0x73,
2241− 0x68,0x20,0x72,0x61,0x74,0x65,0x20,0x69,0x73,0x20,0x6E,0x6F,
2242− 0x74,0x20,0x73,0x65,0x74,0x20,0x74,0x6F,0x20,0x36,0x30,0x48,
2243− 0x7A,0x20,0x28,0x6F,0x72,0x20,0x35,0x39,0x48,0x7A,0x29,0x4F,
2244− 0x3E,0x40,0x58,0x30,0x32,0x31,0x79,0x6F,0x75,0x20,0x6D,0x61,
2245− 0x79,0x20,0x65,0x78,0x70,0x65,0x72,0x69,0x65,0x6E,0x63,0x65,
2246− 0x20,0x76,0x69,0x73,0x75,0x61,0x6C,0x20,0x73,0x74,0x75,0x74,
2247− 0x74,0x65,0x72,0x69,0x6E,0x67,0x20,0x62,0x65,0x63,0x61,0x75,
2248− 0x73,0x65,0x20,0x56,0x53,0x79,0x6E,0x63,0x20,0x77,0x69,0x6C,
2249− 0x6C,0x20,0x6E,0x6F,0x74,0x20,0x62,0x65,0x20,0x75,0x73,0x65,
2250− 0x64,0x20,0x74,0x68,0x65,0x6E,0x2E,0x51,0x49,0x20,0x68,0x69,
2251− 0x67,0x68,0x6C,0x79,0x20,0x72,0x65,0x63,0x6F,0x6D,0x6D,0x65,
2252− 0x6E,0x64,0x20,0x72,0x75,0x6E,0x6E,0x69,0x6E,0x67,0x20,0x79,
2253− 0x6F,0x75,0x72,0x20,0x6D,0x6F,0x6E,0x69,0x74,0x6F,0x72,0x20,
2254− 0x61,0x74,0x20,0x36,0x30,0x48,0x7A,0x20,0x69,0x66,0x20,0x79,
2255− 0x6F,0x75,0x27,0x72,0x65,0x20,0x61,0x20,0x68,0x61,0x72,0x64,
2256− 0x63,0x6F,0x72,0x65,0x20,0x75,0x73,0x65,0x72,0x20,0x6F,0x66,
2257− 0x20,0x74,0x68,0x69,0x73,0x08,0x70,0x72,0x6F,0x67,0x72,0x61,
2258− 0x6D,0x2E,0x00,0x03,0x45,0x4E,0x44
2199+ 0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x0C,0x40,
2200+ 0x4C,0x4B,0x6E,0x6F,0x77,0x6E,0x20,0x62,0x75,0x67,0x73,0x06,
2201+ 0x3E,0x40,0x58,0x30,0x31,0x30,0x2C,0x3E,0x40,0x43,0x30,0x30,
2202+ 0x31,0x57,0x41,0x56,0x20,0x65,0x78,0x70,0x6F,0x72,0x74,0x69,
2203+ 0x6E,0x67,0x20,0x28,0x72,0x65,0x6E,0x64,0x65,0x72,0x69,0x6E,
2204+ 0x67,0x20,0x73,0x6F,0x6E,0x67,0x20,0x74,0x6F,0x20,0x57,0x41,
2205+ 0x56,0x29,0x3A,0x01,0x3E,0x50,0x3E,0x40,0x43,0x30,0x30,0x32,
2206+ 0x2D,0x20,0x53,0x6F,0x6E,0x67,0x73,0x20,0x74,0x68,0x61,0x74,
2207+ 0x20,0x6A,0x75,0x6D,0x70,0x20,0x62,0x61,0x63,0x6B,0x20,0x74,
2208+ 0x6F,0x20,0x61,0x20,0x70,0x72,0x65,0x76,0x69,0x6F,0x75,0x73,
2209+ 0x20,0x70,0x61,0x74,0x74,0x65,0x72,0x6E,0x20,0x77,0x69,0x6C,
2210+ 0x6C,0x20,0x72,0x65,0x6E,0x64,0x65,0x72,0x20,0x66,0x6F,0x72,
2211+ 0x65,0x76,0x65,0x72,0x20,0x61,0x6E,0x64,0x20,0x65,0x76,0x65,
2212+ 0x72,0x2C,0x50,0x61,0x6E,0x64,0x20,0x79,0x6F,0x75,0x20,0x6E,
2213+ 0x65,0x65,0x64,0x20,0x74,0x6F,0x20,0x70,0x72,0x65,0x73,0x73,
2214+ 0x20,0x61,0x20,0x6B,0x65,0x79,0x20,0x6F,0x72,0x20,0x63,0x6C,
2215+ 0x69,0x63,0x6B,0x20,0x74,0x68,0x65,0x20,0x6D,0x6F,0x75,0x73,
2216+ 0x65,0x20,0x74,0x6F,0x20,0x61,0x62,0x6F,0x72,0x74,0x20,0x74,
2217+ 0x68,0x65,0x20,0x72,0x65,0x6E,0x64,0x65,0x72,0x20,0x77,0x68,
2218+ 0x65,0x6E,0x20,0x79,0x6F,0x75,0x20,0x77,0x61,0x6E,0x74,0x06,
2219+ 0x69,0x74,0x20,0x74,0x6F,0x2E,0x06,0x3E,0x40,0x58,0x30,0x31,
2220+ 0x30,0x17,0x3E,0x40,0x43,0x30,0x30,0x31,0x4D,0x6F,0x75,0x73,
2221+ 0x65,0x20,0x2F,0x20,0x6B,0x65,0x79,0x62,0x6F,0x61,0x72,0x64,
2222+ 0x3A,0x01,0x3E,0x43,0x3E,0x40,0x43,0x30,0x30,0x32,0x2D,0x20,
2223+ 0x4C,0x69,0x6E,0x75,0x78,0x3A,0x20,0x54,0x68,0x65,0x20,0x6D,
2224+ 0x6F,0x75,0x73,0x65,0x20,0x63,0x75,0x72,0x73,0x6F,0x72,0x20,
2225+ 0x67,0x72,0x61,0x70,0x68,0x69,0x63,0x73,0x20,0x63,0x61,0x6E,
2226+ 0x20,0x62,0x65,0x20,0x67,0x6C,0x69,0x74,0x63,0x68,0x79,0x20,
2227+ 0x61,0x74,0x20,0x74,0x69,0x6D,0x65,0x73,0x2E,0x2E,0x2E,0x06,
2228+ 0x3E,0x40,0x58,0x30,0x31,0x30,0x0C,0x3E,0x40,0x43,0x30,0x30,
2229+ 0x31,0x56,0x69,0x64,0x65,0x6F,0x3A,0x06,0x3E,0x40,0x43,0x30,
2230+ 0x30,0x32,0x50,0x3E,0x40,0x58,0x30,0x31,0x30,0x2D,0x20,0x46,
2231+ 0x75,0x6C,0x6C,0x73,0x63,0x72,0x65,0x65,0x6E,0x20,0x6D,0x6F,
2232+ 0x64,0x65,0x20,0x63,0x61,0x6E,0x20,0x62,0x65,0x20,0x75,0x6E,
2233+ 0x62,0x65,0x61,0x72,0x61,0x62,0x6C,0x79,0x20,0x73,0x6C,0x6F,
2234+ 0x77,0x20,0x6F,0x6E,0x20,0x61,0x20,0x52,0x61,0x73,0x70,0x62,
2235+ 0x65,0x72,0x72,0x79,0x20,0x50,0x69,0x20,0x28,0x65,0x76,0x65,
2236+ 0x6E,0x20,0x6F,0x6E,0x20,0x52,0x50,0x69,0x20,0x34,0x29,0x01,
2237+ 0x3E,0x52,0x3E,0x40,0x58,0x30,0x31,0x30,0x2D,0x20,0x4E,0x6F,
2238+ 0x74,0x20,0x61,0x20,0x62,0x75,0x67,0x2C,0x20,0x62,0x75,0x74,
2239+ 0x20,0x69,0x66,0x20,0x79,0x6F,0x75,0x72,0x20,0x6D,0x6F,0x6E,
2240+ 0x69,0x74,0x6F,0x72,0x27,0x73,0x20,0x72,0x65,0x66,0x72,0x65,
2241+ 0x73,0x68,0x20,0x72,0x61,0x74,0x65,0x20,0x69,0x73,0x20,0x6E,
2242+ 0x6F,0x74,0x20,0x73,0x65,0x74,0x20,0x74,0x6F,0x20,0x36,0x30,
2243+ 0x48,0x7A,0x20,0x28,0x6F,0x72,0x20,0x35,0x39,0x48,0x7A,0x29,
2244+ 0x4F,0x3E,0x40,0x58,0x30,0x32,0x31,0x79,0x6F,0x75,0x20,0x6D,
2245+ 0x61,0x79,0x20,0x65,0x78,0x70,0x65,0x72,0x69,0x65,0x6E,0x63,
2246+ 0x65,0x20,0x76,0x69,0x73,0x75,0x61,0x6C,0x20,0x73,0x74,0x75,
2247+ 0x74,0x74,0x65,0x72,0x69,0x6E,0x67,0x20,0x62,0x65,0x63,0x61,
2248+ 0x75,0x73,0x65,0x20,0x56,0x53,0x79,0x6E,0x63,0x20,0x77,0x69,
2249+ 0x6C,0x6C,0x20,0x6E,0x6F,0x74,0x20,0x62,0x65,0x20,0x75,0x73,
2250+ 0x65,0x64,0x20,0x74,0x68,0x65,0x6E,0x2E,0x51,0x49,0x20,0x68,
2251+ 0x69,0x67,0x68,0x6C,0x79,0x20,0x72,0x65,0x63,0x6F,0x6D,0x6D,
2252+ 0x65,0x6E,0x64,0x20,0x72,0x75,0x6E,0x6E,0x69,0x6E,0x67,0x20,
2253+ 0x79,0x6F,0x75,0x72,0x20,0x6D,0x6F,0x6E,0x69,0x74,0x6F,0x72,
2254+ 0x20,0x61,0x74,0x20,0x36,0x30,0x48,0x7A,0x20,0x69,0x66,0x20,
2255+ 0x79,0x6F,0x75,0x27,0x72,0x65,0x20,0x61,0x20,0x68,0x61,0x72,
2256+ 0x64,0x63,0x6F,0x72,0x65,0x20,0x75,0x73,0x65,0x72,0x20,0x6F,
2257+ 0x66,0x20,0x74,0x68,0x69,0x73,0x08,0x70,0x72,0x6F,0x67,0x72,
2258+ 0x61,0x6D,0x2E,0x00,0x03,0x45,0x4E,0x44
22592259 };
22602260
22612261 #endif
src/mixer/ft2_center_mix.c+166−166
@@ -13,7 +13,7 @@ · 12 unmodified lines
1313 void centerMix8bNoLoop(voice_t *v, uint32_t numSamples)
1414 {
1515 const int8_t *base, *smpPtr;
16− float fSample, *fMixBufferL, *fMixBufferR;
16+ double dSample, *dMixBufferL, *dMixBufferR;
1717 int32_t pos;
1818 uint32_t i, samplesToMix, samplesLeft;
1919 uint64_t posFrac;
@@ -55,7 +55,7 @@ void centerMix8bNoLoop(voice_t *v, uint32_t numSamples) · 35 unmodified lines
5555 void centerMix8bLoop(voice_t *v, uint32_t numSamples)
5656 {
5757 const int8_t *base, *smpPtr;
58− float fSample, *fMixBufferL, *fMixBufferR;
58+ double dSample, *dMixBufferL, *dMixBufferR;
5959 int32_t pos;
6060 uint32_t i, samplesToMix, samplesLeft;
6161 uint64_t posFrac;
@@ -97,7 +97,7 @@ void centerMix8bLoop(voice_t *v, uint32_t numSamples) · 35 unmodified lines
9797 void centerMix8bBidiLoop(voice_t *v, uint32_t numSamples)
9898 {
9999 const int8_t *base, *revBase, *smpPtr;
100− float fSample, *fMixBufferL, *fMixBufferR;
100+ double dSample, *dMixBufferL, *dMixBufferR;
101101 int32_t pos;
102102 uint32_t i, samplesToMix, samplesLeft;
103103 uint64_t posFrac, tmpDelta;
@@ -138,10 +138,10 @@ void centerMix8bBidiLoop(voice_t *v, uint32_t numSamples) · 34 unmodified lines
138138 SET_BACK_MIXER_POS
139139 }
140140
141−void centerMix8bNoLoopCIntrp(voice_t *v, uint32_t numSamples)
141+void centerMix8bNoLoopSIntrp(voice_t *v, uint32_t numSamples)
142142 {
143143 const int8_t *base, *smpPtr;
144− float fSample, *fMixBufferL, *fMixBufferR;
144+ double dSample, *dMixBufferL, *dMixBufferR;
145145 int32_t pos;
146146 uint32_t i, samplesToMix, samplesLeft;
147147 uint64_t posFrac;
@@ -158,19 +158,19 @@ void centerMix8bNoLoopCIntrp(voice_t *v, uint32_t numSamples) · 10 unmodified lines
158158
159159 for (i = 0; i < (samplesToMix & 3); i++)
160160 {
161− RENDER_8BIT_SMP_MONO_CINTRP
161+ RENDER_8BIT_SMP_MONO_SINTRP
162162 INC_POS
163163 }
164164 samplesToMix >>= 2;
165165 for (i = 0; i < samplesToMix; i++)
166166 {
167− RENDER_8BIT_SMP_MONO_CINTRP
167+ RENDER_8BIT_SMP_MONO_SINTRP
168168 INC_POS
169− RENDER_8BIT_SMP_MONO_CINTRP
169+ RENDER_8BIT_SMP_MONO_SINTRP
170170 INC_POS
171− RENDER_8BIT_SMP_MONO_CINTRP
171+ RENDER_8BIT_SMP_MONO_SINTRP
172172 INC_POS
173− RENDER_8BIT_SMP_MONO_CINTRP
173+ RENDER_8BIT_SMP_MONO_SINTRP
174174 INC_POS
175175 }
176176
@@ -180,10 +180,10 @@ void centerMix8bNoLoopCIntrp(voice_t *v, uint32_t numSamples) · 3 unmodified lines
180180 SET_BACK_MIXER_POS
181181 }
182182
183−void centerMix8bLoopCIntrp(voice_t *v, uint32_t numSamples)
183+void centerMix8bLoopSIntrp(voice_t *v, uint32_t numSamples)
184184 {
185185 const int8_t *base, *smpPtr;
186− float s0, s1, s2, s3, fSample, *fMixBufferL, *fMixBufferR;
186+ double dSample, *dMixBufferL, *dMixBufferR;
187187 int32_t pos;
188188 uint32_t i, samplesToMix, samplesLeft;
189189 uint64_t posFrac;
@@ -203,19 +203,19 @@ void centerMix8bLoopCIntrp(voice_t *v, uint32_t numSamples) · 13 unmodified lines
203203 {
204204 for (i = 0; i < (samplesToMix & 3); i++)
205205 {
206− RENDER_8BIT_SMP_MONO_CINTRP_TAP_FIX
206+ RENDER_8BIT_SMP_MONO_SINTRP_TAP_FIX
207207 INC_POS
208208 }
209209 samplesToMix >>= 2;
210210 for (i = 0; i < samplesToMix; i++)
211211 {
212− RENDER_8BIT_SMP_MONO_CINTRP_TAP_FIX
212+ RENDER_8BIT_SMP_MONO_SINTRP_TAP_FIX
213213 INC_POS
214− RENDER_8BIT_SMP_MONO_CINTRP_TAP_FIX
214+ RENDER_8BIT_SMP_MONO_SINTRP_TAP_FIX
215215 INC_POS
216− RENDER_8BIT_SMP_MONO_CINTRP_TAP_FIX
216+ RENDER_8BIT_SMP_MONO_SINTRP_TAP_FIX
217217 INC_POS
218− RENDER_8BIT_SMP_MONO_CINTRP_TAP_FIX
218+ RENDER_8BIT_SMP_MONO_SINTRP_TAP_FIX
219219 INC_POS
220220 }
221221 }
@@ -223,19 +223,19 @@ void centerMix8bLoopCIntrp(voice_t *v, uint32_t numSamples) · 1 unmodified line
223223 {
224224 for (i = 0; i < (samplesToMix & 3); i++)
225225 {
226− RENDER_8BIT_SMP_MONO_CINTRP
226+ RENDER_8BIT_SMP_MONO_SINTRP
227227 INC_POS
228228 }
229229 samplesToMix >>= 2;
230230 for (i = 0; i < samplesToMix; i++)
231231 {
232− RENDER_8BIT_SMP_MONO_CINTRP
232+ RENDER_8BIT_SMP_MONO_SINTRP
233233 INC_POS
234− RENDER_8BIT_SMP_MONO_CINTRP
234+ RENDER_8BIT_SMP_MONO_SINTRP
235235 INC_POS
236− RENDER_8BIT_SMP_MONO_CINTRP
236+ RENDER_8BIT_SMP_MONO_SINTRP
237237 INC_POS
238− RENDER_8BIT_SMP_MONO_CINTRP
238+ RENDER_8BIT_SMP_MONO_SINTRP
239239 INC_POS
240240 }
241241 }
@@ -246,10 +246,10 @@ void centerMix8bLoopCIntrp(voice_t *v, uint32_t numSamples) · 4 unmodified lines
246246 SET_BACK_MIXER_POS
247247 }
248248
249−void centerMix8bBidiLoopCIntrp(voice_t *v, uint32_t numSamples)
249+void centerMix8bBidiLoopSIntrp(voice_t *v, uint32_t numSamples)
250250 {
251251 const int8_t *base, *revBase, *smpPtr;
252− float s0, s1, s2, s3, fSample, *fMixBufferL, *fMixBufferR;
252+ double dSample, *dMixBufferL, *dMixBufferR;
253253 int32_t pos;
254254 uint32_t i, samplesToMix, samplesLeft;
255255 uint64_t posFrac, tmpDelta;
@@ -270,19 +270,19 @@ void centerMix8bBidiLoopCIntrp(voice_t *v, uint32_t numSamples) · 14 unmodified lines
270270 {
271271 for (i = 0; i < (samplesToMix & 3); i++)
272272 {
273− RENDER_8BIT_SMP_MONO_CINTRP_TAP_FIX
273+ RENDER_8BIT_SMP_MONO_SINTRP_TAP_FIX
274274 INC_POS_BIDI
275275 }
276276 samplesToMix >>= 2;
277277 for (i = 0; i < samplesToMix; i++)
278278 {
279− RENDER_8BIT_SMP_MONO_CINTRP_TAP_FIX
279+ RENDER_8BIT_SMP_MONO_SINTRP_TAP_FIX
280280 INC_POS_BIDI
281− RENDER_8BIT_SMP_MONO_CINTRP_TAP_FIX
281+ RENDER_8BIT_SMP_MONO_SINTRP_TAP_FIX
282282 INC_POS_BIDI
283− RENDER_8BIT_SMP_MONO_CINTRP_TAP_FIX
283+ RENDER_8BIT_SMP_MONO_SINTRP_TAP_FIX
284284 INC_POS_BIDI
285− RENDER_8BIT_SMP_MONO_CINTRP_TAP_FIX
285+ RENDER_8BIT_SMP_MONO_SINTRP_TAP_FIX
286286 INC_POS_BIDI
287287 }
288288 }
@@ -290,19 +290,19 @@ void centerMix8bBidiLoopCIntrp(voice_t *v, uint32_t numSamples) · 1 unmodified line
290290 {
291291 for (i = 0; i < (samplesToMix & 3); i++)
292292 {
293− RENDER_8BIT_SMP_MONO_CINTRP
293+ RENDER_8BIT_SMP_MONO_SINTRP
294294 INC_POS_BIDI
295295 }
296296 samplesToMix >>= 2;
297297 for (i = 0; i < samplesToMix; i++)
298298 {
299− RENDER_8BIT_SMP_MONO_CINTRP
299+ RENDER_8BIT_SMP_MONO_SINTRP
300300 INC_POS_BIDI
301− RENDER_8BIT_SMP_MONO_CINTRP
301+ RENDER_8BIT_SMP_MONO_SINTRP
302302 INC_POS_BIDI
303− RENDER_8BIT_SMP_MONO_CINTRP
303+ RENDER_8BIT_SMP_MONO_SINTRP
304304 INC_POS_BIDI
305− RENDER_8BIT_SMP_MONO_CINTRP
305+ RENDER_8BIT_SMP_MONO_SINTRP
306306 INC_POS_BIDI
307307 }
308308 }
@@ -318,7 +318,7 @@ void centerMix8bBidiLoopCIntrp(voice_t *v, uint32_t numSamples) · 9 unmodified lines
318318 void centerMix8bNoLoopLIntrp(voice_t *v, uint32_t numSamples)
319319 {
320320 const int8_t *base, *smpPtr;
321− float fSample, *fMixBufferL, *fMixBufferR;
321+ double dSample, *dMixBufferL, *dMixBufferR;
322322 int32_t pos;
323323 uint32_t i, samplesToMix, samplesLeft;
324324 uint64_t posFrac;
@@ -360,7 +360,7 @@ void centerMix8bNoLoopLIntrp(voice_t *v, uint32_t numSamples) · 35 unmodified lines
360360 void centerMix8bLoopLIntrp(voice_t *v, uint32_t numSamples)
361361 {
362362 const int8_t *base, *smpPtr;
363− float fSample, *fMixBufferL, *fMixBufferR;
363+ double dSample, *dMixBufferL, *dMixBufferR;
364364 int32_t pos;
365365 uint32_t i, samplesToMix, samplesLeft;
366366 uint64_t posFrac;
@@ -402,7 +402,7 @@ void centerMix8bLoopLIntrp(voice_t *v, uint32_t numSamples) · 35 unmodified lines
402402 void centerMix8bBidiLoopLIntrp(voice_t *v, uint32_t numSamples)
403403 {
404404 const int8_t *base, *revBase, *smpPtr;
405− float fSample, *fMixBufferL, *fMixBufferR;
405+ double dSample, *dMixBufferL, *dMixBufferR;
406406 int32_t pos;
407407 uint32_t i, samplesToMix, samplesLeft;
408408 uint64_t posFrac, tmpDelta;
@@ -446,9 +446,9 @@ void centerMix8bBidiLoopLIntrp(voice_t *v, uint32_t numSamples) · 37 unmodified lines
446446 void centerMix8bRampNoLoop(voice_t *v, uint32_t numSamples)
447447 {
448448 const int8_t *base, *smpPtr;
449− float fSample, *fMixBufferL, *fMixBufferR;
449+ double dSample, *dMixBufferL, *dMixBufferR;
450450 int32_t pos;
451− float fVolLDelta, fVolL;
451+ double dVolLDelta, dVolL;
452452 uint32_t i, samplesToMix, samplesLeft;
453453 uint64_t posFrac;
454454
@@ -496,9 +496,9 @@ void centerMix8bRampNoLoop(voice_t *v, uint32_t numSamples) · 41 unmodified lines
496496 void centerMix8bRampLoop(voice_t *v, uint32_t numSamples)
497497 {
498498 const int8_t *base, *smpPtr;
499− float fSample, *fMixBufferL, *fMixBufferR;
499+ double dSample, *dMixBufferL, *dMixBufferR;
500500 int32_t pos;
501− float fVolLDelta, fVolL;
501+ double dVolLDelta, dVolL;
502502 uint32_t i, samplesToMix, samplesLeft;
503503 uint64_t posFrac;
504504
@@ -546,9 +546,9 @@ void centerMix8bRampLoop(voice_t *v, uint32_t numSamples) · 41 unmodified lines
546546 void centerMix8bRampBidiLoop(voice_t *v, uint32_t numSamples)
547547 {
548548 const int8_t *base, *revBase, *smpPtr;
549− float fSample, *fMixBufferL, *fMixBufferR;
549+ double dSample, *dMixBufferL, *dMixBufferR;
550550 int32_t pos;
551− float fVolLDelta, fVolL;
551+ double dVolLDelta, dVolL;
552552 uint32_t i, samplesToMix, samplesLeft;
553553 uint64_t posFrac, tmpDelta;
554554
@@ -595,12 +595,12 @@ void centerMix8bRampBidiLoop(voice_t *v, uint32_t numSamples) · 40 unmodified lines
595595 SET_BACK_MIXER_POS
596596 }
597597
598−void centerMix8bRampNoLoopCIntrp(voice_t *v, uint32_t numSamples)
598+void centerMix8bRampNoLoopSIntrp(voice_t *v, uint32_t numSamples)
599599 {
600600 const int8_t *base, *smpPtr;
601− float fSample, *fMixBufferL, *fMixBufferR;
601+ double dSample, *dMixBufferL, *dMixBufferR;
602602 int32_t pos;
603− float fVolLDelta, fVolL;
603+ double dVolLDelta, dVolL;
604604 uint32_t i, samplesToMix, samplesLeft;
605605 uint64_t posFrac;
606606
@@ -617,23 +617,23 @@ void centerMix8bRampNoLoopCIntrp(voice_t *v, uint32_t numSamples) · 10 unmodified lines
617617
618618 for (i = 0; i < (samplesToMix & 3); i++)
619619 {
620− RENDER_8BIT_SMP_MONO_CINTRP
620+ RENDER_8BIT_SMP_MONO_SINTRP
621621 VOLUME_RAMPING_MONO
622622 INC_POS
623623 }
624624 samplesToMix >>= 2;
625625 for (i = 0; i < samplesToMix; i++)
626626 {
627− RENDER_8BIT_SMP_MONO_CINTRP
627+ RENDER_8BIT_SMP_MONO_SINTRP
628628 VOLUME_RAMPING_MONO
629629 INC_POS
630− RENDER_8BIT_SMP_MONO_CINTRP
630+ RENDER_8BIT_SMP_MONO_SINTRP
631631 VOLUME_RAMPING_MONO
632632 INC_POS
633− RENDER_8BIT_SMP_MONO_CINTRP
633+ RENDER_8BIT_SMP_MONO_SINTRP
634634 VOLUME_RAMPING_MONO
635635 INC_POS
636− RENDER_8BIT_SMP_MONO_CINTRP
636+ RENDER_8BIT_SMP_MONO_SINTRP
637637 VOLUME_RAMPING_MONO
638638 INC_POS
639639 }
@@ -645,12 +645,12 @@ void centerMix8bRampNoLoopCIntrp(voice_t *v, uint32_t numSamples) · 5 unmodified lines
645645 SET_BACK_MIXER_POS
646646 }
647647
648−void centerMix8bRampLoopCIntrp(voice_t *v, uint32_t numSamples)
648+void centerMix8bRampLoopSIntrp(voice_t *v, uint32_t numSamples)
649649 {
650650 const int8_t *base, *smpPtr;
651− float s0, s1, s2, s3, fSample, *fMixBufferL, *fMixBufferR;
651+ double dSample, *dMixBufferL, *dMixBufferR;
652652 int32_t pos;
653− float fVolLDelta, fVolL;
653+ double dVolLDelta, dVolL;
654654 uint32_t i, samplesToMix, samplesLeft;
655655 uint64_t posFrac;
656656
@@ -670,23 +670,23 @@ void centerMix8bRampLoopCIntrp(voice_t *v, uint32_t numSamples) · 13 unmodified lines
670670 {
671671 for (i = 0; i < (samplesToMix & 3); i++)
672672 {
673− RENDER_8BIT_SMP_MONO_CINTRP_TAP_FIX
673+ RENDER_8BIT_SMP_MONO_SINTRP_TAP_FIX
674674 VOLUME_RAMPING_MONO
675675 INC_POS
676676 }
677677 samplesToMix >>= 2;
678678 for (i = 0; i < samplesToMix; i++)
679679 {
680− RENDER_8BIT_SMP_MONO_CINTRP_TAP_FIX
680+ RENDER_8BIT_SMP_MONO_SINTRP_TAP_FIX
681681 VOLUME_RAMPING_MONO
682682 INC_POS
683− RENDER_8BIT_SMP_MONO_CINTRP_TAP_FIX
683+ RENDER_8BIT_SMP_MONO_SINTRP_TAP_FIX
684684 VOLUME_RAMPING_MONO
685685 INC_POS
686− RENDER_8BIT_SMP_MONO_CINTRP_TAP_FIX
686+ RENDER_8BIT_SMP_MONO_SINTRP_TAP_FIX
687687 VOLUME_RAMPING_MONO
688688 INC_POS
689− RENDER_8BIT_SMP_MONO_CINTRP_TAP_FIX
689+ RENDER_8BIT_SMP_MONO_SINTRP_TAP_FIX
690690 VOLUME_RAMPING_MONO
691691 INC_POS
692692 }
@@ -695,23 +695,23 @@ void centerMix8bRampLoopCIntrp(voice_t *v, uint32_t numSamples) · 2 unmodified lines
695695 {
696696 for (i = 0; i < (samplesToMix & 3); i++)
697697 {
698− RENDER_8BIT_SMP_MONO_CINTRP
698+ RENDER_8BIT_SMP_MONO_SINTRP
699699 VOLUME_RAMPING_MONO
700700 INC_POS
701701 }
702702 samplesToMix >>= 2;
703703 for (i = 0; i < samplesToMix; i++)
704704 {
705− RENDER_8BIT_SMP_MONO_CINTRP
705+ RENDER_8BIT_SMP_MONO_SINTRP
706706 VOLUME_RAMPING_MONO
707707 INC_POS
708− RENDER_8BIT_SMP_MONO_CINTRP
708+ RENDER_8BIT_SMP_MONO_SINTRP
709709 VOLUME_RAMPING_MONO
710710 INC_POS
711− RENDER_8BIT_SMP_MONO_CINTRP
711+ RENDER_8BIT_SMP_MONO_SINTRP
712712 VOLUME_RAMPING_MONO
713713 INC_POS
714− RENDER_8BIT_SMP_MONO_CINTRP
714+ RENDER_8BIT_SMP_MONO_SINTRP
715715 VOLUME_RAMPING_MONO
716716 INC_POS
717717 }
@@ -724,12 +724,12 @@ void centerMix8bRampLoopCIntrp(voice_t *v, uint32_t numSamples) · 6 unmodified lines
724724 SET_BACK_MIXER_POS
725725 }
726726
727−void centerMix8bRampBidiLoopCIntrp(voice_t *v, uint32_t numSamples)
727+void centerMix8bRampBidiLoopSIntrp(voice_t *v, uint32_t numSamples)
728728 {
729729 const int8_t *base, *revBase, *smpPtr;
730− float s0, s1, s2, s3, fSample, *fMixBufferL, *fMixBufferR;
730+ double dSample, *dMixBufferL, *dMixBufferR;
731731 int32_t pos;
732− float fVolLDelta, fVolL;
732+ double dVolLDelta, dVolL;
733733 uint32_t i, samplesToMix, samplesLeft;
734734 uint64_t posFrac, tmpDelta;
735735
@@ -750,23 +750,23 @@ void centerMix8bRampBidiLoopCIntrp(voice_t *v, uint32_t numSamples) · 14 unmodified lines
750750 {
751751 for (i = 0; i < (samplesToMix & 3); i++)
752752 {
753− RENDER_8BIT_SMP_MONO_CINTRP_TAP_FIX
753+ RENDER_8BIT_SMP_MONO_SINTRP_TAP_FIX
754754 VOLUME_RAMPING_MONO
755755 INC_POS_BIDI
756756 }
757757 samplesToMix >>= 2;
758758 for (i = 0; i < samplesToMix; i++)
759759 {
760− RENDER_8BIT_SMP_MONO_CINTRP_TAP_FIX
760+ RENDER_8BIT_SMP_MONO_SINTRP_TAP_FIX
761761 VOLUME_RAMPING_MONO
762762 INC_POS_BIDI
763− RENDER_8BIT_SMP_MONO_CINTRP_TAP_FIX
763+ RENDER_8BIT_SMP_MONO_SINTRP_TAP_FIX
764764 VOLUME_RAMPING_MONO
765765 INC_POS_BIDI
766− RENDER_8BIT_SMP_MONO_CINTRP_TAP_FIX
766+ RENDER_8BIT_SMP_MONO_SINTRP_TAP_FIX
767767 VOLUME_RAMPING_MONO
768768 INC_POS_BIDI
769− RENDER_8BIT_SMP_MONO_CINTRP_TAP_FIX
769+ RENDER_8BIT_SMP_MONO_SINTRP_TAP_FIX
770770 VOLUME_RAMPING_MONO
771771 INC_POS_BIDI
772772 }
@@ -775,23 +775,23 @@ void centerMix8bRampBidiLoopCIntrp(voice_t *v, uint32_t numSamples) · 2 unmodified lines
775775 {
776776 for (i = 0; i < (samplesToMix & 3); i++)
777777 {
778− RENDER_8BIT_SMP_MONO_CINTRP
778+ RENDER_8BIT_SMP_MONO_SINTRP
779779 VOLUME_RAMPING_MONO
780780 INC_POS_BIDI
781781 }
782782 samplesToMix >>= 2;
783783 for (i = 0; i < samplesToMix; i++)
784784 {
785− RENDER_8BIT_SMP_MONO_CINTRP
785+ RENDER_8BIT_SMP_MONO_SINTRP
786786 VOLUME_RAMPING_MONO
787787 INC_POS_BIDI
788− RENDER_8BIT_SMP_MONO_CINTRP
788+ RENDER_8BIT_SMP_MONO_SINTRP
789789 VOLUME_RAMPING_MONO
790790 INC_POS_BIDI
791− RENDER_8BIT_SMP_MONO_CINTRP
791+ RENDER_8BIT_SMP_MONO_SINTRP
792792 VOLUME_RAMPING_MONO
793793 INC_POS_BIDI
794− RENDER_8BIT_SMP_MONO_CINTRP
794+ RENDER_8BIT_SMP_MONO_SINTRP
795795 VOLUME_RAMPING_MONO
796796 INC_POS_BIDI
797797 }
@@ -808,9 +808,9 @@ void centerMix8bRampBidiLoopCIntrp(voice_t *v, uint32_t numSamples) · 10 unmodified lines
808808 void centerMix8bRampNoLoopLIntrp(voice_t *v, uint32_t numSamples)
809809 {
810810 const int8_t *base, *smpPtr;
811− float fSample, *fMixBufferL, *fMixBufferR;
811+ double dSample, *dMixBufferL, *dMixBufferR;
812812 int32_t pos;
813− float fVolLDelta, fVolL;
813+ double dVolLDelta, dVolL;
814814 uint32_t i, samplesToMix, samplesLeft;
815815 uint64_t posFrac;
816816
@@ -858,9 +858,9 @@ void centerMix8bRampNoLoopLIntrp(voice_t *v, uint32_t numSamples) · 41 unmodified lines
858858 void centerMix8bRampLoopLIntrp(voice_t *v, uint32_t numSamples)
859859 {
860860 const int8_t *base, *smpPtr;
861− float fSample, *fMixBufferL, *fMixBufferR;
861+ double dSample, *dMixBufferL, *dMixBufferR;
862862 int32_t pos;
863− float fVolLDelta, fVolL;
863+ double dVolLDelta, dVolL;
864864 uint32_t i, samplesToMix, samplesLeft;
865865 uint64_t posFrac;
866866
@@ -908,9 +908,9 @@ void centerMix8bRampLoopLIntrp(voice_t *v, uint32_t numSamples) · 41 unmodified lines
908908 void centerMix8bRampBidiLoopLIntrp(voice_t *v, uint32_t numSamples)
909909 {
910910 const int8_t *base, *revBase, *smpPtr;
911− float fSample, *fMixBufferL, *fMixBufferR;
911+ double dSample, *dMixBufferL, *dMixBufferR;
912912 int32_t pos;
913− float fVolLDelta, fVolL;
913+ double dVolLDelta, dVolL;
914914 uint32_t i, samplesToMix, samplesLeft;
915915 uint64_t posFrac, tmpDelta;
916916
@@ -964,7 +964,7 @@ void centerMix8bRampBidiLoopLIntrp(voice_t *v, uint32_t numSamples) · 47 unmodified lines
964964 void centerMix16bNoLoop(voice_t *v, uint32_t numSamples)
965965 {
966966 const int16_t *base, *smpPtr;
967− float fSample, *fMixBufferL, *fMixBufferR;
967+ double dSample, *dMixBufferL, *dMixBufferR;
968968 int32_t pos;
969969 uint32_t i, samplesToMix, samplesLeft;
970970 uint64_t posFrac;
@@ -1006,7 +1006,7 @@ void centerMix16bNoLoop(voice_t *v, uint32_t numSamples) · 35 unmodified lines
10061006 void centerMix16bLoop(voice_t *v, uint32_t numSamples)
10071007 {
10081008 const int16_t *base, *smpPtr;
1009− float fSample, *fMixBufferL, *fMixBufferR;
1009+ double dSample, *dMixBufferL, *dMixBufferR;
10101010 int32_t pos;
10111011 uint32_t i, samplesToMix, samplesLeft;
10121012 uint64_t posFrac;
@@ -1048,7 +1048,7 @@ void centerMix16bLoop(voice_t *v, uint32_t numSamples) · 35 unmodified lines
10481048 void centerMix16bBidiLoop(voice_t *v, uint32_t numSamples)
10491049 {
10501050 const int16_t *base, *revBase, *smpPtr;
1051− float fSample, *fMixBufferL, *fMixBufferR;
1051+ double dSample, *dMixBufferL, *dMixBufferR;
10521052 int32_t pos;
10531053 uint32_t i, samplesToMix, samplesLeft;
10541054 uint64_t posFrac, tmpDelta;
@@ -1089,10 +1089,10 @@ void centerMix16bBidiLoop(voice_t *v, uint32_t numSamples) · 34 unmodified lines
10891089 SET_BACK_MIXER_POS
10901090 }
10911091
1092−void centerMix16bNoLoopCIntrp(voice_t *v, uint32_t numSamples)
1092+void centerMix16bNoLoopSIntrp(voice_t *v, uint32_t numSamples)
10931093 {
10941094 const int16_t *base, *smpPtr;
1095− float fSample, *fMixBufferL, *fMixBufferR;
1095+ double dSample, *dMixBufferL, *dMixBufferR;
10961096 int32_t pos;
10971097 uint32_t i, samplesToMix, samplesLeft;
10981098 uint64_t posFrac;
@@ -1109,19 +1109,19 @@ void centerMix16bNoLoopCIntrp(voice_t *v, uint32_t numSamples) · 10 unmodified lines
11091109
11101110 for (i = 0; i < (samplesToMix & 3); i++)
11111111 {
1112− RENDER_16BIT_SMP_MONO_CINTRP
1112+ RENDER_16BIT_SMP_MONO_SINTRP
11131113 INC_POS
11141114 }
11151115 samplesToMix >>= 2;
11161116 for (i = 0; i < samplesToMix; i++)
11171117 {
1118− RENDER_16BIT_SMP_MONO_CINTRP
1118+ RENDER_16BIT_SMP_MONO_SINTRP
11191119 INC_POS
1120− RENDER_16BIT_SMP_MONO_CINTRP
1120+ RENDER_16BIT_SMP_MONO_SINTRP
11211121 INC_POS
1122− RENDER_16BIT_SMP_MONO_CINTRP
1122+ RENDER_16BIT_SMP_MONO_SINTRP
11231123 INC_POS
1124− RENDER_16BIT_SMP_MONO_CINTRP
1124+ RENDER_16BIT_SMP_MONO_SINTRP
11251125 INC_POS
11261126 }
11271127
@@ -1131,10 +1131,10 @@ void centerMix16bNoLoopCIntrp(voice_t *v, uint32_t numSamples) · 3 unmodified lines
11311131 SET_BACK_MIXER_POS
11321132 }
11331133
1134−void centerMix16bLoopCIntrp(voice_t *v, uint32_t numSamples)
1134+void centerMix16bLoopSIntrp(voice_t *v, uint32_t numSamples)
11351135 {
11361136 const int16_t *base, *smpPtr;
1137− float s0, s1, s2, s3, fSample, *fMixBufferL, *fMixBufferR;
1137+ double dSample, *dMixBufferL, *dMixBufferR;
11381138 int32_t pos;
11391139 uint32_t i, samplesToMix, samplesLeft;
11401140 uint64_t posFrac;
@@ -1154,19 +1154,19 @@ void centerMix16bLoopCIntrp(voice_t *v, uint32_t numSamples) · 13 unmodified lines
11541154 {
11551155 for (i = 0; i < (samplesToMix & 3); i++)
11561156 {
1157− RENDER_16BIT_SMP_MONO_CINTRP_TAP_FIX
1157+ RENDER_16BIT_SMP_MONO_SINTRP_TAP_FIX
11581158 INC_POS
11591159 }
11601160 samplesToMix >>= 2;
11611161 for (i = 0; i < samplesToMix; i++)
11621162 {
1163− RENDER_16BIT_SMP_MONO_CINTRP_TAP_FIX
1163+ RENDER_16BIT_SMP_MONO_SINTRP_TAP_FIX
11641164 INC_POS
1165− RENDER_16BIT_SMP_MONO_CINTRP_TAP_FIX
1165+ RENDER_16BIT_SMP_MONO_SINTRP_TAP_FIX
11661166 INC_POS
1167− RENDER_16BIT_SMP_MONO_CINTRP_TAP_FIX
1167+ RENDER_16BIT_SMP_MONO_SINTRP_TAP_FIX
11681168 INC_POS
1169− RENDER_16BIT_SMP_MONO_CINTRP_TAP_FIX
1169+ RENDER_16BIT_SMP_MONO_SINTRP_TAP_FIX
11701170 INC_POS
11711171 }
11721172 }
@@ -1174,19 +1174,19 @@ void centerMix16bLoopCIntrp(voice_t *v, uint32_t numSamples) · 1 unmodified line
11741174 {
11751175 for (i = 0; i < (samplesToMix & 3); i++)
11761176 {
1177− RENDER_16BIT_SMP_MONO_CINTRP
1177+ RENDER_16BIT_SMP_MONO_SINTRP
11781178 INC_POS
11791179 }
11801180 samplesToMix >>= 2;
11811181 for (i = 0; i < samplesToMix; i++)
11821182 {
1183− RENDER_16BIT_SMP_MONO_CINTRP
1183+ RENDER_16BIT_SMP_MONO_SINTRP
11841184 INC_POS
1185− RENDER_16BIT_SMP_MONO_CINTRP
1185+ RENDER_16BIT_SMP_MONO_SINTRP
11861186 INC_POS
1187− RENDER_16BIT_SMP_MONO_CINTRP
1187+ RENDER_16BIT_SMP_MONO_SINTRP
11881188 INC_POS
1189− RENDER_16BIT_SMP_MONO_CINTRP
1189+ RENDER_16BIT_SMP_MONO_SINTRP
11901190 INC_POS
11911191 }
11921192 }
@@ -1197,10 +1197,10 @@ void centerMix16bLoopCIntrp(voice_t *v, uint32_t numSamples) · 4 unmodified lines
11971197 SET_BACK_MIXER_POS
11981198 }
11991199
1200−void centerMix16bBidiLoopCIntrp(voice_t *v, uint32_t numSamples)
1200+void centerMix16bBidiLoopSIntrp(voice_t *v, uint32_t numSamples)
12011201 {
12021202 const int16_t *base, *revBase, *smpPtr;
1203− float s0, s1, s2, s3, fSample, *fMixBufferL, *fMixBufferR;
1203+ double dSample, *dMixBufferL, *dMixBufferR;
12041204 int32_t pos;
12051205 uint32_t i, samplesToMix, samplesLeft;
12061206 uint64_t posFrac, tmpDelta;
@@ -1221,19 +1221,19 @@ void centerMix16bBidiLoopCIntrp(voice_t *v, uint32_t numSamples) · 14 unmodified lines
12211221 {
12221222 for (i = 0; i < (samplesToMix & 3); i++)
12231223 {
1224− RENDER_16BIT_SMP_MONO_CINTRP_TAP_FIX
1224+ RENDER_16BIT_SMP_MONO_SINTRP_TAP_FIX
12251225 INC_POS_BIDI
12261226 }
12271227 samplesToMix >>= 2;
12281228 for (i = 0; i < samplesToMix; i++)
12291229 {
1230− RENDER_16BIT_SMP_MONO_CINTRP_TAP_FIX
1230+ RENDER_16BIT_SMP_MONO_SINTRP_TAP_FIX
12311231 INC_POS_BIDI
1232− RENDER_16BIT_SMP_MONO_CINTRP_TAP_FIX
1232+ RENDER_16BIT_SMP_MONO_SINTRP_TAP_FIX
12331233 INC_POS_BIDI
1234− RENDER_16BIT_SMP_MONO_CINTRP_TAP_FIX
1234+ RENDER_16BIT_SMP_MONO_SINTRP_TAP_FIX
12351235 INC_POS_BIDI
1236− RENDER_16BIT_SMP_MONO_CINTRP_TAP_FIX
1236+ RENDER_16BIT_SMP_MONO_SINTRP_TAP_FIX
12371237 INC_POS_BIDI
12381238 }
12391239 }
@@ -1241,19 +1241,19 @@ void centerMix16bBidiLoopCIntrp(voice_t *v, uint32_t numSamples) · 1 unmodified line
12411241 {
12421242 for (i = 0; i < (samplesToMix & 3); i++)
12431243 {
1244− RENDER_16BIT_SMP_MONO_CINTRP
1244+ RENDER_16BIT_SMP_MONO_SINTRP
12451245 INC_POS_BIDI
12461246 }
12471247 samplesToMix >>= 2;
12481248 for (i = 0; i < samplesToMix; i++)
12491249 {
1250− RENDER_16BIT_SMP_MONO_CINTRP
1250+ RENDER_16BIT_SMP_MONO_SINTRP
12511251 INC_POS_BIDI
1252− RENDER_16BIT_SMP_MONO_CINTRP
1252+ RENDER_16BIT_SMP_MONO_SINTRP
12531253 INC_POS_BIDI
1254− RENDER_16BIT_SMP_MONO_CINTRP
1254+ RENDER_16BIT_SMP_MONO_SINTRP
12551255 INC_POS_BIDI
1256− RENDER_16BIT_SMP_MONO_CINTRP
1256+ RENDER_16BIT_SMP_MONO_SINTRP
12571257 INC_POS_BIDI
12581258 }
12591259 }
@@ -1268,7 +1268,7 @@ void centerMix16bBidiLoopCIntrp(voice_t *v, uint32_t numSamples) · 8 unmodified lines
12681268 void centerMix16bNoLoopLIntrp(voice_t *v, uint32_t numSamples)
12691269 {
12701270 const int16_t *base, *smpPtr;
1271− float fSample, *fMixBufferL, *fMixBufferR;
1271+ double dSample, *dMixBufferL, *dMixBufferR;
12721272 int32_t pos;
12731273 uint32_t i, samplesToMix, samplesLeft;
12741274 uint64_t posFrac;
@@ -1310,7 +1310,7 @@ void centerMix16bNoLoopLIntrp(voice_t *v, uint32_t numSamples) · 35 unmodified lines
13101310 void centerMix16bLoopLIntrp(voice_t *v, uint32_t numSamples)
13111311 {
13121312 const int16_t *base, *smpPtr;
1313− float fSample, *fMixBufferL, *fMixBufferR;
1313+ double dSample, *dMixBufferL, *dMixBufferR;
13141314 int32_t pos;
13151315 uint32_t i, samplesToMix, samplesLeft;
13161316 uint64_t posFrac;
@@ -1352,7 +1352,7 @@ void centerMix16bLoopLIntrp(voice_t *v, uint32_t numSamples) · 35 unmodified lines
13521352 void centerMix16bBidiLoopLIntrp(voice_t *v, uint32_t numSamples)
13531353 {
13541354 const int16_t *base, *revBase, *smpPtr;
1355− float fSample, *fMixBufferL, *fMixBufferR;
1355+ double dSample, *dMixBufferL, *dMixBufferR;
13561356 int32_t pos;
13571357 uint32_t i, samplesToMix, samplesLeft;
13581358 uint64_t posFrac, tmpDelta;
@@ -1397,9 +1397,9 @@ void centerMix16bBidiLoopLIntrp(voice_t *v, uint32_t numSamples) · 38 unmodified lines
13971397 void centerMix16bRampNoLoop(voice_t *v, uint32_t numSamples)
13981398 {
13991399 const int16_t *base, *smpPtr;
1400− float fSample, *fMixBufferL, *fMixBufferR;
1400+ double dSample, *dMixBufferL, *dMixBufferR;
14011401 int32_t pos;
1402− float fVolLDelta, fVolL;
1402+ double dVolLDelta, dVolL;
14031403 uint32_t i, samplesToMix, samplesLeft;
14041404 uint64_t posFrac;
14051405
@@ -1447,9 +1447,9 @@ void centerMix16bRampNoLoop(voice_t *v, uint32_t numSamples) · 41 unmodified lines
14471447 void centerMix16bRampLoop(voice_t *v, uint32_t numSamples)
14481448 {
14491449 const int16_t *base, *smpPtr;
1450− float fSample, *fMixBufferL, *fMixBufferR;
1450+ double dSample, *dMixBufferL, *dMixBufferR;
14511451 int32_t pos;
1452− float fVolLDelta, fVolL;
1452+ double dVolLDelta, dVolL;
14531453 uint32_t i, samplesToMix, samplesLeft;
14541454 uint64_t posFrac;
14551455
@@ -1497,9 +1497,9 @@ void centerMix16bRampLoop(voice_t *v, uint32_t numSamples) · 41 unmodified lines
14971497 void centerMix16bRampBidiLoop(voice_t *v, uint32_t numSamples)
14981498 {
14991499 const int16_t *base, *revBase, *smpPtr;
1500− float fSample, *fMixBufferL, *fMixBufferR;
1500+ double dSample, *dMixBufferL, *dMixBufferR;
15011501 int32_t pos;
1502− float fVolLDelta, fVolL;
1502+ double dVolLDelta, dVolL;
15031503 uint32_t i, samplesToMix, samplesLeft;
15041504 uint64_t posFrac, tmpDelta;
15051505
@@ -1546,12 +1546,12 @@ void centerMix16bRampBidiLoop(voice_t *v, uint32_t numSamples) · 40 unmodified lines
15461546 SET_BACK_MIXER_POS
15471547 }
15481548
1549−void centerMix16bRampNoLoopCIntrp(voice_t *v, uint32_t numSamples)
1549+void centerMix16bRampNoLoopSIntrp(voice_t *v, uint32_t numSamples)
15501550 {
15511551 const int16_t *base, *smpPtr;
1552− float fSample, *fMixBufferL, *fMixBufferR;
1552+ double dSample, *dMixBufferL, *dMixBufferR;
15531553 int32_t pos;
1554− float fVolLDelta, fVolL;
1554+ double dVolLDelta, dVolL;
15551555 uint32_t i, samplesToMix, samplesLeft;
15561556 uint64_t posFrac;
15571557
@@ -1568,23 +1568,23 @@ void centerMix16bRampNoLoopCIntrp(voice_t *v, uint32_t numSamples) · 10 unmodified lines
15681568
15691569 for (i = 0; i < (samplesToMix & 3); i++)
15701570 {
1571− RENDER_16BIT_SMP_MONO_CINTRP
1571+ RENDER_16BIT_SMP_MONO_SINTRP
15721572 VOLUME_RAMPING_MONO
15731573 INC_POS
15741574 }
15751575 samplesToMix >>= 2;
15761576 for (i = 0; i < samplesToMix; i++)
15771577 {
1578− RENDER_16BIT_SMP_MONO_CINTRP
1578+ RENDER_16BIT_SMP_MONO_SINTRP
15791579 VOLUME_RAMPING_MONO
15801580 INC_POS
1581− RENDER_16BIT_SMP_MONO_CINTRP
1581+ RENDER_16BIT_SMP_MONO_SINTRP
15821582 VOLUME_RAMPING_MONO
15831583 INC_POS
1584− RENDER_16BIT_SMP_MONO_CINTRP
1584+ RENDER_16BIT_SMP_MONO_SINTRP
15851585 VOLUME_RAMPING_MONO
15861586 INC_POS
1587− RENDER_16BIT_SMP_MONO_CINTRP
1587+ RENDER_16BIT_SMP_MONO_SINTRP
15881588 VOLUME_RAMPING_MONO
15891589 INC_POS
15901590 }
@@ -1596,12 +1596,12 @@ void centerMix16bRampNoLoopCIntrp(voice_t *v, uint32_t numSamples) · 5 unmodified lines
15961596 SET_BACK_MIXER_POS
15971597 }
15981598
1599−void centerMix16bRampLoopCIntrp(voice_t *v, uint32_t numSamples)
1599+void centerMix16bRampLoopSIntrp(voice_t *v, uint32_t numSamples)
16001600 {
16011601 const int16_t *base, *smpPtr;
1602− float s0, s1, s2, s3, fSample, *fMixBufferL, *fMixBufferR;
1602+ double dSample, *dMixBufferL, *dMixBufferR;
16031603 int32_t pos;
1604− float fVolLDelta, fVolL;
1604+ double dVolLDelta, dVolL;
16051605 uint32_t i, samplesToMix, samplesLeft;
16061606 uint64_t posFrac;
16071607
@@ -1621,23 +1621,23 @@ void centerMix16bRampLoopCIntrp(voice_t *v, uint32_t numSamples) · 13 unmodified lines
16211621 {
16221622 for (i = 0; i < (samplesToMix & 3); i++)
16231623 {
1624− RENDER_16BIT_SMP_MONO_CINTRP_TAP_FIX
1624+ RENDER_16BIT_SMP_MONO_SINTRP_TAP_FIX
16251625 VOLUME_RAMPING_MONO
16261626 INC_POS
16271627 }
16281628 samplesToMix >>= 2;
16291629 for (i = 0; i < samplesToMix; i++)
16301630 {
1631− RENDER_16BIT_SMP_MONO_CINTRP_TAP_FIX
1631+ RENDER_16BIT_SMP_MONO_SINTRP_TAP_FIX
16321632 VOLUME_RAMPING_MONO
16331633 INC_POS
1634− RENDER_16BIT_SMP_MONO_CINTRP_TAP_FIX
1634+ RENDER_16BIT_SMP_MONO_SINTRP_TAP_FIX
16351635 VOLUME_RAMPING_MONO
16361636 INC_POS
1637− RENDER_16BIT_SMP_MONO_CINTRP_TAP_FIX
1637+ RENDER_16BIT_SMP_MONO_SINTRP_TAP_FIX
16381638 VOLUME_RAMPING_MONO
16391639 INC_POS
1640− RENDER_16BIT_SMP_MONO_CINTRP_TAP_FIX
1640+ RENDER_16BIT_SMP_MONO_SINTRP_TAP_FIX
16411641 VOLUME_RAMPING_MONO
16421642 INC_POS
16431643 }
@@ -1646,23 +1646,23 @@ void centerMix16bRampLoopCIntrp(voice_t *v, uint32_t numSamples) · 2 unmodified lines
16461646 {
16471647 for (i = 0; i < (samplesToMix & 3); i++)
16481648 {
1649− RENDER_16BIT_SMP_MONO_CINTRP
1649+ RENDER_16BIT_SMP_MONO_SINTRP
16501650 VOLUME_RAMPING_MONO
16511651 INC_POS
16521652 }
16531653 samplesToMix >>= 2;
16541654 for (i = 0; i < samplesToMix; i++)
16551655 {
1656− RENDER_16BIT_SMP_MONO_CINTRP
1656+ RENDER_16BIT_SMP_MONO_SINTRP
16571657 VOLUME_RAMPING_MONO
16581658 INC_POS
1659− RENDER_16BIT_SMP_MONO_CINTRP
1659+ RENDER_16BIT_SMP_MONO_SINTRP
16601660 VOLUME_RAMPING_MONO
16611661 INC_POS
1662− RENDER_16BIT_SMP_MONO_CINTRP
1662+ RENDER_16BIT_SMP_MONO_SINTRP
16631663 VOLUME_RAMPING_MONO
16641664 INC_POS
1665− RENDER_16BIT_SMP_MONO_CINTRP
1665+ RENDER_16BIT_SMP_MONO_SINTRP
16661666 VOLUME_RAMPING_MONO
16671667 INC_POS
16681668 }
@@ -1675,12 +1675,12 @@ void centerMix16bRampLoopCIntrp(voice_t *v, uint32_t numSamples) · 6 unmodified lines
16751675 SET_BACK_MIXER_POS
16761676 }
16771677
1678−void centerMix16bRampBidiLoopCIntrp(voice_t *v, uint32_t numSamples)
1678+void centerMix16bRampBidiLoopSIntrp(voice_t *v, uint32_t numSamples)
16791679 {
16801680 const int16_t *base, *revBase, *smpPtr;
1681− float s0, s1, s2, s3, fSample, *fMixBufferL, *fMixBufferR;
1681+ double dSample, *dMixBufferL, *dMixBufferR;
16821682 int32_t pos;
1683− float fVolLDelta, fVolL;
1683+ double dVolLDelta, dVolL;
16841684 uint32_t i, samplesToMix, samplesLeft;
16851685 uint64_t posFrac, tmpDelta;
16861686
@@ -1701,23 +1701,23 @@ void centerMix16bRampBidiLoopCIntrp(voice_t *v, uint32_t numSamples) · 14 unmodified lines
17011701 {
17021702 for (i = 0; i < (samplesToMix & 3); i++)
17031703 {
1704− RENDER_16BIT_SMP_MONO_CINTRP_TAP_FIX
1704+ RENDER_16BIT_SMP_MONO_SINTRP_TAP_FIX
17051705 VOLUME_RAMPING_MONO
17061706 INC_POS_BIDI
17071707 }
17081708 samplesToMix >>= 2;
17091709 for (i = 0; i < samplesToMix; i++)
17101710 {
1711− RENDER_16BIT_SMP_MONO_CINTRP_TAP_FIX
1711+ RENDER_16BIT_SMP_MONO_SINTRP_TAP_FIX
17121712 VOLUME_RAMPING_MONO
17131713 INC_POS_BIDI
1714− RENDER_16BIT_SMP_MONO_CINTRP_TAP_FIX
1714+ RENDER_16BIT_SMP_MONO_SINTRP_TAP_FIX
17151715 VOLUME_RAMPING_MONO
17161716 INC_POS_BIDI
1717− RENDER_16BIT_SMP_MONO_CINTRP_TAP_FIX
1717+ RENDER_16BIT_SMP_MONO_SINTRP_TAP_FIX
17181718 VOLUME_RAMPING_MONO
17191719 INC_POS_BIDI
1720− RENDER_16BIT_SMP_MONO_CINTRP_TAP_FIX
1720+ RENDER_16BIT_SMP_MONO_SINTRP_TAP_FIX
17211721 VOLUME_RAMPING_MONO
17221722 INC_POS_BIDI
17231723 }
@@ -1726,23 +1726,23 @@ void centerMix16bRampBidiLoopCIntrp(voice_t *v, uint32_t numSamples) · 2 unmodified lines
17261726 {
17271727 for (i = 0; i < (samplesToMix & 3); i++)
17281728 {
1729− RENDER_16BIT_SMP_MONO_CINTRP
1729+ RENDER_16BIT_SMP_MONO_SINTRP
17301730 VOLUME_RAMPING_MONO
17311731 INC_POS_BIDI
17321732 }
17331733 samplesToMix >>= 2;
17341734 for (i = 0; i < samplesToMix; i++)
17351735 {
1736− RENDER_16BIT_SMP_MONO_CINTRP
1736+ RENDER_16BIT_SMP_MONO_SINTRP
17371737 VOLUME_RAMPING_MONO
17381738 INC_POS_BIDI
1739− RENDER_16BIT_SMP_MONO_CINTRP
1739+ RENDER_16BIT_SMP_MONO_SINTRP
17401740 VOLUME_RAMPING_MONO
17411741 INC_POS_BIDI
1742− RENDER_16BIT_SMP_MONO_CINTRP
1742+ RENDER_16BIT_SMP_MONO_SINTRP
17431743 VOLUME_RAMPING_MONO
17441744 INC_POS_BIDI
1745− RENDER_16BIT_SMP_MONO_CINTRP
1745+ RENDER_16BIT_SMP_MONO_SINTRP
17461746 VOLUME_RAMPING_MONO
17471747 INC_POS_BIDI
17481748 }
@@ -1759,9 +1759,9 @@ void centerMix16bRampBidiLoopCIntrp(voice_t *v, uint32_t numSamples) · 10 unmodified lines
17591759 void centerMix16bRampNoLoopLIntrp(voice_t *v, uint32_t numSamples)
17601760 {
17611761 const int16_t *base, *smpPtr;
1762− float fSample, *fMixBufferL, *fMixBufferR;
1762+ double dSample, *dMixBufferL, *dMixBufferR;
17631763 int32_t pos;
1764− float fVolLDelta, fVolL;
1764+ double dVolLDelta, dVolL;
17651765 uint32_t i, samplesToMix, samplesLeft;
17661766 uint64_t posFrac;
17671767
@@ -1809,9 +1809,9 @@ void centerMix16bRampNoLoopLIntrp(voice_t *v, uint32_t numSamples) · 41 unmodified lines
18091809 void centerMix16bRampLoopLIntrp(voice_t *v, uint32_t numSamples)
18101810 {
18111811 const int16_t *base, *smpPtr;
1812− float fSample, *fMixBufferL, *fMixBufferR;
1812+ double dSample, *dMixBufferL, *dMixBufferR;
18131813 int32_t pos;
1814− float fVolLDelta, fVolL;
1814+ double dVolLDelta, dVolL;
18151815 uint32_t i, samplesToMix, samplesLeft;
18161816 uint64_t posFrac;
18171817
@@ -1859,9 +1859,9 @@ void centerMix16bRampLoopLIntrp(voice_t *v, uint32_t numSamples) · 41 unmodified lines
18591859 void centerMix16bRampBidiLoopLIntrp(voice_t *v, uint32_t numSamples)
18601860 {
18611861 const int16_t *base, *revBase, *smpPtr;
1862− float fSample, *fMixBufferL, *fMixBufferR;
1862+ double dSample, *dMixBufferL, *dMixBufferR;
18631863 int32_t pos;
1864− float fVolLDelta, fVolL;
1864+ double dVolLDelta, dVolL;
18651865 uint32_t i, samplesToMix, samplesLeft;
18661866 uint64_t posFrac, tmpDelta;
18671867
src/mixer/ft2_center_mix.h+12−12
@@ -9,9 +9,9 @@ · 8 unmodified lines
99 void centerMix8bNoLoop(voice_t *v, uint32_t numSamples);
1010 void centerMix8bLoop(voice_t *v, uint32_t numSamples);
1111 void centerMix8bBidiLoop(voice_t *v, uint32_t numSamples);
12−void centerMix8bNoLoopCIntrp(voice_t *v, uint32_t numSamples);
13−void centerMix8bLoopCIntrp(voice_t *v, uint32_t numSamples);
14−void centerMix8bBidiLoopCIntrp(voice_t *v, uint32_t numSamples);
12+void centerMix8bNoLoopSIntrp(voice_t *v, uint32_t numSamples);
13+void centerMix8bLoopSIntrp(voice_t *v, uint32_t numSamples);
14+void centerMix8bBidiLoopSIntrp(voice_t *v, uint32_t numSamples);
1515 void centerMix8bNoLoopLIntrp(voice_t *v, uint32_t numSamples);
1616 void centerMix8bLoopLIntrp(voice_t *v, uint32_t numSamples);
1717 void centerMix8bBidiLoopLIntrp(voice_t *v, uint32_t numSamples);
@@ -20,9 +20,9 @@ void centerMix8bBidiLoopLIntrp(voice_t *v, uint32_t numSamples); · 2 unmodified lines
2020 void centerMix16bNoLoop(voice_t *v, uint32_t numSamples);
2121 void centerMix16bLoop(voice_t *v, uint32_t numSamples);
2222 void centerMix16bBidiLoop(voice_t *v, uint32_t numSamples);
23−void centerMix16bNoLoopCIntrp(voice_t *v, uint32_t numSamples);
24−void centerMix16bLoopCIntrp(voice_t *v, uint32_t numSamples);
25−void centerMix16bBidiLoopCIntrp(voice_t *v, uint32_t numSamples);
23+void centerMix16bNoLoopSIntrp(voice_t *v, uint32_t numSamples);
24+void centerMix16bLoopSIntrp(voice_t *v, uint32_t numSamples);
25+void centerMix16bBidiLoopSIntrp(voice_t *v, uint32_t numSamples);
2626 void centerMix16bNoLoopLIntrp(voice_t *v, uint32_t numSamples);
2727 void centerMix16bLoopLIntrp(voice_t *v, uint32_t numSamples);
2828 void centerMix16bBidiLoopLIntrp(voice_t *v, uint32_t numSamples);
@@ -33,9 +33,9 @@ void centerMix16bBidiLoopLIntrp(voice_t *v, uint32_t numSamples); · 4 unmodified lines
3333 void centerMix8bRampNoLoop(voice_t *v, uint32_t numSamples);
3434 void centerMix8bRampLoop(voice_t *v, uint32_t numSamples);
3535 void centerMix8bRampBidiLoop(voice_t *v, uint32_t numSamples);
36−void centerMix8bRampNoLoopCIntrp(voice_t *v, uint32_t numSamples);
37−void centerMix8bRampLoopCIntrp(voice_t *v, uint32_t numSamples);
38−void centerMix8bRampBidiLoopCIntrp(voice_t *v, uint32_t numSamples);
36+void centerMix8bRampNoLoopSIntrp(voice_t *v, uint32_t numSamples);
37+void centerMix8bRampLoopSIntrp(voice_t *v, uint32_t numSamples);
38+void centerMix8bRampBidiLoopSIntrp(voice_t *v, uint32_t numSamples);
3939 void centerMix8bRampNoLoopLIntrp(voice_t *v, uint32_t numSamples);
4040 void centerMix8bRampLoopLIntrp(voice_t *v, uint32_t numSamples);
4141 void centerMix8bRampBidiLoopLIntrp(voice_t *v, uint32_t numSamples);
@@ -44,9 +44,9 @@ void centerMix8bRampBidiLoopLIntrp(voice_t *v, uint32_t numSamples); · 2 unmodified lines
4444 void centerMix16bRampNoLoop(voice_t *v, uint32_t numSamples);
4545 void centerMix16bRampLoop(voice_t *v, uint32_t numSamples);
4646 void centerMix16bRampBidiLoop(voice_t *v, uint32_t numSamples);
47−void centerMix16bRampNoLoopCIntrp(voice_t *v, uint32_t numSamples);
48−void centerMix16bRampLoopCIntrp(voice_t *v, uint32_t numSamples);
49−void centerMix16bRampBidiLoopCIntrp(voice_t *v, uint32_t numSamples);
47+void centerMix16bRampNoLoopSIntrp(voice_t *v, uint32_t numSamples);
48+void centerMix16bRampLoopSIntrp(voice_t *v, uint32_t numSamples);
49+void centerMix16bRampBidiLoopSIntrp(voice_t *v, uint32_t numSamples);
5050 void centerMix16bRampNoLoopLIntrp(voice_t *v, uint32_t numSamples);
5151 void centerMix16bRampLoopLIntrp(voice_t *v, uint32_t numSamples);
5252 void centerMix16bRampBidiLoopLIntrp(voice_t *v, uint32_t numSamples);
src/mixer/ft2_cubicspline.c+0−59
@@ -1,59 +0,0 @@
1−#include <stdint.h>
2−#include <stdbool.h>
3−#include <stdlib.h>
4−#include "ft2_cubicspline.h"
5−
6−float *fCubicSplineLUT8 = NULL;
7−float *fCubicSplineLUT16 = NULL;
8−
9−/* 4-tap cubic spline interpolation (Horner's method)
10−**
11−** This simplified LUT formula has been used in several trackers, but
12−** I think it originates from ModPlug Tracker (not sure about this).
13−*/
14−
15−static void calcCubicLUT(float *fLUTPtr, const double dSale)
16−{
17− for (int32_t i = 0; i < CUBIC_PHASES; i++)
18− {
19− const double x = i * (1.0 / CUBIC_PHASES);
20− const double x2 = x * x; // x^2
21− const double x3 = x2 * x; // x^3
22−
23− *fLUTPtr++ = (float)((-0.5 * x3 + 1.0 * x2 - 0.5 * x) * dSale);
24− *fLUTPtr++ = (float)(( 1.5 * x3 - 2.5 * x2 + 1.0) * dSale);
25− *fLUTPtr++ = (float)((-1.5 * x3 + 2.0 * x2 + 0.5 * x) * dSale);
26− *fLUTPtr++ = (float)(( 0.5 * x3 - 0.5 * x2) * dSale);
27− }
28−}
29−
30−bool calcCubicTable(void)
31−{
32− fCubicSplineLUT8 = (float *)malloc(CUBIC_LUT_LEN * sizeof (float));
33− if (fCubicSplineLUT8 == NULL)
34− return false;
35−
36− fCubicSplineLUT16 = (float *)malloc(CUBIC_LUT_LEN * sizeof (float));
37− if (fCubicSplineLUT16 == NULL)
38− return false;
39−
40− calcCubicLUT(fCubicSplineLUT8, 1.0 / 128.0); // for 8-bit samples
41− calcCubicLUT(fCubicSplineLUT16, 1.0 / 32768.0); // for 16-bit samples
42−
43− return true;
44−}
45−
46−void freeCubicTable(void)
47−{
48− if (fCubicSplineLUT8 != NULL)
49− {
50− free(fCubicSplineLUT8);
51− fCubicSplineLUT8 = NULL;
52− }
53−
54− if (fCubicSplineLUT16 != NULL)
55− {
56− free(fCubicSplineLUT16);
57− fCubicSplineLUT16 = NULL;
58− }
59−}
src/mixer/ft2_cubicspline.h+0−22
@@ -1,22 +0,0 @@
1−#pragma once
2−
3−#include <stdbool.h>
4−#include "../ft2_audio.h" // MIXER_FRAC_BITS definition
5−
6−// if you change this, also change CUBIC_PHASES_BITS
7−#define CUBIC_PHASES 4096
8−#define CUBIC_PHASES_BITS 12 /* log2(CUBIC_PHASES) */
9−
10−// don't change these!
11−
12−#define CUBIC_WIDTH 4
13−#define CUBIC_WIDTH_BITS 2
14−#define CUBIC_LUT_LEN (CUBIC_WIDTH * CUBIC_PHASES)
15−#define CUBIC_FSHIFT (MIXER_FRAC_BITS-(CUBIC_PHASES_BITS+CUBIC_WIDTH_BITS))
16−#define CUBIC_FMASK ((CUBIC_WIDTH*CUBIC_PHASES)-CUBIC_WIDTH)
17−
18−extern float *fCubicSplineLUT8;
19−extern float *fCubicSplineLUT16;
20−
21−bool calcCubicTable(void);
22−void freeCubicTable(void);
src/mixer/ft2_mix.c+194−194
@@ -5,17 +5,17 @@ · 4 unmodified lines
55 #include "ft2_center_mix.h"
66
77 /*
8−** -------------------- floating point audio channel mixer ---------------------
8+** -------------------- doubleing point audio channel mixer ---------------------
99 ** (Note: Mixing macros can be found in ft2_mix_macros.h)
1010 **
1111 ** Specifications:
12−** - Either no interpolation, 2-tap linear interpolation (FT2) or 4-tap cubic interpolation
12+** - Either no interpolation, 2-tap linear interpolation (FT2) or 8-tap windowed-sinc interpolation
1313 ** - Linear volume ramping, matching FT2 (can be turned off)
1414 ** - 32.32 fixed-point logic for resampling delta
15−** - 32-bit single-precision float logic for mixing and interpolation
15+** - 64-bit doube-precision logic for mixing and interpolation
1616 **
1717 ** This file has separate routines for EVERY possible sampling variation:
18−** Interpolation none/cubic/linear, volumeramp on/off, 8-bit, 16-bit, no loop, loop, bidi.
18+** Interpolation none/sinc/linear, volumeramp on/off, 8-bit, 16-bit, no loop, loop, bidi.
1919 ** (36 mixing routines in total + another 36 for center-mixing)
2020 **
2121 ** Every voice has a function pointer set to the according mixing routine on
@@ -34,7 +34,7 @@ · 12 unmodified lines
3434 static void mix8bNoLoop(voice_t *v, uint32_t numSamples)
3535 {
3636 const int8_t *base, *smpPtr;
37− float fSample, *fMixBufferL, *fMixBufferR;
37+ double dSample, *dMixBufferL, *dMixBufferR;
3838 int32_t pos;
3939 uint32_t i, samplesToMix, samplesLeft;
4040 uint64_t posFrac;
@@ -76,7 +76,7 @@ static void mix8bNoLoop(voice_t *v, uint32_t numSamples) · 35 unmodified lines
7676 static void mix8bLoop(voice_t *v, uint32_t numSamples)
7777 {
7878 const int8_t *base, *smpPtr;
79− float fSample, *fMixBufferL, *fMixBufferR;
79+ double dSample, *dMixBufferL, *dMixBufferR;
8080 int32_t pos;
8181 uint32_t i, samplesToMix, samplesLeft;
8282 uint64_t posFrac;
@@ -118,7 +118,7 @@ static void mix8bLoop(voice_t *v, uint32_t numSamples) · 35 unmodified lines
118118 static void mix8bBidiLoop(voice_t *v, uint32_t numSamples)
119119 {
120120 const int8_t *base, *revBase, *smpPtr;
121− float fSample, *fMixBufferL, *fMixBufferR;
121+ double dSample, *dMixBufferL, *dMixBufferR;
122122 int32_t pos;
123123 uint32_t i, samplesToMix, samplesLeft;
124124 uint64_t posFrac, tmpDelta;
@@ -158,10 +158,10 @@ static void mix8bBidiLoop(voice_t *v, uint32_t numSamples) · 33 unmodified lines
158158 SET_BACK_MIXER_POS
159159 }
160160
161−static void mix8bNoLoopCIntrp(voice_t *v, uint32_t numSamples)
161+static void mix8bNoLoopSIntrp(voice_t *v, uint32_t numSamples)
162162 {
163163 const int8_t *base, *smpPtr;
164− float fSample, *fMixBufferL, *fMixBufferR;
164+ double dSample, *dMixBufferL, *dMixBufferR;
165165 int32_t pos;
166166 uint32_t i, samplesToMix, samplesLeft;
167167 uint64_t posFrac;
@@ -178,19 +178,19 @@ static void mix8bNoLoopCIntrp(voice_t *v, uint32_t numSamples) · 10 unmodified lines
178178
179179 for (i = 0; i < (samplesToMix & 3); i++)
180180 {
181− RENDER_8BIT_SMP_CINTRP
181+ RENDER_8BIT_SMP_SINTRP
182182 INC_POS
183183 }
184184 samplesToMix >>= 2;
185185 for (i = 0; i < samplesToMix; i++)
186186 {
187− RENDER_8BIT_SMP_CINTRP
187+ RENDER_8BIT_SMP_SINTRP
188188 INC_POS
189− RENDER_8BIT_SMP_CINTRP
189+ RENDER_8BIT_SMP_SINTRP
190190 INC_POS
191− RENDER_8BIT_SMP_CINTRP
191+ RENDER_8BIT_SMP_SINTRP
192192 INC_POS
193− RENDER_8BIT_SMP_CINTRP
193+ RENDER_8BIT_SMP_SINTRP
194194 INC_POS
195195 }
196196
@@ -200,10 +200,10 @@ static void mix8bNoLoopCIntrp(voice_t *v, uint32_t numSamples) · 3 unmodified lines
200200 SET_BACK_MIXER_POS
201201 }
202202
203−static void mix8bLoopCIntrp(voice_t *v, uint32_t numSamples)
203+static void mix8bLoopSIntrp(voice_t *v, uint32_t numSamples)
204204 {
205205 const int8_t *base, *smpPtr;
206− float s0, s1, s2, s3, fSample, *fMixBufferL, *fMixBufferR;
206+ double dSample, *dMixBufferL, *dMixBufferR;
207207 int32_t pos;
208208 uint32_t i, samplesToMix, samplesLeft;
209209 uint64_t posFrac;
@@ -223,19 +223,19 @@ static void mix8bLoopCIntrp(voice_t *v, uint32_t numSamples) · 13 unmodified lines
223223 {
224224 for (i = 0; i < (samplesToMix & 3); i++)
225225 {
226− RENDER_8BIT_SMP_CINTRP_TAP_FIX
226+ RENDER_8BIT_SMP_SINTRP_TAP_FIX
227227 INC_POS
228228 }
229229 samplesToMix >>= 2;
230230 for (i = 0; i < samplesToMix; i++)
231231 {
232− RENDER_8BIT_SMP_CINTRP_TAP_FIX
232+ RENDER_8BIT_SMP_SINTRP_TAP_FIX
233233 INC_POS
234− RENDER_8BIT_SMP_CINTRP_TAP_FIX
234+ RENDER_8BIT_SMP_SINTRP_TAP_FIX
235235 INC_POS
236− RENDER_8BIT_SMP_CINTRP_TAP_FIX
236+ RENDER_8BIT_SMP_SINTRP_TAP_FIX
237237 INC_POS
238− RENDER_8BIT_SMP_CINTRP_TAP_FIX
238+ RENDER_8BIT_SMP_SINTRP_TAP_FIX
239239 INC_POS
240240 }
241241 }
@@ -243,19 +243,19 @@ static void mix8bLoopCIntrp(voice_t *v, uint32_t numSamples) · 1 unmodified line
243243 {
244244 for (i = 0; i < (samplesToMix & 3); i++)
245245 {
246− RENDER_8BIT_SMP_CINTRP
246+ RENDER_8BIT_SMP_SINTRP
247247 INC_POS
248248 }
249249 samplesToMix >>= 2;
250250 for (i = 0; i < samplesToMix; i++)
251251 {
252− RENDER_8BIT_SMP_CINTRP
252+ RENDER_8BIT_SMP_SINTRP
253253 INC_POS
254− RENDER_8BIT_SMP_CINTRP
254+ RENDER_8BIT_SMP_SINTRP
255255 INC_POS
256− RENDER_8BIT_SMP_CINTRP
256+ RENDER_8BIT_SMP_SINTRP
257257 INC_POS
258− RENDER_8BIT_SMP_CINTRP
258+ RENDER_8BIT_SMP_SINTRP
259259 INC_POS
260260 }
261261 }
@@ -266,10 +266,10 @@ static void mix8bLoopCIntrp(voice_t *v, uint32_t numSamples) · 4 unmodified lines
266266 SET_BACK_MIXER_POS
267267 }
268268
269−static void mix8bBidiLoopCIntrp(voice_t *v, uint32_t numSamples)
269+static void mix8bBidiLoopSIntrp(voice_t *v, uint32_t numSamples)
270270 {
271271 const int8_t *base, *revBase, *smpPtr;
272− float s0, s1, s2, s3, fSample, *fMixBufferL, *fMixBufferR;
272+ double dSample, *dMixBufferL, *dMixBufferR;
273273 int32_t pos;
274274 uint32_t i, samplesToMix, samplesLeft;
275275 uint64_t posFrac, tmpDelta;
@@ -290,19 +290,19 @@ static void mix8bBidiLoopCIntrp(voice_t *v, uint32_t numSamples) · 14 unmodified lines
290290 {
291291 for (i = 0; i < (samplesToMix & 3); i++)
292292 {
293− RENDER_8BIT_SMP_CINTRP_TAP_FIX
293+ RENDER_8BIT_SMP_SINTRP_TAP_FIX
294294 INC_POS_BIDI
295295 }
296296 samplesToMix >>= 2;
297297 for (i = 0; i < samplesToMix; i++)
298298 {
299− RENDER_8BIT_SMP_CINTRP_TAP_FIX
299+ RENDER_8BIT_SMP_SINTRP_TAP_FIX
300300 INC_POS_BIDI
301− RENDER_8BIT_SMP_CINTRP_TAP_FIX
301+ RENDER_8BIT_SMP_SINTRP_TAP_FIX
302302 INC_POS_BIDI
303− RENDER_8BIT_SMP_CINTRP_TAP_FIX
303+ RENDER_8BIT_SMP_SINTRP_TAP_FIX
304304 INC_POS_BIDI
305− RENDER_8BIT_SMP_CINTRP_TAP_FIX
305+ RENDER_8BIT_SMP_SINTRP_TAP_FIX
306306 INC_POS_BIDI
307307 }
308308 }
@@ -310,19 +310,19 @@ static void mix8bBidiLoopCIntrp(voice_t *v, uint32_t numSamples) · 1 unmodified line
310310 {
311311 for (i = 0; i < (samplesToMix & 3); i++)
312312 {
313− RENDER_8BIT_SMP_CINTRP
313+ RENDER_8BIT_SMP_SINTRP
314314 INC_POS_BIDI
315315 }
316316 samplesToMix >>= 2;
317317 for (i = 0; i < samplesToMix; i++)
318318 {
319− RENDER_8BIT_SMP_CINTRP
319+ RENDER_8BIT_SMP_SINTRP
320320 INC_POS_BIDI
321− RENDER_8BIT_SMP_CINTRP
321+ RENDER_8BIT_SMP_SINTRP
322322 INC_POS_BIDI
323− RENDER_8BIT_SMP_CINTRP
323+ RENDER_8BIT_SMP_SINTRP
324324 INC_POS_BIDI
325− RENDER_8BIT_SMP_CINTRP
325+ RENDER_8BIT_SMP_SINTRP
326326 INC_POS_BIDI
327327 }
328328 }
@@ -337,7 +337,7 @@ static void mix8bBidiLoopCIntrp(voice_t *v, uint32_t numSamples) · 8 unmodified lines
337337 static void mix8bNoLoopLIntrp(voice_t *v, uint32_t numSamples)
338338 {
339339 const int8_t *base, *smpPtr;
340− float fSample, *fMixBufferL, *fMixBufferR;
340+ double dSample, *dMixBufferL, *dMixBufferR;
341341 int32_t pos;
342342 uint32_t i, samplesToMix, samplesLeft;
343343 uint64_t posFrac;
@@ -379,7 +379,7 @@ static void mix8bNoLoopLIntrp(voice_t *v, uint32_t numSamples) · 35 unmodified lines
379379 static void mix8bLoopLIntrp(voice_t *v, uint32_t numSamples)
380380 {
381381 const int8_t *base, *smpPtr;
382− float fSample, *fMixBufferL, *fMixBufferR;
382+ double dSample, *dMixBufferL, *dMixBufferR;
383383 int32_t pos;
384384 uint32_t i, samplesToMix, samplesLeft;
385385 uint64_t posFrac;
@@ -421,7 +421,7 @@ static void mix8bLoopLIntrp(voice_t *v, uint32_t numSamples) · 35 unmodified lines
421421 static void mix8bBidiLoopLIntrp(voice_t *v, uint32_t numSamples)
422422 {
423423 const int8_t *base, *revBase, *smpPtr;
424− float fSample, *fMixBufferL, *fMixBufferR;
424+ double dSample, *dMixBufferL, *dMixBufferR;
425425 int32_t pos;
426426 uint32_t i, samplesToMix, samplesLeft;
427427 uint64_t posFrac, tmpDelta;
@@ -465,9 +465,9 @@ static void mix8bBidiLoopLIntrp(voice_t *v, uint32_t numSamples) · 37 unmodified lines
465465 static void mix8bRampNoLoop(voice_t *v, uint32_t numSamples)
466466 {
467467 const int8_t *base, *smpPtr;
468− float fSample, *fMixBufferL, *fMixBufferR;
468+ double dSample, *dMixBufferL, *dMixBufferR;
469469 int32_t pos;
470− float fVolLDelta, fVolRDelta, fVolL, fVolR;
470+ double dVolLDelta, dVolRDelta, dVolL, dVolR;
471471 uint32_t i, samplesToMix, samplesLeft;
472472 uint64_t posFrac;
473473
@@ -515,9 +515,9 @@ static void mix8bRampNoLoop(voice_t *v, uint32_t numSamples) · 41 unmodified lines
515515 static void mix8bRampLoop(voice_t *v, uint32_t numSamples)
516516 {
517517 const int8_t *base, *smpPtr;
518− float fSample, *fMixBufferL, *fMixBufferR;
518+ double dSample, *dMixBufferL, *dMixBufferR;
519519 int32_t pos;
520− float fVolLDelta, fVolRDelta, fVolL, fVolR;
520+ double dVolLDelta, dVolRDelta, dVolL, dVolR;
521521 uint32_t i, samplesToMix, samplesLeft;
522522 uint64_t posFrac;
523523
@@ -565,9 +565,9 @@ static void mix8bRampLoop(voice_t *v, uint32_t numSamples) · 41 unmodified lines
565565 static void mix8bRampBidiLoop(voice_t *v, uint32_t numSamples)
566566 {
567567 const int8_t *base, *revBase, *smpPtr;
568− float fSample, *fMixBufferL, *fMixBufferR;
568+ double dSample, *dMixBufferL, *dMixBufferR;
569569 int32_t pos;
570− float fVolLDelta, fVolRDelta, fVolL, fVolR;
570+ double dVolLDelta, dVolRDelta, dVolL, dVolR;
571571 uint32_t i, samplesToMix, samplesLeft;
572572 uint64_t posFrac, tmpDelta;
573573
@@ -614,12 +614,12 @@ static void mix8bRampBidiLoop(voice_t *v, uint32_t numSamples) · 40 unmodified lines
614614 SET_BACK_MIXER_POS
615615 }
616616
617−static void mix8bRampNoLoopCIntrp(voice_t *v, uint32_t numSamples)
617+static void mix8bRampNoLoopSIntrp(voice_t *v, uint32_t numSamples)
618618 {
619619 const int8_t *base, *smpPtr;
620− float fSample, *fMixBufferL, *fMixBufferR;
620+ double dSample, *dMixBufferL, *dMixBufferR;
621621 int32_t pos;
622− float fVolLDelta, fVolRDelta, fVolL, fVolR;
622+ double dVolLDelta, dVolRDelta, dVolL, dVolR;
623623 uint32_t i, samplesToMix, samplesLeft;
624624 uint64_t posFrac;
625625
@@ -636,23 +636,23 @@ static void mix8bRampNoLoopCIntrp(voice_t *v, uint32_t numSamples) · 10 unmodified lines
636636
637637 for (i = 0; i < (samplesToMix & 3); i++)
638638 {
639− RENDER_8BIT_SMP_CINTRP
639+ RENDER_8BIT_SMP_SINTRP
640640 VOLUME_RAMPING
641641 INC_POS
642642 }
643643 samplesToMix >>= 2;
644644 for (i = 0; i < samplesToMix; i++)
645645 {
646− RENDER_8BIT_SMP_CINTRP
646+ RENDER_8BIT_SMP_SINTRP
647647 VOLUME_RAMPING
648648 INC_POS
649− RENDER_8BIT_SMP_CINTRP
649+ RENDER_8BIT_SMP_SINTRP
650650 VOLUME_RAMPING
651651 INC_POS
652− RENDER_8BIT_SMP_CINTRP
652+ RENDER_8BIT_SMP_SINTRP
653653 VOLUME_RAMPING
654654 INC_POS
655− RENDER_8BIT_SMP_CINTRP
655+ RENDER_8BIT_SMP_SINTRP
656656 VOLUME_RAMPING
657657 INC_POS
658658 }
@@ -664,12 +664,12 @@ static void mix8bRampNoLoopCIntrp(voice_t *v, uint32_t numSamples) · 5 unmodified lines
664664 SET_BACK_MIXER_POS
665665 }
666666
667−static void mix8bRampLoopCIntrp(voice_t *v, uint32_t numSamples)
667+static void mix8bRampLoopSIntrp(voice_t *v, uint32_t numSamples)
668668 {
669669 const int8_t *base, *smpPtr;
670− float s0, s1, s2, s3, fSample, *fMixBufferL, *fMixBufferR;
670+ double dSample, *dMixBufferL, *dMixBufferR;
671671 int32_t pos;
672− float fVolLDelta, fVolRDelta, fVolL, fVolR;
672+ double dVolLDelta, dVolRDelta, dVolL, dVolR;
673673 uint32_t i, samplesToMix, samplesLeft;
674674 uint64_t posFrac;
675675
@@ -689,23 +689,23 @@ static void mix8bRampLoopCIntrp(voice_t *v, uint32_t numSamples) · 13 unmodified lines
689689 {
690690 for (i = 0; i < (samplesToMix & 3); i++)
691691 {
692− RENDER_8BIT_SMP_CINTRP_TAP_FIX
692+ RENDER_8BIT_SMP_SINTRP_TAP_FIX
693693 VOLUME_RAMPING
694694 INC_POS
695695 }
696696 samplesToMix >>= 2;
697697 for (i = 0; i < samplesToMix; i++)
698698 {
699− RENDER_8BIT_SMP_CINTRP_TAP_FIX
699+ RENDER_8BIT_SMP_SINTRP_TAP_FIX
700700 VOLUME_RAMPING
701701 INC_POS
702− RENDER_8BIT_SMP_CINTRP_TAP_FIX
702+ RENDER_8BIT_SMP_SINTRP_TAP_FIX
703703 VOLUME_RAMPING
704704 INC_POS
705− RENDER_8BIT_SMP_CINTRP_TAP_FIX
705+ RENDER_8BIT_SMP_SINTRP_TAP_FIX
706706 VOLUME_RAMPING
707707 INC_POS
708− RENDER_8BIT_SMP_CINTRP_TAP_FIX
708+ RENDER_8BIT_SMP_SINTRP_TAP_FIX
709709 VOLUME_RAMPING
710710 INC_POS
711711 }
@@ -714,23 +714,23 @@ static void mix8bRampLoopCIntrp(voice_t *v, uint32_t numSamples) · 2 unmodified lines
714714 {
715715 for (i = 0; i < (samplesToMix & 3); i++)
716716 {
717− RENDER_8BIT_SMP_CINTRP
717+ RENDER_8BIT_SMP_SINTRP
718718 VOLUME_RAMPING
719719 INC_POS
720720 }
721721 samplesToMix >>= 2;
722722 for (i = 0; i < samplesToMix; i++)
723723 {
724− RENDER_8BIT_SMP_CINTRP
724+ RENDER_8BIT_SMP_SINTRP
725725 VOLUME_RAMPING
726726 INC_POS
727− RENDER_8BIT_SMP_CINTRP
727+ RENDER_8BIT_SMP_SINTRP
728728 VOLUME_RAMPING
729729 INC_POS
730− RENDER_8BIT_SMP_CINTRP
730+ RENDER_8BIT_SMP_SINTRP
731731 VOLUME_RAMPING
732732 INC_POS
733− RENDER_8BIT_SMP_CINTRP
733+ RENDER_8BIT_SMP_SINTRP
734734 VOLUME_RAMPING
735735 INC_POS
736736 }
@@ -743,12 +743,12 @@ static void mix8bRampLoopCIntrp(voice_t *v, uint32_t numSamples) · 6 unmodified lines
743743 SET_BACK_MIXER_POS
744744 }
745745
746−static void mix8bRampBidiLoopCIntrp(voice_t *v, uint32_t numSamples)
746+static void mix8bRampBidiLoopSIntrp(voice_t *v, uint32_t numSamples)
747747 {
748748 const int8_t *base, *revBase, *smpPtr;
749− float s0, s1, s2, s3, fSample, *fMixBufferL, *fMixBufferR;
749+ double dSample, *dMixBufferL, *dMixBufferR;
750750 int32_t pos;
751− float fVolLDelta, fVolRDelta, fVolL, fVolR;
751+ double dVolLDelta, dVolRDelta, dVolL, dVolR;
752752 uint32_t i, samplesToMix, samplesLeft;
753753 uint64_t posFrac, tmpDelta;
754754
@@ -769,23 +769,23 @@ static void mix8bRampBidiLoopCIntrp(voice_t *v, uint32_t numSamples) · 14 unmodified lines
769769 {
770770 for (i = 0; i < (samplesToMix & 3); i++)
771771 {
772− RENDER_8BIT_SMP_CINTRP_TAP_FIX
772+ RENDER_8BIT_SMP_SINTRP_TAP_FIX
773773 VOLUME_RAMPING
774774 INC_POS_BIDI
775775 }
776776 samplesToMix >>= 2;
777777 for (i = 0; i < samplesToMix; i++)
778778 {
779− RENDER_8BIT_SMP_CINTRP_TAP_FIX
779+ RENDER_8BIT_SMP_SINTRP_TAP_FIX
780780 VOLUME_RAMPING
781781 INC_POS_BIDI
782− RENDER_8BIT_SMP_CINTRP_TAP_FIX
782+ RENDER_8BIT_SMP_SINTRP_TAP_FIX
783783 VOLUME_RAMPING
784784 INC_POS_BIDI
785− RENDER_8BIT_SMP_CINTRP_TAP_FIX
785+ RENDER_8BIT_SMP_SINTRP_TAP_FIX
786786 VOLUME_RAMPING
787787 INC_POS_BIDI
788− RENDER_8BIT_SMP_CINTRP_TAP_FIX
788+ RENDER_8BIT_SMP_SINTRP_TAP_FIX
789789 VOLUME_RAMPING
790790 INC_POS_BIDI
791791 }
@@ -794,23 +794,23 @@ static void mix8bRampBidiLoopCIntrp(voice_t *v, uint32_t numSamples) · 2 unmodified lines
794794 {
795795 for (i = 0; i < (samplesToMix & 3); i++)
796796 {
797− RENDER_8BIT_SMP_CINTRP
797+ RENDER_8BIT_SMP_SINTRP
798798 VOLUME_RAMPING
799799 INC_POS_BIDI
800800 }
801801 samplesToMix >>= 2;
802802 for (i = 0; i < samplesToMix; i++)
803803 {
804− RENDER_8BIT_SMP_CINTRP
804+ RENDER_8BIT_SMP_SINTRP
805805 VOLUME_RAMPING
806806 INC_POS_BIDI
807− RENDER_8BIT_SMP_CINTRP
807+ RENDER_8BIT_SMP_SINTRP
808808 VOLUME_RAMPING
809809 INC_POS_BIDI
810− RENDER_8BIT_SMP_CINTRP
810+ RENDER_8BIT_SMP_SINTRP
811811 VOLUME_RAMPING
812812 INC_POS_BIDI
813− RENDER_8BIT_SMP_CINTRP
813+ RENDER_8BIT_SMP_SINTRP
814814 VOLUME_RAMPING
815815 INC_POS_BIDI
816816 }
@@ -827,9 +827,9 @@ static void mix8bRampBidiLoopCIntrp(voice_t *v, uint32_t numSamples) · 10 unmodified lines
827827 static void mix8bRampNoLoopLIntrp(voice_t *v, uint32_t numSamples)
828828 {
829829 const int8_t *base, *smpPtr;
830− float fSample, *fMixBufferL, *fMixBufferR;
830+ double dSample, *dMixBufferL, *dMixBufferR;
831831 int32_t pos;
832− float fVolLDelta, fVolRDelta, fVolL, fVolR;
832+ double dVolLDelta, dVolRDelta, dVolL, dVolR;
833833 uint32_t i, samplesToMix, samplesLeft;
834834 uint64_t posFrac;
835835
@@ -877,9 +877,9 @@ static void mix8bRampNoLoopLIntrp(voice_t *v, uint32_t numSamples) · 41 unmodified lines
877877 static void mix8bRampLoopLIntrp(voice_t *v, uint32_t numSamples)
878878 {
879879 const int8_t *base, *smpPtr;
880− float fSample, *fMixBufferL, *fMixBufferR;
880+ double dSample, *dMixBufferL, *dMixBufferR;
881881 int32_t pos;
882− float fVolLDelta, fVolRDelta, fVolL, fVolR;
882+ double dVolLDelta, dVolRDelta, dVolL, dVolR;
883883 uint32_t i, samplesToMix, samplesLeft;
884884 uint64_t posFrac;
885885
@@ -927,9 +927,9 @@ static void mix8bRampLoopLIntrp(voice_t *v, uint32_t numSamples) · 41 unmodified lines
927927 static void mix8bRampBidiLoopLIntrp(voice_t *v, uint32_t numSamples)
928928 {
929929 const int8_t *base, *revBase, *smpPtr;
930− float fSample, *fMixBufferL, *fMixBufferR;
930+ double dSample, *dMixBufferL, *dMixBufferR;
931931 int32_t pos;
932− float fVolLDelta, fVolRDelta, fVolL, fVolR;
932+ double dVolLDelta, dVolRDelta, dVolL, dVolR;
933933 uint32_t i, samplesToMix, samplesLeft;
934934 uint64_t posFrac, tmpDelta;
935935
@@ -983,7 +983,7 @@ static void mix8bRampBidiLoopLIntrp(voice_t *v, uint32_t numSamples) · 47 unmodified lines
983983 static void mix16bNoLoop(voice_t *v, uint32_t numSamples)
984984 {
985985 const int16_t *base, *smpPtr;
986− float fSample, *fMixBufferL, *fMixBufferR;
986+ double dSample, *dMixBufferL, *dMixBufferR;
987987 int32_t pos;
988988 uint32_t i, samplesToMix, samplesLeft;
989989 uint64_t posFrac;
@@ -1025,7 +1025,7 @@ static void mix16bNoLoop(voice_t *v, uint32_t numSamples) · 35 unmodified lines
10251025 static void mix16bLoop(voice_t *v, uint32_t numSamples)
10261026 {
10271027 const int16_t *base, *smpPtr;
1028− float fSample, *fMixBufferL, *fMixBufferR;
1028+ double dSample, *dMixBufferL, *dMixBufferR;
10291029 int32_t pos;
10301030 uint32_t i, samplesToMix, samplesLeft;
10311031 uint64_t posFrac;
@@ -1067,7 +1067,7 @@ static void mix16bLoop(voice_t *v, uint32_t numSamples) · 35 unmodified lines
10671067 static void mix16bBidiLoop(voice_t *v, uint32_t numSamples)
10681068 {
10691069 const int16_t *base, *revBase, *smpPtr;
1070− float fSample, *fMixBufferL, *fMixBufferR;
1070+ double dSample, *dMixBufferL, *dMixBufferR;
10711071 int32_t pos;
10721072 uint32_t i, samplesToMix, samplesLeft;
10731073 uint64_t posFrac, tmpDelta;
@@ -1108,10 +1108,10 @@ static void mix16bBidiLoop(voice_t *v, uint32_t numSamples) · 34 unmodified lines
11081108 SET_BACK_MIXER_POS
11091109 }
11101110
1111−static void mix16bNoLoopCIntrp(voice_t *v, uint32_t numSamples)
1111+static void mix16bNoLoopSIntrp(voice_t *v, uint32_t numSamples)
11121112 {
11131113 const int16_t *base, *smpPtr;
1114− float fSample, *fMixBufferL, *fMixBufferR;
1114+ double dSample, *dMixBufferL, *dMixBufferR;
11151115 int32_t pos;
11161116 uint32_t i, samplesToMix, samplesLeft;
11171117 uint64_t posFrac;
@@ -1128,19 +1128,19 @@ static void mix16bNoLoopCIntrp(voice_t *v, uint32_t numSamples) · 10 unmodified lines
11281128
11291129 for (i = 0; i < (samplesToMix & 3); i++)
11301130 {
1131− RENDER_16BIT_SMP_CINTRP
1131+ RENDER_16BIT_SMP_SINTRP
11321132 INC_POS
11331133 }
11341134 samplesToMix >>= 2;
11351135 for (i = 0; i < samplesToMix; i++)
11361136 {
1137− RENDER_16BIT_SMP_CINTRP
1137+ RENDER_16BIT_SMP_SINTRP
11381138 INC_POS
1139− RENDER_16BIT_SMP_CINTRP
1139+ RENDER_16BIT_SMP_SINTRP
11401140 INC_POS
1141− RENDER_16BIT_SMP_CINTRP
1141+ RENDER_16BIT_SMP_SINTRP
11421142 INC_POS
1143− RENDER_16BIT_SMP_CINTRP
1143+ RENDER_16BIT_SMP_SINTRP
11441144 INC_POS
11451145 }
11461146
@@ -1150,10 +1150,10 @@ static void mix16bNoLoopCIntrp(voice_t *v, uint32_t numSamples) · 3 unmodified lines
11501150 SET_BACK_MIXER_POS
11511151 }
11521152
1153−static void mix16bLoopCIntrp(voice_t *v, uint32_t numSamples)
1153+static void mix16bLoopSIntrp(voice_t *v, uint32_t numSamples)
11541154 {
11551155 const int16_t *base, *smpPtr;
1156− float s0, s1, s2, s3, fSample, *fMixBufferL, *fMixBufferR;
1156+ double dSample, *dMixBufferL, *dMixBufferR;
11571157 int32_t pos;
11581158 uint32_t i, samplesToMix, samplesLeft;
11591159 uint64_t posFrac;
@@ -1173,19 +1173,19 @@ static void mix16bLoopCIntrp(voice_t *v, uint32_t numSamples) · 13 unmodified lines
11731173 {
11741174 for (i = 0; i < (samplesToMix & 3); i++)
11751175 {
1176− RENDER_16BIT_SMP_CINTRP_TAP_FIX
1176+ RENDER_16BIT_SMP_SINTRP_TAP_FIX
11771177 INC_POS
11781178 }
11791179 samplesToMix >>= 2;
11801180 for (i = 0; i < samplesToMix; i++)
11811181 {
1182− RENDER_16BIT_SMP_CINTRP_TAP_FIX
1182+ RENDER_16BIT_SMP_SINTRP_TAP_FIX
11831183 INC_POS
1184− RENDER_16BIT_SMP_CINTRP_TAP_FIX
1184+ RENDER_16BIT_SMP_SINTRP_TAP_FIX
11851185 INC_POS
1186− RENDER_16BIT_SMP_CINTRP_TAP_FIX
1186+ RENDER_16BIT_SMP_SINTRP_TAP_FIX
11871187 INC_POS
1188− RENDER_16BIT_SMP_CINTRP_TAP_FIX
1188+ RENDER_16BIT_SMP_SINTRP_TAP_FIX
11891189 INC_POS
11901190 }
11911191 }
@@ -1193,19 +1193,19 @@ static void mix16bLoopCIntrp(voice_t *v, uint32_t numSamples) · 1 unmodified line
11931193 {
11941194 for (i = 0; i < (samplesToMix & 3); i++)
11951195 {
1196− RENDER_16BIT_SMP_CINTRP
1196+ RENDER_16BIT_SMP_SINTRP
11971197 INC_POS
11981198 }
11991199 samplesToMix >>= 2;
12001200 for (i = 0; i < samplesToMix; i++)
12011201 {
1202− RENDER_16BIT_SMP_CINTRP
1202+ RENDER_16BIT_SMP_SINTRP
12031203 INC_POS
1204− RENDER_16BIT_SMP_CINTRP
1204+ RENDER_16BIT_SMP_SINTRP
12051205 INC_POS
1206− RENDER_16BIT_SMP_CINTRP
1206+ RENDER_16BIT_SMP_SINTRP
12071207 INC_POS
1208− RENDER_16BIT_SMP_CINTRP
1208+ RENDER_16BIT_SMP_SINTRP
12091209 INC_POS
12101210 }
12111211 }
@@ -1216,10 +1216,10 @@ static void mix16bLoopCIntrp(voice_t *v, uint32_t numSamples) · 4 unmodified lines
12161216 SET_BACK_MIXER_POS
12171217 }
12181218
1219−static void mix16bBidiLoopCIntrp(voice_t *v, uint32_t numSamples)
1219+static void mix16bBidiLoopSIntrp(voice_t *v, uint32_t numSamples)
12201220 {
12211221 const int16_t *base, *revBase, *smpPtr;
1222− float s0, s1, s2, s3, fSample, *fMixBufferL, *fMixBufferR;
1222+ double dSample, *dMixBufferL, *dMixBufferR;
12231223 int32_t pos;
12241224 uint32_t i, samplesToMix, samplesLeft;
12251225 uint64_t posFrac, tmpDelta;
@@ -1240,19 +1240,19 @@ static void mix16bBidiLoopCIntrp(voice_t *v, uint32_t numSamples) · 14 unmodified lines
12401240 {
12411241 for (i = 0; i < (samplesToMix & 3); i++)
12421242 {
1243− RENDER_16BIT_SMP_CINTRP_TAP_FIX
1243+ RENDER_16BIT_SMP_SINTRP_TAP_FIX
12441244 INC_POS_BIDI
12451245 }
12461246 samplesToMix >>= 2;
12471247 for (i = 0; i < samplesToMix; i++)
12481248 {
1249− RENDER_16BIT_SMP_CINTRP_TAP_FIX
1249+ RENDER_16BIT_SMP_SINTRP_TAP_FIX
12501250 INC_POS_BIDI
1251− RENDER_16BIT_SMP_CINTRP_TAP_FIX
1251+ RENDER_16BIT_SMP_SINTRP_TAP_FIX
12521252 INC_POS_BIDI
1253− RENDER_16BIT_SMP_CINTRP_TAP_FIX
1253+ RENDER_16BIT_SMP_SINTRP_TAP_FIX
12541254 INC_POS_BIDI
1255− RENDER_16BIT_SMP_CINTRP_TAP_FIX
1255+ RENDER_16BIT_SMP_SINTRP_TAP_FIX
12561256 INC_POS_BIDI
12571257 }
12581258 }
@@ -1260,19 +1260,19 @@ static void mix16bBidiLoopCIntrp(voice_t *v, uint32_t numSamples) · 1 unmodified line
12601260 {
12611261 for (i = 0; i < (samplesToMix & 3); i++)
12621262 {
1263− RENDER_16BIT_SMP_CINTRP
1263+ RENDER_16BIT_SMP_SINTRP
12641264 INC_POS_BIDI
12651265 }
12661266 samplesToMix >>= 2;
12671267 for (i = 0; i < samplesToMix; i++)
12681268 {
1269− RENDER_16BIT_SMP_CINTRP
1269+ RENDER_16BIT_SMP_SINTRP
12701270 INC_POS_BIDI
1271− RENDER_16BIT_SMP_CINTRP
1271+ RENDER_16BIT_SMP_SINTRP
12721272 INC_POS_BIDI
1273− RENDER_16BIT_SMP_CINTRP
1273+ RENDER_16BIT_SMP_SINTRP
12741274 INC_POS_BIDI
1275− RENDER_16BIT_SMP_CINTRP
1275+ RENDER_16BIT_SMP_SINTRP
12761276 INC_POS_BIDI
12771277 }
12781278 }
@@ -1287,7 +1287,7 @@ static void mix16bBidiLoopCIntrp(voice_t *v, uint32_t numSamples) · 8 unmodified lines
12871287 static void mix16bNoLoopLIntrp(voice_t *v, uint32_t numSamples)
12881288 {
12891289 const int16_t *base, *smpPtr;
1290− float fSample, *fMixBufferL, *fMixBufferR;
1290+ double dSample, *dMixBufferL, *dMixBufferR;
12911291 int32_t pos;
12921292 uint32_t i, samplesToMix, samplesLeft;
12931293 uint64_t posFrac;
@@ -1329,7 +1329,7 @@ static void mix16bNoLoopLIntrp(voice_t *v, uint32_t numSamples) · 35 unmodified lines
13291329 static void mix16bLoopLIntrp(voice_t *v, uint32_t numSamples)
13301330 {
13311331 const int16_t *base, *smpPtr;
1332− float fSample, *fMixBufferL, *fMixBufferR;
1332+ double dSample, *dMixBufferL, *dMixBufferR;
13331333 int32_t pos;
13341334 uint32_t i, samplesToMix, samplesLeft;
13351335 uint64_t posFrac;
@@ -1371,7 +1371,7 @@ static void mix16bLoopLIntrp(voice_t *v, uint32_t numSamples) · 35 unmodified lines
13711371 static void mix16bBidiLoopLIntrp(voice_t *v, uint32_t numSamples)
13721372 {
13731373 const int16_t *base, *revBase, *smpPtr;
1374− float fSample, *fMixBufferL, *fMixBufferR;
1374+ double dSample, *dMixBufferL, *dMixBufferR;
13751375 int32_t pos;
13761376 uint32_t i, samplesToMix, samplesLeft;
13771377 uint64_t posFrac, tmpDelta;
@@ -1415,9 +1415,9 @@ static void mix16bBidiLoopLIntrp(voice_t *v, uint32_t numSamples) · 37 unmodified lines
14151415 static void mix16bRampNoLoop(voice_t *v, uint32_t numSamples)
14161416 {
14171417 const int16_t *base, *smpPtr;
1418− float fSample, *fMixBufferL, *fMixBufferR;
1418+ double dSample, *dMixBufferL, *dMixBufferR;
14191419 int32_t pos;
1420− float fVolLDelta, fVolRDelta, fVolL, fVolR;
1420+ double dVolLDelta, dVolRDelta, dVolL, dVolR;
14211421 uint32_t i, samplesToMix, samplesLeft;
14221422 uint64_t posFrac;
14231423
@@ -1465,9 +1465,9 @@ static void mix16bRampNoLoop(voice_t *v, uint32_t numSamples) · 41 unmodified lines
14651465 static void mix16bRampLoop(voice_t *v, uint32_t numSamples)
14661466 {
14671467 const int16_t *base, *smpPtr;
1468− float fSample, *fMixBufferL, *fMixBufferR;
1468+ double dSample, *dMixBufferL, *dMixBufferR;
14691469 int32_t pos;
1470− float fVolLDelta, fVolRDelta, fVolL, fVolR;
1470+ double dVolLDelta, dVolRDelta, dVolL, dVolR;
14711471 uint32_t i, samplesToMix, samplesLeft;
14721472 uint64_t posFrac;
14731473
@@ -1515,9 +1515,9 @@ static void mix16bRampLoop(voice_t *v, uint32_t numSamples) · 41 unmodified lines
15151515 static void mix16bRampBidiLoop(voice_t *v, uint32_t numSamples)
15161516 {
15171517 const int16_t *base, *revBase, *smpPtr;
1518− float fSample, *fMixBufferL, *fMixBufferR;
1518+ double dSample, *dMixBufferL, *dMixBufferR;
15191519 int32_t pos;
1520− float fVolLDelta, fVolRDelta, fVolL, fVolR;
1520+ double dVolLDelta, dVolRDelta, dVolL, dVolR;
15211521 uint32_t i, samplesToMix, samplesLeft;
15221522 uint64_t posFrac, tmpDelta;
15231523
@@ -1564,12 +1564,12 @@ static void mix16bRampBidiLoop(voice_t *v, uint32_t numSamples) · 40 unmodified lines
15641564 SET_BACK_MIXER_POS
15651565 }
15661566
1567−static void mix16bRampNoLoopCIntrp(voice_t *v, uint32_t numSamples)
1567+static void mix16bRampNoLoopSIntrp(voice_t *v, uint32_t numSamples)
15681568 {
15691569 const int16_t *base, *smpPtr;
1570− float fSample, *fMixBufferL, *fMixBufferR;
1570+ double dSample, *dMixBufferL, *dMixBufferR;
15711571 int32_t pos;
1572− float fVolLDelta, fVolRDelta, fVolL, fVolR;
1572+ double dVolLDelta, dVolRDelta, dVolL, dVolR;
15731573 uint32_t i, samplesToMix, samplesLeft;
15741574 uint64_t posFrac;
15751575
@@ -1586,23 +1586,23 @@ static void mix16bRampNoLoopCIntrp(voice_t *v, uint32_t numSamples) · 10 unmodified lines
15861586
15871587 for (i = 0; i < (samplesToMix & 3); i++)
15881588 {
1589− RENDER_16BIT_SMP_CINTRP
1589+ RENDER_16BIT_SMP_SINTRP
15901590 VOLUME_RAMPING
15911591 INC_POS
15921592 }
15931593 samplesToMix >>= 2;
15941594 for (i = 0; i < samplesToMix; i++)
15951595 {
1596− RENDER_16BIT_SMP_CINTRP
1596+ RENDER_16BIT_SMP_SINTRP
15971597 VOLUME_RAMPING
15981598 INC_POS
1599− RENDER_16BIT_SMP_CINTRP
1599+ RENDER_16BIT_SMP_SINTRP
16001600 VOLUME_RAMPING
16011601 INC_POS
1602− RENDER_16BIT_SMP_CINTRP
1602+ RENDER_16BIT_SMP_SINTRP
16031603 VOLUME_RAMPING
16041604 INC_POS
1605− RENDER_16BIT_SMP_CINTRP
1605+ RENDER_16BIT_SMP_SINTRP
16061606 VOLUME_RAMPING
16071607 INC_POS
16081608 }
@@ -1614,12 +1614,12 @@ static void mix16bRampNoLoopCIntrp(voice_t *v, uint32_t numSamples) · 5 unmodified lines
16141614 SET_BACK_MIXER_POS
16151615 }
16161616
1617−static void mix16bRampLoopCIntrp(voice_t *v, uint32_t numSamples)
1617+static void mix16bRampLoopSIntrp(voice_t *v, uint32_t numSamples)
16181618 {
16191619 const int16_t *base, *smpPtr;
1620− float s0, s1, s2, s3, fSample, *fMixBufferL, *fMixBufferR;
1620+ double dSample, *dMixBufferL, *dMixBufferR;
16211621 int32_t pos;
1622− float fVolLDelta, fVolRDelta, fVolL, fVolR;
1622+ double dVolLDelta, dVolRDelta, dVolL, dVolR;
16231623 uint32_t i, samplesToMix, samplesLeft;
16241624 uint64_t posFrac;
16251625
@@ -1639,23 +1639,23 @@ static void mix16bRampLoopCIntrp(voice_t *v, uint32_t numSamples) · 13 unmodified lines
16391639 {
16401640 for (i = 0; i < (samplesToMix & 3); i++)
16411641 {
1642− RENDER_16BIT_SMP_CINTRP_TAP_FIX
1642+ RENDER_16BIT_SMP_SINTRP_TAP_FIX
16431643 VOLUME_RAMPING
16441644 INC_POS
16451645 }
16461646 samplesToMix >>= 2;
16471647 for (i = 0; i < samplesToMix; i++)
16481648 {
1649− RENDER_16BIT_SMP_CINTRP_TAP_FIX
1649+ RENDER_16BIT_SMP_SINTRP_TAP_FIX
16501650 VOLUME_RAMPING
16511651 INC_POS
1652− RENDER_16BIT_SMP_CINTRP_TAP_FIX
1652+ RENDER_16BIT_SMP_SINTRP_TAP_FIX
16531653 VOLUME_RAMPING
16541654 INC_POS
1655− RENDER_16BIT_SMP_CINTRP_TAP_FIX
1655+ RENDER_16BIT_SMP_SINTRP_TAP_FIX
16561656 VOLUME_RAMPING
16571657 INC_POS
1658− RENDER_16BIT_SMP_CINTRP_TAP_FIX
1658+ RENDER_16BIT_SMP_SINTRP_TAP_FIX
16591659 VOLUME_RAMPING
16601660 INC_POS
16611661 }
@@ -1664,23 +1664,23 @@ static void mix16bRampLoopCIntrp(voice_t *v, uint32_t numSamples) · 2 unmodified lines
16641664 {
16651665 for (i = 0; i < (samplesToMix & 3); i++)
16661666 {
1667− RENDER_16BIT_SMP_CINTRP
1667+ RENDER_16BIT_SMP_SINTRP
16681668 VOLUME_RAMPING
16691669 INC_POS
16701670 }
16711671 samplesToMix >>= 2;
16721672 for (i = 0; i < samplesToMix; i++)
16731673 {
1674− RENDER_16BIT_SMP_CINTRP
1674+ RENDER_16BIT_SMP_SINTRP
16751675 VOLUME_RAMPING
16761676 INC_POS
1677− RENDER_16BIT_SMP_CINTRP
1677+ RENDER_16BIT_SMP_SINTRP
16781678 VOLUME_RAMPING
16791679 INC_POS
1680− RENDER_16BIT_SMP_CINTRP
1680+ RENDER_16BIT_SMP_SINTRP
16811681 VOLUME_RAMPING
16821682 INC_POS
1683− RENDER_16BIT_SMP_CINTRP
1683+ RENDER_16BIT_SMP_SINTRP
16841684 VOLUME_RAMPING
16851685 INC_POS
16861686 }
@@ -1693,12 +1693,12 @@ static void mix16bRampLoopCIntrp(voice_t *v, uint32_t numSamples) · 6 unmodified lines
16931693 SET_BACK_MIXER_POS
16941694 }
16951695
1696−static void mix16bRampBidiLoopCIntrp(voice_t *v, uint32_t numSamples)
1696+static void mix16bRampBidiLoopSIntrp(voice_t *v, uint32_t numSamples)
16971697 {
16981698 const int16_t *base, *revBase, *smpPtr;
1699− float s0, s1, s2, s3, fSample, *fMixBufferL, *fMixBufferR;
1699+ double dSample, *dMixBufferL, *dMixBufferR;
17001700 int32_t pos;
1701− float fVolLDelta, fVolRDelta, fVolL, fVolR;
1701+ double dVolLDelta, dVolRDelta, dVolL, dVolR;
17021702 uint32_t i, samplesToMix, samplesLeft;
17031703 uint64_t posFrac, tmpDelta;
17041704
@@ -1719,23 +1719,23 @@ static void mix16bRampBidiLoopCIntrp(voice_t *v, uint32_t numSamples) · 14 unmodified lines
17191719 {
17201720 for (i = 0; i < (samplesToMix & 3); i++)
17211721 {
1722− RENDER_16BIT_SMP_CINTRP_TAP_FIX
1722+ RENDER_16BIT_SMP_SINTRP_TAP_FIX
17231723 VOLUME_RAMPING
17241724 INC_POS_BIDI
17251725 }
17261726 samplesToMix >>= 2;
17271727 for (i = 0; i < samplesToMix; i++)
17281728 {
1729− RENDER_16BIT_SMP_CINTRP_TAP_FIX
1729+ RENDER_16BIT_SMP_SINTRP_TAP_FIX
17301730 VOLUME_RAMPING
17311731 INC_POS_BIDI
1732− RENDER_16BIT_SMP_CINTRP_TAP_FIX
1732+ RENDER_16BIT_SMP_SINTRP_TAP_FIX
17331733 VOLUME_RAMPING
17341734 INC_POS_BIDI
1735− RENDER_16BIT_SMP_CINTRP_TAP_FIX
1735+ RENDER_16BIT_SMP_SINTRP_TAP_FIX
17361736 VOLUME_RAMPING
17371737 INC_POS_BIDI
1738− RENDER_16BIT_SMP_CINTRP_TAP_FIX
1738+ RENDER_16BIT_SMP_SINTRP_TAP_FIX
17391739 VOLUME_RAMPING
17401740 INC_POS_BIDI
17411741 }
@@ -1744,23 +1744,23 @@ static void mix16bRampBidiLoopCIntrp(voice_t *v, uint32_t numSamples) · 2 unmodified lines
17441744 {
17451745 for (i = 0; i < (samplesToMix & 3); i++)
17461746 {
1747− RENDER_16BIT_SMP_CINTRP
1747+ RENDER_16BIT_SMP_SINTRP
17481748 VOLUME_RAMPING
17491749 INC_POS_BIDI
17501750 }
17511751 samplesToMix >>= 2;
17521752 for (i = 0; i < samplesToMix; i++)
17531753 {
1754− RENDER_16BIT_SMP_CINTRP
1754+ RENDER_16BIT_SMP_SINTRP
17551755 VOLUME_RAMPING
17561756 INC_POS_BIDI
1757− RENDER_16BIT_SMP_CINTRP
1757+ RENDER_16BIT_SMP_SINTRP
17581758 VOLUME_RAMPING
17591759 INC_POS_BIDI
1760− RENDER_16BIT_SMP_CINTRP
1760+ RENDER_16BIT_SMP_SINTRP
17611761 VOLUME_RAMPING
17621762 INC_POS_BIDI
1763− RENDER_16BIT_SMP_CINTRP
1763+ RENDER_16BIT_SMP_SINTRP
17641764 VOLUME_RAMPING
17651765 INC_POS_BIDI
17661766 }
@@ -1777,9 +1777,9 @@ static void mix16bRampBidiLoopCIntrp(voice_t *v, uint32_t numSamples) · 10 unmodified lines
17771777 static void mix16bRampNoLoopLIntrp(voice_t *v, uint32_t numSamples)
17781778 {
17791779 const int16_t *base, *smpPtr;
1780− float fSample, *fMixBufferL, *fMixBufferR;
1780+ double dSample, *dMixBufferL, *dMixBufferR;
17811781 int32_t pos;
1782− float fVolLDelta, fVolRDelta, fVolL, fVolR;
1782+ double dVolLDelta, dVolRDelta, dVolL, dVolR;
17831783 uint32_t i, samplesToMix, samplesLeft;
17841784 uint64_t posFrac;
17851785
@@ -1827,9 +1827,9 @@ static void mix16bRampNoLoopLIntrp(voice_t *v, uint32_t numSamples) · 41 unmodified lines
18271827 static void mix16bRampLoopLIntrp(voice_t *v, uint32_t numSamples)
18281828 {
18291829 const int16_t *base, *smpPtr;
1830− float fSample, *fMixBufferL, *fMixBufferR;
1830+ double dSample, *dMixBufferL, *dMixBufferR;
18311831 int32_t pos;
1832− float fVolLDelta, fVolRDelta, fVolL, fVolR;
1832+ double dVolLDelta, dVolRDelta, dVolL, dVolR;
18331833 uint32_t i, samplesToMix, samplesLeft;
18341834 uint64_t posFrac;
18351835
@@ -1877,9 +1877,9 @@ static void mix16bRampLoopLIntrp(voice_t *v, uint32_t numSamples) · 41 unmodified lines
18771877 static void mix16bRampBidiLoopLIntrp(voice_t *v, uint32_t numSamples)
18781878 {
18791879 const int16_t *base, *revBase, *smpPtr;
1880− float fSample, *fMixBufferL, *fMixBufferR;
1880+ double dSample, *dMixBufferL, *dMixBufferR;
18811881 int32_t pos;
1882− float fVolLDelta, fVolRDelta, fVolL, fVolR;
1882+ double dVolLDelta, dVolRDelta, dVolL, dVolR;
18831883 uint32_t i, samplesToMix, samplesLeft;
18841884 uint64_t posFrac, tmpDelta;
18851885
@@ -1942,9 +1942,9 @@ const mixFunc mixFuncTab[72] = · 56 unmodified lines
19421942 (mixFunc)mix8bNoLoop,
19431943 (mixFunc)mix8bLoop,
19441944 (mixFunc)mix8bBidiLoop,
1945− (mixFunc)mix8bNoLoopCIntrp,
1946− (mixFunc)mix8bLoopCIntrp,
1947− (mixFunc)mix8bBidiLoopCIntrp,
1945+ (mixFunc)mix8bNoLoopSIntrp,
1946+ (mixFunc)mix8bLoopSIntrp,
1947+ (mixFunc)mix8bBidiLoopSIntrp,
19481948 (mixFunc)mix8bNoLoopLIntrp,
19491949 (mixFunc)mix8bLoopLIntrp,
19501950 (mixFunc)mix8bBidiLoopLIntrp,
@@ -1953,9 +1953,9 @@ const mixFunc mixFuncTab[72] = · 2 unmodified lines
19531953 (mixFunc)mix16bNoLoop,
19541954 (mixFunc)mix16bLoop,
19551955 (mixFunc)mix16bBidiLoop,
1956− (mixFunc)mix16bNoLoopCIntrp,
1957− (mixFunc)mix16bLoopCIntrp,
1958− (mixFunc)mix16bBidiLoopCIntrp,
1956+ (mixFunc)mix16bNoLoopSIntrp,
1957+ (mixFunc)mix16bLoopSIntrp,
1958+ (mixFunc)mix16bBidiLoopSIntrp,
19591959 (mixFunc)mix16bNoLoopLIntrp,
19601960 (mixFunc)mix16bLoopLIntrp,
19611961 (mixFunc)mix16bBidiLoopLIntrp,
@@ -1966,9 +1966,9 @@ const mixFunc mixFuncTab[72] = · 4 unmodified lines
19661966 (mixFunc)mix8bRampNoLoop,
19671967 (mixFunc)mix8bRampLoop,
19681968 (mixFunc)mix8bRampBidiLoop,
1969− (mixFunc)mix8bRampNoLoopCIntrp,
1970− (mixFunc)mix8bRampLoopCIntrp,
1971− (mixFunc)mix8bRampBidiLoopCIntrp,
1969+ (mixFunc)mix8bRampNoLoopSIntrp,
1970+ (mixFunc)mix8bRampLoopSIntrp,
1971+ (mixFunc)mix8bRampBidiLoopSIntrp,
19721972 (mixFunc)mix8bRampNoLoopLIntrp,
19731973 (mixFunc)mix8bRampLoopLIntrp,
19741974 (mixFunc)mix8bRampBidiLoopLIntrp,
@@ -1977,9 +1977,9 @@ const mixFunc mixFuncTab[72] = · 2 unmodified lines
19771977 (mixFunc)mix16bRampNoLoop,
19781978 (mixFunc)mix16bRampLoop,
19791979 (mixFunc)mix16bRampBidiLoop,
1980− (mixFunc)mix16bRampNoLoopCIntrp,
1981− (mixFunc)mix16bRampLoopCIntrp,
1982− (mixFunc)mix16bRampBidiLoopCIntrp,
1980+ (mixFunc)mix16bRampNoLoopSIntrp,
1981+ (mixFunc)mix16bRampLoopSIntrp,
1982+ (mixFunc)mix16bRampBidiLoopSIntrp,
19831983 (mixFunc)mix16bRampNoLoopLIntrp,
19841984 (mixFunc)mix16bRampLoopLIntrp,
19851985 (mixFunc)mix16bRampBidiLoopLIntrp,
@@ -1996,9 +1996,9 @@ const mixFunc mixFuncTab[72] = · 10 unmodified lines
19961996 (mixFunc)centerMix8bNoLoop,
19971997 (mixFunc)centerMix8bLoop,
19981998 (mixFunc)centerMix8bBidiLoop,
1999− (mixFunc)centerMix8bNoLoopCIntrp,
2000− (mixFunc)centerMix8bLoopCIntrp,
2001− (mixFunc)centerMix8bBidiLoopCIntrp,
1999+ (mixFunc)centerMix8bNoLoopSIntrp,
2000+ (mixFunc)centerMix8bLoopSIntrp,
2001+ (mixFunc)centerMix8bBidiLoopSIntrp,
20022002 (mixFunc)centerMix8bNoLoopLIntrp,
20032003 (mixFunc)centerMix8bLoopLIntrp,
20042004 (mixFunc)centerMix8bBidiLoopLIntrp,
@@ -2007,9 +2007,9 @@ const mixFunc mixFuncTab[72] = · 2 unmodified lines
20072007 (mixFunc)centerMix16bNoLoop,
20082008 (mixFunc)centerMix16bLoop,
20092009 (mixFunc)centerMix16bBidiLoop,
2010− (mixFunc)centerMix16bNoLoopCIntrp,
2011− (mixFunc)centerMix16bLoopCIntrp,
2012− (mixFunc)centerMix16bBidiLoopCIntrp,
2010+ (mixFunc)centerMix16bNoLoopSIntrp,
2011+ (mixFunc)centerMix16bLoopSIntrp,
2012+ (mixFunc)centerMix16bBidiLoopSIntrp,
20132013 (mixFunc)centerMix16bNoLoopLIntrp,
20142014 (mixFunc)centerMix16bLoopLIntrp,
20152015 (mixFunc)centerMix16bBidiLoopLIntrp,
@@ -2020,9 +2020,9 @@ const mixFunc mixFuncTab[72] = · 4 unmodified lines
20202020 (mixFunc)centerMix8bRampNoLoop,
20212021 (mixFunc)centerMix8bRampLoop,
20222022 (mixFunc)centerMix8bRampBidiLoop,
2023− (mixFunc)centerMix8bRampNoLoopCIntrp,
2024− (mixFunc)centerMix8bRampLoopCIntrp,
2025− (mixFunc)centerMix8bRampBidiLoopCIntrp,
2023+ (mixFunc)centerMix8bRampNoLoopSIntrp,
2024+ (mixFunc)centerMix8bRampLoopSIntrp,
2025+ (mixFunc)centerMix8bRampBidiLoopSIntrp,
20262026 (mixFunc)centerMix8bRampNoLoopLIntrp,
20272027 (mixFunc)centerMix8bRampLoopLIntrp,
20282028 (mixFunc)centerMix8bRampBidiLoopLIntrp,
@@ -2031,9 +2031,9 @@ const mixFunc mixFuncTab[72] = · 2 unmodified lines
20312031 (mixFunc)centerMix16bRampNoLoop,
20322032 (mixFunc)centerMix16bRampLoop,
20332033 (mixFunc)centerMix16bRampBidiLoop,
2034− (mixFunc)centerMix16bRampNoLoopCIntrp,
2035− (mixFunc)centerMix16bRampLoopCIntrp,
2036− (mixFunc)centerMix16bRampBidiLoopCIntrp,
2034+ (mixFunc)centerMix16bRampNoLoopSIntrp,
2035+ (mixFunc)centerMix16bRampLoopSIntrp,
2036+ (mixFunc)centerMix16bRampBidiLoopSIntrp,
20372037 (mixFunc)centerMix16bRampNoLoopLIntrp,
20382038 (mixFunc)centerMix16bRampLoopLIntrp,
20392039 (mixFunc)centerMix16bRampBidiLoopLIntrp
src/mixer/ft2_mix_macros.h+156−117
@@ -2,64 +2,64 @@ · 1 unmodified line
22
33 #include <assert.h>
44 #include "../ft2_audio.h"
5−#include "ft2_cubicspline.h"
5+#include "ft2_windowed_sinc.h"
66
77 /* ----------------------------------------------------------------------- */
88 /* GENERAL MIXER MACROS */
99 /* ----------------------------------------------------------------------- */
1010
1111 #define GET_VOL \
12− const float fVolL = v->fVolL; \
13− const float fVolR = v->fVolR; \
12+ const double dVolL = v->dVolL; \
13+ const double dVolR = v->dVolR; \
1414
1515 #define GET_VOL_MONO \
16− const float fVolL = v->fVolL; \
16+ const double dVolL = v->dVolL; \
1717
1818 #define GET_VOL_RAMP \
19− fVolL = v->fVolL; \
20− fVolR = v->fVolR; \
19+ dVolL = v->dVolL; \
20+ dVolR = v->dVolR; \
2121
2222 #define GET_VOL_MONO_RAMP \
23− fVolL = v->fVolL; \
23+ dVolL = v->dVolL; \
2424
2525 #define SET_VOL_BACK \
26− v->fVolL = fVolL; \
27− v->fVolR = fVolR; \
26+ v->dVolL = dVolL; \
27+ v->dVolR = dVolR; \
2828
2929 #define SET_VOL_BACK_MONO \
30− v->fVolL = v->fVolR = fVolL; \
30+ v->dVolL = v->dVolR = dVolL; \
3131
3232 #define GET_MIXER_VARS \
3333 const uint64_t delta = v->delta; \
34− fMixBufferL = audio.fMixBufferL; \
35− fMixBufferR = audio.fMixBufferR; \
34+ dMixBufferL = audio.dMixBufferL; \
35+ dMixBufferR = audio.dMixBufferR; \
3636 pos = v->pos; \
3737 posFrac = v->posFrac; \
3838
3939 #define GET_MIXER_VARS_RAMP \
4040 const uint64_t delta = v->delta; \
41− fMixBufferL = audio.fMixBufferL; \
42− fMixBufferR = audio.fMixBufferR; \
43− fVolLDelta = v->fVolDeltaL; \
44− fVolRDelta = v->fVolDeltaR; \
41+ dMixBufferL = audio.dMixBufferL; \
42+ dMixBufferR = audio.dMixBufferR; \
43+ dVolLDelta = v->dVolDeltaL; \
44+ dVolRDelta = v->dVolDeltaR; \
4545 pos = v->pos; \
4646 posFrac = v->posFrac; \
4747
4848 #define GET_MIXER_VARS_MONO_RAMP \
4949 const uint64_t delta = v->delta; \
50− fMixBufferL = audio.fMixBufferL; \
51− fMixBufferR = audio.fMixBufferR; \
52− fVolLDelta = v->fVolDeltaL; \
50+ dMixBufferL = audio.dMixBufferL; \
51+ dMixBufferR = audio.dMixBufferR; \
52+ dVolLDelta = v->dVolDeltaL; \
5353 pos = v->pos; \
5454 posFrac = v->posFrac; \
5555
5656 #define PREPARE_TAP_FIX8 \
5757 const int8_t *loopStartPtr = &v->base8[v->loopStart]; \
58− const float fTapFixSample = v->fTapFixSample; \
58+ const int8_t *leftEdgePtr = loopStartPtr+SINC_LEFT_TAPS; \
5959
6060 #define PREPARE_TAP_FIX16 \
6161 const int16_t *loopStartPtr = &v->base16[v->loopStart]; \
62− const float fTapFixSample = v->fTapFixSample; \
62+ const int16_t *leftEdgePtr = loopStartPtr+SINC_LEFT_TAPS; \
6363
6464 #define SET_BASE8 \
6565 base = v->base8; \
@@ -97,77 +97,77 @@ · 31 unmodified lines
9797 /* ----------------------------------------------------------------------- */
9898
9999 #define VOLUME_RAMPING \
100− fVolL += fVolLDelta; \
101− fVolR += fVolRDelta; \
100+ dVolL += dVolLDelta; \
101+ dVolR += dVolRDelta; \
102102
103103 #define VOLUME_RAMPING_MONO \
104− fVolL += fVolLDelta; \
104+ dVolL += dVolLDelta; \
105105
106106 #define RENDER_8BIT_SMP \
107107 assert(smpPtr >= base && smpPtr < base+v->end); \
108− fSample = *smpPtr * (1.0f / 128.0f); \
109− *fMixBufferL++ += fSample * fVolL; \
110− *fMixBufferR++ += fSample * fVolR; \
108+ dSample = *smpPtr * (1.0 / 128.0); \
109+ *dMixBufferL++ += dSample * dVolL; \
110+ *dMixBufferR++ += dSample * dVolR; \
111111
112112 #define RENDER_8BIT_SMP_MONO \
113113 assert(smpPtr >= base && smpPtr < base+v->end); \
114− fSample = (*smpPtr * (1.0f / 128.0f)) * fVolL; \
115− *fMixBufferL++ += fSample; \
116− *fMixBufferR++ += fSample; \
114+ dSample = (*smpPtr * (1.0 / 128.0)) * dVolL; \
115+ *dMixBufferL++ += dSample; \
116+ *dMixBufferR++ += dSample; \
117117
118118 #define RENDER_16BIT_SMP \
119119 assert(smpPtr >= base && smpPtr < base+v->end); \
120− fSample = *smpPtr * (1.0f / 32768.0f); \
121− *fMixBufferL++ += fSample * fVolL; \
122− *fMixBufferR++ += fSample * fVolR; \
120+ dSample = *smpPtr * (1.0 / 32768.0); \
121+ *dMixBufferL++ += dSample * dVolL; \
122+ *dMixBufferR++ += dSample * dVolR; \
123123
124124 #define RENDER_16BIT_SMP_MONO \
125125 assert(smpPtr >= base && smpPtr < base+v->end); \
126− fSample = (*smpPtr * (1.0f / 32768.0f)) * fVolL; \
127− *fMixBufferL++ += fSample; \
128− *fMixBufferR++ += fSample; \
126+ dSample = (*smpPtr * (1.0 / 32768.0)) * dVolL; \
127+ *dMixBufferL++ += dSample; \
128+ *dMixBufferR++ += dSample; \
129129
130130 // 2-tap linear interpolation (like FT2)
131131
132−#define LINEAR_INTERPOLATION16(s, f) \
132+#define LINEAR_INTERPOLATION8(s, f) \
133133 { \
134− const float fFrac = (const float)((uint32_t)f * (1.0f / (UINT32_MAX+1.0f))); /* 0.0 .. 0.999f */ \
135− fSample = ((s[0] + (s[1]-s[0]) * fFrac)) * (1.0f / 32768.0f); \
134+ const double dFrac = (const double)((uint32_t)f * (1.0 / (UINT32_MAX+1.0))); /* 0.0 .. 0.999999999 */ \
135+ dSample = ((s[0] + (s[1]-s[0]) * dFrac)) * (1.0 / 128.0); \
136136 } \
137137
138−#define LINEAR_INTERPOLATION8(s, f) \
138+#define LINEAR_INTERPOLATION16(s, f) \
139139 { \
140− const float fFrac = (const float)((uint32_t)f * (1.0f / (UINT32_MAX+1.0f))); /* 0.0f .. 0.999f */ \
141− fSample = ((s[0] + (s[1]-s[0]) * fFrac)) * (1.0f / 128.0f); \
140+ const double dFrac = (const double)((uint32_t)f * (1.0 / (UINT32_MAX+1.0))); /* 0.0 .. 0.999999999 */ \
141+ dSample = ((s[0] + (s[1]-s[0]) * dFrac)) * (1.0 / 32768.0); \
142142 } \
143143
144144 #define RENDER_8BIT_SMP_LINTRP \
145145 assert(smpPtr >= base && smpPtr < base+v->end); \
146146 LINEAR_INTERPOLATION8(smpPtr, posFrac) \
147− *fMixBufferL++ += fSample * fVolL; \
148− *fMixBufferR++ += fSample * fVolR; \
147+ *dMixBufferL++ += dSample * dVolL; \
148+ *dMixBufferR++ += dSample * dVolR; \
149149
150150 #define RENDER_8BIT_SMP_MONO_LINTRP \
151151 assert(smpPtr >= base && smpPtr < base+v->end); \
152152 LINEAR_INTERPOLATION8(smpPtr, posFrac) \
153− fSample *= fVolL; \
154− *fMixBufferL++ += fSample; \
155− *fMixBufferR++ += fSample; \
153+ dSample *= dVolL; \
154+ *dMixBufferL++ += dSample; \
155+ *dMixBufferR++ += dSample; \
156156
157157 #define RENDER_16BIT_SMP_LINTRP \
158158 assert(smpPtr >= base && smpPtr < base+v->end); \
159159 LINEAR_INTERPOLATION16(smpPtr, posFrac) \
160− *fMixBufferL++ += fSample * fVolL; \
161− *fMixBufferR++ += fSample * fVolR; \
160+ *dMixBufferL++ += dSample * dVolL; \
161+ *dMixBufferR++ += dSample * dVolR; \
162162
163163 #define RENDER_16BIT_SMP_MONO_LINTRP \
164164 assert(smpPtr >= base && smpPtr < base+v->end); \
165165 LINEAR_INTERPOLATION16(smpPtr, posFrac) \
166− fSample *= fVolL; \
167− *fMixBufferL++ += fSample; \
168− *fMixBufferR++ += fSample; \
166+ dSample *= dVolL; \
167+ *dMixBufferL++ += dSample; \
168+ *dMixBufferR++ += dSample; \
169169
170−// 4-tap cubic spline interpolation (better quality, through LUT: mixer/ft2_cubicspline.c)
170+// 8-tap windowed-sinc interpolation (better quality, through LUT: mixer/ft2_windowed_sinc.c)
171171
172172 /* 8bitbubsy: It may look like we are potentially going out of bounds while looking up the sample points,
173173 ** but the sample data is actually padded on both the left (negative) and right side, where correct tap
@@ -177,85 +177,119 @@ · 3 unmodified lines
177177 **
178178 */
179179
180−#define CUBICSPLINE_INTERPOLATION(LUT, s, f) \
180+#define WINDOWED_SINC_INTERPOLATION8(s, f) \
181181 { \
182− const float *t = (const float *)LUT + (((uint32_t)f >> CUBIC_FSHIFT) & CUBIC_FMASK); \
183− fSample = (s[-1] * t[0]) + (s[0] * t[1]) + (s[1] * t[2]) + (s[2] * t[3]); \
182+ const double *t = v->dSincLUT + (((uint32_t)f >> SINC_FSHIFT) & SINC_FMASK); \
183+ dSample = ((s[-3] * t[0]) + \
184+ (s[-2] * t[1]) + \
185+ (s[-1] * t[2]) + \
186+ ( s[0] * t[3]) + \
187+ ( s[1] * t[4]) + \
188+ ( s[2] * t[5]) + \
189+ ( s[3] * t[6]) + \
190+ ( s[4] * t[7])) * (1.0 / 128.0); \
184191 } \
185192
186−#define CUBICSPLINE_INTERPOLATION_CUSTOM(LUT, f) \
193+#define WINDOWED_SINC_INTERPOLATION16(s, f) \
187194 { \
188− const float *t = (const float *)LUT + (((uint32_t)f >> CUBIC_FSHIFT) & CUBIC_FMASK); \
189− fSample = (s0 * t[0]) + (s1 * t[1]) + (s2 * t[2]) + (s3 * t[3]); \
195+ const double *t = v->dSincLUT + (((uint32_t)f >> SINC_FSHIFT) & SINC_FMASK); \
196+ dSample = ((s[-3] * t[0]) + \
197+ (s[-2] * t[1]) + \
198+ (s[-1] * t[2]) + \
199+ ( s[0] * t[3]) + \
200+ ( s[1] * t[4]) + \
201+ ( s[2] * t[5]) + \
202+ ( s[3] * t[6]) + \
203+ ( s[4] * t[7])) * (1.0 / 32768.0); \
190204 } \
191205
192−#define RENDER_8BIT_SMP_CINTRP \
206+#define RENDER_8BIT_SMP_SINTRP \
193207 assert(smpPtr >= base && smpPtr < base+v->end); \
194− CUBICSPLINE_INTERPOLATION(fCubicSplineLUT8, smpPtr, posFrac) \
195− *fMixBufferL++ += fSample * fVolL; \
196− *fMixBufferR++ += fSample * fVolR; \
208+ WINDOWED_SINC_INTERPOLATION8(smpPtr, posFrac) \
209+ *dMixBufferL++ += dSample * dVolL; \
210+ *dMixBufferR++ += dSample * dVolR; \
197211
198−#define RENDER_8BIT_SMP_MONO_CINTRP \
212+#define RENDER_8BIT_SMP_MONO_SINTRP \
199213 assert(smpPtr >= base && smpPtr < base+v->end); \
200− CUBICSPLINE_INTERPOLATION(fCubicSplineLUT8, smpPtr, posFrac) \
201− fSample *= fVolL; \
202− *fMixBufferL++ += fSample; \
203− *fMixBufferR++ += fSample; \
214+ WINDOWED_SINC_INTERPOLATION8(smpPtr, posFrac) \
215+ dSample *= dVolL; \
216+ *dMixBufferL++ += dSample; \
217+ *dMixBufferR++ += dSample; \
204218
205−#define RENDER_16BIT_SMP_CINTRP \
219+#define RENDER_16BIT_SMP_SINTRP \
206220 assert(smpPtr >= base && smpPtr < base+v->end); \
207− CUBICSPLINE_INTERPOLATION(fCubicSplineLUT16, smpPtr, posFrac) \
208− *fMixBufferL++ += fSample * fVolL; \
209− *fMixBufferR++ += fSample * fVolR; \
221+ WINDOWED_SINC_INTERPOLATION16(smpPtr, posFrac) \
222+ *dMixBufferL++ += dSample * dVolL; \
223+ *dMixBufferR++ += dSample * dVolR; \
210224
211−#define RENDER_16BIT_SMP_MONO_CINTRP \
225+#define RENDER_16BIT_SMP_MONO_SINTRP \
212226 assert(smpPtr >= base && smpPtr < base+v->end); \
213− CUBICSPLINE_INTERPOLATION(fCubicSplineLUT16, smpPtr, posFrac) \
214− fSample *= fVolL; \
215− *fMixBufferL++ += fSample; \
216− *fMixBufferR++ += fSample; \
227+ WINDOWED_SINC_INTERPOLATION16(smpPtr, posFrac) \
228+ dSample *= dVolL; \
229+ *dMixBufferL++ += dSample; \
230+ *dMixBufferR++ += dSample; \
217231
218−#define RENDER_8BIT_SMP_CINTRP_TAP_FIX \
232+/* Special left-edge case mixers to get proper tap data after one loop cycle.
233+** These are only used with sinc interpolation on looped samples.
234+*/
235+
236+#define RENDER_8BIT_SMP_SINTRP_TAP_FIX \
219237 assert(smpPtr >= base && smpPtr < base+v->end); \
220− s0 = (smpPtr != loopStartPtr) ? smpPtr[-1] : fTapFixSample; \
221− s1 = smpPtr[0]; \
222− s2 = smpPtr[1]; \
223− s3 = smpPtr[2]; \
224− CUBICSPLINE_INTERPOLATION_CUSTOM(fCubicSplineLUT8, posFrac) \
225− *fMixBufferL++ += fSample * fVolL; \
226− *fMixBufferR++ += fSample * fVolR; \
227−
228−#define RENDER_8BIT_SMP_MONO_CINTRP_TAP_FIX \
238+ if (smpPtr <= leftEdgePtr) \
239+ { \
240+ const double *tapData = &v->dLeftEdgeTaps[(int32_t)(smpPtr - loopStartPtr)]; \
241+ WINDOWED_SINC_INTERPOLATION8(tapData, posFrac) \
242+ } \
243+ else \
244+ { \
245+ WINDOWED_SINC_INTERPOLATION8(smpPtr, posFrac) \
246+ } \
247+ *dMixBufferL++ += dSample * dVolL; \
248+ *dMixBufferR++ += dSample * dVolR; \
249+
250+#define RENDER_8BIT_SMP_MONO_SINTRP_TAP_FIX \
229251 assert(smpPtr >= base && smpPtr < base+v->end); \
230− s0 = (smpPtr != loopStartPtr) ? smpPtr[-1] : fTapFixSample; \
231− s1 = smpPtr[0]; \
232− s2 = smpPtr[1]; \
233− s3 = smpPtr[2]; \
234− CUBICSPLINE_INTERPOLATION_CUSTOM(fCubicSplineLUT8, posFrac) \
235− fSample *= fVolL; \
236− *fMixBufferL++ += fSample; \
237− *fMixBufferR++ += fSample; \
238−
239−#define RENDER_16BIT_SMP_CINTRP_TAP_FIX \
252+ if (smpPtr <= leftEdgePtr) \
253+ { \
254+ const double *tapData = &v->dLeftEdgeTaps[(int32_t)(smpPtr - loopStartPtr)]; \
255+ WINDOWED_SINC_INTERPOLATION8(tapData, posFrac) \
256+ } \
257+ else \
258+ { \
259+ WINDOWED_SINC_INTERPOLATION8(smpPtr, posFrac) \
260+ } \
261+ dSample *= dVolL; \
262+ *dMixBufferL++ += dSample; \
263+ *dMixBufferR++ += dSample; \
264+
265+#define RENDER_16BIT_SMP_SINTRP_TAP_FIX \
240266 assert(smpPtr >= base && smpPtr < base+v->end); \
241− s0 = (smpPtr != loopStartPtr) ? smpPtr[-1] : fTapFixSample; \
242− s1 = smpPtr[0]; \
243− s2 = smpPtr[1]; \
244− s3 = smpPtr[2]; \
245− CUBICSPLINE_INTERPOLATION_CUSTOM(fCubicSplineLUT16, posFrac) \
246− *fMixBufferL++ += fSample * fVolL; \
247− *fMixBufferR++ += fSample * fVolR; \
248−
249−#define RENDER_16BIT_SMP_MONO_CINTRP_TAP_FIX \
267+ if (smpPtr <= leftEdgePtr) \
268+ { \
269+ const double *tapData = &v->dLeftEdgeTaps[(int32_t)(smpPtr - loopStartPtr)]; \
270+ WINDOWED_SINC_INTERPOLATION16(tapData, posFrac) \
271+ } \
272+ else \
273+ { \
274+ WINDOWED_SINC_INTERPOLATION16(smpPtr, posFrac) \
275+ } \
276+ *dMixBufferL++ += dSample * dVolL; \
277+ *dMixBufferR++ += dSample * dVolR; \
278+
279+#define RENDER_16BIT_SMP_MONO_SINTRP_TAP_FIX \
250280 assert(smpPtr >= base && smpPtr < base+v->end); \
251− s0 = (smpPtr != loopStartPtr) ? smpPtr[-1] : fTapFixSample; \
252− s1 = smpPtr[0]; \
253− s2 = smpPtr[1]; \
254− s3 = smpPtr[2]; \
255− CUBICSPLINE_INTERPOLATION_CUSTOM(fCubicSplineLUT16, posFrac) \
256− fSample *= fVolL; \
257− *fMixBufferL++ += fSample; \
258− *fMixBufferR++ += fSample; \
281+ if (smpPtr <= leftEdgePtr) \
282+ { \
283+ const double *tapData = &v->dLeftEdgeTaps[(int32_t)(smpPtr - loopStartPtr)]; \
284+ WINDOWED_SINC_INTERPOLATION16(tapData, posFrac) \
285+ } \
286+ else \
287+ { \
288+ WINDOWED_SINC_INTERPOLATION16(smpPtr, posFrac) \
289+ } \
290+ dSample *= dVolL; \
291+ *dMixBufferL++ += dSample; \
292+ *dMixBufferR++ += dSample; \
259293
260294 /* ----------------------------------------------------------------------- */
261295 /* SAMPLES-TO-MIX LIMITING MACROS */
@@ -267,6 +301,11 @@ · 5 unmodified lines
267301 i = 65535; \
268302 \
269303 i = (i << 16) | ((uint32_t)(posFrac >> 16) ^ 0xFFFF); \
304+ \
305+ /* This is hackish, but fast. This is sometimes off by one (-1), so */ \
306+ /* we need to do another cycle to reach the end of the sample. The */ \
307+ /* error is never +1, it's always below (safe). */ \
308+ \
270309 samplesToMix = ((int64_t)i * v->revDelta) >> 32; \
271310 samplesToMix++; \
272311 \
@@ -295,8 +334,8 @@ · 22 unmodified lines
295334 #define LIMIT_MIX_NUM_RAMP \
296335 if (v->volRampSamples == 0) \
297336 { \
298− fVolLDelta = 0; \
299− fVolRDelta = 0; \
337+ dVolLDelta = 0.0; \
338+ dVolRDelta = 0.0; \
300339 \
301340 if (v->isFadeOutVoice) \
302341 { \
@@ -315,7 +354,7 @@ · 12 unmodified lines
315354 #define LIMIT_MIX_NUM_MONO_RAMP \
316355 if (v->volRampSamples == 0) \
317356 { \
318− fVolLDelta = 0; \
357+ dVolLDelta = 0.0; \
319358 if (v->isFadeOutVoice) \
320359 { \
321360 v->active = false; /* volume ramp fadeout-voice is done, shut it down */ \
src/mixer/ft2_silence_mix.c+39−8
@@ -1,27 +1,58 @@
11 #include <stdint.h>
22 #include "../ft2_audio.h"
3−#include "ft2_silence_mix.h"
3+
4+// used for the audio channel mixer when voice volume is zero
45
56 void silenceMixRoutine(voice_t *v, int32_t numSamples)
67 {
7− int32_t pos;
8− uint64_t posFrac;
8+ const uint64_t newPos = v->delta * (uint64_t)numSamples;
9+ const uint32_t addPos = (uint32_t)(newPos >> MIXER_FRAC_BITS);
10+ uint64_t addFrac = newPos & MIXER_FRAC_MASK;
11+
12+ addFrac += v->posFrac;
13+ int32_t pos = v->pos + addPos + (uint32_t)(addFrac >> MIXER_FRAC_BITS);
14+ uint64_t posFrac = addFrac & MIXER_FRAC_MASK;
915
10− SILENCE_MIX_INC_POS
16+ if (pos < v->end) // we haven't reached the sample's end yet
17+ {
18+ v->posFrac = posFrac;
19+ v->pos = pos;
20+ return;
21+ }
22+
23+ // end of sample (or loop) reached
1124
1225 if (v->loopType == LOOP_DISABLED)
1326 {
14− SILENCE_MIX_NO_LOOP
27+ v->active = false; // shut down voice
28+ return;
1529 }
16− else if (v->loopType == LOOP_FORWARD)
30+
31+ if (v->loopType == LOOP_FORWARD)
1732 {
18− SILENCE_MIX_LOOP
33+ if (v->loopLength >= 2)
34+ pos = v->loopStart + ((pos - v->end) % v->loopLength);
35+ else
36+ pos = v->loopStart;
1937 }
2038 else // pingpong loop
2139 {
22− SILENCE_MIX_BIDI_LOOP
40+ if (v->loopLength >= 2)
41+ {
42+ const int32_t overflow = pos - v->end;
43+ const int32_t cycles = overflow / v->loopLength;
44+ const int32_t phase = overflow % v->loopLength;
45+
46+ pos = v->loopStart + phase;
47+ v->backwards ^= !(cycles & 1);
48+ }
49+ else
50+ {
51+ pos = v->loopStart;
52+ }
2353 }
2454
55+ v->hasLooped = true;
2556 v->posFrac = posFrac;
2657 v->pos = pos;
2758 }
src/mixer/ft2_silence_mix.h+0−47
@@ -1,53 +1,6 @@
11 #pragma once
22
33 #include <stdint.h>
4−#include <assert.h>
54 #include "../ft2_audio.h"
65
7−#define SILENCE_MIX_NO_LOOP \
8− if (pos >= v->end) \
9− { \
10− v->active = false; /* shut down voice */ \
11− return; \
12− } \
13−
14−#define SILENCE_MIX_INC_POS \
15− const uint64_t newPos = v->delta * (uint64_t)numSamples; \
16− const uint32_t addPos = (uint32_t)(newPos >> MIXER_FRAC_BITS); \
17− uint64_t addFrac = newPos & MIXER_FRAC_MASK; \
18− \
19− addFrac += v->posFrac; \
20− pos = v->pos + addPos + (uint32_t)(addFrac >> MIXER_FRAC_BITS); \
21− posFrac = addFrac & MIXER_FRAC_MASK; \
22−
23−#define SILENCE_MIX_LOOP \
24− if (pos >= v->end) \
25− { \
26− if (v->loopLength >= 2) \
27− pos = v->loopStart + ((pos - v->end) % v->loopLength); \
28− else \
29− pos = v->loopStart; \
30− \
31− v->hasLooped = true; \
32− } \
33−
34−#define SILENCE_MIX_BIDI_LOOP \
35− if (pos >= v->end) \
36− { \
37− if (v->loopLength >= 2) \
38− { \
39− const int32_t overflow = pos - v->end; \
40− const int32_t cycles = overflow / v->loopLength; \
41− const int32_t phase = overflow % v->loopLength; \
42− \
43− pos = v->loopStart + phase; \
44− v->backwards ^= !(cycles & 1); \
45− } \
46− else \
47− { \
48− pos = v->loopStart; \
49− } \
50− v->hasLooped = true; \
51− } \
52−
536 void silenceMixRoutine(voice_t *v, int32_t numSamples);
src/mixer/ft2_windowed_sinc.c+99−0
@@ -0,0 +1,99 @@
1+#include <stdint.h>
2+#include <stdbool.h>
3+#include <stdlib.h>
4+#include <math.h>
5+#include "ft2_windowed_sinc.h"
6+
7+// globalized
8+double *gKaiserSinc = NULL;
9+double *gDownSample1 = NULL;
10+double *gDownSample2 = NULL;
11+
12+/* Code taken from the OpenMPT project, which has a BSD
13+** license which is compatible with this this project.
14+**
15+** The code has been slightly modified.
16+*/
17+
18+static double Izero(double y) // Compute Bessel function Izero(y) using a series approximation
19+{
20+ double s = 1.0, ds = 1.0, d = 0.0;
21+
22+ const double epsilon = 1E-9; // 8bb: 1E-7 -> 1E-9 for added precision (still fast to calculate)
23+
24+ do
25+ {
26+ d = d + 2.0;
27+ ds = ds * (y * y) / (d * d);
28+ s = s + ds;
29+ }
30+ while (ds > epsilon * s);
31+
32+ return s;
33+}
34+
35+static void getSinc(double *dLUTPtr, const double beta, const double cutoff)
36+{
37+ const double izeroBeta = Izero(beta);
38+ const double kPi = 4.0 * atan(1.0) * cutoff; // M_PI can't be trusted
39+
40+ for (int32_t i = 0; i < SINC_LUT_LEN; i++)
41+ {
42+ double dSinc;
43+ int32_t ix = (SINC_TAPS-1) - (i & (SINC_TAPS-1));
44+
45+ ix = (ix * SINC_PHASES) + (i >> SINC_TAPS_BITS);
46+ if (ix == SINC_MID_TAP)
47+ {
48+ dSinc = 1.0;
49+ }
50+ else
51+ {
52+ const double x = (ix - SINC_MID_TAP) * (1.0 / SINC_PHASES);
53+ const double xPi = x * kPi;
54+
55+ const double xMul = 1.0 / ((SINC_TAPS/2) * (SINC_TAPS/2));
56+ dSinc = sin(xPi) * Izero(beta * sqrt(1.0 - x * x * xMul)) / (izeroBeta * xPi); // Kaiser window
57+ }
58+
59+ dLUTPtr[i] = dSinc * cutoff;
60+ }
61+}
62+
63+bool calcWindowedSincTables(void)
64+{
65+ gKaiserSinc = (double *)malloc(SINC_LUT_LEN * sizeof (double));
66+ gDownSample1 = (double *)malloc(SINC_LUT_LEN * sizeof (double));
67+ gDownSample2 = (double *)malloc(SINC_LUT_LEN * sizeof (double));
68+
69+ if (gKaiserSinc == NULL || gDownSample1 == NULL || gDownSample2 == NULL)
70+ return false;
71+
72+ // OpenMPT parameters
73+ getSinc(gKaiserSinc, 9.6377, 0.97);
74+ getSinc(gDownSample1, 8.5, 0.5);
75+ getSinc(gDownSample2, 2.7625, 0.425);
76+
77+ return true;
78+}
79+
80+void freeWindowedSincTables(void)
81+{
82+ if (gKaiserSinc != NULL)
83+ {
84+ free(gKaiserSinc);
85+ gKaiserSinc = NULL;
86+ }
87+
88+ if (gDownSample1 != NULL)
89+ {
90+ free(gDownSample1);
91+ gDownSample1 = NULL;
92+ }
93+
94+ if (gDownSample2 != NULL)
95+ {
96+ free(gDownSample2);
97+ gDownSample2 = NULL;
98+ }
99+}
src/mixer/ft2_windowed_sinc.h+33−0
@@ -0,0 +1,33 @@
1+#pragma once
2+
3+#include <stdint.h>
4+#include <stdbool.h>
5+
6+#ifndef MIXER_FRAC_BITS
7+#define MIXER_FRAC_BITS 32
8+#endif
9+
10+// if you change this, also change SINC_PHASES_BITS (>4096 makes little sense)
11+#define SINC_PHASES 4096
12+#define SINC_PHASES_BITS 12 /* log2(SINC_PHASES) */
13+
14+// don't change these!
15+
16+#define SINC_TAPS 8
17+#define SINC_TAPS_BITS 3
18+#define SINC_LUT_LEN (SINC_TAPS * SINC_PHASES)
19+#define SINC_FSHIFT (MIXER_FRAC_BITS-(SINC_PHASES_BITS+SINC_TAPS_BITS))
20+#define SINC_FMASK ((SINC_TAPS*SINC_PHASES)-SINC_TAPS)
21+
22+#define SINC_LEFT_TAPS ((SINC_TAPS/2)-1)
23+#define SINC_RIGHT_TAPS (SINC_TAPS/2)
24+
25+// for LUT calculation
26+#define SINC_MID_TAP ((SINC_TAPS/2)*SINC_PHASES)
27+
28+extern double *gKaiserSinc;
29+extern double *gDownSample1;
30+extern double *gDownSample2;
31+
32+bool calcWindowedSincTables(void);
33+void freeWindowedSincTables(void);
vs2019_project/ft2-clone/ft2-clone.vcxproj+2−2
@@ -336,7 +336,7 @@ · 335 unmodified lines
336336 <ClCompile Include="..\..\src\gfxdata\ft2_bmp_instr.c" />
337337 <ClCompile Include="..\..\src\gfxdata\ft2_bmp_looppins.c" />
338338 <ClCompile Include="..\..\src\gfxdata\ft2_bmp_scopes.c" />
339− <ClCompile Include="..\..\src\mixer\ft2_cubicspline.c" />
339+ <ClCompile Include="..\..\src\mixer\ft2_windowed_sinc.c" />
340340 <ClCompile Include="..\..\src\mixer\ft2_mix.c" />
341341 <ClCompile Include="..\..\src\mixer\ft2_center_mix.c" />
342342 <ClCompile Include="..\..\src\mixer\ft2_silence_mix.c" />
@@ -400,7 +400,7 @@ · 57 unmodified lines
400400 <ClInclude Include="..\..\src\ft2_unicode.h" />
401401 <ClInclude Include="..\..\src\ft2_video.h" />
402402 <ClInclude Include="..\..\src\ft2_wav_renderer.h" />
403− <ClInclude Include="..\..\src\mixer\ft2_cubicspline.h" />
403+ <ClInclude Include="..\..\src\mixer\ft2_windowed_sinc.h" />
404404 <ClInclude Include="..\..\src\mixer\ft2_mix.h" />
405405 <ClInclude Include="..\..\src\mixer\ft2_mix_macros.h" />
406406 <ClInclude Include="..\..\src\mixer\ft2_center_mix.h" />
vs2019_project/ft2-clone/ft2-clone.vcxproj.filters+2−2
@@ -84,7 +84,7 @@ · 83 unmodified lines
8484 <ClCompile Include="..\..\src\mixer\ft2_silence_mix.c">
8585 <Filter>mixer</Filter>
8686 </ClCompile>
87− <ClCompile Include="..\..\src\mixer\ft2_cubicspline.c">
87+ <ClCompile Include="..\..\src\mixer\ft2_windowed_sinc.c">
8888 <Filter>mixer</Filter>
8989 </ClCompile>
9090 </ItemGroup>
@@ -233,7 +233,7 @@ · 142 unmodified lines
233233 <ClInclude Include="..\..\src\mixer\ft2_silence_mix.h">
234234 <Filter>mixer</Filter>
235235 </ClInclude>
236− <ClInclude Include="..\..\src\mixer\ft2_cubicspline.h">
236+ <ClInclude Include="..\..\src\mixer\ft2_windowed_sinc.h">
237237 <Filter>mixer</Filter>
238238 </ClInclude>
239239 </ItemGroup>

Keyboard shortcuts

General

Show keyboard shortcuts
?
Focus the current search
/

Issues and pull requests

Open filters
f

Issues, pull requests and Inbox

Select next item
j↓
Select previous item
k↑
Open selected item
Enter
Dismiss filters or clear selection
Esc

Repository code

Go to file
t