annotate src/beatTempo.cpp @ 12:e148d1534733 tip

adding new max player
author Andrew N Robertson <andrew.robertson@eecs.qmul.ac.uk>
date Fri, 09 Mar 2012 20:42:34 +0000
parents 0f9165f96bdb
children
rev   line source
andrew@0 1 /*
andrew@0 2 * beatTempo.cpp
andrew@0 3 * bayesianTempo1
andrew@0 4 *
andrew@0 5 * Created by Andrew Robertson on 08/05/2010.
andrew@0 6 * Copyright 2010 __MyCompanyName__. All rights reserved.
andrew@0 7 *
andrew@0 8 */
andrew@0 9
andrew@0 10 #include "beatTempo.h"
andrew@0 11
andrew@0 12 beatTempo::beatTempo(){
andrew@0 13 index = 0;
andrew@0 14 lastBeatTime = 0;
andrew@0 15 decayAmount = 0;
andrew@0 16 }
andrew@0 17
andrew@0 18 //records a loop of cpu times for the last 16 events received
andrew@0 19
andrew@0 20 void beatTempo::addBeatTime(double f, int type){
andrew@0 21 //type 1 is kick, type 2 is snare
andrew@0 22
andrew@0 23 index++;
andrew@0 24 startIndex++;
andrew@0 25 if (index == 16){
andrew@0 26 index = 0;
andrew@0 27 }
andrew@0 28 lastBeatTime = f;
andrew@0 29 beatTimes[index] = f;
andrew@0 30
andrew@0 31 //find the closest click time to this new cputime
andrew@0 32 //NOT ACTUALLY USED ANYWHERE....
andrew@0 33 double useThisClickTime = lastClickTime;
andrew@0 34 int useThisClickIndex = lastClickIndex ;
andrew@0 35
andrew@0 36 if (lastClickTime + (tatum/2) < f){
andrew@0 37 //next click time
andrew@0 38 closestClickIndexToBeat[index] = lastClickIndex + 1;
andrew@0 39 //useThisClickTime += tatum;
andrew@0 40 // useThisClickIndex++;
andrew@0 41 }
andrew@0 42 else{
andrew@0 43 //recent click time
andrew@0 44 closestClickIndexToBeat[index] = lastClickIndex;
andrew@0 45 }
andrew@0 46 //end not used
andrew@0 47
andrew@0 48
andrew@0 49 int lastBeatSegment = beatSegment;
andrew@0 50
andrew@0 51 //timeDifference = f - lastClickTime;
andrew@0 52 timeDifference = f - lastClickTime;
andrew@0 53 //[0, 1] => [0, 2*tatum]
andrew@0 54 beatSegment = (6*(lastClickIndex%8));
andrew@0 55 beatSegment += ( ( (int)floor( ( ( (timeDifference + (tatum/12)) * 6) ) / tatum) ) );
andrew@0 56
andrew@0 57
andrew@0 58
andrew@0 59 //this calculates the probabilities of events in the different zones
andrew@0 60 //not yet used in the algorithm
andrew@0 61 beatSegment = beatSegment%48;
andrew@0 62 //wipe old onez
andrew@0 63 while (lastBeatSegment%48 != beatSegment){
andrew@0 64 lastBeatSegment++;
andrew@0 65 if (lastBeatSegment%12 == 0)
andrew@0 66 decayProbabilityDistributionRow((lastBeatSegment/12)%4);
andrew@0 67
andrew@0 68 beatMap[lastBeatSegment%48] = 0;
andrew@0 69
andrew@0 70 }
andrew@0 71 addToProbabilityDistribution(beatSegment, type);
andrew@0 72 //end of new addition
andrew@0 73
andrew@0 74 beatMap[beatSegment] = type;
andrew@0 75
andrew@0 76
andrew@0 77
andrew@0 78 double intervalCalculation;
andrew@0 79 int otherIndex;
andrew@0 80 for (otherIndex = 0;otherIndex < 16;otherIndex++){
andrew@0 81
andrew@0 82 if (otherIndex != index){
andrew@0 83 intervalCalculation = calculateInterval(index, otherIndex);
andrew@0 84 relativeIntervals[otherIndex][0] = intervalCalculation;
andrew@0 85 intervalDifferences[index][otherIndex] = intervalCalculation;
andrew@0 86
andrew@0 87 //integer multiple is relativeIntervals[otherIndex][1]
andrew@0 88 }
andrew@0 89 else{
andrew@0 90 intervalDifferences[index][otherIndex] = 0;
andrew@0 91 }
andrew@0 92 }
andrew@0 93
andrew@0 94
andrew@0 95
andrew@0 96 }
andrew@0 97
andrew@0 98
andrew@0 99 void beatTempo::addToProbabilityDistribution(int beatSegment, int type){
andrew@0 100 //printf("beat segment %i\n", beatSegment);
andrew@0 101 int beatNumber = (int) (beatSegment + 1)/12;
andrew@0 102 beatNumber = beatNumber%4;
andrew@0 103 float newProbabilityContribution = 1 - decayAmount;
andrew@0 104 switch (beatSegment%12) {
andrew@0 105 case 0:
andrew@0 106 beatProbabilityDistribution[beatNumber][0][type - 1] = newProbabilityContribution;
andrew@0 107 break;
andrew@0 108 case 1:
andrew@0 109 beatProbabilityDistribution[beatNumber][0][type - 1] = 1*newProbabilityContribution;
andrew@0 110 break;
andrew@0 111 case 2:
andrew@0 112 beatProbabilityDistribution[beatNumber][0][type - 1] = 0.5*newProbabilityContribution;
andrew@0 113 beatProbabilityDistribution[beatNumber][1][type - 1] = 0.5*newProbabilityContribution;
andrew@0 114 break;
andrew@0 115 case 3:
andrew@0 116 beatProbabilityDistribution[beatNumber][1][type - 1] = 1*newProbabilityContribution;
andrew@0 117 break;
andrew@0 118 case 4:
andrew@0 119 beatProbabilityDistribution[beatNumber][1][type - 1] = 0.4*newProbabilityContribution;
andrew@0 120 beatProbabilityDistribution[beatNumber][2][type - 1] = 0.6*newProbabilityContribution;
andrew@0 121 break;
andrew@0 122 case 5:
andrew@0 123 beatProbabilityDistribution[beatNumber][2][type - 1] = 0.4*newProbabilityContribution;
andrew@0 124 beatProbabilityDistribution[beatNumber][3][type - 1] = 0.6*newProbabilityContribution;
andrew@0 125 break;
andrew@0 126 case 6:
andrew@0 127 beatProbabilityDistribution[beatNumber][3][type - 1] = 1*newProbabilityContribution;
andrew@0 128 break;
andrew@0 129 case 7:
andrew@0 130 beatProbabilityDistribution[beatNumber][3][type - 1] = 1*newProbabilityContribution;
andrew@0 131 break;
andrew@0 132 case 8:
andrew@0 133 beatProbabilityDistribution[beatNumber][4][type - 1] = 0.6*newProbabilityContribution;
andrew@0 134 beatProbabilityDistribution[beatNumber][5][type - 1] = 0.4*newProbabilityContribution;
andrew@0 135 break;
andrew@0 136 case 9:
andrew@0 137 beatProbabilityDistribution[beatNumber][5][type - 1] = 1*newProbabilityContribution;
andrew@0 138 break;
andrew@0 139 case 10:
andrew@0 140 beatProbabilityDistribution[beatNumber][5][type - 1] = 0.5*newProbabilityContribution;
andrew@0 141 break;
andrew@0 142 case 11:
andrew@0 143 beatProbabilityDistribution[(beatNumber+1)%4][0][type - 1] = 1*newProbabilityContribution;
andrew@0 144 break;
andrew@0 145 }
andrew@0 146
andrew@0 147
andrew@0 148 }
andrew@0 149
andrew@0 150 void beatTempo::decayProbabilityDistributionRow(int row){
andrew@0 151
andrew@0 152 for (int x = 0;x<6;x++){
andrew@0 153 beatProbabilityDistribution[row][x][0] *= decayAmount;
andrew@0 154 beatProbabilityDistribution[row][x][1] *= decayAmount;
andrew@0 155 }
andrew@0 156
andrew@0 157
andrew@0 158 }
andrew@0 159
andrew@0 160 double beatTempo::calculateInterval(int newIndex, int otherIndex){
andrew@0 161
andrew@0 162 double newTime, otherTime, interval, relativeInterval;
andrew@0 163 relativeInterval = tatum;
andrew@0 164 int tatumMultiple;
andrew@0 165 newTime = beatTimes[newIndex];
andrew@0 166 otherTime = beatTimes[otherIndex];
andrew@0 167 if (otherTime > 0){
andrew@0 168 interval = newTime - otherTime;
andrew@0 169 // tatumMultiple = closestClickIndexToBeat[newIndex] - closestClickIndexToBeat[otherIndex]; - to be added
andrew@0 170 tatumMultiple = round (interval / tatum);
andrew@0 171 if (tatumMultiple > 0){
andrew@0 172 relativeInterval = interval / (tatumMultiple);
andrew@0 173 relativeIntervals[otherIndex][1] = tatumMultiple;
andrew@0 174 tatumMultiples[newIndex][otherIndex] = tatumMultiple;
andrew@0 175 }//end if
andrew@0 176 }
andrew@0 177 return relativeInterval;
andrew@0 178
andrew@0 179 }
andrew@0 180
andrew@0 181
andrew@0 182 void beatTempo::resetBeatTimeArray(){
andrew@0 183 for (int i = 0;i < 16;i++){
andrew@0 184 beatTimes[i] = 0;
andrew@0 185 for (int k = 0;k < 16;k++)
andrew@0 186 intervalDifferences[i][k] = 0;
andrew@0 187 }
andrew@0 188 }