Mercurial > hg > beatroot-vamp
changeset 11:7169eb47b1bc
formatting only
author | Chris Cannam |
---|---|
date | Fri, 30 Sep 2011 23:11:14 +0100 |
parents | 1c1e98cd1b2e |
children | 59520cd6abac |
files | AgentList.h |
diffstat | 1 files changed, 125 insertions(+), 125 deletions(-) [+] |
line wrap: on
line diff
--- a/AgentList.h Fri Sep 30 23:08:42 2011 +0100 +++ b/AgentList.h Fri Sep 30 23:11:14 2011 +0100 @@ -40,145 +40,145 @@ Container::iterator end() { return list.end(); } void push_back(const Agent &a) { list.push_back(a); } - /** Flag for choice between sum and average beat salience values for Agent scores. - * The use of summed saliences favours faster tempi or lower metrical levels. */ - static bool useAverageSalience; + /** Flag for choice between sum and average beat salience values for Agent scores. + * The use of summed saliences favours faster tempi or lower metrical levels. */ + static bool useAverageSalience; - /** For the purpose of removing duplicate agents, the default JND of IBI */ - static const double DEFAULT_BI; + /** For the purpose of removing duplicate agents, the default JND of IBI */ + static const double DEFAULT_BI; - /** For the purpose of removing duplicate agents, the default JND of phase */ - static const double DEFAULT_BT; + /** For the purpose of removing duplicate agents, the default JND of phase */ + static const double DEFAULT_BT; - /** Inserts newAgent into the list in ascending order of beatInterval */ - void add(Agent a) { - add(a, true); - } // add()/1 + /** Inserts newAgent into the list in ascending order of beatInterval */ + void add(Agent a) { + add(a, true); + } // add()/1 - /** Appends newAgent to list (sort==false), or inserts newAgent into the list - * in ascending order of beatInterval - * @param newAgent The agent to be added to the list - * @param sort Flag indicating whether the list is sorted or not - */ - void add(Agent newAgent, bool sort){ - list.push_back(newAgent); - if (sort) this->sort(); - } // add()/2 + /** Appends newAgent to list (sort==false), or inserts newAgent into the list + * in ascending order of beatInterval + * @param newAgent The agent to be added to the list + * @param sort Flag indicating whether the list is sorted or not + */ + void add(Agent newAgent, bool sort){ + list.push_back(newAgent); + if (sort) this->sort(); + } // add()/2 - /** Sorts the AgentList by increasing beatInterval. */ - void sort() { - std::sort(list.begin(), list.end()); - } // sort() + /** Sorts the AgentList by increasing beatInterval. */ + void sort() { + std::sort(list.begin(), list.end()); + } // sort() - /** Removes the given item from the list. - * @param ptr Points to the Agent which is removed from the list - */ - void remove(iterator itr) { - list.erase(itr); - } // remove() + /** Removes the given item from the list. + * @param ptr Points to the Agent which is removed from the list + */ + void remove(iterator itr) { + list.erase(itr); + } // remove() protected: - /** Removes Agents from the list which are duplicates of other Agents. - * A duplicate is defined by the tempo and phase thresholds - * thresholdBI and thresholdBT respectively. - */ - void removeDuplicates() { - sort(); - for (iterator itr = begin(); itr != end(); ++itr) { - if (itr->phaseScore < 0.0) // already flagged for deletion - continue; - iterator itr2 = itr; - for (++itr2; itr2 != end(); ++itr2) { - if (itr2->beatInterval - itr->beatInterval > DEFAULT_BI) - break; - if (fabs(itr->beatTime - itr2->beatTime) > DEFAULT_BT) - continue; - if (itr->phaseScore < itr2->phaseScore) { - itr->phaseScore = -1.0; // flag for deletion - if (itr2->topScoreTime < itr->topScoreTime) - itr2->topScoreTime = itr->topScoreTime; - break; - } else { - itr2->phaseScore = -1.0; // flag for deletion - if (itr->topScoreTime < itr2->topScoreTime) - itr->topScoreTime = itr2->topScoreTime; - } - } - } - for (iterator itr = begin(); itr != end(); ) { - if (itr->phaseScore < 0.0) { - list.erase(itr); - } else { - ++itr; - } - } - } // removeDuplicates() + /** Removes Agents from the list which are duplicates of other Agents. + * A duplicate is defined by the tempo and phase thresholds + * thresholdBI and thresholdBT respectively. + */ + void removeDuplicates() { + sort(); + for (iterator itr = begin(); itr != end(); ++itr) { + if (itr->phaseScore < 0.0) // already flagged for deletion + continue; + iterator itr2 = itr; + for (++itr2; itr2 != end(); ++itr2) { + if (itr2->beatInterval - itr->beatInterval > DEFAULT_BI) + break; + if (fabs(itr->beatTime - itr2->beatTime) > DEFAULT_BT) + continue; + if (itr->phaseScore < itr2->phaseScore) { + itr->phaseScore = -1.0; // flag for deletion + if (itr2->topScoreTime < itr->topScoreTime) + itr2->topScoreTime = itr->topScoreTime; + break; + } else { + itr2->phaseScore = -1.0; // flag for deletion + if (itr->topScoreTime < itr2->topScoreTime) + itr->topScoreTime = itr2->topScoreTime; + } + } + } + for (iterator itr = begin(); itr != end(); ) { + if (itr->phaseScore < 0.0) { + list.erase(itr); + } else { + ++itr; + } + } + } // removeDuplicates() public: - /** Perform beat tracking on a list of events (onsets). - * @param el The list of onsets (or events or peaks) to beat track - */ - void beatTrack(EventList el) { - beatTrack(el, -1.0); - } // beatTrack()/1 + /** Perform beat tracking on a list of events (onsets). + * @param el The list of onsets (or events or peaks) to beat track + */ + void beatTrack(EventList el) { + beatTrack(el, -1.0); + } // beatTrack()/1 - /** Perform beat tracking on a list of events (onsets). - * @param el The list of onsets (or events or peaks) to beat track. - * @param stop Do not find beats after <code>stop</code> seconds. - */ - void beatTrack(EventList el, double stop) { - EventList::iterator ei = el.begin(); - bool phaseGiven = !empty() && (begin()->beatTime >= 0); // if given for one, assume given for others - while (ei != el.end()) { - Event ev = *ei; - ++ei; - if ((stop > 0) && (ev.time > stop)) - break; - bool created = phaseGiven; - double prevBeatInterval = -1.0; - // cc: Duplicate our list of agents, and scan through - // the (now immutable) copy. This means we can safely - // add agents to our own list while scanning without - // disrupting our scan. - Container currentAgents = list; - for (Container::iterator ai = currentAgents.begin(); - ai != currentAgents.end(); ++ai) { - Agent currentAgent = *ai; - if (currentAgent.beatInterval != prevBeatInterval) { - if ((prevBeatInterval>=0) && !created && (ev.time<5.0)) { - // Create new agent with different phase - Agent newAgent(prevBeatInterval); - // This may add an agent to our list - newAgent.considerAsBeat(ev, *this); - } - prevBeatInterval = currentAgent.beatInterval; - created = phaseGiven; + /** Perform beat tracking on a list of events (onsets). + * @param el The list of onsets (or events or peaks) to beat track. + * @param stop Do not find beats after <code>stop</code> seconds. + */ + void beatTrack(EventList el, double stop) { + EventList::iterator ei = el.begin(); + bool phaseGiven = !empty() && (begin()->beatTime >= 0); // if given for one, assume given for others + while (ei != el.end()) { + Event ev = *ei; + ++ei; + if ((stop > 0) && (ev.time > stop)) + break; + bool created = phaseGiven; + double prevBeatInterval = -1.0; + // cc: Duplicate our list of agents, and scan through + // the (now immutable) copy. This means we can safely + // add agents to our own list while scanning without + // disrupting our scan. + Container currentAgents = list; + for (Container::iterator ai = currentAgents.begin(); + ai != currentAgents.end(); ++ai) { + Agent currentAgent = *ai; + if (currentAgent.beatInterval != prevBeatInterval) { + if ((prevBeatInterval>=0) && !created && (ev.time<5.0)) { + // Create new agent with different phase + Agent newAgent(prevBeatInterval); + // This may add an agent to our list + newAgent.considerAsBeat(ev, *this); } - if (currentAgent.considerAsBeat(ev, *this)) - created = true; - } // loop for each agent - removeDuplicates(); - } // loop for each event - } // beatTrack() + prevBeatInterval = currentAgent.beatInterval; + created = phaseGiven; + } + if (currentAgent.considerAsBeat(ev, *this)) + created = true; + } // loop for each agent + removeDuplicates(); + } // loop for each event + } // beatTrack() - /** Finds the Agent with the highest score in the list, or NULL if beat tracking has failed. - * @return The Agent with the highest score - */ - Agent *bestAgent() { - double best = -1.0; - Agent *bestAg = 0; - for (iterator itr = begin(); itr != end(); ++itr) { - if (itr->events.empty()) continue; - double startTime = itr->events.begin()->time; - double conf = (itr->phaseScore + itr->tempoScore) / - (useAverageSalience? (double)itr->beatCount: 1.0); - if (conf > best) { - bestAg = &(*itr); - best = conf; - } + /** Finds the Agent with the highest score in the list, or NULL if beat tracking has failed. + * @return The Agent with the highest score + */ + Agent *bestAgent() { + double best = -1.0; + Agent *bestAg = 0; + for (iterator itr = begin(); itr != end(); ++itr) { + if (itr->events.empty()) continue; + double startTime = itr->events.begin()->time; + double conf = (itr->phaseScore + itr->tempoScore) / + (useAverageSalience? (double)itr->beatCount: 1.0); + if (conf > best) { + bestAg = &(*itr); + best = conf; } - return bestAg; - } // bestAgent() + } + return bestAg; + } // bestAgent() }; // class AgentList