private void LoadGen(Sf2Region region, AssetManager assets)
        {
            SampleDataAsset sda = assets.SampleAssetList[region.Generators[(int)GeneratorEnum.SampleID]];
            SampleGenerator gen = new SampleGenerator();

            gen.EndPhase     = sda.End + region.Generators[(int)GeneratorEnum.EndAddressOffset] + 32768 * region.Generators[(int)GeneratorEnum.EndAddressCoarseOffset];
            gen.Frequency    = sda.SampleRate;
            gen.KeyTrack     = region.Generators[(int)GeneratorEnum.ScaleTuning];
            gen.LoopEndPhase = sda.LoopEnd + region.Generators[(int)GeneratorEnum.EndLoopAddressOffset] + 32768 * region.Generators[(int)GeneratorEnum.EndLoopAddressCoarseOffset];
            switch (region.Generators[(int)GeneratorEnum.SampleModes] & 0x3)
            {
            case 0x0:
            case 0x2:
                gen.LoopMode = LoopModeEnum.NoLoop;
                break;

            case 0x1:
                gen.LoopMode = LoopModeEnum.Continuous;
                break;

            case 0x3:
                gen.LoopMode = LoopModeEnum.LoopUntilNoteOff;
                break;
            }
            gen.LoopStartPhase = sda.LoopStart + region.Generators[(int)GeneratorEnum.StartLoopAddressOffset] + 32768 * region.Generators[(int)GeneratorEnum.StartLoopAddressCoarseOffset];
            gen.Offset         = 0;
            gen.Period         = 1.0;
            if (region.Generators[(int)GeneratorEnum.OverridingRootKey] > -1)
            {
                gen.RootKey = region.Generators[(int)GeneratorEnum.OverridingRootKey];
            }
            else
            {
                gen.RootKey = sda.RootKey;
            }
            gen.StartPhase    = sda.Start + region.Generators[(int)GeneratorEnum.StartAddressOffset] + 32768 * region.Generators[(int)GeneratorEnum.StartAddressCoarseOffset];
            gen.Tune          = (short)(sda.Tune + region.Generators[(int)GeneratorEnum.FineTune] + 100 * region.Generators[(int)GeneratorEnum.CoarseTune]);
            gen.VelocityTrack = 0;
            gen.Samples       = sda.SampleData;
            this.genList[0]   = gen;
        }
        public SampleGenerator(GeneratorDescriptor description, AssetManager assets)
            : base(description)
        {
            SampleDataAsset sample = assets.FindSample(Path.GetFileNameWithoutExtension(description.AssetName));

            if (sample == null)
            {
                throw new Exception("Could not find asset: (" + description.AssetName + ").");
            }
            data = sample.SampleData;
            freq = sample.SampleRate;
            if (end < 0)
            {
                end = sample.End;
            }
            if (start < 0)
            {
                start = sample.Start;
            }
            if (loopEnd < 0)
            {
                if (sample.LoopEnd < 0)
                {
                    loopEnd = end;
                }
                else
                {
                    loopEnd = sample.LoopEnd;
                }
            }
            if (loopStart < 0)
            {
                if (sample.LoopStart < 0)
                {
                    loopStart = start;
                }
                else
                {
                    loopStart = sample.LoopStart;
                }
            }
            if (genPeriod < 0)
            {
                genPeriod = 1;
            }
            if (root < 0)
            {
                root = sample.RootKey;
                if (tuneCents == 0)
                {
                    tuneCents = sample.Tune;
                }
            }
            //check sample end and loop end for consistency
            if (end > data.Length)
            {
                end = data.Length;
            }
            if (loopEnd > end)
            {
                loopEnd = end;
            }
        }