2024-01-25 11:21:15 +08:00

53 lines
1.4 KiB
C++

#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<FPatternInstance*> RequestCreateInstance(int32 TrackIndex, AudioFrame Pos, AudioFrame PatternBegin, AudioFrame PatternEnd);
virtual void RequestDestroyInstance(FPatternInstance* Instance);
TArray<FPatternInstance*> 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<AudioFrame> TimeRange;
AudioFrame Length;
FSimpleMulticastDelegate OnChanged;
FOnPatternPlay OnPlay;
protected:
FPatternInstance* CreateInstance(int32 TrackIndex, AudioFrame InPos, AudioFrame PatternBegin, AudioFrame PatternEnd);
void DestroyInstance(FPatternInstance* Instance);
TArray<FPatternInstance*> Instances;
};