beeps 0.1.11 → 0.1.16

Sign up to get free protection for your applications and to get access to all the features.
Files changed (59) hide show
  1. checksums.yaml +5 -5
  2. data/.doc/ext/beeps/beeps.cpp +2 -5
  3. data/.doc/ext/beeps/file_in.cpp +0 -5
  4. data/.doc/ext/beeps/native.cpp +0 -4
  5. data/.doc/ext/beeps/processor.cpp +1 -5
  6. data/.doc/ext/beeps/sawtooth_wave.cpp +0 -5
  7. data/.doc/ext/beeps/sine_wave.cpp +0 -5
  8. data/.doc/ext/beeps/sound.cpp +0 -5
  9. data/.doc/ext/beeps/square_wave.cpp +0 -5
  10. data/README.md +1 -1
  11. data/Rakefile +15 -12
  12. data/VERSION +1 -1
  13. data/beeps.gemspec +5 -7
  14. data/ext/beeps/beeps.cpp +2 -5
  15. data/ext/beeps/defs.h +3 -2
  16. data/ext/beeps/extconf.rb +2 -3
  17. data/ext/beeps/file_in.cpp +0 -5
  18. data/ext/beeps/native.cpp +0 -4
  19. data/ext/beeps/processor.cpp +1 -5
  20. data/ext/beeps/sawtooth_wave.cpp +0 -5
  21. data/ext/beeps/sine_wave.cpp +0 -5
  22. data/ext/beeps/sound.cpp +0 -5
  23. data/ext/beeps/square_wave.cpp +0 -5
  24. data/include/beeps.h +5 -0
  25. data/include/beeps/debug.h +23 -0
  26. data/include/beeps/exception.h +6 -2
  27. data/include/beeps/processor.h +9 -6
  28. data/include/beeps/ruby/beeps.h +1 -0
  29. data/include/beeps/signals.h +2 -9
  30. data/include/beeps/sound.h +2 -1
  31. data/lib/beeps/module.rb +4 -19
  32. data/lib/beeps/processor.rb +16 -20
  33. data/src/beeps.cpp +3 -64
  34. data/src/exception.cpp +0 -3
  35. data/src/openal.cpp +63 -174
  36. data/src/openal.h +15 -4
  37. data/src/processor.cpp +5 -5
  38. data/src/signals.cpp +21 -19
  39. data/src/signals.h +23 -0
  40. data/src/sound.cpp +173 -14
  41. data/src/sound.h +17 -0
  42. metadata +30 -73
  43. data/include/beeps/openal.h +0 -34
  44. data/src/stk/include/Blit.h +0 -151
  45. data/src/stk/include/BlitSaw.h +0 -148
  46. data/src/stk/include/BlitSquare.h +0 -170
  47. data/src/stk/include/FileRead.h +0 -141
  48. data/src/stk/include/FileWvIn.h +0 -195
  49. data/src/stk/include/Generator.h +0 -50
  50. data/src/stk/include/SineWave.h +0 -159
  51. data/src/stk/include/Stk.h +0 -589
  52. data/src/stk/include/WvIn.h +0 -46
  53. data/src/stk/src/Blit.cpp +0 -78
  54. data/src/stk/src/BlitSaw.cpp +0 -91
  55. data/src/stk/src/BlitSquare.cpp +0 -95
  56. data/src/stk/src/FileRead.cpp +0 -903
  57. data/src/stk/src/FileWvIn.cpp +0 -260
  58. data/src/stk/src/SineWave.cpp +0 -78
  59. data/src/stk/src/Stk.cpp +0 -395
