00001 #ifndef INCLUDE_SPECTRALSURFACE_H
00002 #define INCLUDE_SPECTRALSURFACE_H
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034
00035
00036
00037
00038
00039 #include "LorisExceptions.h"
00040 #include "Partial.h"
00041 #include "PartialList.h"
00042 #include "PartialUtils.h"
00043
00044 #include <algorithm>
00045 #include <vector>
00046
00047
00048 namespace Loris {
00049
00050
00051
00052
00056
00057 class SpectralSurface
00058 {
00059
00060 public:
00061
00062
00063
00074 #if ! defined(NO_TEMPLATE_MEMBERS)
00075 template<typename Iter>
00076 SpectralSurface( Iter b, Iter e );
00077 #else
00078 inline
00079 SpectralSurface( PartialList::iterator b, PartialList::iterator e );
00080 #endif
00081
00082
00083
00084
00085
00091 void scaleAmplitudes( Partial & p );
00092
00111 #if ! defined(NO_TEMPLATE_MEMBERS)
00112 template<typename Iter>
00113 void scaleAmplitudes( Iter b, Iter e );
00114 #else
00115 inline
00116 void scaleAmplitudes( PartialList::iterator b, PartialList::iterator e );
00117 #endif
00118
00124 void setAmplitudes( Partial & p );
00125
00146 #if ! defined(NO_TEMPLATE_MEMBERS)
00147 template<typename Iter>
00148 void setAmplitudes( Iter b, Iter e );
00149 #else
00150 inline
00151 void setAmplitudes( PartialList::iterator b, PartialList::iterator e );
00152 #endif
00153
00154
00155
00161 double frequencyStretch( void ) const;
00162
00168 double timeStretch( void ) const;
00169
00176 double effect( void ) const;
00177
00186 void setFrequencyStretch( double stretch );
00187
00196 void setTimeStretch( double stretch );
00197
00209 void setEffect( double effect );
00210
00211 private:
00212
00213
00214
00215 std::vector< Partial > mPartials;
00216
00217 double mStretchFreq;
00218 double mStretchTime;
00219 double mEffect;
00220
00221
00222
00223 double mMaxSurfaceAmp;
00224
00225
00226
00227
00228
00229
00230 void addPartialAux( const Partial & p );
00231
00232 };
00233
00234
00235
00236
00247
00248 #if ! defined(NO_TEMPLATE_MEMBERS)
00249 template<typename Iter>
00250 SpectralSurface::SpectralSurface( Iter b, Iter e ) :
00251 #else
00252 inline
00253 SpectralSurface::SpectralSurface( PartialList::iterator b,
00254 PartialList::iterator e ) :
00255 #endif
00256 mStretchFreq( 1.0 ),
00257 mStretchTime( 1.0 ),
00258 mEffect( 1.0 ),
00259 mMaxSurfaceAmp( 0.0 )
00260 {
00261
00262 while ( b != e )
00263 {
00264 if ( b->label() != 0 )
00265 {
00266 addPartialAux( *b );
00267 }
00268 ++b;
00269 }
00270
00271
00272 if ( mPartials.empty() )
00273 {
00274 Throw( InvalidArgument, "Partals need to be distilled to build a SpectralSurface" );
00275 }
00276
00277 if ( 0 == mMaxSurfaceAmp )
00278 {
00279 Throw( InvalidArgument, "The SpectralSurface is zero amplitude everywhere!" );
00280 }
00281
00282
00283 std::sort( mPartials.begin(), mPartials.end(), PartialUtils::compareLabelLess() );
00284 }
00285
00286
00287
00288
00289
00308
00309 #if ! defined(NO_TEMPLATE_MEMBERS)
00310 template<typename Iter>
00311 void SpectralSurface::scaleAmplitudes( Iter b, Iter e )
00312 #else
00313 inline
00314 void SpectralSurface::scaleAmplitudes( PartialList::iterator b,
00315 PartialList::iterator e )
00316 #endif
00317 {
00318 while ( b != e )
00319 {
00320
00321 scaleAmplitudes( *b );
00322 ++b;
00323 }
00324 }
00325
00326
00327
00328
00349
00350 #if ! defined(NO_TEMPLATE_MEMBERS)
00351 template<typename Iter>
00352 void SpectralSurface::setAmplitudes( Iter b, Iter e )
00353 #else
00354 inline
00355 void SpectralSurface::setAmplitudes( PartialList::iterator b,
00356 PartialList::iterator e )
00357 #endif
00358 {
00359 while ( b != e )
00360 {
00361
00362 setAmplitudes( *b );
00363 ++b;
00364 }
00365 }
00366
00367 }
00368
00369 #endif
00370