annotate src/DynamicVector.cpp @ 1:1a32ce016bb9

Changed bestEstimate timing to work via time sent from Max not the elapsed time. This had caused some problems, but this version now working surprisingly well on MIDI files with variable timing.
author Andrew N Robertson <andrew.robertson@eecs.qmul.ac.uk>
date Thu, 18 Aug 2011 23:27:42 +0100
parents b299a65a3ad0
children 5581023e0de4
rev   line source
andrew@0 1 /*
andrew@0 2 * DynamicVector.cpp
andrew@0 3 * midiCannamReader
andrew@0 4 *
andrew@0 5 * Created by Andrew on 18/07/2011.
andrew@0 6 * Copyright 2011 QMUL. All rights reserved.
andrew@0 7 *
andrew@0 8 */
andrew@0 9
andrew@0 10 #include "DynamicVector.h"
andrew@0 11
andrew@0 12 DynamicVector::DynamicVector(){
andrew@0 13 length = 0;
andrew@0 14 arraySize = 0;
andrew@0 15 maximumValue = 0;
andrew@0 16 MAPestimate = 0;
andrew@0 17 offset = 0;
andrew@0 18 scalar = 1;
andrew@0 19 }
andrew@0 20
andrew@0 21 void DynamicVector::copyFromDynamicVector(const DynamicVector& dynamicVec){
andrew@0 22 if (dynamicVec.length == length){
andrew@0 23 for (int i = 0;i < length;i++)
andrew@0 24 array[i] = dynamicVec.array[i];
andrew@0 25 }
andrew@0 26 else{
andrew@0 27 printf("CANNOT COPY VECTORS OF NON SAME LENGTH!!\n");
andrew@0 28 }
andrew@0 29 }
andrew@0 30
andrew@0 31 void DynamicVector::createVector(int len){
andrew@0 32 array.clear();
andrew@0 33 for (int i = 0; i < len;i++){
andrew@0 34 array.push_back(0);
andrew@0 35 }
andrew@0 36 length = len;
andrew@0 37 arraySize = array.size();
andrew@0 38 }
andrew@0 39
andrew@0 40
andrew@0 41 double DynamicVector::getMaximum(){
andrew@0 42 int i;
andrew@0 43 double max = 0;
andrew@0 44 for (i=0;i < length;i++){
andrew@0 45 if (array[i] > max){
andrew@0 46 max = array[i];
andrew@0 47 MAPestimate = i;
andrew@0 48 }
andrew@0 49 }
andrew@0 50 maximumValue = max;
andrew@0 51 return max;
andrew@0 52 }
andrew@0 53
andrew@0 54 void DynamicVector::zero(){
andrew@0 55 for (int i = 0;i < array.size();i++)
andrew@0 56 array[i] = 0;
andrew@0 57 }
andrew@0 58
andrew@0 59 void DynamicVector::renormalise(){
andrew@0 60 double tmpMax = getMaximum();
andrew@0 61 if (tmpMax > 0){
andrew@0 62 // printf("renormalise : max is %f and size is %i\n", tmpMax, arraySize);
andrew@0 63 for (int i = 0;i < array.size();i++)
andrew@0 64 array[i] /= tmpMax;
andrew@0 65
andrew@0 66 }
andrew@0 67 //printArray();
andrew@0 68 }
andrew@0 69
andrew@0 70 void DynamicVector::doProduct(DynamicVector& arrayOne, DynamicVector& arrayTwo){
andrew@0 71
andrew@0 72 for (int i = 0;i < arrayOne.length;i++)
andrew@0 73 array[i] = arrayOne.array[i] * arrayTwo.array[i];
andrew@0 74 }
andrew@0 75
andrew@0 76
andrew@0 77 void DynamicVector::printArray(){
andrew@0 78 for (int i = 0;i < arraySize;i++){
andrew@0 79 printf("[%i] = %f\n", i, array[i]);
andrew@0 80 }
andrew@0 81 }
andrew@0 82
andrew@0 83 void DynamicVector::translateDistribution(int translationIndex){
andrew@0 84 int tmpIndex;
andrew@0 85 DoubleVector tmpArray;
andrew@0 86 int i;
andrew@0 87
andrew@0 88 for (i=0;i < arraySize;i++){
andrew@0 89 tmpArray.push_back(array[i]);
andrew@0 90 }
andrew@0 91 //translate values
andrew@0 92 for (i=0;i < arraySize;i++){
andrew@0 93 tmpIndex = (i + translationIndex + arraySize)%arraySize;
andrew@0 94 array[tmpIndex] = tmpArray[i];
andrew@0 95 }
andrew@0 96 tmpArray.clear();
andrew@0 97 //now delete tmp array
andrew@0 98 }
andrew@0 99
andrew@0 100 void DynamicVector::addGaussianShape(double mean, double StdDev, double factor){
andrew@0 101 int i;
andrew@0 102 for (i=0;i<array.size();i++){
andrew@0 103 array[i] += factor*(1/(StdDev*sqrt(2*PI)))*exp(-1*(i-mean)*(i-mean)/(2*StdDev*StdDev));
andrew@0 104 }
andrew@0 105 //printf("ADDED GAUSSIAN SHAPE %i\n", (int)array.size());
andrew@0 106 }
andrew@0 107
andrew@0 108 void DynamicVector::addConstant(double value){
andrew@0 109 for (int i=0;i<array.size();i++){
andrew@0 110 array[i] += value;
andrew@0 111 }
andrew@0 112 }
andrew@0 113
andrew@0 114
andrew@0 115 void DynamicVector::addToIndex(int index, double constant){
andrew@0 116 array[index] += constant;
andrew@0 117 }
andrew@0 118
andrew@0 119
andrew@0 120 double DynamicVector::getIndexInRealTerms(const int& index){
andrew@0 121 if (index < arraySize)
andrew@0 122 return (offset + scalar*index);
andrew@0 123 else
andrew@0 124 return 0;
andrew@0 125 }
andrew@0 126
andrew@0 127 double DynamicVector::getRealTermsAsIndex(double value){
andrew@0 128 value -= offset;
andrew@0 129 value /= scalar;
andrew@0 130
andrew@0 131 return value;
andrew@0 132
andrew@0 133 }
andrew@0 134
andrew@1 135 double DynamicVector::getValueAtMillis(const double& millis){
andrew@1 136
andrew@1 137 int index = round(getRealTermsAsIndex(millis));
andrew@1 138 if (index >= 0 && index < length)
andrew@1 139 return array[index];
andrew@1 140 else
andrew@1 141 return 0;
andrew@1 142 }
andrew@1 143
andrew@0 144 void DynamicVector::drawVector(const int& minIndex, const int& maxIndex){
andrew@0 145
andrew@0 146
andrew@0 147 double stepSize = ofGetWidth() / (double)(maxIndex - minIndex);
andrew@0 148 double screenHeight = ofGetHeight();
andrew@0 149 double maxVal = getMaximum();
andrew@0 150
andrew@0 151 for (int i = max(1,minIndex+1);i < min(maxIndex, (int)array.size());i++){
andrew@0 152 ofLine (stepSize*(i-1), screenHeight * (1 - array[i-1] / maxVal), stepSize*i, screenHeight * (1 - array[i] / maxVal) );
andrew@0 153 }
andrew@0 154
andrew@0 155 }
andrew@0 156
andrew@0 157
andrew@0 158 void DynamicVector::drawConstrainedVector(const int& minIndex, const int& maxIndex, const int& minScreenIndex, const int& maxScreenIndex){
andrew@0 159 //constrain the height and width
andrew@0 160
andrew@0 161 double stepSize = (maxScreenIndex - minScreenIndex) / (double)(maxIndex - minIndex);//step size in pixels per array bin
andrew@0 162 double screenHeight = ofGetHeight();
andrew@0 163 double maxVal = getMaximum();
andrew@0 164
andrew@0 165 //OPTIMIZE!! XXX could just add stepsize each time
andrew@0 166 //not add minindex each time
andrew@0 167 int i = max(1,minIndex+1);
andrew@0 168 // ofDrawBitmapString("i = "+ofToString(i)+" :: screen min: "+ofToString(minScreenIndex + stepSize*(i-minIndex-1)), 20, 640);
andrew@0 169
andrew@0 170 while ((minScreenIndex + stepSize*(i-minIndex)) < 0)
andrew@0 171 i++;//only draw what is on the screen
andrew@0 172
andrew@0 173 for ( ; i < min(maxIndex+1, (int)array.size());i++){
andrew@0 174 ofLine (minScreenIndex + (stepSize*(i-minIndex-1)), screenHeight * (1 - array[i-1] / maxVal),
andrew@0 175 minScreenIndex + (stepSize*(i-minIndex)), screenHeight * (1 - array[i] / maxVal) );
andrew@0 176
andrew@0 177 }
andrew@0 178
andrew@0 179 ofLine(minScreenIndex, screenHeight, minScreenIndex, screenHeight/2);
andrew@0 180 ofLine(maxScreenIndex, screenHeight, maxScreenIndex, screenHeight/2);
andrew@0 181
andrew@0 182 // ofDrawBitmapString(ofToString(stepSize, 2)+" "+ofToString(maxScreenIndex - minScreenIndex, 0), 20, 600);
andrew@0 183
andrew@0 184 }