Skip to content

Commit

Permalink
Macros - Step one of four (#1090)
Browse files Browse the repository at this point in the history
This is the first step in implementing Macros in ShortCircuit.

This introduces unipolar macros which are only adjustable by a
knob in the UI, but which fully work, are renamable, are editable,
stream, and act as modulation sources.

The remaining parts not covered in this PR are

- Bipolar and Stepped macro support
- Exposing the macros as CLAP parameters
- Implement the PLAY screen not just the macro screen
- Smoothed applicatino as opposed to direct application of value
  from the various sources
  • Loading branch information
baconpaul authored Aug 12, 2024
1 parent 213f6bc commit 46d8902
Show file tree
Hide file tree
Showing 27 changed files with 617 additions and 30 deletions.
1 change: 1 addition & 0 deletions src-ui/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -30,6 +30,7 @@ add_library(${PROJECT_NAME} STATIC
components/multi/PartGroupSidebar.cpp
components/multi/ProcessorPane.cpp
components/multi/ProcessorPaneEQsFilters.cpp
components/multi/SingleMacroEditor.cpp

connectors/SCXTResources.cpp
connectors/JSONLayoutConsumer.cpp
Expand Down
4 changes: 4 additions & 0 deletions src-ui/components/SCXTEditor.h
Original file line number Diff line number Diff line change
Expand Up @@ -213,6 +213,10 @@ struct SCXTEditor : sst::jucegui::components::WindowPanel, juce::DragAndDropCont
allProcessors = v;
}

std::array<std::array<scxt::engine::Macro, scxt::macrosPerPart>, scxt::numParts> macroCache;
void onMacroFullState(const scxt::messaging::client::macroFullState_t &);
void onMacroValue(const scxt::messaging::client::macroValue_t &);

// Originate client to serialization messages
void doSelectionAction(const selection::SelectionManager::ZoneAddress &, bool selecting,
bool distinct, bool asLead);
Expand Down
14 changes: 14 additions & 0 deletions src-ui/components/SCXTEditorResponseHandlers.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -285,6 +285,8 @@ void SCXTEditor::onSelectedPart(const int16_t p)
selectedPart = p; // I presume I will shortly get structure messages so don't do anything else
if (multiScreen && multiScreen->parts)
multiScreen->parts->selectedPartChanged();
if (multiScreen && multiScreen->sample)
multiScreen->sample->selectedPartChanged();

repaint();
}
Expand Down Expand Up @@ -330,4 +332,16 @@ void SCXTEditor::onDebugInfoGenerated(const scxt::messaging::client::debugRespon
SCLOG(k << " " << s);
}
}

void SCXTEditor::onMacroFullState(const scxt::messaging::client::macroFullState_t &s)
{
const auto &[part, index, macro] = s;
macroCache[part][index] = macro;
multiScreen->sample->macroDataChanged(part, index);
}

void SCXTEditor::onMacroValue(const scxt::messaging::client::macroValue_t &)
{
SCLOG_WFUNC("Implement");
}
} // namespace scxt::ui
51 changes: 46 additions & 5 deletions src-ui/components/multi/MappingPane.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -27,6 +27,7 @@

#include "MappingPane.h"
#include "components/SCXTEditor.h"
#include "components/multi/SingleMacroEditor.h"
#include "datamodel/metadata.h"
#include "selection/selection_manager.h"
#include "sst/jucegui/components/DraggableTextEditableValue.h"
Expand All @@ -38,6 +39,7 @@
#include "sst/jucegui/components/GlyphButton.h"
#include "sst/jucegui/components/TabbedComponent.h"
#include "sst/jucegui/components/Viewport.h"
#include "sst/jucegui/components/Knob.h"
#include "connectors/PayloadDataAttachment.h"
#include "messaging/client/client_serial.h"
#include "messaging/client/client_messages.h"
Expand Down Expand Up @@ -2966,12 +2968,45 @@ void SampleWaveform::updateSamplePlaybackPosition(int64_t samplePos)

