Rev 8770 | Go to most recent revision | Show entire file | Regard whitespace | Details | Blame | Last modification | View Log | RSS feed
Rev 8770 | Rev 8775 | ||
---|---|---|---|
Line 466... | Line 466... | ||
466 | 466 | ||
467 | i->delayModLFO = -12000.0f; |
467 | i->delayModLFO = -12000.0f; |
468 | i->delayVibLFO = -12000.0f; |
468 | i->delayVibLFO = -12000.0f; |
469 | }
|
469 | }
|
470 | 470 | ||
471 | static void tsf_region_operator(struct tsf_region* region, tsf_u16 genOper, union tsf_hydra_genamount* amount) |
471 | static void tsf_region_operator(struct tsf_region* region, tsf_u16 genOper, union tsf_hydra_genamount* amount, struct tsf_region* merge_region) |
472 | {
|
472 | {
|
473 | enum
|
473 | enum
|
474 | {
|
474 | {
|
- | 475 | _GEN_TYPE_MASK = 0x0F, |
|
- | 476 | GEN_FLOAT = 0x01, |
|
- | 477 | GEN_INT = 0x02, |
|
- | 478 | GEN_UINT_ADD = 0x03, |
|
- | 479 | GEN_UINT_ADD15 = 0x04, |
|
- | 480 | GEN_KEYRANGE = 0x05, |
|
- | 481 | GEN_VELRANGE = 0x06, |
|
- | 482 | GEN_LOOPMODE = 0x07, |
|
- | 483 | GEN_GROUP = 0x08, |
|
- | 484 | GEN_KEYCENTER = 0x09, |
|
- | 485 | ||
- | 486 | _GEN_LIMIT_MASK = 0xF0, |
|
- | 487 | GEN_INT_LIMIT12K = 0x10, //min -12000, max 12000 |
|
- | 488 | GEN_INT_LIMITFC = 0x20, //min 1500, max 13500 |
|
- | 489 | GEN_INT_LIMITQ = 0x30, //min 0, max 960 |
|
- | 490 | GEN_INT_LIMIT960 = 0x40, //min -960, max 960 |
|
- | 491 | GEN_INT_LIMIT16K4500 = 0x50, //min -16000, max 4500 |
|
- | 492 | GEN_FLOAT_LIMIT12K5K = 0x60, //min -12000, max 5000 |
|
- | 493 | GEN_FLOAT_LIMIT12K8K = 0x70, //min -12000, max 8000 |
|
- | 494 | GEN_FLOAT_LIMIT1200 = 0x80, //min -1200, max 1200 |
|
- | 495 | GEN_FLOAT_LIMITPAN = 0x90, //* .001f, min -.5f, max .5f, |
|
- | 496 | GEN_FLOAT_LIMITATTN = 0xA0, //* .1f, min 0, max 144.0 |
|
- | 497 | GEN_FLOAT_MAX1000 = 0xB0, //min 0, max 1000 |
|
- | 498 | GEN_FLOAT_MAX1440 = 0xC0, //min 0, max 1440 |
|
- | 499 | ||
- | 500 | _GEN_MAX = 59, |
|
- | 501 | }; |
|
- | 502 | #define _TSFREGIONOFFSET(TYPE, FIELD) (unsigned char)(((TYPE*)&((struct tsf_region*)0)->FIELD) - (TYPE*)0)
|
|
- | 503 | #define _TSFREGIONENVOFFSET(TYPE, ENV, FIELD) (unsigned char)(((TYPE*)&((&(((struct tsf_region*)0)->ENV))->FIELD)) - (TYPE*)0)
|
|
- | 504 | static const struct { unsigned char mode, offset; } genMetas[_GEN_MAX] = |
|
- | 505 | {
|
|
- | 506 | { GEN_UINT_ADD , _TSFREGIONOFFSET(unsigned int, offset ) }, // 0 StartAddrsOffset |
|
- | 507 | { GEN_UINT_ADD , _TSFREGIONOFFSET(unsigned int, end ) }, // 1 EndAddrsOffset |
|
- | 508 | { GEN_UINT_ADD , _TSFREGIONOFFSET(unsigned int, loop_start ) }, // 2 StartloopAddrsOffset |
|
- | 509 | { GEN_UINT_ADD , _TSFREGIONOFFSET(unsigned int, loop_end ) }, // 3 EndloopAddrsOffset |
|
- | 510 | { GEN_UINT_ADD15 , _TSFREGIONOFFSET(unsigned int, offset ) }, // 4 StartAddrsCoarseOffset |
|
- | 511 | { GEN_INT | GEN_INT_LIMIT12K , _TSFREGIONOFFSET( int, modLfoToPitch ) }, // 5 ModLfoToPitch |
|
- | 512 | { GEN_INT | GEN_INT_LIMIT12K , _TSFREGIONOFFSET( int, vibLfoToPitch ) }, // 6 VibLfoToPitch |
|
475 | StartAddrsOffset, EndAddrsOffset, StartloopAddrsOffset, EndloopAddrsOffset, StartAddrsCoarseOffset, ModLfoToPitch, VibLfoToPitch, ModEnvToPitch, |
513 | { GEN_INT | GEN_INT_LIMIT12K , _TSFREGIONOFFSET( int, modEnvToPitch ) }, // 7 ModEnvToPitch |
- | 514 | { GEN_INT | GEN_INT_LIMITFC , _TSFREGIONOFFSET( int, initialFilterFc ) }, // 8 InitialFilterFc |
|
- | 515 | { GEN_INT | GEN_INT_LIMITQ , _TSFREGIONOFFSET( int, initialFilterQ ) }, // 9 InitialFilterQ |
|
- | 516 | { GEN_INT | GEN_INT_LIMIT12K , _TSFREGIONOFFSET( int, modLfoToFilterFc ) }, //10 ModLfoToFilterFc |
|
- | 517 | { GEN_INT | GEN_INT_LIMIT12K , _TSFREGIONOFFSET( int, modEnvToFilterFc ) }, //11 ModEnvToFilterFc |
|
- | 518 | { GEN_UINT_ADD15 , _TSFREGIONOFFSET(unsigned int, end ) }, //12 EndAddrsCoarseOffset |
|
476 | InitialFilterFc, InitialFilterQ, ModLfoToFilterFc, ModEnvToFilterFc, EndAddrsCoarseOffset, ModLfoToVolume, Unused1, ChorusEffectsSend, |
519 | { GEN_INT | GEN_INT_LIMIT960 , _TSFREGIONOFFSET( int, modLfoToVolume ) }, //13 ModLfoToVolume |
- | 520 | { 0 , (0 ) }, // Unused |
|
- | 521 | { 0 , (0 ) }, //15 ChorusEffectsSend (unsupported) |
|
- | 522 | { 0 , (0 ) }, //16 ReverbEffectsSend (unsupported) |
|
- | 523 | { GEN_FLOAT | GEN_FLOAT_LIMITPAN , _TSFREGIONOFFSET( float, pan ) }, //17 Pan |
|
- | 524 | { 0 , (0 ) }, // Unused |
|
- | 525 | { 0 , (0 ) }, // Unused |
|
- | 526 | { 0 , (0 ) }, // Unused |
|
- | 527 | { GEN_FLOAT | GEN_FLOAT_LIMIT12K5K , _TSFREGIONOFFSET( float, delayModLFO ) }, //21 DelayModLFO |
|
- | 528 | { GEN_INT | GEN_INT_LIMIT16K4500 , _TSFREGIONOFFSET( int, freqModLFO ) }, //22 FreqModLFO |
|
- | 529 | { GEN_FLOAT | GEN_FLOAT_LIMIT12K5K , _TSFREGIONOFFSET( float, delayVibLFO ) }, //23 DelayVibLFO |
|
- | 530 | { GEN_INT | GEN_INT_LIMIT16K4500 , _TSFREGIONOFFSET( int, freqVibLFO ) }, //24 FreqVibLFO |
|
- | 531 | { GEN_FLOAT | GEN_FLOAT_LIMIT12K5K , _TSFREGIONENVOFFSET( float, modenv, delay ) }, //25 DelayModEnv |
|
- | 532 | { GEN_FLOAT | GEN_FLOAT_LIMIT12K8K , _TSFREGIONENVOFFSET( float, modenv, attack ) }, //26 AttackModEnv |
|
477 | ReverbEffectsSend, Pan, Unused2, Unused3, Unused4, DelayModLFO, FreqModLFO, DelayVibLFO, FreqVibLFO, DelayModEnv, AttackModEnv, HoldModEnv, |
533 | { GEN_FLOAT | GEN_FLOAT_LIMIT12K5K , _TSFREGIONENVOFFSET( float, modenv, hold ) }, //27 HoldModEnv |
- | 534 | { GEN_FLOAT | GEN_FLOAT_LIMIT12K8K , _TSFREGIONENVOFFSET( float, modenv, decay ) }, //28 DecayModEnv |
|
- | 535 | { GEN_FLOAT | GEN_FLOAT_MAX1000 , _TSFREGIONENVOFFSET( float, modenv, sustain ) }, //29 SustainModEnv |
|
- | 536 | { GEN_FLOAT | GEN_FLOAT_LIMIT12K8K , _TSFREGIONENVOFFSET( float, modenv, release ) }, //30 ReleaseModEnv |
|
- | 537 | { GEN_FLOAT | GEN_FLOAT_LIMIT1200 , _TSFREGIONENVOFFSET( float, modenv, keynumToHold ) }, //31 KeynumToModEnvHold |
|
- | 538 | { GEN_FLOAT | GEN_FLOAT_LIMIT1200 , _TSFREGIONENVOFFSET( float, modenv, keynumToDecay) }, //32 KeynumToModEnvDecay |
|
- | 539 | { GEN_FLOAT | GEN_FLOAT_LIMIT12K5K , _TSFREGIONENVOFFSET( float, ampenv, delay ) }, //33 DelayVolEnv |
|
- | 540 | { GEN_FLOAT | GEN_FLOAT_LIMIT12K8K , _TSFREGIONENVOFFSET( float, ampenv, attack ) }, //34 AttackVolEnv |
|
- | 541 | { GEN_FLOAT | GEN_FLOAT_LIMIT12K5K , _TSFREGIONENVOFFSET( float, ampenv, hold ) }, //35 HoldVolEnv |
|
478 | DecayModEnv, SustainModEnv, ReleaseModEnv, KeynumToModEnvHold, KeynumToModEnvDecay, DelayVolEnv, AttackVolEnv, HoldVolEnv, DecayVolEnv, |
542 | { GEN_FLOAT | GEN_FLOAT_LIMIT12K8K , _TSFREGIONENVOFFSET( float, ampenv, decay ) }, //36 DecayVolEnv |
- | 543 | { GEN_FLOAT | GEN_FLOAT_MAX1440 , _TSFREGIONENVOFFSET( float, ampenv, sustain ) }, //37 SustainVolEnv |
|
- | 544 | { GEN_FLOAT | GEN_FLOAT_LIMIT12K8K , _TSFREGIONENVOFFSET( float, ampenv, release ) }, //38 ReleaseVolEnv |
|
- | 545 | { GEN_FLOAT | GEN_FLOAT_LIMIT1200 , _TSFREGIONENVOFFSET( float, ampenv, keynumToHold ) }, //39 KeynumToVolEnvHold |
|
- | 546 | { GEN_FLOAT | GEN_FLOAT_LIMIT1200 , _TSFREGIONENVOFFSET( float, ampenv, keynumToDecay) }, //40 KeynumToVolEnvDecay |
|
- | 547 | { 0 , (0 ) }, // Instrument (special) |
|
- | 548 | { 0 , (0 ) }, // Reserved |
|
- | 549 | { GEN_KEYRANGE , (0 ) }, //43 KeyRange |
|
- | 550 | { GEN_VELRANGE , (0 ) }, //44 VelRange |
|
479 | SustainVolEnv, ReleaseVolEnv, KeynumToVolEnvHold, KeynumToVolEnvDecay, Instrument, Reserved1, KeyRange, VelRange, StartloopAddrsCoarseOffset, |
551 | { GEN_UINT_ADD15 , _TSFREGIONOFFSET(unsigned int, loop_start ) }, //45 StartloopAddrsCoarseOffset |
- | 552 | { 0 , (0 ) }, //46 Keynum (special) |
|
- | 553 | { 0 , (0 ) }, //47 Velocity (special) |
|
- | 554 | { GEN_FLOAT | GEN_FLOAT_LIMITATTN , _TSFREGIONOFFSET( float, attenuation ) }, //48 InitialAttenuation |
|
- | 555 | { 0 , (0 ) }, // Reserved |
|
- | 556 | { GEN_UINT_ADD15 , _TSFREGIONOFFSET(unsigned int, loop_end ) }, //50 EndloopAddrsCoarseOffset |
|
- | 557 | { GEN_INT , _TSFREGIONOFFSET( int, transpose ) }, //51 CoarseTune |
|
- | 558 | { GEN_INT , _TSFREGIONOFFSET( int, tune ) }, //52 FineTune |
|
- | 559 | { 0 , (0 ) }, // SampleID (special) |
|
- | 560 | { GEN_LOOPMODE , _TSFREGIONOFFSET( int, loop_mode ) }, //54 SampleModes |
|
- | 561 | { 0 , (0 ) }, // Reserved |
|
480 | Keynum, Velocity, InitialAttenuation, Reserved2, EndloopAddrsCoarseOffset, CoarseTune, FineTune, SampleID, SampleModes, Reserved3, ScaleTuning, |
562 | { GEN_INT , _TSFREGIONOFFSET( int, pitch_keytrack ) }, //56 ScaleTuning |
481 | ExclusiveClass, OverridingRootKey, Unused5, EndOper |
563 | { GEN_GROUP , _TSFREGIONOFFSET(unsigned int, group ) }, //57 ExclusiveClass |
- | 564 | { GEN_KEYCENTER , _TSFREGIONOFFSET( int, pitch_keycenter ) }, //58 OverridingRootKey |
|
482 | }; |
565 | }; |
- | 566 | #undef _TSFREGIONOFFSET
|
|
- | 567 | #undef _TSFREGIONENVOFFSET
|
|
483 | switch (genOper) |
568 | if (amount) |
- | 569 | {
|
|
- | 570 | int offset; |
|
- | 571 | if (genOper >= _GEN_MAX) return; |
|
- | 572 | offset = genMetas[genOper].offset; |
|
- | 573 | switch (genMetas[genOper].mode & _GEN_TYPE_MASK) |
|
- | 574 | {
|
|
- | 575 | case GEN_FLOAT: (( float*)region)[offset] = amount->shortAmount; return; |
|
- | 576 | case GEN_INT: (( int*)region)[offset] = amount->shortAmount; return; |
|
- | 577 | case GEN_UINT_ADD: ((unsigned int*)region)[offset] += amount->shortAmount; return; |
|
- | 578 | case GEN_UINT_ADD15: ((unsigned int*)region)[offset] += amount->shortAmount<<15; return; |
|
- | 579 | case GEN_KEYRANGE: region->lokey = amount->range.lo; region->hikey = amount->range.hi; return; |
|
- | 580 | case GEN_VELRANGE: region->lovel = amount->range.lo; region->hivel = amount->range.hi; return; |
|
- | 581 | case GEN_LOOPMODE: region->loop_mode = ((amount->wordAmount&3) == 3 ? TSF_LOOPMODE_SUSTAIN : ((amount->wordAmount&3) == 1 ? TSF_LOOPMODE_CONTINUOUS : TSF_LOOPMODE_NONE)); return; |
|
- | 582 | case GEN_GROUP: region->group = amount->wordAmount; return; |
|
- | 583 | case GEN_KEYCENTER: region->pitch_keycenter = amount->shortAmount; return; |
|
- | 584 | }
|
|
- | 585 | }
|
|
- | 586 | else //merge regions and clamp values |
|
- | 587 | {
|
|
- | 588 | for (genOper = 0; genOper != _GEN_MAX; genOper++) |
|
- | 589 | {
|
|
- | 590 | int offset = genMetas[genOper].offset; |
|
- | 591 | switch (genMetas[genOper].mode & _GEN_TYPE_MASK) |
|
- | 592 | {
|
|
- | 593 | case GEN_FLOAT: |
|
- | 594 | {
|
|
- | 595 | float *val = &((float*)region)[offset], vfactor, vmin, vmax; |
|
- | 596 | *val += ((float*)merge_region)[offset]; |
|
- | 597 | switch (genMetas[genOper].mode & _GEN_LIMIT_MASK) |
|
- | 598 | {
|
|
- | 599 | case GEN_FLOAT_LIMIT12K5K: vfactor = 1.0f; vmin = -12000.0f; vmax = 5000.0f; break; |
|
- | 600 | case GEN_FLOAT_LIMIT12K8K: vfactor = 1.0f; vmin = -12000.0f; vmax = 8000.0f; break; |
|
- | 601 | case GEN_FLOAT_LIMIT1200: vfactor = 1.0f; vmin = -1200.0f; vmax = 1200.0f; break; |
|
- | 602 | case GEN_FLOAT_LIMITPAN: vfactor = 0.001f; vmin = -0.5f; vmax = 0.5f; break; |
|
- | 603 | case GEN_FLOAT_LIMITATTN: vfactor = 0.1f; vmin = 0.0f; vmax = 144.0f; break; |
|
- | 604 | case GEN_FLOAT_MAX1000: vfactor = 1.0f; vmin = 0.0f; vmax = 1000.0f; break; |
|
- | 605 | case GEN_FLOAT_MAX1440: vfactor = 1.0f; vmin = 0.0f; vmax = 1440.0f; break; |
|
- | 606 | default: continue; |
|
- | 607 | }
|
|
- | 608 | *val *= vfactor; |
|
- | 609 | if (*val < vmin) *val = vmin; |
|
- | 610 | else if (*val > vmax) *val = vmax; |
|
- | 611 | continue; |
|
- | 612 | }
|
|
- | 613 | case GEN_INT: |
|
- | 614 | {
|
|
- | 615 | int *val = &((int*)region)[offset], vmin, vmax; |
|
- | 616 | *val += ((int*)merge_region)[offset]; |
|
- | 617 | switch (genMetas[genOper].mode & _GEN_LIMIT_MASK) |
|
- | 618 | {
|
|
- | 619 | case GEN_INT_LIMIT12K: vmin = -12000; vmax = 12000; break; |
|
- | 620 | case GEN_INT_LIMITFC: vmin = 1500; vmax = 13500; break; |
|
- | 621 | case GEN_INT_LIMITQ: vmin = 0; vmax = 960; break; |
|
- | 622 | case GEN_INT_LIMIT960: vmin = -960; vmax = 960; break; |
|
- | 623 | case GEN_INT_LIMIT16K4500: vmin = -16000; vmax = 4500; break; |
|
- | 624 | default: continue; |
|
- | 625 | }
|
|
- | 626 | if (*val < vmin) *val = vmin; |
|
- | 627 | else if (*val > vmax) *val = vmax; |
|
- | 628 | continue; |
|
- | 629 | }
|
|
- | 630 | case GEN_UINT_ADD: |
|
484 | {
|
631 | {
|
485 | case StartAddrsOffset: region->offset += amount->shortAmount; break; |
- | |
486 | case EndAddrsOffset: region->end += amount->shortAmount; break; |
- | |
487 | case StartloopAddrsOffset: region->loop_start += amount->shortAmount; break; |
- | |
488 | case EndloopAddrsOffset: region->loop_end += amount->shortAmount; break; |
- | |
489 | case StartAddrsCoarseOffset: region->offset += amount->shortAmount * 32768; break; |
632 | ((unsigned int*)region)[offset] += ((unsigned int*)merge_region)[offset]; |
490 | case ModLfoToPitch: region->modLfoToPitch = amount->shortAmount; break; |
- | |
491 | case VibLfoToPitch: region->vibLfoToPitch = amount->shortAmount; break; |
- | |
492 | case ModEnvToPitch: region->modEnvToPitch = amount->shortAmount; break; |
- | |
493 | case InitialFilterFc: region->initialFilterFc = amount->shortAmount; break; |
- | |
494 | case InitialFilterQ: region->initialFilterQ = amount->shortAmount; break; |
- | |
495 | case ModLfoToFilterFc: region->modLfoToFilterFc = amount->shortAmount; break; |
- | |
496 | case ModEnvToFilterFc: region->modEnvToFilterFc = amount->shortAmount; break; |
- | |
497 | case EndAddrsCoarseOffset: region->end += amount->shortAmount * 32768; break; |
- | |
498 | case ModLfoToVolume: region->modLfoToVolume = amount->shortAmount; break; |
- | |
499 | case Pan: region->pan = amount->shortAmount / 1000.0f; break; |
- | |
500 | case DelayModLFO: region->delayModLFO = amount->shortAmount; break; |
- | |
501 | case FreqModLFO: region->freqModLFO = amount->shortAmount; break; |
- | |
502 | case DelayVibLFO: region->delayVibLFO = amount->shortAmount; break; |
- | |
503 | case FreqVibLFO: region->freqVibLFO = amount->shortAmount; break; |
- | |
504 | case DelayModEnv: region->modenv.delay = amount->shortAmount; break; |
- | |
505 | case AttackModEnv: region->modenv.attack = amount->shortAmount; break; |
- | |
506 | case HoldModEnv: region->modenv.hold = amount->shortAmount; break; |
- | |
507 | case DecayModEnv: region->modenv.decay = amount->shortAmount; break; |
- | |
508 | case SustainModEnv: region->modenv.sustain = amount->shortAmount; break; |
- | |
509 | case ReleaseModEnv: region->modenv.release = amount->shortAmount; break; |
- | |
510 | case KeynumToModEnvHold: region->modenv.keynumToHold = amount->shortAmount; break; |
- | |
511 | case KeynumToModEnvDecay: region->modenv.keynumToDecay = amount->shortAmount; break; |
- | |
512 | case DelayVolEnv: region->ampenv.delay = amount->shortAmount; break; |
- | |
513 | case AttackVolEnv: region->ampenv.attack = amount->shortAmount; break; |
- | |
514 | case HoldVolEnv: region->ampenv.hold = amount->shortAmount; break; |
- | |
515 | case DecayVolEnv: region->ampenv.decay = amount->shortAmount; break; |
- | |
516 | case SustainVolEnv: region->ampenv.sustain = amount->shortAmount; break; |
- | |
517 | case ReleaseVolEnv: region->ampenv.release = amount->shortAmount; break; |
- | |
518 | case KeynumToVolEnvHold: region->ampenv.keynumToHold = amount->shortAmount; break; |
- | |
519 | case KeynumToVolEnvDecay: region->ampenv.keynumToDecay = amount->shortAmount; break; |
- | |
520 | case KeyRange: region->lokey = amount->range.lo; region->hikey = amount->range.hi; break; |
- | |
521 | case VelRange: region->lovel = amount->range.lo; region->hivel = amount->range.hi; break; |
- | |
522 | case StartloopAddrsCoarseOffset: region->loop_start += amount->shortAmount * 32768; break; |
- | |
523 | case InitialAttenuation: region->attenuation += amount->shortAmount * 0.1f; break; |
- | |
524 | case EndloopAddrsCoarseOffset: region->loop_end += amount->shortAmount * 32768; break; |
- | |
525 | case CoarseTune: region->transpose += amount->shortAmount; break; |
- | |
526 | case FineTune: region->tune += amount->shortAmount; break; |
- | |
527 | case SampleModes: region->loop_mode = ((amount->wordAmount&3) == 3 ? TSF_LOOPMODE_SUSTAIN : ((amount->wordAmount&3) == 1 ? TSF_LOOPMODE_CONTINUOUS : TSF_LOOPMODE_NONE)); break; |
- | |
528 | case ScaleTuning: region->pitch_keytrack = amount->shortAmount; break; |
- | |
529 | case ExclusiveClass: region->group = amount->wordAmount; break; |
- | |
530 | case OverridingRootKey: region->pitch_keycenter = amount->shortAmount; break; |
- | |
531 | //case gen_endOper: break; // Ignore.
|
633 | continue; |
532 | //default: addUnsupportedOpcode(generator_name);
|
- | |
- | 634 | }
|
|
- | 635 | }
|
|
- | 636 | }
|
|
533 | }
|
637 | }
|
534 | }
|
638 | }
|
535 | 639 | ||
536 | static void tsf_region_envtosecs(struct tsf_envelope* p, TSF_BOOL sustainIsGain) |
640 | static void tsf_region_envtosecs(struct tsf_envelope* p, TSF_BOOL sustainIsGain) |
537 | {
|
641 | {
|
Line 548... | Line 652... | ||
548 | if (!p->keynumToDecay) p->decay = (p->decay < -11950.0f ? 0.0f : tsf_timecents2Secsf(p->decay)); |
652 | if (!p->keynumToDecay) p->decay = (p->decay < -11950.0f ? 0.0f : tsf_timecents2Secsf(p->decay)); |
549 | 653 | ||
550 | if (p->sustain < 0.0f) p->sustain = 0.0f; |
654 | if (p->sustain < 0.0f) p->sustain = 0.0f; |
551 | else if (sustainIsGain) p->sustain = tsf_decibelsToGain(-p->sustain / 10.0f); |
655 | else if (sustainIsGain) p->sustain = tsf_decibelsToGain(-p->sustain / 10.0f); |
552 | else p->sustain = 1.0f - (p->sustain / 1000.0f); |
656 | else p->sustain = 1.0f - (p->sustain / 1000.0f); |
553 | - | ||
554 | p->sustain = clamp(p->sustain, 0, 1.f); |
- | |
555 | }
|
657 | }
|
556 | 658 | ||
557 | static void tsf_load_presets(tsf* res, struct tsf_hydra *hydra, unsigned int fontSampleCount) |
659 | static void tsf_load_presets(tsf* res, struct tsf_hydra *hydra, unsigned int fontSampleCount) |
558 | {
|
660 | {
|
559 | enum { GenInstrument = 41, GenKeyRange = 43, GenVelRange = 44, GenSampleID = 53 }; |
661 | enum { GenInstrument = 41, GenKeyRange = 43, GenVelRange = 44, GenSampleID = 53 }; |
Line 647... | Line 749... | ||
647 | if (presetRegion.hikey < zoneRegion.hikey) zoneRegion.hikey = presetRegion.hikey; |
749 | if (presetRegion.hikey < zoneRegion.hikey) zoneRegion.hikey = presetRegion.hikey; |
648 | if (presetRegion.lovel > zoneRegion.lovel) zoneRegion.lovel = presetRegion.lovel; |
750 | if (presetRegion.lovel > zoneRegion.lovel) zoneRegion.lovel = presetRegion.lovel; |
649 | if (presetRegion.hivel < zoneRegion.hivel) zoneRegion.hivel = presetRegion.hivel; |
751 | if (presetRegion.hivel < zoneRegion.hivel) zoneRegion.hivel = presetRegion.hivel; |
650 | 752 | ||
651 | //sum regions
|
753 | //sum regions
|
652 | zoneRegion.offset += presetRegion.offset; |
- | |
653 | zoneRegion.end += presetRegion.end; |
- | |
654 | zoneRegion.loop_start += presetRegion.loop_start; |
- | |
655 | zoneRegion.loop_end += presetRegion.loop_end; |
- | |
656 | zoneRegion.transpose += presetRegion.transpose; |
- | |
657 | zoneRegion.tune += presetRegion.tune; |
- | |
658 | zoneRegion.pitch_keytrack += presetRegion.pitch_keytrack; |
- | |
659 | zoneRegion.attenuation += presetRegion.attenuation; |
754 | tsf_region_operator(&zoneRegion, 0, TSF_NULL, &presetRegion); |
660 | zoneRegion.pan += presetRegion.pan; |
- | |
661 | zoneRegion.ampenv.delay += presetRegion.ampenv.delay; |
- | |
662 | zoneRegion.ampenv.attack += presetRegion.ampenv.attack; |
- | |
663 | zoneRegion.ampenv.hold += presetRegion.ampenv.hold; |
- | |
664 | zoneRegion.ampenv.decay += presetRegion.ampenv.decay; |
- | |
665 | zoneRegion.ampenv.sustain += presetRegion.ampenv.sustain; |
- | |
666 | zoneRegion.ampenv.release += presetRegion.ampenv.release; |
- | |
667 | zoneRegion.modenv.delay += presetRegion.modenv.delay; |
- | |
668 | zoneRegion.modenv.attack += presetRegion.modenv.attack; |
- | |
669 | zoneRegion.modenv.hold += presetRegion.modenv.hold; |
- | |
670 | zoneRegion.modenv.decay += presetRegion.modenv.decay; |
- | |
671 | zoneRegion.modenv.sustain += presetRegion.modenv.sustain; |
- | |
672 | zoneRegion.modenv.release += presetRegion.modenv.release; |
- | |
673 | zoneRegion.initialFilterQ += presetRegion.initialFilterQ; |
- | |
674 | zoneRegion.initialFilterFc += presetRegion.initialFilterFc; |
- | |
675 | zoneRegion.modEnvToPitch += presetRegion.modEnvToPitch; |
- | |
676 | zoneRegion.modEnvToFilterFc += presetRegion.modEnvToFilterFc; |
- | |
677 | zoneRegion.delayModLFO += presetRegion.delayModLFO; |
- | |
678 | zoneRegion.freqModLFO += presetRegion.freqModLFO; |
- | |
679 | zoneRegion.modLfoToPitch += presetRegion.modLfoToPitch; |
- | |
680 | zoneRegion.modLfoToFilterFc += presetRegion.modLfoToFilterFc; |
- | |
681 | zoneRegion.modLfoToVolume += presetRegion.modLfoToVolume; |
- | |
682 | zoneRegion.delayVibLFO += presetRegion.delayVibLFO; |
- | |
683 | zoneRegion.freqVibLFO += presetRegion.freqVibLFO; |
- | |
684 | zoneRegion.vibLfoToPitch += presetRegion.vibLfoToPitch; |
- | |
685 | 755 | ||
686 | // EG times need to be converted from timecents to seconds.
|
756 | // EG times need to be converted from timecents to seconds.
|
687 | tsf_region_envtosecs(&zoneRegion.ampenv, TSF_TRUE); |
757 | tsf_region_envtosecs(&zoneRegion.ampenv, TSF_TRUE); |
688 | tsf_region_envtosecs(&zoneRegion.modenv, TSF_FALSE); |
758 | tsf_region_envtosecs(&zoneRegion.modenv, TSF_FALSE); |
689 | 759 | ||
690 | // LFO times need to be converted from timecents to seconds.
|
760 | // LFO times need to be converted from timecents to seconds.
|
691 | zoneRegion.delayModLFO = (zoneRegion.delayModLFO < -11950.0f ? 0.0f : tsf_timecents2Secsf(zoneRegion.delayModLFO)); |
761 | zoneRegion.delayModLFO = (zoneRegion.delayModLFO < -11950.0f ? 0.0f : tsf_timecents2Secsf(zoneRegion.delayModLFO)); |
692 | zoneRegion.delayVibLFO = (zoneRegion.delayVibLFO < -11950.0f ? 0.0f : tsf_timecents2Secsf(zoneRegion.delayVibLFO)); |
762 | zoneRegion.delayVibLFO = (zoneRegion.delayVibLFO < -11950.0f ? 0.0f : tsf_timecents2Secsf(zoneRegion.delayVibLFO)); |
693 | 763 | ||
694 | // Pin values to their ranges.
|
764 | // Fixup sample positions
|
695 | if (zoneRegion.pan < -0.5f) zoneRegion.pan = -0.5f; |
- | |
696 | else if (zoneRegion.pan > 0.5f) zoneRegion.pan = 0.5f; |
- | |
697 | if (zoneRegion.initialFilterQ < 1500 || zoneRegion.initialFilterQ > 13500) zoneRegion.initialFilterQ = 0; |
- | |
698 | - | ||
699 | pshdr = &hydra->shdrs[pigen->genAmount.wordAmount]; |
765 | pshdr = &hydra->shdrs[pigen->genAmount.wordAmount]; |
700 | zoneRegion.offset += pshdr->start; |
766 | zoneRegion.offset += pshdr->start; |
701 | zoneRegion.end += pshdr->end; |
767 | zoneRegion.end += pshdr->end; |
702 | zoneRegion.loop_start += pshdr->startLoop; |
768 | zoneRegion.loop_start += pshdr->startLoop; |
703 | zoneRegion.loop_end += pshdr->endLoop; |
769 | zoneRegion.loop_end += pshdr->endLoop; |
Line 710... | Line 776... | ||
710 | 776 | ||
711 | preset->regions[region_index] = zoneRegion; |
777 | preset->regions[region_index] = zoneRegion; |
712 | region_index++; |
778 | region_index++; |
713 | hadSampleID = 1; |
779 | hadSampleID = 1; |
714 | }
|
780 | }
|
715 | else tsf_region_operator(&zoneRegion, pigen->genOper, &pigen->genAmount); |
781 | else tsf_region_operator(&zoneRegion, pigen->genOper, &pigen->genAmount, TSF_NULL); |
716 | }
|
782 | }
|
717 | 783 | ||
718 | // Handle instrument's global zone.
|
784 | // Handle instrument's global zone.
|
719 | if (pibag == hydra->ibags + pinst->instBagNdx && !hadSampleID) |
785 | if (pibag == hydra->ibags + pinst->instBagNdx && !hadSampleID) |
720 | instRegion = zoneRegion; |
786 | instRegion = zoneRegion; |
Line 722... | Line 788... | ||
722 | // Modulators (TODO)
|
788 | // Modulators (TODO)
|
723 | //if (ibag->instModNdx < ibag[1].instModNdx) addUnsupportedOpcode("any modulator");
|
789 | //if (ibag->instModNdx < ibag[1].instModNdx) addUnsupportedOpcode("any modulator");
|
724 | }
|
790 | }
|
725 | hadGenInstrument = 1; |
791 | hadGenInstrument = 1; |
726 | }
|
792 | }
|
727 | else tsf_region_operator(&presetRegion, ppgen->genOper, &ppgen->genAmount); |
793 | else tsf_region_operator(&presetRegion, ppgen->genOper, &ppgen->genAmount, TSF_NULL); |
728 | }
|
794 | }
|
729 | 795 | ||
730 | // Modulators (TODO)
|
796 | // Modulators (TODO)
|
731 | //if (pbag->modNdx < pbag[1].modNdx) addUnsupportedOpcode("any modulator");
|
797 | //if (pbag->modNdx < pbag[1].modNdx) addUnsupportedOpcode("any modulator");
|
732 | 798 | ||
Line 995... | Line 1061... | ||
995 | numSamples -= blockSamples; |
1061 | numSamples -= blockSamples; |
996 | 1062 | ||
997 | if (dynamicLowpass) |
1063 | if (dynamicLowpass) |
998 | {
|
1064 | {
|
999 | float fres = tmpInitialFilterFc + v->modlfo.level * tmpModLfoToFilterFc + v->modenv.level * tmpModEnvToFilterFc; |
1065 | float fres = tmpInitialFilterFc + v->modlfo.level * tmpModLfoToFilterFc + v->modenv.level * tmpModEnvToFilterFc; |
1000 | float lowpassFc = (fres <= 13500 ? tsf_cents2Hertz(fres) / f->outSampleRate : 1.0f); |
1066 | float lowpassFc = (fres <= 13500 ? tsf_cents2Hertz(fres) / tmpSampleRate : 1.0f); |
1001 | tmpLowpass.active = (lowpassFc < 0.499f); |
1067 | tmpLowpass.active = (lowpassFc < 0.499f); |
1002 | if (tmpLowpass.active) tsf_voice_lowpass_setup(&tmpLowpass, lowpassFc); |
1068 | if (tmpLowpass.active) tsf_voice_lowpass_setup(&tmpLowpass, lowpassFc); |
1003 | }
|
1069 | }
|
1004 | 1070 | ||
1005 | if (dynamicPitchRatio) |
1071 | if (dynamicPitchRatio) |
Line 1009... | Line 1075... | ||
1009 | noteGain = tsf_decibelsToGain(v->noteGainDB + (v->modlfo.level * tmpModLfoToVolume)); |
1075 | noteGain = tsf_decibelsToGain(v->noteGainDB + (v->modlfo.level * tmpModLfoToVolume)); |
1010 | 1076 | ||
1011 | gainMono = noteGain * v->ampenv.level; |
1077 | gainMono = noteGain * v->ampenv.level; |
1012 | 1078 | ||
1013 | // Update EG.
|
1079 | // Update EG.
|
1014 | tsf_voice_envelope_process(&v->ampenv, blockSamples, f->outSampleRate); |
1080 | tsf_voice_envelope_process(&v->ampenv, blockSamples, tmpSampleRate); |
1015 | if (updateModEnv) tsf_voice_envelope_process(&v->modenv, blockSamples, f->outSampleRate); |
1081 | if (updateModEnv) tsf_voice_envelope_process(&v->modenv, blockSamples, tmpSampleRate); |
1016 | 1082 | ||
1017 | // Update LFOs.
|
1083 | // Update LFOs.
|
1018 | if (updateModLFO) tsf_voice_lfo_process(&v->modlfo, blockSamples); |
1084 | if (updateModLFO) tsf_voice_lfo_process(&v->modlfo, blockSamples); |
1019 | if (updateVibLFO) tsf_voice_lfo_process(&v->viblfo, blockSamples); |
1085 | if (updateVibLFO) tsf_voice_lfo_process(&v->viblfo, blockSamples); |
1020 | 1086 | ||
Line 1266... | Line 1332... | ||
1266 | 1332 | ||
1267 | voice->region = region; |
1333 | voice->region = region; |
1268 | voice->playingPreset = preset_index; |
1334 | voice->playingPreset = preset_index; |
1269 | voice->playingKey = key; |
1335 | voice->playingKey = key; |
1270 | voice->playIndex = voicePlayIndex; |
1336 | voice->playIndex = voicePlayIndex; |
1271 | voice->noteGainDB = f->globalGainDB - clamp(region->attenuation, 0.f, 144.f) - tsf_gainToDecibels(1.0f / vel); |
1337 | voice->noteGainDB = f->globalGainDB - region->attenuation - tsf_gainToDecibels(1.0f / vel); |
1272 | 1338 | ||
1273 | if (f->channels) |
1339 | if (f->channels) |
1274 | {
|
1340 | {
|
1275 | f->channels->setupVoice(f, voice); |
1341 | f->channels->setupVoice(f, voice); |
1276 | }
|
1342 | }
|