本文整理汇总了C++中MidiEvent::MetaType方法的典型用法代码示例。如果您正苦于以下问题:C++ MidiEvent::MetaType方法的具体用法?C++ MidiEvent::MetaType怎么用?C++ MidiEvent::MetaType使用的例子?那么, 这里精选的方法代码示例或许可以为您提供帮助。您也可以进一步了解该方法所在类MidiEvent
的用法示例。
在下文中一共展示了MidiEvent::MetaType方法的1个代码示例,这些例子默认根据受欢迎程度排序。您可以为喜欢或者感觉有用的代码点赞,您的评价将有助于系统推荐出更棒的C++代码示例。
示例1: BuildTempoTrack
// NOTE: This is required for much of the other functionality provided
// by this class, however, this causes a destructive change in the way
// the MIDI is represented internally which means we can never save the
// file back out to disk exactly as we loaded it.
//
// This adds an extra track dedicated to tempo change events. Tempo events
// are extracted from every other track and placed in the new one.
//
// This allows quick(er) calculation of wall-clock event times
void Midi::BuildTempoTrack()
{
// This map will help us get rid of duplicate events if
// the tempo is specified in every track (as is common).
//
// It also does sorting for us so we can just copy the
// events right over to the new track.
std::map<unsigned long, MidiEvent> tempo_events;
// Run through each track looking for tempo events
for (MidiTrackList::iterator t = m_tracks.begin(); t != m_tracks.end(); ++t)
{
for (size_t i = 0; i < t->Events().size(); ++i)
{
MidiEvent ev = t->Events()[i];
unsigned long ev_pulses = t->EventPulses()[i];
if (ev.Type() == MidiEventType_Meta && ev.MetaType() == MidiMetaEvent_TempoChange)
{
// Pull tempo event out of both lists
//
// Vector is kind of a hassle this way -- we have to
// walk an iterator to that point in the list because
// erase MUST take an iterator... but erasing from a
// list invalidates iterators. bleah.
MidiEventList::iterator event_to_erase = t->Events().begin();
MidiEventPulsesList::iterator event_pulse_to_erase = t->EventPulses().begin();
for (size_t j = 0; j < i; ++j) { ++event_to_erase; ++event_pulse_to_erase; }
t->Events().erase(event_to_erase);
t->EventPulses().erase(event_pulse_to_erase);
// Adjust next event's delta time
if (t->Events().size() > i)
{
// (We just erased the element at i, so
// now i is pointing to the next element)
unsigned long next_dt = t->Events()[i].GetDeltaPulses();
t->Events()[i].SetDeltaPulses(ev.GetDeltaPulses() + next_dt);
}
// We have to roll i back for the next loop around
--i;
// Insert our newly stolen event into the auto-sorting map
tempo_events[ev_pulses] = ev;
}
}
}
// Create a new track (always the last track in the track list)
m_tracks.push_back(MidiTrack::CreateBlankTrack());
MidiEventList &tempo_track_events = m_tracks[m_tracks.size()-1].Events();
MidiEventPulsesList &tempo_track_event_pulses = m_tracks[m_tracks.size()-1].EventPulses();
// Copy over all our tempo events
unsigned long previous_absolute_pulses = 0;
for (std::map<unsigned long, MidiEvent>::const_iterator i = tempo_events.begin(); i != tempo_events.end(); ++i)
{
unsigned long absolute_pulses = i->first;
MidiEvent ev = i->second;
// Reset each of their delta times while we go
ev.SetDeltaPulses(absolute_pulses - previous_absolute_pulses);
previous_absolute_pulses = absolute_pulses;
// Add them to the track
tempo_track_event_pulses.push_back(absolute_pulses);
tempo_track_events.push_back(ev);
}
}