From 3adefd733b854b0abc8ff4ad6989335bc9bff919 Mon Sep 17 00:00:00 2001 From: Dimitri Diakopoulos Date: Tue, 29 Dec 2015 21:08:19 -0500 Subject: [PATCH] utility functions to convert between delta and absolute tick formats --- src/midi_file_writer.cpp | 5 ++--- src/midi_file_writer.h | 7 ++++++- src/midi_utils.h | 42 ++++++++++++++++++++++++++++++++++++++++ 3 files changed, 50 insertions(+), 4 deletions(-) diff --git a/src/midi_file_writer.cpp b/src/midi_file_writer.cpp index 4c0acb9..09ea2dc 100644 --- a/src/midi_file_writer.cpp +++ b/src/midi_file_writer.cpp @@ -123,7 +123,6 @@ void MidiFileWriter::addEvent(int tick, int track, std::shared_ptr 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(tick, track, m)); } @@ -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). diff --git a/src/midi_file_writer.h b/src/midi_file_writer.h index 8dd9295..5658342 100644 --- a/src/midi_file_writer.h +++ b/src/midi_file_writer.h @@ -56,7 +56,12 @@ class MidiFileWriter void addTrack(); - void write(std::ostream & out); + void write(std::ostream & out); + + std::vector & getTracks() { return tracks; } + + bool useAbsoluteTicks = false; + }; } // mm diff --git a/src/midi_utils.h b/src/midi_utils.h index 417cd74..7653925 100644 --- a/src/midi_utils.h +++ b/src/midi_utils.h @@ -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 { @@ -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 & 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 & 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