VISR  0.11.7
Versatile Interactive Scene Renderer
point_source_with_reverb.hpp
Go to the documentation of this file.
1 /* Copyright Institute of Sound and Vibration Research - All rights reserved
2 
3  Adapted for the S3A room object by Phil Coleman, University of Surrey
4 
5  */
6 
7 #ifndef VISR_OBJECTMODEL_POINT_SOURCE_REVERB_HPP_INCLUDED
8 #define VISR_OBJECTMODEL_POINT_SOURCE_REVERB_HPP_INCLUDED
9 
10 #include "point_source.hpp"
11 
12 #include "export_symbols.hpp"
13 
15 
16 #include <libvisr/constants.hpp>
17 
18 #include <algorithm>
19 #include <string>
20 #include <vector>
21 
22 namespace visr
23 {
24 namespace objectmodel
25 {
26 
31  class VISR_OBJECTMODEL_LIBRARY_SYMBOL PointSourceWithReverb: public PointSource
32  {
33  public:
37  static const std::size_t cNumberOfSubBands = 9;
38 
44  static const std::size_t cNumDiscreteReflectionBiquads = 10;
45 
50  using LateReverbCoeffs = std::array<SampleType, cNumberOfSubBands >;
51 
55  class VISR_OBJECTMODEL_LIBRARY_SYMBOL DiscreteReflection
56  {
57  public:
62 
67 
69  Coordinate positionX() const { return mX; }
71  Coordinate positionY() const { return mY; }
73  Coordinate positionZ() const { return mZ; }
74 
76  SampleType delay() const { return mDelay; }
77 
82  LevelType level() const { return mLevel; }
83 
87  rbbl::BiquadCoefficientList<SampleType> const & reflectionFilters() const { return mDiscreteReflectionFilters; }
88 
94  rbbl::BiquadCoefficient<SampleType> const & reflectionFilter( std::size_t biquadIdx ) const;
95 
102  void setPosition( Coordinate x, Coordinate y, Coordinate z );
103 
108  void setDelay( SampleType newDelay );
109 
114  void setLevel( LevelType newLevel );
115 
122  void setReflectionFilters( rbbl::BiquadCoefficientList<SampleType> const & newFilters );
123 
130  void setReflectionFilter( std::size_t biquadIdx, rbbl::BiquadCoefficient<SampleType> const & newFilter );
131  private:
133  Coordinate mX;
135  Coordinate mY;
137  Coordinate mZ;
138 
142  SampleType mDelay;
143 
147  LevelType mLevel;
148 
152  rbbl::BiquadCoefficientList<SampleType> mDiscreteReflectionFilters;
153  };
154 
158  class VISR_OBJECTMODEL_LIBRARY_SYMBOL LateReverb
159  {
160  public:
164  LateReverb();
165 
169  LateReverb( LateReverb const & rhs );
170 
178  explicit LateReverb( SampleType onsetDelay,
179  std::initializer_list<SampleType> const levels = std::initializer_list<SampleType>(),
180  std::initializer_list<SampleType> const decayCoeffs = std::initializer_list<SampleType>(),
181  std::initializer_list<SampleType> const attackTimes = std::initializer_list<SampleType>() );
182 
186  SampleType const onsetDelay() const { return mOnsetDelay; }
187 
192  void setOnsetDelay( SampleType onset ) { mOnsetDelay = onset; }
193 
198  LateReverbCoeffs const & decayCoeffs() const { return mDecayCoeffs; }
199 
204  LateReverbCoeffs const & levels() const { return mLevels; }
205 
210  LateReverbCoeffs const & attackTimes() const { return mAttackTimes; }
211 
216  void setLevels( LateReverbCoeffs const & levels ) { mLevels = levels; }
217 
224  void setLevels( SampleType const * levels, std::size_t numValues );
225 
230  void setDecayCoeffs( LateReverbCoeffs const & decay ) { mDecayCoeffs = decay; }
231 
238  void setDecayCoeffs( SampleType const * decay, std::size_t numValues );
239 
244  void setAttackTimes( LateReverbCoeffs const & attack ) { mAttackTimes = attack; }
245 
252  void setAttackTimes( SampleType const * attack, std::size_t numValues );
253  private:
257  SampleType mOnsetDelay;
258 
262  LateReverbCoeffs mAttackTimes;
263 
267  LateReverbCoeffs mDecayCoeffs;
268 
272  LateReverbCoeffs mLevels;
273  };
274 
279  PointSourceWithReverb() = delete;
280 
284  explicit PointSourceWithReverb( ObjectId id );
285 
289  virtual ~PointSourceWithReverb();
290 
291  /*virtual*/ ObjectTypeId type() const;
292 
293  /*virtual*/ std::unique_ptr<Object> clone() const;
294 
298  LateReverb const & lateReverb() const { return mLateReverb; }
299 
303  LateReverb & lateReverb() { return mLateReverb; }
304 
305 
309  SampleType const lateReverbOnset() const { return lateReverb().onsetDelay(); }
310 
315  void setLateReverbOnset( SampleType onset ) { lateReverb().setOnsetDelay( onset ); }
316 
321  LateReverbCoeffs const & lateReverbDecayCoeffs() const { return lateReverb().decayCoeffs(); }
322 
327  LateReverbCoeffs const & lateReverbLevels() const { return lateReverb().levels(); }
328 
333  LateReverbCoeffs const & lateReverbAttackTimes() const { return lateReverb().attackTimes(); }
334 
335 
340  void setLateReverbLevels( LateReverbCoeffs const & levels ) { lateReverb().setLevels( levels ); }
341 
348  void setLateReverbLevels( SampleType const * levels, std::size_t numValues ) { lateReverb().setLevels( levels, numValues ); }
349 
354  void setLateReverbDecayCoeffs( LateReverbCoeffs const & decay ) { lateReverb().setDecayCoeffs( decay ); }
355 
362  void setLateReverbDecayCoeffs( SampleType const * decay, std::size_t numValues ) { lateReverb().setDecayCoeffs( decay, numValues ); }
363 
368  void setLateReverbAttackTimes( LateReverbCoeffs const & attack ) { lateReverb().setAttackTimes( attack ); }
369 
376  void setLateReverbAttackTimes( SampleType const * attack, std::size_t numValues ) { lateReverb().setAttackTimes( attack, numValues ); }
377 
378 
384  void setNumberOfDiscreteReflections( std::size_t numReflections );
385 
389  std::size_t numberOfDiscreteReflections() const { return mDiscreteReflections.size(); };
390 
395  DiscreteReflection const & discreteReflection( std::size_t reflIdx ) const
396  {
397  return mDiscreteReflections.at( reflIdx );
398  }
399 
404  DiscreteReflection & discreteReflection( std::size_t reflIdx )
405  {
406  return mDiscreteReflections.at( reflIdx );
407  }
408 
409 private:
413  std::vector<DiscreteReflection> mDiscreteReflections;
414 
415  LateReverb mLateReverb;
416 };
417 
418 } // namespace objectmodel
419 } // namespace visr
420 
421 #endif // VISR_OBJECTMODEL_POINT_SOURCE_WITH_DIFFUSENESS_HPP_INCLUDED
void setLateReverbAttackTimes(LateReverbCoeffs const &attack)
Definition: point_source_with_reverb.hpp:368
LateReverbCoeffs const & decayCoeffs() const
Definition: point_source_with_reverb.hpp:198
LateReverbCoeffs const & lateReverbDecayCoeffs() const
Definition: point_source_with_reverb.hpp:321
LateReverb const & lateReverb() const
Definition: point_source_with_reverb.hpp:298
std::size_t numberOfDiscreteReflections() const
Definition: point_source_with_reverb.hpp:389
unsigned int ObjectId
Definition: object.hpp:23
std::array< SampleType, cNumberOfSubBands > LateReverbCoeffs
Definition: point_source_with_reverb.hpp:50
Coordinate positionX() const
Definition: point_source_with_reverb.hpp:69
Definition: point_source_with_reverb.hpp:55
void setLateReverbAttackTimes(SampleType const *attack, std::size_t numValues)
Definition: point_source_with_reverb.hpp:376
SampleType delay() const
Definition: point_source_with_reverb.hpp:76
rbbl::BiquadCoefficientList< SampleType > const & reflectionFilters() const
Definition: point_source_with_reverb.hpp:87
void setLateReverbDecayCoeffs(SampleType const *decay, std::size_t numValues)
Definition: point_source_with_reverb.hpp:362
LateReverbCoeffs const & levels() const
Definition: point_source_with_reverb.hpp:204
Definition: biquad_coefficient.hpp:30
Definition: point_source.hpp:18
ObjectTypeId
Definition: object_type.hpp:26
LateReverbCoeffs const & lateReverbLevels() const
Definition: point_source_with_reverb.hpp:327
void setLateReverbDecayCoeffs(LateReverbCoeffs const &decay)
Definition: point_source_with_reverb.hpp:354
void setLevels(LateReverbCoeffs const &levels)
Definition: point_source_with_reverb.hpp:216
float LevelType
Definition: object.hpp:31
Definition: options.cpp:10
SampleType const lateReverbOnset() const
Definition: point_source_with_reverb.hpp:309
void setDecayCoeffs(LateReverbCoeffs const &decay)
Definition: point_source_with_reverb.hpp:230
Coordinate positionZ() const
Definition: point_source_with_reverb.hpp:73
void setAttackTimes(LateReverbCoeffs const &attack)
Definition: point_source_with_reverb.hpp:244
LateReverbCoeffs const & lateReverbAttackTimes() const
Definition: point_source_with_reverb.hpp:333
LateReverb & lateReverb()
Definition: point_source_with_reverb.hpp:303
void setOnsetDelay(SampleType onset)
Definition: point_source_with_reverb.hpp:192
Coordinate positionY() const
Definition: point_source_with_reverb.hpp:71
void setLateReverbLevels(SampleType const *levels, std::size_t numValues)
Definition: point_source_with_reverb.hpp:348
Definition: point_source_with_reverb.hpp:158
void setLateReverbLevels(LateReverbCoeffs const &levels)
Definition: point_source_with_reverb.hpp:340
DiscreteReflection const & discreteReflection(std::size_t reflIdx) const
Definition: point_source_with_reverb.hpp:395
void setLateReverbOnset(SampleType onset)
Definition: point_source_with_reverb.hpp:315
Definition: point_source_with_reverb.hpp:31
SampleType const onsetDelay() const
Definition: point_source_with_reverb.hpp:186
float Coordinate
Definition: object.hpp:46
LevelType level() const
Definition: point_source_with_reverb.hpp:82
float SampleType
Definition: constants.hpp:14
DiscreteReflection & discreteReflection(std::size_t reflIdx)
Definition: point_source_with_reverb.hpp:404
LateReverbCoeffs const & attackTimes() const
Definition: point_source_with_reverb.hpp:210