diff projects/d-box/spear_parser.h @ 0:8a575ba3ab52

Initial commit.
author andrewm
date Fri, 31 Oct 2014 19:10:17 +0100
parents
children
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/projects/d-box/spear_parser.h	Fri Oct 31 19:10:17 2014 +0100
@@ -0,0 +1,188 @@
+/*
+ * spear_parser.h v1.2
+ *
+ *  Created on: May 6, 2014
+ *      Author: Victor Zappi
+ */
+
+#ifndef SPEAR_PARSER_H_
+#define SPEAR_PARSER_H_
+
+#include <iostream>
+#include <fstream>
+#include <cstring>
+#include <string>
+#include <stdlib.h>		// atoi, atof
+#include <math.h>
+#include <algorithm>	// std::fill
+
+#include <sys/time.h>
+
+using namespace std;
+
+
+//------------------------------------------------------------------------------------------------
+// partials
+//------------------------------------------------------------------------------------------------
+
+class Spear_parser; // for class friendship
+
+class Partials
+{
+	friend class Spear_parser;
+	friend class Dbox_parser;
+
+public:
+	int **partialSamples;				// sample at which each frame is
+	float **partialFrequencies;			// frequencies at each frame
+	float **partialAmplitudes;			// amplitudes at each frame
+	unsigned int *partialNumFrames;		// Length of each partial in frames
+	unsigned int *partialStartFrame;	// frame at which each partial begins
+	float **partialFreqDelta;			// constant frequency slope for each partial in each frame interval
+	float **partialAmpDelta;			// constant amplitude slope for each partial in each frame interval
+	float *partialFreqMean;				// frequency mean for each partial, over all its frames
+
+	unsigned short *activePartialNum;	// num of each active partial at each frame
+	unsigned int **activePartials;		// indices of all active partials at each frame
+
+
+	int getPartialNum();
+	int getHopNum();
+	int getMaxActivePartialNum();
+
+private:
+	Partials();
+	~Partials();
+
+	unsigned int *partialStartSample;	// sample at which each partial begins
+	unsigned int *partialEndSample;		// sample at which each partial ends [sample gap between 2 consecutive frames can be an integer multiple of hopSize]
+	unsigned int parNum;
+	unsigned int currentSample;
+	unsigned int hopSize;
+	unsigned int hopNum;
+	unsigned int maxActiveParNum;
+
+	void init(int parNum, int hopSize, bool isDBX=false);
+	void update(int parIndex, int frameNum);
+	void setFreqDelta(int parIndex, int frameNum, double delta);
+	void setAmpDelta(int parIndex, int frameNum, double delta);
+	void setHopNum(int hopNum);
+};
+
+inline int Partials::getPartialNum()
+{
+	return parNum;
+}
+
+inline void Partials::setHopNum(int hopN)
+{
+	hopNum = hopN;
+
+	// prepare data structures
+	activePartialNum 	= new unsigned short[hopNum+1];	// +1 cos total num of frames = num of hops+1
+	activePartials	 	= new unsigned int *[hopNum+1];
+}
+
+// useful to increase current sample using a modulo on the total number of samples [easy to be deduced from the total num or hops]
+inline int Partials::getHopNum()
+{
+	return hopNum;
+}
+
+inline void Partials::setFreqDelta(int parIndex, int frameNum, double delta)
+{
+	partialFreqDelta[parIndex][frameNum] = delta;
+}
+
+inline void Partials::setAmpDelta(int parIndex, int frameNum, double delta)
+{
+	partialAmpDelta[parIndex][frameNum] = delta;
+}
+
+inline int Partials::getMaxActivePartialNum()
+{
+	return maxActiveParNum;
+}
+
+
+
+
+
+
+
+//------------------------------------------------------------------------------------------------
+// spear parser
+//------------------------------------------------------------------------------------------------
+
+class Spear_parser
+{
+public:
+	Spear_parser();
+	~Spear_parser();
+
+	Partials partials;
+
+	bool parseFile(string filename, int hopsize=-1, int samplerate = 44100);
+	bool parseFile(char *filename, int hopsize=-1, int samplerate = 44100);
+	int getHopSize();
+	int getFileSampleRate();
+	double getDeltaTime();
+
+private:
+
+	int hopSize;
+	int fileSampleRate;
+	double deltaTime;	// min time gap between consecutive frames
+
+	timeval start, stop;
+	unsigned long hopSizeT, parserT, staticT;
+
+	void calculateDeltaTime();
+	void calculateHopSize(char *filename);
+	bool parser(char *filename, int hopsize=-1, int samplerate=44100);
+	bool DBXparser(char *filename, int samplerate=44100);
+	bool TXTparser(char *filename, int hopsize=-1, int samplerate=44100);
+	int fromTimeToSamples(float time);
+	int interpolateSamples(int parIndex, int *frameIndex, int missCnt, int nextSample,
+							double nextFreq, double nextAmp, double *prevFreq, double *prevAmp);
+	void staticCalculations();
+
+};
+
+inline bool Spear_parser::parseFile(string filename, int hopsize, int samplerate)
+{
+	return parser((char *)filename.c_str(), hopsize, samplerate);
+}
+
+inline bool Spear_parser::parseFile(char *filename, int hopsize, int samplerate)
+{
+	return parser(filename, hopsize, samplerate);
+}
+
+inline void Spear_parser::calculateDeltaTime()
+{
+	deltaTime = (double)hopSize/ (double)fileSampleRate;
+}
+
+// each time value in the file is rounded, and 2 consecutive frames can differ of a time gap = i*deltaTime, where i is a positive integer
+inline int Spear_parser::fromTimeToSamples(float time)
+{
+	return round(time/deltaTime)*hopSize;	// round is necessary since in the file log time values are rounded, so they do not apparently look like integer multiples of deltaTime
+}
+
+inline int Spear_parser::getHopSize()
+{
+	return hopSize;
+}
+
+inline int Spear_parser::getFileSampleRate()
+{
+	return fileSampleRate;
+}
+
+inline double Spear_parser::getDeltaTime()
+{
+	return deltaTime;
+}
+
+#endif /* SPEAR_PARSER_H_ */