diff options
-rw-r--r-- | raul/SMFReader.h | 3 | ||||
-rw-r--r-- | src/SMFReader.cpp | 14 | ||||
-rw-r--r-- | tests/smf_test.cpp | 6 |
3 files changed, 8 insertions, 15 deletions
diff --git a/raul/SMFReader.h b/raul/SMFReader.h index 4bced9e..53a9927 100644 --- a/raul/SMFReader.h +++ b/raul/SMFReader.h @@ -38,7 +38,7 @@ public: uint16_t ppqn() const { return _ppqn; } size_t num_tracks() { return _num_tracks; } - int read_event(size_t buf_len, unsigned char* buf, uint32_t* ev_size, uint64_t* ev_time); + int read_event(size_t buf_len, unsigned char* buf, uint32_t* ev_size, uint32_t* ev_delta_time); void close(); @@ -55,7 +55,6 @@ protected: uint16_t _type; uint16_t _num_tracks; uint16_t _ppqn; - uint64_t _last_ev_time; uint32_t _track_size; /* Raul::BeatTime _start_time; Raul::BeatTime _last_ev_time; ///< Time last event was written relative to _start_time diff --git a/src/SMFReader.cpp b/src/SMFReader.cpp index 4313b30..bb28f0e 100644 --- a/src/SMFReader.cpp +++ b/src/SMFReader.cpp @@ -73,7 +73,6 @@ midi_event_size(unsigned char status) SMFReader::SMFReader() : _fd(NULL) , _ppqn(0) - , _last_ev_time(0) , _track_size(0) { } @@ -122,7 +121,6 @@ SMFReader::open(const string& filename) _track_size = GUINT32_FROM_BE(track_size_be); std::cerr << "SMF - read track size " << _track_size << std::endl; - _last_ev_time = 0; return true; } else { return false; @@ -135,7 +133,7 @@ SMFReader::open(const string& filename) * File position MUST be at the beginning of a delta time, or this will die very messily. * ev.buffer must be of size ev.size, and large enough for the event. The returned event * will have it's time field set to it's delta time (so it's the caller's responsibility - * to calculate a real time for the event). + * to keep track of delta time, even for ignored events). * * Returns event length (including status byte) on success, 0 if event was * skipped (eg a meta event), or -1 on EOF (or end of track). @@ -144,7 +142,7 @@ SMFReader::open(const string& filename) * set to the actual size of the event. */ int -SMFReader::read_event(size_t buf_len, unsigned char* buf, uint32_t* ev_size, uint64_t* ev_time) +SMFReader::read_event(size_t buf_len, unsigned char* buf, uint32_t* ev_size, uint32_t* delta_time) { // - 4 is for the EOT event, which we don't actually want to read //if (feof(_fd) || ftell(_fd) >= HEADER_SIZE + _track_size - 4) { @@ -155,7 +153,7 @@ SMFReader::read_event(size_t buf_len, unsigned char* buf, uint32_t* ev_size, uin assert(buf_len > 0); assert(buf); assert(ev_size); - assert(ev_time); + assert(delta_time); //cerr.flags(ios::hex); //cerr << "SMF - Reading event at offset 0x" << ftell(_fd) << endl; @@ -165,7 +163,7 @@ SMFReader::read_event(size_t buf_len, unsigned char* buf, uint32_t* ev_size, uin static unsigned char last_status = 0; static uint32_t last_size = 1234567; - uint32_t delta_time = read_var_len(); + *delta_time = read_var_len(); int status = fgetc(_fd); assert(status != EOF); // FIXME die gracefully assert(status <= 0xFF); @@ -199,8 +197,6 @@ SMFReader::read_event(size_t buf_len, unsigned char* buf, uint32_t* ev_size, uin return -1; // we hit the logical EOF anyway... } else { fseek(_fd, size, SEEK_CUR); - *ev_time = _last_ev_time + delta_time; // this is needed regardless - _last_ev_time = *ev_time; return 0; } } @@ -213,8 +209,6 @@ SMFReader::read_event(size_t buf_len, unsigned char* buf, uint32_t* ev_size, uin } else { // Read event, return size fread(buf+1, 1, *ev_size - 1, _fd); - *ev_time = _last_ev_time + delta_time; - _last_ev_time = *ev_time; if (buf[0] == 0x90 && buf[2] == 0) { buf[0] = 0x80; diff --git a/tests/smf_test.cpp b/tests/smf_test.cpp index 219660d..adcb641 100644 --- a/tests/smf_test.cpp +++ b/tests/smf_test.cpp @@ -40,10 +40,10 @@ main(int argc, char** argv) unsigned char buf[4]; uint32_t ev_size; - uint64_t ev_time; - while (reader.read_event(4, buf, &ev_size, &ev_time) >= 0) { + uint32_t ev_delta_time; + while (reader.read_event(4, buf, &ev_size, &ev_delta_time) >= 0) { - cerr << "\n\nEvent, size = " << ev_size << ", time = " << ev_time << endl; + cerr << "\n\nEvent, size = " << ev_size << ", time = " << ev_delta_time << endl; cerr << "Data: "; cerr.flags(ios::hex); for (uint32_t i=0; i < ev_size; ++i) { |