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

Showing the changes to src (30 of 32 files). Show all

Unified · Split

30 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
src/ft2_about.c+19−10
@@ -110,19 +110,22 @@ static void starfield(void) · 109 unmodified lines
110 */110 */
111 111
112 const float z = (matrix.x.z * star->x) + (matrix.y.z * star->y) + (matrix.z.z * star->z) + 0.5f;112 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;
114 115
115 float y = (((matrix.x.y * star->x) + (matrix.y.y * star->y) + (matrix.z.y * star->z)) / z) * 400.0f;116 float y = (((matrix.x.y * star->x) + (matrix.y.y * star->y) + (matrix.z.y * star->z)) / z) * 400.0f;
116 y += 2.0f + (ABOUT_SCREEN_H/2.0f);117 y += 2.0f + (ABOUT_SCREEN_H/2.0f);
117 118
118 const int32_t outY = (int32_t)(y + 0.5f); // rounded119 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;
120 122
121 float x = (((matrix.x.x * star->x) + (matrix.y.x * star->y) + (matrix.z.x * star->z)) / z) * 400.0f;123 float x = (((matrix.x.x * star->x) + (matrix.y.x * star->y) + (matrix.z.x * star->z)) / z) * 400.0f;
122 x += 2.0f + (ABOUT_SCREEN_W/2.0f);124 x += 2.0f + (ABOUT_SCREEN_W/2.0f);
123 125
124 const int32_t outX = (int32_t)(x + 0.5f); // rounded126 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;
126 129
127 // render star pixel if the pixel under it is the background key130 // render star pixel if the pixel under it is the background key
128 screenBufferPos = ((uint32_t)outY * SCREEN_W) + (uint32_t)outX;131 screenBufferPos = ((uint32_t)outY * SCREEN_W) + (uint32_t)outX;
@@ -131,17 +134,23 @@ static void starfield(void) · 2 unmodified lines
131 int32_t d = (int32_t)((255.0f - (z * 235.0f)) + 0.5f);134 int32_t d = (int32_t)((255.0f - (z * 235.0f)) + 0.5f);
132 135
133 d = (d * starfieldFade) >> 8;136 d = (d * starfieldFade) >> 8;
134 if (d <= 0) continue;137 if (d <= 0)
135 if (d > 255) d = 255;138 continue;
136 139
137 int32_t r = d - 40;140 if (d > 255)
138 if (r < 0) r = 0;141 d = 255;
142
143 int32_t r = d - 48;
144 if (r < 0)
145 r = 0;
139 146
140 int32_t g = d - 14;147 int32_t g = d - 14;
141 if (g < 0) g = 0;148 if (g < 0)
149 g = 0;
142 150
143 int32_t b = d + 69; // nice151 int32_t b = d + 72;
144 if (b > 255) b = 255;152 if (b > 255)
153 b = 255;
145 154
146 video.frameBuffer[screenBufferPos] = RGB32(r, g, b);155 video.frameBuffer[screenBufferPos] = RGB32(r, g, b);
147 lastStarScreenPos[i] = screenBufferPos;156 lastStarScreenPos[i] = screenBufferPos;
src/ft2_audio.c+127−118
@@ -26,14 +26,10 @@ static int8_t pmpCountDiv, pmpChannels = 2; · 25 unmodified lines
26static uint16_t smpBuffSize;26static uint16_t smpBuffSize;
27static int32_t randSeed = INITIAL_DITHER_SEED;27static int32_t randSeed = INITIAL_DITHER_SEED;
28static uint32_t oldAudioFreq, tickTimeLen, tickTimeLenFrac;28static uint32_t oldAudioFreq, tickTimeLen, tickTimeLenFrac;
29static float fAudioNormalizeMul, fPrngStateL, fPrngStateR, fPanningTab[256+1];29static double dAudioNormalizeMul, dPrngStateL, dPrngStateR, dPanningTab[256+1];
30static voice_t voice[MAX_VOICES * 2];30static voice_t voice[MAX_VOICES * 2];
31static void (*sendAudSamplesFunc)(uint8_t *, uint32_t, uint8_t); // "send mixed samples" routines31static void (*sendAudSamplesFunc)(uint8_t *, uint32_t, uint8_t); // "send mixed samples" routines
32 32
33static int32_t oldPeriod;
34static uint32_t oldRevDelta;
35static uint64_t oldDelta;
36
37// globalized33// globalized
38audio_t audio;34audio_t audio;
39pattSyncData_t *pattSyncEntry;35pattSyncData_t *pattSyncEntry;
@@ -44,9 +40,16 @@ volatile bool pattQueueClearing, chQueueClearing; · 4 unmodified lines
44 40
45void resetCachedMixerVars(void)41void resetCachedMixerVars(void)
46{42{
47 oldPeriod = -1;43 stmTyp *ch = stm;
48 oldDelta = 0;44 for (int32_t i = 0; i < MAX_VOICES; i++, ch++)
49 oldRevDelta = UINT32_MAX;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 }
50}53}
51 54
52void stopVoice(int32_t i)55void stopVoice(int32_t i)
@@ -122,11 +125,11 @@ void setAudioAmp(int16_t amp, int16_t masterVol, bool bitDepth32Flag) · 69 unmodified lines
122 amp = CLAMP(amp, 1, 32);125 amp = CLAMP(amp, 1, 32);
123 masterVol = CLAMP(masterVol, 0, 256);126 masterVol = CLAMP(masterVol, 0, 256);
124 127
125 float fAmp = (amp * masterVol) / (32.0f * 256.0f);128 double dAmp = (amp * masterVol) / (32.0 * 256.0);
126 if (!bitDepth32Flag)129 if (!bitDepth32Flag)
127 fAmp *= 32768.0f;130 dAmp *= 32768.0;
128 131
129 fAudioNormalizeMul = fAmp;132 dAudioNormalizeMul = dAmp;
130}133}
131 134
132void setNewAudioFreq(uint32_t freq) // for song-to-WAV rendering135void setNewAudioFreq(uint32_t freq) // for song-to-WAV rendering
@@ -176,7 +179,7 @@ void P_SetSpeed(uint16_t bpm) · 43 unmodified lines
176 tickTimeLenFrac = tickTimeLen64 & UINT32_MAX;179 tickTimeLenFrac = tickTimeLen64 & UINT32_MAX;
177 180
178 // used for calculating volume ramp length for "ticks" ramps181 // used for calculating volume ramp length for "ticks" ramps
179 audio.fRampTickMul = audio.fRampTickMulTab[bpm];182 audio.dRampTickMul = audio.dRampTickMulTab[bpm];
180}183}
181 184
182void audioSetVolRamp(bool volRamp)185void audioSetVolRamp(bool volRamp)
@@ -197,36 +200,36 @@ void calcPanningTable(void) · 14 unmodified lines
197{200{
198 // same formula as FT2's panning table (with 0.0f..1.0f range)201 // same formula as FT2's panning table (with 0.0f..1.0f range)
199 for (int32_t i = 0; i <= 256; i++)202 for (int32_t i = 0; i <= 256; i++)
200 fPanningTab[i] = sqrtf(i / 256.0f);203 dPanningTab[i] = sqrt(i / 256.0);
201}204}
202 205
203static void voiceUpdateVolumes(int32_t i, uint8_t status)206static void voiceUpdateVolumes(int32_t i, uint8_t status)
204{207{
205 float fDestVolL, fDestVolR;208 double dDestVolL, dDestVolR;
206 209
207 voice_t *v = &voice[i];210 voice_t *v = &voice[i];
208 211
209 const float fVolL = v->fVol * fPanningTab[256-v->pan];212 const double dVolL = v->dVol * dPanningTab[256-v->pan];
210 const float fVolR = v->fVol * fPanningTab[ v->pan];213 const double dVolR = v->dVol * dPanningTab[ v->pan];
211 214
212 if (!audio.volumeRampingFlag)215 if (!audio.volumeRampingFlag)
213 {216 {
214 // volume ramping is disabled217 // volume ramping is disabled
215 v->fVolL = fVolL;218 v->dVolL = dVolL;
216 v->fVolR = fVolR;219 v->dVolR = dVolR;
217 v->volRampSamples = 0;220 v->volRampSamples = 0;
218 return;221 return;
219 }222 }
220 223
221 v->fDestVolL = fVolL;224 v->dDestVolL = dVolL;
222 v->fDestVolR = fVolR;225 v->dDestVolR = dVolR;
223 226
224 if (status & IS_NyTon)227 if (status & IS_NyTon)
225 {228 {
226 // sample is about to start, ramp out/in at the same time229 // sample is about to start, ramp out/in at the same time
227 230
228 // setup "fade out" voice (only if current voice volume > 0)231 // 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)
230 {233 {
231 voice_t *f = &voice[MAX_VOICES+i];234 voice_t *f = &voice[MAX_VOICES+i];
232 235
@@ -234,18 +237,18 @@ static void voiceUpdateVolumes(int32_t i, uint8_t status) · 1 unmodified line
234 237
235 f->volRampSamples = audio.quickVolRampSamples;238 f->volRampSamples = audio.quickVolRampSamples;
236 239
237 fDestVolL = -f->fVolL;240 dDestVolL = -f->dVolL;
238 fDestVolR = -f->fVolR;241 dDestVolR = -f->dVolR;
239 242
240 f->fVolDeltaL = fDestVolL * audio.fRampQuickVolMul;243 f->dVolDeltaL = dDestVolL * audio.dRampQuickVolMul;
241 f->fVolDeltaR = fDestVolR * audio.fRampQuickVolMul;244 f->dVolDeltaR = dDestVolR * audio.dRampQuickVolMul;
242 245
243 f->isFadeOutVoice = true;246 f->isFadeOutVoice = true;
244 }247 }
245 248
246 // make current voice fade in from zero when it starts249 // make current voice fade in from zero when it starts
247 v->fVolL = 0.0f;250 v->dVolL = 0.0;
248 v->fVolR = 0.0f;251 v->dVolR = 0.0;
249 }252 }
250 253
251 // ramp volume changes254 // ramp volume changes
@@ -256,38 +259,38 @@ static void voiceUpdateVolumes(int32_t i, uint8_t status) · 4 unmodified lines
256 */259 */
257 260
258 // if destination volume and current volume is the same (and we have no sample trigger), don't do ramp261 // 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))
260 {263 {
261 // there is no volume change264 // there is no volume change
262 v->volRampSamples = 0;265 v->volRampSamples = 0;
263 }266 }
264 else267 else
265 {268 {
266 fDestVolL = fVolL - v->fVolL;269 dDestVolL = dVolL - v->dVolL;
267 fDestVolR = fVolR - v->fVolR;270 dDestVolR = dVolR - v->dVolR;
268 271
269 if (status & IS_QuickVol)272 if (status & IS_QuickVol)
270 {273 {
271 v->volRampSamples = audio.quickVolRampSamples;274 v->volRampSamples = audio.quickVolRampSamples;
272 v->fVolDeltaL = fDestVolL * audio.fRampQuickVolMul;275 v->dVolDeltaL = dDestVolL * audio.dRampQuickVolMul;
273 v->fVolDeltaR = fDestVolR * audio.fRampQuickVolMul;276 v->dVolDeltaR = dDestVolR * audio.dRampQuickVolMul;
274 }277 }
275 else278 else
276 {279 {
277 v->volRampSamples = audio.samplesPerTick;280 v->volRampSamples = audio.samplesPerTick;
278 v->fVolDeltaL = fDestVolL * audio.fRampTickMul;281 v->dVolDeltaL = dDestVolL * audio.dRampTickMul;
279 v->fVolDeltaR = fDestVolR * audio.fRampTickMul;282 v->dVolDeltaR = dDestVolR * audio.dRampTickMul;
280 }283 }
281 }284 }
282}285}
283 286
284static void voiceTrigger(int32_t i, sampleTyp *s, int32_t position)287static void voiceTrigger(int32_t ch, sampleTyp *s, int32_t position)
285{288{
286 bool sampleIs16Bit;289 bool sampleIs16Bit;
287 uint8_t loopType;290 uint8_t loopType;
288 int32_t length, loopStart, loopLength, loopEnd;291 int32_t length, loopStart, loopLength, loopEnd;
289 292
290 voice_t *v = &voice[i];293 voice_t *v = &voice[ch];
291 length = s->len;294 length = s->len;
292 loopStart = s->repS;295 loopStart = s->repS;
293 loopLength = s->repL;296 loopLength = s->repL;
@@ -321,26 +324,15 @@ static void voiceTrigger(int32_t i, sampleTyp *s, int32_t position) · 27 unmodified lines
321 {324 {
322 v->base16 = (const int16_t *)s->pek;325 v->base16 = (const int16_t *)s->pek;
323 v->revBase16 = &v->base16[loopStart + loopEnd]; // for pingpong loops326 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];
330 }327 }
331 else328 else
332 {329 {
333 v->base8 = s->pek;330 v->base8 = s->pek;
334 v->revBase8 = &v->base8[loopStart + loopEnd]; // for pingpong loops331 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];
341 }332 }
342 333
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
344 336
345 v->backwards = false;337 v->backwards = false;
346 v->loopType = loopType;338 v->loopType = loopType;
@@ -366,8 +358,8 @@ void resetRampVolumes(void) · 19 unmodified lines
366 voice_t *v = voice;358 voice_t *v = voice;
367 for (int32_t i = 0; i < song.antChn; i++, v++)359 for (int32_t i = 0; i < song.antChn; i++, v++)
368 {360 {
369 v->fVolL = v->fDestVolL;361 v->dVolL = v->dDestVolL;
370 v->fVolR = v->fDestVolR;362 v->dVolR = v->dDestVolR;
371 v->volRampSamples = 0;363 v->volRampSamples = 0;
372 }364 }
373}365}
@@ -388,7 +380,7 @@ void updateVoices(void) · 14 unmodified lines
388 ch->status = 0;380 ch->status = 0;
389 381
390 if (status & IS_Vol)382 if (status & IS_Vol)
391 v->fVol = ch->fFinalVol;383 v->dVol = ch->dFinalVol;
392 384
393 if (status & IS_Pan)385 if (status & IS_Pan)
394 v->pan = ch->finalPan;386 v->pan = ch->finalPan;
@@ -399,16 +391,33 @@ void updateVoices(void) · 4 unmodified lines
399 if (status & IS_Period)391 if (status & IS_Period)
400 {392 {
401 // use cached values if possible393 // use cached values if possible
402 const uint16_t period = ch->finalPeriod;394 if (ch->finalPeriod != ch->oldFinalPeriod)
403 if (period != oldPeriod)
404 {395 {
405 oldPeriod = period;396 ch->oldFinalPeriod = ch->finalPeriod;
406 oldDelta = getMixerDelta(period);397
407 oldRevDelta = getRevMixerDelta(period);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 }
408 }417 }
409 418
410 v->delta = oldDelta;419 v->delta = v->oldDelta;
411 v->revDelta = oldRevDelta;420 v->revDelta = v->oldRevDelta;
412 }421 }
413 422
414 if (status & IS_NyTon)423 if (status & IS_NyTon)
@@ -419,8 +428,8 @@ void updateVoices(void) · 4 unmodified lines
419void resetAudioDither(void)428void resetAudioDither(void)
420{429{
421 randSeed = INITIAL_DITHER_SEED;430 randSeed = INITIAL_DITHER_SEED;
422 fPrngStateL = 0.0f;431 dPrngStateL = 0.0;
423 fPrngStateR = 0.0f;432 dPrngStateR = 0.0;
424}433}
425 434
426static inline int32_t random32(void)435static inline int32_t random32(void)
@@ -435,24 +444,24 @@ static inline int32_t random32(void) · 8 unmodified lines
435static void sendSamples16BitDitherStereo(uint8_t *stream, uint32_t sampleBlockLength, uint8_t numAudioChannels)444static void sendSamples16BitDitherStereo(uint8_t *stream, uint32_t sampleBlockLength, uint8_t numAudioChannels)
436{445{
437 int32_t out32;446 int32_t out32;
438 float fOut, fPrng;447 double dOut, dPrng;
439 448
440 int16_t *streamPointer16 = (int16_t *)stream;449 int16_t *streamPointer16 = (int16_t *)stream;
441 for (uint32_t i = 0; i < sampleBlockLength; i++)450 for (uint32_t i = 0; i < sampleBlockLength; i++)
442 {451 {
443 // left channel - 1-bit triangular dithering452 // left channel - 1-bit triangular dithering
444 fPrng = random32() * (0.5f / INT32_MAX); // -0.5f .. 0.5f453 dPrng = random32() * (0.5 / INT32_MAX); // -0.5 .. 0.5
445 fOut = ((audio.fMixBufferL[i] * fAudioNormalizeMul) + fPrng) - fPrngStateL;454 dOut = ((audio.dMixBufferL[i] * dAudioNormalizeMul) + dPrng) - dPrngStateL;
446 fPrngStateL = fPrng;455 dPrngStateL = dPrng;
447 out32 = (int32_t)fOut;456 out32 = (int32_t)dOut;
448 CLAMP16(out32);457 CLAMP16(out32);
449 *streamPointer16++ = (int16_t)out32;458 *streamPointer16++ = (int16_t)out32;
450 459
451 // right channel - 1-bit triangular dithering460 // right channel - 1-bit triangular dithering
452 fPrng = random32() * (0.5f / INT32_MAX); // -0.5f .. 0.5f461 dPrng = random32() * (0.5 / INT32_MAX); // -0.5 .. 0.5
453 fOut = ((audio.fMixBufferR[i] * fAudioNormalizeMul) + fPrng) - fPrngStateR;462 dOut = ((audio.dMixBufferR[i] * dAudioNormalizeMul) + dPrng) - dPrngStateR;
454 fPrngStateR = fPrng;463 dPrngStateR = dPrng;
455 out32 = (int32_t)fOut;464 out32 = (int32_t)dOut;
456 CLAMP16(out32);465 CLAMP16(out32);
457 *streamPointer16++ = (int16_t)out32;466 *streamPointer16++ = (int16_t)out32;
458 }467 }
@@ -463,24 +472,24 @@ static void sendSamples16BitDitherStereo(uint8_t *stream, uint32_t sampleBlockLe · 4 unmodified lines
463static void sendSamples16BitDitherMultiChan(uint8_t *stream, uint32_t sampleBlockLength, uint8_t numAudioChannels)472static void sendSamples16BitDitherMultiChan(uint8_t *stream, uint32_t sampleBlockLength, uint8_t numAudioChannels)
464{473{
465 int32_t out32;474 int32_t out32;
466 float fOut, fPrng;475 double dOut, dPrng;
467 476
468 int16_t *streamPointer16 = (int16_t *)stream;477 int16_t *streamPointer16 = (int16_t *)stream;
469 for (uint32_t i = 0; i < sampleBlockLength; i++)478 for (uint32_t i = 0; i < sampleBlockLength; i++)
470 {479 {
471 // left channel - 1-bit triangular dithering480 // left channel - 1-bit triangular dithering
472 fPrng = random32() * (0.5f / INT32_MAX); // -0.5f..0.5f481 dPrng = random32() * (0.5 / INT32_MAX); // -0.5..0.5
473 fOut = ((audio.fMixBufferL[i] * fAudioNormalizeMul) + fPrng) - fPrngStateL;482 dOut = ((audio.dMixBufferL[i] * dAudioNormalizeMul) + dPrng) - dPrngStateL;
474 fPrngStateL = fPrng;483 dPrngStateL = dPrng;
475 out32 = (int32_t)fOut;484 out32 = (int32_t)dOut;
476 CLAMP16(out32);485 CLAMP16(out32);
477 *streamPointer16++ = (int16_t)out32;486 *streamPointer16++ = (int16_t)out32;
478 487
479 // right channel - 1-bit triangular dithering488 // right channel - 1-bit triangular dithering
480 fPrng = random32() * (0.5f / INT32_MAX); // -0.5f..0.5f489 dPrng = random32() * (0.5 / INT32_MAX); // -0.5..0.5
481 fOut = ((audio.fMixBufferR[i] * fAudioNormalizeMul) + fPrng) - fPrngStateR;490 dOut = ((audio.dMixBufferR[i] * dAudioNormalizeMul) + dPrng) - dPrngStateR;
482 fPrngStateR = fPrng;491 dPrngStateR = dPrng;
483 out32 = (int32_t)fOut;492 out32 = (int32_t)dOut;
484 CLAMP16(out32);493 CLAMP16(out32);
485 *streamPointer16++ = (int16_t)out32;494 *streamPointer16++ = (int16_t)out32;
486 495
@@ -492,20 +501,20 @@ static void sendSamples16BitDitherMultiChan(uint8_t *stream, uint32_t sampleBloc · 5 unmodified lines
492 501
493static void sendSamples32BitStereo(uint8_t *stream, uint32_t sampleBlockLength, uint8_t numAudioChannels)502static void sendSamples32BitStereo(uint8_t *stream, uint32_t sampleBlockLength, uint8_t numAudioChannels)
494{503{
495 float fOut;504 double dOut;
496 505
497 float *fStreamPointer32 = (float *)stream;506 float *fStreamPointer32 = (float *)stream;
498 for (uint32_t i = 0; i < sampleBlockLength; i++)507 for (uint32_t i = 0; i < sampleBlockLength; i++)
499 {508 {
500 // left channel509 // left channel
501 fOut = audio.fMixBufferL[i] * fAudioNormalizeMul;510 dOut = audio.dMixBufferL[i] * dAudioNormalizeMul;
502 fOut = CLAMP(fOut, -1.0f, 1.0f);511 dOut = CLAMP(dOut, -1.0, 1.0);
503 *fStreamPointer32++ = fOut;512 *fStreamPointer32++ = (float)dOut;
504 513
505 // right channel514 // right channel
506 fOut = audio.fMixBufferR[i] * fAudioNormalizeMul;515 dOut = audio.dMixBufferR[i] * dAudioNormalizeMul;
507 fOut = CLAMP(fOut, -1.0f, 1.0f);516 dOut = CLAMP(dOut, -1.0, 1.0);
508 *fStreamPointer32++ = fOut;517 *fStreamPointer32++ = (float)dOut;
509 }518 }
510 519
511 (void)numAudioChannels;520 (void)numAudioChannels;
@@ -513,20 +522,20 @@ static void sendSamples32BitStereo(uint8_t *stream, uint32_t sampleBlockLength, · 1 unmodified line
513 522
514static void sendSamples32BitMultiChan(uint8_t *stream, uint32_t sampleBlockLength, uint8_t numAudioChannels)523static void sendSamples32BitMultiChan(uint8_t *stream, uint32_t sampleBlockLength, uint8_t numAudioChannels)
515{524{
516 float fOut;525 double dOut;
517 526
518 float *fStreamPointer32 = (float *)stream;527 float *fStreamPointer32 = (float *)stream;
519 for (uint32_t i = 0; i < sampleBlockLength; i++)528 for (uint32_t i = 0; i < sampleBlockLength; i++)
520 {529 {
521 // left channel530 // left channel
522 fOut = audio.fMixBufferL[i] * fAudioNormalizeMul;531 dOut = audio.dMixBufferL[i] * dAudioNormalizeMul;
523 fOut = CLAMP(fOut, -1.0f, 1.0f);532 dOut = CLAMP(dOut, -1.0, 1.0);
524 *fStreamPointer32++ = fOut;533 *fStreamPointer32++ = (float)dOut;
525 534
526 // right channel535 // right channel
527 fOut = audio.fMixBufferR[i] * fAudioNormalizeMul;536 dOut = audio.dMixBufferR[i] * dAudioNormalizeMul;
528 fOut = CLAMP(fOut, -1.0f, 1.0f);537 dOut = CLAMP(dOut, -1.0, 1.0);
529 *fStreamPointer32++ = fOut;538 *fStreamPointer32++ = (float)dOut;
530 539
531 // send zeroes to the rest of the channels540 // send zeroes to the rest of the channels
532 for (uint32_t j = 2; j < numAudioChannels; j++)541 for (uint32_t j = 2; j < numAudioChannels; j++)
@@ -548,17 +557,17 @@ static void doChannelMixing(int32_t samplesToMix) · 15 unmodified lines
548 const bool volRampFlag = v->volRampSamples > 0;557 const bool volRampFlag = v->volRampSamples > 0;
549 if (volRampFlag)558 if (volRampFlag)
550 {559 {
551 centerMixFlag = (v->fDestVolL == v->fDestVolR) && (v->fVolDeltaL == v->fVolDeltaR);560 centerMixFlag = (v->dDestVolL == v->dDestVolR) && (v->dVolDeltaL == v->dVolDeltaR);
552 }561 }
553 else562 else // no volume ramping active
554 {563 {
555 if (v->fVolL == 0.0f && v->fVolR == 0.0f)564 if (v->dVolL == 0.0 && v->dVolR == 0.0)
556 { 565 {
557 silenceMixRoutine(v, samplesToMix);566 silenceMixRoutine(v, samplesToMix);
558 continue;567 continue;
559 }568 }
560 569
561 centerMixFlag = v->fVolL == v->fVolR;570 centerMixFlag = v->dVolL == v->dVolR;
562 }571 }
563 572
564 mixFuncTab[(centerMixFlag * 36) + (volRampFlag * 18) + v->mixFuncOffset](v, samplesToMix);573 mixFuncTab[(centerMixFlag * 36) + (volRampFlag * 18) + v->mixFuncOffset](v, samplesToMix);
@@ -566,7 +575,7 @@ static void doChannelMixing(int32_t samplesToMix) · 1 unmodified line
566 575
567 if (r->active) // volume ramp fadeout-voice576 if (r->active) // volume ramp fadeout-voice
568 {577 {
569 const bool centerMixFlag = (r->fDestVolL == r->fDestVolR) && (r->fVolDeltaL == r->fVolDeltaR);578 const bool centerMixFlag = (r->dDestVolL == r->dDestVolR) && (r->dVolDeltaL == r->dVolDeltaR);
570 mixFuncTab[(centerMixFlag * 36) + 18 + r->mixFuncOffset](r, samplesToMix);579 mixFuncTab[(centerMixFlag * 36) + 18 + r->mixFuncOffset](r, samplesToMix);
571 }580 }
572 }581 }
@@ -575,8 +584,8 @@ static void doChannelMixing(int32_t samplesToMix) · 2 unmodified lines
575static void mixAudio(uint8_t *stream, uint32_t sampleBlockLength, uint8_t numAudioChannels)584static void mixAudio(uint8_t *stream, uint32_t sampleBlockLength, uint8_t numAudioChannels)
576{585{
577 assert(sampleBlockLength <= MAX_WAV_RENDER_SAMPLES_PER_TICK);586 assert(sampleBlockLength <= MAX_WAV_RENDER_SAMPLES_PER_TICK);
578 memset(audio.fMixBufferL, 0, sampleBlockLength * sizeof (int32_t));587 memset(audio.dMixBufferL, 0, sampleBlockLength * sizeof (double));
579 memset(audio.fMixBufferR, 0, sampleBlockLength * sizeof (int32_t));588 memset(audio.dMixBufferR, 0, sampleBlockLength * sizeof (double));
580 589
581 doChannelMixing(sampleBlockLength);590 doChannelMixing(sampleBlockLength);
582 591
@@ -588,8 +597,8 @@ static void mixAudio(uint8_t *stream, uint32_t sampleBlockLength, uint8_t numAud · 5 unmodified lines
588void mixReplayerTickToBuffer(uint32_t samplesToMix, uint8_t *stream, uint8_t bitDepth)597void mixReplayerTickToBuffer(uint32_t samplesToMix, uint8_t *stream, uint8_t bitDepth)
589{598{
590 assert(samplesToMix <= MAX_WAV_RENDER_SAMPLES_PER_TICK);599 assert(samplesToMix <= MAX_WAV_RENDER_SAMPLES_PER_TICK);
591 memset(audio.fMixBufferL, 0, samplesToMix * sizeof (int32_t));600 memset(audio.dMixBufferL, 0, samplesToMix * sizeof (double));
592 memset(audio.fMixBufferR, 0, samplesToMix * sizeof (int32_t));601 memset(audio.dMixBufferR, 0, samplesToMix * sizeof (double));
593 602
594 doChannelMixing(samplesToMix);603 doChannelMixing(samplesToMix);
595 604
@@ -900,7 +909,7 @@ static void fillVisualsSyncBuffer(void) · 304 unmodified lines
900 c->sampleNr = s->sampleNr;909 c->sampleNr = s->sampleNr;
901 c->envSustainActive = s->envSustainActive;910 c->envSustainActive = s->envSustainActive;
902 c->status = s->tmpStatus;911 c->status = s->tmpStatus;
903 c->fFinalVol = s->fFinalVol;912 c->dFinalVol = s->dFinalVol;
904 c->smpStartPos = s->smpStartPos;913 c->smpStartPos = s->smpStartPos;
905 }914 }
906 915
@@ -963,37 +972,37 @@ static void SDLCALL audioCallback(void *userdata, Uint8 *stream, int len) · 56 unmodified lines
963 972
964static bool setupAudioBuffers(void)973static bool setupAudioBuffers(void)
965{974{
966 const uint32_t sampleSize = sizeof (int32_t);975 const uint32_t sampleSize = sizeof (double);
967 976
968 audio.fMixBufferLUnaligned = (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);
969 audio.fMixBufferRUnaligned = (float *)MALLOC_PAD(MAX_WAV_RENDER_SAMPLES_PER_TICK * sampleSize, 256);978 audio.dMixBufferRUnaligned = (double *)MALLOC_PAD(MAX_WAV_RENDER_SAMPLES_PER_TICK * sampleSize, 256);
970 979
971 if (audio.fMixBufferLUnaligned == NULL || audio.fMixBufferRUnaligned == NULL)980 if (audio.dMixBufferLUnaligned == NULL || audio.dMixBufferRUnaligned == NULL)
972 return false;981 return false;
973 982
974 // make aligned main pointers983 // make aligned main pointers
975 audio.fMixBufferL = (float *)ALIGN_PTR(audio.fMixBufferLUnaligned, 256);984 audio.dMixBufferL = (double *)ALIGN_PTR(audio.dMixBufferLUnaligned, 256);
976 audio.fMixBufferR = (float *)ALIGN_PTR(audio.fMixBufferRUnaligned, 256);985 audio.dMixBufferR = (double *)ALIGN_PTR(audio.dMixBufferRUnaligned, 256);
977 986
978 return true;987 return true;
979}988}
980 989
981static void freeAudioBuffers(void)990static void freeAudioBuffers(void)
982{991{
983 if (audio.fMixBufferLUnaligned != NULL)992 if (audio.dMixBufferLUnaligned != NULL)
984 {993 {
985 free(audio.fMixBufferLUnaligned);994 free(audio.dMixBufferLUnaligned);
986 audio.fMixBufferLUnaligned = NULL;995 audio.dMixBufferLUnaligned = NULL;
987 }996 }
988 997
989 if (audio.fMixBufferRUnaligned != NULL)998 if (audio.dMixBufferRUnaligned != NULL)
990 {999 {
991 free(audio.fMixBufferRUnaligned);1000 free(audio.dMixBufferRUnaligned);
992 audio.fMixBufferRUnaligned = NULL;1001 audio.dMixBufferRUnaligned = NULL;
993 }1002 }
994 1003
995 audio.fMixBufferL = NULL;1004 audio.dMixBufferL = NULL;
996 audio.fMixBufferR = NULL;1005 audio.dMixBufferR = NULL;
997}1006}
998 1007
999void updateSendAudSamplesRoutine(bool lockMixer)1008void updateSendAudSamplesRoutine(bool lockMixer)
src/ft2_audio.h+7−8
@@ -11,8 +11,6 @@ enum · 10 unmodified lines
11 FREQ_TABLE_AMIGA = 1,11 FREQ_TABLE_AMIGA = 1,
12};12};
13 13
14#define NUM_FIXED_TAP_SAMPLES 2
15
16#define MIN_AUDIO_FREQ 4410014#define MIN_AUDIO_FREQ 44100
17#define MAX_AUDIO_FREQ 19200015#define MAX_AUDIO_FREQ 192000
18 16
@@ -35,8 +33,8 @@ typedef struct audio_t · 16 unmodified lines
35 int32_t quickVolRampSamples, inputDeviceNum, outputDeviceNum, lastWorkingAudioFreq, lastWorkingAudioBits;33 int32_t quickVolRampSamples, inputDeviceNum, outputDeviceNum, lastWorkingAudioFreq, lastWorkingAudioBits;
36 uint32_t freq, audLatencyPerfValInt, audLatencyPerfValFrac, samplesPerTick, musicTimeSpeedVal;34 uint32_t freq, audLatencyPerfValInt, audLatencyPerfValFrac, samplesPerTick, musicTimeSpeedVal;
37 uint64_t tickTime64, tickTime64Frac, tickTimeTab[MAX_BPM+1];35 uint64_t tickTime64, tickTime64Frac, tickTimeTab[MAX_BPM+1];
38 float fRampQuickVolMul, fRampTickMul, fRampTickMulTab[MAX_BPM+1];36 double dRampQuickVolMul, dRampTickMul, dRampTickMulTab[MAX_BPM+1];
39 float *fMixBufferL, *fMixBufferR, *fMixBufferLUnaligned, *fMixBufferRUnaligned;37 double *dMixBufferL, *dMixBufferR, *dMixBufferLUnaligned, *dMixBufferRUnaligned;
40 double dAudioLatencyMs, dSamplesPerTick, dTickSampleCounter, dSamplesPerTickTab[MAX_BPM+1];38 double dAudioLatencyMs, dSamplesPerTick, dTickSampleCounter, dSamplesPerTickTab[MAX_BPM+1];
41 39
42 SDL_AudioDeviceID dev;40 SDL_AudioDeviceID dev;
@@ -50,10 +48,11 @@ typedef struct · 7 unmodified lines
50 bool active, backwards, isFadeOutVoice, hasLooped;48 bool active, backwards, isFadeOutVoice, hasLooped;
51 uint8_t mixFuncOffset, pan, loopType;49 uint8_t mixFuncOffset, pan, loopType;
52 int32_t pos, end, loopStart, loopLength;50 int32_t pos, end, loopStart, loopLength;
53 uint32_t volRampSamples, revDelta;51 uint32_t volRampSamples, revDelta, oldRevDelta;
54 uint64_t posFrac, delta;52 uint64_t posFrac, delta, oldDelta;
55 float fTapFixSample; // if (loopStart > 0 && pos == loopStart) useThisForFirstTap();53 const double *dSincLUT;
56 float fVol, fDestVolL, fDestVolR, fVolL, fVolR, fVolDeltaL, fVolDeltaR;54 double *dLeftEdgeTaps; // if (loopStart > 0 && pos <= loopStart+3) useTheseTaps();
55 double dVol, dDestVolL, dDestVolR, dVolL, dVolR, dVolDeltaL, dVolDeltaR;
57} voice_t;56} voice_t;
58 57
59typedef struct pattSyncData_t58typedef struct pattSyncData_t
src/ft2_bmp.c+2−3
@@ -94,9 +94,8 @@ bool loadBMPs(void) · 93 unmodified lines
94 bmp.checkboxGfx = loadBMPTo4BitPal(checkboxGfxBMP);94 bmp.checkboxGfx = loadBMPTo4BitPal(checkboxGfxBMP);
95 95
96 if (bmp.ft2AboutLogo == NULL || bmp.font1 == NULL || bmp.font2 == NULL ||96 if (bmp.ft2AboutLogo == NULL || bmp.font1 == NULL || bmp.font2 == NULL ||
97 bmp.font3 == NULL || bmp.font4 == NULL || bmp.font6 == NULL ||97 bmp.font3 == NULL || bmp.font4 == NULL || bmp.font6 == NULL || bmp.font7 == NULL ||
98 bmp.font6 == NULL || bmp.font7 == NULL || bmp.font8 == NULL ||98 bmp.font8 == NULL || bmp.ft2LogoBadges == NULL || bmp.ft2ByBadges == NULL ||
99 bmp.ft2LogoBadges == NULL || bmp.ft2ByBadges == NULL ||
100 bmp.midiLogo == NULL || bmp.nibblesLogo == NULL || bmp.nibblesStages == NULL ||99 bmp.midiLogo == NULL || bmp.nibblesLogo == NULL || bmp.nibblesStages == NULL ||
101 bmp.loopPins == NULL || bmp.mouseCursors == NULL || bmp.mouseCursorBusyClock == NULL ||100 bmp.loopPins == NULL || bmp.mouseCursors == NULL || bmp.mouseCursorBusyClock == NULL ||
102 bmp.mouseCursorBusyGlass == NULL || bmp.whitePianoKeys == NULL || bmp.blackPianoKeys == NULL ||101 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
141 config.recMIDIVolSens = CLAMP(config.recMIDIVolSens, 0, 200);141 config.recMIDIVolSens = CLAMP(config.recMIDIVolSens, 0, 200);
142 config.recMIDIChn = CLAMP(config.recMIDIChn, 1, 16);142 config.recMIDIChn = CLAMP(config.recMIDIChn, 1, 16);
143 143
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)
145 145
146 if (config.recTrueInsert > 1)146 if (config.recTrueInsert > 1)
147 config.recTrueInsert = 1;147 config.recTrueInsert = 1;
@@ -837,7 +837,7 @@ void setConfigIORadioButtonStates(void) // accessed by other .c files · 689 unmodified lines
837 else if (config.interpolation == INTERPOLATION_LINEAR)837 else if (config.interpolation == INTERPOLATION_LINEAR)
838 tmpID = RB_CONFIG_AUDIO_INTRP_LINEAR;838 tmpID = RB_CONFIG_AUDIO_INTRP_LINEAR;
839 else839 else
840 tmpID = RB_CONFIG_AUDIO_INTRP_CUBIC;840 tmpID = RB_CONFIG_AUDIO_INTRP_SINC;
841 841
842 radioButtons[tmpID].state = RADIOBUTTON_CHECKED;842 radioButtons[tmpID].state = RADIOBUTTON_CHECKED;
843 843
@@ -1168,7 +1168,7 @@ void showConfigScreen(void) · 324 unmodified lines
1168 textOutShadow(390, 105, PAL_FORGRND, PAL_DSKTOP2, "Interpolation:");1168 textOutShadow(390, 105, PAL_FORGRND, PAL_DSKTOP2, "Interpolation:");
1169 textOutShadow(406, 118, PAL_FORGRND, PAL_DSKTOP2, "None");1169 textOutShadow(406, 118, PAL_FORGRND, PAL_DSKTOP2, "None");
1170 textOutShadow(406, 132, PAL_FORGRND, PAL_DSKTOP2, "Linear (FT2)");1170 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");
1172 textOutShadow(406, 161, PAL_FORGRND, PAL_DSKTOP2, "Volume ramping");1172 textOutShadow(406, 161, PAL_FORGRND, PAL_DSKTOP2, "Volume ramping");
1173 1173
1174 textOutShadow(509, 3, PAL_FORGRND, PAL_DSKTOP2, "Mixing frequency:");1174 textOutShadow(509, 3, PAL_FORGRND, PAL_DSKTOP2, "Mixing frequency:");
@@ -1619,11 +1619,11 @@ void rbConfigAudioIntrpLinear(void) · 444 unmodified lines
1619 checkRadioButton(RB_CONFIG_AUDIO_INTRP_LINEAR);1619 checkRadioButton(RB_CONFIG_AUDIO_INTRP_LINEAR);
1620}1620}
1621 1621
1622void rbConfigAudioIntrpCubic(void)1622void rbConfigAudioIntrpSinc(void)
1623{1623{
1624 config.interpolation = INTERPOLATION_CUBIC;1624 config.interpolation = INTERPOLATION_SINC;
1625 audioSetInterpolationType(config.interpolation);1625 audioSetInterpolationType(config.interpolation);
1626 checkRadioButton(RB_CONFIG_AUDIO_INTRP_CUBIC);1626 checkRadioButton(RB_CONFIG_AUDIO_INTRP_SINC);
1627}1627}
1628 1628
1629void rbConfigAudio44kHz(void)1629void rbConfigAudio44kHz(void)
src/ft2_config.h+2−2
@@ -19,7 +19,7 @@ enum · 18 unmodified lines
19 CONFIG_SHOW_ERRORS = 1,19 CONFIG_SHOW_ERRORS = 1,
20 20
21 INTERPOLATION_NONE = 0,21 INTERPOLATION_NONE = 0,
22 INTERPOLATION_CUBIC = 1,22 INTERPOLATION_SINC = 1,
23 INTERPOLATION_LINEAR = 2,23 INTERPOLATION_LINEAR = 2,
24 24
25 MOUSE_IDLE_SHAPE_NICE = 0,25 MOUSE_IDLE_SHAPE_NICE = 0,
@@ -211,7 +211,7 @@ void rbConfigAudio16bit(void); · 185 unmodified lines
211void rbConfigAudio24bit(void);211void rbConfigAudio24bit(void);
212void rbConfigAudioIntrpNone(void);212void rbConfigAudioIntrpNone(void);
213void rbConfigAudioIntrpLinear(void);213void rbConfigAudioIntrpLinear(void);
214void rbConfigAudioIntrpCubic(void);214void rbConfigAudioIntrpSinc(void);
215void rbConfigAudio44kHz(void);215void rbConfigAudio44kHz(void);
216void rbConfigAudio48kHz(void);216void rbConfigAudio48kHz(void);
217void rbConfigAudio96kHz(void);217void rbConfigAudio96kHz(void);
src/ft2_edit.c+1−1
@@ -963,7 +963,7 @@ void doTranspose(void) · 962 unmodified lines
963 countOverflowingNotes(lastInsMode, lastTranspMode, lastTranspVal);963 countOverflowingNotes(lastInsMode, lastTranspMode, lastTranspVal);
964 if (transpDelNotes > 0)964 if (transpDelNotes > 0)
965 {965 {
966 sprintf(text, "%d note(s) will be erased! Proceed?", transpDelNotes);966 sprintf(text, "%d note(s) will be erased! Proceed?", (int32_t)transpDelNotes);
967 if (okBox(2, "System request", text) != 1)967 if (okBox(2, "System request", text) != 1)
968 return;968 return;
969 }969 }
src/ft2_events.c+1−1
@@ -311,7 +311,7 @@ static LONG WINAPI exceptionHandler(EXCEPTION_POINTERS *ptr) · 310 unmodified lines
311 // find a free filename311 // find a free filename
312 for (i = 1; i < 1000; i++)312 for (i = 1; i < 1000; i++)
313 {313 {
314 sprintf(fileName, "backup%03d.xm", i);314 sprintf(fileName, "backup%03d.xm", (int32_t)i);
315 if (stat(fileName, &statBuffer) != 0)315 if (stat(fileName, &statBuffer) != 0)
316 break; // filename OK316 break; // filename OK
317 }317 }
src/ft2_header.h+3−3
@@ -12,7 +12,7 @@ · 11 unmodified lines
12#endif12#endif
13#include "ft2_replayer.h"13#include "ft2_replayer.h"
14 14
15#define PROG_VER_STR "1.36"15#define PROG_VER_STR "1.37"
16 16
17// do NOT change these! It will only mess things up...17// do NOT change these! It will only mess things up...
18 18
@@ -33,8 +33,8 @@ · 14 unmodified lines
33** branchless in the inner channel mixer loop.33** branchless in the inner channel mixer loop.
34** Warning: Do not change this!34** Warning: Do not change this!
35*/35*/
36#define LOOP_FIX_LEN 836#define LOOP_FIX_LEN 32
37#define SMP_DAT_OFFSET 437#define SMP_DAT_OFFSET 8
38 38
39#ifndef _WIN3239#ifndef _WIN32
40#define _stricmp strcasecmp40#define _stricmp strcasecmp
src/ft2_nibbles.c+8−1
@@ -362,7 +362,14 @@ static void nibblesGenNewNumber(void) · 361 unmodified lines
362 x = rand() % 51;362 x = rand() % 51;
363 y = rand() % 23;363 y = rand() % 23;
364 364
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)
366 {373 {
367 NI_Number++;374 NI_Number++;
368 NI_Screen[x][y] = (uint8_t)(16 + NI_Number);375 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
74 // ------ CONFIG AUDIO ------74 // ------ CONFIG AUDIO ------
75 75
76 // audio buffer size76 // audio buffer size
77 //x, y, w, group, funcOnUp77 //x, y, w, group, funcOnUp
78 { 390, 16, 46, RB_GROUP_CONFIG_SOUND_BUFF_SIZE, rbConfigSbs512 },78 { 390, 16, 46, RB_GROUP_CONFIG_SOUND_BUFF_SIZE, rbConfigSbs512 },
79 { 390, 30, 113, RB_GROUP_CONFIG_SOUND_BUFF_SIZE, rbConfigSbs1024 },79 { 390, 30, 113, RB_GROUP_CONFIG_SOUND_BUFF_SIZE, rbConfigSbs1024 },
80 { 390, 44, 50, RB_GROUP_CONFIG_SOUND_BUFF_SIZE, rbConfigSbs2048 },80 { 390, 44, 50, RB_GROUP_CONFIG_SOUND_BUFF_SIZE, rbConfigSbs2048 },
81 81
82 // audio bit depth82 // audio bit depth
83 //x, y, w, group, funcOnUp83 //x, y, w, group, funcOnUp
84 { 390, 74, 107, RB_GROUP_CONFIG_AUDIO_BIT_DEPTH, rbConfigAudio16bit },84 { 390, 74, 107, RB_GROUP_CONFIG_AUDIO_BIT_DEPTH, rbConfigAudio16bit },
85 { 390, 88, 83, RB_GROUP_CONFIG_AUDIO_BIT_DEPTH, rbConfigAudio24bit },85 { 390, 88, 83, RB_GROUP_CONFIG_AUDIO_BIT_DEPTH, rbConfigAudio24bit },
86 86
87 // audio interpolation87 // audio interpolation
88 //x, y, w, group, funcOnUp88 //x, y, w, group, funcOnUp
89 { 390, 117, 46, RB_GROUP_CONFIG_AUDIO_INTERPOLATION, rbConfigAudioIntrpNone },89 { 390, 117, 46, RB_GROUP_CONFIG_AUDIO_INTERPOLATION, rbConfigAudioIntrpNone },
90 { 390, 131, 91, RB_GROUP_CONFIG_AUDIO_INTERPOLATION, rbConfigAudioIntrpLinear },90 { 390, 131, 91, RB_GROUP_CONFIG_AUDIO_INTERPOLATION, rbConfigAudioIntrpLinear },
91 { 390, 145, 86, RB_GROUP_CONFIG_AUDIO_INTERPOLATION, rbConfigAudioIntrpCubic },91 { 390, 145, 103, RB_GROUP_CONFIG_AUDIO_INTERPOLATION, rbConfigAudioIntrpSinc },
92 92
93 // audio output frequency93 // audio output frequency
94 //x, y, w, group, funcOnUp94 //x, y, w, group, funcOnUp
src/ft2_radiobuttons.h+1−1
@@ -57,7 +57,7 @@ enum // RADIOBUTTONS · 56 unmodified lines
57 // AUDIO INTERPOLATION57 // AUDIO INTERPOLATION
58 RB_CONFIG_AUDIO_INTRP_NONE,58 RB_CONFIG_AUDIO_INTRP_NONE,
59 RB_CONFIG_AUDIO_INTRP_LINEAR,59 RB_CONFIG_AUDIO_INTRP_LINEAR,
60 RB_CONFIG_AUDIO_INTRP_CUBIC,60 RB_CONFIG_AUDIO_INTRP_SINC,
61 61
62 // AUDIO FREQUENCY62 // AUDIO FREQUENCY
63 RB_CONFIG_AUDIO_44KHZ,63 RB_CONFIG_AUDIO_44KHZ,
src/ft2_replayer.c+71−85
@@ -20,7 +20,7 @@ · 19 unmodified lines
20#include "ft2_sample_loader.h"20#include "ft2_sample_loader.h"
21#include "ft2_tables.h"21#include "ft2_tables.h"
22#include "ft2_structs.h"22#include "ft2_structs.h"
23#include "mixer/ft2_cubicspline.h"23#include "mixer/ft2_windowed_sinc.h"
24 24
25/* This is a mess, directly ported from the original FT2 code (with some modifications).25/* This is a mess, directly ported from the original FT2 code (with some modifications).
26** You will experience a lot of headaches if you dig into it...26** You will experience a lot of headaches if you dig into it...
@@ -101,7 +101,7 @@ void resetChannels(void) · 74 unmodified lines
101 {101 {
102 stmTyp *ch = &stm[i];102 stmTyp *ch = &stm[i];
103 103
104 ch->instrSeg = instr[0];104 ch->instrPtr = instr[0];
105 ch->status = IS_Vol;105 ch->status = IS_Vol;
106 ch->oldPan = 128;106 ch->oldPan = 128;
107 ch->outPan = 128;107 ch->outPan = 128;
@@ -293,8 +293,6 @@ static void retrigVolume(stmTyp *ch) · 185 unmodified lines
293 293
294static void retrigEnvelopeVibrato(stmTyp *ch)294static void retrigEnvelopeVibrato(stmTyp *ch)
295{295{
296 instrTyp *ins;
297
298 if (!(ch->waveCtrl & 0x04)) ch->vibPos = 0;296 if (!(ch->waveCtrl & 0x04)) ch->vibPos = 0;
299 if (!(ch->waveCtrl & 0x40)) ch->tremPos = 0;297 if (!(ch->waveCtrl & 0x40)) ch->tremPos = 0;
300 298
@@ -303,7 +301,7 @@ static void retrigEnvelopeVibrato(stmTyp *ch) · 2 unmodified lines
303 301
304 ch->envSustainActive = true;302 ch->envSustainActive = true;
305 303
306 ins = ch->instrSeg;304 instrTyp *ins = ch->instrPtr;
307 assert(ins != NULL);305 assert(ins != NULL);
308 306
309 if (ins->envVTyp & 1)307 if (ins->envVTyp & 1)
@@ -340,22 +338,20 @@ static void retrigEnvelopeVibrato(stmTyp *ch) · 30 unmodified lines
340 338
341void keyOff(stmTyp *ch)339void keyOff(stmTyp *ch)
342{340{
343 instrTyp *ins;
344
345 ch->envSustainActive = false;341 ch->envSustainActive = false;
346 342
347 ins = ch->instrSeg;343 instrTyp *ins = ch->instrPtr;
348 assert(ins != NULL);344 assert(ins != NULL);
349 345
350 if (!(ins->envPTyp & 1)) // yes, FT2 does this (!). Most likely a bug?346 if (!(ins->envPTyp & 1)) // yes, FT2 does this (!). Most likely a bug?
351 {347 {
352 if (ch->envPCnt >= ins->envPP[ch->envPPos][0])348 if (ch->envPCnt >= (uint16_t)ins->envPP[ch->envPPos][0])
353 ch->envPCnt = ins->envPP[ch->envPPos][0] - 1;349 ch->envPCnt = ins->envPP[ch->envPPos][0] - 1;
354 }350 }
355 351
356 if (ins->envVTyp & 1)352 if (ins->envVTyp & 1)
357 {353 {
358 if (ch->envVCnt >= ins->envVP[ch->envVPos][0])354 if (ch->envVCnt >= (uint16_t)ins->envVP[ch->envVPos][0])
359 ch->envVCnt = ins->envVP[ch->envVPos][0] - 1;355 ch->envVCnt = ins->envVP[ch->envVPos][0] - 1;
360 }356 }
361 else357 else
@@ -379,11 +375,11 @@ void calcReplayRate(int32_t audioFreq) · 17 unmodified lines
379 375
380 dHz2MixDeltaMul = (double)MIXER_FRAC_SCALE / audioFreq;376 dHz2MixDeltaMul = (double)MIXER_FRAC_SCALE / audioFreq;
381 audio.quickVolRampSamples = (int32_t)((audioFreq / 200.0) + 0.5); // rounded377 audio.quickVolRampSamples = (int32_t)((audioFreq / 200.0) + 0.5); // rounded
382 audio.fRampQuickVolMul = 1.0f / audio.quickVolRampSamples;378 audio.dRampQuickVolMul = 1.0 / audio.quickVolRampSamples;
383 379
384 audio.dSamplesPerTickTab[0] = 0.0;380 audio.dSamplesPerTickTab[0] = 0.0;
385 audio.tickTimeTab[0] = UINT64_MAX;381 audio.tickTimeTab[0] = UINT64_MAX;
386 audio.fRampTickMulTab[0] = 0.0f;382 audio.dRampTickMulTab[0] = 0.0;
387 383
388 for (int32_t i = MIN_BPM; i <= MAX_BPM; i++)384 for (int32_t i = MIN_BPM; i <= MAX_BPM; i++)
389 {385 {
@@ -402,7 +398,7 @@ void calcReplayRate(int32_t audioFreq) · 12 unmodified lines
402 398
403 // for calculating volume ramp length for tick-lenghted ramps399 // for calculating volume ramp length for tick-lenghted ramps
404 const int32_t samplesPerTick = (int32_t)(dSamplesPerTick + 0.5); // this has to be rounded first400 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;
406 }402 }
407}403}
408 404
@@ -415,11 +411,12 @@ int64_t getMixerDelta(uint16_t period) · 6 unmodified lines
415{411{
416 /* Precision has been tested for most extreme case (Amiga period 1, 44100Hz),412 /* Precision has been tested for most extreme case (Amiga period 1, 44100Hz),
417 ** and there is no precision loss using 64-bit double-precision here, even413 ** 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.
419 */415 */
420 return (int64_t)((dPeriod2Hz(period) * dHz2MixDeltaMul) + 0.5); // Hz -> rounded 32.32 fixed-point mixer delta416 return (int64_t)((dPeriod2Hz(period) * dHz2MixDeltaMul) + 0.5); // Hz -> rounded 32.32 fixed-point mixer delta
421}417}
422 418
419// used for calculating the max safe amount of samples to mix before entering inner mix loop
423uint32_t getRevMixerDelta(uint16_t period)420uint32_t getRevMixerDelta(uint16_t period)
424{421{
425 return revMixDeltaTab[period];422 return revMixDeltaTab[period];
@@ -467,7 +464,7 @@ static void startTone(uint8_t ton, uint8_t effTyp, uint8_t eff, stmTyp *ch) · 41 unmodified lines
467 if (ins == NULL)464 if (ins == NULL)
468 ins = instr[0];465 ins = instr[0];
469 466
470 ch->instrSeg = ins;467 ch->instrPtr = ins;
471 ch->mute = ins->mute;468 ch->mute = ins->mute;
472 469
473 if (ton > 96) // non-FT2 security (should never happen because I clamp in the patt. loader now)470 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
742 bool envUpdate;739 bool envUpdate;
743 int16_t newEnvPos;740 int16_t newEnvPos;
744 741
745 instrTyp *ins = ch->instrSeg;742 instrTyp *ins = ch->instrPtr;
746 assert(ins != NULL);743 assert(ins != NULL);
747 744
748 // *** VOLUME ENVELOPE ***745 // *** VOLUME ENVELOPE ***
@@ -776,10 +773,8 @@ static void setEnvelopePos(stmTyp *ch, uint8_t param) · 27 unmodified lines
776 break;773 break;
777 }774 }
778 775
779 ch->envVIPValue = ((ins->envVP[envPos+1][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]);
780 ch->envVIPValue /= (ins->envVP[envPos+1][0] - ins->envVP[envPos][0]);777 ch->dEnvVAmp = (ch->dEnvVIPValue * (newEnvPos - 1)) + (ins->envVP[envPos][1] & 0xFF);
781
782 ch->envVAmp = (ch->envVIPValue * (newEnvPos - 1)) + ((ins->envVP[envPos][1] & 0xFF) << 8);
783 778
784 envPos++;779 envPos++;
785 780
@@ -796,8 +791,8 @@ static void setEnvelopePos(stmTyp *ch, uint8_t param) · 10 unmodified lines
796 791
797 if (envUpdate)792 if (envUpdate)
798 {793 {
799 ch->envVIPValue = 0;794 ch->dEnvVIPValue = 0.0;
800 ch->envVAmp = (ins->envVP[envPos][1] & 0xFF) << 8;795 ch->dEnvVAmp = (double)(ins->envVP[envPos][1] & 0xFF);
801 }796 }
802 797
803 if (envPos >= ins->envVPAnt)798 if (envPos >= ins->envVPAnt)
@@ -841,10 +836,8 @@ static void setEnvelopePos(stmTyp *ch, uint8_t param) · 37 unmodified lines
841 break;836 break;
842 }837 }
843 838
844 ch->envPIPValue = ((ins->envPP[envPos+1][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]);
845 ch->envPIPValue /= (ins->envPP[envPos+1][0] - ins->envPP[envPos][0]);840 ch->dEnvPAmp = (ch->dEnvPIPValue * (newEnvPos - 1)) + (ins->envPP[envPos][1] & 0xFF);
846
847 ch->envPAmp = (ch->envPIPValue * (newEnvPos - 1)) + ((ins->envPP[envPos][1] & 0xFF) << 8);
848 841
849 envPos++;842 envPos++;
850 843
@@ -861,8 +854,8 @@ static void setEnvelopePos(stmTyp *ch, uint8_t param) · 10 unmodified lines
861 854
862 if (envUpdate)855 if (envUpdate)
863 {856 {
864 ch->envPIPValue = 0;857 ch->dEnvPIPValue = 0.0;
865 ch->envPAmp = (ins->envPP[envPos][1] & 0xFF) << 8;858 ch->dEnvPAmp = (double)(ins->envPP[envPos][1] & 0xFF);
866 }859 }
867 860
868 if (envPos >= ins->envPPAnt)861 if (envPos >= ins->envPPAnt)
@@ -1354,11 +1347,10 @@ static void fixaEnvelopeVibrato(stmTyp *ch) · 485 unmodified lines
1354 bool envInterpolateFlag, envDidInterpolate;1347 bool envInterpolateFlag, envDidInterpolate;
1355 uint8_t envPos;1348 uint8_t envPos;
1356 int16_t autoVibVal;1349 int16_t autoVibVal;
1357 uint16_t tmpPeriod, autoVibAmp, envVal;1350 uint16_t tmpPeriod, autoVibAmp;
1358 float fVol;1351 double dVol, dEnvVal;
1359 instrTyp *ins;
1360 1352
1361 ins = ch->instrSeg;1353 instrTyp *ins = ch->instrPtr;
1362 assert(ins != NULL);1354 assert(ins != NULL);
1363 1355
1364 // *** FADEOUT ***1356 // *** FADEOUT ***
@@ -1381,7 +1373,7 @@ static void fixaEnvelopeVibrato(stmTyp *ch) · 16 unmodified lines
1381 if (!ch->mute)1373 if (!ch->mute)
1382 {1374 {
1383 // *** VOLUME ENVELOPE ***1375 // *** VOLUME ENVELOPE ***
1384 envVal = 0;1376 dEnvVal = 0.0;
1385 if (ins->envVTyp & 1)1377 if (ins->envVTyp & 1)
1386 {1378 {
1387 envDidInterpolate = false;1379 envDidInterpolate = false;
@@ -1389,7 +1381,7 @@ static void fixaEnvelopeVibrato(stmTyp *ch) · 1 unmodified line
1389 1381
1390 if (++ch->envVCnt == ins->envVP[envPos][0])1382 if (++ch->envVCnt == ins->envVP[envPos][0])
1391 {1383 {
1392 ch->envVAmp = ins->envVP[envPos][1] << 8;1384 ch->dEnvVAmp = ins->envVP[envPos][1];
1393 1385
1394 envPos++;1386 envPos++;
1395 if (ins->envVTyp & 4)1387 if (ins->envVTyp & 4)
@@ -1402,7 +1394,7 @@ static void fixaEnvelopeVibrato(stmTyp *ch) · 6 unmodified lines
1402 {1394 {
1403 envPos = ins->envVRepS;1395 envPos = ins->envVRepS;
1404 ch->envVCnt = ins->envVP[envPos][0];1396 ch->envVCnt = ins->envVP[envPos][0];
1405 ch->envVAmp = ins->envVP[envPos][1] << 8;1397 ch->dEnvVAmp = ins->envVP[envPos][1];
1406 }1398 }
1407 }1399 }
1408 1400
@@ -1417,7 +1409,7 @@ static void fixaEnvelopeVibrato(stmTyp *ch) · 8 unmodified lines
1417 if (envPos-1 == ins->envVSust)1409 if (envPos-1 == ins->envVSust)
1418 {1410 {
1419 envPos--;1411 envPos--;
1420 ch->envVIPValue = 0;1412 ch->dEnvVIPValue = 0.0;
1421 envInterpolateFlag = false;1413 envInterpolateFlag = false;
1422 }1414 }
1423 }1415 }
@@ -1426,66 +1418,65 @@ static void fixaEnvelopeVibrato(stmTyp *ch) · 2 unmodified lines
1426 {1418 {
1427 ch->envVPos = envPos;1419 ch->envVPos = envPos;
1428 1420
1429 ch->envVIPValue = 0;1421 ch->dEnvVIPValue = 0.0;
1430 if (ins->envVP[envPos][0] > ins->envVP[envPos-1][0])1422 if (ins->envVP[envPos][0] > ins->envVP[envPos-1][0])
1431 {1423 {
1432 ch->envVIPValue = (ins->envVP[envPos][1] - ins->envVP[envPos-1][1]) << 8;1424 ch->dEnvVIPValue = (double)(ins->envVP[envPos][1] - ins->envVP[envPos-1][1]) / (ins->envVP[envPos][0] - ins->envVP[envPos-1][0]);
1433 ch->envVIPValue /= (ins->envVP[envPos][0] - ins->envVP[envPos-1][0]);
1434 1425
1435 envVal = ch->envVAmp;1426 dEnvVal = ch->dEnvVAmp;
1436 envDidInterpolate = true;1427 envDidInterpolate = true;
1437 }1428 }
1438 }1429 }
1439 }1430 }
1440 else1431 else
1441 {1432 {
1442 ch->envVIPValue = 0;1433 ch->dEnvVIPValue = 0.0;
1443 }1434 }
1444 }1435 }
1445 1436
1446 if (!envDidInterpolate)1437 if (!envDidInterpolate)
1447 {1438 {
1448 ch->envVAmp += ch->envVIPValue;1439 ch->dEnvVAmp += ch->dEnvVIPValue;
1449 1440
1450 envVal = ch->envVAmp;1441 dEnvVal = ch->dEnvVAmp;
1451 if (envVal > 64*256)1442 if (dEnvVal > 64.0)
1452 {1443 {
1453 if (envVal > 128*256)1444 if (dEnvVal > 128.0)
1454 envVal = 64*256;1445 dEnvVal = 64.0;
1455 else1446 else
1456 envVal = 0;1447 dEnvVal = 0.0;
1457 1448
1458 ch->envVIPValue = 0;1449 ch->dEnvVIPValue = 0.0;
1459 }1450 }
1460 }1451 }
1461 1452
1462 fVol = song.globVol * (1.0f / 64.0f);1453 dVol = song.globVol * (1.0 / 64.0);
1463 fVol *= ch->outVol * (1.0f / 64.0f);1454 dVol *= ch->outVol * (1.0 / 64.0);
1464 fVol *= ch->fadeOutAmp * (1.0f / 32768.0f);1455 dVol *= ch->fadeOutAmp * (1.0 / 32768.0);
1465 fVol *= envVal * (1.0f / 16384.0f);1456 dVol *= dEnvVal * (1.0 / 64.0);
1466 1457
1467 ch->status |= IS_Vol; // update vol every tick because vol envelope is enabled1458 ch->status |= IS_Vol; // update vol every tick because vol envelope is enabled
1468 }1459 }
1469 else1460 else
1470 {1461 {
1471 fVol = song.globVol * (1.0f / 64.0f);1462 dVol = song.globVol * (1.0 / 64.0);
1472 fVol *= ch->outVol * (1.0f / 64.0f);1463 dVol *= ch->outVol * (1.0 / 64.0);
1473 fVol *= ch->fadeOutAmp * (1.0f / 32768.0f);1464 dVol *= ch->fadeOutAmp * (1.0 / 32768.0);
1474 }1465 }
1475 1466
1476 if (fVol > 1.0f) // shouldn't happen, but just in case...1467 if (dVol > 1.0) // shouldn't happen, but just in case...
1477 fVol = 1.0f;1468 dVol = 1.0;
1478 1469
1479 ch->fFinalVol = fVol;1470 ch->dFinalVol = dVol;
1480 }1471 }
1481 else1472 else
1482 {1473 {
1483 ch->fFinalVol = 0.0f;1474 ch->dFinalVol = 0.0;
1484 }1475 }
1485 1476
1486 // *** PANNING ENVELOPE ***1477 // *** PANNING ENVELOPE ***
1487 1478
1488 envVal = 0;1479 dEnvVal = 0.0;
1489 if (ins->envPTyp & 1)1480 if (ins->envPTyp & 1)
1490 {1481 {
1491 envDidInterpolate = false;1482 envDidInterpolate = false;
@@ -1493,7 +1484,7 @@ static void fixaEnvelopeVibrato(stmTyp *ch) · 1 unmodified line
1493 1484
1494 if (++ch->envPCnt == ins->envPP[envPos][0])1485 if (++ch->envPCnt == ins->envPP[envPos][0])
1495 {1486 {
1496 ch->envPAmp = ins->envPP[envPos][1] << 8;1487 ch->dEnvPAmp = ins->envPP[envPos][1];
1497 1488
1498 envPos++;1489 envPos++;
1499 if (ins->envPTyp & 4)1490 if (ins->envPTyp & 4)
@@ -1507,7 +1498,7 @@ static void fixaEnvelopeVibrato(stmTyp *ch) · 7 unmodified lines
1507 envPos = ins->envPRepS;1498 envPos = ins->envPRepS;
1508 1499
1509 ch->envPCnt = ins->envPP[envPos][0];1500 ch->envPCnt = ins->envPP[envPos][0];
1510 ch->envPAmp = ins->envPP[envPos][1] << 8;1501 ch->dEnvPAmp = ins->envPP[envPos][1];
1511 }1502 }
1512 }1503 }
1513 1504
@@ -1522,7 +1513,7 @@ static void fixaEnvelopeVibrato(stmTyp *ch) · 8 unmodified lines
1522 if (envPos-1 == ins->envPSust)1513 if (envPos-1 == ins->envPSust)
1523 {1514 {
1524 envPos--;1515 envPos--;
1525 ch->envPIPValue = 0;1516 ch->dEnvPIPValue = 0.0;
1526 envInterpolateFlag = false;1517 envInterpolateFlag = false;
1527 }1518 }
1528 }1519 }
@@ -1531,42 +1522,41 @@ static void fixaEnvelopeVibrato(stmTyp *ch) · 2 unmodified lines
1531 {1522 {
1532 ch->envPPos = envPos;1523 ch->envPPos = envPos;
1533 1524
1534 ch->envPIPValue = 0;1525 ch->dEnvPIPValue = 0.0;
1535 if (ins->envPP[envPos][0] > ins->envPP[envPos-1][0])1526 if (ins->envPP[envPos][0] > ins->envPP[envPos-1][0])
1536 {1527 {
1537 ch->envPIPValue = (ins->envPP[envPos][1] - ins->envPP[envPos-1][1]) << 8;1528 ch->dEnvPIPValue = (double)(ins->envPP[envPos][1] - ins->envPP[envPos-1][1]) / (ins->envPP[envPos][0] - ins->envPP[envPos-1][0]);
1538 ch->envPIPValue /= (ins->envPP[envPos][0] - ins->envPP[envPos-1][0]);
1539 1529
1540 envVal = ch->envPAmp;1530 dEnvVal = ch->dEnvPAmp;
1541 envDidInterpolate = true;1531 envDidInterpolate = true;
1542 }1532 }
1543 }1533 }
1544 }1534 }
1545 else1535 else
1546 {1536 {
1547 ch->envPIPValue = 0;1537 ch->dEnvPIPValue = 0.0;
1548 }1538 }
1549 }1539 }
1550 1540
1551 if (!envDidInterpolate)1541 if (!envDidInterpolate)
1552 {1542 {
1553 ch->envPAmp += ch->envPIPValue;1543 ch->dEnvPAmp += ch->dEnvPIPValue;
1554 1544
1555 envVal = ch->envPAmp;1545 dEnvVal = ch->dEnvPAmp;
1556 if (envVal > 64*256)1546 if (dEnvVal > 64.0)
1557 {1547 {
1558 if (envVal > 128*256)1548 if (dEnvVal > 128.0)
1559 envVal = 64*256;1549 dEnvVal = 64.0;
1560 else1550 else
1561 envVal = 0;1551 dEnvVal = 0.0;
1562 1552
1563 ch->envPIPValue = 0;1553 ch->dEnvPIPValue = 0.0;
1564 }1554 }
1565 }1555 }
1566 1556
1567 const int32_t panTmp = 128 - ABS(ch->outPan - 128);1557 const int32_t panTmp = 128 - ABS(ch->outPan - 128);
1568 const int32_t panEnv = (int32_t)envVal - (32*256); // -8192..79361558 const double dPanEnv = dEnvVal - 32.0;
1569 const int32_t panAdd = (int32_t)roundf((panTmp * panEnv) * (1.0f / 8192.0f)); // -128..1241559 const int32_t panAdd = (int32_t)round((panTmp * dPanEnv) * (1.0 / 32.0)); // -128..124
1570 ch->finalPan = (uint8_t)CLAMP(ch->outPan + panAdd, 0, 255);1560 ch->finalPan = (uint8_t)CLAMP(ch->outPan + panAdd, 0, 255);
1571 1561
1572 ch->status |= IS_Pan; // update pan every tick because pan envelope is enabled1562 ch->status |= IS_Pan; // update pan every tick because pan envelope is enabled
@@ -2809,7 +2799,7 @@ void closeReplayer(void) · 1236 unmodified lines
2809 instr[131] = NULL;2799 instr[131] = NULL;
2810 }2800 }
2811 2801
2812 freeCubicTable();2802 freeWindowedSincTables();
2813}2803}
2814 2804
2815bool setupReplayer(void)2805bool setupReplayer(void)
@@ -2839,7 +2829,7 @@ bool setupReplayer(void) · 23 unmodified lines
2839 audio.linearFreqTable = true;2829 audio.linearFreqTable = true;
2840 note2Period = linearPeriods;2830 note2Period = linearPeriods;
2841 2831
2842 calcCubicTable();2832 calcWindowedSincTables();
2843 calcPeriod2HzTable();2833 calcPeriod2HzTable();
2844 calcRevMixDeltaTable();2834 calcRevMixDeltaTable();
2845 calcPanningTable();2835 calcPanningTable();
@@ -2916,10 +2906,6 @@ void stopPlaying(void) · 70 unmodified lines
2916 // safely kills all voices2906 // safely kills all voices
2917 lockMixerCallback();2907 lockMixerCallback();
2918 unlockMixerCallback();2908 unlockMixerCallback();
2919
2920 // prevent getFrequenceValue() from calculating the rates forever
2921 for (i = 0; i < MAX_VOICES; i++)
2922 stm[i].outPeriod = 0;
2923 }2909 }
2924 else2910 else
2925 {2911 {
@@ -3154,12 +3140,12 @@ void stopVoices(void) · 228 unmodified lines
3154 ch->tonTyp = 0;3140 ch->tonTyp = 0;
3155 ch->relTonNr = 0;3141 ch->relTonNr = 0;
3156 ch->instrNr = 0;3142 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)
3158 ch->status = IS_Vol;3144 ch->status = IS_Vol;
3159 ch->realVol = 0;3145 ch->realVol = 0;
3160 ch->outVol = 0;3146 ch->outVol = 0;
3161 ch->oldVol = 0;3147 ch->oldVol = 0;
3162 ch->fFinalVol = 0.0f;3148 ch->dFinalVol = 0.0;
3163 ch->oldPan = 128;3149 ch->oldPan = 128;
3164 ch->outPan = 128;3150 ch->outPan = 128;
3165 ch->finalPan = 128;3151 ch->finalPan = 128;
src/ft2_replayer.h+9−10
@@ -3,9 +3,7 @@ · 2 unmodified lines
3#include <stdint.h>3#include <stdint.h>
4#include <stdbool.h>4#include <stdbool.h>
5#include "ft2_unicode.h"5#include "ft2_unicode.h"
6 6#include "mixer/ft2_windowed_sinc.h"
7// cubic spline requires 2 extra samples in the future to be read
8#define NUM_FIXED_TAP_SAMPLES 2
9 7
10enum8enum
11{9{
@@ -175,7 +173,8 @@ typedef struct sampleTyp_t · 163 unmodified lines
175 bool fixed;173 bool fixed;
176 int8_t fine, relTon, *pek, *origPek;174 int8_t fine, relTon, *pek, *origPek;
177 uint8_t vol, typ, pan;175 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];
179 int32_t fixedPos, len, repS, repL;178 int32_t fixedPos, len, repS, repL;
180} sampleTyp;179} sampleTyp;
181 180
@@ -207,14 +206,14 @@ typedef struct stmTyp_t · 25 unmodified lines
207 uint8_t portaUpSpeed, portaDownSpeed, retrigSpeed, retrigCnt, retrigVol;206 uint8_t portaUpSpeed, portaDownSpeed, retrigSpeed, retrigCnt, retrigVol;
208 uint8_t volKolVol, tonNr, envPPos, eVibPos, envVPos, realVol, oldVol, outVol;207 uint8_t volKolVol, tonNr, envPPos, eVibPos, envVPos, realVol, oldVol, outVol;
209 uint8_t oldPan, outPan, finalPan;208 uint8_t oldPan, outPan, finalPan;
210 int16_t midiPitch, envVIPValue, envPIPValue;209 int16_t midiPitch;
211 uint16_t outPeriod, realPeriod, finalPeriod, tonTyp, wantPeriod, portaSpeed;210 uint16_t outPeriod, realPeriod, finalPeriod, tonTyp, wantPeriod, portaSpeed;
212 uint16_t envVCnt, envVAmp, envPCnt, envPAmp, eVibAmp, eVibSweep;211 uint16_t envVCnt, envPCnt, eVibAmp, eVibSweep;
213 uint16_t fadeOutAmp, fadeOutSpeed, midiVibDepth;212 uint16_t fadeOutAmp, fadeOutSpeed, midiVibDepth;
214 float fFinalVol;213 double dEnvVIPValue, dEnvPIPValue, dEnvVAmp, dEnvPAmp, dFinalVol;
215 int32_t smpStartPos;214 int32_t oldFinalPeriod, smpStartPos;
216 sampleTyp *smpPtr;215 sampleTyp *smpPtr;
217 instrTyp *instrSeg;216 instrTyp *instrPtr;
218} stmTyp;217} stmTyp;
219 218
220typedef struct songTyp_t219typedef struct songTyp_t
@@ -241,7 +240,7 @@ typedef struct syncedChannel_t // used for audio/video sync queue · 20 unmodified lines
241 uint8_t status, sampleNr, instrNr;240 uint8_t status, sampleNr, instrNr;
242 uint16_t finalPeriod;241 uint16_t finalPeriod;
243 int32_t smpStartPos;242 int32_t smpStartPos;
244 float fFinalVol;243 double dFinalVol;
245} syncedChannel_t;244} syncedChannel_t;
246 245
247void setNewSongPos(int32_t pos);246void setNewSongPos(int32_t pos);
src/ft2_sample_ed.c+225−35
@@ -27,6 +27,7 @@ · 26 unmodified lines
27#include "ft2_diskop.h"27#include "ft2_diskop.h"
28#include "ft2_keyboard.h"28#include "ft2_keyboard.h"
29#include "ft2_structs.h"29#include "ft2_structs.h"
30#include "mixer/ft2_windowed_sinc.h" // SINC_TAPS, SINC_NEGATIVE_TAPS
30 31
31static const char sharpNote1Char[12] = { 'C', 'C', 'D', 'D', 'E', 'F', 'F', 'G', 'G', 'A', 'A', 'B' };32static const char sharpNote1Char[12] = { 'C', 'C', 'D', 'D', 'E', 'F', 'F', 'G', 'G', 'A', 'A', 'B' };
32static const char sharpNote2Char[12] = { '-', '#', '-', '#', '-', '-', '#', '-', '#', '-', '#', '-' };33static const char sharpNote2Char[12] = { '-', '#', '-', '#', '-', '-', '#', '-', '#', '-', '#', '-' };
@@ -57,6 +58,9 @@ sampleTyp *getCurSample(void) · 24 unmodified lines
57// modifies samples before index 0, and after loop/end (for branchless mixer interpolation (kinda))58// modifies samples before index 0, and after loop/end (for branchless mixer interpolation (kinda))
58void fixSample(sampleTyp *s)59void fixSample(sampleTyp *s)
59{60{
61 int32_t pos;
62 bool backwards;
63
60 assert(s != NULL);64 assert(s != NULL);
61 if (s->origPek == NULL || s->pek == NULL)65 if (s->origPek == NULL || s->pek == NULL)
62 {66 {
@@ -88,37 +92,46 @@ void fixSample(sampleTyp *s) · 25 unmodified lines
88 return; // empty sample92 return; // empty sample
89 }93 }
90 94
91 // disable loop if loopLen == 0 (FT2 does this)95 // treat loop as disabled if loopLen == 0 (FT2 does this)
92 if (loopType != 0 && loopLen == 0)96 if (loopType != 0 && loopLen <= 0)
93 {97 {
94 loopType = 0;98 loopType = 0;
95 loopStart = loopLen = loopEnd = 0;99 loopStart = loopLen = loopEnd = 0;
96 }100 }
97 101
98 /* The first and second tap (-1, 0) should be the same at sampling position #0102 /* All negative taps should be equal to the first sample point when at sampling
99 ** (at sample trigger), until an eventual loop cycle, where the -1 tap has a103 ** position #0 (on sample trigger), until an eventual loop cycle, where we do
100 ** special case in the mixer.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.
101 */107 */
102 if (sample16Bit)108 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 }
104 else113 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 }
106 118
119 // no loop
107 if (loopType == 0)120 if (loopType == 0)
108 {121 {
109 // no loop
110 if (sample16Bit)122 if (sample16Bit)
111 {123 {
112 for (int32_t i = 0; i < NUM_FIXED_TAP_SAMPLES; i++)124 for (int32_t i = 0; i < SINC_RIGHT_TAPS; i++)
113 ptr16[len+i] = ptr16[len-1];125 ptr16[len+i] = ptr16[len-1];
114 }126 }
115 else127 else
116 {128 {
117 for (int32_t i = 0; i < NUM_FIXED_TAP_SAMPLES; i++)129 for (int32_t i = 0; i < SINC_RIGHT_TAPS; i++)
118 s->pek[len+i] = s->pek[len-1];130 s->pek[len+i] = s->pek[len-1];
119 }131 }
120 132
121 s->fixedPos = 0;133 s->fixedPos = 0; // this value is not used for non-looping samples, set to zero
134
122 s->fixed = false; // no fixed samples inside actual sample data135 s->fixed = false; // no fixed samples inside actual sample data
123 return;136 return;
124 }137 }
@@ -126,13 +139,18 @@ void fixSample(sampleTyp *s) · 1 unmodified line
126 if (s->fixed)139 if (s->fixed)
127 return; // already fixed140 return; // already fixed
128 141
129 s->fixedPos = loopStart + loopLen;142 s->fixedPos = loopEnd;
143 s->fixed = true;
130 144
131 if (loopLen == 1) // too short for interpolation kernel size, fix in a different way145 // special-case for loop-lengt of 1
146 if (loopLen == 1)
132 {147 {
133 if (sample16Bit)148 if (sample16Bit)
134 {149 {
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++)
136 {154 {
137 s->fixedSmp[i] = ptr16[loopEnd+i];155 s->fixedSmp[i] = ptr16[loopEnd+i];
138 ptr16[loopEnd+i] = ptr16[loopStart];156 ptr16[loopEnd+i] = ptr16[loopStart];
@@ -140,14 +158,16 @@ void fixSample(sampleTyp *s) · 1 unmodified line
140 }158 }
141 else159 else
142 {160 {
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++)
144 {165 {
145 s->fixedSmp[i] = s->pek[loopEnd+i];166 s->fixedSmp[i] = s->pek[loopEnd+i];
146 s->pek[loopEnd+i] = s->pek[loopStart];167 s->pek[loopEnd+i] = s->pek[loopStart];
147 }168 }
148 }169 }
149 170
150 s->fixed = true;
151 return;171 return;
152 }172 }
153 173
@@ -156,18 +176,54 @@ void fixSample(sampleTyp *s) · 2 unmodified lines
156 // forward loop176 // forward loop
157 if (sample16Bit)177 if (sample16Bit)
158 {178 {
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++)
160 {198 {
161 s->fixedSmp[i] = ptr16[loopEnd+i];199 s->fixedSmp[i] = ptr16[loopEnd+i];
162 ptr16[loopEnd+i] = ptr16[loopStart+i];200 ptr16[loopEnd+i] = ptr16[loopStart + (i % loopLen)];
163 }201 }
164 }202 }
165 else203 else
166 {204 {
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++)
168 {224 {
169 s->fixedSmp[i] = s->pek[loopEnd+i];225 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)];
171 }227 }
172 }228 }
173 }229 }
@@ -176,25 +232,159 @@ void fixSample(sampleTyp *s) · 2 unmodified lines
176 // pingpong loop232 // pingpong loop
177 if (sample16Bit)233 if (sample16Bit)
178 {234 {
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++)
180 {288 {
181 s->fixedSmp[i] = ptr16[loopEnd+i];289 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 }
183 }308 }
184 }309 }
185 else310 else
186 {311 {
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++)
188 {365 {
189 s->fixedSmp[i] = s->pek[loopEnd+i];366 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 }
191 }385 }
192 }386 }
193 }387 }
194
195 // -1 tap (right before loopStart) on forward/pingpong loops are handled in the mixer
196
197 s->fixed = true;
198}388}
199 389
200// restores interpolation tap samples after loop/end390// restores interpolation tap samples after loop/end
@@ -208,14 +398,14 @@ void restoreSample(sampleTyp *s) · 7 unmodified lines
208 {398 {
209 // 16-bit sample399 // 16-bit sample
210 int16_t *ptr16 = (int16_t *)s->pek + s->fixedPos;400 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++)
212 ptr16[i] = s->fixedSmp[i];402 ptr16[i] = s->fixedSmp[i];
213 }403 }
214 else404 else
215 {405 {
216 // 8-bit sample406 // 8-bit sample
217 int8_t *ptr8 = s->pek + s->fixedPos;407 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++)
219 ptr8[i] = (int8_t)s->fixedSmp[i];409 ptr8[i] = (int8_t)s->fixedSmp[i];
220 }410 }
221 411
@@ -594,7 +784,7 @@ static int8_t getScaledSample(sampleTyp *s, int32_t index) // for drawing sample · 372 unmodified lines
594 ptr16 = (int16_t *)s->pek;784 ptr16 = (int16_t *)s->pek;
595 785
596 // don't read fixed mixer interpolation samples, read the prestine ones instead786 // 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)
598 tmp32 = s->fixedSmp[index-s->fixedPos];788 tmp32 = s->fixedSmp[index-s->fixedPos];
599 else789 else
600 tmp32 = ptr16[index];790 tmp32 = ptr16[index];
@@ -604,7 +794,7 @@ static int8_t getScaledSample(sampleTyp *s, int32_t index) // for drawing sample · 3 unmodified lines
604 else794 else
605 {795 {
606 // don't read fixed mixer interpolation samples, read the prestine ones instead796 // 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)
608 tmp32 = s->fixedSmp[index-s->fixedPos];798 tmp32 = s->fixedSmp[index-s->fixedPos];
609 else799 else
610 tmp32 = s->pek[index];800 tmp32 = s->pek[index];
@@ -897,7 +1087,7 @@ static void getSpecialMinMax16(sampleTyp *s, int32_t index, int32_t scanEnd, int · 286 unmodified lines
897 }1087 }
898 1088
899 // read fixed samples1089 // read fixed samples
900 int32_t tmpScanEnd = index+NUM_FIXED_TAP_SAMPLES;1090 int32_t tmpScanEnd = index+SINC_RIGHT_TAPS;
901 if (tmpScanEnd > scanEnd)1091 if (tmpScanEnd > scanEnd)
902 tmpScanEnd = scanEnd;1092 tmpScanEnd = scanEnd;
903 1093
@@ -939,7 +1129,7 @@ static void getSpecialMinMax8(sampleTyp *s, int32_t index, int32_t scanEnd, int8 · 35 unmodified lines
939 }1129 }
940 1130
941 // read fixed samples1131 // read fixed samples
942 int32_t tmpScanEnd = index+NUM_FIXED_TAP_SAMPLES;1132 int32_t tmpScanEnd = index+SINC_RIGHT_TAPS;
943 if (tmpScanEnd > scanEnd)1133 if (tmpScanEnd > scanEnd)
944 tmpScanEnd = scanEnd;1134 tmpScanEnd = scanEnd;
945 1135
@@ -989,7 +1179,7 @@ static void getSampleDataPeak(sampleTyp *s, int32_t index, int32_t numSamples, i · 43 unmodified lines
989 /* If the scan area is including the fixed samples (for branchless mixer interpolation),1179 /* If the scan area is including the fixed samples (for branchless mixer interpolation),
990 ** do a special procedure to scan the original non-touched samples when needed.1180 ** do a special procedure to scan the original non-touched samples when needed.
991 */1181 */
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;
993 if (insideRange || (index < s->fixedPos && scanEnd >= s->fixedPos))1183 if (insideRange || (index < s->fixedPos && scanEnd >= s->fixedPos))
994 {1184 {
995 if (s->typ & 16)1185 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
70 if (fixedPos >= (uint32_t)s->len)70 if (fixedPos >= (uint32_t)s->len)
71 return;71 return;
72 72
73 uint32_t bytesToWrite = NUM_FIXED_TAP_SAMPLES * (sample16Bit+1);73 uint32_t bytesToWrite = SINC_RIGHT_TAPS * (sample16Bit+1);
74 if (fixedPos+bytesToWrite > (uint32_t)s->len)74 if (fixedPos+bytesToWrite > (uint32_t)s->len)
75 bytesToWrite = s->len - fixedPos;75 bytesToWrite = s->len - fixedPos;
76 76
src/ft2_scopes.c+2−2
@@ -99,7 +99,7 @@ static void setChannel(int32_t nr, bool on) · 98 unmodified lines
99 ch->realVol = 0;99 ch->realVol = 0;
100 ch->outVol = 0;100 ch->outVol = 0;
101 ch->oldVol = 0;101 ch->oldVol = 0;
102 ch->fFinalVol = 0.0f;102 ch->dFinalVol = 0.0;
103 ch->outPan = 128;103 ch->outPan = 128;
104 ch->oldPan = 128;104 ch->oldPan = 128;
105 ch->finalPan = 128;105 ch->finalPan = 128;
@@ -533,7 +533,7 @@ void handleScopesFromChQueue(chSyncData_t *chSyncData, uint8_t *scopeUpdateStatu · 427 unmodified lines
533 status = scopeUpdateStatus[i];533 status = scopeUpdateStatus[i];
534 534
535 if (status & IS_Vol)535 if (status & IS_Vol)
536 sc->vol = (int32_t)((ch->fFinalVol * SCOPE_HEIGHT) + 0.5f); // rounded536 sc->vol = (int32_t)((ch->dFinalVol * SCOPE_HEIGHT) + 0.5); // rounded
537 537
538 if (status & IS_Period)538 if (status & IS_Period)
539 {539 {
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
256 memcpy(tmpInst, &instr[1], MAX_INST * sizeof (instr[0]));256 memcpy(tmpInst, &instr[1], MAX_INST * sizeof (instr[0]));
257 257
258 memset(&instr[1], 0, numInsts * sizeof (instr[0]));258 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?
260 260
261 for (i = 0; i < numInsts; i++)261 for (i = 0; i < numInsts; i++)
262 {262 {
src/helpdata/FT2.HLP+1−1
@@ -785,7 +785,7 @@ you exit the program. · 784 unmodified lines
785Selects what type of resampling interpolation to use.785Selects what type of resampling interpolation to use.
786"None" uses no interpolation (nearest neighbor), which will result in786"None" uses no interpolation (nearest neighbor), which will result in
787aliasing (noise) in the sound. "Linear" is what real FT2 uses, which is a787aliasing (noise) in the sound. "Linear" is what real FT2 uses, which is a
788mediocre interpolation type. "Cubic spline" is the recommended setting788mediocre interpolation type. "Windowed-sinc" is the recommended setting
789for the best audio quality, although it may sometimes sound too filtered789for the best audio quality, although it may sometimes sound too filtered
790on low-quality samples (f.ex. Amiga MODs).790on low-quality samples (f.ex. Amiga MODs).
791 791
src/helpdata/ft2_help_data.h+440−440
@@ -3,9 +3,9 @@ · 2 unmodified lines
3 3
4#include <stdint.h>4#include <stdint.h>
5 5
6#define HELP_DATA_LEN 269836#define HELP_DATA_LEN 26984
7 7
8const uint8_t helpData[26983] =8const uint8_t helpData[26984] =
9{9{
10 0x4C,0x3B,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,10 0x4C,0x3B,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,
11 0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,11 0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,
@@ -1793,469 +1793,469 @@ const uint8_t helpData[26983] = · 1781 unmodified lines
1793 0x20,0x22,0x4C,0x69,0x6E,0x65,0x61,0x72,0x22,0x20,0x69,0x73,1793 0x20,0x22,0x4C,0x69,0x6E,0x65,0x61,0x72,0x22,0x20,0x69,0x73,
1794 0x20,0x77,0x68,0x61,0x74,0x20,0x72,0x65,0x61,0x6C,0x20,0x46,1794 0x20,0x77,0x68,0x61,0x74,0x20,0x72,0x65,0x61,0x6C,0x20,0x46,
1795 0x54,0x32,0x20,0x75,0x73,0x65,0x73,0x2C,0x20,0x77,0x68,0x69,1795 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,
1797 0x6F,0x63,0x72,0x65,0x20,0x69,0x6E,0x74,0x65,0x72,0x70,0x6F,1797 0x6F,0x63,0x72,0x65,0x20,0x69,0x6E,0x74,0x65,0x72,0x70,0x6F,
1798 0x6C,0x61,0x74,0x69,0x6F,0x6E,0x20,0x74,0x79,0x70,0x65,0x2E,1798 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,1799 0x20,0x22,0x57,0x69,0x6E,0x64,0x6F,0x77,0x65,0x64,0x2D,0x73,
1800 0x6E,0x65,0x22,0x20,0x69,0x73,0x20,0x74,0x68,0x65,0x20,0x72,1800 0x69,0x6E,0x63,0x22,0x20,0x69,0x73,0x20,0x74,0x68,0x65,0x20,
1801 0x65,0x63,0x6F,0x6D,0x6D,0x65,0x6E,0x64,0x65,0x64,0x20,0x73,1801 0x72,0x65,0x63,0x6F,0x6D,0x6D,0x65,0x6E,0x64,0x65,0x64,0x20,
1802 0x65,0x74,0x74,0x69,0x6E,0x67,0x48,0x66,0x6F,0x72,0x20,0x74,1802 0x73,0x65,0x74,0x74,0x69,0x6E,0x67,0x48,0x66,0x6F,0x72,0x20,
1803 0x68,0x65,0x20,0x62,0x65,0x73,0x74,0x20,0x61,0x75,0x64,0x69,1803 0x74,0x68,0x65,0x20,0x62,0x65,0x73,0x74,0x20,0x61,0x75,0x64,
1804 0x6F,0x20,0x71,0x75,0x61,0x6C,0x69,0x74,0x79,0x2C,0x20,0x61,1804 0x69,0x6F,0x20,0x71,0x75,0x61,0x6C,0x69,0x74,0x79,0x2C,0x20,
1805 0x6C,0x74,0x68,0x6F,0x75,0x67,0x68,0x20,0x69,0x74,0x20,0x6D,1805 0x61,0x6C,0x74,0x68,0x6F,0x75,0x67,0x68,0x20,0x69,0x74,0x20,
1806 0x61,0x79,0x20,0x73,0x6F,0x6D,0x65,0x74,0x69,0x6D,0x65,0x73,1806 0x6D,0x61,0x79,0x20,0x73,0x6F,0x6D,0x65,0x74,0x69,0x6D,0x65,
1807 0x20,0x73,0x6F,0x75,0x6E,0x64,0x20,0x74,0x6F,0x6F,0x20,0x66,1807 0x73,0x20,0x73,0x6F,0x75,0x6E,0x64,0x20,0x74,0x6F,0x6F,0x20,
1808 0x69,0x6C,0x74,0x65,0x72,0x65,0x64,0x2A,0x6F,0x6E,0x20,0x6C,1808 0x66,0x69,0x6C,0x74,0x65,0x72,0x65,0x64,0x2A,0x6F,0x6E,0x20,
1809 0x6F,0x77,0x2D,0x71,0x75,0x61,0x6C,0x69,0x74,0x79,0x20,0x73,1809 0x6C,0x6F,0x77,0x2D,0x71,0x75,0x61,0x6C,0x69,0x74,0x79,0x20,
1810 0x61,0x6D,0x70,0x6C,0x65,0x73,0x20,0x28,0x66,0x2E,0x65,0x78,1810 0x73,0x61,0x6D,0x70,0x6C,0x65,0x73,0x20,0x28,0x66,0x2E,0x65,
1811 0x2E,0x20,0x41,0x6D,0x69,0x67,0x61,0x20,0x4D,0x4F,0x44,0x73,1811 0x78,0x2E,0x20,0x41,0x6D,0x69,0x67,0x61,0x20,0x4D,0x4F,0x44,
1812 0x29,0x2E,0x00,0x1A,0x3E,0x40,0x58,0x30,0x34,0x30,0x40,0x43,1812 0x73,0x29,0x2E,0x00,0x1A,0x3E,0x40,0x58,0x30,0x34,0x30,0x40,
1813 0x30,0x30,0x31,0x56,0x6F,0x6C,0x75,0x6D,0x65,0x20,0x72,0x61,1813 0x43,0x30,0x30,0x31,0x56,0x6F,0x6C,0x75,0x6D,0x65,0x20,0x72,
1814 0x6D,0x70,0x69,0x6E,0x67,0x3A,0x0B,0x3E,0x40,0x58,0x30,0x36,1814 0x61,0x6D,0x70,0x69,0x6E,0x67,0x3A,0x0B,0x3E,0x40,0x58,0x30,
1815 0x30,0x40,0x43,0x30,0x30,0x32,0x3B,0x45,0x6E,0x61,0x62,0x6C,1815 0x36,0x30,0x40,0x43,0x30,0x30,0x32,0x3B,0x45,0x6E,0x61,0x62,
1816 0x65,0x73,0x20,0x74,0x68,0x65,0x20,0x61,0x6E,0x74,0x69,0x2D,1816 0x6C,0x65,0x73,0x20,0x74,0x68,0x65,0x20,0x61,0x6E,0x74,0x69,
1817 0x63,0x6C,0x69,0x63,0x6B,0x20,0x73,0x79,0x73,0x74,0x65,0x6D,1817 0x2D,0x63,0x6C,0x69,0x63,0x6B,0x20,0x73,0x79,0x73,0x74,0x65,
1818 0x20,0x69,0x6E,0x20,0x74,0x68,0x65,0x20,0x61,0x75,0x64,0x69,1818 0x6D,0x20,0x69,0x6E,0x20,0x74,0x68,0x65,0x20,0x61,0x75,0x64,
1819 0x6F,0x20,0x6D,0x69,0x78,0x65,0x72,0x20,0x28,0x46,0x54,0x32,1819 0x69,0x6F,0x20,0x6D,0x69,0x78,0x65,0x72,0x20,0x28,0x46,0x54,
1820 0x2E,0x30,0x38,0x2B,0x29,0x2E,0x3B,0x50,0x6C,0x65,0x61,0x73,1820 0x32,0x2E,0x30,0x38,0x2B,0x29,0x2E,0x3B,0x50,0x6C,0x65,0x61,
1821 0x65,0x20,0x6E,0x6F,0x74,0x65,0x20,0x74,0x68,0x61,0x74,0x20,1821 0x73,0x65,0x20,0x6E,0x6F,0x74,0x65,0x20,0x74,0x68,0x61,0x74,
1822 0x6F,0x72,0x69,0x67,0x69,0x6E,0x61,0x6C,0x20,0x46,0x54,0x32,1822 0x20,0x6F,0x72,0x69,0x67,0x69,0x6E,0x61,0x6C,0x20,0x46,0x54,
1823 0x20,0x63,0x61,0x6E,0x27,0x74,0x20,0x6C,0x6F,0x61,0x64,0x20,1823 0x32,0x20,0x63,0x61,0x6E,0x27,0x74,0x20,0x6C,0x6F,0x61,0x64,
1824 0x74,0x68,0x69,0x73,0x20,0x63,0x6F,0x6E,0x66,0x69,0x67,0x20,1824 0x20,0x74,0x68,0x69,0x73,0x20,0x63,0x6F,0x6E,0x66,0x69,0x67,
1825 0x65,0x6E,0x74,0x72,0x79,0x2C,0x0B,0x63,0x6C,0x6F,0x6E,0x65,1825 0x20,0x65,0x6E,0x74,0x72,0x79,0x2C,0x0B,0x63,0x6C,0x6F,0x6E,
1826 0x20,0x6F,0x6E,0x6C,0x79,0x2E,0x00,0x19,0x3E,0x40,0x58,0x30,1826 0x65,0x20,0x6F,0x6E,0x6C,0x79,0x2E,0x00,0x19,0x3E,0x40,0x58,
1827 0x34,0x30,0x40,0x43,0x30,0x30,0x31,0x41,0x6D,0x70,0x6C,0x69,1827 0x30,0x34,0x30,0x40,0x43,0x30,0x30,0x31,0x41,0x6D,0x70,0x6C,
1828 0x66,0x69,0x63,0x61,0x74,0x69,0x6F,0x6E,0x3A,0x0B,0x3E,0x40,1828 0x69,0x66,0x69,0x63,0x61,0x74,0x69,0x6F,0x6E,0x3A,0x0B,0x3E,
1829 0x58,0x30,0x36,0x30,0x40,0x43,0x30,0x30,0x32,0x46,0x41,0x6D,1829 0x40,0x58,0x30,0x36,0x30,0x40,0x43,0x30,0x30,0x32,0x46,0x41,
1830 0x70,0x6C,0x69,0x66,0x69,0x65,0x73,0x20,0x74,0x68,0x65,0x20,1830 0x6D,0x70,0x6C,0x69,0x66,0x69,0x65,0x73,0x20,0x74,0x68,0x65,
1831 0x76,0x6F,0x6C,0x75,0x6D,0x65,0x20,0x77,0x68,0x65,0x6E,0x20,1831 0x20,0x76,0x6F,0x6C,0x75,0x6D,0x65,0x20,0x77,0x68,0x65,0x6E,
1832 0x6D,0x69,0x78,0x69,0x6E,0x67,0x2E,0x20,0x49,0x66,0x20,0x79,1832 0x20,0x6D,0x69,0x78,0x69,0x6E,0x67,0x2E,0x20,0x49,0x66,0x20,
1833 0x6F,0x75,0x20,0x73,0x65,0x74,0x20,0x74,0x68,0x69,0x73,0x20,1833 0x79,0x6F,0x75,0x20,0x73,0x65,0x74,0x20,0x74,0x68,0x69,0x73,
1834 0x6F,0x6E,0x65,0x20,0x74,0x6F,0x6F,0x20,0x68,0x69,0x67,0x68,1834 0x20,0x6F,0x6E,0x65,0x20,0x74,0x6F,0x6F,0x20,0x68,0x69,0x67,
1835 0x2C,0x20,0x79,0x6F,0x75,0x27,0x6C,0x6C,0x3A,0x67,0x65,0x74,1835 0x68,0x2C,0x20,0x79,0x6F,0x75,0x27,0x6C,0x6C,0x3A,0x67,0x65,
1836 0x20,0x64,0x69,0x73,0x74,0x6F,0x72,0x74,0x69,0x6F,0x6E,0x2E,1836 0x74,0x20,0x64,0x69,0x73,0x74,0x6F,0x72,0x74,0x69,0x6F,0x6E,
1837 0x20,0x33,0x32,0x58,0x20,0x65,0x71,0x75,0x61,0x6C,0x73,0x20,1837 0x2E,0x20,0x33,0x32,0x58,0x20,0x65,0x71,0x75,0x61,0x6C,0x73,
1838 0x66,0x75,0x6C,0x6C,0x20,0x61,0x6D,0x70,0x6C,0x69,0x74,0x75,1838 0x20,0x66,0x75,0x6C,0x6C,0x20,0x61,0x6D,0x70,0x6C,0x69,0x74,
1839 0x64,0x65,0x20,0x66,0x6F,0x72,0x20,0x6F,0x6E,0x65,0x20,0x63,1839 0x75,0x64,0x65,0x20,0x66,0x6F,0x72,0x20,0x6F,0x6E,0x65,0x20,
1840 0x68,0x61,0x6E,0x6E,0x65,0x6C,0x2E,0x00,0x1B,0x3E,0x40,0x58,1840 0x63,0x68,0x61,0x6E,0x6E,0x65,0x6C,0x2E,0x00,0x1B,0x3E,0x40,
1841 0x30,0x34,0x30,0x40,0x43,0x30,0x30,0x31,0x46,0x72,0x65,0x71,1841 0x58,0x30,0x34,0x30,0x40,0x43,0x30,0x30,0x31,0x46,0x72,0x65,
1842 0x75,0x65,0x6E,0x63,0x79,0x20,0x74,0x61,0x62,0x6C,0x65,0x3A,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,
1843 0x0B,0x3E,0x40,0x58,0x30,0x36,0x30,0x40,0x43,0x30,0x30,0x32,1868 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,1869 0x41,0x49,0x66,0x20,0x79,0x6F,0x75,0x20,0x75,0x73,0x65,0x20,
1845 0x66,0x72,0x65,0x71,0x75,0x65,0x6E,0x63,0x79,0x20,0x74,0x61,1870 0x70,0x61,0x74,0x74,0x65,0x72,0x6E,0x73,0x20,0x74,0x68,0x61,
1846 0x62,0x6C,0x65,0x20,0x6D,0x61,0x6B,0x65,0x73,0x20,0x61,0x6C,1871 0x74,0x20,0x61,0x72,0x65,0x20,0x6C,0x6F,0x6E,0x67,0x65,0x72,
1847 0x6C,0x20,0x70,0x69,0x74,0x63,0x68,0x20,0x62,0x65,0x6E,0x64,1872 0x20,0x74,0x68,0x61,0x6E,0x20,0x39,0x39,0x20,0x6C,0x69,0x6E,
1848 0x73,0x20,0x72,0x75,0x6E,0x20,0x69,0x6E,0x20,0x63,0x6F,0x6E,1873 0x65,0x73,0x2C,0x20,0x79,0x6F,0x75,0x20,0x73,0x68,0x6F,0x75,
1849 0x73,0x74,0x61,0x6E,0x74,0x3F,0x73,0x70,0x65,0x65,0x64,0x2C,1874 0x6C,0x64,0x20,0x75,0x73,0x65,0x45,0x68,0x65,0x78,0x20,0x63,
1850 0x20,0x69,0x6E,0x64,0x65,0x70,0x65,0x6E,0x64,0x65,0x6E,0x74,1875 0x6F,0x75,0x6E,0x74,0x69,0x6E,0x67,0x20,0x73,0x69,0x6E,0x63,
1851 0x20,0x6F,0x66,0x20,0x74,0x68,0x65,0x20,0x63,0x75,0x72,0x72,1876 0x65,0x20,0x74,0x68,0x65,0x72,0x65,0x20,0x61,0x72,0x65,0x20,
1852 0x65,0x6E,0x74,0x20,0x66,0x72,0x65,0x71,0x75,0x65,0x6E,0x63,1877 0x6F,0x6E,0x6C,0x79,0x20,0x32,0x20,0x64,0x69,0x67,0x69,0x74,
1853 0x79,0x2E,0x20,0x49,0x66,0x20,0x79,0x6F,0x75,0x20,0x73,0x77,1878 0x73,0x20,0x69,0x6E,0x20,0x74,0x68,0x65,0x20,0x6C,0x69,0x6E,
1854 0x69,0x74,0x63,0x68,0x20,0x74,0x68,0x69,0x73,0x41,0x6F,0x6E,1879 0x65,0x20,0x6E,0x75,0x6D,0x62,0x65,0x72,0x20,0x63,0x6F,0x6C,
1855 0x65,0x2C,0x20,0x6F,0x6E,0x20,0x61,0x20,0x66,0x69,0x6E,0x69,1880 0x75,0x6D,0x6E,0x2E,0x00,0x12,0x3E,0x40,0x58,0x30,0x34,0x30,
1856 0x73,0x68,0x65,0x64,0x20,0x73,0x6F,0x6E,0x67,0x2C,0x20,0x69,1881 0x40,0x43,0x30,0x30,0x31,0x53,0x63,0x6F,0x70,0x65,0x73,0x3A,
1857 0x74,0x20,0x6D,0x69,0x67,0x68,0x74,0x20,0x73,0x6F,0x75,0x6E,1882 0x0B,0x3E,0x40,0x58,0x30,0x36,0x30,0x40,0x43,0x30,0x30,0x32,
1858 0x64,0x20,0x73,0x74,0x72,0x61,0x6E,0x67,0x65,0x20,0x69,0x66,1883 0x43,0x22,0x53,0x74,0x64,0x2E,0x22,0x20,0x28,0x73,0x74,0x61,
1859 0x20,0x74,0x68,0x65,0x20,0x73,0x6F,0x75,0x6E,0x64,0x20,0x75,1884 0x6E,0x64,0x61,0x72,0x64,0x29,0x20,0x77,0x69,0x6C,0x6C,0x20,
1860 0x73,0x65,0x73,0x0D,0x70,0x6F,0x72,0x74,0x61,0x6D,0x65,0x6E,1885 0x73,0x68,0x6F,0x77,0x20,0x74,0x68,0x65,0x20,0x73,0x61,0x6D,
1861 0x74,0x6F,0x65,0x73,0x2E,0x00,0x20,0x40,0x58,0x30,0x32,0x30,1886 0x70,0x6C,0x65,0x20,0x70,0x6F,0x69,0x6E,0x74,0x73,0x20,0x61,
1862 0x40,0x43,0x30,0x30,0x31,0x43,0x6F,0x6E,0x66,0x69,0x67,0x75,1887 0x73,0x20,0x70,0x69,0x78,0x65,0x6C,0x73,0x20,0x28,0x6C,0x69,
1863 0x72,0x61,0x74,0x69,0x6F,0x6E,0x2C,0x20,0x4C,0x61,0x79,0x6F,1888 0x6B,0x65,0x20,0x46,0x54,0x32,0x29,0x2E,0x41,0x22,0x4C,0x69,
1864 0x75,0x74,0x3A,0x01,0x3E,0x29,0x3E,0x40,0x58,0x30,0x34,0x30,1889 0x6E,0x65,0x64,0x22,0x20,0x77,0x69,0x6C,0x6C,0x20,0x64,0x72,
1865 0x40,0x43,0x30,0x30,0x31,0x50,0x61,0x74,0x74,0x65,0x72,0x6E,1890 0x61,0x77,0x20,0x6C,0x69,0x6E,0x65,0x73,0x20,0x62,0x65,0x74,
1866 0x20,0x6C,0x61,0x79,0x6F,0x75,0x74,0x2C,0x20,0x68,0x65,0x78,1891 0x77,0x65,0x65,0x6E,0x20,0x74,0x68,0x65,0x20,0x70,0x6F,0x69,
1867 0x20,0x6E,0x75,0x6D,0x62,0x65,0x72,0x69,0x6E,0x67,0x3A,0x0B,1892 0x6E,0x74,0x73,0x2C,0x20,0x6C,0x69,0x6B,0x65,0x20,0x61,0x6E,
1868 0x3E,0x40,0x58,0x30,0x36,0x30,0x40,0x43,0x30,0x30,0x32,0x41,1893 0x20,0x6F,0x73,0x63,0x69,0x6C,0x6C,0x6F,0x73,0x63,0x6F,0x70,
1869 0x49,0x66,0x20,0x79,0x6F,0x75,0x20,0x75,0x73,0x65,0x20,0x70,1894 0x65,0x2E,0x00,0x27,0x40,0x58,0x30,0x32,0x30,0x40,0x43,0x30,
1870 0x61,0x74,0x74,0x65,0x72,0x6E,0x73,0x20,0x74,0x68,0x61,0x74,1895 0x30,0x31,0x43,0x6F,0x6E,0x66,0x69,0x67,0x75,0x72,0x61,0x74,
1871 0x20,0x61,0x72,0x65,0x20,0x6C,0x6F,0x6E,0x67,0x65,0x72,0x20,1896 0x69,0x6F,0x6E,0x2C,0x20,0x4D,0x69,0x73,0x63,0x65,0x6C,0x6C,
1872 0x74,0x68,0x61,0x6E,0x20,0x39,0x39,0x20,0x6C,0x69,0x6E,0x65,1897 0x61,0x6E,0x65,0x6F,0x75,0x73,0x3A,0x01,0x3E,0x15,0x3E,0x40,
1873 0x73,0x2C,0x20,0x79,0x6F,0x75,0x20,0x73,0x68,0x6F,0x75,0x6C,1898 0x58,0x30,0x34,0x30,0x40,0x43,0x30,0x30,0x31,0x56,0x53,0x79,
1874 0x64,0x20,0x75,0x73,0x65,0x45,0x68,0x65,0x78,0x20,0x63,0x6F,1899 0x6E,0x63,0x20,0x6F,0x66,0x66,0x3A,0x0B,0x3E,0x40,0x58,0x30,
1875 0x75,0x6E,0x74,0x69,0x6E,0x67,0x20,0x73,0x69,0x6E,0x63,0x65,1900 0x36,0x30,0x40,0x43,0x30,0x30,0x32,0x3F,0x54,0x65,0x6C,0x6C,
1876 0x20,0x74,0x68,0x65,0x72,0x65,0x20,0x61,0x72,0x65,0x20,0x6F,1901 0x73,0x20,0x74,0x68,0x65,0x20,0x70,0x72,0x6F,0x67,0x72,0x61,
1877 0x6E,0x6C,0x79,0x20,0x32,0x20,0x64,0x69,0x67,0x69,0x74,0x73,1902 0x6D,0x20,0x74,0x6F,0x20,0x6E,0x6F,0x74,0x20,0x75,0x73,0x65,
1878 0x20,0x69,0x6E,0x20,0x74,0x68,0x65,0x20,0x6C,0x69,0x6E,0x65,1903 0x20,0x56,0x53,0x79,0x6E,0x63,0x20,0x66,0x6F,0x72,0x20,0x76,
1879 0x20,0x6E,0x75,0x6D,0x62,0x65,0x72,0x20,0x63,0x6F,0x6C,0x75,1904 0x69,0x64,0x65,0x6F,0x2E,0x20,0x49,0x66,0x20,0x79,0x6F,0x75,
1880 0x6D,0x6E,0x2E,0x00,0x12,0x3E,0x40,0x58,0x30,0x34,0x30,0x40,1905 0x72,0x20,0x6D,0x6F,0x6E,0x69,0x74,0x6F,0x72,0x27,0x73,0x40,
1881 0x43,0x30,0x30,0x31,0x53,0x63,0x6F,0x70,0x65,0x73,0x3A,0x0B,1906 0x72,0x65,0x66,0x72,0x65,0x73,0x68,0x20,0x72,0x61,0x74,0x65,
1882 0x3E,0x40,0x58,0x30,0x36,0x30,0x40,0x43,0x30,0x30,0x32,0x43,1907 0x20,0x69,0x73,0x20,0x6E,0x6F,0x74,0x20,0x36,0x30,0x48,0x7A,
1883 0x22,0x53,0x74,0x64,0x2E,0x22,0x20,0x28,0x73,0x74,0x61,0x6E,1908 0x20,0x28,0x6F,0x72,0x20,0x35,0x39,0x48,0x7A,0x29,0x2C,0x20,
1884 0x64,0x61,0x72,0x64,0x29,0x20,0x77,0x69,0x6C,0x6C,0x20,0x73,1909 0x74,0x68,0x65,0x6E,0x20,0x56,0x53,0x79,0x6E,0x63,0x20,0x69,
1885 0x68,0x6F,0x77,0x20,0x74,0x68,0x65,0x20,0x73,0x61,0x6D,0x70,1910 0x73,0x20,0x61,0x6C,0x77,0x61,0x79,0x73,0x20,0x6F,0x66,0x66,
1886 0x6C,0x65,0x20,0x70,0x6F,0x69,0x6E,0x74,0x73,0x20,0x61,0x73,1911 0x20,0x66,0x6F,0x72,0x45,0x74,0x68,0x69,0x73,0x20,0x70,0x72,
1887 0x20,0x70,0x69,0x78,0x65,0x6C,0x73,0x20,0x28,0x6C,0x69,0x6B,1912 0x6F,0x67,0x72,0x61,0x6D,0x2E,0x20,0x4E,0x6F,0x74,0x20,0x68,
1888 0x65,0x20,0x46,0x54,0x32,0x29,0x2E,0x41,0x22,0x4C,0x69,0x6E,1913 0x61,0x76,0x69,0x6E,0x67,0x20,0x56,0x53,0x79,0x6E,0x63,0x20,
1889 0x65,0x64,0x22,0x20,0x77,0x69,0x6C,0x6C,0x20,0x64,0x72,0x61,1914 0x77,0x69,0x6C,0x6C,0x20,0x72,0x65,0x73,0x75,0x6C,0x74,0x20,
1890 0x77,0x20,0x6C,0x69,0x6E,0x65,0x73,0x20,0x62,0x65,0x74,0x77,1915 0x69,0x6E,0x20,0x6C,0x65,0x73,0x73,0x20,0x69,0x6E,0x70,0x75,
1891 0x65,0x65,0x6E,0x20,0x74,0x68,0x65,0x20,0x70,0x6F,0x69,0x6E,1916 0x74,0x2F,0x76,0x69,0x64,0x65,0x6F,0x20,0x64,0x65,0x6C,0x61,
1892 0x74,0x73,0x2C,0x20,0x6C,0x69,0x6B,0x65,0x20,0x61,0x6E,0x20,1917 0x79,0x2C,0x1E,0x62,0x75,0x74,0x20,0x61,0x6C,0x73,0x6F,0x20,
1893 0x6F,0x73,0x63,0x69,0x6C,0x6C,0x6F,0x73,0x63,0x6F,0x70,0x65,1918 0x70,0x6F,0x74,0x65,0x6E,0x74,0x69,0x61,0x6C,0x20,0x73,0x74,
1894 0x2E,0x00,0x27,0x40,0x58,0x30,0x32,0x30,0x40,0x43,0x30,0x30,1919 0x75,0x74,0x74,0x65,0x72,0x69,0x6E,0x67,0x2E,0x01,0x20,0x18,
1895 0x31,0x43,0x6F,0x6E,0x66,0x69,0x67,0x75,0x72,0x61,0x74,0x69,1920 0x3E,0x40,0x58,0x30,0x34,0x30,0x40,0x43,0x30,0x30,0x31,0x50,
1896 0x6F,0x6E,0x2C,0x20,0x4D,0x69,0x73,0x63,0x65,0x6C,0x6C,0x61,1921 0x69,0x78,0x65,0x6C,0x20,0x66,0x69,0x6C,0x74,0x65,0x72,0x3A,
1897 0x6E,0x65,0x6F,0x75,0x73,0x3A,0x01,0x3E,0x15,0x3E,0x40,0x58,1922 0x0B,0x3E,0x40,0x58,0x30,0x36,0x30,0x40,0x43,0x30,0x30,0x32,
1898 0x30,0x34,0x30,0x40,0x43,0x30,0x30,0x31,0x56,0x53,0x79,0x6E,1923 0x43,0x41,0x70,0x70,0x6C,0x69,0x65,0x73,0x20,0x61,0x20,0x73,
1899 0x63,0x20,0x6F,0x66,0x66,0x3A,0x0B,0x3E,0x40,0x58,0x30,0x36,1924 0x75,0x62,0x70,0x69,0x78,0x65,0x6C,0x20,0x66,0x69,0x6C,0x74,
1900 0x30,0x40,0x43,0x30,0x30,0x32,0x3F,0x54,0x65,0x6C,0x6C,0x73,1925 0x65,0x72,0x20,0x74,0x68,0x61,0x74,0x20,0x69,0x73,0x20,0x75,
1901 0x20,0x74,0x68,0x65,0x20,0x70,0x72,0x6F,0x67,0x72,0x61,0x6D,1926 0x73,0x65,0x64,0x20,0x77,0x68,0x65,0x6E,0x20,0x74,0x68,0x65,
1902 0x20,0x74,0x6F,0x20,0x6E,0x6F,0x74,0x20,0x75,0x73,0x65,0x20,1927 0x20,0x77,0x69,0x6E,0x64,0x6F,0x77,0x20,0x69,0x73,0x20,0x75,
1903 0x56,0x53,0x79,0x6E,0x63,0x20,0x66,0x6F,0x72,0x20,0x76,0x69,1928 0x70,0x73,0x63,0x61,0x6C,0x65,0x64,0x2E,0x43,0x54,0x68,0x69,
1904 0x64,0x65,0x6F,0x2E,0x20,0x49,0x66,0x20,0x79,0x6F,0x75,0x72,1929 0x73,0x20,0x61,0x6C,0x73,0x6F,0x20,0x6D,0x61,0x6B,0x65,0x73,
1905 0x20,0x6D,0x6F,0x6E,0x69,0x74,0x6F,0x72,0x27,0x73,0x40,0x72,1930 0x20,0x66,0x75,0x6C,0x6C,0x73,0x63,0x72,0x65,0x65,0x6E,0x20,
1906 0x65,0x66,0x72,0x65,0x73,0x68,0x20,0x72,0x61,0x74,0x65,0x20,1931 0x6D,0x6F,0x64,0x65,0x20,0x63,0x6F,0x6D,0x70,0x6C,0x65,0x74,
1907 0x69,0x73,0x20,0x6E,0x6F,0x74,0x20,0x36,0x30,0x48,0x7A,0x20,1932 0x65,0x6C,0x79,0x20,0x73,0x74,0x72,0x65,0x74,0x63,0x68,0x20,
1908 0x28,0x6F,0x72,0x20,0x35,0x39,0x48,0x7A,0x29,0x2C,0x20,0x74,1933 0x6F,0x75,0x74,0x20,0x69,0x66,0x20,0x69,0x74,0x20,0x64,0x69,
1909 0x68,0x65,0x6E,0x20,0x56,0x53,0x79,0x6E,0x63,0x20,0x69,0x73,1934 0x64,0x6E,0x27,0x74,0x44,0x61,0x6C,0x72,0x65,0x61,0x64,0x79,
1910 0x20,0x61,0x6C,0x77,0x61,0x79,0x73,0x20,0x6F,0x66,0x66,0x20,1935 0x2E,0x20,0x50,0x6C,0x65,0x61,0x73,0x65,0x20,0x6B,0x65,0x65,
1911 0x66,0x6F,0x72,0x45,0x74,0x68,0x69,0x73,0x20,0x70,0x72,0x6F,1936 0x70,0x20,0x69,0x6E,0x20,0x6D,0x69,0x6E,0x64,0x20,0x74,0x68,
1912 0x67,0x72,0x61,0x6D,0x2E,0x20,0x4E,0x6F,0x74,0x20,0x68,0x61,1937 0x61,0x74,0x20,0x74,0x68,0x69,0x73,0x20,0x77,0x69,0x6C,0x6C,
1913 0x76,0x69,0x6E,0x67,0x20,0x56,0x53,0x79,0x6E,0x63,0x20,0x77,1938 0x20,0x6D,0x61,0x6B,0x65,0x20,0x70,0x69,0x78,0x65,0x6C,0x73,
1914 0x69,0x6C,0x6C,0x20,0x72,0x65,0x73,0x75,0x6C,0x74,0x20,0x69,1939 0x20,0x6C,0x6F,0x6F,0x6B,0x20,0x62,0x6C,0x75,0x72,0x72,0x79,
1915 0x6E,0x20,0x6C,0x65,0x73,0x73,0x20,0x69,0x6E,0x70,0x75,0x74,1940 0x2E,0x00,0x23,0x40,0x58,0x30,0x32,0x30,0x40,0x43,0x30,0x30,
1916 0x2F,0x76,0x69,0x64,0x65,0x6F,0x20,0x64,0x65,0x6C,0x61,0x79,1941 0x31,0x41,0x64,0x76,0x61,0x6E,0x63,0x65,0x64,0x20,0x65,0x64,
1917 0x2C,0x1E,0x62,0x75,0x74,0x20,0x61,0x6C,0x73,0x6F,0x20,0x70,1942 0x69,0x74,0x20,0x66,0x75,0x6E,0x63,0x74,0x69,0x6F,0x6E,0x73,
1918 0x6F,0x74,0x65,0x6E,0x74,0x69,0x61,0x6C,0x20,0x73,0x74,0x75,1943 0x3A,0x20,0x01,0x3E,0x1E,0x3E,0x40,0x58,0x30,0x34,0x30,0x40,
1919 0x74,0x74,0x65,0x72,0x69,0x6E,0x67,0x2E,0x01,0x20,0x18,0x3E,1944 0x43,0x30,0x30,0x31,0x43,0x6F,0x70,0x79,0x2F,0x50,0x61,0x73,
1920 0x40,0x58,0x30,0x34,0x30,0x40,0x43,0x30,0x30,0x31,0x50,0x69,1945 0x74,0x65,0x20,0x6D,0x61,0x73,0x6B,0x69,0x6E,0x67,0x3A,0x0B,
1921 0x78,0x65,0x6C,0x20,0x66,0x69,0x6C,0x74,0x65,0x72,0x3A,0x0B,1946 0x3E,0x40,0x58,0x30,0x36,0x30,0x40,0x43,0x30,0x30,0x32,0x37,
1922 0x3E,0x40,0x58,0x30,0x36,0x30,0x40,0x43,0x30,0x30,0x32,0x43,1947 0x54,0x68,0x65,0x20,0x6D,0x61,0x73,0x6B,0x69,0x6E,0x67,0x20,
1923 0x41,0x70,0x70,0x6C,0x69,0x65,0x73,0x20,0x61,0x20,0x73,0x75,1948 0x69,0x73,0x20,0x75,0x73,0x65,0x64,0x20,0x66,0x6F,0x72,0x20,
1924 0x62,0x70,0x69,0x78,0x65,0x6C,0x20,0x66,0x69,0x6C,0x74,0x65,1949 0x63,0x6F,0x70,0x79,0x69,0x6E,0x67,0x2F,0x70,0x61,0x73,0x74,
1925 0x72,0x20,0x74,0x68,0x61,0x74,0x20,0x69,0x73,0x20,0x75,0x73,1950 0x69,0x6E,0x67,0x20,0x6F,0x6E,0x6C,0x79,0x20,0x70,0x61,0x72,
1926 0x65,0x64,0x20,0x77,0x68,0x65,0x6E,0x20,0x74,0x68,0x65,0x20,1951 0x74,0x73,0x20,0x6F,0x66,0x20,0x61,0x46,0x22,0x6E,0x6F,0x74,
1927 0x77,0x69,0x6E,0x64,0x6F,0x77,0x20,0x69,0x73,0x20,0x75,0x70,1952 0x65,0x2D,0x63,0x65,0x6C,0x6C,0x22,0x2E,0x20,0x54,0x68,0x65,
1928 0x73,0x63,0x61,0x6C,0x65,0x64,0x2E,0x43,0x54,0x68,0x69,0x73,1953 0x20,0x64,0x69,0x66,0x66,0x65,0x72,0x65,0x6E,0x74,0x20,0x70,
1929 0x20,0x61,0x6C,0x73,0x6F,0x20,0x6D,0x61,0x6B,0x65,0x73,0x20,1954 0x61,0x72,0x74,0x73,0x20,0x6F,0x66,0x20,0x61,0x20,0x22,0x6E,
1930 0x66,0x75,0x6C,0x6C,0x73,0x63,0x72,0x65,0x65,0x6E,0x20,0x6D,1955 0x6F,0x74,0x65,0x2D,0x63,0x65,0x6C,0x6C,0x22,0x20,0x69,0x73,
1931 0x6F,0x64,0x65,0x20,0x63,0x6F,0x6D,0x70,0x6C,0x65,0x74,0x65,1956 0x20,0x4E,0x6F,0x74,0x65,0x2C,0x20,0x49,0x6E,0x73,0x74,0x72,
1932 0x6C,0x79,0x20,0x73,0x74,0x72,0x65,0x74,0x63,0x68,0x20,0x6F,1957 0x2E,0x20,0x6E,0x72,0x2E,0x2C,0x20,0x56,0x6F,0x6C,0x75,0x6D,
1933 0x75,0x74,0x20,0x69,0x66,0x20,0x69,0x74,0x20,0x64,0x69,0x64,1958 0x65,0x2C,0x20,0x45,0x66,0x66,0x65,0x63,0x74,0x20,0x6E,0x72,
1934 0x6E,0x27,0x74,0x44,0x61,0x6C,0x72,0x65,0x61,0x64,0x79,0x2E,1959 0x20,0x26,0x20,0x45,0x66,0x66,0x65,0x63,0x74,0x20,0x64,0x61,
1935 0x20,0x50,0x6C,0x65,0x61,0x73,0x65,0x20,0x6B,0x65,0x65,0x70,1960 0x74,0x61,0x2E,0x34,0x3E,0x41,0x73,0x20,0x79,0x6F,0x75,0x20,
1936 0x20,0x69,0x6E,0x20,0x6D,0x69,0x6E,0x64,0x20,0x74,0x68,0x61,1961 0x63,0x61,0x6E,0x20,0x73,0x65,0x65,0x20,0x69,0x6E,0x20,0x74,
1937 0x74,0x20,0x74,0x68,0x69,0x73,0x20,0x77,0x69,0x6C,0x6C,0x20,1962 0x68,0x65,0x20,0x77,0x69,0x6E,0x64,0x6F,0x77,0x20,0x74,0x68,
1938 0x6D,0x61,0x6B,0x65,0x20,0x70,0x69,0x78,0x65,0x6C,0x73,0x20,1963 0x65,0x72,0x65,0x20,0x61,0x72,0x65,0x20,0x33,0x20,0x63,0x6F,
1939 0x6C,0x6F,0x6F,0x6B,0x20,0x62,0x6C,0x75,0x72,0x72,0x79,0x2E,1964 0x6C,0x75,0x6D,0x6E,0x73,0x20,0x6F,0x66,0x3D,0x22,0x65,0x6E,
1940 0x00,0x23,0x40,0x58,0x30,0x32,0x30,0x40,0x43,0x30,0x30,0x31,1965 0x61,0x62,0x6C,0x65,0x2F,0x64,0x69,0x73,0x61,0x62,0x6C,0x65,
1941 0x41,0x64,0x76,0x61,0x6E,0x63,0x65,0x64,0x20,0x65,0x64,0x69,1966 0x20,0x62,0x75,0x74,0x74,0x6F,0x6E,0x73,0x22,0x20,0x77,0x68,
1942 0x74,0x20,0x66,0x75,0x6E,0x63,0x74,0x69,0x6F,0x6E,0x73,0x3A,1967 0x69,0x63,0x68,0x20,0x68,0x61,0x73,0x20,0x74,0x68,0x65,0x20,
1943 0x20,0x01,0x3E,0x1E,0x3E,0x40,0x58,0x30,0x34,0x30,0x40,0x43,1968 0x6C,0x65,0x74,0x74,0x65,0x72,0x73,0x20,0x43,0x2C,0x50,0x20,
1944 0x30,0x30,0x31,0x43,0x6F,0x70,0x79,0x2F,0x50,0x61,0x73,0x74,1969 0x26,0x20,0x54,0x20,0x61,0x62,0x6F,0x76,0x65,0x2E,0x45,0x3E,
1945 0x65,0x20,0x6D,0x61,0x73,0x6B,0x69,0x6E,0x67,0x3A,0x0B,0x3E,1970 0x43,0x20,0x6D,0x65,0x61,0x6E,0x73,0x20,0x63,0x6F,0x70,0x79,
1946 0x40,0x58,0x30,0x36,0x30,0x40,0x43,0x30,0x30,0x32,0x37,0x54,1971 0x2C,0x20,0x69,0x74,0x20,0x63,0x6F,0x6E,0x74,0x72,0x6F,0x6C,
1947 0x68,0x65,0x20,0x6D,0x61,0x73,0x6B,0x69,0x6E,0x67,0x20,0x69,1972 0x73,0x20,0x77,0x68,0x69,0x63,0x68,0x20,0x70,0x61,0x72,0x74,
1948 0x73,0x20,0x75,0x73,0x65,0x64,0x20,0x66,0x6F,0x72,0x20,0x63,1973 0x73,0x20,0x74,0x68,0x61,0x74,0x20,0x67,0x6F,0x65,0x73,0x20,
1949 0x6F,0x70,0x79,0x69,0x6E,0x67,0x2F,0x70,0x61,0x73,0x74,0x69,1974 0x69,0x6E,0x74,0x6F,0x20,0x74,0x68,0x65,0x20,0x63,0x6F,0x70,
1950 0x6E,0x67,0x20,0x6F,0x6E,0x6C,0x79,0x20,0x70,0x61,0x72,0x74,1975 0x79,0x62,0x75,0x66,0x66,0x65,0x72,0x2E,0x3E,0x3E,0x50,0x20,
1951 0x73,0x20,0x6F,0x66,0x20,0x61,0x46,0x22,0x6E,0x6F,0x74,0x65,1976 0x6D,0x65,0x61,0x6E,0x73,0x20,0x70,0x61,0x73,0x74,0x65,0x20,
1952 0x2D,0x63,0x65,0x6C,0x6C,0x22,0x2E,0x20,0x54,0x68,0x65,0x20,1977 0x61,0x6E,0x64,0x20,0x63,0x6F,0x6E,0x74,0x72,0x6F,0x6C,0x73,
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,
1972 0x20,0x77,0x68,0x69,0x63,0x68,0x20,0x70,0x61,0x72,0x74,0x73,1978 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,1979 0x20,0x74,0x68,0x61,0x74,0x20,0x67,0x6F,0x65,0x73,0x20,0x6F,
1974 0x6E,0x74,0x6F,0x20,0x74,0x68,0x65,0x20,0x63,0x6F,0x70,0x79,1980 0x75,0x74,0x20,0x66,0x72,0x6F,0x6D,0x20,0x74,0x68,0x65,0x0B,
1975 0x62,0x75,0x66,0x66,0x65,0x72,0x2E,0x3E,0x3E,0x50,0x20,0x6D,1981 0x63,0x6F,0x70,0x79,0x62,0x75,0x66,0x66,0x65,0x72,0x2E,0x45,
1976 0x65,0x61,0x6E,0x73,0x20,0x70,0x61,0x73,0x74,0x65,0x20,0x61,1982 0x3E,0x54,0x20,0x6D,0x65,0x61,0x6E,0x73,0x20,0x74,0x72,0x61,
1977 0x6E,0x64,0x20,0x63,0x6F,0x6E,0x74,0x72,0x6F,0x6C,0x73,0x20,1983 0x6E,0x73,0x70,0x61,0x72,0x65,0x6E,0x63,0x79,0x2E,0x20,0x49,
1978 0x77,0x68,0x69,0x63,0x68,0x20,0x70,0x61,0x72,0x74,0x73,0x20,1984 0x66,0x20,0x69,0x74,0x27,0x73,0x20,0x65,0x6E,0x61,0x62,0x6C,
1979 0x74,0x68,0x61,0x74,0x20,0x67,0x6F,0x65,0x73,0x20,0x6F,0x75,1985 0x65,0x64,0x2C,0x20,0x74,0x68,0x65,0x20,0x70,0x61,0x73,0x74,
1980 0x74,0x20,0x66,0x72,0x6F,0x6D,0x20,0x74,0x68,0x65,0x0B,0x63,1986 0x69,0x6E,0x67,0x20,0x64,0x6F,0x65,0x73,0x6E,0x27,0x74,0x20,
1981 0x6F,0x70,0x79,0x62,0x75,0x66,0x66,0x65,0x72,0x2E,0x45,0x3E,1987 0x6F,0x76,0x65,0x72,0x77,0x72,0x69,0x74,0x65,0x3D,0x64,0x61,
1982 0x54,0x20,0x6D,0x65,0x61,0x6E,0x73,0x20,0x74,0x72,0x61,0x6E,1988 0x74,0x61,0x20,0x77,0x69,0x74,0x68,0x20,0x6E,0x69,0x6C,0x2D,
1983 0x73,0x70,0x61,0x72,0x65,0x6E,0x63,0x79,0x2E,0x20,0x49,0x66,1989 0x69,0x6E,0x66,0x6F,0x72,0x6D,0x61,0x74,0x69,0x6F,0x6E,0x2C,
1984 0x20,0x69,0x74,0x27,0x73,0x20,0x65,0x6E,0x61,0x62,0x6C,0x65,1990 0x20,0x6F,0x6E,0x6C,0x79,0x20,0x77,0x69,0x74,0x68,0x20,0x61,
1985 0x64,0x2C,0x20,0x74,0x68,0x65,0x20,0x70,0x61,0x73,0x74,0x69,1991 0x20,0x6E,0x6F,0x74,0x65,0x20,0x6F,0x72,0x20,0x61,0x20,0x6E,
1986 0x6E,0x67,0x20,0x64,0x6F,0x65,0x73,0x6E,0x27,0x74,0x20,0x6F,1992 0x75,0x6D,0x62,0x65,0x72,0x20,0x3C,0x3E,0x20,0x30,0x2E,0x01,
1987 0x76,0x65,0x72,0x77,0x72,0x69,0x74,0x65,0x3D,0x64,0x61,0x74,1993 0x3E,0x40,0x3E,0x54,0x68,0x65,0x20,0x63,0x75,0x74,0x20,0x66,
1988 0x61,0x20,0x77,0x69,0x74,0x68,0x20,0x6E,0x69,0x6C,0x2D,0x69,1994 0x75,0x6E,0x63,0x74,0x69,0x6F,0x6E,0x73,0x20,0x77,0x6F,0x72,
1989 0x6E,0x66,0x6F,0x72,0x6D,0x61,0x74,0x69,0x6F,0x6E,0x2C,0x20,1995 0x6B,0x73,0x20,0x6C,0x69,0x6B,0x65,0x20,0x70,0x61,0x73,0x74,
1990 0x6F,0x6E,0x6C,0x79,0x20,0x77,0x69,0x74,0x68,0x20,0x61,0x20,1996 0x69,0x6E,0x67,0x20,0x77,0x69,0x74,0x68,0x20,0x7A,0x65,0x72,
1991 0x6E,0x6F,0x74,0x65,0x20,0x6F,0x72,0x20,0x61,0x20,0x6E,0x75,1997 0x6F,0x2D,0x64,0x61,0x74,0x61,0x2E,0x20,0x54,0x68,0x69,0x73,
1992 0x6D,0x62,0x65,0x72,0x20,0x3C,0x3E,0x20,0x30,0x2E,0x01,0x3E,1998 0x20,0x6D,0x65,0x61,0x6E,0x73,0x3B,0x74,0x68,0x61,0x74,0x20,
1993 0x40,0x3E,0x54,0x68,0x65,0x20,0x63,0x75,0x74,0x20,0x66,0x75,1999 0x74,0x68,0x65,0x20,0x63,0x75,0x74,0x74,0x69,0x6E,0x67,0x20,
1994 0x6E,0x63,0x74,0x69,0x6F,0x6E,0x73,0x20,0x77,0x6F,0x72,0x6B,2000 0x69,0x73,0x20,0x63,0x6F,0x6E,0x74,0x72,0x6F,0x6C,0x6C,0x65,
1995 0x73,0x20,0x6C,0x69,0x6B,0x65,0x20,0x70,0x61,0x73,0x74,0x69,2001 0x64,0x20,0x77,0x69,0x74,0x68,0x20,0x50,0x2D,0x63,0x6F,0x6C,
1996 0x6E,0x67,0x20,0x77,0x69,0x74,0x68,0x20,0x7A,0x65,0x72,0x6F,2002 0x75,0x6D,0x6E,0x20,0x28,0x6F,0x72,0x20,0x54,0x2D,0x63,0x6F,
1997 0x2D,0x64,0x61,0x74,0x61,0x2E,0x20,0x54,0x68,0x69,0x73,0x20,2003 0x6C,0x75,0x6D,0x6E,0x29,0x2E,0x3C,0x3E,0x57,0x68,0x65,0x6E,
1998 0x6D,0x65,0x61,0x6E,0x73,0x3B,0x74,0x68,0x61,0x74,0x20,0x74,2004 0x20,0x79,0x6F,0x75,0x20,0x63,0x6F,0x70,0x79,0x20,0x64,0x61,
1999 0x68,0x65,0x20,0x63,0x75,0x74,0x74,0x69,0x6E,0x67,0x20,0x69,2005 0x74,0x61,0x20,0x77,0x69,0x74,0x68,0x20,0x6D,0x61,0x73,0x6B,
2000 0x73,0x20,0x63,0x6F,0x6E,0x74,0x72,0x6F,0x6C,0x6C,0x65,0x64,2006 0x69,0x6E,0x67,0x2C,0x20,0x74,0x68,0x65,0x20,0x64,0x69,0x73,
2001 0x20,0x77,0x69,0x74,0x68,0x20,0x50,0x2D,0x63,0x6F,0x6C,0x75,2007 0x61,0x62,0x6C,0x65,0x64,0x20,0x70,0x61,0x72,0x74,0x73,0x20,
2002 0x6D,0x6E,0x20,0x28,0x6F,0x72,0x20,0x54,0x2D,0x63,0x6F,0x6C,2008 0x61,0x72,0x65,0x20,0x6E,0x6F,0x74,0x43,0x63,0x6C,0x65,0x61,
2003 0x75,0x6D,0x6E,0x29,0x2E,0x3C,0x3E,0x57,0x68,0x65,0x6E,0x20,2009 0x72,0x65,0x64,0x20,0x69,0x6E,0x20,0x74,0x68,0x65,0x20,0x63,
2004 0x79,0x6F,0x75,0x20,0x63,0x6F,0x70,0x79,0x20,0x64,0x61,0x74,2010 0x6F,0x70,0x79,0x62,0x75,0x66,0x66,0x65,0x72,0x2E,0x20,0x28,
2005 0x61,0x20,0x77,0x69,0x74,0x68,0x20,0x6D,0x61,0x73,0x6B,0x69,2011 0x4D,0x61,0x6B,0x69,0x6E,0x67,0x20,0x69,0x74,0x20,0x70,0x6F,
2006 0x6E,0x67,0x2C,0x20,0x74,0x68,0x65,0x20,0x64,0x69,0x73,0x61,2012 0x73,0x73,0x69,0x62,0x6C,0x65,0x20,0x74,0x6F,0x20,0x63,0x6F,
2007 0x62,0x6C,0x65,0x64,0x20,0x70,0x61,0x72,0x74,0x73,0x20,0x61,2013 0x6C,0x6C,0x65,0x63,0x74,0x20,0x64,0x61,0x74,0x61,0x20,0x66,
2008 0x72,0x65,0x20,0x6E,0x6F,0x74,0x43,0x63,0x6C,0x65,0x61,0x72,2014 0x72,0x6F,0x6D,0x27,0x73,0x65,0x76,0x65,0x72,0x61,0x6C,0x20,
2009 0x65,0x64,0x20,0x69,0x6E,0x20,0x74,0x68,0x65,0x20,0x63,0x6F,2015 0x6C,0x6F,0x63,0x61,0x74,0x69,0x6F,0x6E,0x73,0x20,0x69,0x6E,
2010 0x70,0x79,0x62,0x75,0x66,0x66,0x65,0x72,0x2E,0x20,0x28,0x4D,2016 0x74,0x6F,0x20,0x74,0x68,0x65,0x20,0x63,0x6F,0x70,0x79,0x62,
2011 0x61,0x6B,0x69,0x6E,0x67,0x20,0x69,0x74,0x20,0x70,0x6F,0x73,2017 0x75,0x66,0x66,0x65,0x72,0x2E,0x29,0x00,0x03,0x45,0x4E,0x44,
2012 0x73,0x69,0x62,0x6C,0x65,0x20,0x74,0x6F,0x20,0x63,0x6F,0x6C,2018 0x4C,0x3B,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,
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,
2019 0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,2019 0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,
2020 0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,2020 0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,
2021 0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,2021 0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,
2022 0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,2022 0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,
2023 0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,2023 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,
2025 0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,2025 0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,
2026 0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,2026 0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,
2027 0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,2027 0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,
2028 0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,2028 0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,
2029 0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,2029 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,2030 0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x0E,0x40,
2031 0x50,0x72,0x6F,0x62,0x6C,0x65,0x6D,0x73,0x2F,0x46,0x41,0x51,2031 0x4C,0x50,0x72,0x6F,0x62,0x6C,0x65,0x6D,0x73,0x2F,0x46,0x41,
2032 0x06,0x3E,0x40,0x58,0x30,0x32,0x30,0x41,0x3E,0x40,0x43,0x30,2032 0x51,0x06,0x3E,0x40,0x58,0x30,0x32,0x30,0x41,0x3E,0x40,0x43,
2033 0x30,0x31,0x51,0x3A,0x20,0x43,0x61,0x6E,0x20,0x49,0x20,0x6D,2033 0x30,0x30,0x31,0x51,0x3A,0x20,0x43,0x61,0x6E,0x20,0x49,0x20,
2034 0x61,0x6B,0x65,0x20,0x66,0x75,0x6C,0x6C,0x73,0x63,0x72,0x65,2034 0x6D,0x61,0x6B,0x65,0x20,0x66,0x75,0x6C,0x6C,0x73,0x63,0x72,
2035 0x65,0x6E,0x20,0x6D,0x6F,0x64,0x65,0x20,0x73,0x74,0x72,0x65,2035 0x65,0x65,0x6E,0x20,0x6D,0x6F,0x64,0x65,0x20,0x73,0x74,0x72,
2036 0x74,0x63,0x68,0x20,0x6F,0x75,0x74,0x20,0x74,0x68,0x65,0x20,2036 0x65,0x74,0x63,0x68,0x20,0x6F,0x75,0x74,0x20,0x74,0x68,0x65,
2037 0x77,0x68,0x6F,0x6C,0x65,0x20,0x73,0x63,0x72,0x65,0x65,0x6E,2037 0x20,0x77,0x68,0x6F,0x6C,0x65,0x20,0x73,0x63,0x72,0x65,0x65,
2038 0x3F,0x3A,0x3E,0x40,0x43,0x30,0x30,0x32,0x41,0x3A,0x20,0x45,2038 0x6E,0x3F,0x3A,0x3E,0x40,0x43,0x30,0x30,0x32,0x41,0x3A,0x20,
2039 0x6E,0x61,0x62,0x6C,0x65,0x20,0x22,0x50,0x69,0x78,0x65,0x6C,2039 0x45,0x6E,0x61,0x62,0x6C,0x65,0x20,0x22,0x50,0x69,0x78,0x65,
2040 0x20,0x66,0x69,0x6C,0x74,0x65,0x72,0x22,0x20,0x69,0x6E,0x20,2040 0x6C,0x20,0x66,0x69,0x6C,0x74,0x65,0x72,0x22,0x20,0x69,0x6E,
2041 0x43,0x6F,0x6E,0x66,0x69,0x67,0x20,0x2D,0x3E,0x20,0x4D,0x69,2041 0x20,0x43,0x6F,0x6E,0x66,0x69,0x67,0x20,0x2D,0x3E,0x20,0x4D,
2042 0x73,0x63,0x65,0x6C,0x6C,0x61,0x6E,0x65,0x6F,0x75,0x73,0x2E,2042 0x69,0x73,0x63,0x65,0x6C,0x6C,0x61,0x6E,0x65,0x6F,0x75,0x73,
2043 0x4D,0x3E,0x40,0x58,0x30,0x33,0x35,0x49,0x74,0x20,0x77,0x6F,2043 0x2E,0x4D,0x3E,0x40,0x58,0x30,0x33,0x35,0x49,0x74,0x20,0x77,
2044 0x6E,0x27,0x74,0x20,0x6C,0x6F,0x6F,0x6B,0x20,0x70,0x72,0x65,2044 0x6F,0x6E,0x27,0x74,0x20,0x6C,0x6F,0x6F,0x6B,0x20,0x70,0x72,
2045 0x74,0x74,0x79,0x2C,0x20,0x62,0x75,0x74,0x20,0x74,0x6F,0x20,2045 0x65,0x74,0x74,0x79,0x2C,0x20,0x62,0x75,0x74,0x20,0x74,0x6F,
2046 0x73,0x6F,0x6D,0x65,0x20,0x70,0x65,0x6F,0x70,0x6C,0x65,0x20,2046 0x20,0x73,0x6F,0x6D,0x65,0x20,0x70,0x65,0x6F,0x70,0x6C,0x65,
2047 0x69,0x74,0x27,0x73,0x20,0x6D,0x75,0x63,0x68,0x20,0x62,0x65,2047 0x20,0x69,0x74,0x27,0x73,0x20,0x6D,0x75,0x63,0x68,0x20,0x62,
2048 0x74,0x74,0x65,0x72,0x20,0x74,0x68,0x61,0x6E,0x20,0x6E,0x6F,2048 0x65,0x74,0x74,0x65,0x72,0x20,0x74,0x68,0x61,0x6E,0x20,0x6E,
2049 0x74,0x68,0x69,0x6E,0x67,0x2E,0x06,0x3E,0x40,0x58,0x30,0x32,2049 0x6F,0x74,0x68,0x69,0x6E,0x67,0x2E,0x06,0x3E,0x40,0x58,0x30,
2050 0x30,0x27,0x3E,0x40,0x43,0x30,0x30,0x31,0x51,0x3A,0x20,0x49,2050 0x32,0x30,0x27,0x3E,0x40,0x43,0x30,0x30,0x31,0x51,0x3A,0x20,
2051 0x20,0x63,0x61,0x6E,0x27,0x74,0x20,0x75,0x73,0x65,0x20,0x41,2051 0x49,0x20,0x63,0x61,0x6E,0x27,0x74,0x20,0x75,0x73,0x65,0x20,
2052 0x4C,0x54,0x2B,0x46,0x34,0x20,0x61,0x6E,0x64,0x20,0x41,0x4C,2052 0x41,0x4C,0x54,0x2B,0x46,0x34,0x20,0x61,0x6E,0x64,0x20,0x41,
2053 0x54,0x2B,0x46,0x35,0x21,0x4E,0x3E,0x40,0x43,0x30,0x30,0x32,2053 0x4C,0x54,0x2B,0x46,0x35,0x21,0x4E,0x3E,0x40,0x43,0x30,0x30,
2054 0x41,0x3A,0x20,0x57,0x69,0x6E,0x64,0x6F,0x77,0x73,0x3A,0x20,2054 0x32,0x41,0x3A,0x20,0x57,0x69,0x6E,0x64,0x6F,0x77,0x73,0x3A,
2055 0x49,0x66,0x20,0x79,0x6F,0x75,0x20,0x68,0x61,0x76,0x65,0x20,2055 0x20,0x49,0x66,0x20,0x79,0x6F,0x75,0x20,0x68,0x61,0x76,0x65,
2056 0x47,0x65,0x46,0x6F,0x72,0x63,0x65,0x20,0x45,0x78,0x70,0x65,2056 0x20,0x47,0x65,0x46,0x6F,0x72,0x63,0x65,0x20,0x45,0x78,0x70,
2057 0x72,0x69,0x65,0x6E,0x63,0x65,0x20,0x69,0x6E,0x73,0x74,0x61,2057 0x65,0x72,0x69,0x65,0x6E,0x63,0x65,0x20,0x69,0x6E,0x73,0x74,
2058 0x6C,0x6C,0x65,0x64,0x2C,0x20,0x79,0x6F,0x75,0x20,0x6E,0x65,2058 0x61,0x6C,0x6C,0x65,0x64,0x2C,0x20,0x79,0x6F,0x75,0x20,0x6E,
2059 0x65,0x64,0x20,0x74,0x6F,0x20,0x63,0x68,0x61,0x6E,0x67,0x65,2059 0x65,0x65,0x64,0x20,0x74,0x6F,0x20,0x63,0x68,0x61,0x6E,0x67,
2060 0x2B,0x3E,0x40,0x58,0x30,0x33,0x35,0x74,0x68,0x65,0x20,0x6B,2060 0x65,0x2B,0x3E,0x40,0x58,0x30,0x33,0x35,0x74,0x68,0x65,0x20,
2061 0x65,0x79,0x62,0x69,0x6E,0x64,0x69,0x6E,0x67,0x73,0x20,0x69,2061 0x6B,0x65,0x79,0x62,0x69,0x6E,0x64,0x69,0x6E,0x67,0x73,0x20,
2062 0x6E,0x20,0x69,0x74,0x73,0x20,0x73,0x65,0x74,0x74,0x69,0x6E,2062 0x69,0x6E,0x20,0x69,0x74,0x73,0x20,0x73,0x65,0x74,0x74,0x69,
2063 0x67,0x73,0x20,0x70,0x61,0x67,0x65,0x2E,0x56,0x6D,0x61,0x63,2063 0x6E,0x67,0x73,0x20,0x70,0x61,0x67,0x65,0x2E,0x56,0x6D,0x61,
2064 0x4F,0x53,0x2F,0x4F,0x53,0x20,0x58,0x3A,0x20,0x43,0x68,0x61,2064 0x63,0x4F,0x53,0x2F,0x4F,0x53,0x20,0x58,0x3A,0x20,0x43,0x68,
2065 0x6E,0x67,0x65,0x20,0x41,0x4C,0x54,0x2B,0x46,0x34,0x2F,0x41,2065 0x61,0x6E,0x67,0x65,0x20,0x41,0x4C,0x54,0x2B,0x46,0x34,0x2F,
2066 0x4C,0x54,0x2B,0x46,0x35,0x20,0x6B,0x65,0x79,0x73,0x20,0x69,2066 0x41,0x4C,0x54,0x2B,0x46,0x35,0x20,0x6B,0x65,0x79,0x73,0x20,
2067 0x6E,0x20,0x74,0x68,0x65,0x20,0x4F,0x53,0x20,0x74,0x6F,0x20,2067 0x69,0x6E,0x20,0x74,0x68,0x65,0x20,0x4F,0x53,0x20,0x74,0x6F,
2068 0x73,0x6F,0x6D,0x65,0x74,0x68,0x69,0x6E,0x67,0x20,0x65,0x6C,2068 0x20,0x73,0x6F,0x6D,0x65,0x74,0x68,0x69,0x6E,0x67,0x20,0x65,
2069 0x73,0x65,0x2E,0x20,0x41,0x6C,0x73,0x6F,0x20,0x66,0x6F,0x72,2069 0x6C,0x73,0x65,0x2E,0x20,0x41,0x6C,0x73,0x6F,0x20,0x66,0x6F,
2070 0x20,0x47,0x4E,0x55,0x2F,0x4C,0x69,0x6E,0x75,0x78,0x2E,0x06,2070 0x72,0x20,0x47,0x4E,0x55,0x2F,0x4C,0x69,0x6E,0x75,0x78,0x2E,
2071 0x3E,0x40,0x58,0x30,0x32,0x30,0x2B,0x3E,0x40,0x43,0x30,0x30,2071 0x06,0x3E,0x40,0x58,0x30,0x32,0x30,0x2B,0x3E,0x40,0x43,0x30,
2072 0x31,0x51,0x3A,0x20,0x54,0x68,0x65,0x20,0x6D,0x6F,0x75,0x73,2072 0x30,0x31,0x51,0x3A,0x20,0x54,0x68,0x65,0x20,0x6D,0x6F,0x75,
2073 0x65,0x20,0x63,0x75,0x72,0x73,0x6F,0x72,0x20,0x69,0x73,0x20,2073 0x73,0x65,0x20,0x63,0x75,0x72,0x73,0x6F,0x72,0x20,0x69,0x73,
2074 0x64,0x65,0x6C,0x61,0x79,0x65,0x64,0x2F,0x6C,0x61,0x67,0x67,2074 0x20,0x64,0x65,0x6C,0x61,0x79,0x65,0x64,0x2F,0x6C,0x61,0x67,
2075 0x79,0x21,0x44,0x3E,0x40,0x43,0x30,0x30,0x32,0x41,0x3A,0x20,2075 0x67,0x79,0x21,0x44,0x3E,0x40,0x43,0x30,0x30,0x32,0x41,0x3A,
2076 0x4D,0x61,0x6B,0x65,0x20,0x73,0x75,0x72,0x65,0x20,0x22,0x53,2076 0x20,0x4D,0x61,0x6B,0x65,0x20,0x73,0x75,0x72,0x65,0x20,0x22,
2077 0x6F,0x66,0x74,0x77,0x61,0x72,0x65,0x20,0x6D,0x6F,0x75,0x73,2077 0x53,0x6F,0x66,0x74,0x77,0x61,0x72,0x65,0x20,0x6D,0x6F,0x75,
2078 0x65,0x22,0x20,0x69,0x73,0x20,0x64,0x69,0x73,0x61,0x62,0x6C,2078 0x73,0x65,0x22,0x20,0x69,0x73,0x20,0x64,0x69,0x73,0x61,0x62,
2079 0x65,0x64,0x20,0x69,0x6E,0x20,0x43,0x6F,0x6E,0x66,0x69,0x67,2079 0x6C,0x65,0x64,0x20,0x69,0x6E,0x20,0x43,0x6F,0x6E,0x66,0x69,
2080 0x20,0x2D,0x3E,0x20,0x4C,0x61,0x79,0x6F,0x75,0x74,0x2E,0x4B,2080 0x67,0x20,0x2D,0x3E,0x20,0x4C,0x61,0x79,0x6F,0x75,0x74,0x2E,
2081 0x3E,0x40,0x58,0x30,0x33,0x35,0x41,0x6C,0x74,0x65,0x72,0x6E,2081 0x4B,0x3E,0x40,0x58,0x30,0x33,0x35,0x41,0x6C,0x74,0x65,0x72,
2082 0x61,0x74,0x69,0x76,0x65,0x6C,0x79,0x2C,0x20,0x79,0x6F,0x75,2082 0x6E,0x61,0x74,0x69,0x76,0x65,0x6C,0x79,0x2C,0x20,0x79,0x6F,
2083 0x20,0x63,0x61,0x6E,0x20,0x65,0x6E,0x61,0x62,0x6C,0x65,0x20,2083 0x75,0x20,0x63,0x61,0x6E,0x20,0x65,0x6E,0x61,0x62,0x6C,0x65,
2084 0x22,0x56,0x53,0x79,0x6E,0x63,0x20,0x6F,0x66,0x66,0x22,0x20,2084 0x20,0x22,0x56,0x53,0x79,0x6E,0x63,0x20,0x6F,0x66,0x66,0x22,
2085 0x69,0x6E,0x20,0x43,0x6F,0x6E,0x66,0x69,0x67,0x20,0x2D,0x3E,2085 0x20,0x69,0x6E,0x20,0x43,0x6F,0x6E,0x66,0x69,0x67,0x20,0x2D,
2086 0x20,0x4D,0x69,0x73,0x63,0x65,0x6C,0x6C,0x61,0x6E,0x65,0x6F,2086 0x3E,0x20,0x4D,0x69,0x73,0x63,0x65,0x6C,0x6C,0x61,0x6E,0x65,
2087 0x75,0x73,0x2E,0x46,0x3E,0x54,0x68,0x69,0x73,0x20,0x68,0x6F,2087 0x6F,0x75,0x73,0x2E,0x46,0x3E,0x54,0x68,0x69,0x73,0x20,0x68,
2088 0x77,0x65,0x76,0x65,0x72,0x2C,0x20,0x77,0x69,0x6C,0x6C,0x20,2088 0x6F,0x77,0x65,0x76,0x65,0x72,0x2C,0x20,0x77,0x69,0x6C,0x6C,
2089 0x69,0x6E,0x74,0x72,0x6F,0x64,0x75,0x63,0x65,0x20,0x73,0x74,2089 0x20,0x69,0x6E,0x74,0x72,0x6F,0x64,0x75,0x63,0x65,0x20,0x73,
2090 0x75,0x74,0x74,0x65,0x72,0x69,0x6E,0x67,0x20,0x62,0x65,0x63,2090 0x74,0x75,0x74,0x74,0x65,0x72,0x69,0x6E,0x67,0x20,0x62,0x65,
2091 0x61,0x75,0x73,0x65,0x20,0x74,0x68,0x65,0x20,0x72,0x65,0x6E,2091 0x63,0x61,0x75,0x73,0x65,0x20,0x74,0x68,0x65,0x20,0x72,0x65,
2092 0x64,0x65,0x72,0x69,0x6E,0x67,0x20,0x72,0x61,0x74,0x65,0x20,2092 0x6E,0x64,0x65,0x72,0x69,0x6E,0x67,0x20,0x72,0x61,0x74,0x65,
2093 0x69,0x73,0x22,0x3E,0x6E,0x6F,0x74,0x20,0x65,0x78,0x61,0x63,2093 0x20,0x69,0x73,0x22,0x3E,0x6E,0x6F,0x74,0x20,0x65,0x78,0x61,
2094 0x74,0x20,0x74,0x6F,0x20,0x79,0x6F,0x75,0x72,0x20,0x6D,0x6F,2094 0x63,0x74,0x20,0x74,0x6F,0x20,0x79,0x6F,0x75,0x72,0x20,0x6D,
2095 0x6E,0x69,0x74,0x6F,0x72,0x27,0x73,0x20,0x72,0x61,0x74,0x65,2095 0x6F,0x6E,0x69,0x74,0x6F,0x72,0x27,0x73,0x20,0x72,0x61,0x74,
2096 0x2E,0x06,0x3E,0x40,0x58,0x30,0x32,0x30,0x33,0x3E,0x40,0x43,2096 0x65,0x2E,0x06,0x3E,0x40,0x58,0x30,0x32,0x30,0x33,0x3E,0x40,
2097 0x30,0x30,0x31,0x51,0x3A,0x20,0x57,0x69,0x6C,0x6C,0x20,0x79,2097 0x43,0x30,0x30,0x31,0x51,0x3A,0x20,0x57,0x69,0x6C,0x6C,0x20,
2098 0x6F,0x75,0x20,0x69,0x6D,0x70,0x6C,0x65,0x6D,0x65,0x6E,0x74,2098 0x79,0x6F,0x75,0x20,0x69,0x6D,0x70,0x6C,0x65,0x6D,0x65,0x6E,
2099 0x20,0x4D,0x49,0x44,0x49,0x20,0x6F,0x75,0x74,0x20,0x66,0x75,2099 0x74,0x20,0x4D,0x49,0x44,0x49,0x20,0x6F,0x75,0x74,0x20,0x66,
2100 0x6E,0x63,0x74,0x69,0x6F,0x6E,0x61,0x6C,0x69,0x74,0x79,0x3F,2100 0x75,0x6E,0x63,0x74,0x69,0x6F,0x6E,0x61,0x6C,0x69,0x74,0x79,
2101 0x4D,0x3E,0x40,0x43,0x30,0x30,0x32,0x41,0x3A,0x20,0x4E,0x6F,2101 0x3F,0x4D,0x3E,0x40,0x43,0x30,0x30,0x32,0x41,0x3A,0x20,0x4E,
2102 0x2C,0x20,0x73,0x6F,0x72,0x72,0x79,0x2E,0x20,0x54,0x68,0x69,2102 0x6F,0x2C,0x20,0x73,0x6F,0x72,0x72,0x79,0x2E,0x20,0x54,0x68,
2103 0x73,0x20,0x69,0x73,0x20,0x76,0x65,0x72,0x79,0x20,0x64,0x69,2103 0x69,0x73,0x20,0x69,0x73,0x20,0x76,0x65,0x72,0x79,0x20,0x64,
2104 0x66,0x66,0x69,0x63,0x75,0x6C,0x74,0x20,0x74,0x6F,0x20,0x69,2104 0x69,0x66,0x66,0x69,0x63,0x75,0x6C,0x74,0x20,0x74,0x6F,0x20,
2105 0x6D,0x70,0x6C,0x65,0x6D,0x65,0x6E,0x74,0x20,0x63,0x6F,0x72,2105 0x69,0x6D,0x70,0x6C,0x65,0x6D,0x65,0x6E,0x74,0x20,0x63,0x6F,
2106 0x72,0x65,0x63,0x74,0x6C,0x79,0x20,0x77,0x68,0x65,0x6E,0x20,2106 0x72,0x72,0x65,0x63,0x74,0x6C,0x79,0x20,0x77,0x68,0x65,0x6E,
2107 0x68,0x61,0x76,0x69,0x6E,0x67,0x3C,0x3E,0x40,0x58,0x30,0x33,2107 0x20,0x68,0x61,0x76,0x69,0x6E,0x67,0x3C,0x3E,0x40,0x58,0x30,
2108 0x35,0x68,0x69,0x67,0x68,0x65,0x72,0x20,0x61,0x75,0x64,0x69,2108 0x33,0x35,0x68,0x69,0x67,0x68,0x65,0x72,0x20,0x61,0x75,0x64,
2109 0x6F,0x20,0x62,0x75,0x66,0x66,0x65,0x72,0x20,0x73,0x69,0x7A,2109 0x69,0x6F,0x20,0x62,0x75,0x66,0x66,0x65,0x72,0x20,0x73,0x69,
2110 0x65,0x73,0x20,0x28,0x62,0x75,0x66,0x66,0x65,0x72,0x65,0x64,2110 0x7A,0x65,0x73,0x20,0x28,0x62,0x75,0x66,0x66,0x65,0x72,0x65,
2111 0x20,0x72,0x65,0x70,0x6C,0x61,0x79,0x65,0x72,0x20,0x74,0x69,2111 0x64,0x20,0x72,0x65,0x70,0x6C,0x61,0x79,0x65,0x72,0x20,0x74,
2112 0x63,0x6B,0x73,0x29,0x2E,0x2E,0x2E,0x06,0x3E,0x40,0x58,0x30,2112 0x69,0x63,0x6B,0x73,0x29,0x2E,0x2E,0x2E,0x06,0x3E,0x40,0x58,
2113 0x32,0x30,0x30,0x3E,0x40,0x43,0x30,0x30,0x31,0x51,0x3A,0x20,2113 0x30,0x32,0x30,0x30,0x3E,0x40,0x43,0x30,0x30,0x31,0x51,0x3A,
2114 0x57,0x68,0x65,0x72,0x65,0x20,0x69,0x73,0x20,0x74,0x68,0x65,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,
2115 0x20,0x63,0x6F,0x6E,0x66,0x69,0x67,0x75,0x72,0x61,0x74,0x69,2140 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,2141 0x6F,0x6E,0x20,0x66,0x69,0x6C,0x65,0x20,0x69,0x6E,0x20,0x74,
2117 0x65,0x64,0x3F,0x3F,0x3E,0x40,0x43,0x30,0x30,0x32,0x41,0x3A,2142 0x68,0x65,0x20,0x70,0x72,0x6F,0x67,0x72,0x61,0x6D,0x20,0x64,
2118 0x20,0x57,0x69,0x6E,0x64,0x6F,0x77,0x73,0x3A,0x20,0x5C,0x55,2143 0x69,0x72,0x65,0x63,0x74,0x6F,0x72,0x79,0x2C,0x20,0x69,0x74,
2119 0x73,0x65,0x72,0x73,0x5C,0x55,0x53,0x45,0x52,0x5C,0x41,0x70,2144 0x20,0x77,0x69,0x6C,0x6C,0x20,0x72,0x65,0x61,0x64,0x20,0x74,
2120 0x70,0x44,0x61,0x74,0x61,0x5C,0x52,0x6F,0x61,0x6D,0x69,0x6E,2145 0x68,0x61,0x74,0x4A,0x6F,0x6E,0x65,0x20,0x61,0x6E,0x64,0x20,
2121 0x67,0x5C,0x46,0x54,0x32,0x20,0x63,0x6C,0x6F,0x6E,0x65,0x5C,2146 0x6E,0x6F,0x74,0x20,0x61,0x74,0x74,0x65,0x6D,0x70,0x74,0x20,
2122 0x46,0x54,0x32,0x2E,0x43,0x46,0x47,0x45,0x3E,0x40,0x58,0x30,2147 0x74,0x6F,0x20,0x63,0x72,0x65,0x61,0x74,0x65,0x20,0x63,0x6F,
2123 0x33,0x35,0x4F,0x53,0x20,0x58,0x3A,0x20,0x2F,0x55,0x73,0x65,2148 0x6E,0x66,0x69,0x67,0x20,0x64,0x69,0x72,0x73,0x20,0x66,0x6F,
2124 0x72,0x73,0x2F,0x55,0x53,0x45,0x52,0x2F,0x4C,0x69,0x62,0x72,2149 0x72,0x20,0x74,0x68,0x65,0x20,0x4F,0x53,0x20,0x75,0x73,0x65,
2125 0x61,0x72,0x79,0x2F,0x41,0x70,0x70,0x6C,0x69,0x63,0x61,0x74,2150 0x72,0x2E,0x20,0x28,0x70,0x6F,0x72,0x74,0x61,0x62,0x6C,0x65,
2126 0x69,0x6F,0x6E,0x20,0x53,0x75,0x70,0x70,0x6F,0x72,0x74,0x2F,2151 0x20,0x6D,0x6F,0x64,0x65,0x29,0x06,0x3E,0x40,0x58,0x30,0x32,
2127 0x46,0x54,0x32,0x20,0x63,0x6C,0x6F,0x6E,0x65,0x2F,0x46,0x54,2152 0x30,0x42,0x3E,0x40,0x43,0x30,0x30,0x31,0x51,0x3A,0x20,0x43,
2128 0x32,0x2E,0x43,0x46,0x47,0x2F,0x47,0x4E,0x55,0x2F,0x4C,0x69,2153 0x61,0x6E,0x20,0x74,0x68,0x65,0x20,0x63,0x6C,0x6F,0x6E,0x65,
2129 0x6E,0x75,0x78,0x3A,0x20,0x2F,0x68,0x6F,0x6D,0x65,0x2F,0x55,2154 0x20,0x72,0x65,0x61,0x64,0x20,0x46,0x54,0x32,0x2E,0x43,0x46,
2130 0x53,0x45,0x52,0x2F,0x2E,0x63,0x6F,0x6E,0x66,0x69,0x67,0x2F,2155 0x47,0x20,0x66,0x72,0x6F,0x6D,0x20,0x72,0x65,0x61,0x6C,0x20,
2131 0x46,0x54,0x32,0x20,0x63,0x6C,0x6F,0x6E,0x65,0x2F,0x46,0x54,2156 0x46,0x54,0x32,0x2C,0x20,0x61,0x6E,0x64,0x20,0x76,0x69,0x63,
2132 0x32,0x2E,0x43,0x46,0x47,0x01,0x3E,0x48,0x49,0x74,0x20,0x77,2157 0x65,0x20,0x76,0x65,0x72,0x73,0x61,0x3F,0x4C,0x3E,0x40,0x43,
2133 0x69,0x6C,0x6C,0x20,0x62,0x65,0x20,0x73,0x74,0x6F,0x72,0x65,2158 0x30,0x30,0x32,0x41,0x3A,0x20,0x59,0x65,0x73,0x2C,0x20,0x69,
2134 0x64,0x20,0x69,0x6E,0x20,0x74,0x68,0x65,0x20,0x70,0x72,0x6F,2159 0x74,0x20,0x73,0x68,0x6F,0x75,0x6C,0x64,0x20,0x77,0x6F,0x72,
2135 0x67,0x72,0x61,0x6D,0x20,0x64,0x69,0x72,0x65,0x63,0x74,0x6F,2160 0x6B,0x20,0x6A,0x75,0x73,0x74,0x20,0x66,0x69,0x6E,0x65,0x2E,
2136 0x72,0x79,0x20,0x69,0x66,0x20,0x74,0x68,0x65,0x20,0x70,0x61,2161 0x20,0x50,0x75,0x74,0x20,0x69,0x74,0x20,0x69,0x6E,0x20,0x74,
2137 0x74,0x68,0x20,0x63,0x6F,0x75,0x6C,0x64,0x6E,0x27,0x74,0x20,2162 0x68,0x65,0x20,0x64,0x69,0x72,0x65,0x63,0x74,0x6F,0x72,0x79,
2138 0x62,0x65,0x20,0x75,0x73,0x65,0x64,0x2E,0x4D,0x49,0x66,0x20,2163 0x20,0x73,0x68,0x6F,0x77,0x6E,0x20,0x61,0x62,0x6F,0x76,0x65,
2139 0x79,0x6F,0x75,0x20,0x70,0x75,0x74,0x20,0x74,0x68,0x65,0x20,2164 0x2E,0x06,0x3E,0x40,0x58,0x30,0x32,0x30,0x52,0x3E,0x40,0x43,
2140 0x63,0x6F,0x6E,0x66,0x69,0x67,0x75,0x72,0x61,0x74,0x69,0x6F,2165 0x30,0x30,0x31,0x51,0x3A,0x20,0x53,0x6D,0x70,0x2E,0x20,0x45,
2141 0x6E,0x20,0x66,0x69,0x6C,0x65,0x20,0x69,0x6E,0x20,0x74,0x68,2166 0x64,0x2E,0x3A,0x20,0x57,0x68,0x69,0x6C,0x65,0x20,0x7A,0x6F,
2142 0x65,0x20,0x70,0x72,0x6F,0x67,0x72,0x61,0x6D,0x20,0x64,0x69,2167 0x6F,0x6D,0x69,0x6E,0x67,0x20,0x69,0x6E,0x2C,0x20,0x49,0x20,
2143 0x72,0x65,0x63,0x74,0x6F,0x72,0x79,0x2C,0x20,0x69,0x74,0x20,2168 0x73,0x6F,0x6D,0x65,0x74,0x69,0x6D,0x65,0x73,0x20,0x63,0x61,
2144 0x77,0x69,0x6C,0x6C,0x20,0x72,0x65,0x61,0x64,0x20,0x74,0x68,2169 0x6E,0x27,0x74,0x20,0x6D,0x61,0x72,0x6B,0x20,0x74,0x68,0x65,
2145 0x61,0x74,0x4A,0x6F,0x6E,0x65,0x20,0x61,0x6E,0x64,0x20,0x6E,2170 0x20,0x6C,0x61,0x73,0x74,0x20,0x73,0x61,0x6D,0x70,0x6C,0x65,
2146 0x6F,0x74,0x20,0x61,0x74,0x74,0x65,0x6D,0x70,0x74,0x20,0x74,2171 0x20,0x70,0x6F,0x69,0x6E,0x74,0x21,0x47,0x3E,0x40,0x43,0x30,
2147 0x6F,0x20,0x63,0x72,0x65,0x61,0x74,0x65,0x20,0x63,0x6F,0x6E,2172 0x30,0x32,0x41,0x3A,0x20,0x54,0x68,0x69,0x73,0x20,0x69,0x73,
2148 0x66,0x69,0x67,0x20,0x64,0x69,0x72,0x73,0x20,0x66,0x6F,0x72,2173 0x20,0x6E,0x6F,0x72,0x6D,0x61,0x6C,0x2E,0x20,0x54,0x68,0x69,
2149 0x20,0x74,0x68,0x65,0x20,0x4F,0x53,0x20,0x75,0x73,0x65,0x72,2174 0x73,0x20,0x69,0x73,0x20,0x61,0x20,0x6C,0x69,0x6D,0x69,0x74,
2150 0x2E,0x20,0x28,0x70,0x6F,0x72,0x74,0x61,0x62,0x6C,0x65,0x20,2175 0x61,0x74,0x69,0x6F,0x6E,0x20,0x69,0x6E,0x20,0x74,0x68,0x65,
2151 0x6D,0x6F,0x64,0x65,0x29,0x06,0x3E,0x40,0x58,0x30,0x32,0x30,2176 0x20,0x6E,0x61,0x74,0x75,0x72,0x65,0x20,0x6F,0x66,0x20,0x73,
2152 0x42,0x3E,0x40,0x43,0x30,0x30,0x31,0x51,0x3A,0x20,0x43,0x61,2177 0x63,0x61,0x6C,0x69,0x6E,0x67,0x2E,0x06,0x3E,0x40,0x58,0x30,
2153 0x6E,0x20,0x74,0x68,0x65,0x20,0x63,0x6C,0x6F,0x6E,0x65,0x20,2178 0x32,0x30,0x17,0x3E,0x40,0x43,0x30,0x30,0x31,0x51,0x3A,0x20,
2154 0x72,0x65,0x61,0x64,0x20,0x46,0x54,0x32,0x2E,0x43,0x46,0x47,2179 0x49,0x20,0x66,0x6F,0x75,0x6E,0x64,0x20,0x61,0x20,0x62,0x75,
2155 0x20,0x66,0x72,0x6F,0x6D,0x20,0x72,0x65,0x61,0x6C,0x20,0x46,2180 0x67,0x21,0x4C,0x3E,0x40,0x43,0x30,0x30,0x32,0x41,0x3A,0x20,
2156 0x54,0x32,0x2C,0x20,0x61,0x6E,0x64,0x20,0x76,0x69,0x63,0x65,2181 0x50,0x6C,0x65,0x61,0x73,0x65,0x20,0x73,0x65,0x6E,0x64,0x20,
2157 0x20,0x76,0x65,0x72,0x73,0x61,0x3F,0x4C,0x3E,0x40,0x43,0x30,2182 0x6D,0x65,0x20,0x61,0x20,0x6D,0x61,0x69,0x6C,0x20,0x28,0x66,
2158 0x30,0x32,0x41,0x3A,0x20,0x59,0x65,0x73,0x2C,0x20,0x69,0x74,2183 0x6F,0x75,0x6E,0x64,0x20,0x61,0x74,0x20,0x31,0x36,0x2D,0x62,
2159 0x20,0x73,0x68,0x6F,0x75,0x6C,0x64,0x20,0x77,0x6F,0x72,0x6B,2184 0x69,0x74,0x73,0x2E,0x6F,0x72,0x67,0x29,0x20,0x61,0x6E,0x64,
2160 0x20,0x6A,0x75,0x73,0x74,0x20,0x66,0x69,0x6E,0x65,0x2E,0x20,2185 0x20,0x74,0x72,0x79,0x20,0x74,0x6F,0x20,0x65,0x78,0x70,0x6C,
2161 0x50,0x75,0x74,0x20,0x69,0x74,0x20,0x69,0x6E,0x20,0x74,0x68,2186 0x61,0x69,0x6E,0x20,0x69,0x74,0x2E,0x00,0x03,0x45,0x4E,0x44,
2162 0x65,0x20,0x64,0x69,0x72,0x65,0x63,0x74,0x6F,0x72,0x79,0x20,2187 0x4C,0x3B,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,
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,
2188 0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,2188 0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,
2189 0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,2189 0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,
2190 0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,2190 0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,
2191 0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,2191 0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,
2192 0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,2192 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,
2194 0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,2194 0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,
2195 0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,2195 0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,
2196 0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,2196 0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,
2197 0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,2197 0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,
2198 0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,2198 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,2199 0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x0C,0x40,
2200 0x4B,0x6E,0x6F,0x77,0x6E,0x20,0x62,0x75,0x67,0x73,0x06,0x3E,2200 0x4C,0x4B,0x6E,0x6F,0x77,0x6E,0x20,0x62,0x75,0x67,0x73,0x06,
2201 0x40,0x58,0x30,0x31,0x30,0x2C,0x3E,0x40,0x43,0x30,0x30,0x31,2201 0x3E,0x40,0x58,0x30,0x31,0x30,0x2C,0x3E,0x40,0x43,0x30,0x30,
2202 0x57,0x41,0x56,0x20,0x65,0x78,0x70,0x6F,0x72,0x74,0x69,0x6E,2202 0x31,0x57,0x41,0x56,0x20,0x65,0x78,0x70,0x6F,0x72,0x74,0x69,
2203 0x67,0x20,0x28,0x72,0x65,0x6E,0x64,0x65,0x72,0x69,0x6E,0x67,2203 0x6E,0x67,0x20,0x28,0x72,0x65,0x6E,0x64,0x65,0x72,0x69,0x6E,
2204 0x20,0x73,0x6F,0x6E,0x67,0x20,0x74,0x6F,0x20,0x57,0x41,0x56,2204 0x67,0x20,0x73,0x6F,0x6E,0x67,0x20,0x74,0x6F,0x20,0x57,0x41,
2205 0x29,0x3A,0x01,0x3E,0x50,0x3E,0x40,0x43,0x30,0x30,0x32,0x2D,2205 0x56,0x29,0x3A,0x01,0x3E,0x50,0x3E,0x40,0x43,0x30,0x30,0x32,
2206 0x20,0x53,0x6F,0x6E,0x67,0x73,0x20,0x74,0x68,0x61,0x74,0x20,2206 0x2D,0x20,0x53,0x6F,0x6E,0x67,0x73,0x20,0x74,0x68,0x61,0x74,
2207 0x6A,0x75,0x6D,0x70,0x20,0x62,0x61,0x63,0x6B,0x20,0x74,0x6F,2207 0x20,0x6A,0x75,0x6D,0x70,0x20,0x62,0x61,0x63,0x6B,0x20,0x74,
2208 0x20,0x61,0x20,0x70,0x72,0x65,0x76,0x69,0x6F,0x75,0x73,0x20,2208 0x6F,0x20,0x61,0x20,0x70,0x72,0x65,0x76,0x69,0x6F,0x75,0x73,
2209 0x70,0x61,0x74,0x74,0x65,0x72,0x6E,0x20,0x77,0x69,0x6C,0x6C,2209 0x20,0x70,0x61,0x74,0x74,0x65,0x72,0x6E,0x20,0x77,0x69,0x6C,
2210 0x20,0x72,0x65,0x6E,0x64,0x65,0x72,0x20,0x66,0x6F,0x72,0x65,2210 0x6C,0x20,0x72,0x65,0x6E,0x64,0x65,0x72,0x20,0x66,0x6F,0x72,
2211 0x76,0x65,0x72,0x20,0x61,0x6E,0x64,0x20,0x65,0x76,0x65,0x72,2211 0x65,0x76,0x65,0x72,0x20,0x61,0x6E,0x64,0x20,0x65,0x76,0x65,
2212 0x2C,0x50,0x61,0x6E,0x64,0x20,0x79,0x6F,0x75,0x20,0x6E,0x65,2212 0x72,0x2C,0x50,0x61,0x6E,0x64,0x20,0x79,0x6F,0x75,0x20,0x6E,
2213 0x65,0x64,0x20,0x74,0x6F,0x20,0x70,0x72,0x65,0x73,0x73,0x20,2213 0x65,0x65,0x64,0x20,0x74,0x6F,0x20,0x70,0x72,0x65,0x73,0x73,
2214 0x61,0x20,0x6B,0x65,0x79,0x20,0x6F,0x72,0x20,0x63,0x6C,0x69,2214 0x20,0x61,0x20,0x6B,0x65,0x79,0x20,0x6F,0x72,0x20,0x63,0x6C,
2215 0x63,0x6B,0x20,0x74,0x68,0x65,0x20,0x6D,0x6F,0x75,0x73,0x65,2215 0x69,0x63,0x6B,0x20,0x74,0x68,0x65,0x20,0x6D,0x6F,0x75,0x73,
2216 0x20,0x74,0x6F,0x20,0x61,0x62,0x6F,0x72,0x74,0x20,0x74,0x68,2216 0x65,0x20,0x74,0x6F,0x20,0x61,0x62,0x6F,0x72,0x74,0x20,0x74,
2217 0x65,0x20,0x72,0x65,0x6E,0x64,0x65,0x72,0x20,0x77,0x68,0x65,2217 0x68,0x65,0x20,0x72,0x65,0x6E,0x64,0x65,0x72,0x20,0x77,0x68,
2218 0x6E,0x20,0x79,0x6F,0x75,0x20,0x77,0x61,0x6E,0x74,0x06,0x69,2218 0x65,0x6E,0x20,0x79,0x6F,0x75,0x20,0x77,0x61,0x6E,0x74,0x06,
2219 0x74,0x20,0x74,0x6F,0x2E,0x06,0x3E,0x40,0x58,0x30,0x31,0x30,2219 0x69,0x74,0x20,0x74,0x6F,0x2E,0x06,0x3E,0x40,0x58,0x30,0x31,
2220 0x17,0x3E,0x40,0x43,0x30,0x30,0x31,0x4D,0x6F,0x75,0x73,0x65,2220 0x30,0x17,0x3E,0x40,0x43,0x30,0x30,0x31,0x4D,0x6F,0x75,0x73,
2221 0x20,0x2F,0x20,0x6B,0x65,0x79,0x62,0x6F,0x61,0x72,0x64,0x3A,2221 0x65,0x20,0x2F,0x20,0x6B,0x65,0x79,0x62,0x6F,0x61,0x72,0x64,
2222 0x01,0x3E,0x43,0x3E,0x40,0x43,0x30,0x30,0x32,0x2D,0x20,0x4C,2222 0x3A,0x01,0x3E,0x43,0x3E,0x40,0x43,0x30,0x30,0x32,0x2D,0x20,
2223 0x69,0x6E,0x75,0x78,0x3A,0x20,0x54,0x68,0x65,0x20,0x6D,0x6F,2223 0x4C,0x69,0x6E,0x75,0x78,0x3A,0x20,0x54,0x68,0x65,0x20,0x6D,
2224 0x75,0x73,0x65,0x20,0x63,0x75,0x72,0x73,0x6F,0x72,0x20,0x67,2224 0x6F,0x75,0x73,0x65,0x20,0x63,0x75,0x72,0x73,0x6F,0x72,0x20,
2225 0x72,0x61,0x70,0x68,0x69,0x63,0x73,0x20,0x63,0x61,0x6E,0x20,2225 0x67,0x72,0x61,0x70,0x68,0x69,0x63,0x73,0x20,0x63,0x61,0x6E,
2226 0x62,0x65,0x20,0x67,0x6C,0x69,0x74,0x63,0x68,0x79,0x20,0x61,2226 0x20,0x62,0x65,0x20,0x67,0x6C,0x69,0x74,0x63,0x68,0x79,0x20,
2227 0x74,0x20,0x74,0x69,0x6D,0x65,0x73,0x2E,0x2E,0x2E,0x06,0x3E,2227 0x61,0x74,0x20,0x74,0x69,0x6D,0x65,0x73,0x2E,0x2E,0x2E,0x06,
2228 0x40,0x58,0x30,0x31,0x30,0x0C,0x3E,0x40,0x43,0x30,0x30,0x31,2228 0x3E,0x40,0x58,0x30,0x31,0x30,0x0C,0x3E,0x40,0x43,0x30,0x30,
2229 0x56,0x69,0x64,0x65,0x6F,0x3A,0x06,0x3E,0x40,0x43,0x30,0x30,2229 0x31,0x56,0x69,0x64,0x65,0x6F,0x3A,0x06,0x3E,0x40,0x43,0x30,
2230 0x32,0x50,0x3E,0x40,0x58,0x30,0x31,0x30,0x2D,0x20,0x46,0x75,2230 0x30,0x32,0x50,0x3E,0x40,0x58,0x30,0x31,0x30,0x2D,0x20,0x46,
2231 0x6C,0x6C,0x73,0x63,0x72,0x65,0x65,0x6E,0x20,0x6D,0x6F,0x64,2231 0x75,0x6C,0x6C,0x73,0x63,0x72,0x65,0x65,0x6E,0x20,0x6D,0x6F,
2232 0x65,0x20,0x63,0x61,0x6E,0x20,0x62,0x65,0x20,0x75,0x6E,0x62,2232 0x64,0x65,0x20,0x63,0x61,0x6E,0x20,0x62,0x65,0x20,0x75,0x6E,
2233 0x65,0x61,0x72,0x61,0x62,0x6C,0x79,0x20,0x73,0x6C,0x6F,0x77,2233 0x62,0x65,0x61,0x72,0x61,0x62,0x6C,0x79,0x20,0x73,0x6C,0x6F,
2234 0x20,0x6F,0x6E,0x20,0x61,0x20,0x52,0x61,0x73,0x70,0x62,0x65,2234 0x77,0x20,0x6F,0x6E,0x20,0x61,0x20,0x52,0x61,0x73,0x70,0x62,
2235 0x72,0x72,0x79,0x20,0x50,0x69,0x20,0x28,0x65,0x76,0x65,0x6E,2235 0x65,0x72,0x72,0x79,0x20,0x50,0x69,0x20,0x28,0x65,0x76,0x65,
2236 0x20,0x6F,0x6E,0x20,0x52,0x50,0x69,0x20,0x34,0x29,0x01,0x3E,2236 0x6E,0x20,0x6F,0x6E,0x20,0x52,0x50,0x69,0x20,0x34,0x29,0x01,
2237 0x52,0x3E,0x40,0x58,0x30,0x31,0x30,0x2D,0x20,0x4E,0x6F,0x74,2237 0x3E,0x52,0x3E,0x40,0x58,0x30,0x31,0x30,0x2D,0x20,0x4E,0x6F,
2238 0x20,0x61,0x20,0x62,0x75,0x67,0x2C,0x20,0x62,0x75,0x74,0x20,2238 0x74,0x20,0x61,0x20,0x62,0x75,0x67,0x2C,0x20,0x62,0x75,0x74,
2239 0x69,0x66,0x20,0x79,0x6F,0x75,0x72,0x20,0x6D,0x6F,0x6E,0x69,2239 0x20,0x69,0x66,0x20,0x79,0x6F,0x75,0x72,0x20,0x6D,0x6F,0x6E,
2240 0x74,0x6F,0x72,0x27,0x73,0x20,0x72,0x65,0x66,0x72,0x65,0x73,2240 0x69,0x74,0x6F,0x72,0x27,0x73,0x20,0x72,0x65,0x66,0x72,0x65,
2241 0x68,0x20,0x72,0x61,0x74,0x65,0x20,0x69,0x73,0x20,0x6E,0x6F,2241 0x73,0x68,0x20,0x72,0x61,0x74,0x65,0x20,0x69,0x73,0x20,0x6E,
2242 0x74,0x20,0x73,0x65,0x74,0x20,0x74,0x6F,0x20,0x36,0x30,0x48,2242 0x6F,0x74,0x20,0x73,0x65,0x74,0x20,0x74,0x6F,0x20,0x36,0x30,
2243 0x7A,0x20,0x28,0x6F,0x72,0x20,0x35,0x39,0x48,0x7A,0x29,0x4F,2243 0x48,0x7A,0x20,0x28,0x6F,0x72,0x20,0x35,0x39,0x48,0x7A,0x29,
2244 0x3E,0x40,0x58,0x30,0x32,0x31,0x79,0x6F,0x75,0x20,0x6D,0x61,2244 0x4F,0x3E,0x40,0x58,0x30,0x32,0x31,0x79,0x6F,0x75,0x20,0x6D,
2245 0x79,0x20,0x65,0x78,0x70,0x65,0x72,0x69,0x65,0x6E,0x63,0x65,2245 0x61,0x79,0x20,0x65,0x78,0x70,0x65,0x72,0x69,0x65,0x6E,0x63,
2246 0x20,0x76,0x69,0x73,0x75,0x61,0x6C,0x20,0x73,0x74,0x75,0x74,2246 0x65,0x20,0x76,0x69,0x73,0x75,0x61,0x6C,0x20,0x73,0x74,0x75,
2247 0x74,0x65,0x72,0x69,0x6E,0x67,0x20,0x62,0x65,0x63,0x61,0x75,2247 0x74,0x74,0x65,0x72,0x69,0x6E,0x67,0x20,0x62,0x65,0x63,0x61,
2248 0x73,0x65,0x20,0x56,0x53,0x79,0x6E,0x63,0x20,0x77,0x69,0x6C,2248 0x75,0x73,0x65,0x20,0x56,0x53,0x79,0x6E,0x63,0x20,0x77,0x69,
2249 0x6C,0x20,0x6E,0x6F,0x74,0x20,0x62,0x65,0x20,0x75,0x73,0x65,2249 0x6C,0x6C,0x20,0x6E,0x6F,0x74,0x20,0x62,0x65,0x20,0x75,0x73,
2250 0x64,0x20,0x74,0x68,0x65,0x6E,0x2E,0x51,0x49,0x20,0x68,0x69,2250 0x65,0x64,0x20,0x74,0x68,0x65,0x6E,0x2E,0x51,0x49,0x20,0x68,
2251 0x67,0x68,0x6C,0x79,0x20,0x72,0x65,0x63,0x6F,0x6D,0x6D,0x65,2251 0x69,0x67,0x68,0x6C,0x79,0x20,0x72,0x65,0x63,0x6F,0x6D,0x6D,
2252 0x6E,0x64,0x20,0x72,0x75,0x6E,0x6E,0x69,0x6E,0x67,0x20,0x79,2252 0x65,0x6E,0x64,0x20,0x72,0x75,0x6E,0x6E,0x69,0x6E,0x67,0x20,
2253 0x6F,0x75,0x72,0x20,0x6D,0x6F,0x6E,0x69,0x74,0x6F,0x72,0x20,2253 0x79,0x6F,0x75,0x72,0x20,0x6D,0x6F,0x6E,0x69,0x74,0x6F,0x72,
2254 0x61,0x74,0x20,0x36,0x30,0x48,0x7A,0x20,0x69,0x66,0x20,0x79,2254 0x20,0x61,0x74,0x20,0x36,0x30,0x48,0x7A,0x20,0x69,0x66,0x20,
2255 0x6F,0x75,0x27,0x72,0x65,0x20,0x61,0x20,0x68,0x61,0x72,0x64,2255 0x79,0x6F,0x75,0x27,0x72,0x65,0x20,0x61,0x20,0x68,0x61,0x72,
2256 0x63,0x6F,0x72,0x65,0x20,0x75,0x73,0x65,0x72,0x20,0x6F,0x66,2256 0x64,0x63,0x6F,0x72,0x65,0x20,0x75,0x73,0x65,0x72,0x20,0x6F,
2257 0x20,0x74,0x68,0x69,0x73,0x08,0x70,0x72,0x6F,0x67,0x72,0x61,2257 0x66,0x20,0x74,0x68,0x69,0x73,0x08,0x70,0x72,0x6F,0x67,0x72,
2258 0x6D,0x2E,0x00,0x03,0x45,0x4E,0x442258 0x61,0x6D,0x2E,0x00,0x03,0x45,0x4E,0x44
2259};2259};
2260 2260
2261#endif2261#endif
src/mixer/ft2_center_mix.c+166−166
@@ -13,7 +13,7 @@ · 12 unmodified lines
13void centerMix8bNoLoop(voice_t *v, uint32_t numSamples)13void centerMix8bNoLoop(voice_t *v, uint32_t numSamples)
14{14{
15 const int8_t *base, *smpPtr;15 const int8_t *base, *smpPtr;
16 float fSample, *fMixBufferL, *fMixBufferR;16 double dSample, *dMixBufferL, *dMixBufferR;
17 int32_t pos;17 int32_t pos;
18 uint32_t i, samplesToMix, samplesLeft;18 uint32_t i, samplesToMix, samplesLeft;
19 uint64_t posFrac;19 uint64_t posFrac;
@@ -55,7 +55,7 @@ void centerMix8bNoLoop(voice_t *v, uint32_t numSamples) · 35 unmodified lines
55void centerMix8bLoop(voice_t *v, uint32_t numSamples)55void centerMix8bLoop(voice_t *v, uint32_t numSamples)
56{56{
57 const int8_t *base, *smpPtr;57 const int8_t *base, *smpPtr;
58 float fSample, *fMixBufferL, *fMixBufferR;58 double dSample, *dMixBufferL, *dMixBufferR;
59 int32_t pos;59 int32_t pos;
60 uint32_t i, samplesToMix, samplesLeft;60 uint32_t i, samplesToMix, samplesLeft;
61 uint64_t posFrac;61 uint64_t posFrac;
@@ -97,7 +97,7 @@ void centerMix8bLoop(voice_t *v, uint32_t numSamples) · 35 unmodified lines
97void centerMix8bBidiLoop(voice_t *v, uint32_t numSamples)97void centerMix8bBidiLoop(voice_t *v, uint32_t numSamples)
98{98{
99 const int8_t *base, *revBase, *smpPtr;99 const int8_t *base, *revBase, *smpPtr;
100 float fSample, *fMixBufferL, *fMixBufferR;100 double dSample, *dMixBufferL, *dMixBufferR;
101 int32_t pos;101 int32_t pos;
102 uint32_t i, samplesToMix, samplesLeft;102 uint32_t i, samplesToMix, samplesLeft;
103 uint64_t posFrac, tmpDelta;103 uint64_t posFrac, tmpDelta;
@@ -138,10 +138,10 @@ void centerMix8bBidiLoop(voice_t *v, uint32_t numSamples) · 34 unmodified lines
138 SET_BACK_MIXER_POS138 SET_BACK_MIXER_POS
139}139}
140 140
141void centerMix8bNoLoopCIntrp(voice_t *v, uint32_t numSamples)141void centerMix8bNoLoopSIntrp(voice_t *v, uint32_t numSamples)
142{142{
143 const int8_t *base, *smpPtr;143 const int8_t *base, *smpPtr;
144 float fSample, *fMixBufferL, *fMixBufferR;144 double dSample, *dMixBufferL, *dMixBufferR;
145 int32_t pos;145 int32_t pos;
146 uint32_t i, samplesToMix, samplesLeft;146 uint32_t i, samplesToMix, samplesLeft;
147 uint64_t posFrac;147 uint64_t posFrac;
@@ -158,19 +158,19 @@ void centerMix8bNoLoopCIntrp(voice_t *v, uint32_t numSamples) · 10 unmodified lines
158 158
159 for (i = 0; i < (samplesToMix & 3); i++)159 for (i = 0; i < (samplesToMix & 3); i++)
160 {160 {
161 RENDER_8BIT_SMP_MONO_CINTRP161 RENDER_8BIT_SMP_MONO_SINTRP
162 INC_POS162 INC_POS
163 }163 }
164 samplesToMix >>= 2;164 samplesToMix >>= 2;
165 for (i = 0; i < samplesToMix; i++)165 for (i = 0; i < samplesToMix; i++)
166 {166 {
167 RENDER_8BIT_SMP_MONO_CINTRP167 RENDER_8BIT_SMP_MONO_SINTRP
168 INC_POS168 INC_POS
169 RENDER_8BIT_SMP_MONO_CINTRP169 RENDER_8BIT_SMP_MONO_SINTRP
170 INC_POS170 INC_POS
171 RENDER_8BIT_SMP_MONO_CINTRP171 RENDER_8BIT_SMP_MONO_SINTRP
172 INC_POS172 INC_POS
173 RENDER_8BIT_SMP_MONO_CINTRP173 RENDER_8BIT_SMP_MONO_SINTRP
174 INC_POS174 INC_POS
175 }175 }
176 176
@@ -180,10 +180,10 @@ void centerMix8bNoLoopCIntrp(voice_t *v, uint32_t numSamples) · 3 unmodified lines
180 SET_BACK_MIXER_POS180 SET_BACK_MIXER_POS
181}181}
182 182
183void centerMix8bLoopCIntrp(voice_t *v, uint32_t numSamples)183void centerMix8bLoopSIntrp(voice_t *v, uint32_t numSamples)
184{184{
185 const int8_t *base, *smpPtr;185 const int8_t *base, *smpPtr;
186 float s0, s1, s2, s3, fSample, *fMixBufferL, *fMixBufferR;186 double dSample, *dMixBufferL, *dMixBufferR;
187 int32_t pos;187 int32_t pos;
188 uint32_t i, samplesToMix, samplesLeft;188 uint32_t i, samplesToMix, samplesLeft;
189 uint64_t posFrac;189 uint64_t posFrac;
@@ -203,19 +203,19 @@ void centerMix8bLoopCIntrp(voice_t *v, uint32_t numSamples) · 13 unmodified lines
203 {203 {
204 for (i = 0; i < (samplesToMix & 3); i++)204 for (i = 0; i < (samplesToMix & 3); i++)
205 {205 {
206 RENDER_8BIT_SMP_MONO_CINTRP_TAP_FIX206 RENDER_8BIT_SMP_MONO_SINTRP_TAP_FIX
207 INC_POS207 INC_POS
208 }208 }
209 samplesToMix >>= 2;209 samplesToMix >>= 2;
210 for (i = 0; i < samplesToMix; i++)210 for (i = 0; i < samplesToMix; i++)
211 {211 {
212 RENDER_8BIT_SMP_MONO_CINTRP_TAP_FIX212 RENDER_8BIT_SMP_MONO_SINTRP_TAP_FIX
213 INC_POS213 INC_POS
214 RENDER_8BIT_SMP_MONO_CINTRP_TAP_FIX214 RENDER_8BIT_SMP_MONO_SINTRP_TAP_FIX
215 INC_POS215 INC_POS
216 RENDER_8BIT_SMP_MONO_CINTRP_TAP_FIX216 RENDER_8BIT_SMP_MONO_SINTRP_TAP_FIX
217 INC_POS217 INC_POS
218 RENDER_8BIT_SMP_MONO_CINTRP_TAP_FIX218 RENDER_8BIT_SMP_MONO_SINTRP_TAP_FIX
219 INC_POS219 INC_POS
220 }220 }
221 }221 }
@@ -223,19 +223,19 @@ void centerMix8bLoopCIntrp(voice_t *v, uint32_t numSamples) · 1 unmodified line
223 {223 {
224 for (i = 0; i < (samplesToMix & 3); i++)224 for (i = 0; i < (samplesToMix & 3); i++)
225 {225 {
226 RENDER_8BIT_SMP_MONO_CINTRP226 RENDER_8BIT_SMP_MONO_SINTRP
227 INC_POS227 INC_POS
228 }228 }
229 samplesToMix >>= 2;229 samplesToMix >>= 2;
230 for (i = 0; i < samplesToMix; i++)230 for (i = 0; i < samplesToMix; i++)
231 {231 {
232 RENDER_8BIT_SMP_MONO_CINTRP232 RENDER_8BIT_SMP_MONO_SINTRP
233 INC_POS233 INC_POS
234 RENDER_8BIT_SMP_MONO_CINTRP234 RENDER_8BIT_SMP_MONO_SINTRP
235 INC_POS235 INC_POS
236 RENDER_8BIT_SMP_MONO_CINTRP236 RENDER_8BIT_SMP_MONO_SINTRP
237 INC_POS237 INC_POS
238 RENDER_8BIT_SMP_MONO_CINTRP238 RENDER_8BIT_SMP_MONO_SINTRP
239 INC_POS239 INC_POS
240 }240 }
241 }241 }
@@ -246,10 +246,10 @@ void centerMix8bLoopCIntrp(voice_t *v, uint32_t numSamples) · 4 unmodified lines
246 SET_BACK_MIXER_POS246 SET_BACK_MIXER_POS
247}247}
248 248
249void centerMix8bBidiLoopCIntrp(voice_t *v, uint32_t numSamples)249void centerMix8bBidiLoopSIntrp(voice_t *v, uint32_t numSamples)
250{250{
251 const int8_t *base, *revBase, *smpPtr;251 const int8_t *base, *revBase, *smpPtr;
252 float s0, s1, s2, s3, fSample, *fMixBufferL, *fMixBufferR;252 double dSample, *dMixBufferL, *dMixBufferR;
253 int32_t pos;253 int32_t pos;
254 uint32_t i, samplesToMix, samplesLeft;254 uint32_t i, samplesToMix, samplesLeft;
255 uint64_t posFrac, tmpDelta;255 uint64_t posFrac, tmpDelta;
@@ -270,19 +270,19 @@ void centerMix8bBidiLoopCIntrp(voice_t *v, uint32_t numSamples) · 14 unmodified lines
270 {270 {
271 for (i = 0; i < (samplesToMix & 3); i++)271 for (i = 0; i < (samplesToMix & 3); i++)
272 {272 {
273 RENDER_8BIT_SMP_MONO_CINTRP_TAP_FIX273 RENDER_8BIT_SMP_MONO_SINTRP_TAP_FIX
274 INC_POS_BIDI274 INC_POS_BIDI
275 }275 }
276 samplesToMix >>= 2;276 samplesToMix >>= 2;
277 for (i = 0; i < samplesToMix; i++)277 for (i = 0; i < samplesToMix; i++)
278 {278 {
279 RENDER_8BIT_SMP_MONO_CINTRP_TAP_FIX279 RENDER_8BIT_SMP_MONO_SINTRP_TAP_FIX
280 INC_POS_BIDI280 INC_POS_BIDI
281 RENDER_8BIT_SMP_MONO_CINTRP_TAP_FIX281 RENDER_8BIT_SMP_MONO_SINTRP_TAP_FIX
282 INC_POS_BIDI282 INC_POS_BIDI
283 RENDER_8BIT_SMP_MONO_CINTRP_TAP_FIX283 RENDER_8BIT_SMP_MONO_SINTRP_TAP_FIX
284 INC_POS_BIDI284 INC_POS_BIDI
285 RENDER_8BIT_SMP_MONO_CINTRP_TAP_FIX285 RENDER_8BIT_SMP_MONO_SINTRP_TAP_FIX
286 INC_POS_BIDI286 INC_POS_BIDI
287 }287 }
288 }288 }
@@ -290,19 +290,19 @@ void centerMix8bBidiLoopCIntrp(voice_t *v, uint32_t numSamples) · 1 unmodified line
290 {290 {
291 for (i = 0; i < (samplesToMix & 3); i++)291 for (i = 0; i < (samplesToMix & 3); i++)
292 {292 {
293 RENDER_8BIT_SMP_MONO_CINTRP293 RENDER_8BIT_SMP_MONO_SINTRP
294 INC_POS_BIDI294 INC_POS_BIDI
295 }295 }
296 samplesToMix >>= 2;296 samplesToMix >>= 2;
297 for (i = 0; i < samplesToMix; i++)297 for (i = 0; i < samplesToMix; i++)
298 {298 {
299 RENDER_8BIT_SMP_MONO_CINTRP299 RENDER_8BIT_SMP_MONO_SINTRP
300 INC_POS_BIDI300 INC_POS_BIDI
301 RENDER_8BIT_SMP_MONO_CINTRP301 RENDER_8BIT_SMP_MONO_SINTRP
302 INC_POS_BIDI302 INC_POS_BIDI
303 RENDER_8BIT_SMP_MONO_CINTRP303 RENDER_8BIT_SMP_MONO_SINTRP
304 INC_POS_BIDI304 INC_POS_BIDI
305 RENDER_8BIT_SMP_MONO_CINTRP305 RENDER_8BIT_SMP_MONO_SINTRP
306 INC_POS_BIDI306 INC_POS_BIDI
307 }307 }
308 }308 }
@@ -318,7 +318,7 @@ void centerMix8bBidiLoopCIntrp(voice_t *v, uint32_t numSamples) · 9 unmodified lines
318void centerMix8bNoLoopLIntrp(voice_t *v, uint32_t numSamples)318void centerMix8bNoLoopLIntrp(voice_t *v, uint32_t numSamples)
319{319{
320 const int8_t *base, *smpPtr;320 const int8_t *base, *smpPtr;
321 float fSample, *fMixBufferL, *fMixBufferR;321 double dSample, *dMixBufferL, *dMixBufferR;
322 int32_t pos;322 int32_t pos;
323 uint32_t i, samplesToMix, samplesLeft;323 uint32_t i, samplesToMix, samplesLeft;
324 uint64_t posFrac;324 uint64_t posFrac;
@@ -360,7 +360,7 @@ void centerMix8bNoLoopLIntrp(voice_t *v, uint32_t numSamples) · 35 unmodified lines
360void centerMix8bLoopLIntrp(voice_t *v, uint32_t numSamples)360void centerMix8bLoopLIntrp(voice_t *v, uint32_t numSamples)
361{361{
362 const int8_t *base, *smpPtr;362 const int8_t *base, *smpPtr;
363 float fSample, *fMixBufferL, *fMixBufferR;363 double dSample, *dMixBufferL, *dMixBufferR;
364 int32_t pos;364 int32_t pos;
365 uint32_t i, samplesToMix, samplesLeft;365 uint32_t i, samplesToMix, samplesLeft;
366 uint64_t posFrac;366 uint64_t posFrac;
@@ -402,7 +402,7 @@ void centerMix8bLoopLIntrp(voice_t *v, uint32_t numSamples) · 35 unmodified lines
402void centerMix8bBidiLoopLIntrp(voice_t *v, uint32_t numSamples)402void centerMix8bBidiLoopLIntrp(voice_t *v, uint32_t numSamples)
403{403{
404 const int8_t *base, *revBase, *smpPtr;404 const int8_t *base, *revBase, *smpPtr;
405 float fSample, *fMixBufferL, *fMixBufferR;405 double dSample, *dMixBufferL, *dMixBufferR;
406 int32_t pos;406 int32_t pos;
407 uint32_t i, samplesToMix, samplesLeft;407 uint32_t i, samplesToMix, samplesLeft;
408 uint64_t posFrac, tmpDelta;408 uint64_t posFrac, tmpDelta;
@@ -446,9 +446,9 @@ void centerMix8bBidiLoopLIntrp(voice_t *v, uint32_t numSamples) · 37 unmodified lines
446void centerMix8bRampNoLoop(voice_t *v, uint32_t numSamples)446void centerMix8bRampNoLoop(voice_t *v, uint32_t numSamples)
447{447{
448 const int8_t *base, *smpPtr;448 const int8_t *base, *smpPtr;
449 float fSample, *fMixBufferL, *fMixBufferR;449 double dSample, *dMixBufferL, *dMixBufferR;
450 int32_t pos;450 int32_t pos;
451 float fVolLDelta, fVolL;451 double dVolLDelta, dVolL;
452 uint32_t i, samplesToMix, samplesLeft;452 uint32_t i, samplesToMix, samplesLeft;
453 uint64_t posFrac;453 uint64_t posFrac;
454 454
@@ -496,9 +496,9 @@ void centerMix8bRampNoLoop(voice_t *v, uint32_t numSamples) · 41 unmodified lines
496void centerMix8bRampLoop(voice_t *v, uint32_t numSamples)496void centerMix8bRampLoop(voice_t *v, uint32_t numSamples)
497{497{
498 const int8_t *base, *smpPtr;498 const int8_t *base, *smpPtr;
499 float fSample, *fMixBufferL, *fMixBufferR;499 double dSample, *dMixBufferL, *dMixBufferR;
500 int32_t pos;500 int32_t pos;
501 float fVolLDelta, fVolL;501 double dVolLDelta, dVolL;
502 uint32_t i, samplesToMix, samplesLeft;502 uint32_t i, samplesToMix, samplesLeft;
503 uint64_t posFrac;503 uint64_t posFrac;
504 504
@@ -546,9 +546,9 @@ void centerMix8bRampLoop(voice_t *v, uint32_t numSamples) · 41 unmodified lines
546void centerMix8bRampBidiLoop(voice_t *v, uint32_t numSamples)546void centerMix8bRampBidiLoop(voice_t *v, uint32_t numSamples)
547{547{
548 const int8_t *base, *revBase, *smpPtr;548 const int8_t *base, *revBase, *smpPtr;
549 float fSample, *fMixBufferL, *fMixBufferR;549 double dSample, *dMixBufferL, *dMixBufferR;
550 int32_t pos;550 int32_t pos;
551 float fVolLDelta, fVolL;551 double dVolLDelta, dVolL;
552 uint32_t i, samplesToMix, samplesLeft;552 uint32_t i, samplesToMix, samplesLeft;
553 uint64_t posFrac, tmpDelta;553 uint64_t posFrac, tmpDelta;
554 554
@@ -595,12 +595,12 @@ void centerMix8bRampBidiLoop(voice_t *v, uint32_t numSamples) · 40 unmodified lines
595 SET_BACK_MIXER_POS595 SET_BACK_MIXER_POS
596}596}
597 597
598void centerMix8bRampNoLoopCIntrp(voice_t *v, uint32_t numSamples)598void centerMix8bRampNoLoopSIntrp(voice_t *v, uint32_t numSamples)
599{599{
600 const int8_t *base, *smpPtr;600 const int8_t *base, *smpPtr;
601 float fSample, *fMixBufferL, *fMixBufferR;601 double dSample, *dMixBufferL, *dMixBufferR;
602 int32_t pos;602 int32_t pos;
603 float fVolLDelta, fVolL;603 double dVolLDelta, dVolL;
604 uint32_t i, samplesToMix, samplesLeft;604 uint32_t i, samplesToMix, samplesLeft;
605 uint64_t posFrac;605 uint64_t posFrac;
606 606
@@ -617,23 +617,23 @@ void centerMix8bRampNoLoopCIntrp(voice_t *v, uint32_t numSamples) · 10 unmodified lines
617 617
618 for (i = 0; i < (samplesToMix & 3); i++)618 for (i = 0; i < (samplesToMix & 3); i++)
619 {619 {
620 RENDER_8BIT_SMP_MONO_CINTRP620 RENDER_8BIT_SMP_MONO_SINTRP
621 VOLUME_RAMPING_MONO621 VOLUME_RAMPING_MONO
622 INC_POS622 INC_POS
623 }623 }
624 samplesToMix >>= 2;624 samplesToMix >>= 2;
625 for (i = 0; i < samplesToMix; i++)625 for (i = 0; i < samplesToMix; i++)
626 {626 {
627 RENDER_8BIT_SMP_MONO_CINTRP627 RENDER_8BIT_SMP_MONO_SINTRP
628 VOLUME_RAMPING_MONO628 VOLUME_RAMPING_MONO
629 INC_POS629 INC_POS
630 RENDER_8BIT_SMP_MONO_CINTRP630 RENDER_8BIT_SMP_MONO_SINTRP
631 VOLUME_RAMPING_MONO631 VOLUME_RAMPING_MONO
632 INC_POS632 INC_POS
633 RENDER_8BIT_SMP_MONO_CINTRP633 RENDER_8BIT_SMP_MONO_SINTRP
634 VOLUME_RAMPING_MONO634 VOLUME_RAMPING_MONO
635 INC_POS635 INC_POS
636 RENDER_8BIT_SMP_MONO_CINTRP636 RENDER_8BIT_SMP_MONO_SINTRP
637 VOLUME_RAMPING_MONO637 VOLUME_RAMPING_MONO
638 INC_POS638 INC_POS
639 }639 }
@@ -645,12 +645,12 @@ void centerMix8bRampNoLoopCIntrp(voice_t *v, uint32_t numSamples) · 5 unmodified lines
645 SET_BACK_MIXER_POS645 SET_BACK_MIXER_POS
646}646}
647 647
648void centerMix8bRampLoopCIntrp(voice_t *v, uint32_t numSamples)648void centerMix8bRampLoopSIntrp(voice_t *v, uint32_t numSamples)
649{649{
650 const int8_t *base, *smpPtr;650 const int8_t *base, *smpPtr;
651 float s0, s1, s2, s3, fSample, *fMixBufferL, *fMixBufferR;651 double dSample, *dMixBufferL, *dMixBufferR;
652 int32_t pos;652 int32_t pos;
653 float fVolLDelta, fVolL;653 double dVolLDelta, dVolL;
654 uint32_t i, samplesToMix, samplesLeft;654 uint32_t i, samplesToMix, samplesLeft;
655 uint64_t posFrac;655 uint64_t posFrac;
656 656
@@ -670,23 +670,23 @@ void centerMix8bRampLoopCIntrp(voice_t *v, uint32_t numSamples) · 13 unmodified lines
670 {670 {
671 for (i = 0; i < (samplesToMix & 3); i++)671 for (i = 0; i < (samplesToMix & 3); i++)
672 {672 {
673 RENDER_8BIT_SMP_MONO_CINTRP_TAP_FIX673 RENDER_8BIT_SMP_MONO_SINTRP_TAP_FIX
674 VOLUME_RAMPING_MONO674 VOLUME_RAMPING_MONO
675 INC_POS675 INC_POS
676 }676 }
677 samplesToMix >>= 2;677 samplesToMix >>= 2;
678 for (i = 0; i < samplesToMix; i++)678 for (i = 0; i < samplesToMix; i++)
679 {679 {
680 RENDER_8BIT_SMP_MONO_CINTRP_TAP_FIX680 RENDER_8BIT_SMP_MONO_SINTRP_TAP_FIX
681 VOLUME_RAMPING_MONO681 VOLUME_RAMPING_MONO
682 INC_POS682 INC_POS
683 RENDER_8BIT_SMP_MONO_CINTRP_TAP_FIX683 RENDER_8BIT_SMP_MONO_SINTRP_TAP_FIX
684 VOLUME_RAMPING_MONO684 VOLUME_RAMPING_MONO
685 INC_POS685 INC_POS
686 RENDER_8BIT_SMP_MONO_CINTRP_TAP_FIX686 RENDER_8BIT_SMP_MONO_SINTRP_TAP_FIX
687 VOLUME_RAMPING_MONO687 VOLUME_RAMPING_MONO
688 INC_POS688 INC_POS
689 RENDER_8BIT_SMP_MONO_CINTRP_TAP_FIX689 RENDER_8BIT_SMP_MONO_SINTRP_TAP_FIX
690 VOLUME_RAMPING_MONO690 VOLUME_RAMPING_MONO
691 INC_POS691 INC_POS
692 }692 }
@@ -695,23 +695,23 @@ void centerMix8bRampLoopCIntrp(voice_t *v, uint32_t numSamples) · 2 unmodified lines
695 {695 {
696 for (i = 0; i < (samplesToMix & 3); i++)696 for (i = 0; i < (samplesToMix & 3); i++)
697 {697 {
698 RENDER_8BIT_SMP_MONO_CINTRP698 RENDER_8BIT_SMP_MONO_SINTRP
699 VOLUME_RAMPING_MONO699 VOLUME_RAMPING_MONO
700 INC_POS700 INC_POS
701 }701 }
702 samplesToMix >>= 2;702 samplesToMix >>= 2;
703 for (i = 0; i < samplesToMix; i++)703 for (i = 0; i < samplesToMix; i++)
704 {704 {
705 RENDER_8BIT_SMP_MONO_CINTRP705 RENDER_8BIT_SMP_MONO_SINTRP
706 VOLUME_RAMPING_MONO706 VOLUME_RAMPING_MONO
707 INC_POS707 INC_POS
708 RENDER_8BIT_SMP_MONO_CINTRP708 RENDER_8BIT_SMP_MONO_SINTRP
709 VOLUME_RAMPING_MONO709 VOLUME_RAMPING_MONO
710 INC_POS710 INC_POS
711 RENDER_8BIT_SMP_MONO_CINTRP711 RENDER_8BIT_SMP_MONO_SINTRP
712 VOLUME_RAMPING_MONO712 VOLUME_RAMPING_MONO
713 INC_POS713 INC_POS
714 RENDER_8BIT_SMP_MONO_CINTRP714 RENDER_8BIT_SMP_MONO_SINTRP
715 VOLUME_RAMPING_MONO715 VOLUME_RAMPING_MONO
716 INC_POS716 INC_POS
717 }717 }
@@ -724,12 +724,12 @@ void centerMix8bRampLoopCIntrp(voice_t *v, uint32_t numSamples) · 6 unmodified lines
724 SET_BACK_MIXER_POS724 SET_BACK_MIXER_POS
725}725}
726 726
727void centerMix8bRampBidiLoopCIntrp(voice_t *v, uint32_t numSamples)727void centerMix8bRampBidiLoopSIntrp(voice_t *v, uint32_t numSamples)
728{728{
729 const int8_t *base, *revBase, *smpPtr;729 const int8_t *base, *revBase, *smpPtr;
730 float s0, s1, s2, s3, fSample, *fMixBufferL, *fMixBufferR;730 double dSample, *dMixBufferL, *dMixBufferR;
731 int32_t pos;731 int32_t pos;
732 float fVolLDelta, fVolL;732 double dVolLDelta, dVolL;
733 uint32_t i, samplesToMix, samplesLeft;733 uint32_t i, samplesToMix, samplesLeft;
734 uint64_t posFrac, tmpDelta;734 uint64_t posFrac, tmpDelta;
735 735
@@ -750,23 +750,23 @@ void centerMix8bRampBidiLoopCIntrp(voice_t *v, uint32_t numSamples) · 14 unmodified lines
750 {750 {
751 for (i = 0; i < (samplesToMix & 3); i++)751 for (i = 0; i < (samplesToMix & 3); i++)
752 {752 {
753 RENDER_8BIT_SMP_MONO_CINTRP_TAP_FIX753 RENDER_8BIT_SMP_MONO_SINTRP_TAP_FIX
754 VOLUME_RAMPING_MONO754 VOLUME_RAMPING_MONO
755 INC_POS_BIDI755 INC_POS_BIDI
756 }756 }
757 samplesToMix >>= 2;757 samplesToMix >>= 2;
758 for (i = 0; i < samplesToMix; i++)758 for (i = 0; i < samplesToMix; i++)
759 {759 {
760 RENDER_8BIT_SMP_MONO_CINTRP_TAP_FIX760 RENDER_8BIT_SMP_MONO_SINTRP_TAP_FIX
761 VOLUME_RAMPING_MONO761 VOLUME_RAMPING_MONO
762 INC_POS_BIDI762 INC_POS_BIDI
763 RENDER_8BIT_SMP_MONO_CINTRP_TAP_FIX763 RENDER_8BIT_SMP_MONO_SINTRP_TAP_FIX
764 VOLUME_RAMPING_MONO764 VOLUME_RAMPING_MONO
765 INC_POS_BIDI765 INC_POS_BIDI
766 RENDER_8BIT_SMP_MONO_CINTRP_TAP_FIX766 RENDER_8BIT_SMP_MONO_SINTRP_TAP_FIX
767 VOLUME_RAMPING_MONO767 VOLUME_RAMPING_MONO
768 INC_POS_BIDI768 INC_POS_BIDI
769 RENDER_8BIT_SMP_MONO_CINTRP_TAP_FIX769 RENDER_8BIT_SMP_MONO_SINTRP_TAP_FIX
770 VOLUME_RAMPING_MONO770 VOLUME_RAMPING_MONO
771 INC_POS_BIDI771 INC_POS_BIDI
772 }772 }
@@ -775,23 +775,23 @@ void centerMix8bRampBidiLoopCIntrp(voice_t *v, uint32_t numSamples) · 2 unmodified lines
775 {775 {
776 for (i = 0; i < (samplesToMix & 3); i++)776 for (i = 0; i < (samplesToMix & 3); i++)
777 {777 {
778 RENDER_8BIT_SMP_MONO_CINTRP778 RENDER_8BIT_SMP_MONO_SINTRP
779 VOLUME_RAMPING_MONO779 VOLUME_RAMPING_MONO
780 INC_POS_BIDI780 INC_POS_BIDI
781 }781 }
782 samplesToMix >>= 2;782 samplesToMix >>= 2;
783 for (i = 0; i < samplesToMix; i++)783 for (i = 0; i < samplesToMix; i++)
784 {784 {
785 RENDER_8BIT_SMP_MONO_CINTRP785 RENDER_8BIT_SMP_MONO_SINTRP
786 VOLUME_RAMPING_MONO786 VOLUME_RAMPING_MONO
787 INC_POS_BIDI787 INC_POS_BIDI
788 RENDER_8BIT_SMP_MONO_CINTRP788 RENDER_8BIT_SMP_MONO_SINTRP
789 VOLUME_RAMPING_MONO789 VOLUME_RAMPING_MONO
790 INC_POS_BIDI790 INC_POS_BIDI
791 RENDER_8BIT_SMP_MONO_CINTRP791 RENDER_8BIT_SMP_MONO_SINTRP
792 VOLUME_RAMPING_MONO792 VOLUME_RAMPING_MONO
793 INC_POS_BIDI793 INC_POS_BIDI
794 RENDER_8BIT_SMP_MONO_CINTRP794 RENDER_8BIT_SMP_MONO_SINTRP
795 VOLUME_RAMPING_MONO795 VOLUME_RAMPING_MONO
796 INC_POS_BIDI796 INC_POS_BIDI
797 }797 }
@@ -808,9 +808,9 @@ void centerMix8bRampBidiLoopCIntrp(voice_t *v, uint32_t numSamples) · 10 unmodified lines
808void centerMix8bRampNoLoopLIntrp(voice_t *v, uint32_t numSamples)808void centerMix8bRampNoLoopLIntrp(voice_t *v, uint32_t numSamples)
809{809{
810 const int8_t *base, *smpPtr;810 const int8_t *base, *smpPtr;
811 float fSample, *fMixBufferL, *fMixBufferR;811 double dSample, *dMixBufferL, *dMixBufferR;
812 int32_t pos;812 int32_t pos;
813 float fVolLDelta, fVolL;813 double dVolLDelta, dVolL;
814 uint32_t i, samplesToMix, samplesLeft;814 uint32_t i, samplesToMix, samplesLeft;
815 uint64_t posFrac;815 uint64_t posFrac;
816 816
@@ -858,9 +858,9 @@ void centerMix8bRampNoLoopLIntrp(voice_t *v, uint32_t numSamples) · 41 unmodified lines
858void centerMix8bRampLoopLIntrp(voice_t *v, uint32_t numSamples)858void centerMix8bRampLoopLIntrp(voice_t *v, uint32_t numSamples)
859{859{
860 const int8_t *base, *smpPtr;860 const int8_t *base, *smpPtr;
861 float fSample, *fMixBufferL, *fMixBufferR;861 double dSample, *dMixBufferL, *dMixBufferR;
862 int32_t pos;862 int32_t pos;
863 float fVolLDelta, fVolL;863 double dVolLDelta, dVolL;
864 uint32_t i, samplesToMix, samplesLeft;864 uint32_t i, samplesToMix, samplesLeft;
865 uint64_t posFrac;865 uint64_t posFrac;
866 866
@@ -908,9 +908,9 @@ void centerMix8bRampLoopLIntrp(voice_t *v, uint32_t numSamples) · 41 unmodified lines
908void centerMix8bRampBidiLoopLIntrp(voice_t *v, uint32_t numSamples)908void centerMix8bRampBidiLoopLIntrp(voice_t *v, uint32_t numSamples)
909{909{
910 const int8_t *base, *revBase, *smpPtr;910 const int8_t *base, *revBase, *smpPtr;
911 float fSample, *fMixBufferL, *fMixBufferR;911 double dSample, *dMixBufferL, *dMixBufferR;
912 int32_t pos;912 int32_t pos;
913 float fVolLDelta, fVolL;913 double dVolLDelta, dVolL;
914 uint32_t i, samplesToMix, samplesLeft;914 uint32_t i, samplesToMix, samplesLeft;
915 uint64_t posFrac, tmpDelta;915 uint64_t posFrac, tmpDelta;
916 916
@@ -964,7 +964,7 @@ void centerMix8bRampBidiLoopLIntrp(voice_t *v, uint32_t numSamples) · 47 unmodified lines
964void centerMix16bNoLoop(voice_t *v, uint32_t numSamples)964void centerMix16bNoLoop(voice_t *v, uint32_t numSamples)
965{965{
966 const int16_t *base, *smpPtr;966 const int16_t *base, *smpPtr;
967 float fSample, *fMixBufferL, *fMixBufferR;967 double dSample, *dMixBufferL, *dMixBufferR;
968 int32_t pos;968 int32_t pos;
969 uint32_t i, samplesToMix, samplesLeft;969 uint32_t i, samplesToMix, samplesLeft;
970 uint64_t posFrac;970 uint64_t posFrac;
@@ -1006,7 +1006,7 @@ void centerMix16bNoLoop(voice_t *v, uint32_t numSamples) · 35 unmodified lines
1006void centerMix16bLoop(voice_t *v, uint32_t numSamples)1006void centerMix16bLoop(voice_t *v, uint32_t numSamples)
1007{1007{
1008 const int16_t *base, *smpPtr;1008 const int16_t *base, *smpPtr;
1009 float fSample, *fMixBufferL, *fMixBufferR;1009 double dSample, *dMixBufferL, *dMixBufferR;
1010 int32_t pos;1010 int32_t pos;
1011 uint32_t i, samplesToMix, samplesLeft;1011 uint32_t i, samplesToMix, samplesLeft;
1012 uint64_t posFrac;1012 uint64_t posFrac;
@@ -1048,7 +1048,7 @@ void centerMix16bLoop(voice_t *v, uint32_t numSamples) · 35 unmodified lines
1048void centerMix16bBidiLoop(voice_t *v, uint32_t numSamples)1048void centerMix16bBidiLoop(voice_t *v, uint32_t numSamples)
1049{1049{
1050 const int16_t *base, *revBase, *smpPtr;1050 const int16_t *base, *revBase, *smpPtr;
1051 float fSample, *fMixBufferL, *fMixBufferR;1051 double dSample, *dMixBufferL, *dMixBufferR;
1052 int32_t pos;1052 int32_t pos;
1053 uint32_t i, samplesToMix, samplesLeft;1053 uint32_t i, samplesToMix, samplesLeft;
1054 uint64_t posFrac, tmpDelta;1054 uint64_t posFrac, tmpDelta;
@@ -1089,10 +1089,10 @@ void centerMix16bBidiLoop(voice_t *v, uint32_t numSamples) · 34 unmodified lines
1089 SET_BACK_MIXER_POS1089 SET_BACK_MIXER_POS
1090}1090}
1091 1091
1092void centerMix16bNoLoopCIntrp(voice_t *v, uint32_t numSamples)1092void centerMix16bNoLoopSIntrp(voice_t *v, uint32_t numSamples)
1093{1093{
1094 const int16_t *base, *smpPtr;1094 const int16_t *base, *smpPtr;
1095 float fSample, *fMixBufferL, *fMixBufferR;1095 double dSample, *dMixBufferL, *dMixBufferR;
1096 int32_t pos;1096 int32_t pos;
1097 uint32_t i, samplesToMix, samplesLeft;1097 uint32_t i, samplesToMix, samplesLeft;
1098 uint64_t posFrac;1098 uint64_t posFrac;
@@ -1109,19 +1109,19 @@ void centerMix16bNoLoopCIntrp(voice_t *v, uint32_t numSamples) · 10 unmodified lines
1109 1109
1110 for (i = 0; i < (samplesToMix & 3); i++)1110 for (i = 0; i < (samplesToMix & 3); i++)
1111 {1111 {
1112 RENDER_16BIT_SMP_MONO_CINTRP1112 RENDER_16BIT_SMP_MONO_SINTRP
1113 INC_POS1113 INC_POS
1114 }1114 }
1115 samplesToMix >>= 2;1115 samplesToMix >>= 2;
1116 for (i = 0; i < samplesToMix; i++)1116 for (i = 0; i < samplesToMix; i++)
1117 {1117 {
1118 RENDER_16BIT_SMP_MONO_CINTRP1118 RENDER_16BIT_SMP_MONO_SINTRP
1119 INC_POS1119 INC_POS
1120 RENDER_16BIT_SMP_MONO_CINTRP1120 RENDER_16BIT_SMP_MONO_SINTRP
1121 INC_POS1121 INC_POS
1122 RENDER_16BIT_SMP_MONO_CINTRP1122 RENDER_16BIT_SMP_MONO_SINTRP
1123 INC_POS1123 INC_POS
1124 RENDER_16BIT_SMP_MONO_CINTRP1124 RENDER_16BIT_SMP_MONO_SINTRP
1125 INC_POS1125 INC_POS
1126 }1126 }
1127 1127
@@ -1131,10 +1131,10 @@ void centerMix16bNoLoopCIntrp(voice_t *v, uint32_t numSamples) · 3 unmodified lines
1131 SET_BACK_MIXER_POS1131 SET_BACK_MIXER_POS
1132}1132}
1133 1133
1134void centerMix16bLoopCIntrp(voice_t *v, uint32_t numSamples)1134void centerMix16bLoopSIntrp(voice_t *v, uint32_t numSamples)
1135{1135{
1136 const int16_t *base, *smpPtr;1136 const int16_t *base, *smpPtr;
1137 float s0, s1, s2, s3, fSample, *fMixBufferL, *fMixBufferR;1137 double dSample, *dMixBufferL, *dMixBufferR;
1138 int32_t pos;1138 int32_t pos;
1139 uint32_t i, samplesToMix, samplesLeft;1139 uint32_t i, samplesToMix, samplesLeft;
1140 uint64_t posFrac;1140 uint64_t posFrac;
@@ -1154,19 +1154,19 @@ void centerMix16bLoopCIntrp(voice_t *v, uint32_t numSamples) · 13 unmodified lines
1154 {1154 {
1155 for (i = 0; i < (samplesToMix & 3); i++)1155 for (i = 0; i < (samplesToMix & 3); i++)
1156 {1156 {
1157 RENDER_16BIT_SMP_MONO_CINTRP_TAP_FIX1157 RENDER_16BIT_SMP_MONO_SINTRP_TAP_FIX
1158 INC_POS1158 INC_POS
1159 }1159 }
1160 samplesToMix >>= 2;1160 samplesToMix >>= 2;
1161 for (i = 0; i < samplesToMix; i++)1161 for (i = 0; i < samplesToMix; i++)
1162 {1162 {
1163 RENDER_16BIT_SMP_MONO_CINTRP_TAP_FIX1163 RENDER_16BIT_SMP_MONO_SINTRP_TAP_FIX
1164 INC_POS1164 INC_POS
1165 RENDER_16BIT_SMP_MONO_CINTRP_TAP_FIX1165 RENDER_16BIT_SMP_MONO_SINTRP_TAP_FIX
1166 INC_POS1166 INC_POS
1167 RENDER_16BIT_SMP_MONO_CINTRP_TAP_FIX1167 RENDER_16BIT_SMP_MONO_SINTRP_TAP_FIX
1168 INC_POS1168 INC_POS
1169 RENDER_16BIT_SMP_MONO_CINTRP_TAP_FIX1169 RENDER_16BIT_SMP_MONO_SINTRP_TAP_FIX
1170 INC_POS1170 INC_POS
1171 }1171 }
1172 }1172 }
@@ -1174,19 +1174,19 @@ void centerMix16bLoopCIntrp(voice_t *v, uint32_t numSamples) · 1 unmodified line
1174 {1174 {
1175 for (i = 0; i < (samplesToMix & 3); i++)1175 for (i = 0; i < (samplesToMix & 3); i++)
1176 {1176 {
1177 RENDER_16BIT_SMP_MONO_CINTRP1177 RENDER_16BIT_SMP_MONO_SINTRP
1178 INC_POS1178 INC_POS
1179 }1179 }
1180 samplesToMix >>= 2;1180 samplesToMix >>= 2;
1181 for (i = 0; i < samplesToMix; i++)1181 for (i = 0; i < samplesToMix; i++)
1182 {1182 {
1183 RENDER_16BIT_SMP_MONO_CINTRP1183 RENDER_16BIT_SMP_MONO_SINTRP
1184 INC_POS1184 INC_POS
1185 RENDER_16BIT_SMP_MONO_CINTRP1185 RENDER_16BIT_SMP_MONO_SINTRP
1186 INC_POS1186 INC_POS
1187 RENDER_16BIT_SMP_MONO_CINTRP1187 RENDER_16BIT_SMP_MONO_SINTRP
1188 INC_POS1188 INC_POS
1189 RENDER_16BIT_SMP_MONO_CINTRP1189 RENDER_16BIT_SMP_MONO_SINTRP
1190 INC_POS1190 INC_POS
1191 }1191 }
1192 }1192 }
@@ -1197,10 +1197,10 @@ void centerMix16bLoopCIntrp(voice_t *v, uint32_t numSamples) · 4 unmodified lines
1197 SET_BACK_MIXER_POS1197 SET_BACK_MIXER_POS
1198}1198}
1199 1199
1200void centerMix16bBidiLoopCIntrp(voice_t *v, uint32_t numSamples)1200void centerMix16bBidiLoopSIntrp(voice_t *v, uint32_t numSamples)
1201{1201{
1202 const int16_t *base, *revBase, *smpPtr;1202 const int16_t *base, *revBase, *smpPtr;
1203 float s0, s1, s2, s3, fSample, *fMixBufferL, *fMixBufferR;1203 double dSample, *dMixBufferL, *dMixBufferR;
1204 int32_t pos;1204 int32_t pos;
1205 uint32_t i, samplesToMix, samplesLeft;1205 uint32_t i, samplesToMix, samplesLeft;
1206 uint64_t posFrac, tmpDelta;1206 uint64_t posFrac, tmpDelta;
@@ -1221,19 +1221,19 @@ void centerMix16bBidiLoopCIntrp(voice_t *v, uint32_t numSamples) · 14 unmodified lines
1221 {1221 {
1222 for (i = 0; i < (samplesToMix & 3); i++)1222 for (i = 0; i < (samplesToMix & 3); i++)
1223 {1223 {
1224 RENDER_16BIT_SMP_MONO_CINTRP_TAP_FIX1224 RENDER_16BIT_SMP_MONO_SINTRP_TAP_FIX
1225 INC_POS_BIDI1225 INC_POS_BIDI
1226 }1226 }
1227 samplesToMix >>= 2;1227 samplesToMix >>= 2;
1228 for (i = 0; i < samplesToMix; i++)1228 for (i = 0; i < samplesToMix; i++)
1229 {1229 {
1230 RENDER_16BIT_SMP_MONO_CINTRP_TAP_FIX1230 RENDER_16BIT_SMP_MONO_SINTRP_TAP_FIX
1231 INC_POS_BIDI1231 INC_POS_BIDI
1232 RENDER_16BIT_SMP_MONO_CINTRP_TAP_FIX1232 RENDER_16BIT_SMP_MONO_SINTRP_TAP_FIX
1233 INC_POS_BIDI1233 INC_POS_BIDI
1234 RENDER_16BIT_SMP_MONO_CINTRP_TAP_FIX1234 RENDER_16BIT_SMP_MONO_SINTRP_TAP_FIX
1235 INC_POS_BIDI1235 INC_POS_BIDI
1236 RENDER_16BIT_SMP_MONO_CINTRP_TAP_FIX1236 RENDER_16BIT_SMP_MONO_SINTRP_TAP_FIX
1237 INC_POS_BIDI1237 INC_POS_BIDI
1238 }1238 }
1239 }1239 }
@@ -1241,19 +1241,19 @@ void centerMix16bBidiLoopCIntrp(voice_t *v, uint32_t numSamples) · 1 unmodified line
1241 {1241 {
1242 for (i = 0; i < (samplesToMix & 3); i++)1242 for (i = 0; i < (samplesToMix & 3); i++)
1243 {1243 {
1244 RENDER_16BIT_SMP_MONO_CINTRP1244 RENDER_16BIT_SMP_MONO_SINTRP
1245 INC_POS_BIDI1245 INC_POS_BIDI
1246 }1246 }
1247 samplesToMix >>= 2;1247 samplesToMix >>= 2;
1248 for (i = 0; i < samplesToMix; i++)1248 for (i = 0; i < samplesToMix; i++)
1249 {1249 {
1250 RENDER_16BIT_SMP_MONO_CINTRP1250 RENDER_16BIT_SMP_MONO_SINTRP
1251 INC_POS_BIDI1251 INC_POS_BIDI
1252 RENDER_16BIT_SMP_MONO_CINTRP1252 RENDER_16BIT_SMP_MONO_SINTRP
1253 INC_POS_BIDI1253 INC_POS_BIDI
1254 RENDER_16BIT_SMP_MONO_CINTRP1254 RENDER_16BIT_SMP_MONO_SINTRP
1255 INC_POS_BIDI1255 INC_POS_BIDI
1256 RENDER_16BIT_SMP_MONO_CINTRP1256 RENDER_16BIT_SMP_MONO_SINTRP
1257 INC_POS_BIDI1257 INC_POS_BIDI
1258 }1258 }
1259 }1259 }
@@ -1268,7 +1268,7 @@ void centerMix16bBidiLoopCIntrp(voice_t *v, uint32_t numSamples) · 8 unmodified lines
1268void centerMix16bNoLoopLIntrp(voice_t *v, uint32_t numSamples)1268void centerMix16bNoLoopLIntrp(voice_t *v, uint32_t numSamples)
1269{1269{
1270 const int16_t *base, *smpPtr;1270 const int16_t *base, *smpPtr;
1271 float fSample, *fMixBufferL, *fMixBufferR;1271 double dSample, *dMixBufferL, *dMixBufferR;
1272 int32_t pos;1272 int32_t pos;
1273 uint32_t i, samplesToMix, samplesLeft;1273 uint32_t i, samplesToMix, samplesLeft;
1274 uint64_t posFrac;1274 uint64_t posFrac;
@@ -1310,7 +1310,7 @@ void centerMix16bNoLoopLIntrp(voice_t *v, uint32_t numSamples) · 35 unmodified lines
1310void centerMix16bLoopLIntrp(voice_t *v, uint32_t numSamples)1310void centerMix16bLoopLIntrp(voice_t *v, uint32_t numSamples)
1311{1311{
1312 const int16_t *base, *smpPtr;1312 const int16_t *base, *smpPtr;
1313 float fSample, *fMixBufferL, *fMixBufferR;1313 double dSample, *dMixBufferL, *dMixBufferR;
1314 int32_t pos;1314 int32_t pos;
1315 uint32_t i, samplesToMix, samplesLeft;1315 uint32_t i, samplesToMix, samplesLeft;
1316 uint64_t posFrac;1316 uint64_t posFrac;
@@ -1352,7 +1352,7 @@ void centerMix16bLoopLIntrp(voice_t *v, uint32_t numSamples) · 35 unmodified lines
1352void centerMix16bBidiLoopLIntrp(voice_t *v, uint32_t numSamples)1352void centerMix16bBidiLoopLIntrp(voice_t *v, uint32_t numSamples)
1353{1353{
1354 const int16_t *base, *revBase, *smpPtr;1354 const int16_t *base, *revBase, *smpPtr;
1355 float fSample, *fMixBufferL, *fMixBufferR;1355 double dSample, *dMixBufferL, *dMixBufferR;
1356 int32_t pos;1356 int32_t pos;
1357 uint32_t i, samplesToMix, samplesLeft;1357 uint32_t i, samplesToMix, samplesLeft;
1358 uint64_t posFrac, tmpDelta;1358 uint64_t posFrac, tmpDelta;
@@ -1397,9 +1397,9 @@ void centerMix16bBidiLoopLIntrp(voice_t *v, uint32_t numSamples) · 38 unmodified lines
1397void centerMix16bRampNoLoop(voice_t *v, uint32_t numSamples)1397void centerMix16bRampNoLoop(voice_t *v, uint32_t numSamples)
1398{1398{
1399 const int16_t *base, *smpPtr;1399 const int16_t *base, *smpPtr;
1400 float fSample, *fMixBufferL, *fMixBufferR;1400 double dSample, *dMixBufferL, *dMixBufferR;
1401 int32_t pos;1401 int32_t pos;
1402 float fVolLDelta, fVolL;1402 double dVolLDelta, dVolL;
1403 uint32_t i, samplesToMix, samplesLeft;1403 uint32_t i, samplesToMix, samplesLeft;
1404 uint64_t posFrac;1404 uint64_t posFrac;
1405 1405
@@ -1447,9 +1447,9 @@ void centerMix16bRampNoLoop(voice_t *v, uint32_t numSamples) · 41 unmodified lines
1447void centerMix16bRampLoop(voice_t *v, uint32_t numSamples)1447void centerMix16bRampLoop(voice_t *v, uint32_t numSamples)
1448{1448{
1449 const int16_t *base, *smpPtr;1449 const int16_t *base, *smpPtr;
1450 float fSample, *fMixBufferL, *fMixBufferR;1450 double dSample, *dMixBufferL, *dMixBufferR;
1451 int32_t pos;1451 int32_t pos;
1452 float fVolLDelta, fVolL;1452 double dVolLDelta, dVolL;
1453 uint32_t i, samplesToMix, samplesLeft;1453 uint32_t i, samplesToMix, samplesLeft;
1454 uint64_t posFrac;1454 uint64_t posFrac;
1455 1455
@@ -1497,9 +1497,9 @@ void centerMix16bRampLoop(voice_t *v, uint32_t numSamples) · 41 unmodified lines
1497void centerMix16bRampBidiLoop(voice_t *v, uint32_t numSamples)1497void centerMix16bRampBidiLoop(voice_t *v, uint32_t numSamples)
1498{1498{
1499 const int16_t *base, *revBase, *smpPtr;1499 const int16_t *base, *revBase, *smpPtr;
1500 float fSample, *fMixBufferL, *fMixBufferR;1500 double dSample, *dMixBufferL, *dMixBufferR;
1501 int32_t pos;1501 int32_t pos;
1502 float fVolLDelta, fVolL;1502 double dVolLDelta, dVolL;
1503 uint32_t i, samplesToMix, samplesLeft;1503 uint32_t i, samplesToMix, samplesLeft;
1504 uint64_t posFrac, tmpDelta;1504 uint64_t posFrac, tmpDelta;
1505 1505
@@ -1546,12 +1546,12 @@ void centerMix16bRampBidiLoop(voice_t *v, uint32_t numSamples) · 40 unmodified lines
1546 SET_BACK_MIXER_POS1546 SET_BACK_MIXER_POS
1547}1547}
1548 1548
1549void centerMix16bRampNoLoopCIntrp(voice_t *v, uint32_t numSamples)1549void centerMix16bRampNoLoopSIntrp(voice_t *v, uint32_t numSamples)
1550{1550{
1551 const int16_t *base, *smpPtr;1551 const int16_t *base, *smpPtr;
1552 float fSample, *fMixBufferL, *fMixBufferR;1552 double dSample, *dMixBufferL, *dMixBufferR;
1553 int32_t pos;1553 int32_t pos;
1554 float fVolLDelta, fVolL;1554 double dVolLDelta, dVolL;
1555 uint32_t i, samplesToMix, samplesLeft;1555 uint32_t i, samplesToMix, samplesLeft;
1556 uint64_t posFrac;1556 uint64_t posFrac;
1557 1557
@@ -1568,23 +1568,23 @@ void centerMix16bRampNoLoopCIntrp(voice_t *v, uint32_t numSamples) · 10 unmodified lines
1568 1568
1569 for (i = 0; i < (samplesToMix & 3); i++)1569 for (i = 0; i < (samplesToMix & 3); i++)
1570 {1570 {
1571 RENDER_16BIT_SMP_MONO_CINTRP1571 RENDER_16BIT_SMP_MONO_SINTRP
1572 VOLUME_RAMPING_MONO1572 VOLUME_RAMPING_MONO
1573 INC_POS1573 INC_POS
1574 }1574 }
1575 samplesToMix >>= 2;1575 samplesToMix >>= 2;
1576 for (i = 0; i < samplesToMix; i++)1576 for (i = 0; i < samplesToMix; i++)
1577 {1577 {
1578 RENDER_16BIT_SMP_MONO_CINTRP1578 RENDER_16BIT_SMP_MONO_SINTRP
1579 VOLUME_RAMPING_MONO1579 VOLUME_RAMPING_MONO
1580 INC_POS1580 INC_POS
1581 RENDER_16BIT_SMP_MONO_CINTRP1581 RENDER_16BIT_SMP_MONO_SINTRP
1582 VOLUME_RAMPING_MONO1582 VOLUME_RAMPING_MONO
1583 INC_POS1583 INC_POS
1584 RENDER_16BIT_SMP_MONO_CINTRP1584 RENDER_16BIT_SMP_MONO_SINTRP
1585 VOLUME_RAMPING_MONO1585 VOLUME_RAMPING_MONO
1586 INC_POS1586 INC_POS
1587 RENDER_16BIT_SMP_MONO_CINTRP1587 RENDER_16BIT_SMP_MONO_SINTRP
1588 VOLUME_RAMPING_MONO1588 VOLUME_RAMPING_MONO
1589 INC_POS1589 INC_POS
1590 }1590 }
@@ -1596,12 +1596,12 @@ void centerMix16bRampNoLoopCIntrp(voice_t *v, uint32_t numSamples) · 5 unmodified lines
1596 SET_BACK_MIXER_POS1596 SET_BACK_MIXER_POS
1597}1597}
1598 1598
1599void centerMix16bRampLoopCIntrp(voice_t *v, uint32_t numSamples)1599void centerMix16bRampLoopSIntrp(voice_t *v, uint32_t numSamples)
1600{1600{
1601 const int16_t *base, *smpPtr;1601 const int16_t *base, *smpPtr;
1602 float s0, s1, s2, s3, fSample, *fMixBufferL, *fMixBufferR;1602 double dSample, *dMixBufferL, *dMixBufferR;
1603 int32_t pos;1603 int32_t pos;
1604 float fVolLDelta, fVolL;1604 double dVolLDelta, dVolL;
1605 uint32_t i, samplesToMix, samplesLeft;1605 uint32_t i, samplesToMix, samplesLeft;
1606 uint64_t posFrac;1606 uint64_t posFrac;
1607 1607
@@ -1621,23 +1621,23 @@ void centerMix16bRampLoopCIntrp(voice_t *v, uint32_t numSamples) · 13 unmodified lines
1621 {1621 {
1622 for (i = 0; i < (samplesToMix & 3); i++)1622 for (i = 0; i < (samplesToMix & 3); i++)
1623 {1623 {
1624 RENDER_16BIT_SMP_MONO_CINTRP_TAP_FIX1624 RENDER_16BIT_SMP_MONO_SINTRP_TAP_FIX
1625 VOLUME_RAMPING_MONO1625 VOLUME_RAMPING_MONO
1626 INC_POS1626 INC_POS
1627 }1627 }
1628 samplesToMix >>= 2;1628 samplesToMix >>= 2;
1629 for (i = 0; i < samplesToMix; i++)1629 for (i = 0; i < samplesToMix; i++)
1630 {1630 {
1631 RENDER_16BIT_SMP_MONO_CINTRP_TAP_FIX1631 RENDER_16BIT_SMP_MONO_SINTRP_TAP_FIX
1632 VOLUME_RAMPING_MONO1632 VOLUME_RAMPING_MONO
1633 INC_POS1633 INC_POS
1634 RENDER_16BIT_SMP_MONO_CINTRP_TAP_FIX1634 RENDER_16BIT_SMP_MONO_SINTRP_TAP_FIX
1635 VOLUME_RAMPING_MONO1635 VOLUME_RAMPING_MONO
1636 INC_POS1636 INC_POS
1637 RENDER_16BIT_SMP_MONO_CINTRP_TAP_FIX1637 RENDER_16BIT_SMP_MONO_SINTRP_TAP_FIX
1638 VOLUME_RAMPING_MONO1638 VOLUME_RAMPING_MONO
1639 INC_POS1639 INC_POS
1640 RENDER_16BIT_SMP_MONO_CINTRP_TAP_FIX1640 RENDER_16BIT_SMP_MONO_SINTRP_TAP_FIX
1641 VOLUME_RAMPING_MONO1641 VOLUME_RAMPING_MONO
1642 INC_POS1642 INC_POS
1643 }1643 }
@@ -1646,23 +1646,23 @@ void centerMix16bRampLoopCIntrp(voice_t *v, uint32_t numSamples) · 2 unmodified lines
1646 {1646 {
1647 for (i = 0; i < (samplesToMix & 3); i++)1647 for (i = 0; i < (samplesToMix & 3); i++)
1648 {1648 {
1649 RENDER_16BIT_SMP_MONO_CINTRP1649 RENDER_16BIT_SMP_MONO_SINTRP
1650 VOLUME_RAMPING_MONO1650 VOLUME_RAMPING_MONO
1651 INC_POS1651 INC_POS
1652 }1652 }
1653 samplesToMix >>= 2;1653 samplesToMix >>= 2;
1654 for (i = 0; i < samplesToMix; i++)1654 for (i = 0; i < samplesToMix; i++)
1655 {1655 {
1656 RENDER_16BIT_SMP_MONO_CINTRP1656 RENDER_16BIT_SMP_MONO_SINTRP
1657 VOLUME_RAMPING_MONO1657 VOLUME_RAMPING_MONO
1658 INC_POS1658 INC_POS
1659 RENDER_16BIT_SMP_MONO_CINTRP1659 RENDER_16BIT_SMP_MONO_SINTRP
1660 VOLUME_RAMPING_MONO1660 VOLUME_RAMPING_MONO
1661 INC_POS1661 INC_POS
1662 RENDER_16BIT_SMP_MONO_CINTRP1662 RENDER_16BIT_SMP_MONO_SINTRP
1663 VOLUME_RAMPING_MONO1663 VOLUME_RAMPING_MONO
1664 INC_POS1664 INC_POS
1665 RENDER_16BIT_SMP_MONO_CINTRP1665 RENDER_16BIT_SMP_MONO_SINTRP
1666 VOLUME_RAMPING_MONO1666 VOLUME_RAMPING_MONO
1667 INC_POS1667 INC_POS
1668 }1668 }
@@ -1675,12 +1675,12 @@ void centerMix16bRampLoopCIntrp(voice_t *v, uint32_t numSamples) · 6 unmodified lines
1675 SET_BACK_MIXER_POS1675 SET_BACK_MIXER_POS
1676}1676}
1677 1677
1678void centerMix16bRampBidiLoopCIntrp(voice_t *v, uint32_t numSamples)1678void centerMix16bRampBidiLoopSIntrp(voice_t *v, uint32_t numSamples)
1679{1679{
1680 const int16_t *base, *revBase, *smpPtr;1680 const int16_t *base, *revBase, *smpPtr;
1681 float s0, s1, s2, s3, fSample, *fMixBufferL, *fMixBufferR;1681 double dSample, *dMixBufferL, *dMixBufferR;
1682 int32_t pos;1682 int32_t pos;
1683 float fVolLDelta, fVolL;1683 double dVolLDelta, dVolL;
1684 uint32_t i, samplesToMix, samplesLeft;1684 uint32_t i, samplesToMix, samplesLeft;
1685 uint64_t posFrac, tmpDelta;1685 uint64_t posFrac, tmpDelta;
1686 1686
@@ -1701,23 +1701,23 @@ void centerMix16bRampBidiLoopCIntrp(voice_t *v, uint32_t numSamples) · 14 unmodified lines
1701 {1701 {
1702 for (i = 0; i < (samplesToMix & 3); i++)1702 for (i = 0; i < (samplesToMix & 3); i++)
1703 {1703 {
1704 RENDER_16BIT_SMP_MONO_CINTRP_TAP_FIX1704 RENDER_16BIT_SMP_MONO_SINTRP_TAP_FIX
1705 VOLUME_RAMPING_MONO1705 VOLUME_RAMPING_MONO
1706 INC_POS_BIDI1706 INC_POS_BIDI
1707 }1707 }
1708 samplesToMix >>= 2;1708 samplesToMix >>= 2;
1709 for (i = 0; i < samplesToMix; i++)1709 for (i = 0; i < samplesToMix; i++)
1710 {1710 {
1711 RENDER_16BIT_SMP_MONO_CINTRP_TAP_FIX1711 RENDER_16BIT_SMP_MONO_SINTRP_TAP_FIX
1712 VOLUME_RAMPING_MONO1712 VOLUME_RAMPING_MONO
1713 INC_POS_BIDI1713 INC_POS_BIDI
1714 RENDER_16BIT_SMP_MONO_CINTRP_TAP_FIX1714 RENDER_16BIT_SMP_MONO_SINTRP_TAP_FIX
1715 VOLUME_RAMPING_MONO1715 VOLUME_RAMPING_MONO
1716 INC_POS_BIDI1716 INC_POS_BIDI
1717 RENDER_16BIT_SMP_MONO_CINTRP_TAP_FIX1717 RENDER_16BIT_SMP_MONO_SINTRP_TAP_FIX
1718 VOLUME_RAMPING_MONO1718 VOLUME_RAMPING_MONO
1719 INC_POS_BIDI1719 INC_POS_BIDI
1720 RENDER_16BIT_SMP_MONO_CINTRP_TAP_FIX1720 RENDER_16BIT_SMP_MONO_SINTRP_TAP_FIX
1721 VOLUME_RAMPING_MONO1721 VOLUME_RAMPING_MONO
1722 INC_POS_BIDI1722 INC_POS_BIDI
1723 }1723 }
@@ -1726,23 +1726,23 @@ void centerMix16bRampBidiLoopCIntrp(voice_t *v, uint32_t numSamples) · 2 unmodified lines
1726 {1726 {
1727 for (i = 0; i < (samplesToMix & 3); i++)1727 for (i = 0; i < (samplesToMix & 3); i++)
1728 {1728 {
1729 RENDER_16BIT_SMP_MONO_CINTRP1729 RENDER_16BIT_SMP_MONO_SINTRP
1730 VOLUME_RAMPING_MONO1730 VOLUME_RAMPING_MONO
1731 INC_POS_BIDI1731 INC_POS_BIDI
1732 }1732 }
1733 samplesToMix >>= 2;1733 samplesToMix >>= 2;
1734 for (i = 0; i < samplesToMix; i++)1734 for (i = 0; i < samplesToMix; i++)
1735 {1735 {
1736 RENDER_16BIT_SMP_MONO_CINTRP1736 RENDER_16BIT_SMP_MONO_SINTRP
1737 VOLUME_RAMPING_MONO1737 VOLUME_RAMPING_MONO
1738 INC_POS_BIDI1738 INC_POS_BIDI
1739 RENDER_16BIT_SMP_MONO_CINTRP1739 RENDER_16BIT_SMP_MONO_SINTRP
1740 VOLUME_RAMPING_MONO1740 VOLUME_RAMPING_MONO
1741 INC_POS_BIDI1741 INC_POS_BIDI
1742 RENDER_16BIT_SMP_MONO_CINTRP1742 RENDER_16BIT_SMP_MONO_SINTRP
1743 VOLUME_RAMPING_MONO1743 VOLUME_RAMPING_MONO
1744 INC_POS_BIDI1744 INC_POS_BIDI
1745 RENDER_16BIT_SMP_MONO_CINTRP1745 RENDER_16BIT_SMP_MONO_SINTRP
1746 VOLUME_RAMPING_MONO1746 VOLUME_RAMPING_MONO
1747 INC_POS_BIDI1747 INC_POS_BIDI
1748 }1748 }
@@ -1759,9 +1759,9 @@ void centerMix16bRampBidiLoopCIntrp(voice_t *v, uint32_t numSamples) · 10 unmodified lines
1759void centerMix16bRampNoLoopLIntrp(voice_t *v, uint32_t numSamples)1759void centerMix16bRampNoLoopLIntrp(voice_t *v, uint32_t numSamples)
1760{1760{
1761 const int16_t *base, *smpPtr;1761 const int16_t *base, *smpPtr;
1762 float fSample, *fMixBufferL, *fMixBufferR;1762 double dSample, *dMixBufferL, *dMixBufferR;
1763 int32_t pos;1763 int32_t pos;
1764 float fVolLDelta, fVolL;1764 double dVolLDelta, dVolL;
1765 uint32_t i, samplesToMix, samplesLeft;1765 uint32_t i, samplesToMix, samplesLeft;
1766 uint64_t posFrac;1766 uint64_t posFrac;
1767 1767
@@ -1809,9 +1809,9 @@ void centerMix16bRampNoLoopLIntrp(voice_t *v, uint32_t numSamples) · 41 unmodified lines
1809void centerMix16bRampLoopLIntrp(voice_t *v, uint32_t numSamples)1809void centerMix16bRampLoopLIntrp(voice_t *v, uint32_t numSamples)
1810{1810{
1811 const int16_t *base, *smpPtr;1811 const int16_t *base, *smpPtr;
1812 float fSample, *fMixBufferL, *fMixBufferR;1812 double dSample, *dMixBufferL, *dMixBufferR;
1813 int32_t pos;1813 int32_t pos;
1814 float fVolLDelta, fVolL;1814 double dVolLDelta, dVolL;
1815 uint32_t i, samplesToMix, samplesLeft;1815 uint32_t i, samplesToMix, samplesLeft;
1816 uint64_t posFrac;1816 uint64_t posFrac;
1817 1817
@@ -1859,9 +1859,9 @@ void centerMix16bRampLoopLIntrp(voice_t *v, uint32_t numSamples) · 41 unmodified lines
1859void centerMix16bRampBidiLoopLIntrp(voice_t *v, uint32_t numSamples)1859void centerMix16bRampBidiLoopLIntrp(voice_t *v, uint32_t numSamples)
1860{1860{
1861 const int16_t *base, *revBase, *smpPtr;1861 const int16_t *base, *revBase, *smpPtr;
1862 float fSample, *fMixBufferL, *fMixBufferR;1862 double dSample, *dMixBufferL, *dMixBufferR;
1863 int32_t pos;1863 int32_t pos;
1864 float fVolLDelta, fVolL;1864 double dVolLDelta, dVolL;
1865 uint32_t i, samplesToMix, samplesLeft;1865 uint32_t i, samplesToMix, samplesLeft;
1866 uint64_t posFrac, tmpDelta;1866 uint64_t posFrac, tmpDelta;
1867 1867
src/mixer/ft2_center_mix.h+12−12
@@ -9,9 +9,9 @@ · 8 unmodified lines
9void centerMix8bNoLoop(voice_t *v, uint32_t numSamples);9void centerMix8bNoLoop(voice_t *v, uint32_t numSamples);
10void centerMix8bLoop(voice_t *v, uint32_t numSamples);10void centerMix8bLoop(voice_t *v, uint32_t numSamples);
11void centerMix8bBidiLoop(voice_t *v, uint32_t numSamples);11void centerMix8bBidiLoop(voice_t *v, uint32_t numSamples);
12void centerMix8bNoLoopCIntrp(voice_t *v, uint32_t numSamples);12void centerMix8bNoLoopSIntrp(voice_t *v, uint32_t numSamples);
13void centerMix8bLoopCIntrp(voice_t *v, uint32_t numSamples);13void centerMix8bLoopSIntrp(voice_t *v, uint32_t numSamples);
14void centerMix8bBidiLoopCIntrp(voice_t *v, uint32_t numSamples);14void centerMix8bBidiLoopSIntrp(voice_t *v, uint32_t numSamples);
15void centerMix8bNoLoopLIntrp(voice_t *v, uint32_t numSamples);15void centerMix8bNoLoopLIntrp(voice_t *v, uint32_t numSamples);
16void centerMix8bLoopLIntrp(voice_t *v, uint32_t numSamples);16void centerMix8bLoopLIntrp(voice_t *v, uint32_t numSamples);
17void centerMix8bBidiLoopLIntrp(voice_t *v, uint32_t numSamples);17void centerMix8bBidiLoopLIntrp(voice_t *v, uint32_t numSamples);
@@ -20,9 +20,9 @@ void centerMix8bBidiLoopLIntrp(voice_t *v, uint32_t numSamples); · 2 unmodified lines
20void centerMix16bNoLoop(voice_t *v, uint32_t numSamples);20void centerMix16bNoLoop(voice_t *v, uint32_t numSamples);
21void centerMix16bLoop(voice_t *v, uint32_t numSamples);21void centerMix16bLoop(voice_t *v, uint32_t numSamples);
22void centerMix16bBidiLoop(voice_t *v, uint32_t numSamples);22void centerMix16bBidiLoop(voice_t *v, uint32_t numSamples);
23void centerMix16bNoLoopCIntrp(voice_t *v, uint32_t numSamples);23void centerMix16bNoLoopSIntrp(voice_t *v, uint32_t numSamples);
24void centerMix16bLoopCIntrp(voice_t *v, uint32_t numSamples);24void centerMix16bLoopSIntrp(voice_t *v, uint32_t numSamples);
25void centerMix16bBidiLoopCIntrp(voice_t *v, uint32_t numSamples);25void centerMix16bBidiLoopSIntrp(voice_t *v, uint32_t numSamples);
26void centerMix16bNoLoopLIntrp(voice_t *v, uint32_t numSamples);26void centerMix16bNoLoopLIntrp(voice_t *v, uint32_t numSamples);
27void centerMix16bLoopLIntrp(voice_t *v, uint32_t numSamples);27void centerMix16bLoopLIntrp(voice_t *v, uint32_t numSamples);
28void centerMix16bBidiLoopLIntrp(voice_t *v, uint32_t numSamples);28void centerMix16bBidiLoopLIntrp(voice_t *v, uint32_t numSamples);
@@ -33,9 +33,9 @@ void centerMix16bBidiLoopLIntrp(voice_t *v, uint32_t numSamples); · 4 unmodified lines
33void centerMix8bRampNoLoop(voice_t *v, uint32_t numSamples);33void centerMix8bRampNoLoop(voice_t *v, uint32_t numSamples);
34void centerMix8bRampLoop(voice_t *v, uint32_t numSamples);34void centerMix8bRampLoop(voice_t *v, uint32_t numSamples);
35void centerMix8bRampBidiLoop(voice_t *v, uint32_t numSamples);35void centerMix8bRampBidiLoop(voice_t *v, uint32_t numSamples);
36void centerMix8bRampNoLoopCIntrp(voice_t *v, uint32_t numSamples);36void centerMix8bRampNoLoopSIntrp(voice_t *v, uint32_t numSamples);
37void centerMix8bRampLoopCIntrp(voice_t *v, uint32_t numSamples);37void centerMix8bRampLoopSIntrp(voice_t *v, uint32_t numSamples);
38void centerMix8bRampBidiLoopCIntrp(voice_t *v, uint32_t numSamples);38void centerMix8bRampBidiLoopSIntrp(voice_t *v, uint32_t numSamples);
39void centerMix8bRampNoLoopLIntrp(voice_t *v, uint32_t numSamples);39void centerMix8bRampNoLoopLIntrp(voice_t *v, uint32_t numSamples);
40void centerMix8bRampLoopLIntrp(voice_t *v, uint32_t numSamples);40void centerMix8bRampLoopLIntrp(voice_t *v, uint32_t numSamples);
41void centerMix8bRampBidiLoopLIntrp(voice_t *v, uint32_t numSamples);41void centerMix8bRampBidiLoopLIntrp(voice_t *v, uint32_t numSamples);
@@ -44,9 +44,9 @@ void centerMix8bRampBidiLoopLIntrp(voice_t *v, uint32_t numSamples); · 2 unmodified lines
44void centerMix16bRampNoLoop(voice_t *v, uint32_t numSamples);44void centerMix16bRampNoLoop(voice_t *v, uint32_t numSamples);
45void centerMix16bRampLoop(voice_t *v, uint32_t numSamples);45void centerMix16bRampLoop(voice_t *v, uint32_t numSamples);
46void centerMix16bRampBidiLoop(voice_t *v, uint32_t numSamples);46void centerMix16bRampBidiLoop(voice_t *v, uint32_t numSamples);
47void centerMix16bRampNoLoopCIntrp(voice_t *v, uint32_t numSamples);47void centerMix16bRampNoLoopSIntrp(voice_t *v, uint32_t numSamples);
48void centerMix16bRampLoopCIntrp(voice_t *v, uint32_t numSamples);48void centerMix16bRampLoopSIntrp(voice_t *v, uint32_t numSamples);
49void centerMix16bRampBidiLoopCIntrp(voice_t *v, uint32_t numSamples);49void centerMix16bRampBidiLoopSIntrp(voice_t *v, uint32_t numSamples);
50void centerMix16bRampNoLoopLIntrp(voice_t *v, uint32_t numSamples);50void centerMix16bRampNoLoopLIntrp(voice_t *v, uint32_t numSamples);
51void centerMix16bRampLoopLIntrp(voice_t *v, uint32_t numSamples);51void centerMix16bRampLoopLIntrp(voice_t *v, uint32_t numSamples);
52void centerMix16bRampBidiLoopLIntrp(voice_t *v, uint32_t numSamples);52void 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
6float *fCubicSplineLUT8 = NULL;
7float *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
15static 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
30bool 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
46void 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
18extern float *fCubicSplineLUT8;
19extern float *fCubicSplineLUT16;
20
21bool calcCubicTable(void);
22void freeCubicTable(void);
src/mixer/ft2_mix.c+194−194
@@ -5,17 +5,17 @@ · 4 unmodified lines
5#include "ft2_center_mix.h"5#include "ft2_center_mix.h"
6 6
7/*7/*
8** -------------------- floating point audio channel mixer ---------------------8** -------------------- doubleing point audio channel mixer ---------------------
9** (Note: Mixing macros can be found in ft2_mix_macros.h)9** (Note: Mixing macros can be found in ft2_mix_macros.h)
10**10**
11** Specifications:11** Specifications:
12** - Either no interpolation, 2-tap linear interpolation (FT2) or 4-tap cubic interpolation12** - Either no interpolation, 2-tap linear interpolation (FT2) or 8-tap windowed-sinc interpolation
13** - Linear volume ramping, matching FT2 (can be turned off)13** - Linear volume ramping, matching FT2 (can be turned off)
14** - 32.32 fixed-point logic for resampling delta14** - 32.32 fixed-point logic for resampling delta
15** - 32-bit single-precision float logic for mixing and interpolation15** - 64-bit doube-precision logic for mixing and interpolation
16**16**
17** This file has separate routines for EVERY possible sampling variation:17** 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.
19** (36 mixing routines in total + another 36 for center-mixing)19** (36 mixing routines in total + another 36 for center-mixing)
20**20**
21** Every voice has a function pointer set to the according mixing routine on21** Every voice has a function pointer set to the according mixing routine on
@@ -34,7 +34,7 @@ · 12 unmodified lines
34static void mix8bNoLoop(voice_t *v, uint32_t numSamples)34static void mix8bNoLoop(voice_t *v, uint32_t numSamples)
35{35{
36 const int8_t *base, *smpPtr;36 const int8_t *base, *smpPtr;
37 float fSample, *fMixBufferL, *fMixBufferR;37 double dSample, *dMixBufferL, *dMixBufferR;
38 int32_t pos;38 int32_t pos;
39 uint32_t i, samplesToMix, samplesLeft;39 uint32_t i, samplesToMix, samplesLeft;
40 uint64_t posFrac;40 uint64_t posFrac;
@@ -76,7 +76,7 @@ static void mix8bNoLoop(voice_t *v, uint32_t numSamples) · 35 unmodified lines
76static void mix8bLoop(voice_t *v, uint32_t numSamples)76static void mix8bLoop(voice_t *v, uint32_t numSamples)
77{77{
78 const int8_t *base, *smpPtr;78 const int8_t *base, *smpPtr;
79 float fSample, *fMixBufferL, *fMixBufferR;79 double dSample, *dMixBufferL, *dMixBufferR;
80 int32_t pos;80 int32_t pos;
81 uint32_t i, samplesToMix, samplesLeft;81 uint32_t i, samplesToMix, samplesLeft;
82 uint64_t posFrac;82 uint64_t posFrac;
@@ -118,7 +118,7 @@ static void mix8bLoop(voice_t *v, uint32_t numSamples) · 35 unmodified lines
118static void mix8bBidiLoop(voice_t *v, uint32_t numSamples)118static void mix8bBidiLoop(voice_t *v, uint32_t numSamples)
119{119{
120 const int8_t *base, *revBase, *smpPtr;120 const int8_t *base, *revBase, *smpPtr;
121 float fSample, *fMixBufferL, *fMixBufferR;121 double dSample, *dMixBufferL, *dMixBufferR;
122 int32_t pos;122 int32_t pos;
123 uint32_t i, samplesToMix, samplesLeft;123 uint32_t i, samplesToMix, samplesLeft;
124 uint64_t posFrac, tmpDelta;124 uint64_t posFrac, tmpDelta;
@@ -158,10 +158,10 @@ static void mix8bBidiLoop(voice_t *v, uint32_t numSamples) · 33 unmodified lines
158 SET_BACK_MIXER_POS158 SET_BACK_MIXER_POS
159}159}
160 160
161static void mix8bNoLoopCIntrp(voice_t *v, uint32_t numSamples)161static void mix8bNoLoopSIntrp(voice_t *v, uint32_t numSamples)
162{162{
163 const int8_t *base, *smpPtr;163 const int8_t *base, *smpPtr;
164 float fSample, *fMixBufferL, *fMixBufferR;164 double dSample, *dMixBufferL, *dMixBufferR;
165 int32_t pos;165 int32_t pos;
166 uint32_t i, samplesToMix, samplesLeft;166 uint32_t i, samplesToMix, samplesLeft;
167 uint64_t posFrac;167 uint64_t posFrac;
@@ -178,19 +178,19 @@ static void mix8bNoLoopCIntrp(voice_t *v, uint32_t numSamples) · 10 unmodified lines
178 178
179 for (i = 0; i < (samplesToMix & 3); i++)179 for (i = 0; i < (samplesToMix & 3); i++)
180 {180 {
181 RENDER_8BIT_SMP_CINTRP181 RENDER_8BIT_SMP_SINTRP
182 INC_POS182 INC_POS
183 }183 }
184 samplesToMix >>= 2;184 samplesToMix >>= 2;
185 for (i = 0; i < samplesToMix; i++)185 for (i = 0; i < samplesToMix; i++)
186 {186 {
187 RENDER_8BIT_SMP_CINTRP187 RENDER_8BIT_SMP_SINTRP
188 INC_POS188 INC_POS
189 RENDER_8BIT_SMP_CINTRP189 RENDER_8BIT_SMP_SINTRP
190 INC_POS190 INC_POS
191 RENDER_8BIT_SMP_CINTRP191 RENDER_8BIT_SMP_SINTRP
192 INC_POS192 INC_POS
193 RENDER_8BIT_SMP_CINTRP193 RENDER_8BIT_SMP_SINTRP
194 INC_POS194 INC_POS
195 }195 }
196 196
@@ -200,10 +200,10 @@ static void mix8bNoLoopCIntrp(voice_t *v, uint32_t numSamples) · 3 unmodified lines
200 SET_BACK_MIXER_POS200 SET_BACK_MIXER_POS
201}201}
202 202
203static void mix8bLoopCIntrp(voice_t *v, uint32_t numSamples)203static void mix8bLoopSIntrp(voice_t *v, uint32_t numSamples)
204{204{
205 const int8_t *base, *smpPtr;205 const int8_t *base, *smpPtr;
206 float s0, s1, s2, s3, fSample, *fMixBufferL, *fMixBufferR;206 double dSample, *dMixBufferL, *dMixBufferR;
207 int32_t pos;207 int32_t pos;
208 uint32_t i, samplesToMix, samplesLeft;208 uint32_t i, samplesToMix, samplesLeft;
209 uint64_t posFrac;209 uint64_t posFrac;
@@ -223,19 +223,19 @@ static void mix8bLoopCIntrp(voice_t *v, uint32_t numSamples) · 13 unmodified lines
223 {223 {
224 for (i = 0; i < (samplesToMix & 3); i++)224 for (i = 0; i < (samplesToMix & 3); i++)
225 {225 {
226 RENDER_8BIT_SMP_CINTRP_TAP_FIX226 RENDER_8BIT_SMP_SINTRP_TAP_FIX
227 INC_POS227 INC_POS
228 }228 }
229 samplesToMix >>= 2;229 samplesToMix >>= 2;
230 for (i = 0; i < samplesToMix; i++)230 for (i = 0; i < samplesToMix; i++)
231 {231 {
232 RENDER_8BIT_SMP_CINTRP_TAP_FIX232 RENDER_8BIT_SMP_SINTRP_TAP_FIX
233 INC_POS233 INC_POS
234 RENDER_8BIT_SMP_CINTRP_TAP_FIX234 RENDER_8BIT_SMP_SINTRP_TAP_FIX
235 INC_POS235 INC_POS
236 RENDER_8BIT_SMP_CINTRP_TAP_FIX236 RENDER_8BIT_SMP_SINTRP_TAP_FIX
237 INC_POS237 INC_POS
238 RENDER_8BIT_SMP_CINTRP_TAP_FIX238 RENDER_8BIT_SMP_SINTRP_TAP_FIX
239 INC_POS239 INC_POS
240 }240 }
241 }241 }
@@ -243,19 +243,19 @@ static void mix8bLoopCIntrp(voice_t *v, uint32_t numSamples) · 1 unmodified line
243 {243 {
244 for (i = 0; i < (samplesToMix & 3); i++)244 for (i = 0; i < (samplesToMix & 3); i++)
245 {245 {
246 RENDER_8BIT_SMP_CINTRP246 RENDER_8BIT_SMP_SINTRP
247 INC_POS247 INC_POS
248 }248 }
249 samplesToMix >>= 2;249 samplesToMix >>= 2;
250 for (i = 0; i < samplesToMix; i++)250 for (i = 0; i < samplesToMix; i++)
251 {251 {
252 RENDER_8BIT_SMP_CINTRP252 RENDER_8BIT_SMP_SINTRP
253 INC_POS253 INC_POS
254 RENDER_8BIT_SMP_CINTRP254 RENDER_8BIT_SMP_SINTRP
255 INC_POS255 INC_POS
256 RENDER_8BIT_SMP_CINTRP256 RENDER_8BIT_SMP_SINTRP
257 INC_POS257 INC_POS
258 RENDER_8BIT_SMP_CINTRP258 RENDER_8BIT_SMP_SINTRP
259 INC_POS259 INC_POS
260 }260 }
261 }261 }
@@ -266,10 +266,10 @@ static void mix8bLoopCIntrp(voice_t *v, uint32_t numSamples) · 4 unmodified lines
266 SET_BACK_MIXER_POS266 SET_BACK_MIXER_POS
267}267}
268 268
269static void mix8bBidiLoopCIntrp(voice_t *v, uint32_t numSamples)269static void mix8bBidiLoopSIntrp(voice_t *v, uint32_t numSamples)
270{270{
271 const int8_t *base, *revBase, *smpPtr;271 const int8_t *base, *revBase, *smpPtr;
272 float s0, s1, s2, s3, fSample, *fMixBufferL, *fMixBufferR;272 double dSample, *dMixBufferL, *dMixBufferR;
273 int32_t pos;273 int32_t pos;
274 uint32_t i, samplesToMix, samplesLeft;274 uint32_t i, samplesToMix, samplesLeft;
275 uint64_t posFrac, tmpDelta;275 uint64_t posFrac, tmpDelta;
@@ -290,19 +290,19 @@ static void mix8bBidiLoopCIntrp(voice_t *v, uint32_t numSamples) · 14 unmodified lines
290 {290 {
291 for (i = 0; i < (samplesToMix & 3); i++)291 for (i = 0; i < (samplesToMix & 3); i++)
292 {292 {
293 RENDER_8BIT_SMP_CINTRP_TAP_FIX293 RENDER_8BIT_SMP_SINTRP_TAP_FIX
294 INC_POS_BIDI294 INC_POS_BIDI
295 }295 }
296 samplesToMix >>= 2;296 samplesToMix >>= 2;
297 for (i = 0; i < samplesToMix; i++)297 for (i = 0; i < samplesToMix; i++)
298 {298 {
299 RENDER_8BIT_SMP_CINTRP_TAP_FIX299 RENDER_8BIT_SMP_SINTRP_TAP_FIX
300 INC_POS_BIDI300 INC_POS_BIDI
301 RENDER_8BIT_SMP_CINTRP_TAP_FIX301 RENDER_8BIT_SMP_SINTRP_TAP_FIX
302 INC_POS_BIDI302 INC_POS_BIDI
303 RENDER_8BIT_SMP_CINTRP_TAP_FIX303 RENDER_8BIT_SMP_SINTRP_TAP_FIX
304 INC_POS_BIDI304 INC_POS_BIDI
305 RENDER_8BIT_SMP_CINTRP_TAP_FIX305 RENDER_8BIT_SMP_SINTRP_TAP_FIX
306 INC_POS_BIDI306 INC_POS_BIDI
307 }307 }
308 }308 }
@@ -310,19 +310,19 @@ static void mix8bBidiLoopCIntrp(voice_t *v, uint32_t numSamples) · 1 unmodified line
310 {310 {
311 for (i = 0; i < (samplesToMix & 3); i++)311 for (i = 0; i < (samplesToMix & 3); i++)
312 {312 {
313 RENDER_8BIT_SMP_CINTRP313 RENDER_8BIT_SMP_SINTRP
314 INC_POS_BIDI314 INC_POS_BIDI
315 }315 }
316 samplesToMix >>= 2;316 samplesToMix >>= 2;
317 for (i = 0; i < samplesToMix; i++)317 for (i = 0; i < samplesToMix; i++)
318 {318 {
319 RENDER_8BIT_SMP_CINTRP319 RENDER_8BIT_SMP_SINTRP
320 INC_POS_BIDI320 INC_POS_BIDI
321 RENDER_8BIT_SMP_CINTRP321 RENDER_8BIT_SMP_SINTRP
322 INC_POS_BIDI322 INC_POS_BIDI
323 RENDER_8BIT_SMP_CINTRP323 RENDER_8BIT_SMP_SINTRP
324 INC_POS_BIDI324 INC_POS_BIDI
325 RENDER_8BIT_SMP_CINTRP325 RENDER_8BIT_SMP_SINTRP
326 INC_POS_BIDI326 INC_POS_BIDI
327 }327 }
328 }328 }
@@ -337,7 +337,7 @@ static void mix8bBidiLoopCIntrp(voice_t *v, uint32_t numSamples) · 8 unmodified lines
337static void mix8bNoLoopLIntrp(voice_t *v, uint32_t numSamples)337static void mix8bNoLoopLIntrp(voice_t *v, uint32_t numSamples)
338{338{
339 const int8_t *base, *smpPtr;339 const int8_t *base, *smpPtr;
340 float fSample, *fMixBufferL, *fMixBufferR;340 double dSample, *dMixBufferL, *dMixBufferR;
341 int32_t pos;341 int32_t pos;
342 uint32_t i, samplesToMix, samplesLeft;342 uint32_t i, samplesToMix, samplesLeft;
343 uint64_t posFrac;343 uint64_t posFrac;
@@ -379,7 +379,7 @@ static void mix8bNoLoopLIntrp(voice_t *v, uint32_t numSamples) · 35 unmodified lines
379static void mix8bLoopLIntrp(voice_t *v, uint32_t numSamples)379static void mix8bLoopLIntrp(voice_t *v, uint32_t numSamples)
380{380{
381 const int8_t *base, *smpPtr;381 const int8_t *base, *smpPtr;
382 float fSample, *fMixBufferL, *fMixBufferR;382 double dSample, *dMixBufferL, *dMixBufferR;
383 int32_t pos;383 int32_t pos;
384 uint32_t i, samplesToMix, samplesLeft;384 uint32_t i, samplesToMix, samplesLeft;
385 uint64_t posFrac;385 uint64_t posFrac;
@@ -421,7 +421,7 @@ static void mix8bLoopLIntrp(voice_t *v, uint32_t numSamples) · 35 unmodified lines
421static void mix8bBidiLoopLIntrp(voice_t *v, uint32_t numSamples)421static void mix8bBidiLoopLIntrp(voice_t *v, uint32_t numSamples)
422{422{
423 const int8_t *base, *revBase, *smpPtr;423 const int8_t *base, *revBase, *smpPtr;
424 float fSample, *fMixBufferL, *fMixBufferR;424 double dSample, *dMixBufferL, *dMixBufferR;
425 int32_t pos;425 int32_t pos;
426 uint32_t i, samplesToMix, samplesLeft;426 uint32_t i, samplesToMix, samplesLeft;
427 uint64_t posFrac, tmpDelta;427 uint64_t posFrac, tmpDelta;
@@ -465,9 +465,9 @@ static void mix8bBidiLoopLIntrp(voice_t *v, uint32_t numSamples) · 37 unmodified lines
465static void mix8bRampNoLoop(voice_t *v, uint32_t numSamples)465static void mix8bRampNoLoop(voice_t *v, uint32_t numSamples)
466{466{
467 const int8_t *base, *smpPtr;467 const int8_t *base, *smpPtr;
468 float fSample, *fMixBufferL, *fMixBufferR;468 double dSample, *dMixBufferL, *dMixBufferR;
469 int32_t pos;469 int32_t pos;
470 float fVolLDelta, fVolRDelta, fVolL, fVolR;470 double dVolLDelta, dVolRDelta, dVolL, dVolR;
471 uint32_t i, samplesToMix, samplesLeft;471 uint32_t i, samplesToMix, samplesLeft;
472 uint64_t posFrac;472 uint64_t posFrac;
473 473
@@ -515,9 +515,9 @@ static void mix8bRampNoLoop(voice_t *v, uint32_t numSamples) · 41 unmodified lines
515static void mix8bRampLoop(voice_t *v, uint32_t numSamples)515static void mix8bRampLoop(voice_t *v, uint32_t numSamples)
516{516{
517 const int8_t *base, *smpPtr;517 const int8_t *base, *smpPtr;
518 float fSample, *fMixBufferL, *fMixBufferR;518 double dSample, *dMixBufferL, *dMixBufferR;
519 int32_t pos;519 int32_t pos;
520 float fVolLDelta, fVolRDelta, fVolL, fVolR;520 double dVolLDelta, dVolRDelta, dVolL, dVolR;
521 uint32_t i, samplesToMix, samplesLeft;521 uint32_t i, samplesToMix, samplesLeft;
522 uint64_t posFrac;522 uint64_t posFrac;
523 523
@@ -565,9 +565,9 @@ static void mix8bRampLoop(voice_t *v, uint32_t numSamples) · 41 unmodified lines
565static void mix8bRampBidiLoop(voice_t *v, uint32_t numSamples)565static void mix8bRampBidiLoop(voice_t *v, uint32_t numSamples)
566{566{
567 const int8_t *base, *revBase, *smpPtr;567 const int8_t *base, *revBase, *smpPtr;
568 float fSample, *fMixBufferL, *fMixBufferR;568 double dSample, *dMixBufferL, *dMixBufferR;
569 int32_t pos;569 int32_t pos;
570 float fVolLDelta, fVolRDelta, fVolL, fVolR;570 double dVolLDelta, dVolRDelta, dVolL, dVolR;
571 uint32_t i, samplesToMix, samplesLeft;571 uint32_t i, samplesToMix, samplesLeft;
572 uint64_t posFrac, tmpDelta;572 uint64_t posFrac, tmpDelta;
573 573
@@ -614,12 +614,12 @@ static void mix8bRampBidiLoop(voice_t *v, uint32_t numSamples) · 40 unmodified lines
614 SET_BACK_MIXER_POS614 SET_BACK_MIXER_POS
615}615}
616 616
617static void mix8bRampNoLoopCIntrp(voice_t *v, uint32_t numSamples)617static void mix8bRampNoLoopSIntrp(voice_t *v, uint32_t numSamples)
618{618{
619 const int8_t *base, *smpPtr;619 const int8_t *base, *smpPtr;
620 float fSample, *fMixBufferL, *fMixBufferR;620 double dSample, *dMixBufferL, *dMixBufferR;
621 int32_t pos;621 int32_t pos;
622 float fVolLDelta, fVolRDelta, fVolL, fVolR;622 double dVolLDelta, dVolRDelta, dVolL, dVolR;
623 uint32_t i, samplesToMix, samplesLeft;623 uint32_t i, samplesToMix, samplesLeft;
624 uint64_t posFrac;624 uint64_t posFrac;
625 625
@@ -636,23 +636,23 @@ static void mix8bRampNoLoopCIntrp(voice_t *v, uint32_t numSamples) · 10 unmodified lines
636 636
637 for (i = 0; i < (samplesToMix & 3); i++)637 for (i = 0; i < (samplesToMix & 3); i++)
638 {638 {
639 RENDER_8BIT_SMP_CINTRP639 RENDER_8BIT_SMP_SINTRP
640 VOLUME_RAMPING640 VOLUME_RAMPING
641 INC_POS641 INC_POS
642 }642 }
643 samplesToMix >>= 2;643 samplesToMix >>= 2;
644 for (i = 0; i < samplesToMix; i++)644 for (i = 0; i < samplesToMix; i++)
645 {645 {
646 RENDER_8BIT_SMP_CINTRP646 RENDER_8BIT_SMP_SINTRP
647 VOLUME_RAMPING647 VOLUME_RAMPING
648 INC_POS648 INC_POS
649 RENDER_8BIT_SMP_CINTRP649 RENDER_8BIT_SMP_SINTRP
650 VOLUME_RAMPING650 VOLUME_RAMPING
651 INC_POS651 INC_POS
652 RENDER_8BIT_SMP_CINTRP652 RENDER_8BIT_SMP_SINTRP
653 VOLUME_RAMPING653 VOLUME_RAMPING
654 INC_POS654 INC_POS
655 RENDER_8BIT_SMP_CINTRP655 RENDER_8BIT_SMP_SINTRP
656 VOLUME_RAMPING656 VOLUME_RAMPING
657 INC_POS657 INC_POS
658 }658 }
@@ -664,12 +664,12 @@ static void mix8bRampNoLoopCIntrp(voice_t *v, uint32_t numSamples) · 5 unmodified lines
664 SET_BACK_MIXER_POS664 SET_BACK_MIXER_POS
665}665}
666 666
667static void mix8bRampLoopCIntrp(voice_t *v, uint32_t numSamples)667static void mix8bRampLoopSIntrp(voice_t *v, uint32_t numSamples)
668{668{
669 const int8_t *base, *smpPtr;669 const int8_t *base, *smpPtr;
670 float s0, s1, s2, s3, fSample, *fMixBufferL, *fMixBufferR;670 double dSample, *dMixBufferL, *dMixBufferR;
671 int32_t pos;671 int32_t pos;
672 float fVolLDelta, fVolRDelta, fVolL, fVolR;672 double dVolLDelta, dVolRDelta, dVolL, dVolR;
673 uint32_t i, samplesToMix, samplesLeft;673 uint32_t i, samplesToMix, samplesLeft;
674 uint64_t posFrac;674 uint64_t posFrac;
675 675
@@ -689,23 +689,23 @@ static void mix8bRampLoopCIntrp(voice_t *v, uint32_t numSamples) · 13 unmodified lines
689 {689 {
690 for (i = 0; i < (samplesToMix & 3); i++)690 for (i = 0; i < (samplesToMix & 3); i++)
691 {691 {
692 RENDER_8BIT_SMP_CINTRP_TAP_FIX692 RENDER_8BIT_SMP_SINTRP_TAP_FIX
693 VOLUME_RAMPING693 VOLUME_RAMPING
694 INC_POS694 INC_POS
695 }695 }
696 samplesToMix >>= 2;696 samplesToMix >>= 2;
697 for (i = 0; i < samplesToMix; i++)697 for (i = 0; i < samplesToMix; i++)
698 {698 {
699 RENDER_8BIT_SMP_CINTRP_TAP_FIX699 RENDER_8BIT_SMP_SINTRP_TAP_FIX
700 VOLUME_RAMPING700 VOLUME_RAMPING
701 INC_POS701 INC_POS
702 RENDER_8BIT_SMP_CINTRP_TAP_FIX702 RENDER_8BIT_SMP_SINTRP_TAP_FIX
703 VOLUME_RAMPING703 VOLUME_RAMPING
704 INC_POS704 INC_POS
705 RENDER_8BIT_SMP_CINTRP_TAP_FIX705 RENDER_8BIT_SMP_SINTRP_TAP_FIX
706 VOLUME_RAMPING706 VOLUME_RAMPING
707 INC_POS707 INC_POS
708 RENDER_8BIT_SMP_CINTRP_TAP_FIX708 RENDER_8BIT_SMP_SINTRP_TAP_FIX
709 VOLUME_RAMPING709 VOLUME_RAMPING
710 INC_POS710 INC_POS
711 }711 }
@@ -714,23 +714,23 @@ static void mix8bRampLoopCIntrp(voice_t *v, uint32_t numSamples) · 2 unmodified lines
714 {714 {
715 for (i = 0; i < (samplesToMix & 3); i++)715 for (i = 0; i < (samplesToMix & 3); i++)
716 {716 {
717 RENDER_8BIT_SMP_CINTRP717 RENDER_8BIT_SMP_SINTRP
718 VOLUME_RAMPING718 VOLUME_RAMPING
719 INC_POS719 INC_POS
720 }720 }
721 samplesToMix >>= 2;721 samplesToMix >>= 2;
722 for (i = 0; i < samplesToMix; i++)722 for (i = 0; i < samplesToMix; i++)
723 {723 {
724 RENDER_8BIT_SMP_CINTRP724 RENDER_8BIT_SMP_SINTRP
725 VOLUME_RAMPING725 VOLUME_RAMPING
726 INC_POS726 INC_POS
727 RENDER_8BIT_SMP_CINTRP727 RENDER_8BIT_SMP_SINTRP
728 VOLUME_RAMPING728 VOLUME_RAMPING
729 INC_POS729 INC_POS
730 RENDER_8BIT_SMP_CINTRP730 RENDER_8BIT_SMP_SINTRP
731 VOLUME_RAMPING731 VOLUME_RAMPING
732 INC_POS732 INC_POS
733 RENDER_8BIT_SMP_CINTRP733 RENDER_8BIT_SMP_SINTRP
734 VOLUME_RAMPING734 VOLUME_RAMPING
735 INC_POS735 INC_POS
736 }736 }
@@ -743,12 +743,12 @@ static void mix8bRampLoopCIntrp(voice_t *v, uint32_t numSamples) · 6 unmodified lines
743 SET_BACK_MIXER_POS743 SET_BACK_MIXER_POS
744}744}
745 745
746static void mix8bRampBidiLoopCIntrp(voice_t *v, uint32_t numSamples)746static void mix8bRampBidiLoopSIntrp(voice_t *v, uint32_t numSamples)
747{747{
748 const int8_t *base, *revBase, *smpPtr;748 const int8_t *base, *revBase, *smpPtr;
749 float s0, s1, s2, s3, fSample, *fMixBufferL, *fMixBufferR;749 double dSample, *dMixBufferL, *dMixBufferR;
750 int32_t pos;750 int32_t pos;
751 float fVolLDelta, fVolRDelta, fVolL, fVolR;751 double dVolLDelta, dVolRDelta, dVolL, dVolR;
752 uint32_t i, samplesToMix, samplesLeft;752 uint32_t i, samplesToMix, samplesLeft;
753 uint64_t posFrac, tmpDelta;753 uint64_t posFrac, tmpDelta;
754 754
@@ -769,23 +769,23 @@ static void mix8bRampBidiLoopCIntrp(voice_t *v, uint32_t numSamples) · 14 unmodified lines
769 {769 {
770 for (i = 0; i < (samplesToMix & 3); i++)770 for (i = 0; i < (samplesToMix & 3); i++)
771 {771 {
772 RENDER_8BIT_SMP_CINTRP_TAP_FIX772 RENDER_8BIT_SMP_SINTRP_TAP_FIX
773 VOLUME_RAMPING773 VOLUME_RAMPING
774 INC_POS_BIDI774 INC_POS_BIDI
775 }775 }
776 samplesToMix >>= 2;776 samplesToMix >>= 2;
777 for (i = 0; i < samplesToMix; i++)777 for (i = 0; i < samplesToMix; i++)
778 {778 {
779 RENDER_8BIT_SMP_CINTRP_TAP_FIX779 RENDER_8BIT_SMP_SINTRP_TAP_FIX
780 VOLUME_RAMPING780 VOLUME_RAMPING
781 INC_POS_BIDI781 INC_POS_BIDI
782 RENDER_8BIT_SMP_CINTRP_TAP_FIX782 RENDER_8BIT_SMP_SINTRP_TAP_FIX
783 VOLUME_RAMPING783 VOLUME_RAMPING
784 INC_POS_BIDI784 INC_POS_BIDI
785 RENDER_8BIT_SMP_CINTRP_TAP_FIX785 RENDER_8BIT_SMP_SINTRP_TAP_FIX
786 VOLUME_RAMPING786 VOLUME_RAMPING
787 INC_POS_BIDI787 INC_POS_BIDI
788 RENDER_8BIT_SMP_CINTRP_TAP_FIX788 RENDER_8BIT_SMP_SINTRP_TAP_FIX
789 VOLUME_RAMPING789 VOLUME_RAMPING
790 INC_POS_BIDI790 INC_POS_BIDI
791 }791 }
@@ -794,23 +794,23 @@ static void mix8bRampBidiLoopCIntrp(voice_t *v, uint32_t numSamples) · 2 unmodified lines
794 {794 {
795 for (i = 0; i < (samplesToMix & 3); i++)795 for (i = 0; i < (samplesToMix & 3); i++)
796 {796 {
797 RENDER_8BIT_SMP_CINTRP797 RENDER_8BIT_SMP_SINTRP
798 VOLUME_RAMPING798 VOLUME_RAMPING
799 INC_POS_BIDI799 INC_POS_BIDI
800 }800 }
801 samplesToMix >>= 2;801 samplesToMix >>= 2;
802 for (i = 0; i < samplesToMix; i++)802 for (i = 0; i < samplesToMix; i++)
803 {803 {
804 RENDER_8BIT_SMP_CINTRP804 RENDER_8BIT_SMP_SINTRP
805 VOLUME_RAMPING805 VOLUME_RAMPING
806 INC_POS_BIDI806 INC_POS_BIDI
807 RENDER_8BIT_SMP_CINTRP807 RENDER_8BIT_SMP_SINTRP
808 VOLUME_RAMPING808 VOLUME_RAMPING
809 INC_POS_BIDI809 INC_POS_BIDI
810 RENDER_8BIT_SMP_CINTRP810 RENDER_8BIT_SMP_SINTRP
811 VOLUME_RAMPING811 VOLUME_RAMPING
812 INC_POS_BIDI812 INC_POS_BIDI
813 RENDER_8BIT_SMP_CINTRP813 RENDER_8BIT_SMP_SINTRP
814 VOLUME_RAMPING814 VOLUME_RAMPING
815 INC_POS_BIDI815 INC_POS_BIDI
816 }816 }
@@ -827,9 +827,9 @@ static void mix8bRampBidiLoopCIntrp(voice_t *v, uint32_t numSamples) · 10 unmodified lines
827static void mix8bRampNoLoopLIntrp(voice_t *v, uint32_t numSamples)827static void mix8bRampNoLoopLIntrp(voice_t *v, uint32_t numSamples)
828{828{
829 const int8_t *base, *smpPtr;829 const int8_t *base, *smpPtr;
830 float fSample, *fMixBufferL, *fMixBufferR;830 double dSample, *dMixBufferL, *dMixBufferR;
831 int32_t pos;831 int32_t pos;
832 float fVolLDelta, fVolRDelta, fVolL, fVolR;832 double dVolLDelta, dVolRDelta, dVolL, dVolR;
833 uint32_t i, samplesToMix, samplesLeft;833 uint32_t i, samplesToMix, samplesLeft;
834 uint64_t posFrac;834 uint64_t posFrac;
835 835
@@ -877,9 +877,9 @@ static void mix8bRampNoLoopLIntrp(voice_t *v, uint32_t numSamples) · 41 unmodified lines
877static void mix8bRampLoopLIntrp(voice_t *v, uint32_t numSamples)877static void mix8bRampLoopLIntrp(voice_t *v, uint32_t numSamples)
878{878{
879 const int8_t *base, *smpPtr;879 const int8_t *base, *smpPtr;
880 float fSample, *fMixBufferL, *fMixBufferR;880 double dSample, *dMixBufferL, *dMixBufferR;
881 int32_t pos;881 int32_t pos;
882 float fVolLDelta, fVolRDelta, fVolL, fVolR;882 double dVolLDelta, dVolRDelta, dVolL, dVolR;
883 uint32_t i, samplesToMix, samplesLeft;883 uint32_t i, samplesToMix, samplesLeft;
884 uint64_t posFrac;884 uint64_t posFrac;
885 885
@@ -927,9 +927,9 @@ static void mix8bRampLoopLIntrp(voice_t *v, uint32_t numSamples) · 41 unmodified lines
927static void mix8bRampBidiLoopLIntrp(voice_t *v, uint32_t numSamples)927static void mix8bRampBidiLoopLIntrp(voice_t *v, uint32_t numSamples)
928{928{
929 const int8_t *base, *revBase, *smpPtr;929 const int8_t *base, *revBase, *smpPtr;
930 float fSample, *fMixBufferL, *fMixBufferR;930 double dSample, *dMixBufferL, *dMixBufferR;
931 int32_t pos;931 int32_t pos;
932 float fVolLDelta, fVolRDelta, fVolL, fVolR;932 double dVolLDelta, dVolRDelta, dVolL, dVolR;
933 uint32_t i, samplesToMix, samplesLeft;933 uint32_t i, samplesToMix, samplesLeft;
934 uint64_t posFrac, tmpDelta;934 uint64_t posFrac, tmpDelta;
935 935
@@ -983,7 +983,7 @@ static void mix8bRampBidiLoopLIntrp(voice_t *v, uint32_t numSamples) · 47 unmodified lines
983static void mix16bNoLoop(voice_t *v, uint32_t numSamples)983static void mix16bNoLoop(voice_t *v, uint32_t numSamples)
984{984{
985 const int16_t *base, *smpPtr;985 const int16_t *base, *smpPtr;
986 float fSample, *fMixBufferL, *fMixBufferR;986 double dSample, *dMixBufferL, *dMixBufferR;
987 int32_t pos;987 int32_t pos;
988 uint32_t i, samplesToMix, samplesLeft;988 uint32_t i, samplesToMix, samplesLeft;
989 uint64_t posFrac;989 uint64_t posFrac;
@@ -1025,7 +1025,7 @@ static void mix16bNoLoop(voice_t *v, uint32_t numSamples) · 35 unmodified lines
1025static void mix16bLoop(voice_t *v, uint32_t numSamples)1025static void mix16bLoop(voice_t *v, uint32_t numSamples)
1026{1026{
1027 const int16_t *base, *smpPtr;1027 const int16_t *base, *smpPtr;
1028 float fSample, *fMixBufferL, *fMixBufferR;1028 double dSample, *dMixBufferL, *dMixBufferR;
1029 int32_t pos;1029 int32_t pos;
1030 uint32_t i, samplesToMix, samplesLeft;1030 uint32_t i, samplesToMix, samplesLeft;
1031 uint64_t posFrac;1031 uint64_t posFrac;
@@ -1067,7 +1067,7 @@ static void mix16bLoop(voice_t *v, uint32_t numSamples) · 35 unmodified lines
1067static void mix16bBidiLoop(voice_t *v, uint32_t numSamples)1067static void mix16bBidiLoop(voice_t *v, uint32_t numSamples)
1068{1068{
1069 const int16_t *base, *revBase, *smpPtr;1069 const int16_t *base, *revBase, *smpPtr;
1070 float fSample, *fMixBufferL, *fMixBufferR;1070 double dSample, *dMixBufferL, *dMixBufferR;
1071 int32_t pos;1071 int32_t pos;
1072 uint32_t i, samplesToMix, samplesLeft;1072 uint32_t i, samplesToMix, samplesLeft;
1073 uint64_t posFrac, tmpDelta;1073 uint64_t posFrac, tmpDelta;
@@ -1108,10 +1108,10 @@ static void mix16bBidiLoop(voice_t *v, uint32_t numSamples) · 34 unmodified lines
1108 SET_BACK_MIXER_POS1108 SET_BACK_MIXER_POS
1109}1109}
1110 1110
1111static void mix16bNoLoopCIntrp(voice_t *v, uint32_t numSamples)1111static void mix16bNoLoopSIntrp(voice_t *v, uint32_t numSamples)
1112{1112{
1113 const int16_t *base, *smpPtr;1113 const int16_t *base, *smpPtr;
1114 float fSample, *fMixBufferL, *fMixBufferR;1114 double dSample, *dMixBufferL, *dMixBufferR;
1115 int32_t pos;1115 int32_t pos;
1116 uint32_t i, samplesToMix, samplesLeft;1116 uint32_t i, samplesToMix, samplesLeft;
1117 uint64_t posFrac;1117 uint64_t posFrac;
@@ -1128,19 +1128,19 @@ static void mix16bNoLoopCIntrp(voice_t *v, uint32_t numSamples) · 10 unmodified lines
1128 1128
1129 for (i = 0; i < (samplesToMix & 3); i++)1129 for (i = 0; i < (samplesToMix & 3); i++)
1130 {1130 {
1131 RENDER_16BIT_SMP_CINTRP1131 RENDER_16BIT_SMP_SINTRP
1132 INC_POS1132 INC_POS
1133 }1133 }
1134 samplesToMix >>= 2;1134 samplesToMix >>= 2;
1135 for (i = 0; i < samplesToMix; i++)1135 for (i = 0; i < samplesToMix; i++)
1136 {1136 {
1137 RENDER_16BIT_SMP_CINTRP1137 RENDER_16BIT_SMP_SINTRP
1138 INC_POS1138 INC_POS
1139 RENDER_16BIT_SMP_CINTRP1139 RENDER_16BIT_SMP_SINTRP
1140 INC_POS1140 INC_POS
1141 RENDER_16BIT_SMP_CINTRP1141 RENDER_16BIT_SMP_SINTRP
1142 INC_POS1142 INC_POS
1143 RENDER_16BIT_SMP_CINTRP1143 RENDER_16BIT_SMP_SINTRP
1144 INC_POS1144 INC_POS
1145 }1145 }
1146 1146
@@ -1150,10 +1150,10 @@ static void mix16bNoLoopCIntrp(voice_t *v, uint32_t numSamples) · 3 unmodified lines
1150 SET_BACK_MIXER_POS1150 SET_BACK_MIXER_POS
1151}1151}
1152 1152
1153static void mix16bLoopCIntrp(voice_t *v, uint32_t numSamples)1153static void mix16bLoopSIntrp(voice_t *v, uint32_t numSamples)
1154{1154{
1155 const int16_t *base, *smpPtr;1155 const int16_t *base, *smpPtr;
1156 float s0, s1, s2, s3, fSample, *fMixBufferL, *fMixBufferR;1156 double dSample, *dMixBufferL, *dMixBufferR;
1157 int32_t pos;1157 int32_t pos;
1158 uint32_t i, samplesToMix, samplesLeft;1158 uint32_t i, samplesToMix, samplesLeft;
1159 uint64_t posFrac;1159 uint64_t posFrac;
@@ -1173,19 +1173,19 @@ static void mix16bLoopCIntrp(voice_t *v, uint32_t numSamples) · 13 unmodified lines
1173 {1173 {
1174 for (i = 0; i < (samplesToMix & 3); i++)1174 for (i = 0; i < (samplesToMix & 3); i++)
1175 {1175 {
1176 RENDER_16BIT_SMP_CINTRP_TAP_FIX1176 RENDER_16BIT_SMP_SINTRP_TAP_FIX
1177 INC_POS1177 INC_POS
1178 }1178 }
1179 samplesToMix >>= 2;1179 samplesToMix >>= 2;
1180 for (i = 0; i < samplesToMix; i++)1180 for (i = 0; i < samplesToMix; i++)
1181 {1181 {
1182 RENDER_16BIT_SMP_CINTRP_TAP_FIX1182 RENDER_16BIT_SMP_SINTRP_TAP_FIX
1183 INC_POS1183 INC_POS
1184 RENDER_16BIT_SMP_CINTRP_TAP_FIX1184 RENDER_16BIT_SMP_SINTRP_TAP_FIX
1185 INC_POS1185 INC_POS
1186 RENDER_16BIT_SMP_CINTRP_TAP_FIX1186 RENDER_16BIT_SMP_SINTRP_TAP_FIX
1187 INC_POS1187 INC_POS
1188 RENDER_16BIT_SMP_CINTRP_TAP_FIX1188 RENDER_16BIT_SMP_SINTRP_TAP_FIX
1189 INC_POS1189 INC_POS
1190 }1190 }
1191 }1191 }
@@ -1193,19 +1193,19 @@ static void mix16bLoopCIntrp(voice_t *v, uint32_t numSamples) · 1 unmodified line
1193 {1193 {
1194 for (i = 0; i < (samplesToMix & 3); i++)1194 for (i = 0; i < (samplesToMix & 3); i++)
1195 {1195 {
1196 RENDER_16BIT_SMP_CINTRP1196 RENDER_16BIT_SMP_SINTRP
1197 INC_POS1197 INC_POS
1198 }1198 }
1199 samplesToMix >>= 2;1199 samplesToMix >>= 2;
1200 for (i = 0; i < samplesToMix; i++)1200 for (i = 0; i < samplesToMix; i++)
1201 {1201 {
1202 RENDER_16BIT_SMP_CINTRP1202 RENDER_16BIT_SMP_SINTRP
1203 INC_POS1203 INC_POS
1204 RENDER_16BIT_SMP_CINTRP1204 RENDER_16BIT_SMP_SINTRP
1205 INC_POS1205 INC_POS
1206 RENDER_16BIT_SMP_CINTRP1206 RENDER_16BIT_SMP_SINTRP
1207 INC_POS1207 INC_POS
1208 RENDER_16BIT_SMP_CINTRP1208 RENDER_16BIT_SMP_SINTRP
1209 INC_POS1209 INC_POS
1210 }1210 }
1211 }1211 }
@@ -1216,10 +1216,10 @@ static void mix16bLoopCIntrp(voice_t *v, uint32_t numSamples) · 4 unmodified lines
1216 SET_BACK_MIXER_POS1216 SET_BACK_MIXER_POS
1217}1217}
1218 1218
1219static void mix16bBidiLoopCIntrp(voice_t *v, uint32_t numSamples)1219static void mix16bBidiLoopSIntrp(voice_t *v, uint32_t numSamples)
1220{1220{
1221 const int16_t *base, *revBase, *smpPtr;1221 const int16_t *base, *revBase, *smpPtr;
1222 float s0, s1, s2, s3, fSample, *fMixBufferL, *fMixBufferR;1222 double dSample, *dMixBufferL, *dMixBufferR;
1223 int32_t pos;1223 int32_t pos;
1224 uint32_t i, samplesToMix, samplesLeft;1224 uint32_t i, samplesToMix, samplesLeft;
1225 uint64_t posFrac, tmpDelta;1225 uint64_t posFrac, tmpDelta;
@@ -1240,19 +1240,19 @@ static void mix16bBidiLoopCIntrp(voice_t *v, uint32_t numSamples) · 14 unmodified lines
1240 {1240 {
1241 for (i = 0; i < (samplesToMix & 3); i++)1241 for (i = 0; i < (samplesToMix & 3); i++)
1242 {1242 {
1243 RENDER_16BIT_SMP_CINTRP_TAP_FIX1243 RENDER_16BIT_SMP_SINTRP_TAP_FIX
1244 INC_POS_BIDI1244 INC_POS_BIDI
1245 }1245 }
1246 samplesToMix >>= 2;1246 samplesToMix >>= 2;
1247 for (i = 0; i < samplesToMix; i++)1247 for (i = 0; i < samplesToMix; i++)
1248 {1248 {
1249 RENDER_16BIT_SMP_CINTRP_TAP_FIX1249 RENDER_16BIT_SMP_SINTRP_TAP_FIX
1250 INC_POS_BIDI1250 INC_POS_BIDI
1251 RENDER_16BIT_SMP_CINTRP_TAP_FIX1251 RENDER_16BIT_SMP_SINTRP_TAP_FIX
1252 INC_POS_BIDI1252 INC_POS_BIDI
1253 RENDER_16BIT_SMP_CINTRP_TAP_FIX1253 RENDER_16BIT_SMP_SINTRP_TAP_FIX
1254 INC_POS_BIDI1254 INC_POS_BIDI
1255 RENDER_16BIT_SMP_CINTRP_TAP_FIX1255 RENDER_16BIT_SMP_SINTRP_TAP_FIX
1256 INC_POS_BIDI1256 INC_POS_BIDI
1257 }1257 }
1258 }1258 }
@@ -1260,19 +1260,19 @@ static void mix16bBidiLoopCIntrp(voice_t *v, uint32_t numSamples) · 1 unmodified line
1260 {1260 {
1261 for (i = 0; i < (samplesToMix & 3); i++)1261 for (i = 0; i < (samplesToMix & 3); i++)
1262 {1262 {
1263 RENDER_16BIT_SMP_CINTRP1263 RENDER_16BIT_SMP_SINTRP
1264 INC_POS_BIDI1264 INC_POS_BIDI
1265 }1265 }
1266 samplesToMix >>= 2;1266 samplesToMix >>= 2;
1267 for (i = 0; i < samplesToMix; i++)1267 for (i = 0; i < samplesToMix; i++)
1268 {1268 {
1269 RENDER_16BIT_SMP_CINTRP1269 RENDER_16BIT_SMP_SINTRP
1270 INC_POS_BIDI1270 INC_POS_BIDI
1271 RENDER_16BIT_SMP_CINTRP1271 RENDER_16BIT_SMP_SINTRP
1272 INC_POS_BIDI1272 INC_POS_BIDI
1273 RENDER_16BIT_SMP_CINTRP1273 RENDER_16BIT_SMP_SINTRP
1274 INC_POS_BIDI1274 INC_POS_BIDI
1275 RENDER_16BIT_SMP_CINTRP1275 RENDER_16BIT_SMP_SINTRP
1276 INC_POS_BIDI1276 INC_POS_BIDI
1277 }1277 }
1278 }1278 }
@@ -1287,7 +1287,7 @@ static void mix16bBidiLoopCIntrp(voice_t *v, uint32_t numSamples) · 8 unmodified lines
1287static void mix16bNoLoopLIntrp(voice_t *v, uint32_t numSamples)1287static void mix16bNoLoopLIntrp(voice_t *v, uint32_t numSamples)
1288{1288{
1289 const int16_t *base, *smpPtr;1289 const int16_t *base, *smpPtr;
1290 float fSample, *fMixBufferL, *fMixBufferR;1290 double dSample, *dMixBufferL, *dMixBufferR;
1291 int32_t pos;1291 int32_t pos;
1292 uint32_t i, samplesToMix, samplesLeft;1292 uint32_t i, samplesToMix, samplesLeft;
1293 uint64_t posFrac;1293 uint64_t posFrac;
@@ -1329,7 +1329,7 @@ static void mix16bNoLoopLIntrp(voice_t *v, uint32_t numSamples) · 35 unmodified lines
1329static void mix16bLoopLIntrp(voice_t *v, uint32_t numSamples)1329static void mix16bLoopLIntrp(voice_t *v, uint32_t numSamples)
1330{1330{
1331 const int16_t *base, *smpPtr;1331 const int16_t *base, *smpPtr;
1332 float fSample, *fMixBufferL, *fMixBufferR;1332 double dSample, *dMixBufferL, *dMixBufferR;
1333 int32_t pos;1333 int32_t pos;
1334 uint32_t i, samplesToMix, samplesLeft;1334 uint32_t i, samplesToMix, samplesLeft;
1335 uint64_t posFrac;1335 uint64_t posFrac;
@@ -1371,7 +1371,7 @@ static void mix16bLoopLIntrp(voice_t *v, uint32_t numSamples) · 35 unmodified lines
1371static void mix16bBidiLoopLIntrp(voice_t *v, uint32_t numSamples)1371static void mix16bBidiLoopLIntrp(voice_t *v, uint32_t numSamples)
1372{1372{
1373 const int16_t *base, *revBase, *smpPtr;1373 const int16_t *base, *revBase, *smpPtr;
1374 float fSample, *fMixBufferL, *fMixBufferR;1374 double dSample, *dMixBufferL, *dMixBufferR;
1375 int32_t pos;1375 int32_t pos;
1376 uint32_t i, samplesToMix, samplesLeft;1376 uint32_t i, samplesToMix, samplesLeft;
1377 uint64_t posFrac, tmpDelta;1377 uint64_t posFrac, tmpDelta;
@@ -1415,9 +1415,9 @@ static void mix16bBidiLoopLIntrp(voice_t *v, uint32_t numSamples) · 37 unmodified lines
1415static void mix16bRampNoLoop(voice_t *v, uint32_t numSamples)1415static void mix16bRampNoLoop(voice_t *v, uint32_t numSamples)
1416{1416{
1417 const int16_t *base, *smpPtr;1417 const int16_t *base, *smpPtr;
1418 float fSample, *fMixBufferL, *fMixBufferR;1418 double dSample, *dMixBufferL, *dMixBufferR;
1419 int32_t pos;1419 int32_t pos;
1420 float fVolLDelta, fVolRDelta, fVolL, fVolR;1420 double dVolLDelta, dVolRDelta, dVolL, dVolR;
1421 uint32_t i, samplesToMix, samplesLeft;1421 uint32_t i, samplesToMix, samplesLeft;
1422 uint64_t posFrac;1422 uint64_t posFrac;
1423 1423
@@ -1465,9 +1465,9 @@ static void mix16bRampNoLoop(voice_t *v, uint32_t numSamples) · 41 unmodified lines
1465static void mix16bRampLoop(voice_t *v, uint32_t numSamples)1465static void mix16bRampLoop(voice_t *v, uint32_t numSamples)
1466{1466{
1467 const int16_t *base, *smpPtr;1467 const int16_t *base, *smpPtr;
1468 float fSample, *fMixBufferL, *fMixBufferR;1468 double dSample, *dMixBufferL, *dMixBufferR;
1469 int32_t pos;1469 int32_t pos;
1470 float fVolLDelta, fVolRDelta, fVolL, fVolR;1470 double dVolLDelta, dVolRDelta, dVolL, dVolR;
1471 uint32_t i, samplesToMix, samplesLeft;1471 uint32_t i, samplesToMix, samplesLeft;
1472 uint64_t posFrac;1472 uint64_t posFrac;
1473 1473
@@ -1515,9 +1515,9 @@ static void mix16bRampLoop(voice_t *v, uint32_t numSamples) · 41 unmodified lines
1515static void mix16bRampBidiLoop(voice_t *v, uint32_t numSamples)1515static void mix16bRampBidiLoop(voice_t *v, uint32_t numSamples)
1516{1516{
1517 const int16_t *base, *revBase, *smpPtr;1517 const int16_t *base, *revBase, *smpPtr;
1518 float fSample, *fMixBufferL, *fMixBufferR;1518 double dSample, *dMixBufferL, *dMixBufferR;
1519 int32_t pos;1519 int32_t pos;
1520 float fVolLDelta, fVolRDelta, fVolL, fVolR;1520 double dVolLDelta, dVolRDelta, dVolL, dVolR;
1521 uint32_t i, samplesToMix, samplesLeft;1521 uint32_t i, samplesToMix, samplesLeft;
1522 uint64_t posFrac, tmpDelta;1522 uint64_t posFrac, tmpDelta;
1523 1523
@@ -1564,12 +1564,12 @@ static void mix16bRampBidiLoop(voice_t *v, uint32_t numSamples) · 40 unmodified lines
1564 SET_BACK_MIXER_POS1564 SET_BACK_MIXER_POS
1565}1565}
1566 1566
1567static void mix16bRampNoLoopCIntrp(voice_t *v, uint32_t numSamples)1567static void mix16bRampNoLoopSIntrp(voice_t *v, uint32_t numSamples)
1568{1568{
1569 const int16_t *base, *smpPtr;1569 const int16_t *base, *smpPtr;
1570 float fSample, *fMixBufferL, *fMixBufferR;1570 double dSample, *dMixBufferL, *dMixBufferR;
1571 int32_t pos;1571 int32_t pos;
1572 float fVolLDelta, fVolRDelta, fVolL, fVolR;1572 double dVolLDelta, dVolRDelta, dVolL, dVolR;
1573 uint32_t i, samplesToMix, samplesLeft;1573 uint32_t i, samplesToMix, samplesLeft;
1574 uint64_t posFrac;1574 uint64_t posFrac;
1575 1575
@@ -1586,23 +1586,23 @@ static void mix16bRampNoLoopCIntrp(voice_t *v, uint32_t numSamples) · 10 unmodified lines
1586 1586
1587 for (i = 0; i < (samplesToMix & 3); i++)1587 for (i = 0; i < (samplesToMix & 3); i++)
1588 {1588 {
1589 RENDER_16BIT_SMP_CINTRP1589 RENDER_16BIT_SMP_SINTRP
1590 VOLUME_RAMPING1590 VOLUME_RAMPING
1591 INC_POS1591 INC_POS
1592 }1592 }
1593 samplesToMix >>= 2;1593 samplesToMix >>= 2;
1594 for (i = 0; i < samplesToMix; i++)1594 for (i = 0; i < samplesToMix; i++)
1595 {1595 {
1596 RENDER_16BIT_SMP_CINTRP1596 RENDER_16BIT_SMP_SINTRP
1597 VOLUME_RAMPING1597 VOLUME_RAMPING
1598 INC_POS1598 INC_POS
1599 RENDER_16BIT_SMP_CINTRP1599 RENDER_16BIT_SMP_SINTRP
1600 VOLUME_RAMPING1600 VOLUME_RAMPING
1601 INC_POS1601 INC_POS
1602 RENDER_16BIT_SMP_CINTRP1602 RENDER_16BIT_SMP_SINTRP
1603 VOLUME_RAMPING1603 VOLUME_RAMPING
1604 INC_POS1604 INC_POS
1605 RENDER_16BIT_SMP_CINTRP1605 RENDER_16BIT_SMP_SINTRP
1606 VOLUME_RAMPING1606 VOLUME_RAMPING
1607 INC_POS1607 INC_POS
1608 }1608 }
@@ -1614,12 +1614,12 @@ static void mix16bRampNoLoopCIntrp(voice_t *v, uint32_t numSamples) · 5 unmodified lines
1614 SET_BACK_MIXER_POS1614 SET_BACK_MIXER_POS
1615}1615}
1616 1616
1617static void mix16bRampLoopCIntrp(voice_t *v, uint32_t numSamples)1617static void mix16bRampLoopSIntrp(voice_t *v, uint32_t numSamples)
1618{1618{
1619 const int16_t *base, *smpPtr;1619 const int16_t *base, *smpPtr;
1620 float s0, s1, s2, s3, fSample, *fMixBufferL, *fMixBufferR;1620 double dSample, *dMixBufferL, *dMixBufferR;
1621 int32_t pos;1621 int32_t pos;
1622 float fVolLDelta, fVolRDelta, fVolL, fVolR;1622 double dVolLDelta, dVolRDelta, dVolL, dVolR;
1623 uint32_t i, samplesToMix, samplesLeft;1623 uint32_t i, samplesToMix, samplesLeft;
1624 uint64_t posFrac;1624 uint64_t posFrac;
1625 1625
@@ -1639,23 +1639,23 @@ static void mix16bRampLoopCIntrp(voice_t *v, uint32_t numSamples) · 13 unmodified lines
1639 {1639 {
1640 for (i = 0; i < (samplesToMix & 3); i++)1640 for (i = 0; i < (samplesToMix & 3); i++)
1641 {1641 {
1642 RENDER_16BIT_SMP_CINTRP_TAP_FIX1642 RENDER_16BIT_SMP_SINTRP_TAP_FIX
1643 VOLUME_RAMPING1643 VOLUME_RAMPING
1644 INC_POS1644 INC_POS
1645 }1645 }
1646 samplesToMix >>= 2;1646 samplesToMix >>= 2;
1647 for (i = 0; i < samplesToMix; i++)1647 for (i = 0; i < samplesToMix; i++)
1648 {1648 {
1649 RENDER_16BIT_SMP_CINTRP_TAP_FIX1649 RENDER_16BIT_SMP_SINTRP_TAP_FIX
1650 VOLUME_RAMPING1650 VOLUME_RAMPING
1651 INC_POS1651 INC_POS
1652 RENDER_16BIT_SMP_CINTRP_TAP_FIX1652 RENDER_16BIT_SMP_SINTRP_TAP_FIX
1653 VOLUME_RAMPING1653 VOLUME_RAMPING
1654 INC_POS1654 INC_POS
1655 RENDER_16BIT_SMP_CINTRP_TAP_FIX1655 RENDER_16BIT_SMP_SINTRP_TAP_FIX
1656 VOLUME_RAMPING1656 VOLUME_RAMPING
1657 INC_POS1657 INC_POS
1658 RENDER_16BIT_SMP_CINTRP_TAP_FIX1658 RENDER_16BIT_SMP_SINTRP_TAP_FIX
1659 VOLUME_RAMPING1659 VOLUME_RAMPING
1660 INC_POS1660 INC_POS
1661 }1661 }
@@ -1664,23 +1664,23 @@ static void mix16bRampLoopCIntrp(voice_t *v, uint32_t numSamples) · 2 unmodified lines
1664 {1664 {
1665 for (i = 0; i < (samplesToMix & 3); i++)1665 for (i = 0; i < (samplesToMix & 3); i++)
1666 {1666 {
1667 RENDER_16BIT_SMP_CINTRP1667 RENDER_16BIT_SMP_SINTRP
1668 VOLUME_RAMPING1668 VOLUME_RAMPING
1669 INC_POS1669 INC_POS
1670 }1670 }
1671 samplesToMix >>= 2;1671 samplesToMix >>= 2;
1672 for (i = 0; i < samplesToMix; i++)1672 for (i = 0; i < samplesToMix; i++)
1673 {1673 {
1674 RENDER_16BIT_SMP_CINTRP1674 RENDER_16BIT_SMP_SINTRP
1675 VOLUME_RAMPING1675 VOLUME_RAMPING
1676 INC_POS1676 INC_POS
1677 RENDER_16BIT_SMP_CINTRP1677 RENDER_16BIT_SMP_SINTRP
1678 VOLUME_RAMPING1678 VOLUME_RAMPING
1679 INC_POS1679 INC_POS
1680 RENDER_16BIT_SMP_CINTRP1680 RENDER_16BIT_SMP_SINTRP
1681 VOLUME_RAMPING1681 VOLUME_RAMPING
1682 INC_POS1682 INC_POS
1683 RENDER_16BIT_SMP_CINTRP1683 RENDER_16BIT_SMP_SINTRP
1684 VOLUME_RAMPING1684 VOLUME_RAMPING
1685 INC_POS1685 INC_POS
1686 }1686 }
@@ -1693,12 +1693,12 @@ static void mix16bRampLoopCIntrp(voice_t *v, uint32_t numSamples) · 6 unmodified lines
1693 SET_BACK_MIXER_POS1693 SET_BACK_MIXER_POS
1694}1694}
1695 1695
1696static void mix16bRampBidiLoopCIntrp(voice_t *v, uint32_t numSamples)1696static void mix16bRampBidiLoopSIntrp(voice_t *v, uint32_t numSamples)
1697{1697{
1698 const int16_t *base, *revBase, *smpPtr;1698 const int16_t *base, *revBase, *smpPtr;
1699 float s0, s1, s2, s3, fSample, *fMixBufferL, *fMixBufferR;1699 double dSample, *dMixBufferL, *dMixBufferR;
1700 int32_t pos;1700 int32_t pos;
1701 float fVolLDelta, fVolRDelta, fVolL, fVolR;1701 double dVolLDelta, dVolRDelta, dVolL, dVolR;
1702 uint32_t i, samplesToMix, samplesLeft;1702 uint32_t i, samplesToMix, samplesLeft;
1703 uint64_t posFrac, tmpDelta;1703 uint64_t posFrac, tmpDelta;
1704 1704
@@ -1719,23 +1719,23 @@ static void mix16bRampBidiLoopCIntrp(voice_t *v, uint32_t numSamples) · 14 unmodified lines
1719 {1719 {
1720 for (i = 0; i < (samplesToMix & 3); i++)1720 for (i = 0; i < (samplesToMix & 3); i++)
1721 {1721 {
1722 RENDER_16BIT_SMP_CINTRP_TAP_FIX1722 RENDER_16BIT_SMP_SINTRP_TAP_FIX
1723 VOLUME_RAMPING1723 VOLUME_RAMPING
1724 INC_POS_BIDI1724 INC_POS_BIDI
1725 }1725 }
1726 samplesToMix >>= 2;1726 samplesToMix >>= 2;
1727 for (i = 0; i < samplesToMix; i++)1727 for (i = 0; i < samplesToMix; i++)
1728 {1728 {
1729 RENDER_16BIT_SMP_CINTRP_TAP_FIX1729 RENDER_16BIT_SMP_SINTRP_TAP_FIX
1730 VOLUME_RAMPING1730 VOLUME_RAMPING
1731 INC_POS_BIDI1731 INC_POS_BIDI
1732 RENDER_16BIT_SMP_CINTRP_TAP_FIX1732 RENDER_16BIT_SMP_SINTRP_TAP_FIX
1733 VOLUME_RAMPING1733 VOLUME_RAMPING
1734 INC_POS_BIDI1734 INC_POS_BIDI
1735 RENDER_16BIT_SMP_CINTRP_TAP_FIX1735 RENDER_16BIT_SMP_SINTRP_TAP_FIX
1736 VOLUME_RAMPING1736 VOLUME_RAMPING
1737 INC_POS_BIDI1737 INC_POS_BIDI
1738 RENDER_16BIT_SMP_CINTRP_TAP_FIX1738 RENDER_16BIT_SMP_SINTRP_TAP_FIX
1739 VOLUME_RAMPING1739 VOLUME_RAMPING
1740 INC_POS_BIDI1740 INC_POS_BIDI
1741 }1741 }
@@ -1744,23 +1744,23 @@ static void mix16bRampBidiLoopCIntrp(voice_t *v, uint32_t numSamples) · 2 unmodified lines
1744 {1744 {
1745 for (i = 0; i < (samplesToMix & 3); i++)1745 for (i = 0; i < (samplesToMix & 3); i++)
1746 {1746 {
1747 RENDER_16BIT_SMP_CINTRP1747 RENDER_16BIT_SMP_SINTRP
1748 VOLUME_RAMPING1748 VOLUME_RAMPING
1749 INC_POS_BIDI1749 INC_POS_BIDI
1750 }1750 }
1751 samplesToMix >>= 2;1751 samplesToMix >>= 2;
1752 for (i = 0; i < samplesToMix; i++)1752 for (i = 0; i < samplesToMix; i++)
1753 {1753 {
1754 RENDER_16BIT_SMP_CINTRP1754 RENDER_16BIT_SMP_SINTRP
1755 VOLUME_RAMPING1755 VOLUME_RAMPING
1756 INC_POS_BIDI1756 INC_POS_BIDI
1757 RENDER_16BIT_SMP_CINTRP1757 RENDER_16BIT_SMP_SINTRP
1758 VOLUME_RAMPING1758 VOLUME_RAMPING
1759 INC_POS_BIDI1759 INC_POS_BIDI
1760 RENDER_16BIT_SMP_CINTRP1760 RENDER_16BIT_SMP_SINTRP
1761 VOLUME_RAMPING1761 VOLUME_RAMPING
1762 INC_POS_BIDI1762 INC_POS_BIDI
1763 RENDER_16BIT_SMP_CINTRP1763 RENDER_16BIT_SMP_SINTRP
1764 VOLUME_RAMPING1764 VOLUME_RAMPING
1765 INC_POS_BIDI1765 INC_POS_BIDI
1766 }1766 }
@@ -1777,9 +1777,9 @@ static void mix16bRampBidiLoopCIntrp(voice_t *v, uint32_t numSamples) · 10 unmodified lines
1777static void mix16bRampNoLoopLIntrp(voice_t *v, uint32_t numSamples)1777static void mix16bRampNoLoopLIntrp(voice_t *v, uint32_t numSamples)
1778{1778{
1779 const int16_t *base, *smpPtr;1779 const int16_t *base, *smpPtr;
1780 float fSample, *fMixBufferL, *fMixBufferR;1780 double dSample, *dMixBufferL, *dMixBufferR;
1781 int32_t pos;1781 int32_t pos;
1782 float fVolLDelta, fVolRDelta, fVolL, fVolR;1782 double dVolLDelta, dVolRDelta, dVolL, dVolR;
1783 uint32_t i, samplesToMix, samplesLeft;1783 uint32_t i, samplesToMix, samplesLeft;
1784 uint64_t posFrac;1784 uint64_t posFrac;
1785 1785
@@ -1827,9 +1827,9 @@ static void mix16bRampNoLoopLIntrp(voice_t *v, uint32_t numSamples) · 41 unmodified lines
1827static void mix16bRampLoopLIntrp(voice_t *v, uint32_t numSamples)1827static void mix16bRampLoopLIntrp(voice_t *v, uint32_t numSamples)
1828{1828{
1829 const int16_t *base, *smpPtr;1829 const int16_t *base, *smpPtr;
1830 float fSample, *fMixBufferL, *fMixBufferR;1830 double dSample, *dMixBufferL, *dMixBufferR;
1831 int32_t pos;1831 int32_t pos;
1832 float fVolLDelta, fVolRDelta, fVolL, fVolR;1832 double dVolLDelta, dVolRDelta, dVolL, dVolR;
1833 uint32_t i, samplesToMix, samplesLeft;1833 uint32_t i, samplesToMix, samplesLeft;
1834 uint64_t posFrac;1834 uint64_t posFrac;
1835 1835
@@ -1877,9 +1877,9 @@ static void mix16bRampLoopLIntrp(voice_t *v, uint32_t numSamples) · 41 unmodified lines
1877static void mix16bRampBidiLoopLIntrp(voice_t *v, uint32_t numSamples)1877static void mix16bRampBidiLoopLIntrp(voice_t *v, uint32_t numSamples)
1878{1878{
1879 const int16_t *base, *revBase, *smpPtr;1879 const int16_t *base, *revBase, *smpPtr;
1880 float fSample, *fMixBufferL, *fMixBufferR;1880 double dSample, *dMixBufferL, *dMixBufferR;
1881 int32_t pos;1881 int32_t pos;
1882 float fVolLDelta, fVolRDelta, fVolL, fVolR;1882 double dVolLDelta, dVolRDelta, dVolL, dVolR;
1883 uint32_t i, samplesToMix, samplesLeft;1883 uint32_t i, samplesToMix, samplesLeft;
1884 uint64_t posFrac, tmpDelta;1884 uint64_t posFrac, tmpDelta;
1885 1885
@@ -1942,9 +1942,9 @@ const mixFunc mixFuncTab[72] = · 56 unmodified lines
1942 (mixFunc)mix8bNoLoop,1942 (mixFunc)mix8bNoLoop,
1943 (mixFunc)mix8bLoop,1943 (mixFunc)mix8bLoop,
1944 (mixFunc)mix8bBidiLoop,1944 (mixFunc)mix8bBidiLoop,
1945 (mixFunc)mix8bNoLoopCIntrp,1945 (mixFunc)mix8bNoLoopSIntrp,
1946 (mixFunc)mix8bLoopCIntrp,1946 (mixFunc)mix8bLoopSIntrp,
1947 (mixFunc)mix8bBidiLoopCIntrp,1947 (mixFunc)mix8bBidiLoopSIntrp,
1948 (mixFunc)mix8bNoLoopLIntrp,1948 (mixFunc)mix8bNoLoopLIntrp,
1949 (mixFunc)mix8bLoopLIntrp,1949 (mixFunc)mix8bLoopLIntrp,
1950 (mixFunc)mix8bBidiLoopLIntrp,1950 (mixFunc)mix8bBidiLoopLIntrp,
@@ -1953,9 +1953,9 @@ const mixFunc mixFuncTab[72] = · 2 unmodified lines
1953 (mixFunc)mix16bNoLoop,1953 (mixFunc)mix16bNoLoop,
1954 (mixFunc)mix16bLoop,1954 (mixFunc)mix16bLoop,
1955 (mixFunc)mix16bBidiLoop,1955 (mixFunc)mix16bBidiLoop,
1956 (mixFunc)mix16bNoLoopCIntrp,1956 (mixFunc)mix16bNoLoopSIntrp,
1957 (mixFunc)mix16bLoopCIntrp,1957 (mixFunc)mix16bLoopSIntrp,
1958 (mixFunc)mix16bBidiLoopCIntrp,1958 (mixFunc)mix16bBidiLoopSIntrp,
1959 (mixFunc)mix16bNoLoopLIntrp,1959 (mixFunc)mix16bNoLoopLIntrp,
1960 (mixFunc)mix16bLoopLIntrp,1960 (mixFunc)mix16bLoopLIntrp,
1961 (mixFunc)mix16bBidiLoopLIntrp,1961 (mixFunc)mix16bBidiLoopLIntrp,
@@ -1966,9 +1966,9 @@ const mixFunc mixFuncTab[72] = · 4 unmodified lines
1966 (mixFunc)mix8bRampNoLoop,1966 (mixFunc)mix8bRampNoLoop,
1967 (mixFunc)mix8bRampLoop,1967 (mixFunc)mix8bRampLoop,
1968 (mixFunc)mix8bRampBidiLoop,1968 (mixFunc)mix8bRampBidiLoop,
1969 (mixFunc)mix8bRampNoLoopCIntrp,1969 (mixFunc)mix8bRampNoLoopSIntrp,
1970 (mixFunc)mix8bRampLoopCIntrp,1970 (mixFunc)mix8bRampLoopSIntrp,
1971 (mixFunc)mix8bRampBidiLoopCIntrp,1971 (mixFunc)mix8bRampBidiLoopSIntrp,
1972 (mixFunc)mix8bRampNoLoopLIntrp,1972 (mixFunc)mix8bRampNoLoopLIntrp,
1973 (mixFunc)mix8bRampLoopLIntrp,1973 (mixFunc)mix8bRampLoopLIntrp,
1974 (mixFunc)mix8bRampBidiLoopLIntrp,1974 (mixFunc)mix8bRampBidiLoopLIntrp,
@@ -1977,9 +1977,9 @@ const mixFunc mixFuncTab[72] = · 2 unmodified lines
1977 (mixFunc)mix16bRampNoLoop,1977 (mixFunc)mix16bRampNoLoop,
1978 (mixFunc)mix16bRampLoop,1978 (mixFunc)mix16bRampLoop,
1979 (mixFunc)mix16bRampBidiLoop,1979 (mixFunc)mix16bRampBidiLoop,
1980 (mixFunc)mix16bRampNoLoopCIntrp,1980 (mixFunc)mix16bRampNoLoopSIntrp,
1981 (mixFunc)mix16bRampLoopCIntrp,1981 (mixFunc)mix16bRampLoopSIntrp,
1982 (mixFunc)mix16bRampBidiLoopCIntrp,1982 (mixFunc)mix16bRampBidiLoopSIntrp,
1983 (mixFunc)mix16bRampNoLoopLIntrp,1983 (mixFunc)mix16bRampNoLoopLIntrp,
1984 (mixFunc)mix16bRampLoopLIntrp,1984 (mixFunc)mix16bRampLoopLIntrp,
1985 (mixFunc)mix16bRampBidiLoopLIntrp,1985 (mixFunc)mix16bRampBidiLoopLIntrp,
@@ -1996,9 +1996,9 @@ const mixFunc mixFuncTab[72] = · 10 unmodified lines
1996 (mixFunc)centerMix8bNoLoop,1996 (mixFunc)centerMix8bNoLoop,
1997 (mixFunc)centerMix8bLoop,1997 (mixFunc)centerMix8bLoop,
1998 (mixFunc)centerMix8bBidiLoop,1998 (mixFunc)centerMix8bBidiLoop,
1999 (mixFunc)centerMix8bNoLoopCIntrp,1999 (mixFunc)centerMix8bNoLoopSIntrp,
2000 (mixFunc)centerMix8bLoopCIntrp,2000 (mixFunc)centerMix8bLoopSIntrp,
2001 (mixFunc)centerMix8bBidiLoopCIntrp,2001 (mixFunc)centerMix8bBidiLoopSIntrp,
2002 (mixFunc)centerMix8bNoLoopLIntrp,2002 (mixFunc)centerMix8bNoLoopLIntrp,
2003 (mixFunc)centerMix8bLoopLIntrp,2003 (mixFunc)centerMix8bLoopLIntrp,
2004 (mixFunc)centerMix8bBidiLoopLIntrp,2004 (mixFunc)centerMix8bBidiLoopLIntrp,
@@ -2007,9 +2007,9 @@ const mixFunc mixFuncTab[72] = · 2 unmodified lines
2007 (mixFunc)centerMix16bNoLoop,2007 (mixFunc)centerMix16bNoLoop,
2008 (mixFunc)centerMix16bLoop,2008 (mixFunc)centerMix16bLoop,
2009 (mixFunc)centerMix16bBidiLoop,2009 (mixFunc)centerMix16bBidiLoop,
2010 (mixFunc)centerMix16bNoLoopCIntrp,2010 (mixFunc)centerMix16bNoLoopSIntrp,
2011 (mixFunc)centerMix16bLoopCIntrp,2011 (mixFunc)centerMix16bLoopSIntrp,
2012 (mixFunc)centerMix16bBidiLoopCIntrp,2012 (mixFunc)centerMix16bBidiLoopSIntrp,
2013 (mixFunc)centerMix16bNoLoopLIntrp,2013 (mixFunc)centerMix16bNoLoopLIntrp,
2014 (mixFunc)centerMix16bLoopLIntrp,2014 (mixFunc)centerMix16bLoopLIntrp,
2015 (mixFunc)centerMix16bBidiLoopLIntrp,2015 (mixFunc)centerMix16bBidiLoopLIntrp,
@@ -2020,9 +2020,9 @@ const mixFunc mixFuncTab[72] = · 4 unmodified lines
2020 (mixFunc)centerMix8bRampNoLoop,2020 (mixFunc)centerMix8bRampNoLoop,
2021 (mixFunc)centerMix8bRampLoop,2021 (mixFunc)centerMix8bRampLoop,
2022 (mixFunc)centerMix8bRampBidiLoop,2022 (mixFunc)centerMix8bRampBidiLoop,
2023 (mixFunc)centerMix8bRampNoLoopCIntrp,2023 (mixFunc)centerMix8bRampNoLoopSIntrp,
2024 (mixFunc)centerMix8bRampLoopCIntrp,2024 (mixFunc)centerMix8bRampLoopSIntrp,
2025 (mixFunc)centerMix8bRampBidiLoopCIntrp,2025 (mixFunc)centerMix8bRampBidiLoopSIntrp,
2026 (mixFunc)centerMix8bRampNoLoopLIntrp,2026 (mixFunc)centerMix8bRampNoLoopLIntrp,
2027 (mixFunc)centerMix8bRampLoopLIntrp,2027 (mixFunc)centerMix8bRampLoopLIntrp,
2028 (mixFunc)centerMix8bRampBidiLoopLIntrp,2028 (mixFunc)centerMix8bRampBidiLoopLIntrp,
@@ -2031,9 +2031,9 @@ const mixFunc mixFuncTab[72] = · 2 unmodified lines
2031 (mixFunc)centerMix16bRampNoLoop,2031 (mixFunc)centerMix16bRampNoLoop,
2032 (mixFunc)centerMix16bRampLoop,2032 (mixFunc)centerMix16bRampLoop,
2033 (mixFunc)centerMix16bRampBidiLoop,2033 (mixFunc)centerMix16bRampBidiLoop,
2034 (mixFunc)centerMix16bRampNoLoopCIntrp,2034 (mixFunc)centerMix16bRampNoLoopSIntrp,
2035 (mixFunc)centerMix16bRampLoopCIntrp,2035 (mixFunc)centerMix16bRampLoopSIntrp,
2036 (mixFunc)centerMix16bRampBidiLoopCIntrp,2036 (mixFunc)centerMix16bRampBidiLoopSIntrp,
2037 (mixFunc)centerMix16bRampNoLoopLIntrp,2037 (mixFunc)centerMix16bRampNoLoopLIntrp,
2038 (mixFunc)centerMix16bRampLoopLIntrp,2038 (mixFunc)centerMix16bRampLoopLIntrp,
2039 (mixFunc)centerMix16bRampBidiLoopLIntrp2039 (mixFunc)centerMix16bRampBidiLoopLIntrp
src/mixer/ft2_mix_macros.h+156−117
@@ -2,64 +2,64 @@ · 1 unmodified line
2 2
3#include <assert.h>3#include <assert.h>
4#include "../ft2_audio.h"4#include "../ft2_audio.h"
5#include "ft2_cubicspline.h"5#include "ft2_windowed_sinc.h"
6 6
7/* ----------------------------------------------------------------------- */7/* ----------------------------------------------------------------------- */
8/* GENERAL MIXER MACROS */8/* GENERAL MIXER MACROS */
9/* ----------------------------------------------------------------------- */9/* ----------------------------------------------------------------------- */
10 10
11#define GET_VOL \11#define GET_VOL \
12 const float fVolL = v->fVolL; \12 const double dVolL = v->dVolL; \
13 const float fVolR = v->fVolR; \13 const double dVolR = v->dVolR; \
14 14
15#define GET_VOL_MONO \15#define GET_VOL_MONO \
16 const float fVolL = v->fVolL; \16 const double dVolL = v->dVolL; \
17 17
18#define GET_VOL_RAMP \18#define GET_VOL_RAMP \
19 fVolL = v->fVolL; \19 dVolL = v->dVolL; \
20 fVolR = v->fVolR; \20 dVolR = v->dVolR; \
21 21
22#define GET_VOL_MONO_RAMP \22#define GET_VOL_MONO_RAMP \
23 fVolL = v->fVolL; \23 dVolL = v->dVolL; \
24 24
25#define SET_VOL_BACK \25#define SET_VOL_BACK \
26 v->fVolL = fVolL; \26 v->dVolL = dVolL; \
27 v->fVolR = fVolR; \27 v->dVolR = dVolR; \
28 28
29#define SET_VOL_BACK_MONO \29#define SET_VOL_BACK_MONO \
30 v->fVolL = v->fVolR = fVolL; \30 v->dVolL = v->dVolR = dVolL; \
31 31
32#define GET_MIXER_VARS \32#define GET_MIXER_VARS \
33 const uint64_t delta = v->delta; \33 const uint64_t delta = v->delta; \
34 fMixBufferL = audio.fMixBufferL; \34 dMixBufferL = audio.dMixBufferL; \
35 fMixBufferR = audio.fMixBufferR; \35 dMixBufferR = audio.dMixBufferR; \
36 pos = v->pos; \36 pos = v->pos; \
37 posFrac = v->posFrac; \37 posFrac = v->posFrac; \
38 38
39#define GET_MIXER_VARS_RAMP \39#define GET_MIXER_VARS_RAMP \
40 const uint64_t delta = v->delta; \40 const uint64_t delta = v->delta; \
41 fMixBufferL = audio.fMixBufferL; \41 dMixBufferL = audio.dMixBufferL; \
42 fMixBufferR = audio.fMixBufferR; \42 dMixBufferR = audio.dMixBufferR; \
43 fVolLDelta = v->fVolDeltaL; \43 dVolLDelta = v->dVolDeltaL; \
44 fVolRDelta = v->fVolDeltaR; \44 dVolRDelta = v->dVolDeltaR; \
45 pos = v->pos; \45 pos = v->pos; \
46 posFrac = v->posFrac; \46 posFrac = v->posFrac; \
47 47
48#define GET_MIXER_VARS_MONO_RAMP \48#define GET_MIXER_VARS_MONO_RAMP \
49 const uint64_t delta = v->delta; \49 const uint64_t delta = v->delta; \
50 fMixBufferL = audio.fMixBufferL; \50 dMixBufferL = audio.dMixBufferL; \
51 fMixBufferR = audio.fMixBufferR; \51 dMixBufferR = audio.dMixBufferR; \
52 fVolLDelta = v->fVolDeltaL; \52 dVolLDelta = v->dVolDeltaL; \
53 pos = v->pos; \53 pos = v->pos; \
54 posFrac = v->posFrac; \54 posFrac = v->posFrac; \
55 55
56#define PREPARE_TAP_FIX8 \56#define PREPARE_TAP_FIX8 \
57 const int8_t *loopStartPtr = &v->base8[v->loopStart]; \57 const int8_t *loopStartPtr = &v->base8[v->loopStart]; \
58 const float fTapFixSample = v->fTapFixSample; \58 const int8_t *leftEdgePtr = loopStartPtr+SINC_LEFT_TAPS; \
59 59
60#define PREPARE_TAP_FIX16 \60#define PREPARE_TAP_FIX16 \
61 const int16_t *loopStartPtr = &v->base16[v->loopStart]; \61 const int16_t *loopStartPtr = &v->base16[v->loopStart]; \
62 const float fTapFixSample = v->fTapFixSample; \62 const int16_t *leftEdgePtr = loopStartPtr+SINC_LEFT_TAPS; \
63 63
64#define SET_BASE8 \64#define SET_BASE8 \
65 base = v->base8; \65 base = v->base8; \
@@ -97,77 +97,77 @@ · 31 unmodified lines
97/* ----------------------------------------------------------------------- */97/* ----------------------------------------------------------------------- */
98 98
99#define VOLUME_RAMPING \99#define VOLUME_RAMPING \
100 fVolL += fVolLDelta; \100 dVolL += dVolLDelta; \
101 fVolR += fVolRDelta; \101 dVolR += dVolRDelta; \
102 102
103#define VOLUME_RAMPING_MONO \103#define VOLUME_RAMPING_MONO \
104 fVolL += fVolLDelta; \104 dVolL += dVolLDelta; \
105 105
106#define RENDER_8BIT_SMP \106#define RENDER_8BIT_SMP \
107 assert(smpPtr >= base && smpPtr < base+v->end); \107 assert(smpPtr >= base && smpPtr < base+v->end); \
108 fSample = *smpPtr * (1.0f / 128.0f); \108 dSample = *smpPtr * (1.0 / 128.0); \
109 *fMixBufferL++ += fSample * fVolL; \109 *dMixBufferL++ += dSample * dVolL; \
110 *fMixBufferR++ += fSample * fVolR; \110 *dMixBufferR++ += dSample * dVolR; \
111 111
112#define RENDER_8BIT_SMP_MONO \112#define RENDER_8BIT_SMP_MONO \
113 assert(smpPtr >= base && smpPtr < base+v->end); \113 assert(smpPtr >= base && smpPtr < base+v->end); \
114 fSample = (*smpPtr * (1.0f / 128.0f)) * fVolL; \114 dSample = (*smpPtr * (1.0 / 128.0)) * dVolL; \
115 *fMixBufferL++ += fSample; \115 *dMixBufferL++ += dSample; \
116 *fMixBufferR++ += fSample; \116 *dMixBufferR++ += dSample; \
117 117
118#define RENDER_16BIT_SMP \118#define RENDER_16BIT_SMP \
119 assert(smpPtr >= base && smpPtr < base+v->end); \119 assert(smpPtr >= base && smpPtr < base+v->end); \
120 fSample = *smpPtr * (1.0f / 32768.0f); \120 dSample = *smpPtr * (1.0 / 32768.0); \
121 *fMixBufferL++ += fSample * fVolL; \121 *dMixBufferL++ += dSample * dVolL; \
122 *fMixBufferR++ += fSample * fVolR; \122 *dMixBufferR++ += dSample * dVolR; \
123 123
124#define RENDER_16BIT_SMP_MONO \124#define RENDER_16BIT_SMP_MONO \
125 assert(smpPtr >= base && smpPtr < base+v->end); \125 assert(smpPtr >= base && smpPtr < base+v->end); \
126 fSample = (*smpPtr * (1.0f / 32768.0f)) * fVolL; \126 dSample = (*smpPtr * (1.0 / 32768.0)) * dVolL; \
127 *fMixBufferL++ += fSample; \127 *dMixBufferL++ += dSample; \
128 *fMixBufferR++ += fSample; \128 *dMixBufferR++ += dSample; \
129 129
130// 2-tap linear interpolation (like FT2)130// 2-tap linear interpolation (like FT2)
131 131
132#define LINEAR_INTERPOLATION16(s, f) \132#define LINEAR_INTERPOLATION8(s, f) \
133{ \133{ \
134 const float fFrac = (const float)((uint32_t)f * (1.0f / (UINT32_MAX+1.0f))); /* 0.0 .. 0.999f */ \134 const double dFrac = (const double)((uint32_t)f * (1.0 / (UINT32_MAX+1.0))); /* 0.0 .. 0.999999999 */ \
135 fSample = ((s[0] + (s[1]-s[0]) * fFrac)) * (1.0f / 32768.0f); \135 dSample = ((s[0] + (s[1]-s[0]) * dFrac)) * (1.0 / 128.0); \
136} \136} \
137 137
138#define LINEAR_INTERPOLATION8(s, f) \138#define LINEAR_INTERPOLATION16(s, f) \
139{ \139{ \
140 const float fFrac = (const float)((uint32_t)f * (1.0f / (UINT32_MAX+1.0f))); /* 0.0f .. 0.999f */ \140 const double dFrac = (const double)((uint32_t)f * (1.0 / (UINT32_MAX+1.0))); /* 0.0 .. 0.999999999 */ \
141 fSample = ((s[0] + (s[1]-s[0]) * fFrac)) * (1.0f / 128.0f); \141 dSample = ((s[0] + (s[1]-s[0]) * dFrac)) * (1.0 / 32768.0); \
142} \142} \
143 143
144#define RENDER_8BIT_SMP_LINTRP \144#define RENDER_8BIT_SMP_LINTRP \
145 assert(smpPtr >= base && smpPtr < base+v->end); \145 assert(smpPtr >= base && smpPtr < base+v->end); \
146 LINEAR_INTERPOLATION8(smpPtr, posFrac) \146 LINEAR_INTERPOLATION8(smpPtr, posFrac) \
147 *fMixBufferL++ += fSample * fVolL; \147 *dMixBufferL++ += dSample * dVolL; \
148 *fMixBufferR++ += fSample * fVolR; \148 *dMixBufferR++ += dSample * dVolR; \
149 149
150#define RENDER_8BIT_SMP_MONO_LINTRP \150#define RENDER_8BIT_SMP_MONO_LINTRP \
151 assert(smpPtr >= base && smpPtr < base+v->end); \151 assert(smpPtr >= base && smpPtr < base+v->end); \
152 LINEAR_INTERPOLATION8(smpPtr, posFrac) \152 LINEAR_INTERPOLATION8(smpPtr, posFrac) \
153 fSample *= fVolL; \153 dSample *= dVolL; \
154 *fMixBufferL++ += fSample; \154 *dMixBufferL++ += dSample; \
155 *fMixBufferR++ += fSample; \155 *dMixBufferR++ += dSample; \
156 156
157#define RENDER_16BIT_SMP_LINTRP \157#define RENDER_16BIT_SMP_LINTRP \
158 assert(smpPtr >= base && smpPtr < base+v->end); \158 assert(smpPtr >= base && smpPtr < base+v->end); \
159 LINEAR_INTERPOLATION16(smpPtr, posFrac) \159 LINEAR_INTERPOLATION16(smpPtr, posFrac) \
160 *fMixBufferL++ += fSample * fVolL; \160 *dMixBufferL++ += dSample * dVolL; \
161 *fMixBufferR++ += fSample * fVolR; \161 *dMixBufferR++ += dSample * dVolR; \
162 162
163#define RENDER_16BIT_SMP_MONO_LINTRP \163#define RENDER_16BIT_SMP_MONO_LINTRP \
164 assert(smpPtr >= base && smpPtr < base+v->end); \164 assert(smpPtr >= base && smpPtr < base+v->end); \
165 LINEAR_INTERPOLATION16(smpPtr, posFrac) \165 LINEAR_INTERPOLATION16(smpPtr, posFrac) \
166 fSample *= fVolL; \166 dSample *= dVolL; \
167 *fMixBufferL++ += fSample; \167 *dMixBufferL++ += dSample; \
168 *fMixBufferR++ += fSample; \168 *dMixBufferR++ += dSample; \
169 169
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)
171 171
172/* 8bitbubsy: It may look like we are potentially going out of bounds while looking up the sample points,172/* 8bitbubsy: It may look like we are potentially going out of bounds while looking up the sample points,
173** but the sample data is actually padded on both the left (negative) and right side, where correct tap173** 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
177**177**
178*/178*/
179 179
180#define CUBICSPLINE_INTERPOLATION(LUT, s, f) \180#define WINDOWED_SINC_INTERPOLATION8(s, f) \
181{ \181{ \
182 const float *t = (const float *)LUT + (((uint32_t)f >> CUBIC_FSHIFT) & CUBIC_FMASK); \182 const double *t = v->dSincLUT + (((uint32_t)f >> SINC_FSHIFT) & SINC_FMASK); \
183 fSample = (s[-1] * t[0]) + (s[0] * t[1]) + (s[1] * t[2]) + (s[2] * t[3]); \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); \
184} \191} \
185 192
186#define CUBICSPLINE_INTERPOLATION_CUSTOM(LUT, f) \193#define WINDOWED_SINC_INTERPOLATION16(s, f) \
187{ \194{ \
188 const float *t = (const float *)LUT + (((uint32_t)f >> CUBIC_FSHIFT) & CUBIC_FMASK); \195 const double *t = v->dSincLUT + (((uint32_t)f >> SINC_FSHIFT) & SINC_FMASK); \
189 fSample = (s0 * t[0]) + (s1 * t[1]) + (s2 * t[2]) + (s3 * t[3]); \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); \
190} \204} \
191 205
192#define RENDER_8BIT_SMP_CINTRP \206#define RENDER_8BIT_SMP_SINTRP \
193 assert(smpPtr >= base && smpPtr < base+v->end); \207 assert(smpPtr >= base && smpPtr < base+v->end); \
194 CUBICSPLINE_INTERPOLATION(fCubicSplineLUT8, smpPtr, posFrac) \208 WINDOWED_SINC_INTERPOLATION8(smpPtr, posFrac) \
195 *fMixBufferL++ += fSample * fVolL; \209 *dMixBufferL++ += dSample * dVolL; \
196 *fMixBufferR++ += fSample * fVolR; \210 *dMixBufferR++ += dSample * dVolR; \
197 211
198#define RENDER_8BIT_SMP_MONO_CINTRP \212#define RENDER_8BIT_SMP_MONO_SINTRP \
199 assert(smpPtr >= base && smpPtr < base+v->end); \213 assert(smpPtr >= base && smpPtr < base+v->end); \
200 CUBICSPLINE_INTERPOLATION(fCubicSplineLUT8, smpPtr, posFrac) \214 WINDOWED_SINC_INTERPOLATION8(smpPtr, posFrac) \
201 fSample *= fVolL; \215 dSample *= dVolL; \
202 *fMixBufferL++ += fSample; \216 *dMixBufferL++ += dSample; \
203 *fMixBufferR++ += fSample; \217 *dMixBufferR++ += dSample; \
204 218
205#define RENDER_16BIT_SMP_CINTRP \219#define RENDER_16BIT_SMP_SINTRP \
206 assert(smpPtr >= base && smpPtr < base+v->end); \220 assert(smpPtr >= base && smpPtr < base+v->end); \
207 CUBICSPLINE_INTERPOLATION(fCubicSplineLUT16, smpPtr, posFrac) \221 WINDOWED_SINC_INTERPOLATION16(smpPtr, posFrac) \
208 *fMixBufferL++ += fSample * fVolL; \222 *dMixBufferL++ += dSample * dVolL; \
209 *fMixBufferR++ += fSample * fVolR; \223 *dMixBufferR++ += dSample * dVolR; \
210 224
211#define RENDER_16BIT_SMP_MONO_CINTRP \225#define RENDER_16BIT_SMP_MONO_SINTRP \
212 assert(smpPtr >= base && smpPtr < base+v->end); \226 assert(smpPtr >= base && smpPtr < base+v->end); \
213 CUBICSPLINE_INTERPOLATION(fCubicSplineLUT16, smpPtr, posFrac) \227 WINDOWED_SINC_INTERPOLATION16(smpPtr, posFrac) \
214 fSample *= fVolL; \228 dSample *= dVolL; \
215 *fMixBufferL++ += fSample; \229 *dMixBufferL++ += dSample; \
216 *fMixBufferR++ += fSample; \230 *dMixBufferR++ += dSample; \
217 231
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 \
219 assert(smpPtr >= base && smpPtr < base+v->end); \237 assert(smpPtr >= base && smpPtr < base+v->end); \
220 s0 = (smpPtr != loopStartPtr) ? smpPtr[-1] : fTapFixSample; \238 if (smpPtr <= leftEdgePtr) \
221 s1 = smpPtr[0]; \239 { \
222 s2 = smpPtr[1]; \240 const double *tapData = &v->dLeftEdgeTaps[(int32_t)(smpPtr - loopStartPtr)]; \
223 s3 = smpPtr[2]; \241 WINDOWED_SINC_INTERPOLATION8(tapData, posFrac) \
224 CUBICSPLINE_INTERPOLATION_CUSTOM(fCubicSplineLUT8, posFrac) \242 } \
225 *fMixBufferL++ += fSample * fVolL; \243 else \
226 *fMixBufferR++ += fSample * fVolR; \244 { \
227 245 WINDOWED_SINC_INTERPOLATION8(smpPtr, posFrac) \
228#define RENDER_8BIT_SMP_MONO_CINTRP_TAP_FIX \246 } \
247 *dMixBufferL++ += dSample * dVolL; \
248 *dMixBufferR++ += dSample * dVolR; \
249
250#define RENDER_8BIT_SMP_MONO_SINTRP_TAP_FIX \
229 assert(smpPtr >= base && smpPtr < base+v->end); \251 assert(smpPtr >= base && smpPtr < base+v->end); \
230 s0 = (smpPtr != loopStartPtr) ? smpPtr[-1] : fTapFixSample; \252 if (smpPtr <= leftEdgePtr) \
231 s1 = smpPtr[0]; \253 { \
232 s2 = smpPtr[1]; \254 const double *tapData = &v->dLeftEdgeTaps[(int32_t)(smpPtr - loopStartPtr)]; \
233 s3 = smpPtr[2]; \255 WINDOWED_SINC_INTERPOLATION8(tapData, posFrac) \
234 CUBICSPLINE_INTERPOLATION_CUSTOM(fCubicSplineLUT8, posFrac) \256 } \
235 fSample *= fVolL; \257 else \
236 *fMixBufferL++ += fSample; \258 { \
237 *fMixBufferR++ += fSample; \259 WINDOWED_SINC_INTERPOLATION8(smpPtr, posFrac) \
238 260 } \
239#define RENDER_16BIT_SMP_CINTRP_TAP_FIX \261 dSample *= dVolL; \
262 *dMixBufferL++ += dSample; \
263 *dMixBufferR++ += dSample; \
264
265#define RENDER_16BIT_SMP_SINTRP_TAP_FIX \
240 assert(smpPtr >= base && smpPtr < base+v->end); \266 assert(smpPtr >= base && smpPtr < base+v->end); \
241 s0 = (smpPtr != loopStartPtr) ? smpPtr[-1] : fTapFixSample; \267 if (smpPtr <= leftEdgePtr) \
242 s1 = smpPtr[0]; \268 { \
243 s2 = smpPtr[1]; \269 const double *tapData = &v->dLeftEdgeTaps[(int32_t)(smpPtr - loopStartPtr)]; \
244 s3 = smpPtr[2]; \270 WINDOWED_SINC_INTERPOLATION16(tapData, posFrac) \
245 CUBICSPLINE_INTERPOLATION_CUSTOM(fCubicSplineLUT16, posFrac) \271 } \
246 *fMixBufferL++ += fSample * fVolL; \272 else \
247 *fMixBufferR++ += fSample * fVolR; \273 { \
248 274 WINDOWED_SINC_INTERPOLATION16(smpPtr, posFrac) \
249#define RENDER_16BIT_SMP_MONO_CINTRP_TAP_FIX \275 } \
276 *dMixBufferL++ += dSample * dVolL; \
277 *dMixBufferR++ += dSample * dVolR; \
278
279#define RENDER_16BIT_SMP_MONO_SINTRP_TAP_FIX \
250 assert(smpPtr >= base && smpPtr < base+v->end); \280 assert(smpPtr >= base && smpPtr < base+v->end); \
251 s0 = (smpPtr != loopStartPtr) ? smpPtr[-1] : fTapFixSample; \281 if (smpPtr <= leftEdgePtr) \
252 s1 = smpPtr[0]; \282 { \
253 s2 = smpPtr[1]; \283 const double *tapData = &v->dLeftEdgeTaps[(int32_t)(smpPtr - loopStartPtr)]; \
254 s3 = smpPtr[2]; \284 WINDOWED_SINC_INTERPOLATION16(tapData, posFrac) \
255 CUBICSPLINE_INTERPOLATION_CUSTOM(fCubicSplineLUT16, posFrac) \285 } \
256 fSample *= fVolL; \286 else \
257 *fMixBufferL++ += fSample; \287 { \
258 *fMixBufferR++ += fSample; \288 WINDOWED_SINC_INTERPOLATION16(smpPtr, posFrac) \
289 } \
290 dSample *= dVolL; \
291 *dMixBufferL++ += dSample; \
292 *dMixBufferR++ += dSample; \
259 293
260/* ----------------------------------------------------------------------- */294/* ----------------------------------------------------------------------- */
261/* SAMPLES-TO-MIX LIMITING MACROS */295/* SAMPLES-TO-MIX LIMITING MACROS */
@@ -267,6 +301,11 @@ · 5 unmodified lines
267 i = 65535; \301 i = 65535; \
268 \302 \
269 i = (i << 16) | ((uint32_t)(posFrac >> 16) ^ 0xFFFF); \303 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 \
270 samplesToMix = ((int64_t)i * v->revDelta) >> 32; \309 samplesToMix = ((int64_t)i * v->revDelta) >> 32; \
271 samplesToMix++; \310 samplesToMix++; \
272 \311 \
@@ -295,8 +334,8 @@ · 22 unmodified lines
295#define LIMIT_MIX_NUM_RAMP \334#define LIMIT_MIX_NUM_RAMP \
296 if (v->volRampSamples == 0) \335 if (v->volRampSamples == 0) \
297 { \336 { \
298 fVolLDelta = 0; \337 dVolLDelta = 0.0; \
299 fVolRDelta = 0; \338 dVolRDelta = 0.0; \
300 \339 \
301 if (v->isFadeOutVoice) \340 if (v->isFadeOutVoice) \
302 { \341 { \
@@ -315,7 +354,7 @@ · 12 unmodified lines
315#define LIMIT_MIX_NUM_MONO_RAMP \354#define LIMIT_MIX_NUM_MONO_RAMP \
316 if (v->volRampSamples == 0) \355 if (v->volRampSamples == 0) \
317 { \356 { \
318 fVolLDelta = 0; \357 dVolLDelta = 0.0; \
319 if (v->isFadeOutVoice) \358 if (v->isFadeOutVoice) \
320 { \359 { \
321 v->active = false; /* volume ramp fadeout-voice is done, shut it down */ \360 v->active = false; /* volume ramp fadeout-voice is done, shut it down */ \
src/mixer/ft2_silence_mix.c+39−8
@@ -1,27 +1,58 @@
1#include <stdint.h>1#include <stdint.h>
2#include "../ft2_audio.h"2#include "../ft2_audio.h"
3#include "ft2_silence_mix.h"3
4// used for the audio channel mixer when voice volume is zero
4 5
5void silenceMixRoutine(voice_t *v, int32_t numSamples)6void silenceMixRoutine(voice_t *v, int32_t numSamples)
6{7{
7 int32_t pos;8 const uint64_t newPos = v->delta * (uint64_t)numSamples;
8 uint64_t posFrac;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;
9 15
10 SILENCE_MIX_INC_POS16 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
11 24
12 if (v->loopType == LOOP_DISABLED)25 if (v->loopType == LOOP_DISABLED)
13 {26 {
14 SILENCE_MIX_NO_LOOP27 v->active = false; // shut down voice
28 return;
15 }29 }
16 else if (v->loopType == LOOP_FORWARD)30
31 if (v->loopType == LOOP_FORWARD)
17 {32 {
18 SILENCE_MIX_LOOP33 if (v->loopLength >= 2)
34 pos = v->loopStart + ((pos - v->end) % v->loopLength);
35 else
36 pos = v->loopStart;
19 }37 }
20 else // pingpong loop38 else // pingpong loop
21 {39 {
22 SILENCE_MIX_BIDI_LOOP40 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 }
23 }53 }
24 54
55 v->hasLooped = true;
25 v->posFrac = posFrac;56 v->posFrac = posFrac;
26 v->pos = pos;57 v->pos = pos;
27}58}
src/mixer/ft2_silence_mix.h+0−47
@@ -1,53 +1,6 @@
1#pragma once1#pragma once
2 2
3#include <stdint.h>3#include <stdint.h>
4#include <assert.h>
5#include "../ft2_audio.h"4#include "../ft2_audio.h"
6 5
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
53void silenceMixRoutine(voice_t *v, int32_t numSamples);6void 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
8double *gKaiserSinc = NULL;
9double *gDownSample1 = NULL;
10double *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
18static 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
35static 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
63bool 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
80void 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
28extern double *gKaiserSinc;
29extern double *gDownSample1;
30extern double *gDownSample2;
31
32bool calcWindowedSincTables(void);
33void freeWindowedSincTables(void);

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