Skip to content

Commit

Permalink
utility functions to convert between delta and absolute tick formats
Browse files Browse the repository at this point in the history
  • Loading branch information
ddiakopoulos committed Dec 30, 2015
1 parent 31892d3 commit 3adefd7
Show file tree
Hide file tree
Showing 3 changed files with 50 additions and 4 deletions.
5 changes: 2 additions & 3 deletions src/midi_file_writer.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -123,7 +123,6 @@ void MidiFileWriter::addEvent(int tick, int track, std::shared_ptr<MidiMessage>
if (track > tracks.size())
throw std::out_of_range("track idx exceeds availble tracks");

std::cout << tick << std::endl;
tracks[track].push_back(std::make_shared<TrackEvent>(tick, track, m));
}

Expand Down Expand Up @@ -155,9 +154,9 @@ void MidiFileWriter::write(std::ostream & out)
// Suppress end-of-track meta messages (one will be added
// automatically after all track data has been written).
if (msg->getMetaEventSubtype() == uint8_t(MetaEventType::END_OF_TRACK)) continue;

util::write_variable_length(event->tick, trackRawData);

if ((msg->getMessageType() == uint8_t(MessageType::SYSTEM_EXCLUSIVE)) || (event->m->getMessageType() == uint8_t(MessageType::EOX)))
{
// 0xf0 == Complete sysex message (0xf0 is part of the raw MIDI).
Expand Down
7 changes: 6 additions & 1 deletion src/midi_file_writer.h
Original file line number Diff line number Diff line change
Expand Up @@ -56,7 +56,12 @@ class MidiFileWriter

void addTrack();

void write(std::ostream & out);
void write(std::ostream & out);

std::vector<MidiTrack> & getTracks() { return tracks; }

bool useAbsoluteTicks = false;

};

} // mm
Expand Down
42 changes: 42 additions & 0 deletions src/midi_utils.h
Original file line number Diff line number Diff line change
Expand Up @@ -29,6 +29,7 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
#define MODERNMIDI_UTIL_H

#include "modernmidi.h"
#include "midi_event.h"

namespace mm
{
Expand All @@ -46,6 +47,47 @@ namespace mm
// can be provided.
uint8_t frequencyToNote(float freq);
uint8_t frequencyToNote(float freq, float A);

// In-place conversion of tracks in absolute tick format
// to a delta tick format
inline void ConvertToDeltaTicks(std::vector<MidiTrack> & tracks)
{
for (int i = 0; i < tracks.size(); i++)
{
for (auto & event_list : tracks)
{
int lastTickValue = 0;
for (auto & event : event_list)
{
const auto msg = event->m;
int tmpTick = event->tick;
event->tick -= lastTickValue;
lastTickValue = tmpTick;
}
}
}
}

// In-place conversion of tracks in delta tick format
// to an absolute tick format
inline void ConvertToAbsoluteTicks(std::vector<MidiTrack> & tracks)
{
for (int i = 0; i < tracks.size(); i++)
{
for (auto & event_list : tracks)
{
int runningTickCounter = 0;
for (auto & event : event_list)
{
const auto msg = event->m;
int tmpTick = event->tick;
event->tick = runningTickCounter;
runningTickCounter += tmpTick;
}
}
}
}


} // mm

Expand Down

0 comments on commit 3adefd7

Please sign in to comment.