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