#pragma once #include "CoreMinimal.h" #include "Future.h" #include "Midi/MidiType.h" #include "Thread/ThreadMessage.h" #include "Midi/Time/TimePos.h" class FPatternInstance; class FPluginHost; enum class EPatternType { Midi, Automation, Sample }; DECLARE_MULTICAST_DELEGATE_ThreeParams(FOnPatternPlay, FPatternInstance* /*Instance*/, AudioFrame /*Pattern Pos*/, uint32 /*Length*/) class FPattern { FRIEND_THREAD_MESSAGE(CreatePatternInstance) FRIEND_THREAD_MESSAGE(DestroyPatternInstance) public: virtual ~FPattern() = default; virtual TFuture RequestCreateInstance(int32 TrackIndex, AudioFrame Pos, AudioFrame PatternBegin, AudioFrame PatternEnd); virtual void RequestDestroyInstance(FPatternInstance* Instance); TArray GetInstances() const { return Instances; } virtual void Reset() {} virtual void Process(AudioFrame PatternPos, uint32 Length) = 0; virtual AudioFrame GetLength() = 0; void ProcessInstances(AudioFrame SequencePos, uint32 InLength); uint32 ID; // 0表示无效 EPatternType Type; FString Name; FLinearColor Color; TRange TimeRange; AudioFrame Length; FSimpleMulticastDelegate OnChanged; FOnPatternPlay OnPlay; protected: FPatternInstance* CreateInstance(int32 TrackIndex, AudioFrame InPos, AudioFrame PatternBegin, AudioFrame PatternEnd); void DestroyInstance(FPatternInstance* Instance); TArray Instances; };