Oscilloscope 0.5.0
A simple oscilloscope VST
Loading...
Searching...
No Matches
TriggeredOscilloscope.cpp
Go to the documentation of this file.
1/*
2 ==============================================================================
3
4 TriggeredOscilloscope.cpp
5 Created: 28 Feb 2023 4:24:56pm
6 Author: wadda
7
8 ==============================================================================
9*/
10
12
14 : OscilloscopeComponent(aProcessor, sampleRate, aProcessor.getEditorRefreshRate())
15 , sampleFinder(
16 !aProcessor.getTreeState()->getParameterAsValue("slopeButtonTriggered").getValue(),
17 aProcessor.getTreeState()->getParameterAsValue("autoTriggered").getValue()
18 )
19{
20 // get decay time
21 float decayTimeRelative = aProcessor.getTreeState()->getParameterAsValue("decayTime").getValue();
22 decayTimeRelative = std::max(static_cast<float>(0.05), decayTimeRelative); // sometimes it inizializes to 0
23
24 // reset decayCounter & add it as listener
25 decayCounter.reset(
26 new DecayCounter(
27 aProcessor.getEditorRefreshRate(),
28 decayTimeRelative * OSCILLOSCOPE_MAX_DECAY_TIME()));
29 aProcessor.getTreeState()->addParameterListener("decayTime", decayCounter.get());
30
31 // add sampleFinder listeners
32 aProcessor.getTreeState()->addParameterListener("autoTriggered", &sampleFinder);
33 aProcessor.getTreeState()->addParameterListener("slopeButtonTriggered", &sampleFinder.autoFinder);
34 aProcessor.getTreeState()->addParameterListener("slopeButtonTriggered", &sampleFinder.manualFinder);
35
36 // refresh displayed data
38}
39
41{
42 // remove listeners
43 audioProcessor.getTreeState()->removeParameterListener("decayTime", decayCounter.get());
44 audioProcessor.getTreeState()->removeParameterListener("autoTriggered", &sampleFinder);
45 audioProcessor.getTreeState()->removeParameterListener("slopeButtonTriggered", &sampleFinder.autoFinder);
46 audioProcessor.getTreeState()->removeParameterListener("slopeButtonTriggered", &sampleFinder.manualFinder);
47}
48
50{
51 // resize buffer and copy from sampleData
52 auto size = sampleData.size();
53 currentlyDisplayedData.resize(sampleData.size());
54 std::copy(sampleData.begin(), sampleData.end(), currentlyDisplayedData.begin());
55
56 // get trigger level
57 triggerLevel = audioProcessor.getTreeState()->getParameterAsValue("triggerLevel").getValue();
58
59 // reset firstSampleToPlot
60 const int offset = sampleFinder.findFirstSample(triggerLevel, currentlyDisplayedData);
61 firstSampleToPlot = currentlyDisplayedData.begin() + offset;
62
63 // if not found display flat line
64 if (offset == -1)
65 {
66 std::fill(currentlyDisplayedData.begin(), currentlyDisplayedData.end(), 0.);
67 firstSampleToPlot = currentlyDisplayedData.begin();
68 }
69}
70
71void TriggeredOscilloscope::plot(juce::Graphics &g, juce::Rectangle<float> rect, float scaler, float offset)
72{
73 // get beginning and num samples
74 auto data = currentlyDisplayedData.begin();
75 auto numSamples = currentlyDisplayedData.size();
76
77 // get bounds
78 auto w = rect.getWidth();
79 auto h = rect.getHeight();
80 auto right = rect.getRight();
81 auto center = rect.getBottom() - offset;
82 auto gain = h * scaler;
83 g.setColour(WAVEFORMCOLOUR());
84
85 // get distance of trigger point from beginning
86 int sampleOffset = std::distance(data, firstSampleToPlot);
87
88 // ratio sampleOffset / numSamples to map correctly waveform
89 float widthRatio = sampleOffset / numSamples;
90
91 // for each point map & draw line
92 for (size_t i = 1; i < numSamples - sampleOffset; ++i)
93 {
94 auto xMapPrevious = juce::jmap(
95 float(i - 1),
96 float(sampleOffset),
97 float(numSamples - 1),
98 float(right - w),
99 float(right * (1 - widthRatio)));
100 auto xMap = juce::jmap(
101 float(i),
102 float(sampleOffset),
103 float(numSamples - 1),
104 float(right - w),
105 float(right * (1 - widthRatio)));
106
107 g.drawLine({xMapPrevious,
108 center - gain * firstSampleToPlot[i - 1],
109 xMap,
110 center - gain * firstSampleToPlot[i]});
111 }
112}
113
114void TriggeredOscilloscope::subclassSpecificCallback()
115{
116 // if refresh is needed refresh displayed data
117 if (decayCounter.get()->refreshNeeded())
118 {
120 }
121}
Oscilloscope audio processor.
juce::AudioProcessorValueTreeState * getTreeState()
OscilloscopeAudioProcessor & audioProcessor
std::vector< float > sampleData
ManualSampleFinder manualFinder
Definition: SampleFinder.h:170
AutoSampleFinder autoFinder
Definition: SampleFinder.h:164
int findFirstSample(float triggerLevel, std::vector< float > currentlyDisplayedData)
TriggeredOscilloscope(OscilloscopeAudioProcessor &aProcessor, int sampleRate)