~ubuntu-branches/ubuntu/karmic/rosegarden/karmic

« back to all changes in this revision

Viewing changes to src/base/Composition.cpp

  • Committer: Bazaar Package Importer
  • Author(s): Stefan Ebner
  • Date: 2008-05-02 00:33:44 UTC
  • mfrom: (1.1.7 upstream) (6.1.1 lenny)
  • Revision ID: james.westby@ubuntu.com-20080502003344-67vbfhgqx2yl0ksi
Tags: 1:1.7.0-1ubuntu1
* Merge from Debian unstable. (LP: #225849) Remaining Ubuntu changes:
  - Add usr/share/doc/kde/HTML to rosegarden-data, to provide online
    help documentation.
  - Change fftw3-dev to libfftw3-dev.
  - Update maintainer field as per spec.

Show diffs side-by-side

added added

removed removed

Lines of Context:
4
4
    Rosegarden
5
5
    A sequencer and musical notation editor.
6
6
 
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);    
333
333
}
334
334
 
 
335
int
 
336
Composition::getMaxContemporaneousSegmentsOnTrack(TrackId track) const
 
337
{
 
338
    // Could be made faster, but only if it needs to be.
 
339
 
 
340
    // This is similar to the polyphony calculation in
 
341
    // DocumentMetaConfigurationPage ctor.
 
342
 
 
343
    std::set<Segment *> simultaneous;
 
344
    std::multimap<timeT, Segment *> ends;
 
345
 
 
346
    int maximum = 0;
 
347
 
 
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());
 
356
        }
 
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;
 
361
    }
 
362
 
 
363
    return maximum;
 
364
}
 
365
 
 
366
int
 
367
Composition::getSegmentVoiceIndex(const Segment *segment) const
 
368
{
 
369
    TrackId track = segment->getTrack();
 
370
 
 
371
    // See function above
 
372
 
 
373
    std::map<Segment *, int> indices;
 
374
    std::set<int> used;
 
375
    std::multimap<timeT, Segment *> ends;
 
376
 
 
377
    int maximum = 0;
 
378
 
 
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();
 
383
        int index;
 
384
        while (!ends.empty() && t0 >= ends.begin()->first) {
 
385
            index = indices[ends.begin()->second];
 
386
            used.erase(index);
 
387
            indices.erase(ends.begin()->second);
 
388
            ends.erase(ends.begin());
 
389
        }
 
390
        for (index = 0; ; ++index) {
 
391
            if (used.find(index) == used.end()) break;
 
392
        }
 
393
        if (*i == segment) return index;
 
394
        indices[*i] = index;
 
395
        used.insert(index);
 
396
        ends.insert(std::multimap<timeT, Segment *>::value_type(t1, *i));
 
397
    }
 
398
 
 
399
    std::cerr << "WARNING: Composition::getSegmentVoiceIndex: segment "
 
400
              << segment << " not found in composition" << std::endl;
 
401
    return 0;
 
402
}
 
403
 
335
404
TriggerSegmentRec *
336
405
Composition::addTriggerSegment(Segment *s, int pitch, int velocity)
337
406
{
524
593
    timeT lastSigTime = 0;
525
594
    timeT barDuration = TimeSignature().getBarDuration();
526
595
 
 
596
    if (getStartMarker() < 0) {
 
597
        if (!t.empty() && (*t.begin())->getAbsoluteTime() <= 0) {
 
598
            barDuration = TimeSignature(**t.begin()).getBarDuration();
 
599
        }
 
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;
 
604
#endif
 
605
    }
 
606
 
527
607
    for (i = t.begin(); i != t.end(); ++i) {
528
608
 
529
609
        timeT myTime = (*i)->getAbsoluteTime();
683
763
int
684
764
Composition::addTimeSignature(timeT t, TimeSignature timeSig)
685
765
{
 
766
#ifdef DEBUG_BAR_STUFF
 
767
    cerr << "Composition::addTimeSignature(" << t << ", " << timeSig.getNumerator() << "/" << timeSig.getDenominator() << ")" << endl;
 
768
#endif
 
769
 
686
770
    ReferenceSegment::iterator i =
687
771
        m_timeSigSegment.insert(timeSig.getAsEvent(t));
688
772
    m_barPositionsNeedCalculating = true;
1800
1884
        delete ((*it).second);
1801
1885
 
1802
1886
    m_tracks.erase(m_tracks.begin(), m_tracks.end());
1803
 
    updateRefreshStatuses();
1804
1887
}
1805
1888
 
1806
1889
Track*
1826
1909
    return track->getPosition();
1827
1910
}
1828
1911
 
 
1912
 
1829
1913
Rosegarden::TrackId
1830
1914
Composition::getNewTrackId() const
1831
1915
{
1953
2037
}
1954
2038
 
1955
2039
void
1956
 
Composition::notifySegmentEndMarkerChange(Segment *s, bool shorten) const
 
2040
Composition::notifySegmentStartChanged(Segment *s, timeT t)
 
2041
{
 
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);
 
2046
    }
 
2047
}    
 
2048
 
 
2049
void
 
2050
Composition::notifySegmentEndMarkerChange(Segment *s, bool shorten)
1957
2051
{
1958
2052
    for (ObserverSet::const_iterator i = m_observers.begin();
1959
2053
         i != m_observers.end(); ++i) {