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) {
if (!_smf_track)
return -2;
- cerr << "Track " << track << " # events: " << _smf_track->number_of_events << endl;
+ //cerr << "Track " << track << " # events: " << _smf_track->number_of_events << endl;
if (_smf_track->number_of_events == 0) {
_smf_track->next_event_number = 0;
_empty = true;
* -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;
*size = event_size;
/*printf("SMF::read_event:\n");
- for (size_t i=0; i < *size; ++i) {
+ for (size_t i = 0; i < *size; ++i) {
printf("%X ", (*buf)[i]);
} printf("\n");*/
}
}
-template<typename Time>
void
-SMF<Time>::append_event_delta(uint32_t delta_t, const Event<Time>& ev)
+SMF::append_event_delta(uint32_t delta_t, uint32_t size, const uint8_t* buf)
{
- assert(ev.size() > 0);
+ if (size == 0) {
+ return;
+ }
/*printf("SMF::append_event_delta:\n");
- for (size_t i=0; i < ev.size(); ++i) {
- printf("%X ", ev.buffer()[i]);
+ for (size_t i = 0; i < size; ++i) {
+ printf("%X ", buf[i]);
} printf("\n");*/
smf_event_t* event;
- event = smf_event_new_from_pointer((void *) ev.buffer(), int(ev.size()));
+ event = smf_event_new_from_pointer(buf, size);
assert(event != NULL);
- memcpy(event->midi_buffer, ev.buffer(), ev.size());
-
assert(_smf_track);
- smf_track_add_event_delta_pulses(_smf_track, event, int(delta_t));
- _last_ev_time = ev.time();
-
- if (ev.size() > 0) {
- _empty = false;
- }
+ smf_track_add_event_delta_pulses(_smf_track, event, delta_t);
+ _empty = false;
}
-template<typename Time>
void
-SMF<Time>::begin_write()
+SMF::begin_write()
{
assert(_smf_track);
smf_track_delete(_smf_track);
smf_add_track(_smf, _smf_track);
assert(_smf->number_of_tracks == 1);
-
- _last_ev_time = 0;
}
-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