summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorDavid Robillard <d@drobilla.net>2007-07-23 02:33:55 +0000
committerDavid Robillard <d@drobilla.net>2007-07-23 02:33:55 +0000
commite2cfcb6288b000abccb15831e9dde8b8283eb36e (patch)
treecba97a0b17a07d159f169380c7dcf7f7ae97cb1a
parent35541af3f4fdf9e5b934012c01bd2724b00fb7b8 (diff)
downloadingen-e2cfcb6288b000abccb15831e9dde8b8283eb36e.tar.gz
ingen-e2cfcb6288b000abccb15831e9dde8b8283eb36e.tar.bz2
ingen-e2cfcb6288b000abccb15831e9dde8b8283eb36e.zip
Removed glib dependency from LV2 OSC code.
Made LV2 OSC code C++ safe. Preliminary work on OSC patching in Ingen. Added LV2 OSC printing stuff to repository. Broke building Ingen separately. Whatever. git-svn-id: http://svn.drobilla.net/lad/ingen@599 a436a847-0d15-0410-975c-d299462d15a1
-rw-r--r--src/libs/client/PortModel.h1
-rw-r--r--src/libs/engine/BufferFactory.cpp3
-rw-r--r--src/libs/engine/DataType.h13
-rw-r--r--src/libs/engine/Makefile.am5
-rw-r--r--src/libs/engine/OSCBuffer.cpp105
-rw-r--r--src/libs/engine/OSCBuffer.h63
-rw-r--r--src/libs/engine/OSCClientSender.cpp2
-rw-r--r--src/libs/engine/OSCEngineReceiver.cpp2
-rw-r--r--src/libs/engine/ObjectSender.cpp2
-rw-r--r--src/libs/engine/Port.cpp4
-rw-r--r--src/libs/engine/events/AddPortEvent.cpp6
-rw-r--r--src/libs/gui/Configuration.cpp18
-rw-r--r--src/libs/gui/Configuration.h9
-rw-r--r--src/libs/gui/PatchCanvas.cpp8
-rw-r--r--src/libs/gui/PatchCanvas.h2
-rw-r--r--src/libs/gui/ingen_gui.glade932
16 files changed, 698 insertions, 477 deletions
diff --git a/src/libs/client/PortModel.h b/src/libs/client/PortModel.h
index 4dcf5e7f..c19db582 100644
--- a/src/libs/client/PortModel.h
+++ b/src/libs/client/PortModel.h
@@ -49,6 +49,7 @@ public:
inline bool is_audio() const { return (_type == "ingen:audio"); }
inline bool is_control() const { return (_type == "ingen:control"); }
inline bool is_midi() const { return (_type == "ingen:midi"); }
+ inline bool is_osc() const { return (_type == "ingen:osc"); }
bool is_logarithmic() const;
bool is_integer() const;
diff --git a/src/libs/engine/BufferFactory.cpp b/src/libs/engine/BufferFactory.cpp
index f2761f08..48db9261 100644
--- a/src/libs/engine/BufferFactory.cpp
+++ b/src/libs/engine/BufferFactory.cpp
@@ -18,6 +18,7 @@
#include "BufferFactory.h"
#include "AudioBuffer.h"
#include "MidiBuffer.h"
+#include "OSCBuffer.h"
namespace Ingen {
namespace BufferFactory {
@@ -30,6 +31,8 @@ create(DataType type, size_t size)
return new AudioBuffer(size);
else if (type == DataType::MIDI)
return new MidiBuffer(size);
+ else if (type == DataType::OSC)
+ return new OSCBuffer(size);
else
return NULL;
}
diff --git a/src/libs/engine/DataType.h b/src/libs/engine/DataType.h
index 469c48d8..1f431edd 100644
--- a/src/libs/engine/DataType.h
+++ b/src/libs/engine/DataType.h
@@ -33,16 +33,19 @@ public:
enum Symbol {
UNKNOWN = 0,
FLOAT = 1,
- MIDI = 2
+ MIDI = 2,
+ OSC = 3
};
DataType(const std::string& uri)
: _symbol(UNKNOWN)
{
- if (uri == type_uris[MIDI]) {
- _symbol = MIDI;
- } else if (uri == type_uris[FLOAT]) {
+ if (uri == type_uris[FLOAT]) {
_symbol = FLOAT;
+ } else if (uri == type_uris[MIDI]) {
+ _symbol = MIDI;
+ } else if (uri == type_uris[OSC]) {
+ _symbol = OSC;
}
}
@@ -62,7 +65,7 @@ private:
Symbol _symbol;
// Defined in Port.cpp for no good reason
- static const char* const type_uris[3];
+ static const char* const type_uris[4];
};
diff --git a/src/libs/engine/Makefile.am b/src/libs/engine/Makefile.am
index 89dd0735..04353964 100644
--- a/src/libs/engine/Makefile.am
+++ b/src/libs/engine/Makefile.am
@@ -9,6 +9,8 @@ libingen_engine_la_CXXFLAGS = @RAUL_CFLAGS@ @JACK_CFLAGS@ @LOSC_CFLAGS@ @ALSA_CF
libingen_engine_la_LDFLAGS = -no-undefined -module -avoid-version
libingen_engine_la_LIBADD = @RAUL_LIBS@ @JACK_LIBS@ @LOSC_LIBS@ @ALSA_LIBS@ @LASH_LIBS@ @SLV2_LIBS@
+AM_CFLAGS="-std=c99"
+
libingen_engine_la_SOURCES = \
engine.h \
engine.cpp \
@@ -45,6 +47,9 @@ libingen_engine_la_SOURCES = \
AudioBuffer.cpp \
MidiBuffer.h \
MidiBuffer.cpp \
+ OSCBuffer.h \
+ OSCBuffer.cpp \
+ ../../../../lv2/extensions/osc/lv2_osc.c \
BufferFactory.h \
BufferFactory.cpp \
Port.h \
diff --git a/src/libs/engine/OSCBuffer.cpp b/src/libs/engine/OSCBuffer.cpp
new file mode 100644
index 00000000..75201a30
--- /dev/null
+++ b/src/libs/engine/OSCBuffer.cpp
@@ -0,0 +1,105 @@
+/* This file is part of Ingen.
+ * Copyright (C) 2007 Dave Robillard <http://drobilla.net>
+ *
+ * Ingen 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 2 of the License, or (at your option) any later
+ * version.
+ *
+ * Ingen 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 details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
+ */
+
+#include <iostream>
+#include "OSCBuffer.h"
+
+using namespace std;
+
+namespace Ingen {
+
+OSCBuffer::OSCBuffer(size_t capacity)
+ : Buffer(DataType(DataType::OSC), capacity)
+ , _buf(lv2_osc_buffer_new((uint32_t)capacity))
+ , _joined_buf(NULL)
+{
+ /*_local_state.midi = _buf;
+ _state = &_local_state;
+ assert(_local_state.midi);
+ reset(0);
+ clear();
+ assert(_local_state.midi == _buf);
+*/
+ //cerr << "Creating OSC Buffer " << _buf << ", capacity = " << _buf->capacity << endl;
+}
+
+
+
+/** Use another buffer's data instead of the local one.
+ *
+ * This buffer will essentially be identical to @a buf after this call.
+ */
+bool
+OSCBuffer::join(Buffer* buf)
+{
+ OSCBuffer* mbuf = dynamic_cast<OSCBuffer*>(buf);
+ if (!mbuf)
+ return false;
+
+ //assert(mbuf->size() == _size);
+
+ _joined_buf = mbuf;
+
+ //_state = mbuf->_state;
+
+ return true;
+}
+
+
+void
+OSCBuffer::unjoin()
+{
+ _joined_buf = NULL;
+ //_state = &_local_state;
+ //_state->midi = _buf;
+
+ clear();
+ reset(_this_nframes);
+}
+
+
+bool
+OSCBuffer::is_joined_to(Buffer* buf) const
+{
+ OSCBuffer* mbuf = dynamic_cast<OSCBuffer*>(buf);
+ if (mbuf)
+ return (data() == mbuf->data());
+
+ return false;
+}
+
+
+void
+OSCBuffer::prepare_read(SampleCount nframes)
+{
+ assert(!_joined_buf || data() == _joined_buf->data());
+
+ reset(nframes);
+}
+
+
+void
+OSCBuffer::prepare_write(SampleCount nframes)
+{
+ clear();
+ reset(nframes);
+
+ assert(!_joined_buf || data() == _joined_buf->data());
+}
+
+
+} // namespace Ingen
diff --git a/src/libs/engine/OSCBuffer.h b/src/libs/engine/OSCBuffer.h
new file mode 100644
index 00000000..53e3b2d5
--- /dev/null
+++ b/src/libs/engine/OSCBuffer.h
@@ -0,0 +1,63 @@
+/* This file is part of Ingen.
+ * Copyright (C) 2007 Dave Robillard <http://drobilla.net>
+ *
+ * Ingen 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 2 of the License, or (at your option) any later
+ * version.
+ *
+ * Ingen 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 details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
+ */
+
+#ifndef OSCBUFFER_H
+#define OSCBUFFER_H
+
+#include "Buffer.h"
+#include "DataType.h"
+#include "../../../../lv2/extensions/osc/lv2_osc.h"
+
+namespace Ingen {
+
+
+class OSCBuffer : public Buffer {
+public:
+ OSCBuffer(size_t capacity);
+
+ ~OSCBuffer() { }
+
+ void clear() { lv2_osc_buffer_clear(_buf); }
+ void reset(SampleCount nframs) {}
+
+ void prepare_read(SampleCount nframes);
+ void prepare_write(SampleCount nframes);
+
+ bool is_joined_to(Buffer* buf) const;
+ bool join(Buffer* buf);
+ void unjoin();
+
+ uint32_t this_nframes() const { return _this_nframes; }
+
+ inline LV2OSCBuffer* data()
+ { return ((_joined_buf != NULL) ? _joined_buf->data() : _buf); }
+
+ inline const LV2OSCBuffer* data() const
+ { return ((_joined_buf != NULL) ? _joined_buf->data() : _buf); }
+
+private:
+ LV2OSCBuffer* const _buf;
+
+ OSCBuffer* _joined_buf; ///< Buffer to mirror, if joined
+
+ uint32_t _this_nframes;
+};
+
+
+} // namespace Ingen
+
+#endif // OSCBUFFER_H
diff --git a/src/libs/engine/OSCClientSender.cpp b/src/libs/engine/OSCClientSender.cpp
index a20efea4..c3f0f330 100644
--- a/src/libs/engine/OSCClientSender.cpp
+++ b/src/libs/engine/OSCClientSender.cpp
@@ -338,7 +338,7 @@ void OSCClientSender::new_node(string plugin_uri,
/** \page client_osc_namespace
* <p> \b /ingen/new_port - Notification of a new port's creation.
* \arg \b path (string) - Path of new port
- * \arg \b data-type (string) - Type of port (ingen:audio, ingen:control, or ingen:midi)
+ * \arg \b data-type (string) - Type of port (ingen:audio, ingen:control, ingen:midi, or ingen:osc)
* \arg \b direction ("is-output") (integer) - Direction of data flow (Input = 0, Output = 1)
*
* \li Note that in the event of loading a patch, this message could be
diff --git a/src/libs/engine/OSCEngineReceiver.cpp b/src/libs/engine/OSCEngineReceiver.cpp
index 6a4ce9ae..7bc336c2 100644
--- a/src/libs/engine/OSCEngineReceiver.cpp
+++ b/src/libs/engine/OSCEngineReceiver.cpp
@@ -480,7 +480,7 @@ OSCEngineReceiver::_clear_patch_cb(const char* path, const char* types, lo_arg**
* <p> \b /ingen/create_port - Add a port into a given patch (load a plugin by URI)
* \arg \b response-id (integer)
* \arg \b path (string) - Full path of the new port (ie. /patch2/subpatch/newport)
- * \arg \b data-type (string) - Data type for port to contain ("ingen:audio", "ingen:control", or "ingen:midi")
+ * \arg \b data-type (string) - Data type for port to contain ("ingen:audio", "ingen:control", "ingen:midi", or "ingen:osc")
* \arg \b direction ("is-output") (integer) - Direction of data flow (Input = 0, Output = 1) </p> \n \n
*/
int
diff --git a/src/libs/engine/ObjectSender.cpp b/src/libs/engine/ObjectSender.cpp
index 608d1768..592f4735 100644
--- a/src/libs/engine/ObjectSender.cpp
+++ b/src/libs/engine/ObjectSender.cpp
@@ -131,6 +131,8 @@ ObjectSender::send_port(ClientInterface* client, const Port* port)
type = "ingen:audio";
} else if (port->type() == DataType::MIDI) {
type = "ingen:midi";
+ } else if (port->type() == DataType::OSC) {
+ type = "ingen:osc";
}
//cerr << ", type = " << type << endl;
diff --git a/src/libs/engine/Port.cpp b/src/libs/engine/Port.cpp
index bfb09a35..f82da743 100644
--- a/src/libs/engine/Port.cpp
+++ b/src/libs/engine/Port.cpp
@@ -24,8 +24,8 @@
namespace Ingen {
-// Yeah, this shouldn't be here.
-const char* const DataType::type_uris[3] = { "UNKNOWN", "FLOAT", "MIDI" };
+// FIXME: Make these actually URIs..
+const char* const DataType::type_uris[4] = { "UNKNOWN", "FLOAT", "MIDI", "OSC" };
Port::Port(Node* const node, const string& name, size_t index, size_t poly, DataType type, size_t buffer_size)
diff --git a/src/libs/engine/events/AddPortEvent.cpp b/src/libs/engine/events/AddPortEvent.cpp
index b1925b07..82cd4ded 100644
--- a/src/libs/engine/events/AddPortEvent.cpp
+++ b/src/libs/engine/events/AddPortEvent.cpp
@@ -68,6 +68,8 @@ AddPortEvent::AddPortEvent(Engine& engine,
_data_type = DataType::FLOAT;
else if (type == "ingen:midi")
_data_type = DataType::MIDI;
+ else if (type == "ingen:osc")
+ _data_type = DataType::OSC;
}
@@ -87,7 +89,7 @@ AddPortEvent::pre_process()
assert(_patch->path() == _path.parent());
size_t buffer_size = 1;
- if (_type == "ingen:audio" || _type == "ingen:midi")
+ if (_type != "ingen:control")
buffer_size = _engine.audio_driver()->buffer_size();
const size_t old_num_ports = _patch->num_ports();
@@ -145,6 +147,8 @@ AddPortEvent::execute(SampleCount nframes, FrameTime start, FrameTime end)
_engine.audio_driver()->add_port(_driver_port);
else if (_type == "ingen:midi")
_engine.midi_driver()->add_port(_driver_port);
+ else if (_type == "ingen:osc")
+ cerr << "OSC DRIVER PORT" << endl;
}
diff --git a/src/libs/gui/Configuration.cpp b/src/libs/gui/Configuration.cpp
index 663a813d..72ea5cb5 100644
--- a/src/libs/gui/Configuration.cpp
+++ b/src/libs/gui/Configuration.cpp
@@ -38,10 +38,12 @@ using namespace Ingen::Client;
Configuration::Configuration()
-: _patch_path("/usr/share/ingen/patches:/usr/local/share/ingen/patches"),
- _audio_port_color( 0x394f66B0),
- _control_port_color(0x396639B0),
- _midi_port_color( 0x663939B0)
+ : _patch_path("/usr/share/ingen/patches:/usr/local/share/ingen/patches")
+ // Agave FTW
+ , _audio_port_color( 0x0D597FFF)
+ , _control_port_color(0x2F7F0DFF)
+ , _midi_port_color( 0x7F240DFF)
+ , _osc_port_color( 0x5D0D7FFF)
{
}
@@ -140,7 +142,7 @@ Configuration::apply_settings()
}
-int
+uint32_t
Configuration::get_port_color(const PortModel* pi)
{
assert(pi != NULL);
@@ -151,9 +153,13 @@ Configuration::get_port_color(const PortModel* pi)
return _audio_port_color;
} else if (pi->is_midi()) {
return _midi_port_color;
+ } else if (pi->is_osc()) {
+ return _osc_port_color;
}
- cerr << "[Configuration] Unknown port type! Port will be bright red, this is an error." << endl;
+ cerr << "[Configuration] Unknown port type " << pi->type() << ", port will appear bright red."
+ << endl;
+
return 0xFF0000B0;
}
diff --git a/src/libs/gui/Configuration.h b/src/libs/gui/Configuration.h
index b1a861cb..9f7cbb08 100644
--- a/src/libs/gui/Configuration.h
+++ b/src/libs/gui/Configuration.h
@@ -56,7 +56,7 @@ public:
const string& patch_folder() { return _patch_folder; }
void set_patch_folder(const string& f) { _patch_folder = f; }
- int get_port_color(const PortModel* pi);
+ uint32_t get_port_color(const PortModel* pi);
private:
/** Search path for patch files. Colon delimited, as usual. */
@@ -65,9 +65,10 @@ private:
/** Most recent patch folder shown in open dialog */
string _patch_folder;
- int _audio_port_color;
- int _control_port_color;
- int _midi_port_color;
+ uint32_t _audio_port_color;
+ uint32_t _control_port_color;
+ uint32_t _midi_port_color;
+ uint32_t _osc_port_color;
};
diff --git a/src/libs/gui/PatchCanvas.cpp b/src/libs/gui/PatchCanvas.cpp
index 4808c288..f37b81c5 100644
--- a/src/libs/gui/PatchCanvas.cpp
+++ b/src/libs/gui/PatchCanvas.cpp
@@ -60,6 +60,8 @@ PatchCanvas::PatchCanvas(SharedPtr<PatchModel> patch, int width, int height)
xml->get_widget("canvas_menu_add_control_output", _menu_add_control_output);
xml->get_widget("canvas_menu_add_midi_input", _menu_add_midi_input);
xml->get_widget("canvas_menu_add_midi_output", _menu_add_midi_output);
+ xml->get_widget("canvas_menu_add_osc_input", _menu_add_osc_input);
+ xml->get_widget("canvas_menu_add_osc_output", _menu_add_osc_output);
xml->get_widget("canvas_menu_load_plugin", _menu_load_plugin);
xml->get_widget("canvas_menu_load_patch", _menu_load_patch);
xml->get_widget("canvas_menu_new_patch", _menu_new_patch);
@@ -83,6 +85,12 @@ PatchCanvas::PatchCanvas(SharedPtr<PatchModel> patch, int width, int height)
_menu_add_midi_output->signal_activate().connect(
sigc::bind(sigc::mem_fun(this, &PatchCanvas::menu_add_port),
"midi_output", "ingen:midi", true));
+ _menu_add_osc_input->signal_activate().connect(
+ sigc::bind(sigc::mem_fun(this, &PatchCanvas::menu_add_port),
+ "osc_input", "ingen:osc", false));
+ _menu_add_osc_output->signal_activate().connect(
+ sigc::bind(sigc::mem_fun(this, &PatchCanvas::menu_add_port),
+ "osc_output", "ingen:osc", true));
build_plugin_menu();
diff --git a/src/libs/gui/PatchCanvas.h b/src/libs/gui/PatchCanvas.h
index 275d6209..da33142b 100644
--- a/src/libs/gui/PatchCanvas.h
+++ b/src/libs/gui/PatchCanvas.h
@@ -117,6 +117,8 @@ private:
Gtk::MenuItem* _menu_add_control_output;
Gtk::MenuItem* _menu_add_midi_input;
Gtk::MenuItem* _menu_add_midi_output;
+ Gtk::MenuItem* _menu_add_osc_input;
+ Gtk::MenuItem* _menu_add_osc_output;
Gtk::MenuItem* _menu_load_plugin;
Gtk::MenuItem* _menu_load_patch;
Gtk::MenuItem* _menu_new_patch;
diff --git a/src/libs/gui/ingen_gui.glade b/src/libs/gui/ingen_gui.glade
index e0777069..994f456a 100644
--- a/src/libs/gui/ingen_gui.glade
+++ b/src/libs/gui/ingen_gui.glade
@@ -481,53 +481,62 @@
<property name="n_columns">3</property>
<property name="row_spacing">12</property>
<child>
- <widget class="GtkLabel" id="label66">
+ <widget class="GtkButton" id="load_plugin_clear_button">
<property name="visible">True</property>
- <property name="xalign">1</property>
- <property name="label" translatable="yes">Node Name:</property>
- <property name="use_markup">True</property>
+ <property name="can_focus">True</property>
+ <property name="tooltip" translatable="yes">Clear filter text (show all plugins)</property>
+ <property name="label">gtk-clear</property>
+ <property name="use_stock">True</property>
+ <property name="response_id">0</property>
</widget>
<packing>
- <property name="top_attach">2</property>
- <property name="bottom_attach">3</property>
+ <property name="left_attach">2</property>
+ <property name="right_attach">3</property>
<property name="x_options">GTK_FILL</property>
<property name="y_options"></property>
</packing>
</child>
<child>
- <widget class="GtkHSeparator" id="hseparator1">
+ <widget class="GtkComboBox" id="load_plugin_filter_combo">
<property name="visible">True</property>
+ <property name="items" translatable="yes">Name contains: </property>
</widget>
<packing>
- <property name="left_attach">1</property>
- <property name="right_attach">2</property>
- <property name="top_attach">1</property>
- <property name="bottom_attach">2</property>
<property name="x_options">GTK_FILL</property>
+ <property name="y_options"></property>
</packing>
</child>
<child>
- <widget class="GtkHSeparator" id="hseparator2">
+ <widget class="GtkEntry" id="load_plugin_search_entry">
<property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="has_focus">True</property>
+ <property name="tooltip" translatable="yes">Search string to filter plugin list</property>
+ <property name="invisible_char">*</property>
</widget>
<packing>
- <property name="top_attach">1</property>
- <property name="bottom_attach">2</property>
- <property name="x_options">GTK_FILL</property>
- <property name="y_options">GTK_FILL</property>
+ <property name="left_attach">1</property>
+ <property name="right_attach">2</property>
+ <property name="x_padding">6</property>
</packing>
</child>
<child>
- <widget class="GtkHSeparator" id="hseparator3">
+ <widget class="GtkButton" id="load_plugin_add_button">
<property name="visible">True</property>
+ <property name="sensitive">False</property>
+ <property name="can_focus">True</property>
+ <property name="tooltip" translatable="yes">Add selected plugin to patch</property>
+ <property name="label">gtk-add</property>
+ <property name="use_stock">True</property>
+ <property name="response_id">0</property>
</widget>
<packing>
<property name="left_attach">2</property>
<property name="right_attach">3</property>
- <property name="top_attach">1</property>
- <property name="bottom_attach">2</property>
+ <property name="top_attach">2</property>
+ <property name="bottom_attach">3</property>
<property name="x_options">GTK_FILL</property>
- <property name="y_options">GTK_FILL</property>
+ <property name="y_options"></property>
</packing>
</child>
<child>
@@ -570,60 +579,51 @@
</packing>
</child>
<child>
- <widget class="GtkButton" id="load_plugin_add_button">
+ <widget class="GtkHSeparator" id="hseparator3">
<property name="visible">True</property>
- <property name="sensitive">False</property>
- <property name="can_focus">True</property>
- <property name="tooltip" translatable="yes">Add selected plugin to patch</property>
- <property name="label">gtk-add</property>
- <property name="use_stock">True</property>
- <property name="response_id">0</property>
</widget>
<packing>
<property name="left_attach">2</property>
<property name="right_attach">3</property>
- <property name="top_attach">2</property>
- <property name="bottom_attach">3</property>
+ <property name="top_attach">1</property>
+ <property name="bottom_attach">2</property>
<property name="x_options">GTK_FILL</property>
- <property name="y_options"></property>
+ <property name="y_options">GTK_FILL</property>
</packing>
</child>
<child>
- <widget class="GtkEntry" id="load_plugin_search_entry">
+ <widget class="GtkHSeparator" id="hseparator2">
<property name="visible">True</property>
- <property name="can_focus">True</property>
- <property name="has_focus">True</property>
- <property name="tooltip" translatable="yes">Search string to filter plugin list</property>
- <property name="invisible_char">*</property>
</widget>
<packing>
- <property name="left_attach">1</property>
- <property name="right_attach">2</property>
- <property name="x_padding">6</property>
+ <property name="top_attach">1</property>
+ <property name="bottom_attach">2</property>
+ <property name="x_options">GTK_FILL</property>
+ <property name="y_options">GTK_FILL</property>
</packing>
</child>
<child>
- <widget class="GtkComboBox" id="load_plugin_filter_combo">
+ <widget class="GtkHSeparator" id="hseparator1">
<property name="visible">True</property>
- <property name="items" translatable="yes">Name contains: </property>
</widget>
<packing>
+ <property name="left_attach">1</property>
+ <property name="right_attach">2</property>
+ <property name="top_attach">1</property>
+ <property name="bottom_attach">2</property>
<property name="x_options">GTK_FILL</property>
- <property name="y_options"></property>
</packing>
</child>
<child>
- <widget class="GtkButton" id="load_plugin_clear_button">
+ <widget class="GtkLabel" id="label66">
<property name="visible">True</property>
- <property name="can_focus">True</property>
- <property name="tooltip" translatable="yes">Clear filter text (show all plugins)</property>
- <property name="label">gtk-clear</property>
- <property name="use_stock">True</property>
- <property name="response_id">0</property>
+ <property name="xalign">1</property>
+ <property name="label" translatable="yes">Node Name:</property>
+ <property name="use_markup">True</property>
</widget>
<packing>
- <property name="left_attach">2</property>
- <property name="right_attach">3</property>
+ <property name="top_attach">2</property>
+ <property name="bottom_attach">3</property>
<property name="x_options">GTK_FILL</property>
<property name="y_options"></property>
</packing>
@@ -654,61 +654,61 @@
<property name="n_rows">2</property>
<property name="n_columns">2</property>
<child>
- <widget class="GtkLabel" id="label8">
+ <widget class="GtkEntry" id="new_subpatch_name_entry">
<property name="visible">True</property>
- <property name="xalign">0</property>
- <property name="label" translatable="yes">Name: </property>
+ <property name="can_focus">True</property>
+ <property name="has_focus">True</property>
+ <property name="invisible_char">*</property>
+ <property name="activates_default">True</property>
</widget>
<packing>
- <property name="x_options">GTK_FILL</property>
- <property name="y_options">GTK_EXPAND</property>
- <property name="x_padding">5</property>
+ <property name="left_attach">1</property>
+ <property name="right_attach">2</property>
+ <property name="y_options"></property>
+ <property name="y_padding">4</property>
</packing>
</child>
<child>
- <widget class="GtkLabel" id="label9">
+ <widget class="GtkSpinButton" id="new_subpatch_polyphony_spinbutton">
<property name="visible">True</property>
- <property name="xalign">0</property>
- <property name="label" translatable="yes">Polyphony: </property>
+ <property name="can_focus">True</property>
+ <property name="adjustment">1 0 100 1 10 10</property>
+ <property name="climb_rate">1</property>
</widget>
<packing>
+ <property name="left_attach">1</property>
+ <property name="right_attach">2</property>
<property name="top_attach">1</property>
<property name="bottom_attach">2</property>
<property name="x_options">GTK_FILL</property>
- <property name="y_options">GTK_EXPAND</property>
- <property name="x_padding">5</property>
+ <property name="y_options"></property>
+ <property name="y_padding">4</property>
</packing>
</child>
<child>
- <widget class="GtkSpinButton" id="new_subpatch_polyphony_spinbutton">
+ <widget class="GtkLabel" id="label9">
<property name="visible">True</property>
- <property name="can_focus">True</property>
- <property name="adjustment">1 0 100 1 10 10</property>
- <property name="climb_rate">1</property>
+ <property name="xalign">0</property>
+ <property name="label" translatable="yes">Polyphony: </property>
</widget>
<packing>
- <property name="left_attach">1</property>
- <property name="right_attach">2</property>
<property name="top_attach">1</property>
<property name="bottom_attach">2</property>
<property name="x_options">GTK_FILL</property>
- <property name="y_options"></property>
- <property name="y_padding">4</property>
+ <property name="y_options">GTK_EXPAND</property>
+ <property name="x_padding">5</property>
</packing>
</child>
<child>
- <widget class="GtkEntry" id="new_subpatch_name_entry">
+ <widget class="GtkLabel" id="label8">
<property name="visible">True</property>
- <property name="can_focus">True</property>
- <property name="has_focus">True</property>
- <property name="invisible_char">*</property>
- <property name="activates_default">True</property>
+ <property name="xalign">0</property>
+ <property name="label" translatable="yes">Name: </property>
</widget>
<packing>
- <property name="left_attach">1</property>
- <property name="right_attach">2</property>
- <property name="y_options"></property>
- <property name="y_padding">4</property>
+ <property name="x_options">GTK_FILL</property>
+ <property name="y_options">GTK_EXPAND</property>
+ <property name="x_padding">5</property>
</packing>
</child>
</widget>
@@ -810,63 +810,71 @@
<property name="column_spacing">12</property>
<property name="row_spacing">4</property>
<child>
- <widget class="GtkLabel" id="label79">
+ <widget class="GtkHBox" id="hbox45">
<property name="visible">True</property>
- <property name="xalign">0</property>
- <property name="label" translatable="yes">&lt;b&gt;Name: &lt;/b&gt;</property>
- <property name="use_markup">True</property>
+ <child>
+ <widget class="GtkRadioButton" id="load_subpatch_name_from_user_radio">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="tooltip" translatable="yes">Specify the name for the new patch</property>
+ <property name="label" translatable="yes">Specify: </property>
+ <property name="use_underline">True</property>
+ <property name="response_id">0</property>
+ <property name="draw_indicator">True</property>
+ <property name="group">load_subpatch_name_from_file_radio</property>
+ </widget>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ </packing>
+ </child>
+ <child>
+ <widget class="GtkEntry" id="load_subpatch_name_entry">
+ <property name="visible">True</property>
+ <property name="sensitive">False</property>
+ <property name="can_focus">True</property>
+ <property name="tooltip" translatable="yes">Specify the name for the new patch</property>
+ <property name="invisible_char">*</property>
+ <property name="activates_default">True</property>
+ </widget>
+ <packing>
+ <property name="expand">False</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
</widget>
<packing>
- <property name="x_options">GTK_FILL</property>
- <property name="y_options"></property>
+ <property name="left_attach">3</property>
+ <property name="right_attach">4</property>
+ <property name="y_options">GTK_FILL</property>
</packing>
</child>
<child>
- <widget class="GtkLabel" id="label80">
+ <widget class="GtkLabel" id="label104">
<property name="visible">True</property>
<property name="xalign">0</property>
- <property name="label" translatable="yes">&lt;b&gt;Polyphony: &lt;/b&gt;</property>
- <property name="use_markup">True</property>
- </widget>
- <packing>
- <property name="top_attach">1</property>
- <property name="bottom_attach">2</property>
- <property name="x_options">GTK_FILL</property>
- <property name="y_options"></property>
- </packing>
- </child>
- <child>
- <widget class="GtkRadioButton" id="load_subpatch_name_from_file_radio">
- <property name="visible">True</property>
- <property name="can_focus">True</property>
- <property name="tooltip" translatable="yes">Use the name stored in the patch file</property>
- <property name="label" translatable="yes">Load from file</property>
- <property name="use_underline">True</property>
- <property name="response_id">0</property>
- <property name="active">True</property>
- <property name="draw_indicator">True</property>
</widget>
<packing>
- <property name="left_attach">1</property>
- <property name="right_attach">2</property>
+ <property name="left_attach">2</property>
+ <property name="right_attach">3</property>
<property name="x_options">GTK_FILL</property>
<property name="y_options"></property>
</packing>
</child>
<child>
- <widget class="GtkRadioButton" id="load_subpatch_poly_from_file_radio">
+ <widget class="GtkRadioButton" id="load_subpatch_poly_from_parent_radio">
<property name="visible">True</property>
<property name="can_focus">True</property>
- <property name="tooltip" translatable="yes">Use the polyphony value stored in the patch file</property>
- <property name="label" translatable="yes">Load from file</property>
+ <property name="tooltip" translatable="yes">Set polyphony to the same value as the parent (containing) patch</property>
+ <property name="label" translatable="yes">Same as parent (?)</property>
<property name="use_underline">True</property>
<property name="response_id">0</property>
- <property name="active">True</property>
<property name="draw_indicator">True</property>
+ <property name="group">load_subpatch_poly_from_file_radio</property>
</widget>
<packing>
- <property name="left_attach">1</property>
- <property name="right_attach">2</property>
+ <property name="left_attach">2</property>
+ <property name="right_attach">3</property>
<property name="top_attach">1</property>
<property name="bottom_attach">2</property>
<property name="x_options">GTK_FILL</property>
@@ -917,19 +925,19 @@
</packing>
</child>
<child>
- <widget class="GtkRadioButton" id="load_subpatch_poly_from_parent_radio">
+ <widget class="GtkRadioButton" id="load_subpatch_poly_from_file_radio">
<property name="visible">True</property>
<property name="can_focus">True</property>
- <property name="tooltip" translatable="yes">Set polyphony to the same value as the parent (containing) patch</property>
- <property name="label" translatable="yes">Same as parent (?)</property>
+ <property name="tooltip" translatable="yes">Use the polyphony value stored in the patch file</property>
+ <property name="label" translatable="yes">Load from file</property>
<property name="use_underline">True</property>
<property name="response_id">0</property>
+ <property name="active">True</property>
<property name="draw_indicator">True</property>
- <property name="group">load_subpatch_poly_from_file_radio</property>
</widget>
<packing>
- <property name="left_attach">2</property>
- <property name="right_attach">3</property>
+ <property name="left_attach">1</property>
+ <property name="right_attach">2</property>
<property name="top_attach">1</property>
<property name="bottom_attach">2</property>
<property name="x_options">GTK_FILL</property>
@@ -937,55 +945,47 @@
</packing>
</child>
<child>
- <widget class="GtkLabel" id="label104">
+ <widget class="GtkRadioButton" id="load_subpatch_name_from_file_radio">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="tooltip" translatable="yes">Use the name stored in the patch file</property>
+ <property name="label" translatable="yes">Load from file</property>
+ <property name="use_underline">True</property>
+ <property name="response_id">0</property>
+ <property name="active">True</property>
+ <property name="draw_indicator">True</property>
+ </widget>
+ <packing>
+ <property name="left_attach">1</property>
+ <property name="right_attach">2</property>
+ <property name="x_options">GTK_FILL</property>
+ <property name="y_options"></property>
+ </packing>
+ </child>
+ <child>
+ <widget class="GtkLabel" id="label80">
<property name="visible">True</property>
<property name="xalign">0</property>
+ <property name="label" translatable="yes">&lt;b&gt;Polyphony: &lt;/b&gt;</property>
+ <property name="use_markup">True</property>
</widget>
<packing>
- <property name="left_attach">2</property>
- <property name="right_attach">3</property>
+ <property name="top_attach">1</property>
+ <property name="bottom_attach">2</property>
<property name="x_options">GTK_FILL</property>
<property name="y_options"></property>
</packing>
</child>
<child>
- <widget class="GtkHBox" id="hbox45">
+ <widget class="GtkLabel" id="label79">
<property name="visible">True</property>
- <child>
- <widget class="GtkRadioButton" id="load_subpatch_name_from_user_radio">
- <property name="visible">True</property>
- <property name="can_focus">True</property>
- <property name="tooltip" translatable="yes">Specify the name for the new patch</property>
- <property name="label" translatable="yes">Specify: </property>
- <property name="use_underline">True</property>
- <property name="response_id">0</property>
- <property name="draw_indicator">True</property>
- <property name="group">load_subpatch_name_from_file_radio</property>
- </widget>
- <packing>
- <property name="expand">False</property>
- <property name="fill">False</property>
- </packing>
- </child>
- <child>
- <widget class="GtkEntry" id="load_subpatch_name_entry">
- <property name="visible">True</property>
- <property name="sensitive">False</property>
- <property name="can_focus">True</property>
- <property name="tooltip" translatable="yes">Specify the name for the new patch</property>
- <property name="invisible_char">*</property>
- <property name="activates_default">True</property>
- </widget>
- <packing>
- <property name="expand">False</property>
- <property name="position">1</property>
- </packing>
- </child>
+ <property name="xalign">0</property>
+ <property name="label" translatable="yes">&lt;b&gt;Name: &lt;/b&gt;</property>
+ <property name="use_markup">True</property>
</widget>
<packing>
- <property name="left_attach">3</property>
- <property name="right_attach">4</property>
- <property name="y_options">GTK_FILL</property>
+ <property name="x_options">GTK_FILL</property>
+ <property name="y_options"></property>
</packing>
</child>
</widget>
@@ -1047,54 +1047,6 @@
<property name="column_spacing">12</property>
<property name="row_spacing">4</property>
<child>
- <widget class="GtkLabel" id="label123">
- <property name="visible">True</property>
- <property name="xalign">0</property>
- <property name="label" translatable="yes">&lt;b&gt;Polyphony: &lt;/b&gt;</property>
- <property name="use_markup">True</property>
- </widget>
- <packing>
- <property name="x_options">GTK_FILL</property>
- <property name="y_options"></property>
- </packing>
- </child>
- <child>
- <widget class="GtkRadioButton" id="load_patch_poly_from_current_radio">
- <property name="visible">True</property>
- <property name="can_focus">True</property>
- <property name="tooltip" translatable="yes">Use the same polyphony as the current patch</property>
- <property name="label" translatable="yes">Keep current</property>
- <property name="use_underline">True</property>
- <property name="response_id">0</property>
- <property name="active">True</property>
- <property name="draw_indicator">True</property>
- </widget>
- <packing>
- <property name="left_attach">1</property>
- <property name="right_attach">2</property>
- <property name="x_options">GTK_FILL</property>
- <property name="y_options"></property>
- </packing>
- </child>
- <child>
- <widget class="GtkRadioButton" id="load_patch_poly_from_file_radio">
- <property name="visible">True</property>
- <property name="can_focus">True</property>
- <property name="tooltip" translatable="yes">Use the polyphony value stored in the patch file</property>
- <property name="label" translatable="yes">Load from file</property>
- <property name="use_underline">True</property>
- <property name="response_id">0</property>
- <property name="draw_indicator">True</property>
- <property name="group">load_patch_poly_from_current_radio</property>
- </widget>
- <packing>
- <property name="left_attach">2</property>
- <property name="right_attach">3</property>
- <property name="x_options">GTK_FILL</property>
- <property name="y_options"></property>
- </packing>
- </child>
- <child>
<widget class="GtkHBox" id="hbox58">
<property name="visible">True</property>
<child>
@@ -1134,6 +1086,54 @@
<property name="y_options">GTK_FILL</property>
</packing>
</child>
+ <child>
+ <widget class="GtkRadioButton" id="load_patch_poly_from_file_radio">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="tooltip" translatable="yes">Use the polyphony value stored in the patch file</property>
+ <property name="label" translatable="yes">Load from file</property>
+ <property name="use_underline">True</property>
+ <property name="response_id">0</property>
+ <property name="draw_indicator">True</property>
+ <property name="group">load_patch_poly_from_current_radio</property>
+ </widget>
+ <packing>
+ <property name="left_attach">2</property>
+ <property name="right_attach">3</property>
+ <property name="x_options">GTK_FILL</property>
+ <property name="y_options"></property>
+ </packing>
+ </child>
+ <child>
+ <widget class="GtkRadioButton" id="load_patch_poly_from_current_radio">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="tooltip" translatable="yes">Use the same polyphony as the current patch</property>
+ <property name="label" translatable="yes">Keep current</property>
+ <property name="use_underline">True</property>
+ <property name="response_id">0</property>
+ <property name="active">True</property>
+ <property name="draw_indicator">True</property>
+ </widget>
+ <packing>
+ <property name="left_attach">1</property>
+ <property name="right_attach">2</property>
+ <property name="x_options">GTK_FILL</property>
+ <property name="y_options"></property>
+ </packing>
+ </child>
+ <child>
+ <widget class="GtkLabel" id="label123">
+ <property name="visible">True</property>
+ <property name="xalign">0</property>
+ <property name="label" translatable="yes">&lt;b&gt;Polyphony: &lt;/b&gt;</property>
+ <property name="use_markup">True</property>
+ </widget>
+ <packing>
+ <property name="x_options">GTK_FILL</property>
+ <property name="y_options"></property>
+ </packing>
+ </child>
</widget>
<packing>
<property name="expand">False</property>
@@ -1197,46 +1197,22 @@
<placeholder/>
</child>
<child>
- <widget class="GtkVBox" id="control_panel_vbox">
+ <widget class="GtkVBox" id="control_strip">
<property name="visible">True</property>
+ <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
<child>
- <widget class="GtkAlignment" id="alignment6">
+ <widget class="GtkHBox" id="hbox1">
<property name="visible">True</property>
- <property name="yalign">0</property>
+ <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
<child>
- <widget class="GtkScrolledWindow" id="scrolledwin1">
+ <widget class="GtkLabel" id="control_strip_name_label">
<property name="visible">True</property>
- <property name="can_focus">True</property>
- <property name="hscrollbar_policy">GTK_POLICY_NEVER</property>
- <property name="vscrollbar_policy">GTK_POLICY_AUTOMATIC</property>
- <child>
- <widget class="GtkViewport" id="viewport1">
- <property name="visible">True</property>
- <property name="shadow_type">GTK_SHADOW_NONE</property>
- <child>
- <widget class="GtkVBox" id="control_panel_controls_box">
- <property name="visible">True</property>
- <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
- </widget>
- </child>
- </widget>
- </child>
- </widget>
- </child>
- </widget>
- </child>
- <child>
- <widget class="GtkHBox" id="control_panel_voice_controls_box">
- <property name="visible">True</property>
- <property name="homogeneous">True</property>
- <child>
- <widget class="GtkRadioButton" id="control_panel_all_voices_radio">
- <property name="can_focus">True</property>
- <property name="tooltip" translatable="yes">Apply changed controls to all voices</property>
- <property name="label" translatable="yes">All Voices</property>
- <property name="use_underline">True</property>
- <property name="response_id">0</property>
- <property name="draw_indicator">True</property>
+ <property name="xalign">0</property>
+ <property name="xpad">4</property>
+ <property name="ypad">4</property>
+ <property name="label" translatable="yes">&lt;b&gt;Name&lt;/b&gt;</property>
+ <property name="use_markup">True</property>
+ <property name="single_line_mode">True</property>
</widget>
<packing>
<property name="expand">False</property>
@@ -1244,54 +1220,67 @@
</packing>
</child>
<child>
- <widget class="GtkHBox" id="hbox32">
+ <widget class="GtkAlignment" id="alignment3">
<property name="visible">True</property>
- <property name="spacing">5</property>
- <child>
- <widget class="GtkRadioButton" id="control_panel_specific_voice_radio">
- <property name="visible">True</property>
- <property name="can_focus">True</property>
- <property name="tooltip" translatable="yes">Apply changed controls to one voice only</property>
- <property name="label" translatable="yes">Specific Voice:</property>
- <property name="use_underline">True</property>
- <property name="response_id">0</property>
- <property name="draw_indicator">True</property>
- <property name="group">control_panel_all_voices_radio</property>
- </widget>
- <packing>
- <property name="expand">False</property>
- <property name="fill">False</property>
- </packing>
- </child>
+ <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
+ <property name="xalign">1</property>
+ <property name="yalign">1</property>
+ <property name="xscale">0</property>
+ <property name="yscale">0</property>
+ <property name="top_padding">2</property>
+ <property name="left_padding">2</property>
+ <property name="right_padding">2</property>
<child>
- <widget class="GtkSpinButton" id="control_panel_voice_spinbutton">
+ <widget class="GtkSpinButton" id="control_strip_spinner">
<property name="visible">True</property>
- <property name="sensitive">False</property>
<property name="can_focus">True</property>
- <property name="tooltip" translatable="yes">Voice control changes are applied to</property>
- <property name="adjustment">1 1 100 1 10 10</property>
- <property name="climb_rate">1</property>
+ <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
+ <property name="width_chars">12</property>
+ <property name="adjustment">0 -9.9999999999999999e+45 1.0000000000000001e+63 1 10 10</property>
+ <property name="digits">4</property>
<property name="numeric">True</property>
</widget>
- <packing>
- <property name="position">1</property>
- </packing>
</child>
</widget>
<packing>
- <property name="expand">False</property>
- <property name="fill">False</property>
<property name="position">1</property>
</packing>
</child>
</widget>
<packing>
<property name="expand">False</property>
- <property name="padding">5</property>
+ <property name="fill">False</property>
+ </packing>
+ </child>
+ <child>
+ <widget class="GtkHScale" id="control_strip_slider">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
+ <property name="adjustment">0 -1e+113 1e+137 0 0 0</property>
+ <property name="digits">63</property>
+ <property name="draw_value">False</property>
+ </widget>
+ <packing>
+ <property name="expand">False</property>
<property name="position">1</property>
</packing>
</child>
</widget>
+ <packing>
+ <property name="top_attach">3</property>
+ <property name="bottom_attach">4</property>
+ </packing>
+ </child>
+ <child>
+ <widget class="GtkHSeparator" id="hseparator5">
+ <property name="visible">True</property>
+ </widget>
+ <packing>
+ <property name="top_attach">1</property>
+ <property name="bottom_attach">2</property>
+ <property name="x_options">GTK_FILL</property>
+ </packing>
</child>
<child>
<widget class="GtkVBox" id="patch_view_box">
@@ -1525,32 +1514,46 @@
</packing>
</child>
<child>
- <widget class="GtkHSeparator" id="hseparator5">
- <property name="visible">True</property>
- </widget>
- <packing>
- <property name="top_attach">1</property>
- <property name="bottom_attach">2</property>
- <property name="x_options">GTK_FILL</property>
- </packing>
- </child>
- <child>
- <widget class="GtkVBox" id="control_strip">
+ <widget class="GtkVBox" id="control_panel_vbox">
<property name="visible">True</property>
- <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
<child>
- <widget class="GtkHBox" id="hbox1">
+ <widget class="GtkAlignment" id="alignment6">
<property name="visible">True</property>
- <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
+ <property name="yalign">0</property>
<child>
- <widget class="GtkLabel" id="control_strip_name_label">
+ <widget class="GtkScrolledWindow" id="scrolledwin1">
<property name="visible">True</property>
- <property name="xalign">0</property>
- <property name="xpad">4</property>
- <property name="ypad">4</property>
- <property name="label" translatable="yes">&lt;b&gt;Name&lt;/b&gt;</property>
- <property name="use_markup">True</property>
- <property name="single_line_mode">True</property>
+ <property name="can_focus">True</property>
+ <property name="hscrollbar_policy">GTK_POLICY_NEVER</property>
+ <property name="vscrollbar_policy">GTK_POLICY_AUTOMATIC</property>
+ <child>
+ <widget class="GtkViewport" id="viewport1">
+ <property name="visible">True</property>
+ <property name="shadow_type">GTK_SHADOW_NONE</property>
+ <child>
+ <widget class="GtkVBox" id="control_panel_controls_box">
+ <property name="visible">True</property>
+ <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
+ </widget>
+ </child>
+ </widget>
+ </child>
+ </widget>
+ </child>
+ </widget>
+ </child>
+ <child>
+ <widget class="GtkHBox" id="control_panel_voice_controls_box">
+ <property name="visible">True</property>
+ <property name="homogeneous">True</property>
+ <child>
+ <widget class="GtkRadioButton" id="control_panel_all_voices_radio">
+ <property name="can_focus">True</property>
+ <property name="tooltip" translatable="yes">Apply changed controls to all voices</property>
+ <property name="label" translatable="yes">All Voices</property>
+ <property name="use_underline">True</property>
+ <property name="response_id">0</property>
+ <property name="draw_indicator">True</property>
</widget>
<packing>
<property name="expand">False</property>
@@ -1558,57 +1561,54 @@
</packing>
</child>
<child>
- <widget class="GtkAlignment" id="alignment3">
+ <widget class="GtkHBox" id="hbox32">
<property name="visible">True</property>
- <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
- <property name="xalign">1</property>
- <property name="yalign">1</property>
- <property name="xscale">0</property>
- <property name="yscale">0</property>
- <property name="top_padding">2</property>
- <property name="left_padding">2</property>
- <property name="right_padding">2</property>
+ <property name="spacing">5</property>
<child>
- <widget class="GtkSpinButton" id="control_strip_spinner">
+ <widget class="GtkRadioButton" id="control_panel_specific_voice_radio">
<property name="visible">True</property>
<property name="can_focus">True</property>
- <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
- <property name="width_chars">12</property>
- <property name="adjustment">0 -9.9999999999999999e+45 1.0000000000000001e+63 1 10 10</property>
- <property name="digits">4</property>
+ <property name="tooltip" translatable="yes">Apply changed controls to one voice only</property>
+ <property name="label" translatable="yes">Specific Voice:</property>
+ <property name="use_underline">True</property>
+ <property name="response_id">0</property>
+ <property name="draw_indicator">True</property>
+ <property name="group">control_panel_all_voices_radio</property>
+ </widget>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ </packing>
+ </child>
+ <child>
+ <widget class="GtkSpinButton" id="control_panel_voice_spinbutton">
+ <property name="visible">True</property>
+ <property name="sensitive">False</property>
+ <property name="can_focus">True</property>
+ <property name="tooltip" translatable="yes">Voice control changes are applied to</property>
+ <property name="adjustment">1 1 100 1 10 10</property>
+ <property name="climb_rate">1</property>
<property name="numeric">True</property>
</widget>
+ <packing>
+ <property name="position">1</property>
+ </packing>
</child>
</widget>
<packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
<property name="position">1</property>
</packing>
</child>
</widget>
<packing>
<property name="expand">False</property>
- <property name="fill">False</property>
- </packing>
- </child>
- <child>
- <widget class="GtkHScale" id="control_strip_slider">
- <property name="visible">True</property>
- <property name="can_focus">True</property>
- <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
- <property name="adjustment">0 -1e+113 1e+137 0 0 0</property>
- <property name="digits">63</property>
- <property name="draw_value">False</property>
- </widget>
- <packing>
- <property name="expand">False</property>
+ <property name="padding">5</property>
<property name="position">1</property>
</packing>
</child>
</widget>
- <packing>
- <property name="top_attach">3</property>
- <property name="bottom_attach">4</property>
- </packing>
</child>
</widget>
</child>
@@ -1698,51 +1698,51 @@
<property name="n_rows">2</property>
<property name="n_columns">2</property>
<child>
- <widget class="GtkLabel" id="label90">
+ <widget class="GtkLabel" id="label103">
<property name="visible">True</property>
- <property name="label" translatable="yes">&lt;b&gt;Patch Search Path: &lt;/b&gt;</property>
- <property name="use_markup">True</property>
+ <property name="xalign">0</property>
</widget>
<packing>
+ <property name="top_attach">1</property>
+ <property name="bottom_attach">2</property>
<property name="x_options">GTK_FILL</property>
<property name="y_options"></property>
</packing>
</child>
<child>
- <widget class="GtkEntry" id="config_path_entry">
+ <widget class="GtkLabel" id="label91">
<property name="visible">True</property>
- <property name="can_focus">True</property>
- <property name="invisible_char">*</property>
+ <property name="label" translatable="yes">&lt;i&gt;Example: /foo/bar:/home/john/patches:/usr/share/om/patches&lt;/i&gt;</property>
+ <property name="use_markup">True</property>
</widget>
<packing>
<property name="left_attach">1</property>
<property name="right_attach">2</property>
+ <property name="top_attach">1</property>
+ <property name="bottom_attach">2</property>
+ <property name="x_options">GTK_FILL</property>
<property name="y_options"></property>
</packing>
</child>
<child>
- <widget class="GtkLabel" id="label91">
+ <widget class="GtkEntry" id="config_path_entry">
<property name="visible">True</property>
- <property name="label" translatable="yes">&lt;i&gt;Example: /foo/bar:/home/john/patches:/usr/share/om/patches&lt;/i&gt;</property>
- <property name="use_markup">True</property>
+ <property name="can_focus">True</property>
+ <property name="invisible_char">*</property>
</widget>
<packing>
<property name="left_attach">1</property>
<property name="right_attach">2</property>
- <property name="top_attach">1</property>
- <property name="bottom_attach">2</property>
- <property name="x_options">GTK_FILL</property>
<property name="y_options"></property>
</packing>
</child>
<child>
- <widget class="GtkLabel" id="label103">
+ <widget class="GtkLabel" id="label90">
<property name="visible">True</property>
- <property name="xalign">0</property>
+ <property name="label" translatable="yes">&lt;b&gt;Patch Search Path: &lt;/b&gt;</property>
+ <property name="use_markup">True</property>
</widget>
<packing>
- <property name="top_attach">1</property>
- <property name="bottom_attach">2</property>
<property name="x_options">GTK_FILL</property>
<property name="y_options"></property>
</packing>
@@ -2118,7 +2118,7 @@
<property name="column_spacing">10</property>
<property name="row_spacing">6</property>
<child>
- <widget class="GtkLabel" id="node_properties_plugin_type_label">
+ <widget class="GtkLabel" id="node_properties_plugin_name_label">
<property name="visible">True</property>
<property name="xalign">0</property>
<property name="label" translatable="yes">-</property>
@@ -2126,28 +2126,34 @@
<packing>
<property name="left_attach">1</property>
<property name="right_attach">2</property>
+ <property name="top_attach">2</property>
+ <property name="bottom_attach">3</property>
<property name="x_options">GTK_FILL</property>
<property name="y_options"></property>
</packing>
</child>
<child>
- <widget class="GtkLabel" id="label114">
+ <widget class="GtkLabel" id="label116">
<property name="visible">True</property>
<property name="xalign">0</property>
- <property name="label" translatable="yes">Type: </property>
+ <property name="label" translatable="yes">Name: </property>
</widget>
<packing>
+ <property name="top_attach">2</property>
+ <property name="bottom_attach">3</property>
<property name="x_options">GTK_FILL</property>
<property name="y_options"></property>
</packing>
</child>
<child>
- <widget class="GtkLabel" id="label120">
+ <widget class="GtkLabel" id="node_properties_plugin_uri_label">
<property name="visible">True</property>
<property name="xalign">0</property>
- <property name="label" translatable="yes">URI: </property>
+ <property name="label" translatable="yes">-</property>
</widget>
<packing>
+ <property name="left_attach">1</property>
+ <property name="right_attach">2</property>
<property name="top_attach">1</property>
<property name="bottom_attach">2</property>
<property name="x_options">GTK_FILL</property>
@@ -2155,14 +2161,12 @@
</packing>
</child>
<child>
- <widget class="GtkLabel" id="node_properties_plugin_uri_label">
+ <widget class="GtkLabel" id="label120">
<property name="visible">True</property>
<property name="xalign">0</property>
- <property name="label" translatable="yes">-</property>
+ <property name="label" translatable="yes">URI: </property>
</widget>
<packing>
- <property name="left_attach">1</property>
- <property name="right_attach">2</property>
<property name="top_attach">1</property>
<property name="bottom_attach">2</property>
<property name="x_options">GTK_FILL</property>
@@ -2170,20 +2174,18 @@
</packing>
</child>
<child>
- <widget class="GtkLabel" id="label116">
+ <widget class="GtkLabel" id="label114">
<property name="visible">True</property>
<property name="xalign">0</property>
- <property name="label" translatable="yes">Name: </property>
+ <property name="label" translatable="yes">Type: </property>
</widget>
<packing>
- <property name="top_attach">2</property>
- <property name="bottom_attach">3</property>
<property name="x_options">GTK_FILL</property>
<property name="y_options"></property>
</packing>
</child>
<child>
- <widget class="GtkLabel" id="node_properties_plugin_name_label">
+ <widget class="GtkLabel" id="node_properties_plugin_type_label">
<property name="visible">True</property>
<property name="xalign">0</property>
<property name="label" translatable="yes">-</property>
@@ -2191,8 +2193,6 @@
<packing>
<property name="left_attach">1</property>
<property name="right_attach">2</property>
- <property name="top_attach">2</property>
- <property name="bottom_attach">3</property>
<property name="x_options">GTK_FILL</property>
<property name="y_options"></property>
</packing>
@@ -2347,64 +2347,33 @@ Contributors:
<property name="n_columns">2</property>
<property name="row_spacing">8</property>
<child>
- <widget class="GtkHBox" id="hbox64">
- <property name="visible">True</property>
- <child>
- <widget class="GtkSpinButton" id="connect_port_spinbutton">
- <property name="visible">True</property>
- <property name="sensitive">False</property>
- <property name="can_focus">True</property>
- <property name="adjustment">16180 1 65535 1 10 10</property>
- <property name="climb_rate">1</property>
- <property name="numeric">True</property>
- </widget>
- <packing>
- <property name="expand">False</property>
- <property name="fill">False</property>
- </packing>
- </child>
- </widget>
- <packing>
- <property name="left_attach">1</property>
- <property name="right_attach">2</property>
- <property name="top_attach">1</property>
- <property name="bottom_attach">2</property>
- <property name="y_options">GTK_FILL</property>
- <property name="x_padding">8</property>
- </packing>
- </child>
- <child>
- <widget class="GtkHBox" id="hbox67">
+ <widget class="GtkLabel" id="label131">
<property name="visible">True</property>
- <child>
- <widget class="GtkEntry" id="connect_url_entry">
- <property name="visible">True</property>
- <property name="can_focus">True</property>
- <property name="invisible_char">*</property>
- <property name="activates_default">True</property>
- <property name="width_chars">28</property>
- <property name="text" translatable="yes">osc.udp://localhost:16180</property>
- </widget>
- </child>
+ <property name="xalign">0</property>
</widget>
<packing>
<property name="left_attach">1</property>
<property name="right_attach">2</property>
+ <property name="top_attach">2</property>
+ <property name="bottom_attach">3</property>
<property name="x_options">GTK_FILL</property>
- <property name="y_options">GTK_FILL</property>
- <property name="x_padding">8</property>
+ <property name="y_options"></property>
</packing>
</child>
<child>
- <widget class="GtkRadioButton" id="connect_server_radiobutton">
+ <widget class="GtkRadioButton" id="connect_internal_radiobutton">
<property name="visible">True</property>
+ <property name="sensitive">False</property>
<property name="can_focus">True</property>
- <property name="label" translatable="yes">Connect to running server at: </property>
+ <property name="label" translatable="yes">Use internal engine</property>
<property name="use_underline">True</property>
<property name="response_id">0</property>
<property name="draw_indicator">True</property>
+ <property name="group">connect_server_radiobutton</property>
</widget>
<packing>
+ <property name="top_attach">2</property>
+ <property name="bottom_attach">3</property>
<property name="x_options">GTK_FILL</property>
<property name="y_options"></property>
</packing>
@@ -2427,35 +2396,66 @@ Contributors:
</packing>
</child>
<child>
- <widget class="GtkRadioButton" id="connect_internal_radiobutton">
+ <widget class="GtkRadioButton" id="connect_server_radiobutton">
<property name="visible">True</property>
- <property name="sensitive">False</property>
<property name="can_focus">True</property>
- <property name="label" translatable="yes">Use internal engine</property>
+ <property name="label" translatable="yes">Connect to running server at: </property>
<property name="use_underline">True</property>
<property name="response_id">0</property>
<property name="draw_indicator">True</property>
- <property name="group">connect_server_radiobutton</property>
</widget>
<packing>
- <property name="top_attach">2</property>
- <property name="bottom_attach">3</property>
<property name="x_options">GTK_FILL</property>
<property name="y_options"></property>
</packing>
</child>
<child>
- <widget class="GtkLabel" id="label131">
+ <widget class="GtkHBox" id="hbox67">
<property name="visible">True</property>
- <property name="xalign">0</property>
+ <child>
+ <widget class="GtkEntry" id="connect_url_entry">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="invisible_char">*</property>
+ <property name="activates_default">True</property>
+ <property name="width_chars">28</property>
+ <property name="text" translatable="yes">osc.udp://localhost:16180</property>
+ </widget>
+ </child>
</widget>
<packing>
<property name="left_attach">1</property>
<property name="right_attach">2</property>
- <property name="top_attach">2</property>
- <property name="bottom_attach">3</property>
<property name="x_options">GTK_FILL</property>
- <property name="y_options"></property>
+ <property name="y_options">GTK_FILL</property>
+ <property name="x_padding">8</property>
+ </packing>
+ </child>
+ <child>
+ <widget class="GtkHBox" id="hbox64">
+ <property name="visible">True</property>
+ <child>
+ <widget class="GtkSpinButton" id="connect_port_spinbutton">
+ <property name="visible">True</property>
+ <property name="sensitive">False</property>
+ <property name="can_focus">True</property>
+ <property name="adjustment">16180 1 65535 1 10 10</property>
+ <property name="climb_rate">1</property>
+ <property name="numeric">True</property>
+ </widget>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ </packing>
+ </child>
+ </widget>
+ <packing>
+ <property name="left_attach">1</property>
+ <property name="right_attach">2</property>
+ <property name="top_attach">1</property>
+ <property name="bottom_attach">2</property>
+ <property name="y_options">GTK_FILL</property>
+ <property name="x_padding">8</property>
</packing>
</child>
</widget>
@@ -2556,6 +2556,15 @@ Contributors:
<signal name="activate" handler="on_canvas_menu_add_midi_input_activate"/>
</widget>
</child>
+ <child>
+ <widget class="GtkMenuItem" id="canvas_menu_add_osc_input">
+ <property name="visible">True</property>
+ <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
+ <property name="tooltip" translatable="yes">Add an OSC input to this patch</property>
+ <property name="label" translatable="yes">OSC</property>
+ <property name="use_underline">True</property>
+ </widget>
+ </child>
</widget>
</child>
<child internal-child="image">
@@ -2601,6 +2610,15 @@ Contributors:
<signal name="activate" handler="on_canvas_menu_add_midi_output_activate"/>
</widget>
</child>
+ <child>
+ <widget class="GtkMenuItem" id="canvas_menu_add_osc_output">
+ <property name="visible">True</property>
+ <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
+ <property name="tooltip" translatable="yes">Add an OSC output to this patch</property>
+ <property name="label" translatable="yes">OSC</property>
+ <property name="use_underline">True</property>
+ </widget>
+ </child>
</widget>
</child>
<child internal-child="image">
@@ -2778,19 +2796,26 @@ Contributors:
<property name="n_columns">2</property>
<property name="row_spacing">8</property>
<child>
- <widget class="GtkEntry" id="upload_patch_symbol_entry">
+ <widget class="GtkLabel" id="label136">
<property name="visible">True</property>
- <property name="can_focus">True</property>
- <property name="tooltip" translatable="yes">Enter a short name suitable for use as an identifier or filename.
-
-The first character must be one of _, a-z or A-Z and subsequenct characters can be from _, a-z, A-Z or 0-9.
-</property>
- <property name="invisible_char">*</property>
- <property name="activates_default">True</property>
+ <property name="xalign">0</property>
+ <property name="label" translatable="yes">Short Name: </property>
</widget>
<packing>
- <property name="left_attach">1</property>
- <property name="right_attach">2</property>
+ <property name="top_attach">1</property>
+ <property name="bottom_attach">2</property>
+ <property name="x_options">GTK_FILL</property>
+ <property name="y_options"></property>
+ </packing>
+ </child>
+ <child>
+ <widget class="GtkLabel" id="label135">
+ <property name="visible">True</property>
+ <property name="xalign">0</property>
+ <property name="label" translatable="yes">Symbol: </property>
+ </widget>
+ <packing>
+ <property name="x_options">GTK_FILL</property>
<property name="y_options"></property>
</packing>
</child>
@@ -2811,26 +2836,19 @@ The first character must be one of _, a-z or A-Z and subsequenct characters can
</packing>
</child>
<child>
- <widget class="GtkLabel" id="label135">
- <property name="visible">True</property>
- <property name="xalign">0</property>
- <property name="label" translatable="yes">Symbol: </property>
- </widget>
- <packing>
- <property name="x_options">GTK_FILL</property>
- <property name="y_options"></property>
- </packing>
- </child>
- <child>
- <widget class="GtkLabel" id="label136">
+ <widget class="GtkEntry" id="upload_patch_symbol_entry">
<property name="visible">True</property>
- <property name="xalign">0</property>
- <property name="label" translatable="yes">Short Name: </property>
+ <property name="can_focus">True</property>
+ <property name="tooltip" translatable="yes">Enter a short name suitable for use as an identifier or filename.
+
+The first character must be one of _, a-z or A-Z and subsequenct characters can be from _, a-z, A-Z or 0-9.
+</property>
+ <property name="invisible_char">*</property>
+ <property name="activates_default">True</property>
</widget>
<packing>
- <property name="top_attach">1</property>
- <property name="bottom_attach">2</property>
- <property name="x_options">GTK_FILL</property>
+ <property name="left_attach">1</property>
+ <property name="right_attach">2</property>
<property name="y_options"></property>
</packing>
</child>
@@ -2976,17 +2994,26 @@ Thank you for contributing.</property>
<property name="column_spacing">2</property>
<property name="row_spacing">4</property>
<child>
- <widget class="GtkSpinButton" id="port_properties_min_spinner">
+ <widget class="GtkLabel" id="label139">
<property name="visible">True</property>
- <property name="can_focus">True</property>
- <property name="adjustment">0 -100000000 100000000 1 10 10</property>
- <property name="climb_rate">1</property>
- <property name="digits">5</property>
- <property name="numeric">True</property>
+ <property name="xalign">0</property>
+ <property name="label" translatable="yes">Maximum Value: </property>
</widget>
<packing>
- <property name="left_attach">1</property>
- <property name="right_attach">2</property>
+ <property name="top_attach">1</property>
+ <property name="bottom_attach">2</property>
+ <property name="x_options">GTK_FILL</property>
+ <property name="y_options"></property>
+ </packing>
+ </child>
+ <child>
+ <widget class="GtkLabel" id="label138">
+ <property name="visible">True</property>
+ <property name="xalign">0</property>
+ <property name="label" translatable="yes">Minimum Value: </property>
+ </widget>
+ <packing>
+ <property name="x_options">GTK_FILL</property>
<property name="y_options"></property>
</packing>
</child>
@@ -3008,26 +3035,17 @@ Thank you for contributing.</property>
</packing>
</child>
<child>
- <widget class="GtkLabel" id="label138">
- <property name="visible">True</property>
- <property name="xalign">0</property>
- <property name="label" translatable="yes">Minimum Value: </property>
- </widget>
- <packing>
- <property name="x_options">GTK_FILL</property>
- <property name="y_options"></property>
- </packing>
- </child>
- <child>
- <widget class="GtkLabel" id="label139">
+ <widget class="GtkSpinButton" id="port_properties_min_spinner">
<property name="visible">True</property>
- <property name="xalign">0</property>
- <property name="label" translatable="yes">Maximum Value: </property>
+ <property name="can_focus">True</property>
+ <property name="adjustment">0 -100000000 100000000 1 10 10</property>
+ <property name="climb_rate">1</property>
+ <property name="digits">5</property>
+ <property name="numeric">True</property>
</widget>
<packing>
- <property name="top_attach">1</property>
- <property name="bottom_attach">2</property>
- <property name="x_options">GTK_FILL</property>
+ <property name="left_attach">1</property>
+ <property name="right_attach">2</property>
<property name="y_options"></property>
</packing>
</child>