Mercurial > hg > aimc
view 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 |
line wrap: on
line source
/*! * \file * \brief Frequency scale for generating filter banks and their frequencies * * \author Willem van Engen <cnbh@willem.engen.nl> * \date created 2006/09/28 * \version \$Id: Scale.cpp 459 2007-11-08 11:50:04Z tom $ */ /* (c) 2006, University of Cambridge, Medical Research Council * http://www.pdn.cam.ac.uk/groups/cnbh/aimmanual */ #include "Support/common.h" #include "Support/util.h" #include "Modules/Scale/Scale.h" #include "Modules/Scale/ScaleLinear.h" #include "Modules/Scale/ScaleERB.h" #include "Modules/Scale/ScaleLog.h" #include "Modules/Scale/ScaleLogScaled.h" Scale *Scale::Create(ScaleType iType, unsigned int min, unsigned int max, float density) { switch(iType) { case SCALE_LINEAR: return static_cast<Scale*>(new ScaleLinear(min, max, density)); case SCALE_ERB: return static_cast<Scale*>(new ScaleERB(min, max, density)); case SCALE_LOG: return static_cast<Scale*>(new ScaleLog(min, max, density)); case SCALE_LOGSCALED: return static_cast<Scale*>(new ScaleLogScaled(min, max, density)); default: aimASSERT(0); break; } // Unreachable code aimASSERT(0); return NULL; } Scale *Scale::Create(ScaleType iType) { return Create(iType, 0, 0, 0); } Scale *Scale::Clone() { Scale *pScale = Create(m_iType, m_iMin, m_iMax, m_fDensity); aimASSERT(pScale); pScale->m_fScaledCurHalfSum = m_fScaledCurHalfSum; pScale->m_fScaledCurDiff = m_fScaledCurDiff; return pScale; } float Scale::FromLinearScaled(float fVal) { /*! This function returns * ( FromLinear(fVal) - (fMinScaled+fMaxScaled)/2 ) / (fMaxScaled-fMinScaled) */ float fValScaled = FromLinear(fVal); return (fValScaled - m_fScaledCurHalfSum) / m_fScaledCurDiff; } void Scale::FromLinearScaledExtrema(float fMin, float fMax) { float fMinScaled = FromLinear(fMin); float fMaxScaled = FromLinear(fMax); m_fScaledCurHalfSum = (fMinScaled+fMaxScaled)/2; m_fScaledCurDiff = fMaxScaled-fMinScaled; m_fMin = fMin; m_fMax = fMax; } void Scale::FromLinearScaledExtrema(Scale *pScale) { aimASSERT(pScale); FromLinearScaledExtrema(pScale->m_fMin, pScale->m_fMax); } SignalBank* Scale::CreateSignalBank(unsigned int iChannels, unsigned int iBufferlength, unsigned int iSamplerate) { SignalBank *pBank; double intpart, fracpart; fracpart = modf((m_iMax-m_iMin)*m_fDensity, &intpart); unsigned int nBankChan = (unsigned int) intpart; if (fracpart >= 0.5f) nBankChan++; pBank = new SignalBank(iChannels, iBufferlength, iSamplerate, nBankChan); aimASSERT(pBank); float scaleDelta = ( FromLinear(m_iMax) - FromLinear(m_iMin) ) / (nBankChan-1); float scaleCur = FromLinear(m_iMin); for (unsigned int i=0; i<nBankChan; i++) { pBank->setCentreFrequency(i, ToLinear(scaleCur)); scaleCur+=scaleDelta; } return pBank; } SignalBank* Scale::CreateSignalBank(Signal* pSig) { aimASSERT(pSig); return CreateSignalBank(pSig->getAudioChannels(), pSig->getBufferlength(), pSig->getSamplerate()); }