#include <glibmm/miscutils.h>
#include <evoral/SMFReader.hpp>
+#include <evoral/Control.hpp>
#include <ardour/smf_source.h>
#include <ardour/session.h>
SMFSource::SMFSource (Session& s, std::string path, Flag flags)
: MidiSource (s, region_name_from_path(path, false))
- , SMF ()
+ , Evoral::SMF<double> ()
, _flags (Flag(flags | Writable)) // FIXME: this needs to be writable for now
, _allow_remove_if_empty(true)
+ , _last_ev_time(0)
{
/* constructor used for new internal-to-session files. file cannot exist */
throw failed_constructor ();
}
- if (open(path)) {
+ if (create(path)) {
throw failed_constructor ();
}
: MidiSource (s, node)
, _flags (Flag (Writable|CanRename))
, _allow_remove_if_empty(true)
+ , _last_ev_time(0)
{
/* constructor used for existing internal-to-session files. file must exist */
/** All stamps in audio frames */
nframes_t
-SMFSource::read_unlocked (MidiRingBuffer& dst, nframes_t start, nframes_t cnt, nframes_t stamp_offset, nframes_t negative_stamp_offset) const
+SMFSource::read_unlocked (MidiRingBuffer<double>& dst, nframes_t start, nframes_t cnt, nframes_t stamp_offset, nframes_t negative_stamp_offset) const
{
//cerr << "SMF read_unlocked " << name() << " read " << start << ", count=" << cnt << ", offset=" << stamp_offset << endl;
size_t scratch_size = 0; // keep track of scratch to minimize reallocs
// FIXME: don't seek to start and search every read (brutal!)
- SMF::seek_to_start();
+ Evoral::SMF<double>::seek_to_start();
// FIXME: assumes tempo never changes after start
const double frames_per_beat = _session.tempo_map().tempo_at(_timeline_position).frames_per_beat(
const uint64_t start_ticks = (uint64_t)((start / frames_per_beat) * ppqn());
- while (!SMF::eof()) {
+ while (!Evoral::SMF<double>::eof()) {
int ret = read_event(&ev_delta_t, &ev_size, &ev_buffer);
if (ret == -1) { // EOF
//cerr << "SMF - EOF\n";
/** All stamps in audio frames */
nframes_t
-SMFSource::write_unlocked (MidiRingBuffer& src, nframes_t cnt)
+SMFSource::write_unlocked (MidiRingBuffer<double>& src, nframes_t cnt)
{
_write_data_count = 0;
- Evoral::EventTime time;
+ double time;
Evoral::EventType type;
uint32_t size;
if (_model && ! _model->writing())
_model->start_write();
- Evoral::MIDIEvent ev(0, 0.0, 4, NULL, true);
+ Evoral::MIDIEvent<double> ev(0, 0.0, 4, NULL, true);
while (true) {
bool ret = src.peek_time(&time);
}
if (_model) {
- make_sure_controls_have_the_right_interpolation();
+ set_default_controls_interpolation();
}
- SMF::flush();
+ Evoral::SMF<double>::flush();
free(buf);
const nframes_t oldlen = _length;
void
-SMFSource::append_event_unlocked(EventTimeUnit unit, const Evoral::Event& ev)
+SMFSource::append_event_unlocked(EventTimeUnit unit, const Evoral::Event<double>& ev)
{
- if (ev.size() == 0)
+ if (ev.size() == 0) {
+ cerr << "SMFSource: Warning: skipping empty event" << endl;
return;
+ }
- /*printf("SMFSource: %s - append_event_unlocked chan = %u, time = %lf, size = %u, data = ",
- name().c_str(), (unsigned)ev.channel(), ev.time(), ev.size());
+ /*
+ printf("SMFSource: %s - append_event_unlocked time = %lf, size = %u, data = ",
+ name().c_str(), ev.time(), ev.size());
for (size_t i=0; i < ev.size(); ++i) {
printf("%X ", ev.buffer()[i]);
}
- printf("\n");*/
+ printf("\n");
+ */
assert(ev.time() >= 0);
delta_time = (uint32_t)((ev.time() - last_event_time()) * ppqn());
}
- SMF::append_event_unlocked(delta_time, ev);
+ Evoral::SMF<double>::append_event_delta(delta_time, ev);
+ _last_ev_time = ev.time();
_write_data_count += ev.size();
}
SMFSource::mark_streaming_midi_write_started (NoteMode mode, nframes_t start_frame)
{
MidiSource::mark_streaming_midi_write_started (mode, start_frame);
- SMF::begin_write (start_frame);
+ Evoral::SMF<double>::begin_write ();
+ _last_ev_time = 0;
}
void
}
_model->set_edited(false);
- SMF::end_write ();
+ Evoral::SMF<double>::end_write ();
}
void
}
_model->start_write();
- SMF::seek_to_start();
+ Evoral::SMF<double>::seek_to_start();
uint64_t time = 0; /* in SMF ticks */
- Evoral::Event ev;
+ Evoral::Event<double> ev;
size_t scratch_size = 0; // keep track of scratch and minimize reallocs
if (ret > 0) { // didn't skip (meta) event
// make ev.time absolute time in frames
- ev.time() = time * frames_per_beat / (Evoral::EventTime)ppqn();
+ ev.time() = time * frames_per_beat / (double)ppqn();
ev.set_event_type(EventTypeMap::instance().midi_event_type(buf[0]));
_model->append(ev);
}
}
}
- make_sure_controls_have_the_right_interpolation();
+ set_default_controls_interpolation();
_model->end_write(false);
_model->set_edited(false);
#define LINEAR_INTERPOLATION_MODE_WORKS_PROPERLY 0
void
-SMFSource::make_sure_controls_have_the_right_interpolation()
+SMFSource::set_default_controls_interpolation()
{
// set interpolation style to defaults, can be changed by the GUI later
Evoral::ControlSet::Controls controls = _model->controls();
void
SMFSource::flush_midi()
{
- SMF::end_write();
+ Evoral::SMF<double>::end_write();
}