@@ -1,141 +0,0 @@
1
- #ifndef STK_FILEREAD_H
2
- #define STK_FILEREAD_H
3
-
4
- #include "Stk.h"
5
-
6
- namespace stk {
7
-
8
- /***************************************************/
9
- /*! \class FileRead
10
- \brief STK audio file input class.
11
-
12
- This class provides input support for various
13
- audio file formats. Multi-channel (>2)
14
- soundfiles are supported. The file data is
15
- returned via an external StkFrames object
16
- passed to the read() function. This class
17
- does not store its own copy of the file data,
18
- rather the data is read directly from disk.
19
-
20
- FileRead currently supports uncompressed WAV,
21
- AIFF/AIFC, SND (AU), MAT-file (Matlab), and
22
- STK RAW file formats. Signed integer (8-,
23
- 16-, 24-, and 32-bit) and floating-point (32- and
24
- 64-bit) data types are supported. Compressed
25
- data types are not supported.
26
-
27
- STK RAW files have no header and are assumed to
28
- contain a monophonic stream of 16-bit signed
29
- integers in big-endian byte order at a sample
30
- rate of 22050 Hz. MAT-file data should be saved
31
- in an array with each data channel filling a
32
- matrix row. The sample rate for MAT-files should
33
- be specified in a variable named "fs". If no
34
- such variable is found, the sample rate is
35
- assumed to be 44100 Hz.
36
-
37
- by Perry R. Cook and Gary P. Scavone, 1995--2014.
38
- */
39
- /***************************************************/
40
-
41
- class FileRead : public Stk
42
- {
43
- public:
44
- //! Default constructor.
45
- FileRead( void );
46
-
47
- //! Overloaded constructor that opens a file during instantiation.
48
- /*!
49
- An StkError will be thrown if the file is not found or its
50
- format is unknown or unsupported. The optional arguments allow a
51
- headerless file type to be supported. If \c typeRaw is false (the
52
- default), the subsequent parameters are ignored.
53
- */
54
- FileRead( std::string fileName, bool typeRaw = false, unsigned int nChannels = 1,
55
- StkFormat format = STK_SINT16, StkFloat rate = 22050.0 );
56
-
57
- //! Class destructor.
58
- ~FileRead( void );
59
-
60
- //! Open the specified file and determine its formatting.
61
- /*!
62
- An StkError will be thrown if the file is not found or its
63
- format is unknown or unsupported. The optional arguments allow a
64
- headerless file type to be supported. If \c typeRaw is false (the
65
- default), the subsequent parameters are ignored.
66
- */
67
- void open( std::string fileName, bool typeRaw = false, unsigned int nChannels = 1,
68
- StkFormat format = STK_SINT16, StkFloat rate = 22050.0 );
69
-
70
- //! If a file is open, close it.
71
- void close( void );
72
-
73
- //! Returns \e true if a file is currently open.
74
- bool isOpen( void );
75
-
76
- //! Return the file size in sample frames.
77
- unsigned long fileSize( void ) const { return fileSize_; };
78
-
79
- //! Return the number of audio channels in the file.
80
- unsigned int channels( void ) const { return channels_; };
81
-
82
- //! Return the data format of the file.
83
- StkFormat format( void ) const { return dataType_; };
84
-
85
- //! Return the file sample rate in Hz.
86
- /*!
87
- WAV, SND, and AIF formatted files specify a sample rate in
88
- their headers. By definition, STK RAW files have a sample rate of
89
- 22050 Hz. MAT-files are assumed to have a rate of 44100 Hz.
90
- */
91
- StkFloat fileRate( void ) const { return fileRate_; };
92
-
93
- //! Read sample frames from the file into an StkFrames object.
94
- /*!
95
- The number of sample frames to read will be determined from the
96
- number of frames of the StkFrames argument. If this size is
97
- larger than the available data in the file (given the file size
98
- and starting frame index), the extra frames will be unaffected
99
- (the StkFrames object will not be resized). Optional parameters
100
- are provided to specify the starting sample frame within the file
101
- (default = 0) and whether to normalize the data with respect to
102
- fixed-point limits (default = true). An StkError will be thrown
103
- if a file error occurs or if the number of channels in the
104
- StkFrames argument is not equal to that in the file.
105
- */
106
- void read( StkFrames& buffer, unsigned long startFrame = 0, bool doNormalize = true );
107
-
108
- protected:
109
-
110
- // Get STK RAW file information.
111
- bool getRawInfo( const char *fileName, unsigned int nChannels,
112
- StkFormat format, StkFloat rate );
113
-
114
- // Get WAV file header information.
115
- bool getWavInfo( const char *fileName );
116
-
117
- // Get SND (AU) file header information.
118
- bool getSndInfo( const char *fileName );
119
-
120
- // Get AIFF file header information.
121
- bool getAifInfo( const char *fileName );
122
-
123
- // Get MAT-file header information.
124
- bool getMatInfo( const char *fileName );
125
-
126
- // Helper function for MAT-file parsing.
127
- bool findNextMatArray( SINT32 *chunkSize, SINT32 *rows, SINT32 *columns, SINT32 *nametype );
128
-
129
- FILE *fd_;
130
- bool byteswap_;
131
- bool wavFile_;
132
- unsigned long fileSize_;
133
- unsigned long dataOffset_;
134
- unsigned int channels_;
135
- StkFormat dataType_;
136
- StkFloat fileRate_;
137
- };
138
-
139
- } // stk namespace
140
-
141
- #endif
@@ -1,195 +0,0 @@
1
- #ifndef STK_FILEWVIN_H
2
- #define STK_FILEWVIN_H
3
-
4
- #include "WvIn.h"
5
- #include "FileRead.h"
6
-
7
- namespace stk {
8
-
9
- /***************************************************/
10
- /*! \class FileWvIn
11
- \brief STK audio file input class.
12
-
13
- This class inherits from WvIn. It provides a "tick-level"
14
- interface to the FileRead class. It also provides variable-rate
15
- playback functionality. Audio file support is provided by the
16
- FileRead class. Linear interpolation is used for fractional read
17
- rates.
18
-
19
- FileWvIn supports multi-channel data. It is important to
20
- distinguish the tick() method that computes a single frame (and
21
- returns only the specified sample of a multi-channel frame) from
22
- the overloaded one that takes an StkFrames object for
23
- multi-channel and/or multi-frame data.
24
-
25
- FileWvIn will either load the entire content of an audio file into
26
- local memory or incrementally read file data from disk in chunks.
27
- This behavior is controlled by the optional constructor arguments
28
- \e chunkThreshold and \e chunkSize. File sizes greater than \e
29
- chunkThreshold (in sample frames) will be read incrementally in
30
- chunks of \e chunkSize each (also in sample frames).
31
-
32
- When the file end is reached, subsequent calls to the tick()
33
- functions return zeros and isFinished() returns \e true.
34
-
35
- See the FileRead class for a description of the supported audio
36
- file formats.
37
-
38
- by Perry R. Cook and Gary P. Scavone, 1995--2014.
39
- */
40
- /***************************************************/
41
-
42
- class FileWvIn : public WvIn
43
- {
44
- public:
45
- //! Default constructor.
46
- FileWvIn( unsigned long chunkThreshold = 1000000, unsigned long chunkSize = 1024 );
47
-
48
- //! Overloaded constructor for file input.
49
- /*!
50
- An StkError will be thrown if the file is not found, its format is
51
- unknown, or a read error occurs.
52
- */
53
- FileWvIn( std::string fileName, bool raw = false, bool doNormalize = true,
54
- unsigned long chunkThreshold = 1000000, unsigned long chunkSize = 1024 );
55
-
56
- //! Class destructor.
57
- ~FileWvIn( void );
58
-
59
- //! Open the specified file and load its data.
60
- /*!
61
- Data from a previously opened file will be overwritten by this
62
- function. An StkError will be thrown if the file is not found,
63
- its format is unknown, or a read error occurs. If the file data
64
- is to be loaded incrementally from disk and normalization is
65
- specified, a scaling will be applied with respect to fixed-point
66
- limits. If the data format is floating-point, no scaling is
67
- performed.
68
- */
69
- virtual void openFile( std::string fileName, bool raw = false, bool doNormalize = true );
70
-
71
- //! Close a file if one is open.
72
- virtual void closeFile( void );
73
-
74
- //! Clear outputs and reset time (file) pointer to zero.
75
- virtual void reset( void );
76
-
77
- //! Normalize data to a maximum of +-1.0.
78
- /*!
79
- This function has no effect when data is incrementally loaded
80
- from disk.
81
- */
82
- virtual void normalize( void );
83
-
84
- //! Normalize data to a maximum of \e +-peak.
85
- /*!
86
- This function has no effect when data is incrementally loaded
87
- from disk.
88
- */
89
- virtual void normalize( StkFloat peak );
90
-
91
- //! Return the file size in sample frames.
92
- virtual unsigned long getSize( void ) const { return file_.fileSize(); };
93
-
94
- //! Return the input file sample rate in Hz (not the data read rate).
95
- /*!
96
- WAV, SND, and AIF formatted files specify a sample rate in
97
- their headers. STK RAW files have a sample rate of 22050 Hz
98
- by definition. MAT-files are assumed to have a rate of 44100 Hz.
99
- */
100
- virtual StkFloat getFileRate( void ) const { return data_.dataRate(); };
101
-
102
- //! Query whether a file is open.
103
- bool isOpen( void ) { return file_.isOpen(); };
104
-
105
- //! Query whether reading is complete.
106
- bool isFinished( void ) const { return finished_; };
107
-
108
- //! Set the data read rate in samples. The rate can be negative.
109
- /*!
110
- If the rate value is negative, the data is read in reverse order.
111
- */
112
- virtual void setRate( StkFloat rate );
113
-
114
- //! Increment the read pointer by \e time samples.
115
- /*!
116
- Note that this function will not modify the interpolation flag status.
117
- */
118
- virtual void addTime( StkFloat time );
119
-
120
- //! Turn linear interpolation on/off.
121
- /*!
122
- Interpolation is automatically off when the read rate is
123
- an integer value. If interpolation is turned off for a
124
- fractional rate, the time index is truncated to an integer
125
- value.
126
- */
127
- void setInterpolate( bool doInterpolate ) { interpolate_ = doInterpolate; };
128
-
129
- //! Return the specified channel value of the last computed frame.
130
- /*!
131
- If no file is loaded, the returned value is 0.0. The \c
132
- channel argument must be less than the number of output channels,
133
- which can be determined with the channelsOut() function (the first
134
- channel is specified by 0). However, range checking is only
135
- performed if _STK_DEBUG_ is defined during compilation, in which
136
- case an out-of-range value will trigger an StkError exception. \sa
137
- lastFrame()
138
- */
139
- StkFloat lastOut( unsigned int channel = 0 );
140
-
141
- //! Compute a sample frame and return the specified \c channel value.
142
- /*!
143
- For multi-channel files, use the lastFrame() function to get
144
- all values from the computed frame. If no file data is loaded,
145
- the returned value is 0.0. The \c channel argument must be less
146
- than the number of channels in the file data (the first channel is
147
- specified by 0). However, range checking is only performed if
148
- _STK_DEBUG_ is defined during compilation, in which case an
149
- out-of-range value will trigger an StkError exception.
150
- */
151
- virtual StkFloat tick( unsigned int channel = 0 );
152
-
153
- //! Fill the StkFrames object with computed sample frames, starting at the specified channel and return the same reference.
154
- /*!
155
- The \c channel argument plus the number of input channels must
156
- be less than the number of channels in the StkFrames argument (the
157
- first channel is specified by 0). However, range checking is only
158
- performed if _STK_DEBUG_ is defined during compilation, in which
159
- case an out-of-range value will trigger an StkError exception.
160
- */
161
- virtual StkFrames& tick( StkFrames& frames,unsigned int channel = 0 );
162
-
163
- protected:
164
-
165
- void sampleRateChanged( StkFloat newRate, StkFloat oldRate );
166
-
167
- FileRead file_;
168
- bool finished_;
169
- bool interpolate_;
170
- bool normalizing_;
171
- bool chunking_;
172
- StkFloat time_;
173
- StkFloat rate_;
174
- unsigned long chunkThreshold_;
175
- unsigned long chunkSize_;
176
- long chunkPointer_;
177
-
178
- };
179
-
180
- inline StkFloat FileWvIn :: lastOut( unsigned int channel )
181
- {
182
- #if defined(_STK_DEBUG_)
183
- if ( channel >= data_.channels() ) {
184
- oStream_ << "FileWvIn::lastOut(): channel argument and soundfile data are incompatible!";
185
- handleError( StkError::FUNCTION_ARGUMENT );
186
- }
187
- #endif
188
-
189
- if ( finished_ ) return 0.0;
190
- return lastFrame_[channel];
191
- }
192
-
193
- } // stk namespace
194
-
195
- #endif
@@ -1,50 +0,0 @@
1
- #ifndef STK_GENERATOR_H
2
- #define STK_GENERATOR_H
3
-
4
- #include "Stk.h"
5
-
6
- namespace stk {
7
-
8
- /***************************************************/
9
- /*! \class Generator
10
- \brief STK abstract unit generator parent class.
11
-
12
- This class provides limited common functionality for STK unit
13
- generator sample-source subclasses. It is general enough to
14
- support both monophonic and polyphonic output classes.
15
-
16
- by Perry R. Cook and Gary P. Scavone, 1995--2014.
17
- */
18
- /***************************************************/
19
-
20
- class Generator : public Stk
21
- {
22
- public:
23
-
24
- //! Class constructor.
25
- Generator( void ) { lastFrame_.resize( 1, 1, 0.0 ); };
26
-
27
- //! Return the number of output channels for the class.
28
- unsigned int channelsOut( void ) const { return lastFrame_.channels(); };
29
-
30
- //! Return an StkFrames reference to the last output sample frame.
31
- const StkFrames& lastFrame( void ) const { return lastFrame_; };
32
-
33
- //! Fill the StkFrames object with computed sample frames, starting at the specified channel.
34
- /*!
35
- The \c channel argument plus the number of output channels must
36
- be less than the number of channels in the StkFrames argument (the
37
- first channel is specified by 0). However, range checking is only
38
- performed if _STK_DEBUG_ is defined during compilation, in which
39
- case an out-of-range value will trigger an StkError exception.
40
- */
41
- virtual StkFrames& tick( StkFrames& frames, unsigned int channel = 0 ) = 0;
42
-
43
- protected:
44
-
45
- StkFrames lastFrame_;
46
- };
47
-
48
- } // stk namespace
49
-
50
- #endif
@@ -1,159 +0,0 @@
1
- #ifndef STK_SINEWAVE_H
2
- #define STK_SINEWAVE_H
3
-
4
- const unsigned long TABLE_SIZE = 2048;
5
-
6
- #include "Generator.h"
7
-
8
- namespace stk {
9
-
10
- /***************************************************/
11
- /*! \class SineWave
12
- \brief STK sinusoid oscillator class.
13
-
14
- This class computes and saves a static sine "table" that can be
15
- shared by multiple instances. It has an interface similar to the
16
- WaveLoop class but inherits from the Generator class. Output
17
- values are computed using linear interpolation.
18
-
19
- The "table" length, set in SineWave.h, is 2048 samples by default.
20
-
21
- by Perry R. Cook and Gary P. Scavone, 1995--2014.
22
- */
23
- /***************************************************/
24
-
25
- class SineWave : public Generator
26
- {
27
- public:
28
- //! Default constructor.
29
- SineWave( void );
30
-
31
- //! Class destructor.
32
- ~SineWave( void );
33
-
34
- //! Clear output and reset time pointer to zero.
35
- void reset( void );
36
-
37
- //! Set the data read rate in samples. The rate can be negative.
38
- /*!
39
- If the rate value is negative, the data is read in reverse order.
40
- */
41
- void setRate( StkFloat rate ) { rate_ = rate; };
42
-
43
- //! Set the data interpolation rate based on a looping frequency.
44
- /*!
45
- This function determines the interpolation rate based on the file
46
- size and the current Stk::sampleRate. The \e frequency value
47
- corresponds to file cycles per second. The frequency can be
48
- negative, in which case the loop is read in reverse order.
49
- */
50
- void setFrequency( StkFloat frequency );
51
-
52
- //! Increment the read pointer by \e time in samples, modulo the table size.
53
- void addTime( StkFloat time );
54
-
55
- //! Increment the read pointer by a normalized \e phase value.
56
- /*!
57
- This function increments the read pointer by a normalized phase
58
- value, such that \e phase = 1.0 corresponds to a 360 degree phase
59
- shift. Positive or negative values are possible.
60
- */
61
- void addPhase( StkFloat phase );
62
-
63
- //! Add a normalized phase offset to the read pointer.
64
- /*!
65
- A \e phaseOffset = 1.0 corresponds to a 360 degree phase
66
- offset. Positive or negative values are possible.
67
- */
68
- void addPhaseOffset( StkFloat phaseOffset );
69
-
70
- //! Return the last computed output value.
71
- StkFloat lastOut( void ) const { return lastFrame_[0]; };
72
-
73
- //! Compute and return one output sample.
74
- StkFloat tick( void );
75
-
76
- //! Fill a channel of the StkFrames object with computed outputs.
77
- /*!
78
- The \c channel argument must be less than the number of
79
- channels in the StkFrames argument (the first channel is specified
80
- by 0). However, range checking is only performed if _STK_DEBUG_
81
- is defined during compilation, in which case an out-of-range value
82
- will trigger an StkError exception.
83
- */
84
- StkFrames& tick( StkFrames& frames, unsigned int channel = 0 );
85
-
86
- protected:
87
-
88
- void sampleRateChanged( StkFloat newRate, StkFloat oldRate );
89
-
90
- static StkFrames table_;
91
- StkFloat time_;
92
- StkFloat rate_;
93
- StkFloat phaseOffset_;
94
- unsigned int iIndex_;
95
- StkFloat alpha_;
96
-
97
- };
98
-
99
- inline StkFloat SineWave :: tick( void )
100
- {
101
- // Check limits of time address ... if necessary, recalculate modulo
102
- // TABLE_SIZE.
103
- while ( time_ < 0.0 )
104
- time_ += TABLE_SIZE;
105
- while ( time_ >= TABLE_SIZE )
106
- time_ -= TABLE_SIZE;
107
-
108
- iIndex_ = (unsigned int) time_;
109
- alpha_ = time_ - iIndex_;
110
- StkFloat tmp = table_[ iIndex_ ];
111
- tmp += ( alpha_ * ( table_[ iIndex_ + 1 ] - tmp ) );
112
-
113
- // Increment time, which can be negative.
114
- time_ += rate_;
115
-
116
- lastFrame_[0] = tmp;
117
- return lastFrame_[0];
118
- }
119
-
120
- inline StkFrames& SineWave :: tick( StkFrames& frames, unsigned int channel )
121
- {
122
- #if defined(_STK_DEBUG_)
123
- if ( channel >= frames.channels() ) {
124
- oStream_ << "SineWave::tick(): channel and StkFrames arguments are incompatible!";
125
- handleError( StkError::FUNCTION_ARGUMENT );
126
- }
127
- #endif
128
-
129
- StkFloat *samples = &frames[channel];
130
- StkFloat tmp = 0.0;
131
-
132
- unsigned int hop = frames.channels();
133
- for ( unsigned int i=0; i<frames.frames(); i++, samples += hop ) {
134
-
135
- // Check limits of time address ... if necessary, recalculate modulo
136
- // TABLE_SIZE.
137
- while ( time_ < 0.0 )
138
- time_ += TABLE_SIZE;
139
- while ( time_ >= TABLE_SIZE )
140
- time_ -= TABLE_SIZE;
141
-
142
- iIndex_ = (unsigned int) time_;
143
- alpha_ = time_ - iIndex_;
144
- tmp = table_[ iIndex_ ];
145
- tmp += ( alpha_ * ( table_[ iIndex_ + 1 ] - tmp ) );
146
- *samples = tmp;
147
-
148
- // Increment time, which can be negative.
149
- time_ += rate_;
150
- }
151
-
152
- lastFrame_[0] = tmp;
153
- return frames;
154
- }
155
-
156
- } // stk namespace
157
-
158
- #endif
159
-