#pragma once #include #include "GrainEngine.h" class WaveformDisplay : public juce::Component { public: WaveformDisplay(); void setBuffer (const juce::AudioBuffer* buffer); void setGrainPosition (float pos) { grainPosition = pos; repaint(); } void setScatterRange (float range) { scatterRange = range; repaint(); } void setActiveGrains (const std::vector& grains); std::function onPositionChanged; void paint (juce::Graphics& g) override; void resized() override; void mouseDown (const juce::MouseEvent& e) override; void mouseDrag (const juce::MouseEvent& e) override; private: const juce::AudioBuffer* audioBuffer = nullptr; juce::Path cachedWaveformPath; bool pathDirty = true; int lastWidth = 0, lastHeight = 0; int lastBufferSize = 0; float grainPosition = 0.5f; float scatterRange = 0.0f; std::vector activeGrains; int totalSourceSamples = 0; void rebuildWaveformPath (juce::Rectangle bounds); void updatePositionFromMouse (const juce::MouseEvent& e); JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (WaveformDisplay) };