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