diff examples/d-box/OscillatorBank.h @ 300:dbeed520b014 prerelease

Renamed projects to examples
author Giulio Moro <giuliomoro@yahoo.it>
date Fri, 27 May 2016 13:58:20 +0100
parents projects/d-box/OscillatorBank.h@8a575ba3ab52
children
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/examples/d-box/OscillatorBank.h	Fri May 27 13:58:20 2016 +0100
@@ -0,0 +1,240 @@
+/*
+ * OscillatorBank.h
+ *
+ *  Created on: May 23, 2014
+ *      Author: Victor Zappi and Andrew McPherson
+ */
+
+#ifndef OSCILLATORBANK_H_
+#define OSCILLATORBANK_H_
+
+
+#include <string>
+
+#include "spear_parser.h"
+#include "ADSR.h"
+#include "config.h"
+
+using namespace std;
+
+enum OscBankstates {bank_stopped, bank_playing, bank_toreset};
+
+class OscillatorBank
+{
+public:
+	OscillatorBank();
+	OscillatorBank(string filename, int hopsize=-1, int samplerate=44100);
+	OscillatorBank(char *filename, int hopsize=-1, int samplerate=44100);
+	~OscillatorBank();
+	float *oscillatorPhases;
+	float *oscillatorNormFrequencies;
+	float *oscillatorNormFreqDerivatives;
+	float *oscillatorAmplitudes;
+	float *oscillatorAmplitudeDerivatives;
+	float *oscStatNormFrequenciesMean;
+	float *oscStatNumHops;
+	OscBankstates state;
+	bool note;
+	int actPartNum;
+	unsigned int *actPart;
+	int hopCounter;
+	int lookupTableSize;
+	float *lookupTable;
+	float ampTh;
+	int hopNumTh;
+	float pitchMultiplier;
+	float freqMovement;
+	int filterNum;
+	float filterFreqs[5];
+	float filterQ[5];
+	float filterMaxF;
+	float filterAmpMinF;
+	float filterAmpMaxF;
+	float filterAmpMul;
+
+	bool loadFile(string filename, int hopsize=-1, int samplerate=44100);
+	bool loadFile(char *filename, int hopsize=-1, int samplerate=44100);
+	bool initBank(int oversamp=1);
+	void resetOscillators();
+	int getHopSize() { return hopSize; }
+	void nextHop();
+	void setLoopHops(int start, int end);
+	void play(float vel);
+	void stop();
+	void afterTouch(float vel);
+	int getEnvelopeState();
+	float getFrequencyScaler();
+	void setSpeed(float sp);
+	float getSpeed();
+	float getMaxSpeed();
+	float getMinSpeed();
+	void setJumpHop(int hop);
+	int getLastHop();
+	int getCurrentHop() { return currentHop; }
+
+private:
+
+	bool loaded;
+	int numOfPartials;
+	int numOfOscillators;
+	int partialsHopSize;
+	int overSampling;
+	int hopSize;
+	int hopSizeReminder;
+	int oscBankHopSize;
+	float frequencyScaler;
+	float nyqNorm;
+	int lastHop;
+	int currentHop;
+	int	loopDir;
+	int loopDirShift;
+	int loopStartHop;
+	int loopEndHop;
+	int *indicesMapping;
+	float *phaseCopies;
+	float *oscillatorNextNormFreq;
+	float *oscillatorNextAmp;
+	float *nextNormFreqCopies;
+	float *nextAmpCopies;
+	float *freqFixedDeltas;
+	float *ampFixedDeltas;
+	bool *nyquistCut;
+	Spear_parser parser;
+	Partials *partials;
+	ADSR adsr;
+	float minAttackTime;
+	float deltaAttackTime;
+	float minReleaseTime;
+	float deltaReleaseTime;
+	int envState;
+	int rate;
+	float speed;
+	float nextSpeed;
+	float maxSpeed;
+	float minSpeed;
+	int jumpHop;
+	float adsrVal;
+	float prevAdsrVal;
+	float prevAmpTh;
+	int prevHopNumTh;
+	float prevPitchMultiplier;
+	float prevFreqMovement;
+	int prevFilterNum;
+	float prevFilterFreqs[5];
+	float prevFilterQ[5];
+
+	bool loader(char *filename, int hopsize=-1, int samplerate=44100);
+	void addFakeOsc();
+	void nextOscBankHop();
+	void nextPartialHop();
+	int jumpToHop();
+	void setDirection(int dir);
+	int nextEnvState();
+	void checkDirection();
+	void checkSpeed();
+	int checkJump();
+	bool checkOversampling();
+	void updatePrevControls();
+	float calculateParDamping(int parIndex, int hopNTh, float adsrVl, float nextFreq,
+							  int filNum, float *filFreq, float *filQ);
+};
+
+inline bool OscillatorBank::loadFile(string filename, int hopsize, int samplerate)
+{
+	return loader((char *)filename.c_str(), hopsize, samplerate);
+}
+
+inline bool OscillatorBank::loadFile(char *filename, int hopsize, int samplerate)
+{
+	return loader(filename, hopsize, samplerate);
+}
+
+inline void OscillatorBank::setLoopHops(int start, int end)
+{
+	if(start > end)
+		end = start;
+
+	if(start<0)
+		start = 0;
+	else if(start>lastHop)
+		start = 0;
+	if(end < 1)
+		end = 1;
+	end = (end<=lastHop) ? end : lastHop;
+
+	// set it, take into consideration hop oversampling
+	loopStartHop = start*overSampling;
+	loopEndHop	 = end*overSampling;
+}
+
+inline void OscillatorBank::stop()
+{
+	note = false;
+	adsr.gate(0);
+}
+
+inline float OscillatorBank::getFrequencyScaler()
+{
+	return frequencyScaler;
+}
+
+inline void OscillatorBank::afterTouch(float vel)
+{
+	hopNumTh = log((1-vel)+1)/log(2)*20000;
+	if(adsr.getState()==env_attack)
+		adsr.setAttackRate( (minAttackTime + ( (1-vel)*deltaAttackTime )) * rate );
+	adsr.setReleaseRate( (minReleaseTime+(1-vel)*deltaReleaseTime)* rate );
+}
+
+inline int OscillatorBank::getEnvelopeState()
+{
+	return envState;
+}
+
+inline void OscillatorBank::setSpeed(float sp)
+{
+	nextSpeed = sp;
+}
+
+inline float OscillatorBank::getSpeed()
+{
+	return speed;
+}
+
+inline float OscillatorBank::getMaxSpeed()
+{
+	return maxSpeed;
+}
+
+inline float OscillatorBank::getMinSpeed()
+{
+	return minSpeed;
+}
+
+inline void OscillatorBank::setJumpHop(int hop)
+{
+	if(hop<0)
+		return;
+	hop = (hop<=lastHop) ? hop : lastHop;
+	jumpHop = hop;
+}
+
+inline void OscillatorBank::setDirection(int dir)
+{
+	if(dir>=0)
+	{
+		loopDir			= 1;
+		loopDirShift	= 0;
+	}
+	else
+	{
+		loopDir			= -1;
+		loopDirShift	= 1;
+	}
+}
+
+inline int OscillatorBank::getLastHop()
+{
+	return lastHop;
+}
+#endif /* OSCILLATORBANK_H_ */