Mercurial > hg > beatroot-vamp
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() |