- 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:
parent
7d5102543c
commit
d6480f15f9
@ -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);
|
||||||
};
|
};
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -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));
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user