/* generate effect cycle. this is called once per envelope tick to apply */ /* effects to data generated during this envelope clock cycle. */ public static SynthErrorCodes ApplyOscEffectGenerator( OscEffectGenRec Generator, float[] workspace, int lOffset, int rOffset, int nActualFrames, SynthParamRec SynthParams) { int count = Generator.count; IOscillatorEffect[] List = Generator.List; if (unchecked ((uint)count > (uint)List.Length)) { Debug.Assert(false); throw new IndexOutOfRangeException(); } for (int i = 0; i < count; i++) { SynthErrorCodes error = List[i].Apply( workspace, lOffset, rOffset, nActualFrames, SynthParams); if (error != SynthErrorCodes.eSynthDone) { return(error); } } return(SynthErrorCodes.eSynthDone); }
/* retrigger effect envelopes from the origin point */ public static void OscEffectGeneratorRetriggerFromOrigin( OscEffectGenRec Generator, ref AccentRec Accents, double NewInitialFrequency, double HurryUp, bool ActuallyRetrigger, SynthParamRec SynthParams) { int count = Generator.count; IOscillatorEffect[] List = Generator.List; if (unchecked ((uint)count > (uint)List.Length)) { Debug.Assert(false); throw new IndexOutOfRangeException(); } for (int i = 0; i < count; i++) { List[i].OscRetriggerEnvelopes( ref Accents, HurryUp, NewInitialFrequency, ActuallyRetrigger, SynthParams); } }
/* update envelopes for effects */ public static SynthErrorCodes OscEffectGeneratorUpdateEnvelopes( OscEffectGenRec Generator, double OscillatorFrequency, SynthParamRec SynthParams) { int count = Generator.count; IOscillatorEffect[] List = Generator.List; if (unchecked ((uint)count > (uint)List.Length)) { Debug.Assert(false); throw new IndexOutOfRangeException(); } for (int i = 0; i < count; i++) { SynthErrorCodes error = List[i].OscUpdateEnvelopes( OscillatorFrequency, SynthParams); if (error != SynthErrorCodes.eSynthDone) { return(error); } } return(SynthErrorCodes.eSynthDone); }
public static void OscEffectKeyUpSustain3(OscEffectGenRec Generator) { int count = Generator.count; IOscillatorEffect[] List = Generator.List; if (unchecked ((uint)count > (uint)List.Length)) { Debug.Assert(false); throw new IndexOutOfRangeException(); } for (int i = 0; i < count; i++) { List[i].OscKeyUpSustain3(); } }
/* fix up pre-origin time for the oscillator effect generator */ public static void FixUpOscEffectGeneratorPreOrigin( OscEffectGenRec Generator, int ActualPreOrigin) { int count = Generator.count; IOscillatorEffect[] List = Generator.List; if (unchecked ((uint)count > (uint)List.Length)) { Debug.Assert(false); throw new IndexOutOfRangeException(); } for (int i = 0; i < count; i++) { List[i].OscFixEnvelopeOrigins( ActualPreOrigin); } }
/* finalize before termination */ public static void FinalizeOscEffectGenerator( OscEffectGenRec Generator, SynthParamRec SynthParams, bool writeOutputLogs) { int count = Generator.count; IOscillatorEffect[] List = Generator.List; if (unchecked ((uint)count > (uint)List.Length)) { Debug.Assert(false); throw new IndexOutOfRangeException(); } for (int i = 0; i < count; i++) { List[i].Finalize( SynthParams, writeOutputLogs); } Free(ref SynthParams.freelists.IOscillatorEffectFreeList, ref Generator.List); Free(ref SynthParams.freelists.OscEffectGenRecFreeList, ref Generator); }
/* create a new oscillator effect generator */ public static SynthErrorCodes NewOscEffectGenerator( EffectSpecListRec SpecList, ref AccentRec Accents, double HurryUp, double InitialFrequency, double FreqForMultisampling, out int PreOriginTimeOut, PlayTrackInfoRec TrackInfo, SynthParamRec SynthParams, out OscEffectGenRec GeneratorOut) { int OnePreOrigin; GeneratorOut = null; PreOriginTimeOut = 0; OscEffectGenRec Generator = New(ref SynthParams.freelists.OscEffectGenRecFreeList); int count = Generator.count = GetEffectSpecListEnabledLength(SpecList); IOscillatorEffect[] List = Generator.List = New(ref SynthParams.freelists.IOscillatorEffectFreeList, count); // zeroed if (unchecked ((uint)count > (uint)List.Length)) { Debug.Assert(false); throw new IndexOutOfRangeException(); } int MaxPreOrigin = 0; /* build list of thingers */ int j = 0; for (int i = 0; j < count; i++) { /* see if effect is enabled */ if (!IsEffectFromEffectSpecListEnabled(SpecList, i)) { continue; } /* fill in fields */ EffectTypes Type = GetEffectSpecListElementType(SpecList, i); switch (Type) { default: Debug.Assert(false); throw new ArgumentException(); case EffectTypes.eDelayEffect: List[j] = DelayUnifiedRec.NewOscUnifiedDelayLineProcessor( GetDelayEffectFromEffectSpecList(SpecList, i), ref Accents, HurryUp, InitialFrequency, FreqForMultisampling, out OnePreOrigin, TrackInfo, SynthParams); if (OnePreOrigin > MaxPreOrigin) { MaxPreOrigin = OnePreOrigin; } break; case EffectTypes.eNLProcEffect: List[j] = NLProcUnifiedRec.NewOscNLProcProcessor( GetNLProcEffectFromEffectSpecList(SpecList, i), ref Accents, HurryUp, InitialFrequency, FreqForMultisampling, out OnePreOrigin, TrackInfo, SynthParams); if (OnePreOrigin > MaxPreOrigin) { MaxPreOrigin = OnePreOrigin; } break; case EffectTypes.eFilterEffect: List[j] = FilterArrayRec.NewOscFilterArrayProcessor( GetFilterEffectFromEffectSpecList(SpecList, i), ref Accents, HurryUp, InitialFrequency, FreqForMultisampling, out OnePreOrigin, TrackInfo, SynthParams); if (OnePreOrigin > MaxPreOrigin) { MaxPreOrigin = OnePreOrigin; } break; case EffectTypes.eAnalyzerEffect: List[j] = AnalyzerRec.NewAnalyzer( GetAnalyzerEffectFromEffectSpecList(SpecList, i), SynthParams); break; case EffectTypes.eHistogramEffect: List[j] = HistogramRec.NewHistogram( GetHistogramEffectFromEffectSpecList(SpecList, i), SynthParams); break; case EffectTypes.eResamplerEffect: List[j] = ResamplerRec.NewResampler( GetResamplerEffectFromEffectSpecList(SpecList, i), SynthParams); break; case EffectTypes.eCompressorEffect: List[j] = CompressorRec.NewOscCompressor( GetCompressorEffectFromEffectSpecList(SpecList, i), ref Accents, HurryUp, InitialFrequency, FreqForMultisampling, out OnePreOrigin, TrackInfo, SynthParams); if (OnePreOrigin > MaxPreOrigin) { MaxPreOrigin = OnePreOrigin; } break; case EffectTypes.eVocoderEffect: List[j] = VocoderRec.NewOscVocoder( GetVocoderEffectFromEffectSpecList(SpecList, i), ref Accents, HurryUp, InitialFrequency, FreqForMultisampling, out OnePreOrigin, TrackInfo, SynthParams); if (OnePreOrigin > MaxPreOrigin) { MaxPreOrigin = OnePreOrigin; } break; case EffectTypes.eIdealLowpassEffect: List[j] = IdealLPRec.NewIdealLP( GetIdealLPEffectFromEffectSpecList(SpecList, i), SynthParams); break; case EffectTypes.eUserEffect: { UserEffectProcRec userEffect; SynthErrorCodes error = UserEffectProcRec.NewOscUserEffectProc( GetUserEffectFromEffectSpecList(SpecList, i), ref Accents, HurryUp, InitialFrequency, FreqForMultisampling, out OnePreOrigin, TrackInfo, SynthParams, out userEffect); if (error != SynthErrorCodes.eSynthDone) { return(error); } List[j] = userEffect; if (OnePreOrigin > MaxPreOrigin) { MaxPreOrigin = OnePreOrigin; } } break; case EffectTypes.ePluggableEffect: { PluggableSpec Spec = GetPluggableEffectFromEffectSpecList(SpecList, i); Debug.Assert(Spec is PluggableOscSpec); PluggableOscEffectTemplate template = new PluggableOscEffectTemplate( (PluggableOscSpec)Spec, SynthParams); IOscillatorEffect effect; SynthErrorCodes error = template.Create( ref Accents, HurryUp, InitialFrequency, FreqForMultisampling, out OnePreOrigin, TrackInfo, SynthParams, out effect); if (error != SynthErrorCodes.eSynthDone) { return(error); } List[j] = effect; if (OnePreOrigin > MaxPreOrigin) { MaxPreOrigin = OnePreOrigin; } } break; } j++; } Debug.Assert(j == count); PreOriginTimeOut = MaxPreOrigin; GeneratorOut = Generator; return(SynthErrorCodes.eSynthDone); }