aboutsummaryrefslogtreecommitdiffstats
path: root/src/engine/MachineBuilder.cpp
diff options
context:
space:
mode:
authorDavid Robillard <d@drobilla.net>2013-01-12 03:17:47 +0000
committerDavid Robillard <d@drobilla.net>2013-01-12 03:17:47 +0000
commite1a63732f796c8057751cb7f8ac98a595b91692e (patch)
tree764392d055901118ee285dd20f233ff33e0cd04a /src/engine/MachineBuilder.cpp
parentbb62bf2c23ba84f547e37b70b3ef31b51ba987ab (diff)
downloadmachina-e1a63732f796c8057751cb7f8ac98a595b91692e.tar.gz
machina-e1a63732f796c8057751cb7f8ac98a595b91692e.tar.bz2
machina-e1a63732f796c8057751cb7f8ac98a595b91692e.zip
Bulk reformat.
git-svn-id: http://svn.drobilla.net/lad/trunk/machina@4929 a436a847-0d15-0410-975c-d299462d15a1
Diffstat (limited to 'src/engine/MachineBuilder.cpp')
-rw-r--r--src/engine/MachineBuilder.cpp142
1 files changed, 88 insertions, 54 deletions
diff --git a/src/engine/MachineBuilder.cpp b/src/engine/MachineBuilder.cpp
index 1eaf22e..818c893 100644
--- a/src/engine/MachineBuilder.cpp
+++ b/src/engine/MachineBuilder.cpp
@@ -42,15 +42,14 @@ MachineBuilder::MachineBuilder(SharedPtr<Machine> machine, double q, bool step)
, _connect_node(_initial_node)
, _connect_node_end_time(_time) // = 0
, _step(step)
-{
-}
+{}
void
MachineBuilder::reset()
{
- _time = TimeStamp(_machine->time().unit()); // = 0
- _initial_node = SharedPtr<Node>(new Node(_time, true)); // duration 0
- _connect_node = _initial_node;
+ _time = TimeStamp(_machine->time().unit()); // = 0
+ _initial_node = SharedPtr<Node>(new Node(_time, true)); // duration 0
+ _connect_node = _initial_node;
_connect_node_end_time = _time; // = 0
}
@@ -63,7 +62,8 @@ MachineBuilder::is_delay_node(SharedPtr<Node> node) const
/** Set the duration of a node, with quantization.
*/
void
-MachineBuilder::set_node_duration(SharedPtr<Node> node, Raul::TimeDuration d) const
+MachineBuilder::set_node_duration(SharedPtr<Node> node,
+ Raul::TimeDuration d) const
{
if (_step) {
node->set_duration(TimeStamp(d.unit(), 1, 0));
@@ -73,9 +73,9 @@ MachineBuilder::set_node_duration(SharedPtr<Node> node, Raul::TimeDuration d) co
Raul::TimeStamp q_dur = quantize(TimeStamp(d.unit(), _quantization), d);
// Never quantize a note to duration 0
- if (q_dur.is_zero() && ( node->enter_action() || node->exit_action() ))
+ if (q_dur.is_zero() && ( node->enter_action() || node->exit_action() )) {
q_dur = _quantization; // Round up
-
+ }
node->set_duration(q_dur);
}
@@ -85,8 +85,10 @@ MachineBuilder::set_node_duration(SharedPtr<Node> node, Raul::TimeDuration d) co
*/
SharedPtr<Node>
MachineBuilder::connect_nodes(SharedPtr<Machine> m,
- SharedPtr<Node> tail, Raul::TimeStamp tail_end_time,
- SharedPtr<Node> head, Raul::TimeStamp head_start_time)
+ SharedPtr<Node> tail,
+ Raul::TimeStamp tail_end_time,
+ SharedPtr<Node> head,
+ Raul::TimeStamp head_start_time)
{
assert(tail != head);
assert(head_start_time >= tail_end_time);
@@ -95,7 +97,8 @@ MachineBuilder::connect_nodes(SharedPtr<Machine> m,
if (is_delay_node(tail) && tail->edges().size() == 0) {
// Tail is a delay node, just accumulate the time difference into it
- set_node_duration(tail, tail->duration() + head_start_time - tail_end_time);
+ set_node_duration(tail,
+ tail->duration() + head_start_time - tail_end_time);
tail->add_edge(SharedPtr<Edge>(new Edge(tail, head)));
} else if (_step || (head_start_time == tail_end_time)) {
// Connect directly
@@ -117,10 +120,11 @@ MachineBuilder::event(Raul::TimeStamp time_offset,
unsigned char* buf)
{
const Raul::TimeUnit unit = time_offset.unit();
- Raul::TimeStamp t = _time + time_offset;
+ Raul::TimeStamp t = _time + time_offset;
- if (ev_size == 0)
+ if (ev_size == 0) {
return;
+ }
if ((buf[0] & 0xF0) == LV2_MIDI_MSG_NOTE_ON) {
@@ -132,10 +136,11 @@ MachineBuilder::event(Raul::TimeStamp time_offset,
// If currently polyphonic, use a poly node with no successors as connect node
// Results in patterns closest to what a human would choose
- if ( ! _poly_nodes.empty()) {
- for (PolyList::iterator j = _poly_nodes.begin(); j != _poly_nodes.end(); ++j) {
+ if (!_poly_nodes.empty()) {
+ for (PolyList::iterator j = _poly_nodes.begin();
+ j != _poly_nodes.end(); ++j) {
if (j->second->edges().empty()) {
- this_connect_node = j->second;
+ this_connect_node = j->second;
this_connect_node_end_time = j->first + j->second->duration();
break;
}
@@ -144,17 +149,20 @@ MachineBuilder::event(Raul::TimeStamp time_offset,
// Currently monophonic, or didn't find a poly node, so use _connect_node
// which is maintained below on note off events.
- if ( ! this_connect_node) {
+ if (!this_connect_node) {
this_connect_node = _connect_node;
this_connect_node_end_time = _connect_node_end_time;
}
SharedPtr<Node> delay_node = connect_nodes(_machine,
- this_connect_node, this_connect_node_end_time, node, t);
+ this_connect_node,
+ this_connect_node_end_time,
+ node,
+ t);
if (delay_node) {
- _connect_node = delay_node;
- _connect_node_end_time = t;
+ _connect_node = delay_node;
+ _connect_node_end_time = t;
}
node->enter(NULL, t);
@@ -162,21 +170,25 @@ MachineBuilder::event(Raul::TimeStamp time_offset,
} else if ((buf[0] & 0xF0) == LV2_MIDI_MSG_NOTE_OFF) {
- for (ActiveList::iterator i = _active_nodes.begin(); i != _active_nodes.end(); ++i) {
- SharedPtr<MidiAction> action = PtrCast<MidiAction>((*i)->enter_action());
- if (!action)
+ for (ActiveList::iterator i = _active_nodes.begin();
+ i != _active_nodes.end(); ++i) {
+ SharedPtr<MidiAction> action = PtrCast<MidiAction>(
+ (*i)->enter_action());
+ if (!action) {
continue;
+ }
const size_t ev_size = action->event_size();
const unsigned char* ev = action->event();
- if (ev_size == 3 && (ev[0] & 0xF0) == LV2_MIDI_MSG_NOTE_ON
- && (ev[0] & 0x0F) == (buf[0] & 0x0F) // same channel
- && ev[1] == buf[1]) // same note
- {
+ if ((ev_size == 3) && ((ev[0] & 0xF0) == LV2_MIDI_MSG_NOTE_ON)
+ && ((ev[0] & 0x0F) == (buf[0] & 0x0F)) // same channel
+ && (ev[1] == buf[1])) {
+ // same note
SharedPtr<Node> resolved = *i;
- resolved->set_exit_action(SharedPtr<Action>(new MidiAction(ev_size, buf)));
+ resolved->set_exit_action(
+ SharedPtr<Action>(new MidiAction(ev_size, buf)));
set_node_duration(resolved, t - resolved->enter_time());
// Last active note
@@ -192,35 +204,45 @@ MachineBuilder::event(Raul::TimeStamp time_offset,
connect_nodes(_machine, resolved, t, _connect_node, t);
- for (PolyList::iterator j = _poly_nodes.begin(); j != _poly_nodes.end(); ++j) {
+ for (PolyList::iterator j = _poly_nodes.begin();
+ j != _poly_nodes.end(); ++j) {
_machine->add_node(j->second);
- if (j->second->edges().size() == 0)
- connect_nodes(_machine, j->second, j->first + j->second->duration(),
- _connect_node, t);
+ if (j->second->edges().size() == 0) {
+ connect_nodes(_machine, j->second,
+ j->first + j->second->duration(),
+ _connect_node, t);
+ }
}
_poly_nodes.clear();
_machine->add_node(resolved);
- // Just monophonic
+ // Just monophonic
} else {
// Trim useless delay node if possible (these appear after poly sections)
- if (is_delay_node(_connect_node) && _connect_node->duration().is_zero()
- && _connect_node->edges().size() == 1
- && (*_connect_node->edges().begin())->head() == resolved) {
+ if (is_delay_node(_connect_node)
+ && _connect_node->duration().is_zero()
+ && ( _connect_node->edges().size() == 1)
+ && ( (*_connect_node->edges().begin())->head() ==
+ resolved) ) {
_connect_node->edges().clear();
assert(_connect_node->edges().empty());
- _connect_node->set_enter_action(resolved->enter_action());
- _connect_node->set_exit_action(resolved->exit_action());
+ _connect_node->set_enter_action(
+ resolved->enter_action());
+ _connect_node->set_exit_action(
+ resolved->exit_action());
resolved->set_enter_action(SharedPtr<Action>());
resolved->set_exit_action(SharedPtr<Action>());
set_node_duration(_connect_node, resolved->duration());
resolved = _connect_node;
- if (std::find(_machine->nodes().begin(), _machine->nodes().end(), _connect_node)
- == _machine->nodes().end())
+ if (std::find(_machine->nodes().begin(),
+ _machine->nodes().end(),
+ _connect_node)
+ == _machine->nodes().end()) {
_machine->add_node(_connect_node);
+ }
} else {
_connect_node = resolved;
@@ -228,15 +250,17 @@ MachineBuilder::event(Raul::TimeStamp time_offset,
}
}
- // Polyphonic, add this state to poly list
+ // Polyphonic, add this state to poly list
} else {
- _poly_nodes.push_back(make_pair(resolved->enter_time(), resolved));
- _connect_node = resolved;
+ _poly_nodes.push_back(make_pair(resolved->enter_time(),
+ resolved));
+ _connect_node = resolved;
_connect_node_end_time = t;
}
- if (resolved->is_active())
+ if (resolved->is_active()) {
resolved->exit(NULL, t);
+ }
_active_nodes.erase(i);
@@ -254,18 +278,26 @@ void
MachineBuilder::resolve()
{
// Resolve stuck notes
- if ( ! _active_nodes.empty()) {
- for (list<SharedPtr<Node> >::iterator i = _active_nodes.begin(); i != _active_nodes.end(); ++i) {
+ if (!_active_nodes.empty()) {
+ for (list<SharedPtr<Node> >::iterator i = _active_nodes.begin();
+ i != _active_nodes.end(); ++i) {
cerr << "WARNING: Resolving stuck note." << endl;
- SharedPtr<MidiAction> action = PtrCast<MidiAction>((*i)->enter_action());
- if (!action)
+ SharedPtr<MidiAction> action = PtrCast<MidiAction>(
+ (*i)->enter_action());
+ if (!action) {
continue;
+ }
const size_t ev_size = action->event_size();
const unsigned char* ev = action->event();
- if (ev_size == 3 && (ev[0] & 0xF0) == LV2_MIDI_MSG_NOTE_ON) {
- unsigned char note_off[3] = { ((LV2_MIDI_MSG_NOTE_OFF & 0xF0) | (ev[0] & 0x0F)), ev[1], 0x40 };
- (*i)->set_exit_action(SharedPtr<Action>(new MidiAction(3, note_off)));
+ if (( ev_size == 3)
+ && ( (ev[0] & 0xF0) == LV2_MIDI_MSG_NOTE_ON) ) {
+ unsigned char note_off[3]
+ = { ((LV2_MIDI_MSG_NOTE_OFF & 0xF0) | (ev[0] & 0x0F)),
+ ev[1],
+ 0x40 };
+ (*i)->set_exit_action(
+ SharedPtr<Action>(new MidiAction(3, note_off)));
set_node_duration((*i), _time - (*i)->enter_time());
(*i)->exit(NULL, _time);
_machine->add_node((*i));
@@ -275,10 +307,12 @@ MachineBuilder::resolve()
}
// Add initial note if necessary
- if (_machine->nodes().size() > 0
- && (std::find(_machine->nodes().begin(), _machine->nodes().end(), _initial_node)
- == _machine->nodes().end()))
+ if (( _machine->nodes().size() > 0)
+ && (std::find(_machine->nodes().begin(), _machine->nodes().end(),
+ _initial_node)
+ == _machine->nodes().end())) {
_machine->add_node(_initial_node);
+ }
}