OSDN Git Service

トラックリストに同じチャンネルが複数あり、それらの長さが異なると、タイミングがずれていたのを修正
authorstarg <starg@users.osdn.me>
Sat, 3 Sep 2016 07:20:17 +0000 (16:20 +0900)
committerstarg <starg@users.osdn.me>
Sat, 3 Sep 2016 07:20:17 +0000 (16:20 +0900)
include/ir2midi/ir2midi.hpp
src/ir2midi/ir2midi.cpp

index 63e1d63..b6c4e7d 100644 (file)
@@ -65,7 +65,7 @@ private:
     void CheckForUnprocessedAttributes(const std::vector<AST::Attribute>& attributes);
     void EnsureTrackInitialized(int number);
 
-    int GetLastEventTime() const;
+    int GetLastGlobalEventTime() const;
     void UpdateLastEventTime();
     MIDI::MIDITrack& GetTrack(int trackNumber);
 
index 20dccb7..368c508 100644 (file)
@@ -136,17 +136,22 @@ void IR2MIDICompiler::operator()(const IR::TrackList& ir)
         EnsureTrackInitialized(i.Number);
     }
 
+    int globalLastTimeNext = GetLastGlobalEventTime();
+
     for (auto&& i : ir.Tracks)
     {
-        GetTrackContext(i.Number).SetLastEventTime(GetLastEventTime());
+        GetTrackContext(i.Number).SetLastEventTime(GetLastGlobalEventTime());
 
         for (auto&& j : i.Items)
         {
             CheckForUnprocessedAttributes(j.Attributes);
             CompileBlock(i.Number, j.Block);
         }
+
+        globalLastTimeNext = std::max(globalLastTimeNext, GetTrackContext(i.Number).GetLastEventTime());
     }
 
+    m_LastEventTime = globalLastTimeNext;
     UpdateLastEventTime();
 }
 
@@ -300,11 +305,11 @@ void IR2MIDICompiler::EnsureTrackInitialized(int number)
     if (static_cast<std::size_t>(number) >= m_MIDI.Tracks.size())
     {
         m_MIDI.Tracks.resize(number + 1);
-        m_Contexts.resize(number + 1, TrackCompilerContext(GetLastEventTime()));
+        m_Contexts.resize(number + 1, TrackCompilerContext(GetLastGlobalEventTime()));
     }
 }
 
-int IR2MIDICompiler::GetLastEventTime() const
+int IR2MIDICompiler::GetLastGlobalEventTime() const
 {
     return m_LastEventTime;
 }