summaryrefslogtreecommitdiffstats
path: root/src/libs/engine/MidiTriggerNode.cpp
diff options
context:
space:
mode:
authorDavid Robillard <d@drobilla.net>2008-07-29 05:50:52 +0000
committerDavid Robillard <d@drobilla.net>2008-07-29 05:50:52 +0000
commitf0e920ab170569fc9eaf5858af2e9ae3e8d44993 (patch)
tree1e1fa0a7b2bfeb0e6ca4541c570f445fc4541ff0 /src/libs/engine/MidiTriggerNode.cpp
parentde58b508b28a42b072fb26d2633aa0af37ee7c0e (diff)
downloadingen-f0e920ab170569fc9eaf5858af2e9ae3e8d44993.tar.gz
ingen-f0e920ab170569fc9eaf5858af2e9ae3e8d44993.tar.bz2
ingen-f0e920ab170569fc9eaf5858af2e9ae3e8d44993.zip
Fix stateful port value setting stuff (trigger output ports on note/trigger/etc modules now work correctly).
git-svn-id: http://svn.drobilla.net/lad/ingen@1302 a436a847-0d15-0410-975c-d299462d15a1
Diffstat (limited to 'src/libs/engine/MidiTriggerNode.cpp')
-rw-r--r--src/libs/engine/MidiTriggerNode.cpp29
1 files changed, 12 insertions, 17 deletions
diff --git a/src/libs/engine/MidiTriggerNode.cpp b/src/libs/engine/MidiTriggerNode.cpp
index 5fa1cd4b..7b210201 100644
--- a/src/libs/engine/MidiTriggerNode.cpp
+++ b/src/libs/engine/MidiTriggerNode.cpp
@@ -78,17 +78,17 @@ MidiTriggerNode::process(ProcessContext& context)
switch (buf[0] & 0xF0) {
case MIDI_CMD_NOTE_ON:
if (buf[2] == 0)
- note_off(buf[1], time, context);
+ note_off(context, buf[1], time);
else
- note_on(buf[1], buf[2], time, context);
+ note_on(context, buf[1], buf[2], time);
break;
case MIDI_CMD_NOTE_OFF:
- note_off(buf[1], time, context);
+ note_off(context, buf[1], time);
break;
case MIDI_CMD_CONTROL:
if (buf[1] == MIDI_CTL_ALL_NOTES_OFF
|| buf[1] == MIDI_CTL_ALL_SOUNDS_OFF)
- ((AudioBuffer*)_gate_port->buffer(0))->set(0.0f, time);
+ ((AudioBuffer*)_gate_port->buffer(0))->set_value(0.0f, context.start(), time);
default:
break;
}
@@ -102,7 +102,7 @@ MidiTriggerNode::process(ProcessContext& context)
void
-MidiTriggerNode::note_on(uchar note_num, uchar velocity, FrameTime time, ProcessContext& context)
+MidiTriggerNode::note_on(ProcessContext& context, uchar note_num, uchar velocity, FrameTime time)
{
assert(time >= context.start() && time <= context.end());
assert(time - context.start() < _buffer_size);
@@ -115,29 +115,24 @@ MidiTriggerNode::note_on(uchar note_num, uchar velocity, FrameTime time, Process
cerr << "!\n";
- // FIXME FIXME FIXME
- SampleCount offset = time - context.start();
-
- // See comments in MidiNoteNode::note_on (FIXME)
- if (offset == (SampleCount)(_buffer_size-1))
- --offset;
+ ((AudioBuffer*)_gate_port->buffer(0))->set_value(1.0f, context.start(), time);
+ ((AudioBuffer*)_trig_port->buffer(0))->set_value(1.0f, context.start(), time);
+ ((AudioBuffer*)_trig_port->buffer(0))->set_value(0.0f, context.start(), time + 1);
+ ((AudioBuffer*)_vel_port->buffer(0))->set_value(velocity / 127.0f, context.start(), time);
- ((AudioBuffer*)_gate_port->buffer(0))->set(1.0f, offset);
- ((AudioBuffer*)_trig_port->buffer(0))->set(1.0f, offset, offset);
- ((AudioBuffer*)_trig_port->buffer(0))->set(0.0f, offset+1);
- ((AudioBuffer*)_vel_port->buffer(0))->set(velocity/127.0f, offset);
+ assert(((AudioBuffer*)_trig_port->buffer(0))->data()[time - context.start()] == 1.0f);
}
}
void
-MidiTriggerNode::note_off(uchar note_num, FrameTime time, ProcessContext& context)
+MidiTriggerNode::note_off(ProcessContext& context, uchar note_num, FrameTime time)
{
assert(time >= context.start() && time <= context.end());
assert(time - context.start() < _buffer_size);
if (note_num == lrintf(((AudioBuffer*)_note_port->buffer(0))->value_at(0)))
- ((AudioBuffer*)_gate_port->buffer(0))->set(0.0f, time - context.start());
+ ((AudioBuffer*)_gate_port->buffer(0))->set_value(0.0f, context.start(), time);
}