Mema
Memory Matrix — multi-channel audio matrix monitor and router
Loading...
Searching...
No Matches
PanningControlComponent.cpp
Go to the documentation of this file.
1/* Copyright (c) 2025, Christian Ahrens
2 *
3 * This file is part of Mema <https://github.com/ChristianAhrens/Mema>
4 *
5 * This tool is free software; you can redistribute it and/or modify it under
6 * the terms of the GNU Lesser General Public License version 3.0 as published
7 * by the Free Software Foundation.
8 *
9 * This tool is distributed in the hope that it will be useful, but WITHOUT
10 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
11 * FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more
12 * details.
13 *
14 * You should have received a copy of the GNU Lesser General Public License
15 * along with this tool; if not, write to the Free Software Foundation, Inc.,
16 * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
17 */
18
20
21#include <CustomLookAndFeel.h>
22#include <ToggleStateSlider.h>
26
27
28namespace Mema
29{
30
31
34{
35 m_multiSlider = std::make_unique<Mema::TwoDFieldMultisliderComponent>();
36 m_multiSlider->onInputPositionChanged = [=](std::uint16_t channel, const Mema::TwoDFieldMultisliderComponent::TwoDMultisliderValue& value, const float& sharpness, std::optional<Mema::TwoDFieldMultisliderComponent::ChannelLayer> layer) {
37 changeInputPosition(channel, value.relXPos, value.relYPos, sharpness, layer.has_value() ? layer.value() : 0);
38 };
39 m_multiSlider->onInputToOutputStatesChanged = [=](const std::map<std::uint16_t, std::map<std::uint16_t, bool>>& inputToOutputStates) {
40 addCrosspointStates(inputToOutputStates);
43 };
44 m_multiSlider->onInputToOutputValuesChanged = [=](const std::map<std::uint16_t, std::map<std::uint16_t, float>>& inputToOutputValues) {
45 addCrosspointValues(inputToOutputValues);
48 };
49 m_multiSlider->onInputSelected = [=](std::uint16_t channel) {
50 selectInputChannel(channel);
51 };
52 addAndMakeVisible(m_multiSlider.get());
53
54 m_positionMapper = std::make_unique<InputPositionMapper>();
55 m_positionMapper->onInputPositionMapped = [=](std::uint16_t channel, const std::map<juce::AudioChannelSet::ChannelType, float>& channelToOutputsDists) {
56 processOutputDistances(channel, channelToOutputsDists);
57 };
58 m_positionMapper->getAngleForChannelType = [=](juce::AudioChannelSet::ChannelType channelType) {
59 if (m_multiSlider)
60 return m_multiSlider->getAngleForChannelTypeInCurrentConfiguration(channelType);
61 else
62 return 0.0f;
63 };
64
65 m_admOsController = std::make_unique<ADMOSController>();
66 m_admOsController->onParameterChanged = [=](int objNum, std::uint16_t objType) {
67 handleExternalControlParameter(objNum, objType, m_admOsController.get());
68 };
69
70 m_horizontalScrollContainerComponent = std::make_unique<juce::Component>();
71 m_horizontalScrollViewport = std::make_unique<juce::Viewport>();
72 m_horizontalScrollViewport->setViewedComponent(m_horizontalScrollContainerComponent.get(), false);
73 addAndMakeVisible(m_horizontalScrollViewport.get());
74
75 m_inputControlsGrid = std::make_unique<juce::Grid>();
76 m_inputControlsGrid->setGap(juce::Grid::Px(s_gap));
77}
78
82
83void PanningControlComponent::paint(juce::Graphics& g)
84{
85 g.fillAll(getLookAndFeel().findColour(juce::ResizableWindow::backgroundColourId));
86
87 auto ctrlsSize = 2 * (m_controlsSize + s_gap);
88
89 g.setColour(getLookAndFeel().findColour(juce::Slider::backgroundColourId));
90 auto bounds = getLocalBounds();
91 g.fillRect(bounds.removeFromTop(ctrlsSize).removeFromRight(getWidth() - ctrlsSize));
92 g.fillRect(bounds);
93}
94
96{
97 auto ctrlsSize = 2 * (m_controlsSize + s_gap) + s_scrollbarsize;
98 auto currentInputsWidth = (m_inputControlsGrid->getNumberOfColumns() * (m_controlsSize + s_gap)) - s_gap;
99
100 if (m_inputControlsGrid)
101 m_inputControlsGrid->performLayout({ 0, 0, currentInputsWidth, ctrlsSize - s_scrollbarsize });
102
103 m_horizontalScrollContainerComponent->setBounds({ 0, 0, currentInputsWidth, ctrlsSize - s_scrollbarsize });
104 m_horizontalScrollViewport->setBounds(getLocalBounds().removeFromTop(ctrlsSize).removeFromRight(getWidth() - ctrlsSize));
105
106 auto panningBounds = getLocalBounds();
107 panningBounds.removeFromTop(ctrlsSize);
108
109 auto boundsAspect = panningBounds.toFloat().getAspectRatio();
110 auto fieldAspect = m_multiSlider->getRequiredAspectRatio();
111 if (boundsAspect >= 1 / fieldAspect)
112 {
113 // landscape
114 auto multiSliderBounds = juce::Rectangle<int>(int(panningBounds.getHeight() / fieldAspect), panningBounds.getHeight()).withCentre(panningBounds.getCentre());
115 if (m_multiSlider)
116 m_multiSlider->setBounds(multiSliderBounds);
117 }
118 else
119 {
120 // portrait
121 auto multiSliderBounds = juce::Rectangle<int>(panningBounds.getWidth(), int(panningBounds.getWidth() * fieldAspect)).withCentre(panningBounds.getCentre());
122 if (m_multiSlider)
123 m_multiSlider->setBounds(multiSliderBounds);
124 }
125}
126
128{
129 auto ioCount = getIOCount();
130 for (auto in = 0; in < ioCount.first; in++)
131 {
132 if (nullptr != m_inputSelectButtons.at(in))
133 m_inputSelectButtons.at(in)->setColour(juce::TextButton::ColourIds::buttonOnColourId, getLookAndFeel().findColour(JUCEAppBasics::CustomLookAndFeel::ColourIds::MeteringRmsColourId));
134 }
135}
136
138{
140
141 rebuildControls(true);
142 selectInputChannel(m_currentInputChannel);
143
144 if (m_multiSlider)
145 m_multiSlider->setControlsSize(ctrlsSize);
146}
147
153
154void PanningControlComponent::setIOCount(const std::pair<int, int>& ioCount)
155{
157
159
160 if (m_multiSlider)
161 m_multiSlider->setIOCount(ioCount);
162 if (m_admOsController)
163 m_admOsController->setNumObjects(ioCount.first);
164
165 selectInputChannel(m_currentInputChannel);
166}
167
168void PanningControlComponent::setChannelConfig(const juce::AudioChannelSet& channelConfiguration)
169{
170 m_channelConfiguration = channelConfiguration;
171
172 if (m_multiSlider)
173 m_multiSlider->setChannelConfiguration(channelConfiguration);
174}
175
176const juce::AudioChannelSet& PanningControlComponent::getChannelConfig()
177{
178 return m_channelConfiguration;
179}
180
182{
184 resized();
185}
186
187void PanningControlComponent::setExternalControlSettings(int ADMOSCPort, const juce::IPAddress& ADMOSCControllerIP, int ADMOSCControllerPort)
188{
189 if (m_admOsController)
190 m_admOsController->startConnection(ADMOSCPort, ADMOSCControllerIP, ADMOSCControllerPort);
191}
192
193void PanningControlComponent::handleExternalControlParameter(int objNum, std::uint16_t objType, void* /*sender*/)
194{
195 auto admObjType = static_cast<ADMOSController::ADMOSCParameterType>(objType);
196 DBG(juce::String(__FUNCTION__) << " handle n" << objNum << " t" << admObjType);
197
198 jassert(m_admOsController);
199 if (!m_admOsController)
200 return;
201 jassert(m_multiSlider);
202 if (!m_multiSlider)
203 return;
204
205 switch (admObjType)
206 {
208 {
209 auto xParam = m_admOsController->getParameter(objNum, ADMOSController::ADMOSCParameterType::X);
211
212 auto xyzParam = m_admOsController->getParameter(objNum, ADMOSController::ADMOSCParameterType::XYZ);
213 auto xyzVals = ADMOSController::ADMOSCParameterXYZ(xyzParam).getParameterVals();
214 m_admOsController->setParameter(objNum, ADMOSController::ADMOSCParameterXY(xVal, std::get<1>(xyzVals))); // fill up with y from xyzParam
215 m_admOsController->setParameter(objNum, ADMOSController::ADMOSCParameterXYZ(xVal, std::get<1>(xyzVals), std::get<2>(xyzVals))); // fill up with y+z from xyzParam
216
217 changeInputPosition(std::uint16_t(objNum), xVal, std::nullopt, std::nullopt, std::nullopt, juce::NotificationType::sendNotification);
218 }
219 break;
221 {
222 auto yParam = m_admOsController->getParameter(objNum, ADMOSController::ADMOSCParameterType::Y);
224
225 auto xyzParam = m_admOsController->getParameter(objNum, ADMOSController::ADMOSCParameterType::XYZ);
226 auto xyzVals = ADMOSController::ADMOSCParameterXYZ(xyzParam).getParameterVals();
227 m_admOsController->setParameter(objNum, ADMOSController::ADMOSCParameterXY(std::get<0>(xyzVals), yVal)); // fill up with y from xyzParam
228 m_admOsController->setParameter(objNum, ADMOSController::ADMOSCParameterXYZ(std::get<0>(xyzVals), yVal, std::get<2>(xyzVals))); // fill up with y+z from xyzParam
229
230 changeInputPosition(std::uint16_t(objNum), std::nullopt, yVal, std::nullopt, std::nullopt, juce::NotificationType::sendNotification);
231 }
232 break;
234 {
235 auto zParam = m_admOsController->getParameter(objNum, ADMOSController::ADMOSCParameterType::Z);
237
238 auto xyzParam = m_admOsController->getParameter(objNum, ADMOSController::ADMOSCParameterType::XYZ);
239 auto xyzVals = ADMOSController::ADMOSCParameterXYZ(xyzParam).getParameterVals();
240 m_admOsController->setParameter(objNum, ADMOSController::ADMOSCParameterXYZ(std::get<1>(xyzVals), std::get<1>(xyzVals), zVal)); // fill up with y+z from xyzParam
241
242 changeInputPosition(std::uint16_t(objNum), std::nullopt, std::nullopt, std::nullopt, (zVal > 0.5f ? TwoDFieldMultisliderComponent::ChannelLayer::PositionedHeight : TwoDFieldMultisliderComponent::ChannelLayer::Positioned), juce::NotificationType::sendNotification);
243 }
244 break;
246 {
247 auto xyParam = m_admOsController->getParameter(objNum, ADMOSController::ADMOSCParameterType::XY);
249
250 auto xyzParam = m_admOsController->getParameter(objNum, ADMOSController::ADMOSCParameterType::XYZ);
251 auto xyzVals = ADMOSController::ADMOSCParameterXYZ(xyzParam).getParameterVals();
252 m_admOsController->setParameter(objNum, ADMOSController::ADMOSCParameterX(std::get<0>(xyVals)));
253 m_admOsController->setParameter(objNum, ADMOSController::ADMOSCParameterY(std::get<1>(xyVals)));
254 m_admOsController->setParameter(objNum, ADMOSController::ADMOSCParameterXYZ(std::get<0>(xyVals), std::get<1>(xyVals), std::get<2>(xyzVals))); // fill up with z from xyzParam
255
256 changeInputPosition(std::uint16_t(objNum), std::get<0>(xyVals), std::get<1>(xyVals), std::nullopt, std::nullopt, juce::NotificationType::sendNotification);
257 }
258 break;
260 {
261 auto xyzParam = m_admOsController->getParameter(objNum, ADMOSController::ADMOSCParameterType::XYZ);
262 auto xyzVals = ADMOSController::ADMOSCParameterXYZ(xyzParam).getParameterVals();
263
264 m_admOsController->setParameter(objNum, ADMOSController::ADMOSCParameterX(std::get<0>(xyzVals)));
265 m_admOsController->setParameter(objNum, ADMOSController::ADMOSCParameterY(std::get<1>(xyzVals)));
266 m_admOsController->setParameter(objNum, ADMOSController::ADMOSCParameterZ(std::get<2>(xyzVals)));
267 m_admOsController->setParameter(objNum, ADMOSController::ADMOSCParameterXY(std::get<0>(xyzVals), std::get<1>(xyzVals)));
268
269 changeInputPosition(std::uint16_t(objNum), std::get<0>(xyzVals), std::get<1>(xyzVals), std::nullopt, (std::get<2>(xyzVals) > 0.5f ? TwoDFieldMultisliderComponent::ChannelLayer::PositionedHeight : TwoDFieldMultisliderComponent::ChannelLayer::Positioned), juce::NotificationType::sendNotification);
270 }
271 break;
273 {
274 auto wParam = m_admOsController->getParameter(objNum, ADMOSController::ADMOSCParameterType::Width);
276
277 changeInputPosition(std::uint16_t(objNum), std::nullopt, std::nullopt, 1.0f - widthVal, std::nullopt, juce::NotificationType::sendNotification);
278 }
279 break;
281 {
282 auto mParam = m_admOsController->getParameter(objNum, ADMOSController::ADMOSCParameterType::Mute);
284
285 setInputMuteStates({ std::make_pair(static_cast<std::uint16_t>(objNum), muteVal) });
286 }
287 break;
289 default:
290 break;
291 }
292}
293
295{
296 auto ioCount = getIOCount();
297
298 if (ioCount.first != m_inputSelectButtons.size() || ioCount.first != m_inputMuteButtons.size() || force)
299 {
300 auto templateColums = juce::Array<juce::Grid::TrackInfo>();
301 for (auto in = 0; in < ioCount.first; in++)
302 templateColums.add(juce::Grid::TrackInfo(juce::Grid::Px(m_controlsSize)));
303
304 m_inputMuteButtons.resize(ioCount.first);
305 m_inputSelectButtons.resize(ioCount.first);
306 m_inputControlsGrid->items.clear();
307 m_inputControlsGrid->templateRows = { juce::Grid::TrackInfo(juce::Grid::Fr(1)), juce::Grid::TrackInfo(juce::Grid::Fr(1)) };
308 m_inputControlsGrid->templateColumns = templateColums;
309
310 for (auto i = 0; i < ioCount.first; i++)
311 {
312 auto in = std::uint16_t(i + 1);
313 m_inputSelectButtons.at(i) = std::make_unique<juce::TextButton>("In " + juce::String(in));
314 m_inputSelectButtons.at(i)->setClickingTogglesState(true);
315 m_inputSelectButtons.at(i)->setColour(juce::TextButton::ColourIds::buttonOnColourId, getLookAndFeel().findColour(JUCEAppBasics::CustomLookAndFeel::ColourIds::MeteringRmsColourId));
316 m_inputSelectButtons.at(i)->onClick = [this, i] {
317 if (m_inputSelectButtons.size() > i)
318 {
319 auto in = std::uint16_t(i + 1);
320 if (m_inputSelectButtons.at(i)->getToggleState())
322 else
324 }
325 else
326 jassertfalse;
327 };
328 m_horizontalScrollContainerComponent->addAndMakeVisible(m_inputSelectButtons.at(i).get());
329 m_inputControlsGrid->items.add(juce::GridItem(m_inputSelectButtons.at(i).get()));
330 }
331 for (auto i = 0; i < ioCount.first; i++)
332 {
333 auto in = std::uint16_t(i + 1);
334 m_inputMuteButtons.at(i) = std::make_unique<juce::TextButton>("M");
335 m_inputMuteButtons.at(i)->setClickingTogglesState(true);
336 m_inputMuteButtons.at(i)->setToggleState((getInputMuteStates().count(in) != 0 ? getInputMuteStates().at(in) : false), juce::dontSendNotification);
337 m_inputMuteButtons.at(i)->setColour(juce::TextButton::ColourIds::buttonOnColourId, juce::Colours::red);
338 m_inputMuteButtons.at(i)->onClick = [this, i] {
339 auto inputMuteStates = std::map<std::uint16_t, bool>();
340 auto in = std::uint16_t(i + 1);
341 inputMuteStates[in] = m_inputMuteButtons.at(i)->getToggleState();
344 onInputMutesChanged(inputMuteStates);
345 if (m_admOsController)
346 m_admOsController->setParameter(in, ADMOSController::ADMOSCParameterMute(inputMuteStates[in]), ADMOSController::ADMOSCParameterChangeTarget::External);
347 };
348 m_horizontalScrollContainerComponent->addAndMakeVisible(m_inputMuteButtons.at(i).get());
349 m_inputControlsGrid->items.add(juce::GridItem(m_inputMuteButtons.at(i).get()));
350 }
351 }
352}
353
354void PanningControlComponent::setInputMuteStates(const std::map<std::uint16_t, bool>& inputMuteStates)
355{
357
358 for (auto const& inputMuteStateKV : inputMuteStates)
359 {
360 auto& in = inputMuteStateKV.first;
361 auto i = in - 1;
362 auto& state = inputMuteStateKV.second;
363 if (m_inputMuteButtons.size() > i && nullptr != m_inputMuteButtons.at(i))
364 m_inputMuteButtons.at(i)->setToggleState(state, juce::dontSendNotification);
365 }
366}
367
368void PanningControlComponent::setCrosspointStates(const std::map<std::uint16_t, std::map<std::uint16_t, bool>>& crosspointStates)
369{
371
372 if (m_multiSlider)
373 m_multiSlider->setInputToOutputStates(crosspointStates);
374}
375
376void PanningControlComponent::setCrosspointValues(const std::map<std::uint16_t, std::map<std::uint16_t, float>>& crosspointValues)
377{
379
380 if (m_multiSlider)
381 m_multiSlider->setInputToOutputLevels(crosspointValues);
382}
383
385{
386 auto oldChannel = m_currentInputChannel;
387 m_currentInputChannel = channel;
388 if (oldChannel != channel)
390
391 auto ioCount = getIOCount();
392 for (auto i = 0; i < ioCount.first; i++)
393 {
394 auto in = std::uint16_t(i + 1);
395 auto state = channel == in;
396 if (nullptr != m_inputSelectButtons.at(i))
397 m_inputSelectButtons.at(i)->setToggleState(state, juce::dontSendNotification);
398 if (nullptr != m_multiSlider)
399 m_multiSlider->selectInput(in, state);
400 }
401}
402
403void PanningControlComponent::changeInputPosition(std::uint16_t channel, std::optional<float> xValOpt, std::optional<float> yValOpt, std::optional<float> sharpnessOpt, std::optional<int> layerOpt, juce::NotificationType notification)
404{
405 float xVal = 0.0f;
406 if (xValOpt.has_value())
407 xVal = xValOpt.value();
408 else if (m_admOsController)
409 xVal = ADMOSController::ADMOSCParameterX(m_admOsController->getParameter(channel, ADMOSController::ADMOSCParameterType::X)).getParameterVal();
410
411 float yVal = 0.0f;
412 if (yValOpt.has_value())
413 yVal = yValOpt.value();
414 else if (m_admOsController)
415 yVal = ADMOSController::ADMOSCParameterY(m_admOsController->getParameter(channel, ADMOSController::ADMOSCParameterType::Y)).getParameterVal();
416
417 float sharpnessVal = 0.0f;
418 if (sharpnessOpt.has_value())
419 sharpnessVal = sharpnessOpt.value();
420 else if (m_admOsController)
421 sharpnessVal = 1.0f - ADMOSController::ADMOSCParameterWidth(m_admOsController->getParameter(channel, ADMOSController::ADMOSCParameterType::Width)).getParameterVal();
422
423 int layerVal = 0;
424 if (layerOpt.has_value())
425 layerVal = layerOpt.value();
426 else if (m_admOsController)
427 {
428 auto zVal = ADMOSController::ADMOSCParameterZ(m_admOsController->getParameter(channel, ADMOSController::ADMOSCParameterType::Z)).getParameterVal();
429 layerVal = zVal > 0.5f ? TwoDFieldMultisliderComponent::ChannelLayer::PositionedHeight : TwoDFieldMultisliderComponent::ChannelLayer::Positioned;
430 }
431
432 DBG(juce::String(__FUNCTION__) << " new pos: " << int(channel) << " " << xVal << "," << yVal << "(" << sharpnessVal << " / " << layerVal << ")");
433
434 if (m_multiSlider && m_positionMapper)
435 {
436 m_positionMapper->setOutputIncludePositions(m_multiSlider->getOutputsInLayer(TwoDFieldMultisliderComponent::ChannelLayer(layerVal)));
437 m_positionMapper->setOutputIgnorePositions(m_multiSlider->getDirectiveOutputsNotInLayer(TwoDFieldMultisliderComponent::ChannelLayer(layerVal)));
438 m_positionMapper->mapInputPosition(channel, { -xVal, yVal }, sharpnessVal);
439
440 if (juce::NotificationType::dontSendNotification != notification)
441 {
442 if (xValOpt.has_value() || yValOpt.has_value())
443 m_multiSlider->setInputPositionValue(channel, TwoDFieldMultisliderComponent::TwoDMultisliderValue(xVal, yVal), juce::dontSendNotification);
444 if (layerOpt.has_value())
445 m_multiSlider->setInputPositionLayer(channel, TwoDFieldMultisliderComponent::ChannelLayer(layerVal), juce::dontSendNotification);
446 if (sharpnessOpt.has_value())
447 m_multiSlider->setInputPositionSharpness(channel, sharpnessVal, juce::dontSendNotification);
448 }
449 }
450
451 if (m_admOsController)
452 {
453 auto admTarget = juce::NotificationType::dontSendNotification == notification ? ADMOSController::ADMOSCParameterChangeTarget::External : ADMOSController::ADMOSCParameterChangeTarget::None;
454 if (xValOpt.has_value() || yValOpt.has_value())
455 m_admOsController->setParameter(channel, ADMOSController::ADMOSCParameterXY(xVal, yVal), admTarget);
456 if (xValOpt.has_value())
457 m_admOsController->setParameter(channel, ADMOSController::ADMOSCParameterX(xVal), ADMOSController::ADMOSCParameterChangeTarget::None);
458 if (yValOpt.has_value())
459 m_admOsController->setParameter(channel, ADMOSController::ADMOSCParameterY(yVal), ADMOSController::ADMOSCParameterChangeTarget::None);
460 if (xValOpt.has_value() || yValOpt.has_value() || layerOpt.has_value())
461 m_admOsController->setParameter(channel, ADMOSController::ADMOSCParameterXYZ(xVal, yVal, TwoDFieldMultisliderComponent::ChannelLayer::PositionedHeight == layerVal ? 1.0f : 0.0f), ADMOSController::ADMOSCParameterChangeTarget::None);
462 if (sharpnessOpt.has_value())
463 m_admOsController->setParameter(channel, ADMOSController::ADMOSCParameterWidth(1.0f - sharpnessVal), admTarget);
464 }
465}
466
467void PanningControlComponent::processOutputDistances(std::uint16_t channel, const std::map<juce::AudioChannelSet::ChannelType, float>& channelToOutputsDists)
468{
469 std::map<std::uint16_t, std::map<std::uint16_t, bool>> crosspointStates;
470 std::map<std::uint16_t, std::map<std::uint16_t, float>> crosspointValues;
471 for (auto const& cToOdKV : channelToOutputsDists)
472 {
473 crosspointStates[channel][std::uint16_t(m_multiSlider->getChannelNumberForChannelTypeInCurrentConfiguration(cToOdKV.first))] = true;
474 crosspointValues[channel][std::uint16_t(m_multiSlider->getChannelNumberForChannelTypeInCurrentConfiguration(cToOdKV.first))] = cToOdKV.second;
475 }
477 onCrosspointStatesChanged(crosspointStates);
478 addCrosspointStates(crosspointStates);
480 onCrosspointValuesChanged(crosspointValues);
481 addCrosspointValues(crosspointValues);
482}
483
484
485} // namespace Mema
Abstract base for all Mema.Re client control panels.
const std::map< std::uint16_t, bool > & getInputMuteStates()
virtual void addCrosspointValues(const std::map< std::uint16_t, std::map< std::uint16_t, float > > &crosspointValues)
std::function< void(const std::map< std::uint16_t, bool > &)> onInputMutesChanged
virtual void setControlsSize(const ControlsSize &ctrlsSize)
std::function< void(const std::map< std::uint16_t, std::map< std::uint16_t, float > > &)> onCrosspointValuesChanged
const std::map< std::uint16_t, std::map< std::uint16_t, bool > > & getCrosspointStates()
virtual void addCrosspointStates(const std::map< std::uint16_t, std::map< std::uint16_t, bool > > &crosspointStates)
virtual void setIOCount(const std::pair< int, int > &ioCount)
virtual void setCrosspointStates(const std::map< std::uint16_t, std::map< std::uint16_t, bool > > &crosspointStates)
virtual void setCrosspointValues(const std::map< std::uint16_t, std::map< std::uint16_t, float > > &crosspointValues)
virtual void setInputMuteStates(const std::map< std::uint16_t, bool > &inputMuteStates)
const std::map< std::uint16_t, std::map< std::uint16_t, float > > & getCrosspointValues()
std::function< void(const std::map< std::uint16_t, std::map< std::uint16_t, bool > > &)> onCrosspointStatesChanged
ControlsSize
Size category for rendered control elements.
void handleExternalControlParameter(int objNum, std::uint16_t objType, void *sender=nullptr)
void setChannelConfig(const juce::AudioChannelSet &channelConfiguration)
void processOutputDistances(std::uint16_t channel, const std::map< juce::AudioChannelSet::ChannelType, float > &channelToOutputsDists)
void changeInputPosition(std::uint16_t channel, std::optional< float > xValOpt, std::optional< float > yValOpt, std::optional< float > sharpnessOpt, std::optional< int > layerOpt, juce::NotificationType notification=juce::dontSendNotification)
void setIOCount(const std::pair< int, int > &ioCount) override
void selectInputChannel(std::uint16_t channel)
void setCrosspointStates(const std::map< std::uint16_t, std::map< std::uint16_t, bool > > &crosspointStates) override
void setExternalControlSettings(int ADMOSCPort, const juce::IPAddress &ADMOSCControllerIP, int ADMOSCControllerPort)
void setCrosspointValues(const std::map< std::uint16_t, std::map< std::uint16_t, float > > &crosspointValues) override
void setControlsSize(const ControlsSize &ctrlsSize) override
void setInputMuteStates(const std::map< std::uint16_t, bool > &inputMuteStates) override
const juce::AudioChannelSet & getChannelConfig()
Definition Mema.cpp:27
std::tuple< float, float, float > getParameterVals()
std::tuple< float, float > getParameterVals()