5
5
A sequencer and musical notation editor.
7
This program is Copyright 2000-2007
7
This program is Copyright 2000-2008
8
8
Guillaume Laurent <glaurent@telegraph-road.org>,
9
9
Chris Cannam <cannam@all-day-breakfast.com>,
10
10
Richard Bown <bownie@bownie.com>
332
332
m_segments.insert(segment);
336
Composition::getMaxContemporaneousSegmentsOnTrack(TrackId track) const
338
// Could be made faster, but only if it needs to be.
340
// This is similar to the polyphony calculation in
341
// DocumentMetaConfigurationPage ctor.
343
std::set<Segment *> simultaneous;
344
std::multimap<timeT, Segment *> ends;
348
for (const_iterator i = begin(); i != end(); ++i) {
349
if ((*i)->getTrack() != track) continue;
350
timeT t0 = (*i)->getStartTime();
351
timeT t1 = (*i)->getRepeatEndTime();
352
// std::cerr << "getMaxContemporaneousSegmentsOnTrack(" << track << "): segment " << *i << " from " << t0 << " to " << t1 << std::endl;
353
while (!ends.empty() && t0 >= ends.begin()->first) {
354
simultaneous.erase(ends.begin()->second);
355
ends.erase(ends.begin());
357
simultaneous.insert(*i);
358
ends.insert(std::multimap<timeT, Segment *>::value_type(t1, *i));
359
int current = simultaneous.size();
360
if (current > maximum) maximum = current;
367
Composition::getSegmentVoiceIndex(const Segment *segment) const
369
TrackId track = segment->getTrack();
371
// See function above
373
std::map<Segment *, int> indices;
375
std::multimap<timeT, Segment *> ends;
379
for (const_iterator i = begin(); i != end(); ++i) {
380
if ((*i)->getTrack() != track) continue;
381
timeT t0 = (*i)->getStartTime();
382
timeT t1 = (*i)->getRepeatEndTime();
384
while (!ends.empty() && t0 >= ends.begin()->first) {
385
index = indices[ends.begin()->second];
387
indices.erase(ends.begin()->second);
388
ends.erase(ends.begin());
390
for (index = 0; ; ++index) {
391
if (used.find(index) == used.end()) break;
393
if (*i == segment) return index;
396
ends.insert(std::multimap<timeT, Segment *>::value_type(t1, *i));
399
std::cerr << "WARNING: Composition::getSegmentVoiceIndex: segment "
400
<< segment << " not found in composition" << std::endl;
335
404
TriggerSegmentRec *
336
405
Composition::addTriggerSegment(Segment *s, int pitch, int velocity)
524
593
timeT lastSigTime = 0;
525
594
timeT barDuration = TimeSignature().getBarDuration();
596
if (getStartMarker() < 0) {
597
if (!t.empty() && (*t.begin())->getAbsoluteTime() <= 0) {
598
barDuration = TimeSignature(**t.begin()).getBarDuration();
600
lastBarNo = getStartMarker() / barDuration;
601
lastSigTime = getStartMarker();
602
#ifdef DEBUG_BAR_STUFF
603
cerr << "Composition::calculateBarPositions: start marker = " << getStartMarker() << ", so initial bar number = " << lastBarNo << endl;
527
607
for (i = t.begin(); i != t.end(); ++i) {
529
609
timeT myTime = (*i)->getAbsoluteTime();
684
764
Composition::addTimeSignature(timeT t, TimeSignature timeSig)
766
#ifdef DEBUG_BAR_STUFF
767
cerr << "Composition::addTimeSignature(" << t << ", " << timeSig.getNumerator() << "/" << timeSig.getDenominator() << ")" << endl;
686
770
ReferenceSegment::iterator i =
687
771
m_timeSigSegment.insert(timeSig.getAsEvent(t));
688
772
m_barPositionsNeedCalculating = true;
1956
Composition::notifySegmentEndMarkerChange(Segment *s, bool shorten) const
2040
Composition::notifySegmentStartChanged(Segment *s, timeT t)
2042
updateRefreshStatuses(); // not ideal, but best way to ensure track heights are recomputed
2043
for (ObserverSet::const_iterator i = m_observers.begin();
2044
i != m_observers.end(); ++i) {
2045
(*i)->segmentStartChanged(this, s, t);
2050
Composition::notifySegmentEndMarkerChange(Segment *s, bool shorten)
1958
2052
for (ObserverSet::const_iterator i = m_observers.begin();
1959
2053
i != m_observers.end(); ++i) {