comparison Agent.cpp @ 9:4f6626f9ffac

Many fixes. This now compiles and passes the plugin tester, but I don't expect it produces any results yet.
author Chris Cannam
date Fri, 30 Sep 2011 15:39:17 +0100
parents f04f87b5e643
children 59520cd6abac
comparison
equal deleted inserted replaced
8:f04f87b5e643 9:4f6626f9ffac
25 const double Agent::DEFAULT_EXPIRY_TIME = 10.0; 25 const double Agent::DEFAULT_EXPIRY_TIME = 10.0;
26 26
27 int Agent::idCounter = 0; 27 int Agent::idCounter = 0;
28 28
29 double Agent::innerMargin = 0.0; 29 double Agent::innerMargin = 0.0;
30 double Agent::outerMargin = 0.0;
31 double Agent::correctionFactor = 0.0; 30 double Agent::correctionFactor = 0.0;
32 double Agent::expiryTime = 0.0; 31 double Agent::expiryTime = 0.0;
33 double Agent::decayFactor = 0.0; 32 double Agent::decayFactor = 0.0;
34 33
35 bool Agent::considerAsBeat(Event e, AgentList &a) { 34 bool Agent::considerAsBeat(Event e, AgentList &a) {
36 double err; 35 double err;
37 if (beatTime < 0) { // first event 36 if (beatTime < 0) { // first event
38 accept(e, 0, 1); 37 accept(e, 0, 1);
39 return true; 38 return true;
40 } else { // subsequent events 39 } else { // subsequent events
41 if (e.time - events.l.getLast().keyDown > expiryTime) { 40 EventList::iterator last = events.end();
41 --last;
42 if (e.time - last->time > expiryTime) {
42 phaseScore = -1.0; // flag agent to be deleted 43 phaseScore = -1.0; // flag agent to be deleted
43 return false; 44 return false;
44 } 45 }
45 double beats = nearbyint((e.time - beatTime) / beatInterval); 46 double beats = nearbyint((e.time - beatTime) / beatInterval);
46 err = e.time - beatTime - beats * beatInterval; 47 err = e.time - beatTime - beats * beatInterval;
47 if ((beats > 0) && (-preMargin <= err) && (err <= postMargin)) { 48 if ((beats > 0) && (-preMargin <= err) && (err <= postMargin)) {
48 if (fabs(err) > innerMargin) // Create new agent that skips this 49 if (fabs(err) > innerMargin) // Create new agent that skips this
49 a.push_back(Agent(*this)); // event (avoids large phase jump) 50 a.add(Agent(*this)); // event (avoids large phase jump)
50 accept(e, err, (int)beats); 51 accept(e, err, (int)beats);
51 return true; 52 return true;
52 } 53 }
53 } 54 }
54 return false; 55 return false;
55 } // considerAsBeat() 56 } // considerAsBeat()
56 57
57 58
58 void fillBeats(double start) { 59 void Agent::fillBeats(double start) {
59 double prevBeat = 0, nextBeat, currentInterval, beats; 60 double prevBeat = 0, nextBeat, currentInterval, beats;
60 EventList::iterator list = events.begin(); 61 EventList::iterator ei = events.begin();
61 if (list != events.end()) { 62 if (ei != events.end()) {
62 ++list; 63 ++ei;
63 prevBeat = list->time; 64 prevBeat = ei->time;
64 --list; 65 --ei;
65 } 66 }
66 for ( ; list != events.end(); ++list) { 67 for ( ; ei != events.end(); ++ei) {
67 ++list; 68 ++ei;
68 nextBeat = list->time; 69 nextBeat = ei->time;
69 --list; 70 --ei; // so as to insert before nextBeat
70 beats = nearbyint((nextBeat - prevBeat) / beatInterval - 0.01); //prefer slow 71 beats = nearbyint((nextBeat - prevBeat) / beatInterval - 0.01); //prefer slow
71 currentInterval = (nextBeat - prevBeat) / beats; 72 currentInterval = (nextBeat - prevBeat) / beats;
72 for ( ; (nextBeat > start) && (beats > 1.5); beats--) { 73 for ( ; (nextBeat > start) && (beats > 1.5); beats--) {
73 prevBeat += currentInterval; 74 prevBeat += currentInterval;
74 //!!! need to insert this event after current itr 75 events.insert(ei, BeatTracker::newBeat(prevBeat, 0));
75 list.add(BeatTracker::newBeat(prevBeat, 0)); // more than once OK?? 76 ++ei;
76 } 77 }
77 prevBeat = nextBeat; 78 prevBeat = nextBeat;
78 } 79 }
79 } // fillBeats() 80 } // fillBeats()