53 lines
1.4 KiB
C++
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;
|
|
};
|