00001
00002
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 #include "Marker.h"
00034 #include "Synthesizer.h"
00035
00036 #if defined(NO_TEMPLATE_MEMBERS)
00037 #include "PartialList.h"
00038 #endif
00039
00040 #include <memory>
00041 #include <string>
00042 #include <vector>
00043
00044
00045 namespace Loris {
00046
00047 class Partial;
00048
00049
00050
00051
00057
00058 class AiffFile
00059 {
00060
00061 public:
00062
00063
00064
00066 typedef std::vector< double > samples_type;
00067
00069 typedef samples_type::size_type size_type;
00070
00072 typedef std::vector< Marker > markers_type;
00073
00074
00075
00080 explicit AiffFile( const std::string & filename );
00081
00099 #if !defined(NO_TEMPLATE_MEMBERS)
00100 template<typename Iter>
00101 AiffFile( Iter begin_partials, Iter end_partials,
00102 double samplerate, double fadeTime = .001 );
00103 #else
00104 AiffFile( PartialList::const_iterator begin_partials,
00105 PartialList::const_iterator end_partials,
00106 double samplerate, double fadeTime = .001 );
00107 #endif
00108
00115 explicit AiffFile( double samplerate, size_type numFrames = 0 );
00116
00123 AiffFile( const double * buffer, size_type bufferlength, double samplerate );
00124
00130 AiffFile( const std::vector< double > & vec, double samplerate );
00131
00136 AiffFile( const AiffFile & other );
00137
00143 AiffFile & operator= ( const AiffFile & rhs );
00144
00145
00146
00149 markers_type & markers( void );
00150
00153 const markers_type & markers( void ) const;
00154
00157 double midiNoteNumber( void ) const;
00158
00163 size_type numFrames( void ) const;
00164
00167 double sampleRate( void ) const;
00168
00171 samples_type & samples( void );
00172
00175 const samples_type & samples( void ) const;
00176
00177
00178
00187 void addPartial( const Loris::Partial & p, double fadeTime = .001 );
00188
00204 #if !defined(NO_TEMPLATE_MEMBERS)
00205 template<typename Iter>
00206 void addPartials( Iter begin_partials, Iter end_partials, double fadeTime = .001 );
00207 #else
00208 void addPartials( PartialList::const_iterator begin_partials,
00209 PartialList::const_iterator end_partials,
00210 double fadeTime = .001 );
00211 #endif
00212
00217 void setMidiNoteNumber( double nn );
00218
00219
00220
00230 void write( const std::string & filename, unsigned int bps = 16 );
00231
00232 private:
00233
00234 double notenum_, rate_;
00235 markers_type markers_;
00236 samples_type samples_;
00237
00238 std::auto_ptr< Synthesizer > psynth_;
00239
00240
00241
00242 void configureSynthesizer( double fadeTime );
00243 void readAiffData( const std::string & filename );
00244
00245 };
00246
00247 #pragma mark -- template members --
00248
00249
00250
00251
00269
00270 #if !defined(NO_TEMPLATE_MEMBERS)
00271 template< typename Iter >
00272 AiffFile::AiffFile( Iter begin_partials, Iter end_partials,
00273 double samplerate, double fadeTime ) :
00274 #else
00275 AiffFile::AiffFile( PartialList::const_iterator begin_partials,
00276 PartialList::const_iterator end_partials,
00277 double samplerate, double fadeTime ) :
00278 #endif
00279
00280 notenum_( 60 ),
00281 rate_( samplerate )
00282 {
00283 addPartials( begin_partials, end_partials, fadeTime );
00284 }
00285
00286
00287
00288
00304
00305 #if !defined(NO_TEMPLATE_MEMBERS)
00306 template< typename Iter >
00307 void
00308 AiffFile::addPartials( Iter begin_partials, Iter end_partials, double fadeTime )
00309 #else
00310 void
00311 AiffFile::addPartials( PartialList::const_iterator begin_partials,
00312 PartialList::const_iterator end_partials,
00313 double fadeTime )
00314 #endif
00315 {
00316 configureSynthesizer( fadeTime );
00317 psynth_->synthesize( begin_partials, end_partials );
00318 }
00319
00320 }