diff options
author | David Robillard <d@drobilla.net> | 2013-01-12 03:17:47 +0000 |
---|---|---|
committer | David Robillard <d@drobilla.net> | 2013-01-12 03:17:47 +0000 |
commit | e1a63732f796c8057751cb7f8ac98a595b91692e (patch) | |
tree | 764392d055901118ee285dd20f233ff33e0cd04a /src/engine/MachineBuilder.cpp | |
parent | bb62bf2c23ba84f547e37b70b3ef31b51ba987ab (diff) | |
download | machina-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.cpp | 142 |
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); + } } |