diff options
-rw-r--r-- | apps/plugins/midi/midiutil.h | 2 | ||||
-rw-r--r-- | apps/plugins/midi/synth.c | 66 |
2 files changed, 40 insertions, 28 deletions
diff --git a/apps/plugins/midi/midiutil.h b/apps/plugins/midi/midiutil.h index 86e696aa99..4b1afa2928 100644 --- a/apps/plugins/midi/midiutil.h +++ b/apps/plugins/midi/midiutil.h | |||
@@ -21,7 +21,7 @@ | |||
21 | 21 | ||
22 | #define FRACTSIZE 12 | 22 | #define FRACTSIZE 12 |
23 | 23 | ||
24 | #define BUF_SIZE 8192 /* 32 kB output buffers */ | 24 | #define BUF_SIZE 16384 /* 64 kB output buffers */ |
25 | #define NBUF 2 | 25 | #define NBUF 2 |
26 | 26 | ||
27 | #ifndef SIMULATOR | 27 | #ifndef SIMULATOR |
diff --git a/apps/plugins/midi/synth.c b/apps/plugins/midi/synth.c index 969d9b939a..1d759be288 100644 --- a/apps/plugins/midi/synth.c +++ b/apps/plugins/midi/synth.c | |||
@@ -262,14 +262,6 @@ void setPoint(struct SynthObject * so, int pt) | |||
262 | so->curOffset = 0; | 262 | so->curOffset = 0; |
263 | } | 263 | } |
264 | 264 | ||
265 | inline void stopVoice(struct SynthObject * so) | ||
266 | { | ||
267 | if(so->state == STATE_RAMPDOWN) | ||
268 | return; | ||
269 | so->state = STATE_RAMPDOWN; | ||
270 | so->decay = 0; | ||
271 | } | ||
272 | |||
273 | static inline void synthVoice(struct SynthObject * so, int32_t * out, unsigned int samples) | 265 | static inline void synthVoice(struct SynthObject * so, int32_t * out, unsigned int samples) |
274 | { | 266 | { |
275 | struct GWaveform * wf; | 267 | struct GWaveform * wf; |
@@ -293,10 +285,13 @@ static inline void synthVoice(struct SynthObject * so, int32_t * out, unsigned i | |||
293 | const unsigned int start_loop = wf->startLoop << FRACTSIZE; | 285 | const unsigned int start_loop = wf->startLoop << FRACTSIZE; |
294 | const int diff_loop = end_loop-start_loop; | 286 | const int diff_loop = end_loop-start_loop; |
295 | 287 | ||
288 | bool rampdown = (so->state == STATE_RAMPDOWN); | ||
289 | const bool ch_9 = (so->ch == 9); | ||
290 | |||
296 | while(LIKELY(samples-- > 0)) | 291 | while(LIKELY(samples-- > 0)) |
297 | { | 292 | { |
298 | /* Is voice being ramped? */ | 293 | /* Is voice being ramped? */ |
299 | if(UNLIKELY(so->state == STATE_RAMPDOWN)) | 294 | if(UNLIKELY(rampdown)) |
300 | { | 295 | { |
301 | if(so->decay != 0) /* Ramp has been started */ | 296 | if(so->decay != 0) /* Ramp has been started */ |
302 | { | 297 | { |
@@ -305,10 +300,10 @@ static inline void synthVoice(struct SynthObject * so, int32_t * out, unsigned i | |||
305 | if(so->decay < 10 && so->decay > -10) | 300 | if(so->decay < 10 && so->decay > -10) |
306 | so->isUsed = false; | 301 | so->isUsed = false; |
307 | 302 | ||
308 | s1=so->decay; | 303 | s1 = so->decay; |
309 | s2 = s1*pan; | 304 | s2 = s1 * pan; |
310 | s1 = (s1<<7) -s2; | 305 | s1 = (s1 << 7) -s2; |
311 | *(out++)+=((s1 << 9) & 0xFFFF0000) | ((s2 >> 7) &0xFFFF); | 306 | *(out++) += ((s1 << 9) & 0xFFFF0000) | ((s2 >> 7) &0xFFFF); |
312 | continue; | 307 | continue; |
313 | } | 308 | } |
314 | } else /* OK to advance voice */ | 309 | } else /* OK to advance voice */ |
@@ -354,7 +349,12 @@ static inline void synthVoice(struct SynthObject * so, int32_t * out, unsigned i | |||
354 | { | 349 | { |
355 | cp_temp -= so->delta; | 350 | cp_temp -= so->delta; |
356 | s2 = getSample((cp_temp >> FRACTSIZE)+1, wf); | 351 | s2 = getSample((cp_temp >> FRACTSIZE)+1, wf); |
357 | stopVoice(so); | 352 | |
353 | if (!rampdown) /* stop voice */ | ||
354 | { | ||
355 | rampdown = true; | ||
356 | so->decay = 0; | ||
357 | } | ||
358 | } | 358 | } |
359 | 359 | ||
360 | /* Better, working, linear interpolation */ | 360 | /* Better, working, linear interpolation */ |
@@ -364,12 +364,15 @@ static inline void synthVoice(struct SynthObject * so, int32_t * out, unsigned i | |||
364 | 364 | ||
365 | if(UNLIKELY(so->curRate == 0)) | 365 | if(UNLIKELY(so->curRate == 0)) |
366 | { | 366 | { |
367 | stopVoice(so); | 367 | if (!rampdown) /* stop voice */ |
368 | { | ||
369 | rampdown = true; | ||
370 | so->decay = 0; | ||
371 | } | ||
368 | // so->isUsed = false; | 372 | // so->isUsed = false; |
369 | |||
370 | } | 373 | } |
371 | 374 | ||
372 | if(LIKELY(so->ch != 9 && so->state != STATE_RAMPDOWN)) /* Stupid ADSR code... and don't do ADSR for drums */ | 375 | if(LIKELY(!ch_9 && !rampdown)) /* Stupid ADSR code... and don't do ADSR for drums */ |
373 | { | 376 | { |
374 | if(UNLIKELY(so->curOffset < so->targetOffset)) | 377 | if(UNLIKELY(so->curOffset < so->targetOffset)) |
375 | { | 378 | { |
@@ -380,9 +383,10 @@ static inline void synthVoice(struct SynthObject * so, int32_t * out, unsigned i | |||
380 | { | 383 | { |
381 | setPoint(so, so->curPoint+1); | 384 | setPoint(so, so->curPoint+1); |
382 | } | 385 | } |
383 | else | 386 | else if (!rampdown) /* stop voice */ |
384 | { | 387 | { |
385 | stopVoice(so); | 388 | rampdown = true; |
389 | so->decay = 0; | ||
386 | } | 390 | } |
387 | } | 391 | } |
388 | } else | 392 | } else |
@@ -394,9 +398,10 @@ static inline void synthVoice(struct SynthObject * so, int32_t * out, unsigned i | |||
394 | { | 398 | { |
395 | setPoint(so, so->curPoint+1); | 399 | setPoint(so, so->curPoint+1); |
396 | } | 400 | } |
397 | else | 401 | else if (!rampdown) /* stop voice */ |
398 | { | 402 | { |
399 | stopVoice(so); | 403 | rampdown = true; |
404 | so->decay = 0; | ||
400 | } | 405 | } |
401 | 406 | ||
402 | } | 407 | } |
@@ -406,7 +411,11 @@ static inline void synthVoice(struct SynthObject * so, int32_t * out, unsigned i | |||
406 | if(UNLIKELY(so->curOffset < 0)) | 411 | if(UNLIKELY(so->curOffset < 0)) |
407 | { | 412 | { |
408 | so->curOffset = so->targetOffset; | 413 | so->curOffset = so->targetOffset; |
409 | stopVoice(so); | 414 | if (!rampdown) |
415 | { | ||
416 | rampdown = true; | ||
417 | so->decay = 0; | ||
418 | } | ||
410 | } | 419 | } |
411 | 420 | ||
412 | s1 = s1 * (so->curOffset >> 22) >> 8; | 421 | s1 = s1 * (so->curOffset >> 22) >> 8; |
@@ -416,19 +425,22 @@ static inline void synthVoice(struct SynthObject * so, int32_t * out, unsigned i | |||
416 | s1 = s1 * volscale >> 14; | 425 | s1 = s1 * volscale >> 14; |
417 | 426 | ||
418 | /* need to set ramp beginning */ | 427 | /* need to set ramp beginning */ |
419 | if(UNLIKELY(so->state == STATE_RAMPDOWN && so->decay == 0)) | 428 | if(UNLIKELY(rampdown && so->decay == 0)) |
420 | { | 429 | { |
421 | so->decay = s1; | 430 | so->decay = s1; |
422 | if(so->decay == 0) | 431 | if(so->decay == 0) |
423 | so->decay = 1; /* stupid junk.. */ | 432 | so->decay = 1; /* stupid junk.. */ |
424 | } | 433 | } |
425 | 434 | ||
426 | s2 = s1*pan; | 435 | s2 = s1 * pan; |
427 | s1 = (s1<<7) - s2; | 436 | s1 = (s1 << 7) - s2; |
428 | *(out++)+=((s1 << 9) & 0xFFFF0000) | ((s2 >> 7) &0xFFFF); | 437 | *(out++) += ((s1 << 9) & 0xFFFF0000) | ((s2 >> 7) &0xFFFF); |
429 | } | 438 | } |
430 | 439 | ||
431 | so->cp=cp_temp; /* store this again */ | 440 | /* store these again */ |
441 | if (rampdown) | ||
442 | so->state = STATE_RAMPDOWN; | ||
443 | so->cp = cp_temp; | ||
432 | return; | 444 | return; |
433 | } | 445 | } |
434 | 446 | ||