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; } }