#include "pbd/error.h"
#include "pbd/failed_constructor.h"
#include "pbd/pthread_utils.h"
+#include "pbd/convert.h"
#include "midi++/port.h"
#include "ardour/debug.h"
#include "ardour/slave.h"
-#include "ardour/session.h"
-#include "ardour/audioengine.h"
-#include "ardour/cycles.h"
#include "ardour/tempo.h"
-
#include "i18n.h"
using namespace std;
using namespace MIDI;
using namespace PBD;
-#define DEBUG_MIDI_CLOCK 1
-
MIDIClock_Slave::MIDIClock_Slave (Session& s, MIDI::Port& p, int ppqn)
: ppqn (ppqn)
, bandwidth (1.0 / 60.0) // 1 BpM = 1 / 60 Hz
MIDIClock_Slave::calculate_one_ppqn_in_frames_at(framepos_t time)
{
const Tempo& current_tempo = session->tempo_map().tempo_at(time);
- const Meter& current_meter = session->tempo_map().meter_at(time);
- double frames_per_beat =
- current_tempo.frames_per_beat(session->frame_rate(),
- current_meter);
+ double frames_per_beat = current_tempo.frames_per_beat(session->frame_rate());
double quarter_notes_per_beat = 4.0 / current_tempo.note_type();
double frames_per_quarter_note = frames_per_beat / quarter_notes_per_beat;
t1 * session->frame_rate(),
session->frame_rate(),
((t1 - t0) * session->frame_rate()) / one_ppqn_in_frames));
-
+
last_timestamp = timestamp;
}
_starting = true;
_started = true;
-
+
// session->request_locate(0, false);
+ current_delta = 0;
}
void
// calculate speed
speed = ((t1 - t0) * session->frame_rate()) / one_ppqn_in_frames;
-
+
// provide a 3% deadzone to lock the speed
if (fabs(speed - 1.0) <= 0.03)
speed = 1.0;
}
DEBUG_TRACE (DEBUG::MidiClock, string_compose ("speed_and_position: %1 & %2 <-> %3 (transport)\n", speed, pos, session->transport_frame()));
+ current_delta = pos - session->transport_frame();
return true;
}
return (framecnt_t) one_ppqn_in_frames * ppqn;
}
+std::string
+MIDIClock_Slave::approximate_current_delta() const
+{
+ char delta[80];
+ if (last_timestamp == 0 || _starting) {
+ snprintf(delta, sizeof(delta), "\u2012\u2012\u2012\u2012");
+ } else {
+ snprintf(delta, sizeof(delta), "\u0394<span foreground=\"green\" face=\"monospace\" >%s%s%" PRIi64 "</span> sm",
+ LEADINGZERO(abs(current_delta)), PLUSMINUS(-current_delta), abs(current_delta));
+ }
+ return std::string(delta);
+}
+