Home   Information   Classes   Download   Usage   Mail List   Requirements   Links   FAQ   Tutorial


Mesh2D.h
1 #ifndef STK_MESH2D_H
2 #define STK_MESH2D_H
3 
4 #include "Instrmnt.h"
5 #include "OnePole.h"
6 
7 namespace stk {
8 
9 /***************************************************/
33 /***************************************************/
34 
35 const unsigned short NXMAX = 12;
36 const unsigned short NYMAX = 12;
37 
38 class Mesh2D : public Instrmnt
39 {
40  public:
42  Mesh2D( unsigned short nX, unsigned short nY );
43 
45  ~Mesh2D( void );
46 
48  void clear( void );
49 
51  void setNX( unsigned short lenX );
52 
54  void setNY( unsigned short lenY );
55 
57  void setInputPosition( StkFloat xFactor, StkFloat yFactor );
58 
60  void setDecay( StkFloat decayFactor );
61 
63  void noteOn( StkFloat frequency, StkFloat amplitude );
64 
66  void noteOff( StkFloat amplitude );
67 
69  StkFloat energy( void );
70 
72  StkFloat inputTick( StkFloat input );
73 
75  void controlChange( int number, StkFloat value );
76 
78  StkFloat tick( unsigned int channel = 0 );
79 
81 
88  StkFrames& tick( StkFrames& frames, unsigned int channel = 0 );
89 
90  protected:
91 
92  StkFloat tick0();
93  StkFloat tick1();
94  void clearMesh();
95 
96  unsigned short NX_, NY_;
97  unsigned short xInput_, yInput_;
98  OnePole filterX_[NXMAX];
99  OnePole filterY_[NYMAX];
100  StkFloat v_[NXMAX-1][NYMAX-1]; // junction velocities
101  StkFloat vxp_[NXMAX][NYMAX]; // positive-x velocity wave
102  StkFloat vxm_[NXMAX][NYMAX]; // negative-x velocity wave
103  StkFloat vyp_[NXMAX][NYMAX]; // positive-y velocity wave
104  StkFloat vym_[NXMAX][NYMAX]; // negative-y velocity wave
105 
106  // Alternate buffers
107  StkFloat vxp1_[NXMAX][NYMAX]; // positive-x velocity wave
108  StkFloat vxm1_[NXMAX][NYMAX]; // negative-x velocity wave
109  StkFloat vyp1_[NXMAX][NYMAX]; // positive-y velocity wave
110  StkFloat vym1_[NXMAX][NYMAX]; // negative-y velocity wave
111 
112  int counter_; // time in samples
113 };
114 
115 inline StkFrames& Mesh2D :: tick( StkFrames& frames, unsigned int channel )
116 {
117  unsigned int nChannels = lastFrame_.channels();
118 #if defined(_STK_DEBUG_)
119  if ( channel > frames.channels() - nChannels ) {
120  oStream_ << "Mesh2D::tick(): channel and StkFrames arguments are incompatible!";
121  handleError( StkError::FUNCTION_ARGUMENT );
122  }
123 #endif
124 
125  StkFloat *samples = &frames[channel];
126  unsigned int j, hop = frames.channels() - nChannels;
127  if ( nChannels == 1 ) {
128  for ( unsigned int i=0; i<frames.frames(); i++, samples += hop )
129  *samples++ = tick();
130  }
131  else {
132  for ( unsigned int i=0; i<frames.frames(); i++, samples += hop ) {
133  *samples++ = tick();
134  for ( j=1; j<nChannels; j++ )
135  *samples++ = lastFrame_[j];
136  }
137  }
138 
139  return frames;
140 }
141 
142 } // stk namespace
143 
144 #endif

The Synthesis ToolKit in C++ (STK)
©1995--2014 Perry R. Cook and Gary P. Scavone. All Rights Reserved.