LMMS
Loading...
Searching...
No Matches
water::MidiFile Class Reference

#include <MidiFile.h>

Public Member Functions

 MidiFile ()
 ~MidiFile ()
 MidiFile (const MidiFile &other)
MidiFileoperator= (const MidiFile &other)
size_t getNumTracks () const noexcept
const MidiMessageSequencegetTrack (size_t index) const noexcept
void addTrack (const MidiMessageSequence &trackSequence)
void clear ()
short getTimeFormat () const noexcept
void setTicksPerQuarterNote (int ticksPerQuarterNote) noexcept
void setSmpteTimeFormat (int framesPerSecond, int subframeResolution) noexcept
void findAllTempoEvents (MidiMessageSequence &tempoChangeEvents) const
void findAllTimeSigEvents (MidiMessageSequence &timeSigEvents) const
void findAllKeySigEvents (MidiMessageSequence &keySigEvents) const
double getLastTimestamp () const
bool readFrom (InputStream &sourceStream)
void convertTimestampTicksToSeconds ()

Private Member Functions

void readNextTrack (const uint8 *, int size)

Private Attributes

OwnedArray< MidiMessageSequencetracks
short timeFormat

Detailed Description

Reads standard midi format files.

To read a midi file, create a MidiFile object and call its readFrom() method. You can then get the individual midi tracks from it using the getTrack() method.

See also
MidiMessageSequence

Constructor & Destructor Documentation

◆ MidiFile() [1/2]

water::MidiFile::MidiFile ( )

Creates an empty MidiFile object.

◆ ~MidiFile()

water::MidiFile::~MidiFile ( )

Destructor.

◆ MidiFile() [2/2]

water::MidiFile::MidiFile ( const MidiFile & other)

Creates a copy of another MidiFile.

Member Function Documentation

◆ addTrack()

void water::MidiFile::addTrack ( const MidiMessageSequence & trackSequence)

Adds a midi track to the file. This will make its own internal copy of the sequence that is passed-in.

See also
getNumTracks, getTrack

◆ clear()

void water::MidiFile::clear ( )

Removes all midi tracks from the file.

See also
getNumTracks

◆ convertTimestampTicksToSeconds()

void water::MidiFile::convertTimestampTicksToSeconds ( )

Converts the timestamp of all the midi events from midi ticks to seconds.

This will use the midi time format and tempo/time signature info in the tracks to convert all the timestamps to absolute values in seconds.

◆ findAllKeySigEvents()

void water::MidiFile::findAllKeySigEvents ( MidiMessageSequence & keySigEvents) const

Makes a list of all the time-signature meta-events from all tracks in the midi file.

Parameters
keySigEventsa list to which all the events will be added

◆ findAllTempoEvents()

void water::MidiFile::findAllTempoEvents ( MidiMessageSequence & tempoChangeEvents) const

Makes a list of all the tempo-change meta-events from all tracks in the midi file. Useful for finding the positions of all the tempo changes in a file.

Parameters
tempoChangeEventsa list to which all the events will be added

◆ findAllTimeSigEvents()

void water::MidiFile::findAllTimeSigEvents ( MidiMessageSequence & timeSigEvents) const

Makes a list of all the time-signature meta-events from all tracks in the midi file. Useful for finding the positions of all the tempo changes in a file.

Parameters
timeSigEventsa list to which all the events will be added

◆ getLastTimestamp()

double water::MidiFile::getLastTimestamp ( ) const

Returns the latest timestamp in any of the tracks. (Useful for finding the length of the file).

◆ getNumTracks()

size_t water::MidiFile::getNumTracks ( ) const
noexcept

Returns the number of tracks in the file.

See also
getTrack, addTrack

◆ getTimeFormat()

short water::MidiFile::getTimeFormat ( ) const
noexcept

Returns the raw time format code that will be written to a stream.

After reading a midi file, this method will return the time-format that was read from the file's header. It can be changed using the setTicksPerQuarterNote() or setSmpteTimeFormat() methods.

If the value returned is positive, it indicates the number of midi ticks per quarter-note - see setTicksPerQuarterNote().

It it's negative, the upper byte indicates the frames-per-second (but negative), and the lower byte is the number of ticks per frame - see setSmpteTimeFormat().

◆ getTrack()

const MidiMessageSequence * water::MidiFile::getTrack ( size_t index) const
noexcept

Returns a pointer to one of the tracks in the file.

Returns
a pointer to the track, or nullptr if the index is out-of-range
See also
getNumTracks, addTrack

◆ operator=()

MidiFile & water::MidiFile::operator= ( const MidiFile & other)

Copies from another MidiFile object

◆ readFrom()

bool water::MidiFile::readFrom ( InputStream & sourceStream)

Reads a midi file format stream.

After calling this, you can get the tracks that were read from the file by using the getNumTracks() and getTrack() methods.

The timestamps of the midi events in the tracks will represent their positions in terms of midi ticks. To convert them to seconds, use the convertTimestampTicksToSeconds() method.

Returns
true if the stream was read successfully

◆ readNextTrack()

void water::MidiFile::readNextTrack ( const uint8 * data,
int size )
private

◆ setSmpteTimeFormat()

void water::MidiFile::setSmpteTimeFormat ( int framesPerSecond,
int subframeResolution )
noexcept

Sets the time format to use when this file is written to a stream.

If this is called, the file will be written using absolute times, rather than bars/beats as would be the case if setTicksPerBeat() had been called instead.

Parameters
framesPerSecondmust be 24, 25, 29 or 30
subframeResolutionthe sub-second resolution, e.g. 4 (midi time code), 8, 10, 80 (SMPTE bit resolution), or 100. For millisecond timing, setSmpteTimeFormat (25, 40)
See also
setTicksPerBeat

◆ setTicksPerQuarterNote()

void water::MidiFile::setTicksPerQuarterNote ( int ticksPerQuarterNote)
noexcept

Sets the time format to use when this file is written to a stream.

If this is called, the file will be written as bars/beats using the specified resolution, rather than SMPTE absolute times, as would be used if setSmpteTimeFormat() had been called instead.

Parameters
ticksPerQuarterNotee.g. 96, 960
See also
setSmpteTimeFormat

Member Data Documentation

◆ timeFormat

short water::MidiFile::timeFormat
private

◆ tracks

OwnedArray<MidiMessageSequence> water::MidiFile::tracks
private

The documentation for this class was generated from the following files: