Standard Midi File (Type 0) Reader. More...
#include <SMFReader.hpp>
Public Member Functions | |
SMFReader (const std::string filename="") | |
bool | open (const std::string &filename) throw (std::logic_error, UnsupportedTime) |
bool | seek_to_track (unsigned track) throw (std::logic_error) |
Seek to the start of a given track, starting from 1. | |
uint16_t | type () const |
uint16_t | ppqn () const |
size_t | num_tracks () |
int | read_event (size_t buf_len, uint8_t *buf, uint32_t *ev_size, uint32_t *ev_delta_time) throw (std::logic_error, PrematureEOF, CorruptFile) |
Read an event from the current position in file. | |
void | close () |
Static Public Member Functions | |
static uint32_t | read_var_len (FILE *fd) throw (PrematureEOF) |
Protected Attributes | |
std::string | _filename |
FILE * | _fd |
uint16_t | _type |
uint16_t | _ppqn |
uint16_t | _num_tracks |
uint32_t | _track |
uint32_t | _track_size |
Static Protected Attributes | |
static const uint32_t | HEADER_SIZE = 22 |
size of SMF header, including MTrk chunk header |
Standard Midi File (Type 0) Reader.
Currently this only reads SMF files with tempo-based timing.
bool Raul::SMFReader::seek_to_track | ( | unsigned | track | ) | throw (std::logic_error) |
Seek to the start of a given track, starting from 1.
Returns true if specified track was found.
int Raul::SMFReader::read_event | ( | size_t | buf_len, | |
uint8_t * | buf, | |||
uint32_t * | ev_size, | |||
uint32_t * | delta_time | |||
) | throw (std::logic_error, PrematureEOF, CorruptFile) |
Read an event from the current position in file.
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 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).
If buf is not large enough to hold the event, 0 will be returned, but ev_size set to the actual size of the event.