summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorDavid Robillard <d@drobilla.net>2008-11-28 01:26:54 +0000
committerDavid Robillard <d@drobilla.net>2008-11-28 01:26:54 +0000
commit0bf73b59335d917400c18ae9d664226c1a4da4c2 (patch)
tree5403e1c54de2e1e9e8e4aaedd1a69d674f8c4963
parent6bf8ac34199f1c3e8d57a43bf1ed7025ce0cc3f9 (diff)
downloadingen-0bf73b59335d917400c18ae9d664226c1a4da4c2.tar.gz
ingen-0bf73b59335d917400c18ae9d664226c1a4da4c2.tar.bz2
ingen-0bf73b59335d917400c18ae9d664226c1a4da4c2.zip
MIDI learn for note trigger node.
git-svn-id: http://svn.drobilla.net/lad/trunk/ingen@1812 a436a847-0d15-0410-975c-d299462d15a1
-rw-r--r--src/engine/MidiTriggerNode.cpp9
-rw-r--r--src/engine/MidiTriggerNode.hpp4
-rw-r--r--src/engine/NodeBase.hpp2
-rw-r--r--src/engine/events/MidiLearnEvent.cpp6
-rw-r--r--src/gui/NodeMenu.cpp3
5 files changed, 19 insertions, 5 deletions
diff --git a/src/engine/MidiTriggerNode.cpp b/src/engine/MidiTriggerNode.cpp
index c68a0b96..0212154a 100644
--- a/src/engine/MidiTriggerNode.cpp
+++ b/src/engine/MidiTriggerNode.cpp
@@ -34,6 +34,7 @@ namespace Ingen {
MidiTriggerNode::MidiTriggerNode(const string& path, bool polyphonic, PatchImpl* parent, SampleRate srate, size_t buffer_size)
: NodeBase(new InternalPlugin(NS_INGEN "trigger_node", "trigger", "Trigger"),
path, false, parent, srate, buffer_size)
+ , _learning(false)
{
_ports = new Raul::Array<PortImpl*>(5);
@@ -106,6 +107,14 @@ MidiTriggerNode::note_on(ProcessContext& context, uchar note_num, uchar velocity
{
assert(time >= context.start() && time <= context.end());
assert(time - context.start() < _buffer_size);
+
+ if (_learning) {
+ _note_port->set_value(note_num);
+ ((AudioBuffer*)_note_port->buffer(0))->set_value(
+ (float)note_num, context.start(), context.end());
+ _note_port->broadcast_value(context, true);
+ _learning = false;
+ }
/*cerr << "[MidiTriggerNode] " << path() << " Note " << (int)note_num << " on @ " << time << endl;*/
diff --git a/src/engine/MidiTriggerNode.hpp b/src/engine/MidiTriggerNode.hpp
index ba96589b..413b8102 100644
--- a/src/engine/MidiTriggerNode.hpp
+++ b/src/engine/MidiTriggerNode.hpp
@@ -46,8 +46,12 @@ public:
void note_on(ProcessContext& context, uchar note_num, uchar velocity, FrameTime time);
void note_off(ProcessContext& context, uchar note_num, FrameTime time);
+
+ void learn() { _learning = true; }
private:
+ bool _learning;
+
InputPort* _midi_in_port;
InputPort* _note_port;
OutputPort* _gate_port;
diff --git a/src/engine/NodeBase.hpp b/src/engine/NodeBase.hpp
index 3626f6b9..790e6b72 100644
--- a/src/engine/NodeBase.hpp
+++ b/src/engine/NodeBase.hpp
@@ -69,6 +69,8 @@ public:
virtual void process_unlock();
virtual void wait_for_input(size_t num_providers);
virtual unsigned n_inputs_ready() const { return _n_inputs_ready.get(); }
+
+ virtual void learn() {}
virtual void message_process(MessageContext& context, uint32_t* output) {}
diff --git a/src/engine/events/MidiLearnEvent.cpp b/src/engine/events/MidiLearnEvent.cpp
index b542eccd..8c2439a2 100644
--- a/src/engine/events/MidiLearnEvent.cpp
+++ b/src/engine/events/MidiLearnEvent.cpp
@@ -51,11 +51,9 @@ MidiLearnEvent::execute(ProcessContext& context)
QueuedEvent::execute(context);
if (_node != NULL) {
- if (_node->plugin_impl()->type() == Plugin::Internal
- && _node->plugin_impl()->uri() == "http://drobilla.net/ns/ingen#control_node") {
- ((MidiControlNode*)_node)->learn();
+ if (_node->plugin_impl()->type() == Plugin::Internal) {
+ ((NodeBase*)_node)->learn();
} else {
- std::cout << "NOT CAPABLE: " << _node->plugin_impl()->uri() << std::endl;
_error = INVALID_NODE_TYPE;
}
}
diff --git a/src/gui/NodeMenu.cpp b/src/gui/NodeMenu.cpp
index accf8ef1..e4273330 100644
--- a/src/gui/NodeMenu.cpp
+++ b/src/gui/NodeMenu.cpp
@@ -90,7 +90,8 @@ NodeMenu::init(SharedPtr<NodeModel> node)
else
_randomize_menuitem->hide();
- if (plugin->uri() == "http://drobilla.net/ns/ingen#control_node")
+ if (plugin->uri() == "http://drobilla.net/ns/ingen#control_node"
+ || plugin->uri() == "http://drobilla.net/ns/ingen#trigger_node")
_learn_menuitem->show();
else
_learn_menuitem->hide();