public static void Start(this ModulationEnvelope envelope, RegionPair region, int key, int velocity) { // According to the implementation of TinySoundFont, the attack time should be adjusted by the velocity. var delay = region.DelayModulationEnvelope; var attack = region.AttackModulationEnvelope * ((145 - velocity) / 144F); var hold = region.HoldModulationEnvelope * SoundFontMath.KeyNumberToMultiplyingFactor(region.KeyNumberToModulationEnvelopeHold, key); var decay = region.DecayModulationEnvelope * SoundFontMath.KeyNumberToMultiplyingFactor(region.KeyNumberToModulationEnvelopeDecay, key); var sustain = 1F - region.SustainModulationEnvelope / 100F; var release = region.ReleaseModulationEnvelope; envelope.Start(delay, attack, hold, decay, sustain, release); }
public static void Start(this VolumeEnvelope envelope, RegionPair region, int key, int velocity) { // If the release time is shorter than 10 ms, it will be clamped to 10 ms to avoid pop noise. var delay = region.DelayVolumeEnvelope; var attack = region.AttackVolumeEnvelope; var hold = region.HoldVolumeEnvelope * SoundFontMath.KeyNumberToMultiplyingFactor(region.KeyNumberToVolumeEnvelopeHold, key); var decay = region.DecayVolumeEnvelope * SoundFontMath.KeyNumberToMultiplyingFactor(region.KeyNumberToVolumeEnvelopeDecay, key); var sustain = SoundFontMath.DecibelsToLinear(-region.SustainVolumeEnvelope); var release = Math.Max(region.ReleaseVolumeEnvelope, 0.01F); envelope.Start(delay, attack, hold, decay, sustain, release); }