1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143
|
/**
bespoke synth, a software modular synthesizer
Copyright (C) 2021 Ryan Challinor (contact: awwbees@gmail.com)
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>.
**/
//
// GridController.h
// Bespoke
//
// Created by Ryan Challinor on 2/9/15.
//
//
#pragma once
#include "IUIControl.h"
#include "MidiController.h"
#define MAX_GRIDCONTROLLER_ROWS 512
#define MAX_GRIDCONTROLLER_COLS 512
class IGridController;
class PatchCableSource;
enum GridColor
{
kGridColorOff,
kGridColor1Dim,
kGridColor1Bright,
kGridColor2Dim,
kGridColor2Bright,
kGridColor3Dim,
kGridColor3Bright
};
class IGridControllerListener
{
public:
virtual ~IGridControllerListener() {}
virtual void OnControllerPageSelected() = 0;
virtual void OnGridButton(int x, int y, float velocity, IGridController* grid) = 0;
};
class IGridController
{
public:
virtual ~IGridController() {}
virtual void SetGridControllerOwner(IGridControllerListener* owner) = 0;
virtual void SetLight(int x, int y, GridColor color, bool force = false) = 0;
virtual void SetLightDirect(int x, int y, int color, bool force = false) = 0;
virtual void ResetLights() = 0;
virtual int NumCols() = 0;
virtual int NumRows() = 0;
virtual bool HasInput() const = 0;
virtual bool IsMultisliderGrid() const { return false; }
virtual bool IsConnected() const = 0;
};
class GridControlTarget : public IUIControl
{
public:
GridControlTarget(IGridControllerListener* owner, const char* name, int x, int y);
virtual ~GridControlTarget() {}
void Render() override;
static void DrawGridIcon(float x, float y);
void SetGridController(IGridController* gridController)
{
mGridController = gridController;
gridController->SetGridControllerOwner(mOwner);
}
IGridController* GetGridController() { return mGridController; }
//IUIControl
void SetFromMidiCC(float slider, double time, bool setViaModulator) override {}
void SetValue(float value, double time, bool forceUpdate = false) override {}
bool CanBeTargetedBy(PatchCableSource* source) const override;
void SaveState(FileStreamOut& out) override;
void LoadState(FileStreamIn& in, bool shouldSetValue = true) override;
bool IsSliderControl() override { return false; }
bool IsButtonControl() override { return false; }
bool GetNoHover() const override { return true; }
private:
void GetDimensions(float& width, float& height) override
{
width = 30;
height = 15;
}
bool MouseMoved(float x, float y) override;
IGridControllerListener* mOwner{ nullptr };
IGridController* mGridController{ nullptr };
};
class GridControllerMidi : public IGridController
{
public:
GridControllerMidi();
virtual ~GridControllerMidi() {}
void SetUp(GridLayout* layout, int page, MidiController* controller);
void UnhookController();
//IGridController
void SetGridControllerOwner(IGridControllerListener* owner) override { mOwner = owner; }
void SetLight(int x, int y, GridColor color, bool force = false) override;
void SetLightDirect(int x, int y, int color, bool force = false) override;
void ResetLights() override;
int NumCols() override { return mCols; }
int NumRows() override { return mRows; }
bool HasInput() const override;
//bool IsMultisliderGrid() const override { return mColors.empty(); } //commented out... don't remember what types of grids this is supposed to be for
bool IsConnected() const override { return mMidiController != nullptr; }
void OnControllerPageSelected();
void OnInput(int control, float velocity);
private:
unsigned int mRows{ 8 };
unsigned int mCols{ 8 };
int mControls[MAX_GRIDCONTROLLER_COLS][MAX_GRIDCONTROLLER_ROWS]{};
float mInput[MAX_GRIDCONTROLLER_COLS][MAX_GRIDCONTROLLER_ROWS]{};
int mLights[MAX_GRIDCONTROLLER_COLS][MAX_GRIDCONTROLLER_ROWS]{};
std::vector<int> mColors;
MidiMessageType mMessageType{ MidiMessageType::kMidiMessage_Note };
MidiController* mMidiController{ nullptr };
int mControllerPage{ 0 };
IGridControllerListener* mOwner{ nullptr };
};
|