summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorDavid Robillard <d@drobilla.net>2015-11-14 18:47:19 -0500
committerDavid Robillard <d@drobilla.net>2016-10-02 12:24:56 -0400
commita077166ec6c31ad4aaab738b9dffc139bf3a4d50 (patch)
tree8e32e8003bebe0d879b1f9879f3e88c90b9d1b26
parentc73c877f8bd09e0d5a6663ea5ba32a54465f5376 (diff)
downloadingen-a077166ec6c31ad4aaab738b9dffc139bf3a4d50.tar.gz
ingen-a077166ec6c31ad4aaab738b9dffc139bf3a4d50.tar.bz2
ingen-a077166ec6c31ad4aaab738b9dffc139bf3a4d50.zip
Replace Delay internal with simpler BlockDelay
-rw-r--r--bundles/ingen.lv2/internals.ttl6
-rw-r--r--src/gui/Arc.cpp44
-rw-r--r--src/gui/Arc.hpp7
-rw-r--r--src/gui/Port.cpp1
-rw-r--r--src/gui/Style.cpp2
-rw-r--r--src/gui/wscript3
-rw-r--r--src/server/BlockFactory.cpp8
-rw-r--r--src/server/BufferFactory.cpp6
-rw-r--r--src/server/BufferFactory.hpp4
-rw-r--r--src/server/InternalPlugin.cpp8
-rw-r--r--src/server/internals/BlockDelay.cpp89
-rw-r--r--src/server/internals/BlockDelay.hpp (renamed from src/server/internals/Delay.hpp)37
-rw-r--r--src/server/internals/Delay.cpp205
-rw-r--r--src/server/wscript2
14 files changed, 173 insertions, 249 deletions
diff --git a/bundles/ingen.lv2/internals.ttl b/bundles/ingen.lv2/internals.ttl
index b95073ec..53e828f7 100644
--- a/bundles/ingen.lv2/internals.ttl
+++ b/bundles/ingen.lv2/internals.ttl
@@ -27,7 +27,7 @@ internals:Time
rdfs:label "Time" ;
rdfs:comment """Emits time and transport information like tempo, time signature, and speed. The emitted events are in the standard LV2 format expected by transport-aware LV2 plugins.""" .
-internals:Delay
+internals:BlockDelay
a ingen:Internal ;
- rdfs:label "Delay" ;
- rdfs:comment """Special internal delay block. In theory, this block can be used for sample-accurate delay loops since Ingen can specially handle this case unlike a generic LV2 plugin. However, this is not currently implemented.""" . \ No newline at end of file
+ rdfs:label "Block Delay" ;
+ rdfs:comment """Special internal delay block. This delays its input one full process cycle (or 'block'). It is necessary to have at least one block delay in any cycle in the graph, i.e. any feedback loops must contain a block delay.""" . \ No newline at end of file
diff --git a/src/gui/Arc.cpp b/src/gui/Arc.cpp
new file mode 100644
index 00000000..c14b2e88
--- /dev/null
+++ b/src/gui/Arc.cpp
@@ -0,0 +1,44 @@
+/*
+ This file is part of Ingen.
+ Copyright 2007-2015 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 "Arc.hpp"
+#include "ingen/client/ArcModel.hpp"
+#include "ingen/client/BlockModel.hpp"
+
+#define NS_INTERNALS "http://drobilla.net/ns/ingen-internals#"
+
+namespace Ingen {
+namespace GUI {
+
+Arc::Arc(Ganv::Canvas& canvas,
+ SPtr<const Client::ArcModel> model,
+ Ganv::Node* src,
+ Ganv::Node* dst)
+ : Ganv::Edge(canvas, src, dst)
+ , _arc_model(model)
+{
+ SPtr<const Client::ObjectModel> tparent = model->tail()->parent();
+ SPtr<const Client::BlockModel> tparent_block;
+ if ((tparent_block = dynamic_ptr_cast<const Client::BlockModel>(tparent))) {
+ if (tparent_block->plugin_uri() == NS_INTERNALS "BlockDelay") {
+ g_object_set(_gobj, "dash-length", 4.0, NULL);
+ set_constraining(false);
+ }
+ }
+}
+
+} // namespace GUI
+} // namespace Ingen
diff --git a/src/gui/Arc.hpp b/src/gui/Arc.hpp
index e47600d2..382ca305 100644
--- a/src/gui/Arc.hpp
+++ b/src/gui/Arc.hpp
@@ -38,10 +38,7 @@ public:
Arc(Ganv::Canvas& canvas,
SPtr<const Client::ArcModel> model,
Ganv::Node* src,
- Ganv::Node* dst)
- : Ganv::Edge(canvas, src, dst)
- , _arc_model(model)
- {}
+ Ganv::Node* dst);
SPtr<const Client::ArcModel> model() const { return _arc_model; }
@@ -52,4 +49,4 @@ private:
} // namespace GUI
} // namespace Ingen
-#endif // INGEN_GUI_EDGE_HPP
+#endif // INGEN_GUI_ARC_HPP
diff --git a/src/gui/Port.cpp b/src/gui/Port.cpp
index fd5e5a14..1a9750a6 100644
--- a/src/gui/Port.cpp
+++ b/src/gui/Port.cpp
@@ -525,6 +525,7 @@ Port::property_changed(const Raul::URI& key, const Atom& value)
set_label(value.ptr<char>());
}
} else if (key == uris.rdf_type || key == uris.atom_bufferType) {
+ set_fill_color(_app.style()->get_port_color(model().get()));
Ganv::Port::set_beveled(model()->is_a(uris.lv2_ControlPort) ||
model()->has_property(uris.atom_bufferType,
uris.atom_Sequence));
diff --git a/src/gui/Style.cpp b/src/gui/Style.cpp
index 598409bf..6813fc04 100644
--- a/src/gui/Style.cpp
+++ b/src/gui/Style.cpp
@@ -106,7 +106,7 @@ Style::get_port_color(const Client::PortModel* p)
}
_app.log().warn(fmt("No known port type for %1%\n") % p->path());
- return 0x666666FF;
+ return 0x555555FF;
}
} // namespace GUI
diff --git a/src/gui/wscript b/src/gui/wscript
index 1beba44b..0d7f7fc5 100644
--- a/src/gui/wscript
+++ b/src/gui/wscript
@@ -13,7 +13,7 @@ def configure(conf):
autowaf.check_pkg(conf, 'gtkmm-2.4', uselib_store='NEW_GTKMM',
atleast_version='2.14.0', mandatory=False)
autowaf.check_pkg(conf, 'ganv-1', uselib_store='GANV',
- atleast_version='1.5.3', mandatory=False)
+ atleast_version='1.5.4', mandatory=False)
if not Options.options.no_webkit:
autowaf.check_pkg(conf, 'webkit-1.0', uselib_store='WEBKIT',
atleast_version='1.4.0', mandatory=False)
@@ -50,6 +50,7 @@ def build(bld):
obj.source = '''
App.cpp
+ Arc.cpp
BreadCrumbs.cpp
ConnectWindow.cpp
GraphBox.cpp
diff --git a/src/server/BlockFactory.cpp b/src/server/BlockFactory.cpp
index b715ecb7..de7c2de2 100644
--- a/src/server/BlockFactory.cpp
+++ b/src/server/BlockFactory.cpp
@@ -21,8 +21,8 @@
#include "ingen/LV2Features.hpp"
#include "ingen/Log.hpp"
#include "ingen/World.hpp"
+#include "internals/BlockDelay.hpp"
#include "internals/Controller.hpp"
-#include "internals/Delay.hpp"
#include "internals/Note.hpp"
#include "internals/Time.hpp"
#include "internals/Trigger.hpp"
@@ -111,12 +111,12 @@ void
BlockFactory::load_internal_plugins()
{
Ingen::URIs& uris = _world->uris();
+ InternalPlugin* block_delay_plug = BlockDelayNode::internal_plugin(uris);
+ _plugins.insert(make_pair(block_delay_plug->uri(), block_delay_plug));
+
InternalPlugin* controller_plug = ControllerNode::internal_plugin(uris);
_plugins.insert(make_pair(controller_plug->uri(), controller_plug));
- InternalPlugin* delay_plug = DelayNode::internal_plugin(uris);
- _plugins.insert(make_pair(delay_plug->uri(), delay_plug));
-
InternalPlugin* note_plug = NoteNode::internal_plugin(uris);
_plugins.insert(make_pair(note_plug->uri(), note_plug));
diff --git a/src/server/BufferFactory.cpp b/src/server/BufferFactory.cpp
index aeaa0d44..749e83d0 100644
--- a/src/server/BufferFactory.cpp
+++ b/src/server/BufferFactory.cpp
@@ -75,6 +75,12 @@ BufferFactory::audio_buffer_size(SampleCount nframes)
}
uint32_t
+BufferFactory::audio_buffer_size() const
+{
+ return _engine.driver()->block_length() * sizeof(Sample);
+}
+
+uint32_t
BufferFactory::default_size(LV2_URID type) const
{
if (type == _uris.atom_Float) {
diff --git a/src/server/BufferFactory.hpp b/src/server/BufferFactory.hpp
index 2fae3244..ccb01899 100644
--- a/src/server/BufferFactory.hpp
+++ b/src/server/BufferFactory.hpp
@@ -46,7 +46,9 @@ public:
~BufferFactory();
static uint32_t audio_buffer_size(SampleCount nframes);
- uint32_t default_size(LV2_URID type) const;
+
+ uint32_t audio_buffer_size() const;
+ uint32_t default_size(LV2_URID type) const;
BufferRef get_buffer(LV2_URID type,
LV2_URID value_type,
diff --git a/src/server/InternalPlugin.cpp b/src/server/InternalPlugin.cpp
index 075bc67d..3d065fe3 100644
--- a/src/server/InternalPlugin.cpp
+++ b/src/server/InternalPlugin.cpp
@@ -16,7 +16,7 @@
#include "ingen/URIs.hpp"
#include "internals/Controller.hpp"
-#include "internals/Delay.hpp"
+#include "internals/BlockDelay.hpp"
#include "internals/Note.hpp"
#include "internals/Time.hpp"
#include "internals/Trigger.hpp"
@@ -50,10 +50,10 @@ InternalPlugin::instantiate(BufferFactory& bufs,
{
const SampleCount srate = engine.driver()->sample_rate();
- if (uri() == NS_INTERNALS "Controller") {
+ if (uri() == NS_INTERNALS "BlockDelay") {
+ return new BlockDelayNode(this, bufs, symbol, polyphonic, parent, srate);
+ } else if (uri() == NS_INTERNALS "Controller") {
return new ControllerNode(this, bufs, symbol, polyphonic, parent, srate);
- } else if (uri() == NS_INTERNALS "Delay") {
- return new DelayNode(this, bufs, symbol, polyphonic, parent, srate);
} else if (uri() == NS_INTERNALS "Note") {
return new NoteNode(this, bufs, symbol, polyphonic, parent, srate);
} else if (uri() == NS_INTERNALS "Time") {
diff --git a/src/server/internals/BlockDelay.cpp b/src/server/internals/BlockDelay.cpp
new file mode 100644
index 00000000..39bd09b9
--- /dev/null
+++ b/src/server/internals/BlockDelay.cpp
@@ -0,0 +1,89 @@
+/*
+ This file is part of Ingen.
+ Copyright 2007-2015 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 <limits.h>
+
+#include <cmath>
+
+#include "ingen/URIs.hpp"
+#include "raul/Array.hpp"
+#include "raul/Maid.hpp"
+
+#include "Buffer.hpp"
+#include "InputPort.hpp"
+#include "InternalPlugin.hpp"
+#include "OutputPort.hpp"
+#include "ProcessContext.hpp"
+#include "internals/BlockDelay.hpp"
+
+namespace Ingen {
+namespace Server {
+namespace Internals {
+
+InternalPlugin* BlockDelayNode::internal_plugin(URIs& uris) {
+ return new InternalPlugin(
+ uris, Raul::URI(NS_INTERNALS "BlockDelay"), Raul::Symbol("blockDelay"));
+}
+
+BlockDelayNode::BlockDelayNode(InternalPlugin* plugin,
+ BufferFactory& bufs,
+ const Raul::Symbol& symbol,
+ bool polyphonic,
+ GraphImpl* parent,
+ SampleRate srate)
+ : InternalBlock(plugin, symbol, polyphonic, parent, srate)
+{
+ const Ingen::URIs& uris = bufs.uris();
+ _ports = new Raul::Array<PortImpl*>(2);
+
+ _in_port = new InputPort(bufs, this, Raul::Symbol("in"), 0, 1,
+ PortType::AUDIO, 0, bufs.forge().make(0.0f));
+ _in_port->set_property(uris.lv2_name, bufs.forge().alloc("In"));
+ _ports->at(0) = _in_port;
+
+ _out_port = new OutputPort(bufs, this, Raul::Symbol("out"), 0, 1,
+ PortType::AUDIO, 0, bufs.forge().make(0.0f));
+ _out_port->set_property(uris.lv2_name, bufs.forge().alloc("Out"));
+ _ports->at(1) = _out_port;
+}
+
+BlockDelayNode::~BlockDelayNode()
+{
+ _buffer.reset();
+}
+
+void
+BlockDelayNode::activate(BufferFactory& bufs)
+{
+ _buffer = bufs.get_buffer(
+ bufs.uris().atom_Sound, 0, bufs.audio_buffer_size(), false, true);
+
+ BlockImpl::activate(bufs);
+}
+
+void
+BlockDelayNode::run(ProcessContext& context)
+{
+ // Copy buffer from last cycle to output
+ _out_port->buffer(0)->copy(context, _buffer.get());
+
+ // Copy input from this cycle to buffer
+ _buffer->copy(context, _in_port->buffer(0).get());
+}
+
+} // namespace Internals
+} // namespace Server
+} // namespace Ingen
diff --git a/src/server/internals/Delay.hpp b/src/server/internals/BlockDelay.hpp
index 0dc5da30..e1ef5311 100644
--- a/src/server/internals/Delay.hpp
+++ b/src/server/internals/BlockDelay.hpp
@@ -14,11 +14,10 @@
along with Ingen. If not, see <http://www.gnu.org/licenses/>.
*/
-#ifndef INGEN_INTERNALS_DELAY_HPP
-#define INGEN_INTERNALS_DELAY_HPP
-
-#include <math.h>
+#ifndef INGEN_INTERNALS_BLOCKDELAY_HPP
+#define INGEN_INTERNALS_BLOCKDELAY_HPP
+#include "BufferRef.hpp"
#include "InternalBlock.hpp"
#include "types.hpp"
@@ -32,17 +31,17 @@ class BufferFactory;
namespace Internals {
-class DelayNode : public InternalBlock
+class BlockDelayNode : public InternalBlock
{
public:
- DelayNode(InternalPlugin* plugin,
- BufferFactory& bufs,
- const Raul::Symbol& symbol,
- bool polyphonic,
- GraphImpl* parent,
- SampleRate srate);
+ BlockDelayNode(InternalPlugin* plugin,
+ BufferFactory& bufs,
+ const Raul::Symbol& symbol,
+ bool polyphonic,
+ GraphImpl* parent,
+ SampleRate srate);
- ~DelayNode();
+ ~BlockDelayNode();
void activate(BufferFactory& bufs);
@@ -50,24 +49,14 @@ public:
static InternalPlugin* internal_plugin(URIs& uris);
- float delay_samples() const { return _delay_samples; }
-
private:
- inline float& buffer_at(int64_t phase) const { return _buffer[phase & _buffer_mask]; }
-
- InputPort* _delay_port;
InputPort* _in_port;
OutputPort* _out_port;
- float* _buffer;
- uint32_t _buffer_length;
- uint32_t _buffer_mask;
- uint64_t _write_phase;
- float _last_delay_time;
- float _delay_samples;
+ BufferRef _buffer;
};
} // namespace Server
} // namespace Ingen
} // namespace Internals
-#endif // INGEN_INTERNALS_DELAY_HPP
+#endif // INGEN_INTERNALS_BLOCKDELAY_HPP
diff --git a/src/server/internals/Delay.cpp b/src/server/internals/Delay.cpp
deleted file mode 100644
index 6ac97008..00000000
--- a/src/server/internals/Delay.cpp
+++ /dev/null
@@ -1,205 +0,0 @@
-/*
- This file is part of Ingen.
- Copyright 2007-2015 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 <limits.h>
-
-#include <cmath>
-
-#include "ingen/URIs.hpp"
-#include "raul/Array.hpp"
-#include "raul/Maid.hpp"
-
-#include "Buffer.hpp"
-#include "Driver.hpp"
-#include "Engine.hpp"
-#include "GraphImpl.hpp"
-#include "InputPort.hpp"
-#include "InternalPlugin.hpp"
-#include "OutputPort.hpp"
-#include "RunContext.hpp"
-#include "internals/Delay.hpp"
-#include "util.hpp"
-
-#define CALC_DELAY(delaytime) \
- (f_clamp (delaytime * (float)sample_rate, 1.0f, (float)(buffer_mask + 1)))
-
-using namespace std;
-
-namespace Ingen {
-namespace Server {
-namespace Internals {
-
-static const float MAX_DELAY_SECONDS = 8.0f;
-
-InternalPlugin* DelayNode::internal_plugin(URIs& uris) {
- return new InternalPlugin(
- uris, Raul::URI(NS_INTERNALS "Delay"), Raul::Symbol("delay"));
-}
-
-DelayNode::DelayNode(InternalPlugin* plugin,
- BufferFactory& bufs,
- const Raul::Symbol& symbol,
- bool polyphonic,
- GraphImpl* parent,
- SampleRate srate)
- : InternalBlock(plugin, symbol, polyphonic, parent, srate)
- , _buffer(0)
- , _buffer_length(0)
- , _buffer_mask(0)
- , _write_phase(0)
-{
- const Ingen::URIs& uris = bufs.uris();
- _ports = new Raul::Array<PortImpl*>(3);
-
- const float default_delay = 1.0f;
- _last_delay_time = default_delay;
- _delay_samples = default_delay;
-
- _delay_port = new InputPort(bufs, this, Raul::Symbol("delay"), 1, _polyphony,
- PortType::CONTROL, 0, bufs.forge().make(default_delay));
- _delay_port->set_property(uris.lv2_name, bufs.forge().alloc("Delay"));
- _delay_port->set_property(uris.lv2_default, bufs.forge().make(default_delay));
- _delay_port->set_property(uris.lv2_minimum, bufs.forge().make((float)(1.0/(double)srate)));
- _delay_port->set_property(uris.lv2_maximum, bufs.forge().make(MAX_DELAY_SECONDS));
- _ports->at(0) = _delay_port;
-
- _in_port = new InputPort(bufs, this, Raul::Symbol("in"), 0, 1,
- PortType::AUDIO, 0, bufs.forge().make(0.0f));
- _in_port->set_property(uris.lv2_name, bufs.forge().alloc("Input"));
- _ports->at(1) = _in_port;
-
- _out_port = new OutputPort(bufs, this, Raul::Symbol("out"), 0, 1,
- PortType::AUDIO, 0, bufs.forge().make(0.0f));
- _out_port->set_property(uris.lv2_name,
- bufs.forge().alloc("Output"));
- _ports->at(2) = _out_port;
-
- //_buffer = bufs.get(PortType::AUDIO, bufs.audio_buffer_size(buffer_length_frames), true);
-
-}
-
-DelayNode::~DelayNode()
-{
- //_buffer.reset();
- free(_buffer);
-}
-
-void
-DelayNode::activate(BufferFactory& bufs)
-{
- BlockImpl::activate(bufs);
- const SampleRate rate = bufs.engine().driver()->sample_rate();
- const SampleCount min_size = MAX_DELAY_SECONDS * rate;
-
- // Smallest power of two larger than min_size
- SampleCount size = 1;
- while (size < min_size)
- size <<= 1;
-
- _buffer = (float*)calloc(size, sizeof(float));
- _buffer_mask = size - 1;
- _buffer_length = size;
- //_buffer->clear();
- _write_phase = 0;
-}
-
-static inline float f_clamp(float x, float a, float b)
-{
- const float x1 = fabs(x - a);
- const float x2 = fabs(x - b);
-
- x = x1 + a + b;
- x -= x2;
- x *= 0.5;
-
- return x;
-}
-
-static inline float cube_interp(const float fr, const float inm1, const float
- in, const float inp1, const float inp2)
-{
- return in + 0.5f * fr * (
- inp1 - inm1 + fr * (
- 4.0f * inp1 + 2.0f * inm1 - 5.0f * in - inp2 + fr * (
- 3.0f * (in - inp1) - inm1 + inp2)));
-}
-
-void
-DelayNode::run(RunContext& context)
-{
- Buffer* const delay_buf = _delay_port->buffer(0).get();
- Buffer* const in_buf = _in_port->buffer(0).get();
- Buffer* const out_buf = _out_port->buffer(0).get();
-
- DelayNode* plugin_data = this;
-
- const float* const in = in_buf->samples();
- float* const out = out_buf->samples();
- const float delay_time = delay_buf->samples()[0];
- const uint32_t buffer_mask = plugin_data->_buffer_mask;
- const SampleRate sample_rate = context.engine().driver()->sample_rate();
- float delay_samples = plugin_data->_delay_samples;
- int64_t write_phase = plugin_data->_write_phase;
- const uint32_t sample_count = context.nframes();
-
- if (write_phase == 0) {
- _last_delay_time = delay_time;
- _delay_samples = delay_samples = CALC_DELAY(delay_time);
- }
-
- if (delay_time == _last_delay_time) {
- const int64_t idelay_samples = (int64_t)delay_samples;
- const float frac = delay_samples - idelay_samples;
-
- for (uint32_t i = 0; i < sample_count; i++) {
- int64_t read_phase = write_phase - (int64_t)delay_samples;
- const float read = cube_interp(frac,
- buffer_at(read_phase - 1),
- buffer_at(read_phase),
- buffer_at(read_phase + 1),
- buffer_at(read_phase + 2));
- buffer_at(write_phase++) = in[i];
- out[i] = read;
- }
- } else {
- const float next_delay_samples = CALC_DELAY(delay_time);
- const float delay_samples_slope = (next_delay_samples - delay_samples) / sample_count;
-
- for (uint32_t i = 0; i < sample_count; i++) {
- delay_samples += delay_samples_slope;
- write_phase++;
- const int64_t read_phase = write_phase - (int64_t)delay_samples;
- const int64_t idelay_samples = (int64_t)delay_samples;
- const float frac = delay_samples - idelay_samples;
- const float read = cube_interp(frac,
- buffer_at(read_phase - 1),
- buffer_at(read_phase),
- buffer_at(read_phase + 1),
- buffer_at(read_phase + 2));
- buffer_at(write_phase) = in[i];
- out[i] = read;
- }
-
- _last_delay_time = delay_time;
- _delay_samples = delay_samples;
- }
-
- _write_phase = write_phase;
-}
-
-} // namespace Internals
-} // namespace Server
-} // namespace Ingen
diff --git a/src/server/wscript b/src/server/wscript
index 6f5ffb86..8fda0b2a 100644
--- a/src/server/wscript
+++ b/src/server/wscript
@@ -44,8 +44,8 @@ def build(bld):
events/SetPortValue.cpp
events/Undo.cpp
ingen_engine.cpp
+ internals/BlockDelay.cpp
internals/Controller.cpp
- internals/Delay.cpp
internals/Note.cpp
internals/Time.cpp
internals/Trigger.cpp