Subversion Repositories eduke32

Rev

Rev 8770 | Go to most recent revision | Show entire file | Ignore 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
484
        {
587
        {
485
                case StartAddrsOffset:           region->offset += amount->shortAmount; break;
588
                for (genOper = 0; genOper != _GEN_MAX; genOper++)
-
 
589
                {
486
                case EndAddrsOffset:             region->end += amount->shortAmount; break;
590
                        int offset = genMetas[genOper].offset;
487
                case StartloopAddrsOffset:       region->loop_start += amount->shortAmount; break;
591
                        switch (genMetas[genOper].mode & _GEN_TYPE_MASK)
-
 
592
                        {
488
                case EndloopAddrsOffset:         region->loop_end += amount->shortAmount; break;
593
                                case GEN_FLOAT:
-
 
594
                                {
489
                case StartAddrsCoarseOffset:     region->offset += amount->shortAmount * 32768; break;
595
                                        float *val = &((float*)region)[offset], vfactor, vmin, vmax;
490
                case ModLfoToPitch:              region->modLfoToPitch = amount->shortAmount; break;
596
                                        *val += ((float*)merge_region)[offset];
491
                case VibLfoToPitch:              region->vibLfoToPitch = amount->shortAmount; break;
597
                                        switch (genMetas[genOper].mode & _GEN_LIMIT_MASK)
492
                case ModEnvToPitch:              region->modEnvToPitch = amount->shortAmount; break;
-
 
493
                case InitialFilterFc:            region->initialFilterFc = amount->shortAmount; break;
-
 
-
 
598
                                        {
494
                case InitialFilterQ:             region->initialFilterQ = amount->shortAmount; break;
599
                                                case GEN_FLOAT_LIMIT12K5K: vfactor =   1.0f; vmin = -12000.0f; vmax = 5000.0f; break;
495
                case ModLfoToFilterFc:           region->modLfoToFilterFc = amount->shortAmount; break;
600
                                                case GEN_FLOAT_LIMIT12K8K: vfactor =   1.0f; vmin = -12000.0f; vmax = 8000.0f; break;
496
                case ModEnvToFilterFc:           region->modEnvToFilterFc = amount->shortAmount; break;
601
                                                case GEN_FLOAT_LIMIT1200:  vfactor =   1.0f; vmin =  -1200.0f; vmax = 1200.0f; break;
497
                case EndAddrsCoarseOffset:       region->end += amount->shortAmount * 32768; break;
602
                                                case GEN_FLOAT_LIMITPAN:   vfactor = 0.001f; vmin =     -0.5f; vmax =    0.5f; break;
498
                case ModLfoToVolume:             region->modLfoToVolume = amount->shortAmount; break;
603
                                                case GEN_FLOAT_LIMITATTN:  vfactor =   0.1f; vmin =      0.0f; vmax =  144.0f; break;
499
                case Pan:                        region->pan = amount->shortAmount / 1000.0f; break;
604
                                                case GEN_FLOAT_MAX1000:    vfactor =   1.0f; vmin =      0.0f; vmax = 1000.0f; break;
500
                case DelayModLFO:                region->delayModLFO = amount->shortAmount; break;
605
                                                case GEN_FLOAT_MAX1440:    vfactor =   1.0f; vmin =      0.0f; vmax = 1440.0f; break;
501
                case FreqModLFO:                 region->freqModLFO = amount->shortAmount; break;
606
                                                default: continue;
-
 
607
                                        }
502
                case DelayVibLFO:                region->delayVibLFO = amount->shortAmount; break;
608
                                        *val *= vfactor;
503
                case FreqVibLFO:                 region->freqVibLFO = amount->shortAmount; break;
609
                                        if      (*val < vmin) *val = vmin;
504
                case DelayModEnv:                region->modenv.delay = amount->shortAmount; break;
610
                                        else if (*val > vmax) *val = vmax;
505
                case AttackModEnv:               region->modenv.attack = amount->shortAmount; break;
611
                                        continue;
-
 
612
                                }
506
                case HoldModEnv:                 region->modenv.hold = amount->shortAmount; break;
613
                                case GEN_INT:
507
                case DecayModEnv:                region->modenv.decay = amount->shortAmount; break;
-
 
-
 
614
                                {
508
                case SustainModEnv:              region->modenv.sustain = amount->shortAmount; break;
615
                                        int *val = &((int*)region)[offset], vmin, vmax;
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;
616
                                        *val += ((int*)merge_region)[offset];
513
                case AttackVolEnv:               region->ampenv.attack = amount->shortAmount; break;
617
                                        switch (genMetas[genOper].mode & _GEN_LIMIT_MASK)
-
 
618
                                        {
514
                case HoldVolEnv:                 region->ampenv.hold = amount->shortAmount; break;
619
                                                case GEN_INT_LIMIT12K:     vmin = -12000; vmax = 12000; break;
515
                case DecayVolEnv:                region->ampenv.decay = amount->shortAmount; break;
620
                                                case GEN_INT_LIMITFC:      vmin =   1500; vmax = 13500; break;
516
                case SustainVolEnv:              region->ampenv.sustain = amount->shortAmount; break;
621
                                                case GEN_INT_LIMITQ:       vmin =      0; vmax =   960; break;
517
                case ReleaseVolEnv:              region->ampenv.release = amount->shortAmount; break;
622
                                                case GEN_INT_LIMIT960:     vmin =   -960; vmax =   960; 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;
623
                                                case GEN_INT_LIMIT16K4500: vmin = -16000; vmax =  4500; break;
523
                case InitialAttenuation:         region->attenuation += amount->shortAmount * 0.1f; break;
624
                                                default: continue;
524
                case EndloopAddrsCoarseOffset:   region->loop_end += amount->shortAmount * 32768; break;
-
 
-
 
625
                                        }
525
                case CoarseTune:                 region->transpose += amount->shortAmount; break;
626
                                        if      (*val < vmin) *val = vmin;
526
                case FineTune:                   region->tune += amount->shortAmount; break;
627
                                        else if (*val > vmax) *val = vmax;
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;
628
                                        continue;
-
 
629
                                }
529
                case ExclusiveClass:             region->group = amount->wordAmount; break;
630
                                case GEN_UINT_ADD:
-
 
631
                                {
530
                case OverridingRootKey:          region->pitch_keycenter = amount->shortAmount; break;
632
                                        ((unsigned int*)region)[offset] += ((unsigned int*)merge_region)[offset];
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
                }