#pragma once #include "Midi/MidiMessageSequence.h" #include "Pattern.h" class FPluginHost; DECLARE_MULTICAST_DELEGATE_TwoParams(FOnMidiPatternChanged, FPluginHost*, FMidiMessageSequence*) DECLARE_MULTICAST_DELEGATE_TwoParams(FOnMidiPatternTrigger, FPluginHost*, FMidiMessageSequence::MidiEventHolder*) class FMidiPattern : public FPattern { public: FMidiPattern(); virtual ~FMidiPattern() override; virtual void Process(AudioFrame PatternPos, uint32 InLength) override; virtual AudioFrame GetLength() override; virtual void Reset() override; FMidiMessageSequence& GetSequence(FPluginHost* PluginHost); const TMap& GetSequence() const { return Sequence; } FPluginHost* GetPluginHost(FMidiMessageSequence* InSequence); void DeleteSequence(FPluginHost* PluginHost); void NotifyOnChanged(FMidiMessageSequence* InSequence); void NotifyOnChanged_MainThread(FMidiMessageSequence* InSequence); void NotifyOnChanged(FPluginHost* PluginHost); FOnMidiPatternChanged OnChanged; FOnMidiPatternChanged OnChanged_MainThread; FOnMidiPatternTrigger OnTrigger; private: TMap Sequence; TMap SequenceToPluginHost; FCriticalSection SequenceLock; };