34 lines
1.2 KiB
C++
34 lines
1.2 KiB
C++
#include "SamplePatternInstance.h"
|
|
|
|
#include "SamplePattern.h"
|
|
#include "Singleton/MidiSequencer.h"
|
|
#include "PluginHost/Sampler.h"
|
|
|
|
FSamplePatternInstance::FSamplePatternInstance(FSamplePattern* InOwner, int32 TrackIndex, AudioFrame InSamplePos,
|
|
TRange<AudioFrame> 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<AudioFrame>())
|
|
return;
|
|
|
|
int64 PatternPos = (int64)InFramePos - Pos;
|
|
int64 PatternEnd = PatternPos + FrameNum;
|
|
if (PatternPos < 0)
|
|
{
|
|
PatternPos = 0;
|
|
}
|
|
|
|
PatternEnd = FMath::Min<uint64>(PatternEnd, TimeRange.GetUpperBoundValue());
|
|
|
|
Sampler->IncomingOffset = FMath::Min<int32>(0, InFramePos - Pos) * -1;
|
|
Sampler->IncomingRange.SetLowerBoundValue(PatternPos + TimeRange.GetLowerBoundValue());
|
|
Sampler->IncomingRange.SetUpperBoundValue(PatternEnd + TimeRange.GetLowerBoundValue());
|
|
}
|