template<typename T> class MidiRingBuffer;
/** Standard Midi File (Type 0) Source */
-class SMFSource : public MidiSource, public Evoral::SMF<double> {
+class SMFSource : public MidiSource, public Evoral::SMF {
public:
enum Flag {
Writable = 0x1,
}
static void
-write_midi_data_to_new_files (Evoral::SMF<double>* source, Session::import_status& status,
+write_midi_data_to_new_files (Evoral::SMF* source, Session::import_status& status,
vector<boost::shared_ptr<Source> >& newfiles)
{
uint32_t buf_size = 4;
p != status.paths.end() && !status.cancel;
++p, ++cnt)
{
- boost::shared_ptr<ImportableSource> source;
- std::auto_ptr< Evoral::SMF<double> > smf_reader;
+ boost::shared_ptr<ImportableSource> source;
+ std::auto_ptr<Evoral::SMF> smf_reader;
const DataType type = ((*p).rfind(".mid") != string::npos) ?
DataType::MIDI : DataType::AUDIO;
} else {
try {
- smf_reader = std::auto_ptr< Evoral::SMF<double> >(new Evoral::SMF<double>());
+ smf_reader = std::auto_ptr<Evoral::SMF>(new Evoral::SMF());
smf_reader->open(*p);
channels = smf_reader->num_tracks();
} catch (...) {
SMFSource::SMFSource (Session& s, std::string path, Flag flags)
: MidiSource (s, region_name_from_path(path, false))
- , Evoral::SMF<double> ()
+ , Evoral::SMF ()
, _flags (Flag(flags | Writable)) // FIXME: this needs to be writable for now
, _allow_remove_if_empty(true)
, _last_ev_time(0)
size_t scratch_size = 0; // keep track of scratch to minimize reallocs
// FIXME: don't seek to start and search every read (brutal!)
- Evoral::SMF<double>::seek_to_start();
+ Evoral::SMF::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 (!Evoral::SMF<double>::eof()) {
+ while (!Evoral::SMF::eof()) {
int ret = read_event(&ev_delta_t, &ev_size, &ev_buffer);
if (ret == -1) { // EOF
//cerr << "SMF - EOF\n";
set_default_controls_interpolation();
}
- Evoral::SMF<double>::flush();
+ Evoral::SMF::flush();
free(buf);
const nframes_t oldlen = _length;
delta_time = (uint32_t)((ev.time() - last_event_time()) * ppqn());
}
- Evoral::SMF<double>::append_event_delta(delta_time, ev.size(), ev.buffer());
+ Evoral::SMF::append_event_delta(delta_time, ev.size(), ev.buffer());
_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);
- Evoral::SMF<double>::begin_write ();
+ Evoral::SMF::begin_write ();
_last_ev_time = 0;
}
}
_model->set_edited(false);
- Evoral::SMF<double>::end_write ();
+ Evoral::SMF::end_write ();
}
void
}
_model->start_write();
- Evoral::SMF<double>::seek_to_start();
+ Evoral::SMF::seek_to_start();
uint64_t time = 0; /* in SMF ticks */
Evoral::Event<double> ev;
void
SMFSource::flush_midi()
{
- Evoral::SMF<double>::end_write();
+ Evoral::SMF::end_write();
}
namespace Evoral {
-template<typename Time> class Event;
-template<typename Time> class EventRingBuffer;
-
-#define THROW_FILE_ERROR throw(typename SMF<Time>::FileError)
+#define THROW_FILE_ERROR throw(FileError)
/** Standard Midi File.
* Currently only tempo-based time of a given PPQN is supported.
*/
-template<typename Time>
class SMF {
public:
class FileError : public std::exception {
namespace Evoral {
-template<typename Time>
-SMF<Time>::~SMF()
+SMF::~SMF()
{
if (_smf) {
smf_delete(_smf);
}
}
-template<typename Time>
uint16_t
-SMF<Time>::num_tracks() const
+SMF::num_tracks() const
{
return _smf->number_of_tracks;
}
-template<typename Time>
uint16_t
-SMF<Time>::ppqn() const
+SMF::ppqn() const
{
return _smf->ppqn;
}
/** Seek to the specified track (1-based indexing)
* \return 0 on success
*/
-template<typename Time>
int
-SMF<Time>::seek_to_track(int track)
+SMF::seek_to_track(int track)
{
_smf_track = smf_get_track_by_number(_smf, track);
if (_smf_track != NULL) {
* -1 if the file can not be opened or created
* -2 if the file exists but specified track does not exist
*/
-template<typename Time>
int
-SMF<Time>::open(const std::string& path, int track) THROW_FILE_ERROR
+SMF::open(const std::string& path, int track) THROW_FILE_ERROR
{
assert(track >= 1);
if (_smf) {
* -1 if the file can not be created
* -2 if the track can not be created
*/
-template<typename Time>
int
-SMF<Time>::create(const std::string& path, int track, uint16_t ppqn) THROW_FILE_ERROR
+SMF::create(const std::string& path, int track, uint16_t ppqn) THROW_FILE_ERROR
{
assert(track >= 1);
if (_smf) {
return 0;
}
-template<typename Time>
void
-SMF<Time>::close() THROW_FILE_ERROR
+SMF::close() THROW_FILE_ERROR
{
if (_smf) {
if (smf_save(_smf, _path.c_str()) != 0) {
}
}
-template<typename Time>
void
-SMF<Time>::seek_to_start() const
+SMF::seek_to_start() const
{
_smf_track->next_event_number = 1;
}
* \return event length (including status byte) on success, 0 if event was
* skipped (e.g. a meta event), or -1 on EOF (or end of track).
*/
-template<typename Time>
int
-SMF<Time>::read_event(uint32_t* delta_t, uint32_t* size, uint8_t** buf) const
+SMF::read_event(uint32_t* delta_t, uint32_t* size, uint8_t** buf) const
{
smf_event_t* event;
}
}
-template<typename Time>
void
-SMF<Time>::append_event_delta(uint32_t delta_t, uint32_t size, const uint8_t* buf)
+SMF::append_event_delta(uint32_t delta_t, uint32_t size, const uint8_t* buf)
{
if (size == 0) {
return;
_empty = false;
}
-template<typename Time>
void
-SMF<Time>::begin_write()
+SMF::begin_write()
{
assert(_smf_track);
smf_track_delete(_smf_track);
assert(_smf->number_of_tracks == 1);
}
-template<typename Time>
void
-SMF<Time>::end_write() THROW_FILE_ERROR
+SMF::end_write() THROW_FILE_ERROR
{
if (smf_save(_smf, _path.c_str()) != 0)
throw FileError();
}
-template class SMF<double>;
} // namespace Evoral
void
SMFTest::createNewFileTest ()
{
- TestSMF<Time> smf;
+ TestSMF smf;
smf.create("NewFile.mid");
smf.close();
CPPUNIT_ASSERT(access("NewFile.mid", R_OK) == 0);
void
SMFTest::takeFiveTest ()
{
- TestSMF<Time> smf;
+ TestSMF smf;
smf.open("./test/testdata/TakeFive.mid");
CPPUNIT_ASSERT(!smf.is_empty());
using namespace Evoral;
-template<typename Time>
-class TestSMF : public SMF<Time> {
+class TestSMF : public SMF {
public:
std::string path() const { return _path; }
int open(const std::string& path) THROW_FILE_ERROR {
_path = path;
- return SMF<Time>::open(path);
+ return SMF::open(path);
}
void close() THROW_FILE_ERROR {
- return SMF<Time>::close();
+ return SMF::close();
}
int read_event(uint32_t* delta_t, uint32_t* size, uint8_t** buf) const {
- return SMF<Time>::read_event(delta_t, size, buf);
+ return SMF::read_event(delta_t, size, buf);
}
private: