|
|
@ -287,7 +287,7 @@ AbstractSet<Element, Container>::initialise()
|
|
|
|
m_final = m_baseIterator;
|
|
|
|
m_final = m_baseIterator;
|
|
|
|
sample(m_baseIterator, true);
|
|
|
|
sample(m_baseIterator, true);
|
|
|
|
|
|
|
|
|
|
|
|
if (getAsEvent(m_baseIterator)->isa(Note::EventType)) {
|
|
|
|
if (AbstractSet::getAsEvent(m_baseIterator)->isa(Note::EventType)) {
|
|
|
|
m_initialNote = m_baseIterator;
|
|
|
|
m_initialNote = m_baseIterator;
|
|
|
|
m_finalNote = m_baseIterator;
|
|
|
|
m_finalNote = m_baseIterator;
|
|
|
|
}
|
|
|
|
}
|
|
|
@ -300,7 +300,7 @@ AbstractSet<Element, Container>::initialise()
|
|
|
|
for (i = j = m_baseIterator; i != getContainer().begin() && test(--j); i = j){
|
|
|
|
for (i = j = m_baseIterator; i != getContainer().begin() && test(--j); i = j){
|
|
|
|
if (sample(j, false)) {
|
|
|
|
if (sample(j, false)) {
|
|
|
|
m_initial = j;
|
|
|
|
m_initial = j;
|
|
|
|
if (getAsEvent(j)->isa(Note::EventType)) {
|
|
|
|
if (AbstractSet::getAsEvent(j)->isa(Note::EventType)) {
|
|
|
|
m_initialNote = j;
|
|
|
|
m_initialNote = j;
|
|
|
|
if (m_finalNote == getContainer().end()) {
|
|
|
|
if (m_finalNote == getContainer().end()) {
|
|
|
|
m_finalNote = j;
|
|
|
|
m_finalNote = j;
|
|
|
@ -317,7 +317,7 @@ AbstractSet<Element, Container>::initialise()
|
|
|
|
for (i = j = m_baseIterator; ++j != getContainer().end() && test(j); i = j) {
|
|
|
|
for (i = j = m_baseIterator; ++j != getContainer().end() && test(j); i = j) {
|
|
|
|
if (sample(j, true)) {
|
|
|
|
if (sample(j, true)) {
|
|
|
|
m_final = j;
|
|
|
|
m_final = j;
|
|
|
|
if (getAsEvent(j)->isa(Note::EventType)) {
|
|
|
|
if (AbstractSet::getAsEvent(j)->isa(Note::EventType)) {
|
|
|
|
m_finalNote = j;
|
|
|
|
m_finalNote = j;
|
|
|
|
if (m_initialNote == getContainer().end()) {
|
|
|
|
if (m_initialNote == getContainer().end()) {
|
|
|
|
m_initialNote = j;
|
|
|
|
m_initialNote = j;
|
|
|
@ -332,17 +332,17 @@ bool
|
|
|
|
AbstractSet<Element, Container>::sample(const Iterator &i, bool)
|
|
|
|
AbstractSet<Element, Container>::sample(const Iterator &i, bool)
|
|
|
|
{
|
|
|
|
{
|
|
|
|
const Quantizer &q(getQuantizer());
|
|
|
|
const Quantizer &q(getQuantizer());
|
|
|
|
Event *e = getAsEvent(i);
|
|
|
|
Event *e = AbstractSet::getAsEvent(i);
|
|
|
|
timeT d(q.getQuantizedDuration(e));
|
|
|
|
timeT d(q.getQuantizedDuration(e));
|
|
|
|
|
|
|
|
|
|
|
|
if (e->isa(Note::EventType) || d > 0) {
|
|
|
|
if (e->isa(Note::EventType) || d > 0) {
|
|
|
|
if (m_longest == getContainer().end() ||
|
|
|
|
if (m_longest == getContainer().end() ||
|
|
|
|
d > q.getQuantizedDuration(getAsEvent(m_longest))) {
|
|
|
|
d > q.getQuantizedDuration(AbstractSet::getAsEvent(m_longest))) {
|
|
|
|
// std::cerr << "New longest in set at duration " << d << " and time " << e->getAbsoluteTime() << std::endl;
|
|
|
|
// std::cerr << "New longest in set at duration " << d << " and time " << e->getAbsoluteTime() << std::endl;
|
|
|
|
m_longest = i;
|
|
|
|
m_longest = i;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
if (m_shortest == getContainer().end() ||
|
|
|
|
if (m_shortest == getContainer().end() ||
|
|
|
|
d < q.getQuantizedDuration(getAsEvent(m_shortest))) {
|
|
|
|
d < q.getQuantizedDuration(AbstractSet::getAsEvent(m_shortest))) {
|
|
|
|
// std::cerr << "New shortest in set at duration " << d << " and time " << e->getAbsoluteTime() << std::endl;
|
|
|
|
// std::cerr << "New shortest in set at duration " << d << " and time " << e->getAbsoluteTime() << std::endl;
|
|
|
|
m_shortest = i;
|
|
|
|
m_shortest = i;
|
|
|
|
}
|
|
|
|
}
|
|
|
@ -352,12 +352,12 @@ AbstractSet<Element, Container>::sample(const Iterator &i, bool)
|
|
|
|
long p = get__Int(e, BaseProperties::PITCH);
|
|
|
|
long p = get__Int(e, BaseProperties::PITCH);
|
|
|
|
|
|
|
|
|
|
|
|
if (m_highest == getContainer().end() ||
|
|
|
|
if (m_highest == getContainer().end() ||
|
|
|
|
p > get__Int(getAsEvent(m_highest), BaseProperties::PITCH)) {
|
|
|
|
p > get__Int(AbstractSet::getAsEvent(m_highest), BaseProperties::PITCH)) {
|
|
|
|
// std::cerr << "New highest in set at pitch " << p << " and time " << e->getAbsoluteTime() << std::endl;
|
|
|
|
// std::cerr << "New highest in set at pitch " << p << " and time " << e->getAbsoluteTime() << std::endl;
|
|
|
|
m_highest = i;
|
|
|
|
m_highest = i;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
if (m_lowest == getContainer().end() ||
|
|
|
|
if (m_lowest == getContainer().end() ||
|
|
|
|
p < get__Int(getAsEvent(m_lowest), BaseProperties::PITCH)) {
|
|
|
|
p < get__Int(AbstractSet::getAsEvent(m_lowest), BaseProperties::PITCH)) {
|
|
|
|
// std::cerr << "New lowest in set at pitch " << p << " and time " << e->getAbsoluteTime() << std::endl;
|
|
|
|
// std::cerr << "New lowest in set at pitch " << p << " and time " << e->getAbsoluteTime() << std::endl;
|
|
|
|
m_lowest = i;
|
|
|
|
m_lowest = i;
|
|
|
|
}
|
|
|
|
}
|
|
|
@ -376,8 +376,8 @@ GenericChord<Element, Container, singleStaff>::GenericChord(Container &c,
|
|
|
|
PropertyName stemUpProperty) :
|
|
|
|
PropertyName stemUpProperty) :
|
|
|
|
AbstractSet<Element, Container>(c, i, q),
|
|
|
|
AbstractSet<Element, Container>(c, i, q),
|
|
|
|
m_stemUpProperty(stemUpProperty),
|
|
|
|
m_stemUpProperty(stemUpProperty),
|
|
|
|
m_time(q->getQuantizedAbsoluteTime(getAsEvent(i))),
|
|
|
|
m_time(q->getQuantizedAbsoluteTime(GenericChord::getAsEvent(i))),
|
|
|
|
m_subordering(getAsEvent(i)->getSubOrdering()),
|
|
|
|
m_subordering(GenericChord::getAsEvent(i)->getSubOrdering()),
|
|
|
|
m_firstReject(c.end())
|
|
|
|
m_firstReject(c.end())
|
|
|
|
{
|
|
|
|
{
|
|
|
|
AbstractSet<Element, Container>::initialise();
|
|
|
|
AbstractSet<Element, Container>::initialise();
|
|
|
@ -416,7 +416,7 @@ template <class Element, class Container, bool singleStaff>
|
|
|
|
bool
|
|
|
|
bool
|
|
|
|
GenericChord<Element, Container, singleStaff>::test(const Iterator &i)
|
|
|
|
GenericChord<Element, Container, singleStaff>::test(const Iterator &i)
|
|
|
|
{
|
|
|
|
{
|
|
|
|
Event *e = getAsEvent(i);
|
|
|
|
Event *e = GenericChord::getAsEvent(i);
|
|
|
|
if (AbstractSet<Element, Container>::
|
|
|
|
if (AbstractSet<Element, Container>::
|
|
|
|
getQuantizer().getQuantizedAbsoluteTime(e) != m_time) {
|
|
|
|
getQuantizer().getQuantizedAbsoluteTime(e) != m_time) {
|
|
|
|
return false;
|
|
|
|
return false;
|
|
|
@ -452,7 +452,7 @@ bool
|
|
|
|
GenericChord<Element, Container, singleStaff>::sample(const Iterator &i,
|
|
|
|
GenericChord<Element, Container, singleStaff>::sample(const Iterator &i,
|
|
|
|
bool goingForwards)
|
|
|
|
bool goingForwards)
|
|
|
|
{
|
|
|
|
{
|
|
|
|
Event *e1 = getAsEvent(i);
|
|
|
|
Event *e1 = GenericChord::getAsEvent(i);
|
|
|
|
if (!e1->isa(Note::EventType)) {
|
|
|
|
if (!e1->isa(Note::EventType)) {
|
|
|
|
if (goingForwards && m_firstReject == AbstractSet<Element, Container>::getContainer().end()) m_firstReject = i;
|
|
|
|
if (goingForwards && m_firstReject == AbstractSet<Element, Container>::getContainer().end()) m_firstReject = i;
|
|
|
|
return false;
|
|
|
|
return false;
|
|
|
@ -472,7 +472,7 @@ GenericChord<Element, Container, singleStaff>::sample(const Iterator &i,
|
|
|
|
|
|
|
|
|
|
|
|
if (AbstractSet<Element, Container>::m_baseIterator != AbstractSet<Element, Container>::getContainer().end()) {
|
|
|
|
if (AbstractSet<Element, Container>::m_baseIterator != AbstractSet<Element, Container>::getContainer().end()) {
|
|
|
|
|
|
|
|
|
|
|
|
Event *e0 = getAsEvent(AbstractSet<Element, Container>::m_baseIterator);
|
|
|
|
Event *e0 = GenericChord::getAsEvent(AbstractSet<Element, Container>::m_baseIterator);
|
|
|
|
|
|
|
|
|
|
|
|
if (!(m_stemUpProperty == PropertyName::EmptyPropertyName)) {
|
|
|
|
if (!(m_stemUpProperty == PropertyName::EmptyPropertyName)) {
|
|
|
|
|
|
|
|
|
|
|
@ -518,7 +518,7 @@ GenericChord<Element, Container, singleStaff>::sample(const Iterator &i,
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
AbstractSet<Element, Container>::sample(i, goingForwards);
|
|
|
|
AbstractSet<Element, Container>::sample(i, goingForwards);
|
|
|
|
push_back(i);
|
|
|
|
this->push_back(i);
|
|
|
|
return true;
|
|
|
|
return true;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
@ -560,7 +560,7 @@ GenericChord<Element, Container, singleStaff>::getMarkCountForChord() const
|
|
|
|
|
|
|
|
|
|
|
|
for (unsigned int i = 0; i < std::vector<typename Container::iterator>::size(); ++i) {
|
|
|
|
for (unsigned int i = 0; i < std::vector<typename Container::iterator>::size(); ++i) {
|
|
|
|
|
|
|
|
|
|
|
|
Event *e = getAsEvent((*this)[i]);
|
|
|
|
Event *e = GenericChord::getAsEvent((*this)[i]);
|
|
|
|
std::vector<Mark> marks(Marks::getMarks(*e));
|
|
|
|
std::vector<Mark> marks(Marks::getMarks(*e));
|
|
|
|
|
|
|
|
|
|
|
|
for (std::vector<Mark>::iterator j = marks.begin(); j != marks.end(); ++j) {
|
|
|
|
for (std::vector<Mark>::iterator j = marks.begin(); j != marks.end(); ++j) {
|
|
|
@ -580,7 +580,7 @@ GenericChord<Element, Container, singleStaff>::getMarksForChord() const
|
|
|
|
|
|
|
|
|
|
|
|
for (unsigned int i = 0; i < std::vector<typename Container::iterator>::size(); ++i) {
|
|
|
|
for (unsigned int i = 0; i < std::vector<typename Container::iterator>::size(); ++i) {
|
|
|
|
|
|
|
|
|
|
|
|
Event *e = getAsEvent((*this)[i]);
|
|
|
|
Event *e = GenericChord::getAsEvent((*this)[i]);
|
|
|
|
std::vector<Mark> marks(Marks::getMarks(*e));
|
|
|
|
std::vector<Mark> marks(Marks::getMarks(*e));
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
@ -607,9 +607,9 @@ GenericChord<Element, Container, singleStaff>::getPitches() const
|
|
|
|
|
|
|
|
|
|
|
|
for (typename std::vector<typename Container::iterator>::const_iterator
|
|
|
|
for (typename std::vector<typename Container::iterator>::const_iterator
|
|
|
|
i = std::vector<typename Container::iterator>::begin(); i != std::vector<typename Container::iterator>::end(); ++i) {
|
|
|
|
i = std::vector<typename Container::iterator>::begin(); i != std::vector<typename Container::iterator>::end(); ++i) {
|
|
|
|
if (getAsEvent(*i)->has(BaseProperties::PITCH)) {
|
|
|
|
if (GenericChord::getAsEvent(*i)->has(BaseProperties::PITCH)) {
|
|
|
|
int pitch = get__Int
|
|
|
|
int pitch = get__Int
|
|
|
|
(getAsEvent(*i), BaseProperties::PITCH);
|
|
|
|
(GenericChord::getAsEvent(*i), BaseProperties::PITCH);
|
|
|
|
if (pitches.size() > 0 && pitches[pitches.size()-1] == pitch)
|
|
|
|
if (pitches.size() > 0 && pitches[pitches.size()-1] == pitch)
|
|
|
|
continue;
|
|
|
|
continue;
|
|
|
|
pitches.push_back(pitch);
|
|
|
|
pitches.push_back(pitch);
|
|
|
@ -641,7 +641,7 @@ GenericChord<Element, Container, singleStaff>::getPreviousNote()
|
|
|
|
while (1) {
|
|
|
|
while (1) {
|
|
|
|
if (i == AbstractSet<Element, Container>::getContainer().begin()) return AbstractSet<Element, Container>::getContainer().end();
|
|
|
|
if (i == AbstractSet<Element, Container>::getContainer().begin()) return AbstractSet<Element, Container>::getContainer().end();
|
|
|
|
--i;
|
|
|
|
--i;
|
|
|
|
if (getAsEvent(i)->isa(Note::EventType)) {
|
|
|
|
if (GenericChord::getAsEvent(i)->isa(Note::EventType)) {
|
|
|
|
return i;
|
|
|
|
return i;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
@ -655,7 +655,7 @@ GenericChord<Element, Container, singleStaff>::getNextNote()
|
|
|
|
Iterator i(AbstractSet<Element, Container>::getFinalElement());
|
|
|
|
Iterator i(AbstractSet<Element, Container>::getFinalElement());
|
|
|
|
while ( i != AbstractSet<Element, Container>::getContainer().end() &&
|
|
|
|
while ( i != AbstractSet<Element, Container>::getContainer().end() &&
|
|
|
|
++i != AbstractSet<Element, Container>::getContainer().end()) {
|
|
|
|
++i != AbstractSet<Element, Container>::getContainer().end()) {
|
|
|
|
if (getAsEvent(i)->isa(Note::EventType)) {
|
|
|
|
if (GenericChord::getAsEvent(i)->isa(Note::EventType)) {
|
|
|
|
return i;
|
|
|
|
return i;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
@ -677,8 +677,8 @@ GenericChord<Element, Container, singleStaff>::PitchGreater::operator()(const It
|
|
|
|
const Iterator &b)
|
|
|
|
const Iterator &b)
|
|
|
|
{
|
|
|
|
{
|
|
|
|
try {
|
|
|
|
try {
|
|
|
|
long ap = get__Int(getAsEvent(a), BaseProperties::PITCH);
|
|
|
|
long ap = get__Int(GenericChord::getAsEvent(a), BaseProperties::PITCH);
|
|
|
|
long bp = get__Int(getAsEvent(b), BaseProperties::PITCH);
|
|
|
|
long bp = get__Int(GenericChord::getAsEvent(b), BaseProperties::PITCH);
|
|
|
|
return (ap < bp);
|
|
|
|
return (ap < bp);
|
|
|
|
} catch (Event::NoData) {
|
|
|
|
} catch (Event::NoData) {
|
|
|
|
std::cerr << "Bad karma: PitchGreater failed to find one or both pitches" << std::endl;
|
|
|
|
std::cerr << "Bad karma: PitchGreater failed to find one or both pitches" << std::endl;
|
|
|
|