{
open: boolean,
@@ -189,7 +194,43 @@ export const MidiBindingDialog =
let item = v.value;
- let plugin = this.model.getUiPlugin(item.uri);
+ let isSplit = item.uri === "uri://two-play/pipedal/pedalboard#Split";
+ let plugin : UiPlugin | null = this.model.getUiPlugin(item.uri);
+ if (plugin === null && isSplit)
+ {
+ plugin = makeSplitUiPlugin();
+ let splitType = item.getControlValue("splitType");
+ not_null(plugin.getControl("splitType")).not_on_gui = true;
+ switch (splitType)
+ {
+ case 0: // A/B
+ not_null(plugin.getControl("select")).not_on_gui = false;
+ not_null(plugin.getControl("mix")).not_on_gui = true;
+ not_null(plugin.getControl("volL")).not_on_gui = true;
+ not_null(plugin.getControl("panL")).not_on_gui = true;
+ not_null(plugin.getControl("volR")).not_on_gui = true;
+ not_null(plugin.getControl("panR")).not_on_gui = true;
+ break;
+ case 1: //mixer
+ not_null(plugin.getControl("select")).not_on_gui = true;
+ not_null(plugin.getControl("mix")).not_on_gui = false;
+ not_null(plugin.getControl("volL")).not_on_gui = true;
+ not_null(plugin.getControl("panL")).not_on_gui = true;
+ not_null(plugin.getControl("volR")).not_on_gui = true;
+ not_null(plugin.getControl("panR")).not_on_gui = true;
+ break;
+ case 2: // L/R
+ not_null(plugin.getControl("select")).not_on_gui = true;
+ not_null(plugin.getControl("mix")).not_on_gui = true;
+ not_null(plugin.getControl("volL")).not_on_gui = false;
+ not_null(plugin.getControl("panL")).not_on_gui = false;
+ not_null(plugin.getControl("volR")).not_on_gui = false;
+ not_null(plugin.getControl("panR")).not_on_gui = false;
+ break;
+ }
+
+ // xxx
+ }
if (plugin) {
result.push(
@@ -200,29 +241,33 @@ export const MidiBindingDialog =
);
- result.push(
-
- |
-
- Bypass
-
- |
-
- {
- if (instanceId === -2)
- {
- this.cancelListenForControl();
- } else {
- this.handleListenForControl(instanceId, symbol, listenForControl);
- }
- }}
- listen={item.instanceId === this.state.listenInstanceId && this.state.listenSymbol === "__bypass"}
- onChange={(instanceId: number, newItem: MidiBinding) => this.handleItemChanged(instanceId, newItem)}
- />
- |
-
- );
+ if (!isSplit)
+ {
+ result.push(
+
+ |
+
+ Bypass
+
+ |
+
+ {
+ if (instanceId === -2)
+ {
+ this.cancelListenForControl();
+ } else {
+ this.handleListenForControl(instanceId, symbol, listenForControl);
+ }
+ }}
+ listen={item.instanceId === this.state.listenInstanceId && this.state.listenSymbol === "__bypass"}
+ onChange={(instanceId: number, newItem: MidiBinding) => this.handleItemChanged(instanceId, newItem)}
+ />
+ |
+
+ );
+ }
for (let i = 0; i < plugin.controls.length; ++i) {
let control = plugin.controls[i];
@@ -244,6 +289,7 @@ export const MidiBindingDialog =
{
diff --git a/react/src/PiPedalModel.tsx b/react/src/PiPedalModel.tsx
index fe277dd..3b98ccf 100644
--- a/react/src/PiPedalModel.tsx
+++ b/react/src/PiPedalModel.tsx
@@ -423,6 +423,7 @@ export class PiPedalModel //implements PiPedalModel
//if (retry !== 0) {
if (this.restartExpected) {
this.setState(State.ApplyingChanges);
+ this.restartExpected = false;
} else {
this.setState(State.Reconnecting);
}
diff --git a/src/Lv2Pedalboard.cpp b/src/Lv2Pedalboard.cpp
index 038b1d4..129e9b4 100644
--- a/src/Lv2Pedalboard.cpp
+++ b/src/Lv2Pedalboard.cpp
@@ -261,15 +261,15 @@ void Lv2Pedalboard::PrepareMidiMap(const PedalboardItem &pedalboardItem)
{
if (pedalboardItem.midiBindings().size() != 0)
{
- auto pluginInfo = pHost->GetPluginInfo(pedalboardItem.uri());
- const Lv2PluginInfo *pPluginInfo;
- if (pluginInfo == nullptr && pedalboardItem.uri() == SPLIT_PEDALBOARD_ITEM_URI)
+ Lv2PluginInfo::ptr pluginInfo;
+ if (pedalboardItem.uri() == SPLIT_PEDALBOARD_ITEM_URI)
{
- pPluginInfo = GetSplitterPluginInfo();
+ pluginInfo = GetSplitterPluginInfo();
}
else
{
- pPluginInfo = pluginInfo.get();
+ pluginInfo = pHost->GetPluginInfo(pedalboardItem.uri());
+
}
int effectIndex = this->GetIndexOfInstanceId(pedalboardItem.instanceId());
@@ -351,21 +351,10 @@ void Lv2Pedalboard::PrepareMidiMap(const Pedalboard &pedalboard)
auto &item = pedalboard.items()[i];
PrepareMidiMap(item);
- auto pluginInfo = pHost->GetPluginInfo(item.uri());
-
- if (pluginInfo)
- {
- for (size_t bindingIndex = 0; bindingIndex < item.midiBindings().size(); ++bindingIndex)
- {
- auto &binding = item.midiBindings()[i];
- {
- }
- }
- }
- std::sort(this->midiMappings.begin(), this->midiMappings.end(),
- [](const MidiMapping &left, const MidiMapping &right)
- { return left.key < right.key; });
}
+ std::sort(this->midiMappings.begin(), this->midiMappings.end(),
+ [](const MidiMapping &left, const MidiMapping &right)
+ { return left.key < right.key; });
}
void Lv2Pedalboard::Activate()
{
@@ -606,7 +595,7 @@ void Lv2Pedalboard::OnMidiMessage(size_t size, uint8_t *message,
if (size < 3)
return;
index = message[1];
- value = 127;
+ value = message[2] == 0? 0: 127; // zero velocity = note off.
}
else if (cmd == 0xB0) // midi control.
{
diff --git a/src/PiPedalModel.cpp b/src/PiPedalModel.cpp
index cf209d5..a001da1 100644
--- a/src/PiPedalModel.cpp
+++ b/src/PiPedalModel.cpp
@@ -1266,21 +1266,20 @@ void PiPedalModel::OnNotifyMidiValueChanged(int64_t instanceId, int portIndex, f
PedalboardItem *item = this->pedalboard.GetItem(instanceId);
if (item)
{
- const Lv2PluginInfo *pPluginInfo;
+ Lv2PluginInfo::ptr pPluginInfo;
if (item->uri() == SPLIT_PEDALBOARD_ITEM_URI)
{
pPluginInfo = GetSplitterPluginInfo();
}
else
{
- auto pluginInfo = lv2Host.GetPluginInfo(item->uri());
- pPluginInfo = pluginInfo.get();
+ pPluginInfo = lv2Host.GetPluginInfo(item->uri());
}
if (pPluginInfo)
{
if (portIndex == -1)
{
- // bypass!
+ // bypass! yyy this->value!!!
this->pedalboard.SetItemEnabled(instanceId, value != 0);
// take a snapshot incase a client unsusbscribes in the notification handler (in which case the mutex won't protect us)
IPiPedalModelSubscriber **t = new IPiPedalModelSubscriber *[this->subscribers.size()];
@@ -1675,16 +1674,15 @@ void PiPedalModel::SetJackServerSettings(const JackServerSettings &jackServerSet
void PiPedalModel::UpdateDefaults(PedalboardItem *pedalboardItem)
{
- std::shared_ptr t = lv2Host.GetPluginInfo(pedalboardItem->uri());
- const Lv2PluginInfo *pPlugin = t.get();
- if (pPlugin == nullptr)
+ std::shared_ptr pPlugin = lv2Host.GetPluginInfo(pedalboardItem->uri());
+ if (!pPlugin)
{
if (pedalboardItem->uri() == SPLIT_PEDALBOARD_ITEM_URI)
{
pPlugin = GetSplitterPluginInfo();
}
}
- if (pPlugin != nullptr)
+ if (pPlugin)
{
for (size_t i = 0; i < pPlugin->ports().size(); ++i)
{
diff --git a/src/PluginHost.cpp b/src/PluginHost.cpp
index ea74f97..ecdc638 100644
--- a/src/PluginHost.cpp
+++ b/src/PluginHost.cpp
@@ -1353,6 +1353,10 @@ Lv2PortGroup::Lv2PortGroup(PluginHost *lv2Host, const std::string &groupUri)
name_ = nodeAsString(nameNode);
}
+bool Lv2PluginInfo::isSplit() const
+{
+ return uri_ == SPLIT_PEDALBOARD_ITEM_URI;
+}
std::shared_ptr PluginHost::GetHostWorkerThread()
{
return pHostWorkerThread;
diff --git a/src/PluginHost.hpp b/src/PluginHost.hpp
index 9423ff2..29b52e3 100644
--- a/src/PluginHost.hpp
+++ b/src/PluginHost.hpp
@@ -337,8 +337,10 @@ namespace pipedal
friend class PluginHost;
public:
+ using ptr = std::shared_ptr;
Lv2PluginInfo(PluginHost *lv2Host, LilvWorld *pWorld, const LilvPlugin *);
Lv2PluginInfo() {}
+ bool isSplit() const ;
private:
std::shared_ptr FindWritablePathProperties(PluginHost *lv2Host, const LilvPlugin *pPlugin);
diff --git a/src/SplitEffect.cpp b/src/SplitEffect.cpp
index 13ba886..54acba2 100644
--- a/src/SplitEffect.cpp
+++ b/src/SplitEffect.cpp
@@ -33,6 +33,8 @@ static std::shared_ptr MakeBypassPortInfo()
bypassPortInfo->is_input(true);
bypassPortInfo->is_control_port(true);
bypassPortInfo->index(-1);
+
+
bypassPortInfo->min_value(0);
bypassPortInfo->max_value(1);
bypassPortInfo->default_value(1);
@@ -159,9 +161,9 @@ static Lv2PluginInfo makeSplitterPluginInfo()
return result;
}
-Lv2PluginInfo g_splitterPluginInfo = makeSplitterPluginInfo();
+Lv2PluginInfo::ptr g_splitterPluginInfo = std::make_shared(makeSplitterPluginInfo());
-const Lv2PluginInfo *pipedal::GetSplitterPluginInfo() { return &g_splitterPluginInfo; }
+Lv2PluginInfo::ptr pipedal::GetSplitterPluginInfo() { return g_splitterPluginInfo; }
int SplitEffect::GetControlIndex(const std::string &symbol) const
{
diff --git a/src/SplitEffect.hpp b/src/SplitEffect.hpp
index 22384cb..5114213 100644
--- a/src/SplitEffect.hpp
+++ b/src/SplitEffect.hpp
@@ -36,7 +36,7 @@ namespace pipedal
class Lv2PluginInfo;
class Lv2PortInfo;
- const Lv2PluginInfo *GetSplitterPluginInfo();
+ std::shared_ptr GetSplitterPluginInfo();
const Lv2PortInfo *GetBypassPortInfo();
|