#include "SamplePatternInstance.h" #include "SamplePattern.h" #include "Singleton/MidiSequencer.h" #include "PluginHost/Sampler.h" FSamplePatternInstance::FSamplePatternInstance(FSamplePattern* InOwner, int32 TrackIndex, AudioFrame InSamplePos, TRange InSampleRange) : FPatternInstance(InOwner, TrackIndex, InSamplePos, InSampleRange) { } void FSamplePatternInstance::Process(AudioFrame InFramePos, AudioFrame FrameNum) { const FSamplePattern* SamplePattern = GetInstanceOwner(); FSampler* Sampler = SamplePattern->GetSampler(); const AudioFrame EndSamplePos = InFramePos + FrameNum; if (EndSamplePos < Pos || InFramePos > Pos + TimeRange.Size()) return; int64 PatternPos = (int64)InFramePos - Pos; int64 PatternEnd = PatternPos + FrameNum; if (PatternPos < 0) { PatternPos = 0; } PatternEnd = FMath::Min(PatternEnd, TimeRange.GetUpperBoundValue()); Sampler->IncomingOffset = FMath::Min(0, InFramePos - Pos) * -1; Sampler->IncomingRange.SetLowerBoundValue(PatternPos + TimeRange.GetLowerBoundValue()); Sampler->IncomingRange.SetUpperBoundValue(PatternEnd + TimeRange.GetLowerBoundValue()); }