annotate src/Modules/Output/Graphics/Scale/Scale.cc @ 227:73c6d61440ad

- First add of a lot of graphics code from the old version. Not working yet, not even compiling yet.
author tomwalters
date Fri, 15 Oct 2010 05:40:53 +0000
parents 9d880fb93c39
children 82e0dc3dfd16
rev   line source
tomwalters@116 1 /*!
tomwalters@116 2 * \file
tomwalters@116 3 * \brief Frequency scale for generating filter banks and their frequencies
tomwalters@116 4 *
tomwalters@116 5 * \author Willem van Engen <cnbh@willem.engen.nl>
tomwalters@116 6 * \date created 2006/09/28
tomwalters@116 7 * \version \$Id: Scale.cpp 459 2007-11-08 11:50:04Z tom $
tomwalters@116 8 */
tomwalters@116 9 /* (c) 2006, University of Cambridge, Medical Research Council
tomwalters@116 10 * http://www.pdn.cam.ac.uk/groups/cnbh/aimmanual
tomwalters@116 11 */
tomwalters@227 12 #include "Support/common.h"
tomwalters@227 13 #include "Support/util.h"
tomwalters@227 14 #include "Modules/Scale/Scale.h"
tomwalters@227 15 #include "Modules/Scale/ScaleLinear.h"
tomwalters@227 16 #include "Modules/Scale/ScaleERB.h"
tomwalters@227 17 #include "Modules/Scale/ScaleLog.h"
tomwalters@227 18 #include "Modules/Scale/ScaleLogScaled.h"
tomwalters@116 19
tomwalters@227 20 Scale *Scale::Create(ScaleType iType, unsigned int min, unsigned int max, float density)
tomwalters@227 21 {
tomwalters@227 22 switch(iType) {
tomwalters@227 23 case SCALE_LINEAR:
tomwalters@227 24 return static_cast<Scale*>(new ScaleLinear(min, max, density));
tomwalters@227 25 case SCALE_ERB:
tomwalters@227 26 return static_cast<Scale*>(new ScaleERB(min, max, density));
tomwalters@227 27 case SCALE_LOG:
tomwalters@227 28 return static_cast<Scale*>(new ScaleLog(min, max, density));
tomwalters@227 29 case SCALE_LOGSCALED:
tomwalters@227 30 return static_cast<Scale*>(new ScaleLogScaled(min, max, density));
tomwalters@227 31 default:
tomwalters@227 32 aimASSERT(0);
tomwalters@227 33 break;
tomwalters@227 34 }
tomwalters@227 35 // Unreachable code
tomwalters@227 36 aimASSERT(0);
tomwalters@227 37 return NULL;
tomwalters@116 38 }
tomwalters@116 39
tomwalters@227 40 Scale *Scale::Create(ScaleType iType)
tomwalters@227 41 {
tomwalters@227 42 return Create(iType, 0, 0, 0);
tomwalters@116 43 }
tomwalters@116 44
tomwalters@227 45 Scale *Scale::Clone()
tomwalters@227 46 {
tomwalters@227 47 Scale *pScale = Create(m_iType, m_iMin, m_iMax, m_fDensity);
tomwalters@227 48 aimASSERT(pScale);
tomwalters@227 49 pScale->m_fScaledCurHalfSum = m_fScaledCurHalfSum;
tomwalters@227 50 pScale->m_fScaledCurDiff = m_fScaledCurDiff;
tomwalters@227 51 return pScale;
tomwalters@116 52 }
tomwalters@116 53
tomwalters@227 54 float Scale::FromLinearScaled(float fVal)
tomwalters@227 55 {
tomwalters@227 56 /*! This function returns
tomwalters@227 57 * ( FromLinear(fVal) - (fMinScaled+fMaxScaled)/2 ) / (fMaxScaled-fMinScaled)
tomwalters@227 58 */
tomwalters@227 59 float fValScaled = FromLinear(fVal);
tomwalters@227 60 return (fValScaled - m_fScaledCurHalfSum) / m_fScaledCurDiff;
tomwalters@227 61 }
tomwalters@227 62 void Scale::FromLinearScaledExtrema(float fMin, float fMax)
tomwalters@227 63 {
tomwalters@227 64 float fMinScaled = FromLinear(fMin);
tomwalters@227 65 float fMaxScaled = FromLinear(fMax);
tomwalters@227 66 m_fScaledCurHalfSum = (fMinScaled+fMaxScaled)/2;
tomwalters@227 67 m_fScaledCurDiff = fMaxScaled-fMinScaled;
tomwalters@227 68 m_fMin = fMin;
tomwalters@227 69 m_fMax = fMax;
tomwalters@227 70 }
tomwalters@227 71 void Scale::FromLinearScaledExtrema(Scale *pScale)
tomwalters@227 72 {
tomwalters@227 73 aimASSERT(pScale);
tomwalters@227 74 FromLinearScaledExtrema(pScale->m_fMin, pScale->m_fMax);
tomwalters@116 75 }
tom@118 76
tomwalters@227 77 SignalBank* Scale::CreateSignalBank(unsigned int iChannels, unsigned int iBufferlength, unsigned int iSamplerate)
tomwalters@227 78 {
tomwalters@227 79 SignalBank *pBank;
tomwalters@227 80 double intpart, fracpart;
tomwalters@227 81 fracpart = modf((m_iMax-m_iMin)*m_fDensity, &intpart);
tomwalters@227 82 unsigned int nBankChan = (unsigned int) intpart;
tomwalters@227 83 if (fracpart >= 0.5f)
tomwalters@227 84 nBankChan++;
tomwalters@227 85
tomwalters@227 86 pBank = new SignalBank(iChannels, iBufferlength, iSamplerate, nBankChan);
tomwalters@227 87 aimASSERT(pBank);
tomwalters@227 88
tomwalters@227 89 float scaleDelta = ( FromLinear(m_iMax) - FromLinear(m_iMin) ) / (nBankChan-1);
tomwalters@227 90 float scaleCur = FromLinear(m_iMin);
tomwalters@227 91
tomwalters@227 92 for (unsigned int i=0; i<nBankChan; i++) {
tomwalters@227 93 pBank->setCentreFrequency(i, ToLinear(scaleCur));
tomwalters@227 94 scaleCur+=scaleDelta;
tomwalters@227 95 }
tomwalters@227 96
tomwalters@227 97 return pBank;
tomwalters@116 98 }
tom@118 99
tomwalters@227 100
tomwalters@227 101
tomwalters@227 102 SignalBank* Scale::CreateSignalBank(Signal* pSig) {
tomwalters@227 103 aimASSERT(pSig);
tomwalters@227 104 return CreateSignalBank(pSig->getAudioChannels(), pSig->getBufferlength(), pSig->getSamplerate());
tomwalters@116 105 }
tomwalters@227 106