Krotos Modules 3
Loading...
Searching...
No Matches
WaveformViewerAndEditor.cpp
Go to the documentation of this file.
1namespace krotos
2{
3 WaveformViewerAndEditor::WaveformViewerAndEditor(Colour waveformColour, bool minimumSelectionAreaOn,
4 bool enableAreaSelection)
5 : m_minimumSelectionAreaOn(minimumSelectionAreaOn),
6 m_waveformView(std::make_unique<WaveformViewer>(waveformColour)),
7 m_grainDisplay(std::make_unique<GrainDisplay>())
8 {
9
10 addAndMakeVisible(m_waveformView.get());
11 m_waveformView->setBounds(0, 30, 400, 140);
12 m_waveformView->setInterceptsMouseClicks(false, false);
13 m_waveformView->toBack();
14 m_waveformView->setUseExtendedFilePaths(true);
15 m_waveformView->setLimitToSingleDroppedItem(false);
16
17 addAndMakeVisible(m_grainDisplay.get());
18 m_grainDisplay->toFront(false);
19
20 addMouseListener(this, /*andChildComponents*/ true);
21 m_sampleChooser = std::make_unique<FileChooser>(m_fileChooserWindowTitle,
22 (File::getSpecialLocation(File::userDocumentsDirectory)),
24 startTimer(30);
25 }
26
28 {
29 // Check for active grains before updating display to reduce idle CPU usage
30 auto sampleEngine = m_grainDisplay->getDisplayedSampleEngine();
31 if (sampleEngine != nullptr)
32 {
33 if (sampleEngine->isPlaying())
34 {
35 m_grainDisplay->update();
37 }
38 // Draw a few frames after grains stop playing
40 {
42 m_grainDisplay->update();
43 }
44 }
45 }
46
48 {
49 if (!isEnabled()) // Only draw stuff if this component is enabled
50 return;
51
53 {
54 // Draw in segment boundaries
55 for (auto& selector : m_selectors)
56 {
57 float width = static_cast<float>(getWidth());
58
59 // Draw in selection highlight
60 float segmentPercentOfWaveformStart = static_cast<float>(selector.segment.getStart()) /
61 static_cast<float>(m_scrollManager.getLength());
62 float segmentPercentOfWaveformEnd =
63 static_cast<float>(selector.segment.getEnd()) / static_cast<float>(m_scrollManager.getLength());
64 float selectionPercentOfWaveformStart = static_cast<float>(selector.selection.getStart()) /
65 static_cast<float>(m_scrollManager.getLength());
66 float selectionPercentOfWaveformEnd = static_cast<float>(selector.selection.getEnd()) /
67 static_cast<float>(m_scrollManager.getLength());
68
69 // Draw in selected area shading
72 g, Rectangle<float>(segmentPercentOfWaveformStart, 0.0f,
73 selectionPercentOfWaveformStart - segmentPercentOfWaveformStart, 1.0f));
75 g, Rectangle<float>(selectionPercentOfWaveformEnd, 0.0f,
76 segmentPercentOfWaveformEnd - selectionPercentOfWaveformEnd, 1.0f));
77
78 // Draw in selection drag highlight
79 if (selector.selectionHover.getVal() && !(selector.leftHover.getVal() || selector.rightHover.getVal()))
80 {
83 g, Rectangle<float>(selectionPercentOfWaveformStart, m_layout.dragSelectAreaBoundary,
84 selectionPercentOfWaveformEnd - selectionPercentOfWaveformStart, 1.0f));
85 }
86
87 // Draw in selection start - brighter when hovering
88 g.setColour(selector.leftHover.getVal() ? m_colourDefinitions.selectionStartHover
91 g, Line<float>(selectionPercentOfWaveformStart, 0.f, selectionPercentOfWaveformStart, 1.f),
92 2.f);
93
94 // Draw in selection end - brighter when hovering
95 g.setColour(selector.rightHover.getVal() ? m_colourDefinitions.selectionEndHover
98 g, Line<float>(selectionPercentOfWaveformEnd, 0.f, selectionPercentOfWaveformEnd, 1.f), 2.f);
99 }
100 }
101 }
102
104
106
108 {
109 auto bounds = getLocalBounds();
110 m_waveformView->setBounds(bounds);
111 m_grainDisplay->setBounds(bounds);
113 }
114
116
118 {
119 if (m_grainDisplay == nullptr || m_grainDisplay->getDisplayedSampleEngine() == nullptr)
120 return String();
121
122 return m_grainDisplay->getDisplayedSampleEngine()->getGetLoadedFilePathsAsCSV();
123 }
124
125 void WaveformViewerAndEditor::update(AudioBuffer<float>* newAudio, int sampleRate)
126 {
127 m_waveformView->updateWaveformView(*newAudio);
128 m_totalSampleLength = int(newAudio->getNumSamples());
129 m_sampleRate = static_cast<float>(sampleRate);
130 // Move and resize the scrollbar thumb
132 }
133
135 {
136 auto sampleEngine = sound.getSampleEngine();
137 update(dynamic_cast<AudioBuffer<float>*>(sampleEngine),
138 static_cast<int>(sampleEngine->getSampleRate())); // Load newly assembled waveform into viewer
139 setGrainData(sampleEngine->getGrainArray(), sampleEngine->getNumSamples(), sampleEngine->getNumChannels());
141 }
142
143 void WaveformViewerAndEditor::setViewerDropText(String newText) { m_waveformView->setDropText(newText); }
144
146 {
149 repaint();
150 }
151
153
155 {
156 if (m_waveformView)
157 {
158 m_waveformView->clear();
159 }
160 if (m_grainDisplay)
161 {
162 m_grainDisplay->setGrainData(nullptr, 0, 0);
163 m_grainDisplay->setSampleEngineToDisplay(nullptr);
164 }
165 }
166
168
169 void WaveformViewerAndEditor::setGrainData(Grain* grains, int numSamples, int numChannels)
170 {
171 m_grainDisplay->setGrainData(grains, numSamples, numChannels);
172 }
173
175 {
176 selector.selection.setStart(m_sampleEngine->getAudioSelectionStartPosition(segmentIndex));
177 selector.selection.setLength(m_sampleEngine->getAudioSelectionLengthInSamples(segmentIndex));
178 selector.segment.setStart(m_sampleEngine->getAudioSegmentStartPosition(segmentIndex));
179 selector.segment.setLength(m_sampleEngine->getAudioSegmentLengthInSamples(segmentIndex));
180 }
181
183 {
184 m_selectors.clear();
186 {
187 for (int segmentIndex = 0; segmentIndex < m_sampleEngine->getNumAudioSegments(); segmentIndex++)
188 {
189 Selector newSelector;
190 copySampleEngineSegmentToSelector(newSelector, segmentIndex);
191 m_selectors.push_back(newSelector);
192 }
193 // The scroll manager needs to know the overall length of the audio buffer
194 m_scrollManager.initialise(m_selectors.back().segment.getEnd());
195
197 }
198 else
199 {
200 // There are no segments, so initialise to 0
202 }
203 }
204
206 {
207 if (sound == nullptr)
208 {
209 m_sampleEngine = nullptr;
210 return;
211 }
213 if (m_sampleEngine == nullptr)
214 {
215 return;
216 }
217
218 m_grainDisplay->setSampleEngineToDisplay(sound);
219
220 int numAudioSegments = m_sampleEngine->getNumAudioSegments();
221
222 if (numAudioSegments == 0)
223 {
224 return;
225 }
226
228 }
229
230 inline void WaveformViewerAndEditor::setZooms(const Range<float> newRange)
231 {
232 m_waveformView->setHorizontalZoomFromRange(newRange);
233 m_grainDisplay->setHorizontalZoomFromRange(newRange);
235 }
236
237 Array<File> WaveformViewerAndEditor::getExtendedFilePaths(const StringArray& fileNames)
238 {
239 return m_waveformView->getExtendedFilePaths(fileNames);
240 }
241
243 {
244 // Calculate mousex position as a sample index into the sound buffer
245 return m_scrollManager.percentMouseXToSampleXAbsolute(static_cast<float>(x) / static_cast<float>(getWidth()));
246 }
247
248 void WaveformViewerAndEditor::moveSelectionStart(int segmentIndex, int diff)
249 {
250 // Check that segmentIndex is within range
251 jassert(segmentIndex >= 0 && segmentIndex < m_selectors.size() && m_selectors.size() > 0);
252
253 auto newStart = m_selectors[segmentIndex].selection.getStart() + diff;
254 // Clamp the new selection start position between the segment start and the selection end
255 auto clipRange = Range<int>::between(m_selectors[segmentIndex].segment.getStart(),
256 m_selectors[segmentIndex].selection.getEnd());
257 auto clippedStart = clipRange.clipValue(newStart);
258 m_selectors[segmentIndex].selection.setStart(clippedStart);
259 }
260
261 void WaveformViewerAndEditor::setSelectionStart(int segmentIndex, int newStart)
262 {
263 // Check that segmentIndex is within range
264 jassert(segmentIndex >= 0 && segmentIndex < m_selectors.size() && m_selectors.size() > 0);
265
266 // Clamp the new selection start position between the segment start and the selection end
267 auto clipRange = Range<int>::between(m_selectors[segmentIndex].segment.getStart(),
268 m_selectors[segmentIndex].segment.getEnd());
269 auto clippedStart = clipRange.clipValue(newStart);
270 m_selectors[segmentIndex].selection.setStart(clippedStart);
271 }
272
273 void WaveformViewerAndEditor::moveSelectionEnd(int segmentIndex, int diff)
274 {
275 // Check that segmentIndex is within range
276 jassert(segmentIndex >= 0 && segmentIndex < m_selectors.size() && m_selectors.size() > 0);
277
278 auto newEnd = m_selectors[segmentIndex].selection.getEnd() + diff;
279 // Clamp the new selection end position between the segment end and the selection start
280 auto clipRange = Range<int>::between(m_selectors[segmentIndex].selection.getStart(),
281 m_selectors[segmentIndex].segment.getEnd());
282 auto clippedEnd = clipRange.clipValue(newEnd);
283 m_selectors[segmentIndex].selection.setEnd(clippedEnd);
284 }
285
286 void WaveformViewerAndEditor::setSelectionEnd(int segmentIndex, int newEnd)
287 {
288 // Check that segmentIndex is within range
289 jassert(segmentIndex >= 0 && segmentIndex < m_selectors.size() && m_selectors.size() > 0);
290
291 // Clamp the new selection end position between the segment end and the selection start
292 auto clipRange = Range<int>::between(m_selectors[segmentIndex].segment.getStart(),
293 m_selectors[segmentIndex].segment.getEnd());
294 auto clippedEnd = clipRange.clipValue(newEnd);
295 m_selectors[segmentIndex].selection.setEnd(clippedEnd);
296 }
297
298 void WaveformViewerAndEditor::moveSelection(int segmentIndex, int diff)
299 {
300 // Check that segmentIndex is within range
301 jassert(segmentIndex >= 0 && segmentIndex < m_selectors.size() && m_selectors.size() > 0);
302
303 auto selection = m_selectors[segmentIndex].selection;
304 auto newStart = selection.getStart() + diff;
305 auto movedSelection = selection.movedToStartAt(newStart);
306 auto movedClampedSelection = m_selectors[segmentIndex].segment.constrainRange(movedSelection);
307 m_selectors[segmentIndex].selection = movedClampedSelection;
308 }
309
310 Range<int> WaveformViewerAndEditor::getSelection(int segmentIndex)
311 {
312 // Check that segmentIndex is within range
313 jassert(segmentIndex >= 0 && segmentIndex < m_selectors.size() && m_selectors.size() > 0);
314 return m_selectors[segmentIndex].selection;
315 }
316
317 void WaveformViewerAndEditor::setHoverFromDirection(int segmentIndex, int mouseDeltaX)
318 {
319 // Check that segmentIndex is within range
320 jassert(segmentIndex >= 0 && segmentIndex < m_selectors.size() && m_selectors.size() > 0);
321 // If the mouse delta is negative, we know the mouse pointer is travelling from right to left
322 // If this is the case we set the left hover true, otherwise we set the right hover true
323 bool movingToTheLeft = mouseDeltaX < 0;
324 m_selectors[segmentIndex].leftHover = movingToTheLeft;
325 m_selectors[segmentIndex].rightHover = !movingToTheLeft;
326 }
327
328 void WaveformViewerAndEditor::mouseDown(const MouseEvent& e)
329 {
330 jassert(m_grainDisplay.get() != nullptr);
331
332 if (m_selectors.size() <= 0)
333 {
335 return;
336 }
337
338 m_middleMouseDown = e.mods.isMiddleButtonDown();
340 {
342 }
343
344 // Start of a swipe right or swipe left selection ?
345 // If the left mouse button is clicked when no hover is detected then
346 // we set the start and end markers to the same position under the mouse pointer
347 // Because doing this brings the start and selectors to the same position, both will have hover true
348 // and this will be detected as an undecidedDrag - which be resolved when the mouse actually
349 // drags and the direction of movement is deduced. The selector to be dragged will be set true
350 // at this point, and that will be the start of a swipe selection
351 if (m_hoverMode == HoverMode::noHover && e.mods.isLeftButtonDown())
352 {
353 int mouseX = e.getPosition().getX();
354 int sampleMouseX = mouseXToSampleX(mouseX);
357 mouseMove();
358 repaint();
359 }
360 }
361
362 void WaveformViewerAndEditor::mouseDrag(const MouseEvent& e)
363 {
364 int mouseX = e.getPosition().getX();
365
366 // Check if the user is dragging with the middle mouse button
368 {
370 static_cast<float>(getWidth())));
371 m_mouseX = mouseX;
373 // Move and resize the scrollbar thumb
375 repaint();
376 return;
377 }
378
380 {
381 // If audio segments count doesn't match the selectors count, we won't drag anything
382 if (m_sampleEngine != nullptr && m_sampleEngine->getNumAudioSegments() != m_selectors.size())
383 {
384 return;
385 }
386
387 // Check that m_activeSegmentIndex is within range
388 if (!(m_activeSegmentIndex >= 0 && m_activeSegmentIndex < m_selectors.size() && m_selectors.size() > 0))
389 {
390 return; // m_activeSegmentIndex is not within range, so we won't drag anything
391 }
392
393 int sampleMouseX = mouseXToSampleX(mouseX);
394 int sampleMouseDeltaX = sampleMouseX - m_sampleMouseX;
395 m_sampleMouseX = sampleMouseX;
396
397 /*
398 The only method which can change the waveform selections is this method, mouseDrag
399 If a selection change is made we set the m_selectionChanged which will be
400 picked up in the mouseup method as confirmation to set the Selctions parameter
401 */
402
403 switch (m_hoverMode)
404 {
405 // Changes the selection
407 moveSelectionStart(m_activeSegmentIndex, sampleMouseDeltaX);
408 m_selectionChanged = true;
409 repaint();
410 break;
411
412 // Changes the selection
414 moveSelectionEnd(m_activeSegmentIndex, sampleMouseDeltaX);
415 m_selectionChanged = true;
416 repaint();
417 break;
418
419 // Changes the selection
421 moveSelection(m_activeSegmentIndex, sampleMouseDeltaX);
422 m_selectionChanged = true;
423 repaint();
424 break;
425
426 // Start and end markers are so close together that we use
427 // the direction of travel of the mouse pointer to decide whether
428 // to drag the start or the end marker
432 m_grainDisplay.get()->setMouseCursor(hoverModeToMouseCursor(m_hoverMode));
433 repaint();
434 break;
435 }
436
438 {
439 // If the selection was changed, update the sample engine to reflect
440 // Done here to give instant result if waveform is playing, rather than wait for mouse up
441 auto newSelection = getSelection(m_activeSegmentIndex);
442
445 }
446 }
447 }
448
449 void WaveformViewerAndEditor::mouseUp(const MouseEvent& e)
450 {
451 m_middleMouseDown = e.mods.isMiddleButtonDown();
452 m_grainDisplay.get()->setMouseCursor(hoverModeToMouseCursor(m_hoverMode));
454 {
455 // We are not going to call selection changed listeners every time the mouse position increments
456 // ... only on mouse up
457 m_selectionChanged = false; // Cancel the flag
458 // This will call back the listener in the KwidgetGUI_CoreEngine to
459 // Update the Selections custom parameter
461 }
462 }
463
475
476 void WaveformViewerAndEditor::mouseWheelMove(const MouseEvent& e, const MouseWheelDetails& wheel)
477 {
479 {
480 zoomByDelta(-wheel.deltaY * 0.1);
481 }
482 }
483
485 {
487 if (m_selectors[segmentIndex].segmentHover.getVal())
488 {
489 if (m_selectors[segmentIndex].leftHover.getVal() && m_selectors[segmentIndex].rightHover.getVal())
490 {
491 retMode = HoverMode::undecidedDrag;
492 }
493 else if (m_selectors[segmentIndex].leftHover.getVal())
494 {
495 retMode = HoverMode::leftEdgeDrag;
496 }
497 else if (m_selectors[segmentIndex].rightHover.getVal())
498 {
499 retMode = HoverMode::rightEdgeDrag;
500 }
501 else if (m_selectors[segmentIndex].selectionHover.getVal())
502 {
503 retMode = HoverMode::selectionDrag;
504 }
505 }
506 else
507 {
508 retMode = HoverMode::noHover;
509 }
510
511 return retMode;
512 }
513
515 {
516 MouseCursor customCursor;
517
518 switch (hMode)
519 {
521 customCursor = MouseCursor(juce::MouseCursor::StandardCursorType::DraggingHandCursor);
522 break;
523
525 customCursor = MouseCursor(juce::MouseCursor::StandardCursorType::LeftEdgeResizeCursor);
526 break;
527
531 customCursor = MouseCursor(juce::MouseCursor::StandardCursorType::PointingHandCursor);
532 break;
533
534 default:
536 customCursor = MouseCursor(juce::MouseCursor::StandardCursorType::NormalCursor);
537 break;
538 }
539 return customCursor;
540 }
541
542 void WaveformViewerAndEditor::mouseMove(const MouseEvent& e)
543 {
544 m_mouseX = e.getPosition().getX();
545 m_mouseY = e.getPosition().getY();
546 mouseMove();
547 }
548
550 {
552
554 {
555
556 bool inLowerZone =
557 m_mouseY > static_cast<int>(static_cast<float>(getHeight()) * m_layout.dragSelectAreaBoundary);
558
559 // Loop through all the selectors checking whether we are hovering over any of them
560 bool m_changed = false;
561 int index = 0;
562 for (auto& selector : m_selectors)
563 {
564 // Set true if hovering over segment
565 selector.segmentHover = selector.segment.contains(m_sampleMouseX);
566
567 // Set true if hovering over selection
568 selector.selectionHover = selector.selection.contains(m_sampleMouseX) && inLowerZone;
569
570 // If hovering over segment
571 if (selector.segmentHover.getVal())
572 {
573 // Convert pixel tolerance into buffer samples for comparison with buffer sample positions
575 // Set true if near left edge
576 selector.leftHover = abs(selector.selection.getStart() - m_sampleMouseX) < tolerance;
577 // Set true if near right edge
578 selector.rightHover = abs(selector.selection.getEnd() - m_sampleMouseX) < tolerance;
579 }
580 else
581 {
582 selector.leftHover = false;
583 selector.rightHover = false;
584 }
585
586 // Take note whether there was a change in any of the hover states
587 m_changed |= selector.segmentHover.hasChanged();
588 m_changed |= selector.selectionHover.hasChanged();
589 m_changed |= selector.leftHover.hasChanged();
590 m_changed |= selector.rightHover.hasChanged();
591
592 if (selector.segmentHover.getVal())
593 {
594 m_activeSegmentIndex = index;
595 }
596
597 index++;
598 }
599
600 if (m_changed)
601 {
602 // At this point we should really call setMouseCursor( customCursor );
603 // to update the mouse cursor. This has been tested, and does work when this component
604 // has no children. However, it stops working when GrainDisplay is added as a child component
605 // It was discovered that calling the same method on the grain display component does work
607 m_grainDisplay.get()->setMouseCursor(hoverModeToMouseCursor(m_hoverMode));
608
609 // We only trigger a repaint if something has changed
610 repaint();
611 }
612 }
613 }
614
615 void WaveformViewerAndEditor::mouseEnter(const MouseEvent& event)
616 {
617 m_waveformView->setHoverState(true);
618 repaint();
619 }
620
621 void WaveformViewerAndEditor::mouseExit(const MouseEvent& e)
622 {
623 m_waveformView->setHoverState(false);
624 for (auto& selector : m_selectors)
625 {
626 selector.segmentHover = false;
627 selector.selectionHover = false;
628 selector.leftHover = false;
629 selector.rightHover = false;
630 }
631 repaint();
632 }
633
635 {
636 return m_waveformView->isInterestedInFileDrag(files);
637 }
638
639 void WaveformViewerAndEditor::filesDropped(const StringArray& files, int /* x */, int /* y */)
640 {
641 if (!isEnabled())
642 return;
643
645
646 if (isInterestedInFileDrag(files))
647 {
648 m_listeners.call(&Listener::fileHasBeenDropped, this, files);
649 copySegmentsToSelectors(); // Update the selectors
650 m_waveformView->fileDragExit(files);
651 }
652 }
653
654 void WaveformViewerAndEditor::fileDragEnter(const StringArray& files, int x, int y)
655 {
656 m_waveformView->fileDragEnter(files, x, y);
657 }
658
659 void WaveformViewerAndEditor::fileDragExit(const StringArray& files) { m_waveformView->fileDragExit(files); }
660
661 void WaveformViewerAndEditor::reportAnyInvalidFiles(const StringArray& filelist)
662 {
663 int invalidFiles(0);
664 for (auto filepath : filelist)
665 {
666 File f(filepath);
667 if (f.hasFileExtension(m_validFileExtensions) == false)
668 {
669 invalidFiles++;
670 }
671 }
672 if (invalidFiles == 0)
673 {
674 m_waveformView->setDropText("");
675 }
676 else
677 {
678 invalidFiles == 1 ? m_waveformView->setDropText("Sample Failed to Import")
679 : m_waveformView->setDropText(String(invalidFiles) + " Samples Failed to Import");
680 }
681 }
682
684 {
685 const int fileFlags = FileBrowserComponent::canSelectFiles | FileBrowserComponent::canSelectMultipleItems;
686 m_sampleChooser->launchAsync(fileFlags, [this](const FileChooser& fileChooser) {
687 if (fileChooser.getResults().isEmpty() == false)
688 {
689 StringArray filePaths;
690 for (auto file : fileChooser.getResults())
691 {
692 filePaths.add(file.getFullPathName());
693 }
694 if (!filePaths.isEmpty())
695 {
696 // If a file/files have/has been chosen, we just carry on exactly as if file/s had
697 // been dropped into the waveform area
698 filesDropped(filePaths, 0, 0);
699 }
700 }
701 });
702 }
703
705 {
707 {
708 m_sampleMouseX = mouseXToSampleX(getWidth() * 0.5f);
709 }
710 zoomByDelta(-0.1f);
711 }
712
714 {
716 {
717 m_sampleMouseX = mouseXToSampleX(getWidth() * 0.5f);
718 }
719 zoomByDelta(0.1f);
720 }
721
723
725 {
726 m_grainDisplay->setComponentID(newId);
727 m_waveformView->setComponentID(newId);
728 }
729
731 {
732 m_nextSampleEngineSegment = segmentIndex;
733
735 {
736 auto segment = m_sampleEngine->getAudioSegments()[segmentIndex];
737
739 Range<int>(segment.segmentStartPosition, segment.segmentStartPosition + segment.segmentLength));
740
742
743 // Move and resize the scrollbar thumb
745 }
746 };
747
748} // namespace krotos
Definition GrainDisplay.h:6
Definition OscillatorUtils.h:39
Definition KrotosSynthesiserSound.h:19
SampleEngine * getSampleEngine() override
Definition KrotosSynthesiserSound.h:44
int getAudioSegmentLengthInSamples(int segmentIndex)
Returns the length of an audio segment.
Definition SampleEngine.cpp:269
int getAudioSelectionStartPosition(int segmentIndex)
Returns the start of the selected section of an audio segment.
Definition SampleEngine.cpp:243
void setAudioSelectionStartPositionAbsolute(int segmentIndex, int startPosition)
Sets the absolute start of an audio segment selection relative to the audio buffer start.
Definition SampleEngine.cpp:200
void setAudioSelectionLength(int segmentIndex, int length)
Sets the length of an audio segment selection.
Definition SampleEngine.cpp:206
const Array< AudioSegment > & getAudioSegments() const
Returns the audio segment array loaded in the sample engine.(read-only)
Definition SampleEngine.h:172
int getAudioSelectionLengthInSamples(int segmentIndex)
Returns the length of the selected section of an audio segment.
Definition SampleEngine.cpp:249
int getNumAudioSegments()
Definition SampleEngine.h:161
std::vector< Range< int > > getSelectionRanges()
Returns an array of segment selection ranges.
Definition SampleEngine.cpp:96
int getAudioSegmentStartPosition(int segmentIndex)
Returns the start of an audio segment.
Definition SampleEngine.cpp:263
Range< float > getZoomWindowNormalisedToRange()
Definition HelperClasses.cpp:43
bool isZoomScrollEnabled()
Definition HelperClasses.cpp:20
Range< float > getZoomWindowNormalisedToLimits()
Definition HelperClasses.cpp:30
void initialise(int length)
Definition HelperClasses.cpp:9
void drag(int diff)
Definition HelperClasses.cpp:78
void repositionZoomWindow(float newStart)
Definition HelperClasses.cpp:55
void zoom(int center, float amount)
Definition HelperClasses.cpp:62
int pixelsToSamples(int pixels, int waveformScreenWidth)
Definition HelperClasses.cpp:94
int percentMouseXToSampleXAbsolute(float percentX)
Definition HelperClasses.cpp:84
void setZoomRange(Range< int > newRange)
Sets the zoom to a specific range.
Definition HelperClasses.cpp:100
void setSelectionEnabled(bool newState)
Definition HelperClasses.cpp:24
int percentMouseXToSampleXRelative(float percentX)
Definition HelperClasses.cpp:89
int getLength()
Definition HelperClasses.cpp:26
bool isSelectionEnabled()
Definition HelperClasses.cpp:18
Definition WaveformViewerAndEditor.h:13
virtual void fileHasBeenDropped(WaveformViewerAndEditor *areaSelectionComp, const StringArray &files)=0
virtual void resizeScrollBarFromRange(juce::Range< float >)
Definition WaveformViewerAndEditor.h:20
virtual void selectionsChanged(WaveformViewerAndEditor *areaSelectionComp, std::vector< Range< int > > selections)=0
ZoomStyle
Definition WaveformViewerAndEditor.h:27
void fileDragExit(const StringArray &files) override
Definition WaveformViewerAndEditor.cpp:659
void copySampleEngineSegmentToSelector(Selector &selector, int segmentIndex)
Definition WaveformViewerAndEditor.cpp:174
ScrollAndZoomManager m_scrollManager
Definition WaveformViewerAndEditor.h:181
int m_sampleMouseX
Definition WaveformViewerAndEditor.h:185
void reportAnyInvalidFiles(const StringArray &filelist)
Definition WaveformViewerAndEditor.cpp:661
void showFileChooser()
Show the waveform view file chooser.
Definition WaveformViewerAndEditor.cpp:683
void setHoverFromDirection(int segmentIndex, int mouseDeltaX)
Definition WaveformViewerAndEditor.cpp:317
int m_mouseY
Definition WaveformViewerAndEditor.h:187
std::unique_ptr< WaveformViewer > m_waveformView
Definition WaveformViewerAndEditor.h:193
ZoomStyle m_zoomStyle
Definition WaveformViewerAndEditor.h:212
bool m_middleMouseDown
Definition WaveformViewerAndEditor.h:178
void moveSelectionEnd(int segmentIndex, int diff)
Definition WaveformViewerAndEditor.cpp:273
void mouseExit(const MouseEvent &event) override
Definition WaveformViewerAndEditor.cpp:621
void setViewerDropText(String newText)
Definition WaveformViewerAndEditor.cpp:143
void setZoomStyle(ZoomStyle)
Definition WaveformViewerAndEditor.cpp:722
int m_frameCooldownCounter
Definition WaveformViewerAndEditor.h:204
void zoomIn()
Definition WaveformViewerAndEditor.cpp:704
Array< File > getExtendedFilePaths(const StringArray &fileNames)
Definition WaveformViewerAndEditor.cpp:237
bool m_selectionChanged
Definition WaveformViewerAndEditor.h:177
int m_activeSegmentIndex
Definition WaveformViewerAndEditor.h:184
void fileDragEnter(const StringArray &files, int x, int y) override
Definition WaveformViewerAndEditor.cpp:654
void mouseDown(const MouseEvent &event) override
Definition WaveformViewerAndEditor.cpp:328
const String m_validFileExtensions
Definition WaveformViewerAndEditor.h:211
void moveSelectionStart(int segmentIndex, int diff)
Definition WaveformViewerAndEditor.cpp:248
void mouseWheelMove(const MouseEvent &e, const MouseWheelDetails &wheel) override
Definition WaveformViewerAndEditor.cpp:476
struct krotos::WaveformViewerAndEditor::Layout m_layout
std::vector< Selector > m_selectors
Definition WaveformViewerAndEditor.h:183
Range< int > getSelection(int segmentIndex)
Definition WaveformViewerAndEditor.cpp:310
void mouseMove()
Definition WaveformViewerAndEditor.cpp:549
void setGrainData(Grain *grains, int numSamples, int numChannels)
Definition WaveformViewerAndEditor.cpp:169
ListenerList< Listener > m_listeners
Definition WaveformViewerAndEditor.h:179
void setSampleEngineToDisplay(KrotosSampleOscillatorSound *sampEngine)
Definition WaveformViewerAndEditor.cpp:205
WaveformViewer * getWaveformViewer()
Definition WaveformViewerAndEditor.cpp:152
void mouseUp(const MouseEvent &event) override
Definition WaveformViewerAndEditor.cpp:449
HoverMode m_hoverMode
Definition WaveformViewerAndEditor.h:182
int m_totalSampleLength
Definition WaveformViewerAndEditor.h:198
std::unique_ptr< FileChooser > m_sampleChooser
Definition WaveformViewerAndEditor.h:208
WaveformViewerAndEditor(Colour waveformColour, bool minimumSelectionAreaOn, bool enableAreaSelection=true)
Definition WaveformViewerAndEditor.cpp:3
int m_mouseX
Definition WaveformViewerAndEditor.h:186
String m_fileName
Definition WaveformViewerAndEditor.h:195
void clear()
Definition WaveformViewerAndEditor.cpp:154
void addListener(Listener *Listener)
Definition WaveformViewerAndEditor.cpp:103
static const int FRAME_COOLDOWN
Definition WaveformViewerAndEditor.h:206
void moveSelection(int segmentIndex, int diff)
Definition WaveformViewerAndEditor.cpp:298
void setChildComponentIds(String newId)
Definition WaveformViewerAndEditor.cpp:724
void update(AudioBuffer< float > *newAudio, int sampleRate)
Definition WaveformViewerAndEditor.cpp:125
const String m_fileChooserWindowTitle
Definition WaveformViewerAndEditor.h:209
int mouseXToSampleX(int x)
Definition WaveformViewerAndEditor.cpp:242
void setViewCentre(float newRangeStart)
Definition WaveformViewerAndEditor.cpp:145
void timerCallback() override
Definition WaveformViewerAndEditor.cpp:27
void filesDropped(const StringArray &files, int x, int y) override
Definition WaveformViewerAndEditor.cpp:639
void zoomToSegment(size_t segmentIndex)
Centres the waveform viewer around a given segment, so that the segment fills the entire viewer windo...
Definition WaveformViewerAndEditor.cpp:730
SampleEngine * m_sampleEngine
Definition WaveformViewerAndEditor.h:191
HoverMode deduceSegmentHoverMode(int segmentIndex)
Definition WaveformViewerAndEditor.cpp:484
void mouseDrag(const MouseEvent &event) override
Definition WaveformViewerAndEditor.cpp:362
String getFileName()
Definition WaveformViewerAndEditor.cpp:115
std::unique_ptr< GrainDisplay > m_grainDisplay
Definition WaveformViewerAndEditor.h:192
void mouseEnter(const MouseEvent &event) override
Definition WaveformViewerAndEditor.cpp:615
HoverMode
Definition WaveformViewerAndEditor.h:136
@ noHover
Definition WaveformViewerAndEditor.h:137
@ rightEdgeDrag
Definition WaveformViewerAndEditor.h:141
@ selectionDrag
Definition WaveformViewerAndEditor.h:139
@ undecidedDrag
Definition WaveformViewerAndEditor.h:142
@ leftEdgeDrag
Definition WaveformViewerAndEditor.h:140
@ segmentDrag
Definition WaveformViewerAndEditor.h:138
String getLoadedFilePathsAsCSV()
Definition WaveformViewerAndEditor.cpp:117
const String m_chooserAllowedFileTypes
Definition WaveformViewerAndEditor.h:210
struct krotos::WaveformViewerAndEditor::ColourDefinitions m_colourDefinitions
void removeListener(Listener *Listener)
Definition WaveformViewerAndEditor.cpp:105
void paintOverChildren(Graphics &g) override
Definition WaveformViewerAndEditor.cpp:47
void setSelectionEnd(int segmentIndex, int sampleIndex)
Definition WaveformViewerAndEditor.cpp:286
void zoomOut()
Definition WaveformViewerAndEditor.cpp:713
void setZooms(const Range< float > newRange)
Definition WaveformViewerAndEditor.cpp:230
void copySegmentsToSelectors()
Definition WaveformViewerAndEditor.cpp:182
void resized() override
Definition WaveformViewerAndEditor.cpp:107
bool isInterestedInFileDrag(const StringArray &files) override
Definition WaveformViewerAndEditor.cpp:634
float m_sampleRate
Definition WaveformViewerAndEditor.h:199
void setSelectionEnabled(bool newState)
Definition WaveformViewerAndEditor.cpp:167
void zoomByDelta(float delta)
Definition WaveformViewerAndEditor.cpp:464
MouseCursor hoverModeToMouseCursor(HoverMode hMode)
Definition WaveformViewerAndEditor.cpp:514
void setSelectionStart(int segmentIndex, int sampleIndex)
Definition WaveformViewerAndEditor.cpp:261
int m_nextSampleEngineSegment
Definition WaveformViewerAndEditor.h:189
Definition WaveformViewer.h:6
void drawNormalisedZoomedRect(Graphics &g, const Rectangle< float > &rect) const
Definition ZoomableComponent.cpp:14
void drawNormalisedZoomedLine(Graphics &g, Line< float > line, float thickness) const
Definition ZoomableComponent.cpp:35
void setHorizontalZoomFromRange(const Range< float > xr)
Definition ZoomableComponent.cpp:116
Definition AirAbsorptionFilter.cpp:2
A structure to hold info on a selected area.
Definition HelperClasses.h:30
Range< int > segment
Definition HelperClasses.h:32
Range< int > selection
Definition HelperClasses.h:34
const Colour selectionEndHover
Definition WaveformViewerAndEditor.h:129
const Colour selectedAreaShading
Definition WaveformViewerAndEditor.h:132
const Colour selectionStartHover
Definition WaveformViewerAndEditor.h:126
const Colour selectionEnd
Definition WaveformViewerAndEditor.h:130
const Colour draggedHighlight
Definition WaveformViewerAndEditor.h:131
const Colour selectionStart
Definition WaveformViewerAndEditor.h:127
const int endMarkerPixelTolerance
Definition WaveformViewerAndEditor.h:118
const float dragSelectAreaBoundary
Definition WaveformViewerAndEditor.h:119