struct MacroDisplay : HasEditor, juce::Component
{
MacroDisplay(SCXTEditor *e) : HasEditor(e) {}
void paint(juce::Graphics &g)
std::array<std::unique_ptr<SingleMacroEditor>, scxt::macrosPerPart> macros;
MacroDisplay(SCXTEditor *e) : HasEditor(e)
{
g.setColour(editor->themeColor(theme::ColorMap::warning_1a));
g.setFont(editor->themeApplier.interMediumFor(25));
g.drawText("Macro Region Coming Soon", getLocalBounds(), juce::Justification::centred);
for (int i = 0; i < scxt::macrosPerPart; ++i)
{
macros[i] = std::make_unique<SingleMacroEditor>(editor, editor->selectedPart, i);
addAndMakeVisible(*macros[i]);
// grab whatever data we have
macroDataChanged(editor->selectedPart, i);
}
}
void resized() override
{
auto b = getLocalBounds();
auto dx = b.getWidth() / scxt::macrosPerPart * 2;
auto dy = b.getHeight() / 2;
auto kr = b.withWidth(dx).withHeight(dy).reduced(3);
for (int i = 0; i < scxt::macrosPerPart; ++i)
{
macros[i]->setBounds(kr);
kr = kr.translated(dx, 0);
if (i == scxt::macrosPerPart / 2 - 1)
kr = kr.withX(3).translated(0, dy);
}
}

void selectedPartChanged()
{
for (auto &m : macros)
{
m->changePart(editor->selectedPart);
}
repaint();
}

void macroDataChanged(int part, int index)
{
assert(part == editor->selectedPart);
macros[index]->updateFromEditorData();
}
};

Expand Down Expand Up @@ -3059,4 +3094,10 @@ void MappingPane::updateSamplePlaybackPosition(size_t sampleIndex, int64_t sampl
.waveform->updateSamplePlaybackPosition(samplePos);
}

void MappingPane::selectedPartChanged() { macroDisplay->selectedPartChanged(); }
void MappingPane::macroDataChanged(int part, int index)
{
assert(part == editor->selectedPart);
macroDisplay->macroDataChanged(part, index);
}
} // namespace scxt::ui::multi
2 changes: 2 additions & 0 deletions src-ui/components/multi/MappingPane.h
Original file line number Diff line number Diff line change
Expand Up @@ -51,6 +51,8 @@ struct MappingPane : sst::jucegui::components::NamedPanel, HasEditor
void setMappingData(const engine::Zone::ZoneMappingData &);
void setSampleData(const engine::Zone::AssociatedSampleSet &);
void setGroupZoneMappingSummary(const engine::Part::zoneMappingSummary_t &);
void selectedPartChanged();
void macroDataChanged(int part, int index);
void editorSelectionChanged();
void setActive(bool b);

Expand Down
35 changes: 29 additions & 6 deletions src-ui/components/multi/ModPane.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -251,19 +251,32 @@ template <typename GZTrait> struct ModRow : juce::Component, HasEditor
target->setLabel("Target");
curve->setLabel("-");

auto makeSourceName = [](auto &si, auto &sn) {
// This is the second location where we are assuming default macro name
// as mentioned in part.h
auto nm = sn.second;

if (si.gid == 'zmac' || si.gid == 'gmac')
{
auto defname = "Macro " + std::to_string(si.index + 1);
if (nm != defname)
{
nm = "M" + std::to_string(si.index + 1) + ": " + nm;
}
}

return nm;
};

for (const auto &[si, sn] : srcs)
{
if (si == row.source)
{
auto nm = /* sn.first + (sn.first.empty() ? "" : " - ") + */ sn.second;

source->setLabel(nm);
source->setLabel(makeSourceName(si, sn));
}
if (si == row.sourceVia)
{
auto nm = /* sn.first + (sn.first.empty() ? "" : " - ") + */ sn.second;

sourceVia->setLabel(nm);
sourceVia->setLabel(makeSourceName(si, sn));
}
}

Expand Down Expand Up @@ -441,6 +454,16 @@ template <typename GZTrait> struct ModRow : juce::Component, HasEditor
subTicked = true;

auto nm = sn.second;
if (si.gid == 'gmac' || si.gid == 'zmac')
{
// This is where we are assuming default macro name
// from part.h
auto defName = "Macro " + std::to_string(si.index + 1);
if (nm != defName)
{
nm = defName + " (" + nm + ")";
}
}
sub.addItem(nm, true, selected, mkCallback(si));
}

Expand Down
Loading

0 comments on commit 46d8902

Please sign in to comment.