mirror of
https://github.com/juce-framework/JUCE.git
synced 2026-01-13 00:04:19 +00:00
241 lines
7.5 KiB
C++
241 lines
7.5 KiB
C++
/*
|
|
==============================================================================
|
|
|
|
This file is part of the JUCE library.
|
|
Copyright (c) 2017 - ROLI Ltd.
|
|
|
|
JUCE is an open source library subject to commercial or open-source
|
|
licensing.
|
|
|
|
By using JUCE, you agree to the terms of both the JUCE 5 End-User License
|
|
Agreement and JUCE 5 Privacy Policy (both updated and effective as of the
|
|
27th April 2017).
|
|
|
|
End User License Agreement: www.juce.com/juce-5-licence
|
|
Privacy Policy: www.juce.com/juce-5-privacy-policy
|
|
|
|
Or: You may also use this code under the terms of the GPL v3 (see
|
|
www.gnu.org/licenses).
|
|
|
|
JUCE IS PROVIDED "AS IS" WITHOUT ANY WARRANTY, AND ALL WARRANTIES, WHETHER
|
|
EXPRESSED OR IMPLIED, INCLUDING MERCHANTABILITY AND FITNESS FOR PURPOSE, ARE
|
|
DISCLAIMED.
|
|
|
|
==============================================================================
|
|
*/
|
|
|
|
#pragma once
|
|
|
|
#include "../JuceLibraryCode/JuceHeader.h"
|
|
#include "LightpadComponent.h"
|
|
|
|
//==============================================================================
|
|
/**
|
|
A struct that handles the setup and layout of the DrumPadGridProgram
|
|
*/
|
|
struct ColourGrid
|
|
{
|
|
ColourGrid (int cols, int rows)
|
|
: numColumns (cols),
|
|
numRows (rows)
|
|
{
|
|
constructGridFillArray();
|
|
}
|
|
|
|
/** Creates a GridFill object for each pad in the grid and sets its colour
|
|
and fill before adding it to an array of GridFill objects
|
|
*/
|
|
void constructGridFillArray()
|
|
{
|
|
gridFillArray.clear();
|
|
|
|
auto counter = 0;
|
|
|
|
for (auto i = 0; i < numColumns; ++i)
|
|
{
|
|
for (auto j = 0; j < numRows; ++j)
|
|
{
|
|
DrumPadGridProgram::GridFill fill;
|
|
Colour colourToUse = colourArray.getUnchecked (counter);
|
|
|
|
fill.colour = colourToUse.withBrightness (colourToUse == currentColour ? 1.0f : 0.1f);
|
|
|
|
if (colourToUse == Colours::black)
|
|
fill.fillType = DrumPadGridProgram::GridFill::FillType::hollow;
|
|
else
|
|
fill.fillType = DrumPadGridProgram::GridFill::FillType::filled;
|
|
|
|
gridFillArray.add (fill);
|
|
|
|
if (++counter == colourArray.size())
|
|
counter = 0;
|
|
}
|
|
}
|
|
}
|
|
|
|
/** Sets which colour should be active for a given touch co-ordinate. Returns
|
|
true if the colour has changed
|
|
*/
|
|
bool setActiveColourForTouch (int x, int y)
|
|
{
|
|
auto colourHasChanged = false;
|
|
|
|
auto xindex = x / 5;
|
|
auto yindex = y / 5;
|
|
|
|
auto newColour = colourArray.getUnchecked ((yindex * 3) + xindex);
|
|
if (currentColour != newColour)
|
|
{
|
|
currentColour = newColour;
|
|
constructGridFillArray();
|
|
colourHasChanged = true;
|
|
}
|
|
|
|
return colourHasChanged;
|
|
}
|
|
|
|
//==============================================================================
|
|
int numColumns, numRows;
|
|
|
|
Array<DrumPadGridProgram::GridFill> gridFillArray;
|
|
|
|
Array<Colour> colourArray = { Colours::white, Colours::red, Colours::green,
|
|
Colours::blue, Colours::hotpink, Colours::orange,
|
|
Colours::magenta, Colours::cyan, Colours::black };
|
|
|
|
Colour currentColour = Colours::hotpink;
|
|
|
|
//==============================================================================
|
|
JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (ColourGrid)
|
|
};
|
|
|
|
//==============================================================================
|
|
/**
|
|
The main component
|
|
*/
|
|
class MainComponent : public Component,
|
|
public TopologySource::Listener,
|
|
private TouchSurface::Listener,
|
|
private ControlButton::Listener,
|
|
private LightpadComponent::Listener,
|
|
private Button::Listener,
|
|
private Slider::Listener,
|
|
private Timer
|
|
{
|
|
public:
|
|
MainComponent();
|
|
~MainComponent();
|
|
|
|
void resized() override;
|
|
|
|
/** Overridden from TopologySource::Listener. Called when the topology changes */
|
|
void topologyChanged() override;
|
|
|
|
private:
|
|
/** Overridden from TouchSurface::Listener. Called when a Touch is received on the Lightpad */
|
|
void touchChanged (TouchSurface&, const TouchSurface::Touch&) override;
|
|
|
|
/** Overridden from ControlButton::Listener. Called when a button on the Lightpad is pressed */
|
|
void buttonPressed (ControlButton&, Block::Timestamp) override { }
|
|
|
|
/** Overridden from ControlButton::Listener. Called when a button on the Lightpad is released */
|
|
void buttonReleased (ControlButton&, Block::Timestamp) override;
|
|
|
|
void ledClicked (int x, int y, float z) override;
|
|
|
|
void buttonClicked (Button*) override;
|
|
|
|
void sliderValueChanged (Slider*) override;
|
|
|
|
void timerCallback() override;
|
|
|
|
/** Removes TouchSurface and ControlButton listeners and sets activeBlock to nullptr */
|
|
void detachActiveBlock();
|
|
|
|
/** Sets the LEDGrid Program for the selected mode */
|
|
void setLEDProgram (Block&);
|
|
|
|
void clearLEDs();
|
|
|
|
/** Sets an LED on the Lightpad for a given touch co-ordinate and pressure */
|
|
void drawLED (uint32 x0, uint32 y0, float z, Colour drawColour);
|
|
|
|
/** Redraws the LEDs on the Lightpad from the activeLeds array */
|
|
void redrawLEDs();
|
|
|
|
//==============================================================================
|
|
BitmapLEDProgram* getCanvasProgram()
|
|
{
|
|
if (activeBlock != nullptr)
|
|
return dynamic_cast<BitmapLEDProgram*> (activeBlock->getProgram());
|
|
|
|
return nullptr;
|
|
}
|
|
|
|
DrumPadGridProgram* getPaletteProgram()
|
|
{
|
|
if (activeBlock != nullptr)
|
|
return dynamic_cast<DrumPadGridProgram*> (activeBlock->getProgram());
|
|
|
|
return nullptr;
|
|
}
|
|
|
|
//==============================================================================
|
|
/**
|
|
A struct that represents an active LED on the Lightpad.
|
|
Has a position, colour and brightness.
|
|
*/
|
|
struct ActiveLED
|
|
{
|
|
uint32 x, y;
|
|
Colour colour;
|
|
float brightness;
|
|
|
|
/** Returns true if this LED occupies the given co-ordinates */
|
|
bool occupies (uint32 xPos, uint32 yPos) const
|
|
{
|
|
return xPos == x && yPos == y;
|
|
}
|
|
};
|
|
Array<ActiveLED> activeLeds;
|
|
|
|
int getLEDAt (uint32 x, uint32 y) const
|
|
{
|
|
for (int i = 0; i < activeLeds.size(); ++i)
|
|
if (activeLeds.getReference(i).occupies (x, y))
|
|
return i;
|
|
|
|
return -1;
|
|
}
|
|
|
|
//==============================================================================
|
|
enum DisplayMode
|
|
{
|
|
colourPalette = 0,
|
|
canvas
|
|
};
|
|
DisplayMode currentMode = colourPalette;
|
|
|
|
//==============================================================================
|
|
ColourGrid layout { 3, 3 };
|
|
PhysicalTopologySource topologySource;
|
|
Block::Ptr activeBlock;
|
|
|
|
float scaleX = 0.0;
|
|
float scaleY = 0.0;
|
|
|
|
bool doublePress = false;
|
|
|
|
Label infoLabel;
|
|
LightpadComponent lightpadComponent;
|
|
TextButton clearButton;
|
|
LEDComponent brightnessLED;
|
|
Slider brightnessSlider;
|
|
|
|
#if JUCE_IOS
|
|
TextButton connectButton;
|
|
#endif
|
|
|
|
//==============================================================================
|
|
JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (MainComponent)
|
|
};
|