public override bool Start(VoiceParameters voiceparams)
{
int note = keyOverride > -1 ? keyOverride : voiceparams.Note;
int vel = velOverride > -1 ? velOverride : voiceparams.Velocity;
//setup generator
voiceparams.GeneratorParams[0].QuickSetup(gen);
//setup envelopes
voiceparams.Envelopes[0].QuickSetupSf2(voiceparams.SynthParams.Synth.SampleRate, note, keynumToModEnvHold, keynumToModEnvDecay, false, mod_env);
voiceparams.Envelopes[1].QuickSetupSf2(voiceparams.SynthParams.Synth.SampleRate, note, keynumToVolEnvHold, keynumToVolEnvDecay, true, vel_env);
//setup filter
//voiceparams.pData[0].int1 = iniFilterFc - (int)(2400 * CalculateModulator(SourceTypeEnum.Linear, TransformEnum.Linear, DirectionEnum.MaxToMin, PolarityEnum.Unipolar, voiceparams.velocity, 0, 127));
//if (iniFilterFc >= 13500 && fltr.Resonance <= 1)
voiceparams.Filters[0].Disable();
//else
// voiceparams.filters[0].QuickSetup(voiceparams.synthParams.synth.SampleRate, note, 1f, fltr);
//setup lfos
voiceparams.Lfos[0].QuickSetup(voiceparams.SynthParams.Synth.SampleRate, mod_lfo);
voiceparams.Lfos[1].QuickSetup(voiceparams.SynthParams.Synth.SampleRate, vib_lfo);
//calculate initial pitch
voiceparams.PitchOffset = (note - gen.RootKey) * gen.KeyTrack + gen.Tune;
voiceparams.PitchOffset += (int)(100.0 * (voiceparams.SynthParams.MasterCoarseTune + (voiceparams.SynthParams.MasterFineTune.Combined - 8192.0) / 8192.0));
//calculate initial volume
voiceparams.VolOffset = initialAttn;
voiceparams.VolOffset -= 96.0f * (float)CalculateModulator(SourceTypeEnum.Concave, TransformEnum.Linear, DirectionEnum.MaxToMin, PolarityEnum.Unipolar, voiceparams.Velocity, 0, 127);
voiceparams.VolOffset -= 96.0f * (float)CalculateModulator(SourceTypeEnum.Concave, TransformEnum.Linear, DirectionEnum.MaxToMin, PolarityEnum.Unipolar, voiceparams.SynthParams.Volume.Coarse, 0, 127);
//check if we have finished before we have begun
return voiceparams.GeneratorParams[0].CurrentState != GeneratorState.Finished && voiceparams.Envelopes[1].CurrentStage != EnvelopeState.None;
}