diff options
Diffstat (limited to 'openFrameworks/ofxMaxim/libs/maximilian.h')
| -rwxr-xr-x | openFrameworks/ofxMaxim/libs/maximilian.h | 571 |
1 files changed, 367 insertions, 204 deletions
diff --git a/openFrameworks/ofxMaxim/libs/maximilian.h b/openFrameworks/ofxMaxim/libs/maximilian.h index 8a78c26..c9266df 100755 --- a/openFrameworks/ofxMaxim/libs/maximilian.h +++ b/openFrameworks/ofxMaxim/libs/maximilian.h @@ -6,7 +6,7 @@ * Copyright 2009 Mick Grierson & Strangeloop Limited. All rights reserved. * Thanks to the Goldsmiths Creative Computing Team. * Special thanks to Arturo Castro for the PortAudio implementation. - * + * * Permission is hereby granted, free of charge, to any person * obtaining a copy of this software and associated documentation * files (the "Software"), to deal in the Software without @@ -15,11 +15,11 @@ * copies of the Software, and to permit persons to whom the * Software is furnished to do so, subject to the following * conditions: - * + * * The above copyright notice and this permission notice shall be * included in all copies or substantial portions of the Software. * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT @@ -42,7 +42,6 @@ #include <string.h> #include <cstdlib> #include "math.h" - #ifdef _WIN32 //|| _WIN64 #include <algorithm> #endif @@ -55,191 +54,191 @@ using namespace std; class maxiSettings { public: - static int sampleRate; - static int channels; - static int bufferSize; - static void setup(int initSampleRate, int initChannels, int initBufferSize) { - maxiSettings::sampleRate = initSampleRate; - maxiSettings::channels = initChannels; - maxiSettings::bufferSize = initBufferSize; - } + static int sampleRate; + static int channels; + static int bufferSize; + static void setup(int initSampleRate, int initChannels, int initBufferSize) { + maxiSettings::sampleRate = initSampleRate; + maxiSettings::channels = initChannels; + maxiSettings::bufferSize = initBufferSize; + } }; class maxiOsc { - - double frequency; - double phase; - double startphase; - double endphase; - double output; - double tri; - - + + double frequency; + double phase; + double startphase; + double endphase; + double output; + double tri; + + public: - maxiOsc(); - double sinewave(double frequency); - double coswave(double frequency); - double phasor(double frequency); - double phasor(double frequency, double startphase, double endphase); - double saw(double frequency); - double triangle(double frequency); - double square(double frequency); - double pulse(double frequency, double duty); - double noise(); - double sinebuf(double frequency); - double sinebuf4(double frequency); + maxiOsc(); + double sinewave(double frequency); + double coswave(double frequency); + double phasor(double frequency); + double phasor(double frequency, double startphase, double endphase); + double saw(double frequency); + double triangle(double frequency); + double square(double frequency); + double pulse(double frequency, double duty); + double noise(); + double sinebuf(double frequency); + double sinebuf4(double frequency); double sawn(double frequency); double rect(double frequency, double duty=0.5); - void phaseReset(double phaseIn); - + void phaseReset(double phaseIn); + }; class maxiEnvelope { - - double period; - double output; - double startval; - double currentval; - double nextval; - int isPlaying; - -public: - double line(int numberofsegments,double segments[100]); - void trigger(int index,double amp); - int valindex; - double amplitude; - + + double period; + double output; + double startval; + double currentval; + double nextval; + int isPlaying; + +public: + double line(int numberofsegments,double segments[100]); + void trigger(int index,double amp); + int valindex; + double amplitude; + }; class maxiDelayline { - double frequency; - int phase; - double startphase; - double endphase; - double output; - double memory[88200]; - + double frequency; + int phase; + double startphase; + double endphase; + double output; + double memory[88200]; + public: - maxiDelayline(); - double dl(double input, int size, double feedback); - double dl(double input, int size, double feedback, int position); - - + maxiDelayline(); + double dl(double input, int size, double feedback); + double dl(double input, int size, double feedback, int position); + + }; -class maxiFilter { - double gain; - double input; - double output; - double inputs[10]; - double outputs[10]; - double cutoff1; - double x;//speed - double y;//pos - double z;//pole - double c;//filter coefficient +class maxiFilter { + double gain; + double input; + double output; + double inputs[10]; + double outputs[10]; + double cutoff1; + double x;//speed + double y;//pos + double z;//pole + double c;//filter coefficient public: - maxiFilter():x(0.0), y(0.0), z(0.0), c(0.0){}; - double cutoff; - double resonance; - double lores(double input,double cutoff1, double resonance); - double hires(double input,double cutoff1, double resonance); - double bandpass(double input,double cutoff1, double resonance); - double lopass(double input,double cutoff); - double hipass(double input,double cutoff); - + maxiFilter():x(0.0), y(0.0), z(0.0), c(0.0){}; + double cutoff; + double resonance; + double lores(double input,double cutoff1, double resonance); + double hires(double input,double cutoff1, double resonance); + double bandpass(double input,double cutoff1, double resonance); + double lopass(double input,double cutoff); + double hipass(double input,double cutoff); + }; class maxiMix { - double input; - double two[2]; - double four[4]; - double eight[8]; + double input; + double two[2]; + double four[4]; + double eight[8]; public: - double x; - double y; - double z; - double *stereo(double input,double two[2],double x); - double *quad(double input,double four[4], double x,double y); - double *ambisonic(double input,double eight[8],double x,double y, double z); - + double x; + double y; + double z; + double *stereo(double input,double two[2],double x); + double *quad(double input,double four[4], double x,double y); + double *ambisonic(double input,double eight[8],double x,double y, double z); + }; //lagging with an exponential moving average //a lower alpha value gives a slower lag -template <class T> +template <class T> class maxiLagExp { public: - T alpha, alphaReciprocal; - T val; - - maxiLagExp() { - init(0.5, 0.0); - }; - - maxiLagExp(T initAlpha, T initVal) { - init(initAlpha, initVal); - } - - void init(T initAlpha, T initVal) { - alpha = initAlpha; - alphaReciprocal = 1.0 - alpha; - val = initVal; - } - - inline void addSample(T newVal) { - val = (alpha * newVal) + (alphaReciprocal * val); - } - - inline T value() { - return val; - } + T alpha, alphaReciprocal; + T val; + + maxiLagExp() { + init(0.5, 0.0); + }; + + maxiLagExp(T initAlpha, T initVal) { + init(initAlpha, initVal); + } + + void init(T initAlpha, T initVal) { + alpha = initAlpha; + alphaReciprocal = 1.0 - alpha; + val = initVal; + } + + inline void addSample(T newVal) { + val = (alpha * newVal) + (alphaReciprocal * val); + } + + inline T value() { + return val; + } }; class maxiSample { - + private: - string myPath; - int myChunkSize; - int mySubChunk1Size; - int readChannel; - short myFormat; - int myByteRate; - short myBlockAlign; - short myBitsPerSample; - double position, recordPosition; - double speed; - double output; + string myPath; + int myChunkSize; + int mySubChunk1Size; + int readChannel; + short myFormat; + int myByteRate; + short myBlockAlign; + double position, recordPosition; + double speed; + double output; maxiLagExp<double> loopRecordLag; - + public: - int myDataSize; - short myChannels; - int mySampleRate; - long length; - void getLength(); - void setLength(unsigned long numSamples); - - -// char* myData; + int myDataSize; + short myChannels; + int mySampleRate; + long length; + void getLength(); + void setLength(unsigned long numSamples); + short myBitsPerSample; + + + // char* myData; short* temp; - - // get/set for the Path property - - ~maxiSample() - { -// if (myData) free(myData); + + // get/set for the Path property + + ~maxiSample() + { + // if (myData) free(myData); if (temp) free(temp); printf("freeing SampleData"); - - } - + + } + maxiSample():temp(NULL),position(0), recordPosition(0), myChannels(1), mySampleRate(maxiSettings::sampleRate) {}; maxiSample& operator=(const maxiSample &source) { @@ -256,17 +255,17 @@ public: length = source.length; return *this; } - - bool load(string fileName, int channel=0); + + bool load(string fileName, int channel=0); bool loadOgg(string filename,int channel=0); - - void trigger(); - - // read a wav file into this class - bool read(); - - //read an ogg file into this class using stb_vorbis + + void trigger(); + + // read a wav file into this class + bool read(); + + //read an ogg file into this class using stb_vorbis bool readOgg(); void loopRecord(double newSample, const bool recordEnabled, const double recordMix, double start = 0.0, double end = 1.0) { @@ -318,8 +317,8 @@ public: return save(myPath); } - bool save(string filename) - { + bool save(string filename) + { fstream myFile (filename.c_str(), ios::out | ios::binary); // write the wav file per the wav file format @@ -340,16 +339,16 @@ public: myFile.write ((char*) temp, myDataSize); return true; - } - - // return a printable summary of the wav file - char *getSummary() - { - char *summary = new char[250]; - sprintf(summary, " Format: %d\n Channels: %d\n SampleRate: %d\n ByteRate: %d\n BlockAlign: %d\n BitsPerSample: %d\n DataSize: %d\n", myFormat, myChannels, mySampleRate, myByteRate, myBlockAlign, myBitsPerSample, myDataSize); - std::cout << myDataSize; - return summary; - } + } + + // return a printable summary of the wav file + char *getSummary() + { + char *summary = new char[250]; + sprintf(summary, " Format: %d\n Channels: %d\n SampleRate: %d\n ByteRate: %d\n BlockAlign: %d\n BitsPerSample: %d\n DataSize: %d\n", myFormat, myChannels, mySampleRate, myByteRate, myBlockAlign, myBitsPerSample, myDataSize); + std::cout << myDataSize; + return summary; + } void normalise(float maxLevel = 0.99); //0 < maxLevel < 1.0 void autoTrim(float alpha = 0.3, float threshold = 6000, bool trimStart = true, bool trimEnd = true); //alpha of lag filter (lower == slower reaction), threshold to mark start and end, < 32767 @@ -385,63 +384,63 @@ public: } return v; } - + }; class maxiDyn { - - + + public: -// double gate(double input, double threshold=0.9, long holdtime=1, double attack=1, double release=0.9995); -// double compressor(double input, double ratio, double threshold=0.9, double attack=1, double release=0.9995); + // double gate(double input, double threshold=0.9, long holdtime=1, double attack=1, double release=0.9995); + // double compressor(double input, double ratio, double threshold=0.9, double attack=1, double release=0.9995); double gate(double input, double threshold=0.9, long holdtime=1, double attack=1, double release=0.9995); double compressor(double input, double ratio, double threshold=0.9, double attack=1, double release=0.9995); double compress(double input); double input; - double ratio; - double currentRatio; - double threshold; - double output; - double attack; - double release; - double amplitude; + double ratio; + double currentRatio; + double threshold; + double output; + double attack; + double release; + double amplitude; void setAttack(double attackMS); void setRelease(double releaseMS); void setThreshold(double thresholdI); void setRatio(double ratioF); - long holdtime; - long holdcount; - int attackphase,holdphase,releasephase; + long holdtime; + long holdcount; + int attackphase,holdphase,releasephase; }; class maxiEnv { - - + + public: - double ar(double input, double attack=1, double release=0.9, long holdtime=1, int trigger=0); - double adsr(double input, double attack=1, double decay=0.99, double sustain=0.125, double release=0.9, long holdtime=1, int trigger=0); + double ar(double input, double attack=1, double release=0.9, long holdtime=1, int trigger=0); + double adsr(double input, double attack=1, double decay=0.99, double sustain=0.125, double release=0.9, long holdtime=1, int trigger=0); double adsr(double input,int trigger); - double input; - double output; - double attack; - double decay; - double sustain; - double release; - double amplitude; + double input; + double output; + double attack; + double decay; + double sustain; + double release; + double amplitude; void setAttack(double attackMS); void setRelease(double releaseMS); void setDecay(double decayMS); void setSustain(double sustainL); - int trigger; - long holdtime=1; - long holdcount; - int attackphase,decayphase,sustainphase,holdphase,releasephase; + int trigger; + long holdtime=1; + long holdcount; + int attackphase,decayphase,sustainphase,holdphase,releasephase; }; class convert { public: - double mtof(int midinote); + double mtof(int midinote); }; @@ -482,7 +481,7 @@ public: double flange(const double input, const unsigned int delay, const double feedback, const double speed, const double depth); maxiDelayline dl; maxiOsc lfo; - + }; inline double maxiFlanger::flange(const double input, const unsigned int delay, const double feedback, const double speed, const double depth) @@ -490,7 +489,7 @@ inline double maxiFlanger::flange(const double input, const unsigned int delay, //todo: needs fixing double output; double lfoVal = lfo.triangle(speed); - output = dl.dl(input, delay + (lfoVal * depth * delay) + 1, feedback) ; + output = dl.dl(input, delay + (lfoVal * depth * delay) + 1, feedback) ; double normalise = (1 - fabs(output)); output *= normalise; return (output + input) / 2.0; @@ -515,8 +514,8 @@ inline double maxiChorus::chorus(const double input, const unsigned int delay, c double output1, output2; double lfoVal = lfo.noise(); lfoVal = lopass.lores(lfoVal, speed, 1.0) * 2.0; - output1 = dl.dl(input, delay + (lfoVal * depth * delay) + 1, feedback) ; - output2 = dl2.dl(input, (delay + (lfoVal * depth * delay * 1.02) + 1) * 0.98, feedback * 0.99) ; + output1 = dl.dl(input, delay + (lfoVal * depth * delay) + 1, feedback) ; + output2 = dl2.dl(input, (delay + (lfoVal * depth * delay * 1.02) + 1) * 0.98, feedback * 0.99) ; output1 *= (1.0 - fabs(output1)); output2 *= (1.0 - fabs(output2)); return (output1 + output2 + input) / 3.0; @@ -633,5 +632,169 @@ private: }; +class maxiKick { + +public: + maxiKick(); + double play(); + void setPitch(double pitch); + void setRelease(double releaseD); + void trigger(); + double pitch; + double output = 0 ; + double outputD =0 ; + double envOut; + bool useDistortion = false; + bool useLimiter = false; + bool useFilter = false; + double distortion = 0; + bool inverse = false; + double cutoff; + double resonance; + double gain = 1; + maxiOsc kick; + maxiEnv envelope; + maxiDistortion distort; + maxiFilter filter; +}; + +class maxiSnare { +public: + maxiSnare(); + double play(); + void setPitch(double pitch); + void setRelease(double releaseD); + void trigger(); + double pitch; + double output = 0 ; + double outputD = 0 ; + double envOut; + bool useDistortion = false; + bool useLimiter = false; + bool useFilter = true; + double distortion = 0; + bool inverse = false; + double cutoff; + double resonance; + double gain = 1; + maxiOsc tone; + maxiOsc noise; + maxiEnv envelope; + maxiDistortion distort; + maxiFilter filter; + + + +}; + +class maxiHats { + +public: + maxiHats(); + double play(); + void setPitch(double pitch); + void setRelease(double releaseD); + void trigger(); + double pitch; + double output = 0; + double outputD = 0; + double envOut; + bool useDistortion = false; + bool useLimiter = false; + bool useFilter = false; + double distortion = 0; + bool inverse = false; + double cutoff; + double resonance; + double gain = 1; + maxiOsc tone; + maxiOsc noise; + maxiEnv envelope; + maxiDistortion distort; + maxiSVF filter; + + +}; + + +class maxiSynth { + + + +}; + + +class granularSynth { + + + +}; + + +class maxiSampler { + +public: + maxiSampler(); + double play(); + void setPitch(double pitch, bool setall=false); + void midiNoteOn(double pitch, double velocity, bool setall=false); + void midiNoteOff(double pitch, double velocity, bool setall=false); + void setAttack(double attackD,bool setall=true); + void setDecay(double decayD,bool setall=true); + void setSustain(double sustainD,bool setall=true); + void setRelease(double releaseD,bool setall=true); + void setPosition(double positionD,bool setall=true); + void load(string inFile,bool setall=true); + void setNumVoices(int numVoices); + double position; + void trigger(); + double pitch[32]; + int originalPitch=67; + double outputs[32]; + double outputD = 0; + double envOut[32]; + double envOutGain[32]; + double output; + bool useDistortion = false; + bool useLimiter = false; + bool useFilter = false; + double distortion = 0; + bool inverse = false; + double cutoff; + double resonance; + double gain = 1; + int voices; + int currentVoice=0; + convert mtof; + maxiOsc LFO1; + maxiOsc LFO2; + maxiOsc LFO3; + maxiOsc LFO4; + maxiSample samples[32]; + maxiEnv envelopes[32]; + maxiDistortion distort; + maxiSVF filters[32]; + bool sustain = true; + + +}; + +class maxiClock { +public: + maxiClock(); + void ticker(); + void setTempo(double bpm); + void setTicksPerBeat(int ticksPerBeat); + maxiOsc timer; + int currentCount; + int lastCount; + int playHead; + double bps; + double bpm; + int ticks; + bool tick; + +}; + #endif |
