summaryrefslogtreecommitdiffstats
path: root/src/engine
diff options
context:
space:
mode:
Diffstat (limited to 'src/engine')
-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
4 files changed, 17 insertions, 4 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;
}
}