13
0

- Send position data from internal position class

- Proper midi beat conversions for all time signatures
- Disable responding to Session::PositionChanged in place
  of Session::Located.
This commit is contained in:
Michael Fisher 2013-08-01 00:09:42 -05:00 committed by Paul Davis
parent 7d5102543c
commit d6480f15f9
2 changed files with 38 additions and 47 deletions

View File

@ -83,7 +83,7 @@ private:
void send_start_event (pframes_t offset); void send_start_event (pframes_t offset);
void send_continue_event (pframes_t offset); void send_continue_event (pframes_t offset);
void send_stop_event (pframes_t offset); void send_stop_event (pframes_t offset);
void send_position_event (framepos_t transport_position, pframes_t offset); void send_position_event (uint32_t midi_clocks, pframes_t offset);
}; };
} }

View File

@ -32,7 +32,7 @@
#include "ardour/debug.h" #include "ardour/debug.h"
using namespace ARDOUR; using namespace ARDOUR;
using namespace PBD;
/** MIDI Clock Position tracking */ /** MIDI Clock Position tracking */
class MidiClockTicker::Position : public Timecode::BBT_Time class MidiClockTicker::Position : public Timecode::BBT_Time
@ -57,8 +57,9 @@ public:
} }
if (frame != fr) { if (frame != fr) {
frame = fr;
s->bbt_time (fr, *this); s->bbt_time (this->frame, *this);
const TempoMap& tempo = s->tempo_map(); const TempoMap& tempo = s->tempo_map();
@ -66,8 +67,6 @@ public:
const double divisor = tempo.meter_at(frame).note_divisor(); const double divisor = tempo.meter_at(frame).note_divisor();
const double qnote_scale = divisor * 0.25f; const double qnote_scale = divisor * 0.25f;
frame = fr;
/* Midi Beats in terms of Song Position Pointer is equivalent to total /* Midi Beats in terms of Song Position Pointer is equivalent to total
sixteenth notes at 'time' */ sixteenth notes at 'time' */
@ -80,8 +79,6 @@ public:
didit = true; didit = true;
} }
print (std::clog);
return didit; return didit;
} }
@ -91,7 +88,7 @@ public:
double midi_clocks; double midi_clocks;
void print (std::ostream& s) { void print (std::ostream& s) {
s << "MCLK Position: frames: " << frame << " midi beats: " << midi_beats << " speed: " << speed << std::endl; s << "frames: " << frame << " midi beats: " << midi_beats << " speed: " << speed;
} }
}; };
@ -132,19 +129,18 @@ MidiClockTicker::set_session (Session* s)
void void
MidiClockTicker::session_located() MidiClockTicker::session_located()
{ {
DEBUG_TRACE (DEBUG::MidiClock, string_compose ("Session Located: %1, speed: %2\n", _session->transport_frame(), _session->transport_speed()));
if (0 == _session || ! _pos->sync (_session)) { if (0 == _session || ! _pos->sync (_session)) {
return; return;
} }
_last_tick = _pos->frame; _last_tick = _pos->frame;
// WIP - Testing code if (_pos->speed == 0.0f && Config->get_send_midi_clock()) {
if (0 == _pos->frame) { uint32_t where = std::floor (_pos->midi_beats);
std::clog << "zero frame\n"; send_position_event (where, 0);
if (1.0f == _pos->speed) { return;
std::clog << "normal speed:\n";
}
} }
} }
@ -174,48 +170,52 @@ MidiClockTicker::transport_state_changed()
return; return;
} }
float speed = _session->transport_speed(); if (! _pos->sync (_session)) {
framepos_t position = _session->transport_frame(); return;
}
DEBUG_TRACE (PBD::DEBUG::MidiClock, DEBUG_TRACE (PBD::DEBUG::MidiClock,
string_compose ("Transport state change @ %4, speed: %1 position: %2 play loop: %3\n", speed, position, _session->get_play_loop(), position) string_compose ("Transport state change @ %4, speed: %1 position: %2 play loop: %3\n",
_pos->speed, _pos->frame, _session->get_play_loop(), _pos->frame)
); );
if (speed == 1.0f) { _last_tick = _pos->frame;
_last_tick = position;
if (!Config->get_send_midi_clock()) if (! Config->get_send_midi_clock()) {
return; return;
}
if (_pos->speed == 1.0f) {
if (_session->get_play_loop()) { if (_session->get_play_loop()) {
assert(_session->locations()->auto_loop_location()); assert(_session->locations()->auto_loop_location());
if (position == _session->locations()->auto_loop_location()->start()) {
send_start_event(0); if (_pos->frame == _session->locations()->auto_loop_location()->start()) {
} else {
send_continue_event(0);
}
} else if (position == 0) {
send_start_event(0); send_start_event(0);
} else { } else {
send_continue_event(0); send_continue_event(0);
} }
send_midi_clock_event(0); } else if (_pos->frame == 0) {
send_start_event(0);
} else {
send_continue_event(0);
}
} else if (speed == 0.0f) { // send_midi_clock_event (0);
if (!Config->get_send_midi_clock())
return;
} else if (_pos->speed == 0.0f) {
send_stop_event (0); send_stop_event (0);
send_position_event (position, 0); send_position_event (std::floor (_pos->midi_beats), 0);
} }
tick (position); // tick (_pos->frame);
} }
void void
MidiClockTicker::position_changed (framepos_t position) MidiClockTicker::position_changed (framepos_t)
{ {
#if 0
const double speed = _session->transport_speed(); const double speed = _session->transport_speed();
DEBUG_TRACE (PBD::DEBUG::MidiClock, string_compose ("Transport Position Change: %1, speed: %2\n", position, speed)); DEBUG_TRACE (PBD::DEBUG::MidiClock, string_compose ("Transport Position Change: %1, speed: %2\n", position, speed));
@ -224,6 +224,7 @@ MidiClockTicker::position_changed (framepos_t position)
} }
_last_tick = position; _last_tick = position;
#endif
} }
void void
@ -347,22 +348,12 @@ MidiClockTicker::send_stop_event (pframes_t offset)
} }
void void
MidiClockTicker::send_position_event (framepos_t transport_position, pframes_t offset) MidiClockTicker::send_position_event (uint32_t midi_beats, pframes_t offset)
{ {
if (_midi_port == 0 || _session == 0 || _session->engine().freewheeling()) { if (!_midi_port) {
return; return;
} }
const TempoMap& tempo = _session->tempo_map();
Timecode::BBT_Time time;
_session->bbt_time (transport_position, time);
const double beats_per_bar = tempo.meter_at(transport_position).divisions_per_bar();
/* Midi Beats in terms of Song Position Pointer is equivalent to total
sixteenth notes at 'time' */
const uint32_t midi_beats = 4 * (((time.bars - 1) * beats_per_bar) + time.beats - 1);
/* can only use 14bits worth */ /* can only use 14bits worth */
if (midi_beats > 0x3fff) { if (midi_beats > 0x3fff) {
return; return;
@ -375,7 +366,7 @@ MidiClockTicker::send_position_event (framepos_t transport_position, pframes_t o
midi_beats & 0x3f80 midi_beats & 0x3f80
}; };
DEBUG_TRACE (PBD::DEBUG::MidiClock, string_compose ("Song Position: %1\n", midi_beats));
_midi_port->midimsg (msg, sizeof (msg), offset); _midi_port->midimsg (msg, sizeof (msg), offset);
DEBUG_TRACE (PBD::DEBUG::MidiClock, string_compose ("Song Position Sent: %1\n", midi_beats));
} }