summaryrefslogtreecommitdiffstats
path: root/src/SMFReader.cpp
diff options
context:
space:
mode:
authorDavid Robillard <d@drobilla.net>2007-03-11 17:33:20 +0000
committerDavid Robillard <d@drobilla.net>2007-03-11 17:33:20 +0000
commit973336f178defc24f65f4e7cd581a16a27b3bed0 (patch)
tree11cdd8b1d41844a8f753770bf8761a980eb8b4d9 /src/SMFReader.cpp
parent286d73d8cb7dda789ace937f075688082f73c8ce (diff)
downloadraul-973336f178defc24f65f4e7cd581a16a27b3bed0.tar.gz
raul-973336f178defc24f65f4e7cd581a16a27b3bed0.tar.bz2
raul-973336f178defc24f65f4e7cd581a16a27b3bed0.zip
MIDI file reading.
git-svn-id: http://svn.drobilla.net/lad/raul@352 a436a847-0d15-0410-975c-d299462d15a1
Diffstat (limited to 'src/SMFReader.cpp')
-rw-r--r--src/SMFReader.cpp14
1 files changed, 4 insertions, 10 deletions
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;