From d42280a3bcbdca3ee5e590da9d98cd1ca6d239ac Mon Sep 17 00:00:00 2001 From: starg Date: Wed, 24 Aug 2016 05:45:34 +0900 Subject: [PATCH] =?utf8?q?=E3=83=96=E3=83=AD=E3=83=83=E3=82=AF=E3=82=92?= =?utf8?q?=E5=90=AB=E3=82=80=E3=83=95=E3=83=AC=E3=83=BC=E3=82=BA=E3=81=AE?= =?utf8?q?=E9=9F=B3=E3=81=AE=E3=82=BF=E3=82=A4=E3=83=9F=E3=83=B3=E3=82=B0?= =?utf8?q?=E3=81=8C=E3=81=9A=E3=82=8C=E3=81=A6=E3=81=84=E3=81=9F=E3=81=AE?= =?utf8?q?=E3=82=92=E4=BF=AE=E6=AD=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit 同一のトラックリストに同じトラック番号が複数あった場合、それらが同時に演奏されるように変更 --- include/ir2midi/context.hpp | 3 +++ src/ir2midi/context.cpp | 12 +++++++++++- src/ir2midi/ir2midi.cpp | 10 ++++++++-- 3 files changed, 22 insertions(+), 3 deletions(-) diff --git a/include/ir2midi/context.hpp b/include/ir2midi/context.hpp index 734341d..dc414a3 100644 --- a/include/ir2midi/context.hpp +++ b/include/ir2midi/context.hpp @@ -23,6 +23,8 @@ class TrackCompilerContext final { public: void EnterBlock(); + void SaveTime(); + void RestoreTime(); void PushEvent(int relativeTime, const MIDI::MIDIEvent::EventType& ev); void SortEvents(); const std::vector& GetEvents() const; @@ -31,6 +33,7 @@ private: std::vector m_Events; int m_BaseTimeForCurrentBlock = 0; int m_LastEventTime = 0; + int m_PrevLastEventTime = 0; }; class IIR2MIDICompiler diff --git a/src/ir2midi/context.cpp b/src/ir2midi/context.cpp index 504bd60..8734a22 100644 --- a/src/ir2midi/context.cpp +++ b/src/ir2midi/context.cpp @@ -14,10 +14,20 @@ void TrackCompilerContext::EnterBlock() m_BaseTimeForCurrentBlock = m_LastEventTime; } +void TrackCompilerContext::SaveTime() +{ + m_PrevLastEventTime = m_LastEventTime; +} + +void TrackCompilerContext::RestoreTime() +{ + m_LastEventTime = m_PrevLastEventTime; +} + void TrackCompilerContext::PushEvent(int relativeTime, const MIDI::MIDIEvent::EventType& ev) { m_LastEventTime = m_BaseTimeForCurrentBlock + relativeTime; - m_Events.push_back(AbsoluteMIDIEvent{m_BaseTimeForCurrentBlock + relativeTime, ev}); + m_Events.push_back(AbsoluteMIDIEvent{m_LastEventTime, ev}); } void TrackCompilerContext::SortEvents() diff --git a/src/ir2midi/ir2midi.cpp b/src/ir2midi/ir2midi.cpp index b429962..7d6d861 100644 --- a/src/ir2midi/ir2midi.cpp +++ b/src/ir2midi/ir2midi.cpp @@ -128,9 +128,17 @@ void IR2MIDICompiler::operator()(const IR::TrackList& ir) CheckForUnprocessedAttributes(i.Attributes); EnsureTrackInitialized(i.Number); + GetTrackContext(i.Number).SaveTime(); + } + + for (auto&& i : ir.Tracks) + { + GetTrackContext(i.Number).RestoreTime(); + for (auto&& j : i.Items) { CheckForUnprocessedAttributes(j.Attributes); + GetTrackContext(i.Number).EnterBlock(); CompileBlock(i.Number, j.Block); } } @@ -197,8 +205,6 @@ bool IR2MIDICompiler::CompileTrackBlock(const std::string& trackBlockName) void IR2MIDICompiler::CompileBlock(int trackNumber, IR::BlockReference blockRef) { - GetTrackContext(trackNumber).EnterBlock(); - const auto& block = m_IR.Blocks.at(blockRef.ID); CheckForUnprocessedAttributes(block.Attributes); -- 2.11.0