summaryrefslogtreecommitdiffstats
path: root/src/server/internals/Controller.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/server/internals/Controller.cpp')
-rw-r--r--src/server/internals/Controller.cpp174
1 files changed, 0 insertions, 174 deletions
diff --git a/src/server/internals/Controller.cpp b/src/server/internals/Controller.cpp
deleted file mode 100644
index 4c1cf45a..00000000
--- a/src/server/internals/Controller.cpp
+++ /dev/null
@@ -1,174 +0,0 @@
-/*
- This file is part of Ingen.
- Copyright 2007-2016 David Robillard <http://drobilla.net/>
-
- Ingen is free software: you can redistribute it and/or modify it under the
- terms of the GNU Affero General Public License as published by the Free
- Software Foundation, either version 3 of the License, or 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 Affero General Public License for details.
-
- You should have received a copy of the GNU Affero General Public License
- along with Ingen. If not, see <http://www.gnu.org/licenses/>.
-*/
-
-#include <cmath>
-
-#include "ingen/URIs.hpp"
-#include "internals/Controller.hpp"
-#include "lv2/lv2plug.in/ns/ext/atom/util.h"
-#include "lv2/lv2plug.in/ns/ext/midi/midi.h"
-
-#include "Buffer.hpp"
-#include "Engine.hpp"
-#include "InputPort.hpp"
-#include "InternalPlugin.hpp"
-#include "OutputPort.hpp"
-#include "PostProcessor.hpp"
-#include "RunContext.hpp"
-#include "util.hpp"
-
-namespace Ingen {
-namespace Server {
-namespace Internals {
-
-InternalPlugin* ControllerNode::internal_plugin(URIs& uris) {
- return new InternalPlugin(
- uris, URI(NS_INTERNALS "Controller"), Raul::Symbol("controller"));
-}
-
-ControllerNode::ControllerNode(InternalPlugin* plugin,
- BufferFactory& bufs,
- const Raul::Symbol& symbol,
- bool polyphonic,
- GraphImpl* parent,
- SampleRate srate)
- : InternalBlock(plugin, symbol, false, parent, srate)
- , _learning(false)
-{
- const Ingen::URIs& uris = bufs.uris();
- _ports = bufs.maid().make_managed<Ports>(7);
-
- const Atom zero = bufs.forge().make(0.0f);
- const Atom one = bufs.forge().make(1.0f);
- const Atom atom_Float = bufs.forge().make_urid(URI(LV2_ATOM__Float));
-
- _midi_in_port = new InputPort(bufs, this, Raul::Symbol("input"), 0, 1,
- PortType::ATOM, uris.atom_Sequence, Atom());
- _midi_in_port->set_property(uris.lv2_name, bufs.forge().alloc("Input"));
- _midi_in_port->set_property(uris.atom_supports,
- bufs.forge().make_urid(uris.midi_MidiEvent));
- _ports->at(0) = _midi_in_port;
-
- _midi_out_port = new OutputPort(bufs, this, Raul::Symbol("event"), 1, 1,
- PortType::ATOM, uris.atom_Sequence, Atom());
- _midi_out_port->set_property(uris.lv2_name, bufs.forge().alloc("Event"));
- _midi_out_port->set_property(uris.atom_supports,
- bufs.forge().make_urid(uris.midi_MidiEvent));
- _ports->at(1) = _midi_out_port;
-
- _param_port = new InputPort(bufs, this, Raul::Symbol("controller"), 2, 1,
- PortType::ATOM, uris.atom_Sequence, zero);
- _param_port->set_property(uris.atom_supports, atom_Float);
- _param_port->set_property(uris.lv2_minimum, zero);
- _param_port->set_property(uris.lv2_maximum, bufs.forge().make(127.0f));
- _param_port->set_property(uris.lv2_portProperty, uris.lv2_integer);
- _param_port->set_property(uris.lv2_name, bufs.forge().alloc("Controller"));
- _ports->at(2) = _param_port;
-
- _log_port = new InputPort(bufs, this, Raul::Symbol("logarithmic"), 3, 1,
- PortType::ATOM, uris.atom_Sequence, zero);
- _log_port->set_property(uris.atom_supports, atom_Float);
- _log_port->set_property(uris.lv2_portProperty, uris.lv2_toggled);
- _log_port->set_property(uris.lv2_name, bufs.forge().alloc("Logarithmic"));
- _ports->at(3) = _log_port;
-
- _min_port = new InputPort(bufs, this, Raul::Symbol("minimum"), 4, 1,
- PortType::ATOM, uris.atom_Sequence, zero);
- _min_port->set_property(uris.atom_supports, atom_Float);
- _min_port->set_property(uris.lv2_name, bufs.forge().alloc("Minimum"));
- _ports->at(4) = _min_port;
-
- _max_port = new InputPort(bufs, this, Raul::Symbol("maximum"), 5, 1,
- PortType::ATOM, uris.atom_Sequence, one);
- _max_port->set_property(uris.atom_supports, atom_Float);
- _max_port->set_property(uris.lv2_name, bufs.forge().alloc("Maximum"));
- _ports->at(5) = _max_port;
-
- _audio_port = new OutputPort(bufs, this, Raul::Symbol("output"), 6, 1,
- PortType::ATOM, uris.atom_Sequence, zero);
- _audio_port->set_property(uris.atom_supports, atom_Float);
- _audio_port->set_property(uris.lv2_name, bufs.forge().alloc("Output"));
- _ports->at(6) = _audio_port;
-}
-
-void
-ControllerNode::run(RunContext& context)
-{
- const BufferRef midi_in = _midi_in_port->buffer(0);
- LV2_Atom_Sequence* seq = midi_in->get<LV2_Atom_Sequence>();
- const BufferRef midi_out = _midi_out_port->buffer(0);
- LV2_ATOM_SEQUENCE_FOREACH(seq, ev) {
- const uint8_t* buf = (const uint8_t*)LV2_ATOM_BODY(&ev->body);
- if (ev->body.type == _midi_in_port->bufs().uris().midi_MidiEvent &&
- ev->body.size >= 3 &&
- lv2_midi_message_type(buf) == LV2_MIDI_MSG_CONTROLLER) {
- if (control(context, buf[1], buf[2], ev->time.frames + context.start())) {
- midi_out->append_event(ev->time.frames, &ev->body);
- }
- }
- }
-}
-
-bool
-ControllerNode::control(RunContext& context, uint8_t control_num, uint8_t val, FrameTime time)
-{
- assert(time >= context.start() && time <= context.end());
- const uint32_t offset = time - context.start();
-
- const Sample nval = (val / 127.0f); // normalized [0, 1]
-
- if (_learning) {
- _param_port->set_control_value(context, time, control_num);
- _param_port->force_monitor_update();
- _learning = false;
- } else {
- _param_port->update_values(offset, 0);
- }
-
- if (control_num != _param_port->buffer(0)->value_at(offset)) {
- return false;
- }
-
- for (const auto& port : { _min_port, _max_port, _log_port }) {
- port->update_values(offset, 0);
- }
-
- const Sample min_port_val = _min_port->buffer(0)->value_at(offset);
- const Sample max_port_val = _max_port->buffer(0)->value_at(offset);
- const Sample log_port_val = _log_port->buffer(0)->value_at(offset);
-
- Sample scaled_value;
- if (log_port_val > 0.0f) {
- // haaaaack, stupid negatives and logarithms
- Sample log_offset = 0;
- if (min_port_val < 0) {
- log_offset = fabs(min_port_val);
- }
- const Sample min = log(min_port_val + 1 + log_offset);
- const Sample max = log(max_port_val + 1 + log_offset);
- scaled_value = expf(nval * (max - min) + min) - 1 - log_offset;
- } else {
- scaled_value = ((nval) * (max_port_val - min_port_val)) + min_port_val;
- }
-
- _audio_port->set_control_value(context, time, scaled_value);
-
- return true;
-}
-
-} // namespace Internals
-} // namespace Server
-} // namespace Ingen