andrew@0: #ifndef _TEST_APP andrew@0: #define _TEST_APP andrew@0: andrew@0: andrew@0: #include "ofMain.h" andrew@0: #include "chromaGram.h" andrew@0: #include "ChordDetect.h" andrew@0: #include "sndfile.h" andrew@0: #include "ofxFileDialogOSX.h" andrew@0: #include "timeWarp.h" andrew@2: #include "OnsetDetectionFunction.h" andrew@0: andrew@0: //#include andrew@0: //#include andrew@0: andrew@0: andrew@0: #define FRAMESIZE 512 andrew@0: #define ENERGY_LENGTH 80000 andrew@0: #define CHROMA_LENGTH 12000 andrew@0: #define CHROMA_CONVERSION_FACTOR 16 //16 times as many frames in energy as in chroma andrew@1: #define CHROMAGRAM_FRAMESIZE 2048 andrew@15: #define FILE_LIMIT 6000 andrew@1: andrew@0: //length in terms of frames (at 512 samples per frame - there are 90 per second) => 900: 10 seconds andrew@0: andrew@0: class testApp : public ofBaseApp{ andrew@0: andrew@0: public: andrew@0: andrew@0: andrew@0: void setup(); andrew@0: void update(); andrew@0: void draw(); andrew@0: andrew@0: void keyPressed (int key); andrew@0: void keyReleased(int key); andrew@0: void mouseMoved(int x, int y ); andrew@0: void mouseDragged(int x, int y, int button); andrew@0: void mousePressed(int x, int y, int button); andrew@0: void mouseReleased(int x, int y, int button); andrew@0: void windowResized(int w, int h); andrew@0: andrew@0: void audioRequested (float * input, int bufferSize, int nChannels); andrew@0: void loadSndfile(); andrew@4: //double getEnergyOfFrame(); andrew@0: andrew@5: void drawAlignmentmeasureValues(const int& startingYframe); andrew@0: void drawChromoGram(); andrew@0: andrew@0: void loadFirstAudioFile(); andrew@0: void initialiseVariables(); andrew@8: andrew@8: void clearVectors(); andrew@8: andrew@4: void calculateSimilarityAndAlignment(); andrew@4: andrew@4: typedef std::vector DoubleVector; andrew@0: typedef std::vector DoubleMatrix; andrew@0: andrew@5: typedef std::vector IntVector; andrew@5: typedef std::vector IntMatrix; andrew@8: andrew@0: DoubleMatrix* matrixPtr; andrew@0: andrew@0: void drawDoubleMatrix(DoubleMatrix* dMatrix);//DoubleMatrix* dMatrix); WOULD BE NICE TO USE POINTER BUT NOT WORKING YET andrew@0: void drawSpectralDifference(DoubleMatrix* dMatrix); andrew@0: andrew@0: // DoubleVector firstEnergyVector; andrew@0: // DoubleVector secondEnergyVector; andrew@0: andrew@0: andrew@0: // DoubleMatrix similarityMatrix; andrew@0: void calculateSimilarityMatrix(); andrew@13: void calculateForwardsAlignment();//forwards causal alignment version andrew@0: andrew@0: bool drawSimilarity; andrew@0: void drawSimilarityMatrix(); andrew@0: void printSimilarityMatrix(int sizeToPrint); andrew@13: void setConversionRatio(); andrew@13: void printVariousMatrixInfo(); andrew@14: void doPathBugCheck(); andrew@5: andrew@5: void drawChromaSimilarityMatrix(); andrew@5: andrew@0: // DoubleMatrix alignmentMeasureMatrix; andrew@0: andrew@0: // DoubleVector minimumAlignmentPath; andrew@0: andrew@5: void drawAlignmentPath(int startingChromaXFrame, int startingChromaYFrame, IntMatrix* backPath); andrew@4: void drawForwardsAlignmentPath(int startingChromaXFrame, int startingChromaYFrame); andrew@0: int findStartWidthFrame(); andrew@0: andrew@0: void printScoreForRow(int row, int max); andrew@0: andrew@0: int numberOfScrollWidthsForFirstFile; andrew@0: int numberOfScrollWidthsForSecondFile; andrew@0: andrew@0: void checkIfAudioPositionExceedsWidthForFirstFile(); andrew@5: andrew@0: andrew@0: // IntMatrix backwardsAlignmentPath; andrew@0: int backwardsAlignmentIndex;//used for drawing the path andrew@0: andrew@0: void updateAlignmentPathIndex(int idenifier); andrew@0: andrew@0: // bool checkWhetherOnAlignmentPath(int xcoord, int ycoord, int *indexOfAlignmentPathTested); andrew@0: andrew@0: bool findPreviousMinimumInBackwardsPath(); andrew@0: bool testForNewAlignmentMinimum(double *previousMinimum, int i, int j); andrew@0: andrew@0: void calculateAlignmentMatrix(); andrew@0: // void performNextAlignment(); andrew@0: double getDistance(int i, int j); andrew@8: void printAlignmentMatrix(const DoubleMatrix& alignmentMatrix); andrew@0: double getMinimum(int i, int j, float newValue); andrew@0: bool extendAlignmentUp(); andrew@0: bool extendAlignmentAlong(); andrew@0: void calculateMinimumAlignmentPath(); andrew@0: int findMinimumOfVector(DoubleVector *d); andrew@0: void swapBetweenPlayingFilesUsingAlignmentMatch(); andrew@0: int findMatchFromAlignment(bool whichFileToTest); andrew@0: andrew@0: void drawEnergyVectorFromPointer(DoubleVector* energyVec); andrew@5: void drawForwardsAlignmentPathOnChromaSimilarity(const int& startingXFrame, const int& startingYFrame); andrew@10: void drawAnchorPointsOnChromaSimilarity(const int& startingXFrame, const int& startingYFrame); andrew@0: andrew@1: void processAudioToDoubleMatrix(DoubleMatrix* myDoubleMatrix, DoubleVector* energyVector); andrew@0: andrew@0: void loadNewAudio(string soundFileName); andrew@6: void loadSecondAudio(string sndFileName); andrew@0: andrew@0: void loadSoundFiles(); andrew@0: void openFileDialogBox(); andrew@0: void loadLibSndFile(const char * filename); andrew@0: bool getFilenameFromDialogBox(string* fileNameToSave); andrew@0: void openNewAudioFileWithdialogBox(); andrew@0: andrew@0: //int* firstAudioLength, secondAudioLength; andrew@0: andrew@4: string firstFileName, secondFileName, soundFileName; andrew@0: andrew@0: float screenHeight, screenWidth; andrew@0: andrew@0: float pan; andrew@0: int sampleRate; andrew@0: bool bNoise; andrew@0: float volume; andrew@0: andrew@0: float * lAudio; andrew@0: float * rAudio; andrew@0: andrew@0: bool moveOn; andrew@0: bool drawSpectralDifferenceFunction; andrew@0: float frame[FRAMESIZE]; andrew@0: int frameIndex; andrew@0: float energy[ENERGY_LENGTH]; andrew@0: float secondEnergy[ENERGY_LENGTH]; andrew@0: andrew@0: float chromoGramVector[CHROMA_LENGTH][12]; andrew@0: int rootChord[CHROMA_LENGTH]; andrew@0: andrew@0: // int energyIndex; andrew@0: // int totalFrames; andrew@0: andrew@0: int scrollWidth;// 1600 andrew@0: float chromoLength; andrew@0: andrew@0: bool audioPlaying, audioPaused; andrew@0: bool drawSecondMatrix; andrew@0: andrew@0: float diagonalPenalty; andrew@0: andrew@0: //------------------- for the simple sine wave synthesis andrew@0: float targetFrequency; andrew@0: float phase; andrew@0: float phaseAdder; andrew@0: float phaseAdderTarget; andrew@0: andrew@0: string sndfileInfoString, textString; andrew@0: int xIndex; andrew@0: andrew@0: bool firstAudioFilePlaying; andrew@0: ofSoundPlayer loadedAudio; andrew@0: ofSoundPlayer secondAudio; andrew@0: ofSoundPlayer *playingAudio; andrew@0: andrew@0: float audioPosition; andrew@0: float width, height; andrew@0: int chromaIndex; andrew@4: // int totalNumberOfFrames; andrew@0: int currentPlayingFrame; andrew@0: int currentChromaFrame ; andrew@0: string chordString; andrew@0: andrew@0: //Chromagram* chromoGrammPtr; andrew@0: Chromagram chromoGramm; andrew@0: Chromagram secondChromoGramm; andrew@0: string userInfoString; andrew@0: ChordDetect chord; andrew@0: //sndfile part andrew@0: SNDFILE *infile; // define input and output sound files andrew@0: SF_INFO sfinfo ; // struct to hold info about sound file andrew@0: andrew@5: float chromaConversionRatio;//not needed but could be useful andrew@4: TimeWarp tw; andrew@1: Chromagram chromaG; andrew@2: OnsetDetectionFunction* onset; andrew@4: andrew@8: float conversionFactor; andrew@12: andrew@12: void dontDoJunkAlignment(); andrew@16: void calculateCausalAlignment(); andrew@16: bool doCausalAlignment; andrew@0: }; andrew@0: andrew@0: #endif