fixed updating loop markers when notation is changed
This commit is contained in:
parent
bc4160c452
commit
18f26dd3a5
4 changed files with 41 additions and 11 deletions
|
@ -83,7 +83,7 @@ Notation::Notation(Ms::Score* score)
|
||||||
|
|
||||||
m_undoStack = std::make_shared<NotationUndoStack>(this, m_notationChanged);
|
m_undoStack = std::make_shared<NotationUndoStack>(this, m_notationChanged);
|
||||||
m_interaction = std::make_shared<NotationInteraction>(this, m_undoStack);
|
m_interaction = std::make_shared<NotationInteraction>(this, m_undoStack);
|
||||||
m_playback = std::make_shared<NotationPlayback>(this);
|
m_playback = std::make_shared<NotationPlayback>(this, m_notationChanged);
|
||||||
m_midiInput = std::make_shared<NotationMidiInput>(this, m_undoStack);
|
m_midiInput = std::make_shared<NotationMidiInput>(this, m_undoStack);
|
||||||
m_accessibility = std::make_shared<NotationAccessibility>(this, m_interaction->selectionChanged());
|
m_accessibility = std::make_shared<NotationAccessibility>(this, m_interaction->selectionChanged());
|
||||||
m_parts = std::make_shared<NotationParts>(this, m_interaction, m_undoStack);
|
m_parts = std::make_shared<NotationParts>(this, m_interaction, m_undoStack);
|
||||||
|
|
|
@ -48,12 +48,16 @@ using namespace mu::midi;
|
||||||
|
|
||||||
static constexpr int MIN_CHUNK_SIZE(10); // measure
|
static constexpr int MIN_CHUNK_SIZE(10); // measure
|
||||||
|
|
||||||
NotationPlayback::NotationPlayback(IGetScore* getScore)
|
NotationPlayback::NotationPlayback(IGetScore* getScore, async::Notification notationChanged)
|
||||||
: m_getScore(getScore)
|
: m_getScore(getScore)
|
||||||
{
|
{
|
||||||
m_midiStream = std::make_shared<MidiStream>();
|
m_midiStream = std::make_shared<MidiStream>();
|
||||||
m_midiStream->isStreamingAllowed = true;
|
m_midiStream->isStreamingAllowed = true;
|
||||||
m_midiStream->request.onReceive(this, [this](tick_t tick) { onChunkRequest(tick); });
|
m_midiStream->request.onReceive(this, [this](tick_t tick) { onChunkRequest(tick); });
|
||||||
|
|
||||||
|
notationChanged.onNotify(this, [this]() {
|
||||||
|
updateLoopBoundaries();
|
||||||
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
Ms::Score* NotationPlayback::score() const
|
Ms::Score* NotationPlayback::score() const
|
||||||
|
@ -79,14 +83,22 @@ void NotationPlayback::init()
|
||||||
if (Ms::POS::CURRENT == pos) {
|
if (Ms::POS::CURRENT == pos) {
|
||||||
m_playPositionTickChanged.send(tick);
|
m_playPositionTickChanged.send(tick);
|
||||||
} else {
|
} else {
|
||||||
|
updateLoopBoundaries();
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
void NotationPlayback::updateLoopBoundaries()
|
||||||
|
{
|
||||||
LoopBoundaries boundaries;
|
LoopBoundaries boundaries;
|
||||||
boundaries.loopInTick = score()->loopInTick().ticks();
|
boundaries.loopInTick = score()->loopInTick().ticks();
|
||||||
boundaries.loopOutTick = score()->loopOutTick().ticks();
|
boundaries.loopOutTick = score()->loopOutTick().ticks();
|
||||||
boundaries.loopInRect = loopBoundaryRectByTick(LoopBoundaryType::LoopIn, boundaries.loopInTick);
|
boundaries.loopInRect = loopBoundaryRectByTick(LoopBoundaryType::LoopIn, boundaries.loopInTick);
|
||||||
boundaries.loopOutRect = loopBoundaryRectByTick(LoopBoundaryType::LoopOut, boundaries.loopOutTick);
|
boundaries.loopOutRect = loopBoundaryRectByTick(LoopBoundaryType::LoopOut, boundaries.loopOutTick);
|
||||||
m_loopBoundariesChanged.send(boundaries);
|
|
||||||
|
if (m_loopBoundaries.val != boundaries) {
|
||||||
|
m_loopBoundaries.set(boundaries);
|
||||||
}
|
}
|
||||||
});
|
|
||||||
}
|
}
|
||||||
|
|
||||||
std::shared_ptr<MidiStream> NotationPlayback::midiStream() const
|
std::shared_ptr<MidiStream> NotationPlayback::midiStream() const
|
||||||
|
@ -705,7 +717,7 @@ QRect NotationPlayback::loopBoundaryRectByTick(LoopBoundaryType boundaryType, in
|
||||||
|
|
||||||
mu::async::Channel<LoopBoundaries> NotationPlayback::loopBoundariesChanged() const
|
mu::async::Channel<LoopBoundaries> NotationPlayback::loopBoundariesChanged() const
|
||||||
{
|
{
|
||||||
return m_loopBoundariesChanged;
|
return m_loopBoundaries.ch;
|
||||||
}
|
}
|
||||||
|
|
||||||
Tempo NotationPlayback::tempo(int tick) const
|
Tempo NotationPlayback::tempo(int tick) const
|
||||||
|
|
|
@ -40,7 +40,7 @@ class NotationPlayback : public INotationPlayback, public async::Asyncable
|
||||||
INJECT(notation, INotationConfiguration, configuration)
|
INJECT(notation, INotationConfiguration, configuration)
|
||||||
|
|
||||||
public:
|
public:
|
||||||
NotationPlayback(IGetScore* getScore);
|
NotationPlayback(IGetScore* getScore, async::Notification notationChanged);
|
||||||
|
|
||||||
void init();
|
void init();
|
||||||
|
|
||||||
|
@ -91,6 +91,7 @@ private:
|
||||||
void addLoopIn(int tick);
|
void addLoopIn(int tick);
|
||||||
void addLoopOut(int tick);
|
void addLoopOut(int tick);
|
||||||
QRect loopBoundaryRectByTick(LoopBoundaryType boundaryType, int tick) const;
|
QRect loopBoundaryRectByTick(LoopBoundaryType boundaryType, int tick) const;
|
||||||
|
void updateLoopBoundaries();
|
||||||
|
|
||||||
const Ms::TempoText* tempoText(int tick) const;
|
const Ms::TempoText* tempoText(int tick) const;
|
||||||
|
|
||||||
|
@ -98,7 +99,7 @@ private:
|
||||||
std::shared_ptr<midi::MidiStream> m_midiStream;
|
std::shared_ptr<midi::MidiStream> m_midiStream;
|
||||||
std::unique_ptr<Ms::MidiRenderer> m_midiRenderer;
|
std::unique_ptr<Ms::MidiRenderer> m_midiRenderer;
|
||||||
async::Channel<int> m_playPositionTickChanged;
|
async::Channel<int> m_playPositionTickChanged;
|
||||||
async::Channel<LoopBoundaries> m_loopBoundariesChanged;
|
ValCh<LoopBoundaries> m_loopBoundaries;
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -343,6 +343,23 @@ struct LoopBoundaries
|
||||||
{
|
{
|
||||||
return loopInTick == 0 && loopOutTick == 0;
|
return loopInTick == 0 && loopOutTick == 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool operator==(const LoopBoundaries& boundaries) const
|
||||||
|
{
|
||||||
|
bool equals = true;
|
||||||
|
|
||||||
|
equals &= loopInTick == boundaries.loopInTick;
|
||||||
|
equals &= loopOutTick == boundaries.loopOutTick;
|
||||||
|
equals &= loopInRect == boundaries.loopInRect;
|
||||||
|
equals &= loopOutRect == boundaries.loopOutRect;
|
||||||
|
|
||||||
|
return equals;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool operator!=(const LoopBoundaries& boundaries) const
|
||||||
|
{
|
||||||
|
return !(*this == boundaries);
|
||||||
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
inline QString staffTypeToString(StaffType type)
|
inline QString staffTypeToString(StaffType type)
|
||||||
|
|
Loading…
Reference in a new issue