#include "SSamplePatternInstance.h" #include "Pattern/SamplePatternInstance.h" #include "UI/Widget/Thumbnail.h" #include "UI/Widget/WaveformViewer.h" FSamplePatternInstanceWaveformHandle::FSamplePatternInstanceWaveformHandle(SSamplePatternInstance* InPatternInstance): PatternInstanceWidget(InPatternInstance) { } TArrayView FSamplePatternInstanceWaveformHandle::GetWaveform(int32 SizeX) { FSamplePatternInstance* Instance = (FSamplePatternInstance*)PatternInstanceWidget->GetPatternInstance(); TRange FrameViewRange = PatternInstanceWidget->GetFrameViewRange(); const FSampler* Sampler = Instance->GetInstanceOwner()->GetSampler(); const TRange& TimeRange = Instance->TimeRange; if (!RenderData) { RenderData = new FWaveform(7, 256 * 128); RenderData->UpdatePeak(Sampler->GetSampleBuffer()); const float MemSize = RenderData->GetMemSize(); UE_LOG(LogTemp, Warning, TEXT("Waveform MemSize: %f MB"), MemSize / 1024 / 1024); } const AudioFrame InstancePos = Instance->GetMidiPos(); FrameViewRange = TRange(FrameViewRange.GetLowerBoundValue() - InstancePos, FrameViewRange.GetUpperBoundValue() - InstancePos); const AudioFrame BeginFrame = FMath::Max(TimeRange.GetLowerBoundValue(), FrameViewRange.GetLowerBoundValue()); const AudioFrame EndFrame = FMath::Min(TimeRange.GetUpperBoundValue(), FrameViewRange.GetUpperBoundValue()); return RenderData->GetPeakFromRange(0, SizeX, BeginFrame, EndFrame); } SSamplePatternInstance::SSamplePatternInstance() { WaveformHandle = MakeShared(this); } TSharedRef SSamplePatternInstance::GetViewWidget() { return SAssignNew(WaveformViewer, SWaveformViewer) .WaveformHandle(WaveformHandle); } void SSamplePatternInstance::RequestUpdate() { } FReply SSamplePatternInstance::OpenPatternMenu() { return FReply::Handled(); }