Mercurial > hg > asa
diff AccessibleSpectrumAnalyser.h @ 0:3004dd663202
first import
author | Fiore Martin <f.martin@qmul.ac.uk> |
---|---|
date | Fri, 26 Feb 2016 14:49:35 +0000 |
parents | |
children |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/AccessibleSpectrumAnalyser.h Fri Feb 26 14:49:35 2016 +0000 @@ -0,0 +1,130 @@ +#ifndef __ACCESSIBLESPECTRUMANALYSER__ +#define __ACCESSIBLESPECTRUMANALYSER__ + +#include "IPlug_include_in_plug_hdr.h" + +#include <cmath> + +#include "fft.h" +#include "FreqView.h" + +#include "stk/include/SineWave.h" +#include "stk/include/Envelope.h" +#include "stk/include/ADSR.h" + + + +class AccessibleSpectrumAnalyser : public IPlug +{ +public: + + AccessibleSpectrumAnalyser(IPlugInstanceInfo instanceInfo); + ~AccessibleSpectrumAnalyser(); + + void Reset(); + void OnParamChange(int paramIdx); + + void ProcessDoubleReplacing(double** inputs, double** outputs, int nFrames); + + inline WDL_FFT_REAL magnitude(const WDL_FFT_COMPLEX & c) const + { + return 2 * sqrt(WDL_FFT_REAL(c.re * c.re + c.im * c.im)) / mNormFactor;// kFFTbufSize if rect window ; + //return 2 * sqrt(WDL_FFT_REAL(c.re * c.re + c.im * c.im)) / kFFTbufSize ; //if rect window ; + } + + /* for dry/wet mix */ + inline double mix(double dry, double wet) const + { + return dry * mDry + wet * mWet; + } + + inline static double midi2Freq(int note) + { + return 440. * pow(2., (note - 69.) / 12.); + } + + inline double calculateSelectionEndFromView() + { + return BOUNDED(mFreqView->getSelectionStart() + mFreqView->getSelectionSize(), + mFreqView->getSelectionStart()+kMinSelectionSize, + GetSampleRate()/2); + } + + inline bool binWithinSelection(int i) const + { + double binHz = i * mBinSizeHz; + + return ( binHz > mFreqView->getSelectionStart() && binHz <mSelectionEnd); + } + + void addClippingSonification(double** inputs, double** outputs, int nFrames); + +private: + + static const int kFFTbufSize = 2048; + static const double k2pi; + static const IColor kBgColor; + static const double kClippingCeilingSnap; + static const double kMinSelectionSize; + + + WDL_FFT_COMPLEX mFFTbuffer[kFFTbufSize]; + WDL_FFT_COMPLEX sortedbuffer[kFFTbufSize]; + WDL_FFT_COMPLEX unsortedbuffer[kFFTbufSize]; + int mFFTBufferIndx; + + FreqView* mFreqView; + + std::vector<float> mHannTable; + double mNormFactor; + + double mBinSizeHz; + + double mDry; + double mWet; + double mSelectionEnd; + double mThreshold; + + + struct Sonification + { + /* the sine wave that is played */ + stk::SineWave ugen; + + /* envelope of the sine wave */ + stk::ADSR envelope; + + struct Panning + { + double left; + double right; + + const double coeff; + + Panning(): coeff(std::sqrt(2)/2) {} + + /* position ranges from 0 to 1 */ + void calculatePanningCoeff(double position) + { + /* map [0,1] to [-pi/4, pi/4] radians */ + double theta = ((position*2)-1) * (PI/4); + + /* calculate left and right amplitudes */ + left = coeff * (std::cos(theta) - std::sin(theta)); + right = coeff * (std::cos(theta) + std::sin(theta)); + + } + + } panning; + + /* resets all the ugens. When srate is less than 0, type and ugen freq are + not affected by resetas well as sample rate. + */ + void reset(double srate = -1.0); + + + } mSonification; + +}; + +#endif