In this topic, we will learn the concept of polymorphism. Download the starter code here ( Link )

We will start off creating a new Component, WaveformDisplay, and get it to display.

At the Projucer window, select Source on the right panel and click + and select Add New Component class (split between a cpp & header) give the name WaveformDisplay. Make sure that the cpp and h files are under the Source folder.

First, we will make some changes to the paint function in WaveformDisplay.cpp to update the UI.

void WaveformDisplay::paint (juce::Graphics& g)
{
    g.fillAll (getLookAndFeel().findColour (juce::ResizableWindow::backgroundColourId));   // clear the background

    g.setColour (juce::Colours::grey);
    g.drawRect (getLocalBounds(), 1);   // draw an outline around the component

    g.setColour (juce::Colours::orange);
    g.setFont (20.0f);
    g.drawText ("File not loaded", getLocalBounds(),
                juce::Justification::centred, true);   // draw some placeholder text
}

Go to DeckGUI.h, import the WaveformDisplay component and declare a private variable of it.


#pragma once

#include "../JuceLibraryCode/JuceHeader.h"
#include "DJAudioPlayer.h"
#include "WaveformDisplay.h"

class DeckGUI    : public Component,
                   public Button::Listener, 
                   public Slider::Listener, 
                   public FileDragAndDropTarget
{
...
private:
		...
    DJAudioPlayer* player;
    
    WaveformDisplay waveformDisplay;

    JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (DeckGUI)
};

Go to DeckGUI.cpp, update the GUI to include the WaveformDisplay.

DeckGUI::DeckGUI(DJAudioPlayer* _player) : player(_player)
{

    addAndMakeVisible(playButton);
    addAndMakeVisible(stopButton);
    addAndMakeVisible(loadButton);
       
    addAndMakeVisible(volSlider);
    addAndMakeVisible(speedSlider);
    addAndMakeVisible(posSlider);
    
    addAndMakeVisible(waveformDisplay);

    ...
}

void DeckGUI::resized()
{
    double rowH = getHeight() / 8;
    playButton.setBounds(0, 0, getWidth(), rowH);
    stopButton.setBounds(0, rowH, getWidth(), rowH);  
    volSlider.setBounds(0, rowH * 2, getWidth(), rowH);
    speedSlider.setBounds(0, rowH * 3, getWidth(), rowH);
    posSlider.setBounds(0, rowH * 4, getWidth(), rowH);
    waveformDisplay.setBounds(0, rowH*5, getWidth(), rowH*2);
    loadButton.setBounds(0, rowH * 7, getWidth(), rowH);
}

Compile and run the project. You should see the waveform display shows up.

Untitled


Next, we will create the AudioThumbnail.

Go to MainComponent.h, declare two private variables.

class MainComponent   : public AudioAppComponent
{
...

private:
    AudioFormatManager formatManager;
    AudioThumbnailCache thumbCache{100}; // store up to 100 waveforms
    
    ...
};