private void LoadGen(Sf2Region region, AssetManager assets)
{
SampleDataAsset sda = assets.SampleAssets[region.Generators[(int)GeneratorEnum.SampleID]];
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 = LoopMode.NoLoop;
break;
case 0x1:
gen.LoopMode = LoopMode.Continuous;
break;
case 0x3:
gen.LoopMode = LoopMode.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;
((SampleGenerator)gen).Samples = sda.SampleData;
}