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_continue_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"
using namespace ARDOUR;
using namespace PBD;
/** MIDI Clock Position tracking */
class MidiClockTicker::Position : public Timecode::BBT_Time
@ -57,8 +57,9 @@ public:
}
if (frame != fr) {
frame = fr;
s->bbt_time (fr, *this);
s->bbt_time (this->frame, *this);
const TempoMap& tempo = s->tempo_map();
@ -66,8 +67,6 @@ public:
const double divisor = tempo.meter_at(frame).note_divisor();
const double qnote_scale = divisor * 0.25f;
frame = fr;
/* Midi Beats in terms of Song Position Pointer is equivalent to total
sixteenth notes at 'time' */
@ -80,8 +79,6 @@ public:
didit = true;
}
print (std::clog);
return didit;
}
@ -91,7 +88,7 @@ public:
double midi_clocks;
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
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)) {
return;
}
_last_tick = _pos->frame;
// WIP - Testing code
if (0 == _pos->frame) {
std::clog << "zero frame\n";
if (1.0f == _pos->speed) {
std::clog << "normal speed:\n";
}
if (_pos->speed == 0.0f && Config->get_send_midi_clock()) {
uint32_t where = std::floor (_pos->midi_beats);
send_position_event (where, 0);
return;
}
}
@ -174,48 +170,52 @@ MidiClockTicker::transport_state_changed()
return;
}
float speed = _session->transport_speed();
framepos_t position = _session->transport_frame();
if (! _pos->sync (_session)) {
return;
}
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 = position;
_last_tick = _pos->frame;
if (!Config->get_send_midi_clock())
return;
if (! Config->get_send_midi_clock()) {
return;
}
if (_pos->speed == 1.0f) {
if (_session->get_play_loop()) {
assert(_session->locations()->auto_loop_location());
if (position == _session->locations()->auto_loop_location()->start()) {
if (_pos->frame == _session->locations()->auto_loop_location()->start()) {
send_start_event(0);
} else {
send_continue_event(0);
}
} else if (position == 0) {
} else if (_pos->frame == 0) {
send_start_event(0);
} else {
send_continue_event(0);
}
send_midi_clock_event(0);
// send_midi_clock_event (0);
} else if (speed == 0.0f) {
if (!Config->get_send_midi_clock())
return;
send_stop_event(0);
send_position_event (position, 0);
} else if (_pos->speed == 0.0f) {
send_stop_event (0);
send_position_event (std::floor (_pos->midi_beats), 0);
}
tick (position);
// tick (_pos->frame);
}
void
MidiClockTicker::position_changed (framepos_t position)
MidiClockTicker::position_changed (framepos_t)
{
#if 0
const double speed = _session->transport_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;
#endif
}
void
@ -347,22 +348,12 @@ MidiClockTicker::send_stop_event (pframes_t offset)
}
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;
}
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 */
if (midi_beats > 0x3fff) {
return;
@ -375,7 +366,7 @@ MidiClockTicker::send_position_event (framepos_t transport_position, pframes_t o
midi_beats & 0x3f80
};
DEBUG_TRACE (PBD::DEBUG::MidiClock, string_compose ("Song Position: %1\n", midi_beats));
_midi_port->midimsg (msg, sizeof (msg), offset);
DEBUG_TRACE (PBD::DEBUG::MidiClock, string_compose ("Song Position Sent: %1\n", midi_beats));
}