#pragma once #include "Pattern/Pattern.h" #include "Midi/MidiType.h" #include "Midi/Time/TimePos.h" enum class EPatternInstanceAlignment { MidiTick, Sample, }; class FPatternInstance { FRIEND_THREAD_MESSAGE(EndSetting) public: virtual ~FPatternInstance() = default; FPatternInstance(FPattern* InOwner, int32 InTrackIndex, AudioFrame InPos, TRange InRange) : TrackIndex(InTrackIndex), Owner(InOwner) { TimeRange = InRange; Pos = InPos; } void RequestDestroy(); FPattern* GetOwner() const { return Owner; } void RequestEndSetting(); virtual void SetRange(TRange InRange); virtual void SetMidiPos(MidiTick InPos); virtual MidiTick GetMidiPos() { return Pos.Ticks(); } AudioFrame GetLength() const { return TimeRange.Size(); } virtual void Process(AudioFrame SequencePos, AudioFrame Length); int32 TrackIndex; // 在PlayList中的位置(Track的Index) TRange TimeRange; AudioFrame Pos; protected: virtual void EndSetting(); FPattern* Owner; };