beeps 0.3.6 → 0.3.7
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/.doc/ext/beeps/beeps.cpp +7 -0
- data/.doc/ext/beeps/high_pass.cpp +63 -0
- data/.doc/ext/beeps/low_pass.cpp +63 -0
- data/.doc/ext/beeps/native.cpp +8 -0
- data/.doc/ext/beeps/oscillator.cpp +87 -10
- data/.doc/ext/beeps/processor.cpp +14 -1
- data/.doc/ext/beeps/reverb.cpp +99 -0
- data/.doc/ext/beeps/signals.cpp +128 -0
- data/ChangeLog.md +24 -0
- data/Rakefile +1 -1
- data/VERSION +1 -1
- data/beeps.gemspec +2 -2
- data/ext/beeps/beeps.cpp +8 -0
- data/ext/beeps/high_pass.cpp +66 -0
- data/ext/beeps/low_pass.cpp +66 -0
- data/ext/beeps/native.cpp +8 -0
- data/ext/beeps/oscillator.cpp +95 -12
- data/ext/beeps/processor.cpp +15 -1
- data/ext/beeps/reverb.cpp +106 -0
- data/ext/beeps/signals.cpp +136 -0
- data/include/beeps/beeps.h +2 -2
- data/include/beeps/defs.h +3 -0
- data/include/beeps/filter.h +118 -17
- data/include/beeps/generator.h +50 -17
- data/include/beeps/processor.h +23 -6
- data/include/beeps/ruby/filter.h +33 -0
- data/include/beeps/ruby/signals.h +40 -0
- data/include/beeps/signals.h +1 -1
- data/lib/beeps/processor.rb +46 -1
- data/lib/beeps/signals.rb +19 -0
- data/lib/beeps.rb +1 -0
- data/src/analyser.cpp +34 -37
- data/src/beeps.cpp +7 -6
- data/src/envelope.cpp +60 -46
- data/src/file_in.cpp +6 -6
- data/src/gain.cpp +5 -5
- data/src/high_pass.cpp +57 -0
- data/src/low_pass.cpp +57 -0
- data/src/mic_in.cpp +16 -14
- data/src/mixer.cpp +38 -20
- data/src/oscillator.cpp +260 -168
- data/src/pitch_shift.cpp +6 -6
- data/src/processor.cpp +118 -11
- data/src/processor.h +8 -0
- data/src/reverb.cpp +124 -0
- data/src/sequencer.cpp +18 -14
- data/src/signals.cpp +264 -106
- data/src/signals.h +28 -89
- data/src/sound.cpp +28 -20
- data/src/time_stretch.cpp +6 -6
- data/src/win32/signals.cpp +8 -7
- data/src/x_pass.h +51 -0
- data/test/helper.rb +14 -0
- data/test/test_analyser.rb +26 -0
- data/test/test_envelope.rb +55 -0
- data/test/test_file_in.rb +22 -1
- data/test/test_gain.rb +28 -0
- data/test/test_high_pass.rb +41 -0
- data/test/test_low_pass.rb +41 -0
- data/test/test_mixer.rb +63 -0
- data/test/test_oscillator.rb +58 -0
- data/test/test_pitch_shift.rb +32 -0
- data/test/test_processor.rb +7 -0
- data/test/test_signals.rb +60 -0
- data/test/test_time_stretch.rb +36 -0
- metadata +48 -10
@@ -0,0 +1,66 @@
|
|
1
|
+
#include "beeps/ruby/filter.h"
|
2
|
+
|
3
|
+
|
4
|
+
#include "beeps/ruby/processor.h"
|
5
|
+
#include "defs.h"
|
6
|
+
|
7
|
+
|
8
|
+
RUCY_DEFINE_WRAPPER_VALUE_FROM_TO(BEEPS_EXPORT, Beeps::HighPass)
|
9
|
+
|
10
|
+
#define THIS to<Beeps::HighPass*>(self)
|
11
|
+
|
12
|
+
#define CHECK RUCY_CHECK_OBJ(Beeps::HighPass, self)
|
13
|
+
|
14
|
+
|
15
|
+
static
|
16
|
+
RUCY_DEF_ALLOC(alloc, klass)
|
17
|
+
{
|
18
|
+
return value(new Beeps::RubyProcessor<Beeps::HighPass>, klass);
|
19
|
+
}
|
20
|
+
RUCY_END
|
21
|
+
|
22
|
+
static
|
23
|
+
RUCY_DEF1(set_cutoff_frequency, frequency)
|
24
|
+
{
|
25
|
+
CHECK;
|
26
|
+
|
27
|
+
THIS->set_cutoff_frequency(to<float>(frequency));
|
28
|
+
}
|
29
|
+
RUCY_END
|
30
|
+
|
31
|
+
static
|
32
|
+
RUCY_DEF0(get_cutoff_frequency)
|
33
|
+
{
|
34
|
+
CHECK;
|
35
|
+
|
36
|
+
return value(THIS->cutoff_frequency());
|
37
|
+
}
|
38
|
+
RUCY_END
|
39
|
+
|
40
|
+
|
41
|
+
static Class cHighPass;
|
42
|
+
|
43
|
+
void
|
44
|
+
Init_beeps_high_pass ()
|
45
|
+
{
|
46
|
+
Module mBeeps = define_module("Beeps");
|
47
|
+
|
48
|
+
cHighPass = mBeeps.define_class("HighPass", Beeps::processor_class());
|
49
|
+
cHighPass.define_alloc_func(alloc);
|
50
|
+
cHighPass.define_method("cutoff_frequency=", set_cutoff_frequency);
|
51
|
+
cHighPass.define_method("cutoff_frequency", get_cutoff_frequency);
|
52
|
+
}
|
53
|
+
|
54
|
+
|
55
|
+
namespace Beeps
|
56
|
+
{
|
57
|
+
|
58
|
+
|
59
|
+
Class
|
60
|
+
high_pass_class ()
|
61
|
+
{
|
62
|
+
return cHighPass;
|
63
|
+
}
|
64
|
+
|
65
|
+
|
66
|
+
}// Beeps
|
@@ -0,0 +1,66 @@
|
|
1
|
+
#include "beeps/ruby/filter.h"
|
2
|
+
|
3
|
+
|
4
|
+
#include "beeps/ruby/processor.h"
|
5
|
+
#include "defs.h"
|
6
|
+
|
7
|
+
|
8
|
+
RUCY_DEFINE_WRAPPER_VALUE_FROM_TO(BEEPS_EXPORT, Beeps::LowPass)
|
9
|
+
|
10
|
+
#define THIS to<Beeps::LowPass*>(self)
|
11
|
+
|
12
|
+
#define CHECK RUCY_CHECK_OBJ(Beeps::LowPass, self)
|
13
|
+
|
14
|
+
|
15
|
+
static
|
16
|
+
RUCY_DEF_ALLOC(alloc, klass)
|
17
|
+
{
|
18
|
+
return value(new Beeps::RubyProcessor<Beeps::LowPass>, klass);
|
19
|
+
}
|
20
|
+
RUCY_END
|
21
|
+
|
22
|
+
static
|
23
|
+
RUCY_DEF1(set_cutoff_frequency, frequency)
|
24
|
+
{
|
25
|
+
CHECK;
|
26
|
+
|
27
|
+
THIS->set_cutoff_frequency(to<float>(frequency));
|
28
|
+
}
|
29
|
+
RUCY_END
|
30
|
+
|
31
|
+
static
|
32
|
+
RUCY_DEF0(get_cutoff_frequency)
|
33
|
+
{
|
34
|
+
CHECK;
|
35
|
+
|
36
|
+
return value(THIS->cutoff_frequency());
|
37
|
+
}
|
38
|
+
RUCY_END
|
39
|
+
|
40
|
+
|
41
|
+
static Class cLowPass;
|
42
|
+
|
43
|
+
void
|
44
|
+
Init_beeps_low_pass ()
|
45
|
+
{
|
46
|
+
Module mBeeps = define_module("Beeps");
|
47
|
+
|
48
|
+
cLowPass = mBeeps.define_class("LowPass", Beeps::processor_class());
|
49
|
+
cLowPass.define_alloc_func(alloc);
|
50
|
+
cLowPass.define_method("cutoff_frequency=", set_cutoff_frequency);
|
51
|
+
cLowPass.define_method("cutoff_frequency", get_cutoff_frequency);
|
52
|
+
}
|
53
|
+
|
54
|
+
|
55
|
+
namespace Beeps
|
56
|
+
{
|
57
|
+
|
58
|
+
|
59
|
+
Class
|
60
|
+
low_pass_class ()
|
61
|
+
{
|
62
|
+
return cLowPass;
|
63
|
+
}
|
64
|
+
|
65
|
+
|
66
|
+
}// Beeps
|
data/ext/beeps/native.cpp
CHANGED
@@ -4,6 +4,7 @@
|
|
4
4
|
void Init_beeps ();
|
5
5
|
void Init_beeps_exception ();
|
6
6
|
|
7
|
+
void Init_beeps_signals ();
|
7
8
|
void Init_beeps_sound ();
|
8
9
|
void Init_beeps_sound_player ();
|
9
10
|
void Init_beeps_processor ();
|
@@ -16,6 +17,9 @@ void Init_beeps_mic_in ();
|
|
16
17
|
void Init_beeps_gain ();
|
17
18
|
void Init_beeps_mixer ();
|
18
19
|
void Init_beeps_envelope ();
|
20
|
+
void Init_beeps_low_pass ();
|
21
|
+
void Init_beeps_high_pass ();
|
22
|
+
void Init_beeps_reverb ();
|
19
23
|
void Init_beeps_time_stretch ();
|
20
24
|
void Init_beeps_pitch_shift ();
|
21
25
|
void Init_beeps_analyser ();
|
@@ -35,6 +39,7 @@ extern "C" void
|
|
35
39
|
Init_beeps();
|
36
40
|
Init_beeps_exception();
|
37
41
|
|
42
|
+
Init_beeps_signals();
|
38
43
|
Init_beeps_sound();
|
39
44
|
Init_beeps_sound_player();
|
40
45
|
Init_beeps_processor();
|
@@ -47,6 +52,9 @@ extern "C" void
|
|
47
52
|
Init_beeps_gain();
|
48
53
|
Init_beeps_mixer();
|
49
54
|
Init_beeps_envelope();
|
55
|
+
Init_beeps_low_pass();
|
56
|
+
Init_beeps_high_pass();
|
57
|
+
Init_beeps_reverb();
|
50
58
|
Init_beeps_time_stretch();
|
51
59
|
Init_beeps_pitch_shift();
|
52
60
|
Init_beeps_analyser();
|
data/ext/beeps/oscillator.cpp
CHANGED
@@ -46,12 +46,12 @@ RUCY_DEF1(set_samples, samples)
|
|
46
46
|
Value* array = samples.as_array();
|
47
47
|
size_t size = samples.size();
|
48
48
|
|
49
|
-
std::vector<
|
50
|
-
|
49
|
+
std::vector<Beeps::Sample> data;
|
50
|
+
data.reserve(size);
|
51
51
|
for (size_t i = 0; i < size; ++i)
|
52
|
-
|
52
|
+
data.push_back(to<Beeps::Sample>(array[i]));
|
53
53
|
|
54
|
-
THIS->set_samples(&
|
54
|
+
THIS->set_samples(&data[0], data.size());
|
55
55
|
}
|
56
56
|
RUCY_END
|
57
57
|
|
@@ -60,13 +60,13 @@ RUCY_DEF0(each_sample)
|
|
60
60
|
{
|
61
61
|
CHECK;
|
62
62
|
|
63
|
-
const
|
64
|
-
size_t size
|
65
|
-
if (!
|
63
|
+
const Beeps::Sample* samples = THIS->samples();
|
64
|
+
size_t size = THIS->nsamples();
|
65
|
+
if (!samples || size == 0) return Qnil;
|
66
66
|
|
67
67
|
Value ret;
|
68
68
|
for (size_t i = 0; i < size; ++i)
|
69
|
-
ret = rb_yield(value(
|
69
|
+
ret = rb_yield(value((float) samples[i]));
|
70
70
|
return ret;
|
71
71
|
}
|
72
72
|
RUCY_END
|
@@ -76,7 +76,11 @@ RUCY_DEF1(set_frequency, frequency)
|
|
76
76
|
{
|
77
77
|
CHECK;
|
78
78
|
|
79
|
-
|
79
|
+
if (frequency.is_a(Beeps::processor_class()))
|
80
|
+
THIS->set_frequency(to<Beeps::Processor*>(frequency));
|
81
|
+
else
|
82
|
+
THIS->set_frequency(to<float>(frequency));
|
83
|
+
|
80
84
|
return frequency;
|
81
85
|
}
|
82
86
|
RUCY_END
|
@@ -95,7 +99,11 @@ RUCY_DEF1(set_phase, phase)
|
|
95
99
|
{
|
96
100
|
CHECK;
|
97
101
|
|
98
|
-
|
102
|
+
if (phase.is_a(Beeps::processor_class()))
|
103
|
+
THIS->set_phase(to<Beeps::Processor*>(phase));
|
104
|
+
else
|
105
|
+
THIS->set_phase(to<float>(phase));
|
106
|
+
|
99
107
|
return phase;
|
100
108
|
}
|
101
109
|
RUCY_END
|
@@ -109,6 +117,75 @@ RUCY_DEF0(get_phase)
|
|
109
117
|
}
|
110
118
|
RUCY_END
|
111
119
|
|
120
|
+
static
|
121
|
+
RUCY_DEF1(set_gain, gain)
|
122
|
+
{
|
123
|
+
CHECK;
|
124
|
+
|
125
|
+
if (gain.is_a(Beeps::processor_class()))
|
126
|
+
THIS->set_gain(to<Beeps::Processor*>(gain));
|
127
|
+
else
|
128
|
+
THIS->set_gain(to<float>(gain));
|
129
|
+
|
130
|
+
return gain;
|
131
|
+
}
|
132
|
+
RUCY_END
|
133
|
+
|
134
|
+
static
|
135
|
+
RUCY_DEF0(get_gain)
|
136
|
+
{
|
137
|
+
CHECK;
|
138
|
+
|
139
|
+
return value(THIS->gain());
|
140
|
+
}
|
141
|
+
RUCY_END
|
142
|
+
|
143
|
+
static
|
144
|
+
RUCY_DEF1(set_offset, offset)
|
145
|
+
{
|
146
|
+
CHECK;
|
147
|
+
|
148
|
+
if (offset.is_a(Beeps::processor_class()))
|
149
|
+
THIS->set_offset(to<Beeps::Processor*>(offset));
|
150
|
+
else
|
151
|
+
THIS->set_offset(to<float>(offset));
|
152
|
+
|
153
|
+
return offset;
|
154
|
+
}
|
155
|
+
RUCY_END
|
156
|
+
|
157
|
+
static
|
158
|
+
RUCY_DEF0(get_offset)
|
159
|
+
{
|
160
|
+
CHECK;
|
161
|
+
|
162
|
+
return value(THIS->offset());
|
163
|
+
}
|
164
|
+
RUCY_END
|
165
|
+
|
166
|
+
static
|
167
|
+
RUCY_DEF1(set_duty, duty)
|
168
|
+
{
|
169
|
+
CHECK;
|
170
|
+
|
171
|
+
if (duty.is_a(Beeps::processor_class()))
|
172
|
+
THIS->set_duty(to<Beeps::Processor*>(duty));
|
173
|
+
else
|
174
|
+
THIS->set_duty(to<float>(duty));
|
175
|
+
|
176
|
+
return duty;
|
177
|
+
}
|
178
|
+
RUCY_END
|
179
|
+
|
180
|
+
static
|
181
|
+
RUCY_DEF0(get_duty)
|
182
|
+
{
|
183
|
+
CHECK;
|
184
|
+
|
185
|
+
return value(THIS->duty());
|
186
|
+
}
|
187
|
+
RUCY_END
|
188
|
+
|
112
189
|
|
113
190
|
static Class cOscillator;
|
114
191
|
|
@@ -125,8 +202,14 @@ Init_beeps_oscillator ()
|
|
125
202
|
cOscillator.define_method("each_sample!", each_sample);
|
126
203
|
cOscillator.define_method("frequency=", set_frequency);
|
127
204
|
cOscillator.define_method("frequency", get_frequency);
|
128
|
-
cOscillator.define_method("phase=",
|
129
|
-
cOscillator.define_method("phase",
|
205
|
+
cOscillator.define_method("phase=", set_phase);
|
206
|
+
cOscillator.define_method("phase", get_phase);
|
207
|
+
cOscillator.define_method("gain=", set_gain);
|
208
|
+
cOscillator.define_method("gain", get_gain);
|
209
|
+
cOscillator.define_method("offset=", set_offset);
|
210
|
+
cOscillator.define_method("offset", get_offset);
|
211
|
+
cOscillator.define_method("duty=", set_duty);
|
212
|
+
cOscillator.define_method("duty", get_duty);
|
130
213
|
|
131
214
|
cOscillator.define_const("TYPE_NONE", Beeps::Oscillator::TYPE_NONE);
|
132
215
|
cOscillator.define_const("SINE", Beeps::Oscillator::SINE);
|
data/ext/beeps/processor.cpp
CHANGED
@@ -1,6 +1,7 @@
|
|
1
1
|
#include "beeps/ruby/processor.h"
|
2
2
|
|
3
3
|
|
4
|
+
#include "beeps/ruby/signals.h"
|
4
5
|
#include "beeps/exception.h"
|
5
6
|
#include "defs.h"
|
6
7
|
|
@@ -17,7 +18,7 @@ RUCY_DEFINE_WRAPPER_VALUE_FROM_TO(BEEPS_EXPORT, Beeps::Processor)
|
|
17
18
|
static
|
18
19
|
RUCY_DEF_ALLOC(alloc, klass)
|
19
20
|
{
|
20
|
-
Beeps::beeps_error(__FILE__, __LINE__);
|
21
|
+
Beeps::beeps_error(__FILE__, __LINE__, "can not instantiate Processor class.");
|
21
22
|
}
|
22
23
|
RUCY_END
|
23
24
|
|
@@ -58,6 +59,17 @@ RUCY_DEF0(on_start)
|
|
58
59
|
}
|
59
60
|
RUCY_END
|
60
61
|
|
62
|
+
static
|
63
|
+
RUCY_DEF4(get_signals, processor, seconds, nchannels, sample_rate)
|
64
|
+
{
|
65
|
+
return value(Beeps::get_signals(
|
66
|
+
to<Beeps::Processor*>(processor),
|
67
|
+
to<float> (seconds),
|
68
|
+
to<uint> (nchannels),
|
69
|
+
to<double> (sample_rate)));
|
70
|
+
}
|
71
|
+
RUCY_END
|
72
|
+
|
61
73
|
|
62
74
|
static Class cProcessor;
|
63
75
|
|
@@ -72,6 +84,8 @@ Init_beeps_processor ()
|
|
72
84
|
cProcessor.define_method("input=", set_input);
|
73
85
|
cProcessor.define_method("input", get_input);
|
74
86
|
cProcessor.define_method("on_start", on_start);
|
87
|
+
|
88
|
+
cProcessor.define_singleton_method("get_signals!", get_signals);
|
75
89
|
}
|
76
90
|
|
77
91
|
|
@@ -0,0 +1,106 @@
|
|
1
|
+
#include "beeps/ruby/filter.h"
|
2
|
+
|
3
|
+
|
4
|
+
#include "beeps/ruby/processor.h"
|
5
|
+
#include "defs.h"
|
6
|
+
|
7
|
+
|
8
|
+
RUCY_DEFINE_WRAPPER_VALUE_FROM_TO(BEEPS_EXPORT, Beeps::Reverb)
|
9
|
+
|
10
|
+
#define THIS to<Beeps::Reverb*>(self)
|
11
|
+
|
12
|
+
#define CHECK RUCY_CHECK_OBJ(Beeps::Reverb, self)
|
13
|
+
|
14
|
+
|
15
|
+
static
|
16
|
+
RUCY_DEF_ALLOC(alloc, klass)
|
17
|
+
{
|
18
|
+
return value(new Beeps::RubyProcessor<Beeps::Reverb>, klass);
|
19
|
+
}
|
20
|
+
RUCY_END
|
21
|
+
|
22
|
+
static
|
23
|
+
RUCY_DEF1(set_mix, mix)
|
24
|
+
{
|
25
|
+
CHECK;
|
26
|
+
|
27
|
+
THIS->set_mix(to<float>(mix));
|
28
|
+
}
|
29
|
+
RUCY_END
|
30
|
+
|
31
|
+
static
|
32
|
+
RUCY_DEF0(get_mix)
|
33
|
+
{
|
34
|
+
CHECK;
|
35
|
+
|
36
|
+
return value(THIS->mix());
|
37
|
+
}
|
38
|
+
RUCY_END
|
39
|
+
|
40
|
+
static
|
41
|
+
RUCY_DEF1(set_room_size, size)
|
42
|
+
{
|
43
|
+
CHECK;
|
44
|
+
|
45
|
+
THIS->set_room_size(to<float>(size));
|
46
|
+
}
|
47
|
+
RUCY_END
|
48
|
+
|
49
|
+
static
|
50
|
+
RUCY_DEF0(get_room_size)
|
51
|
+
{
|
52
|
+
CHECK;
|
53
|
+
|
54
|
+
return value(THIS->room_size());
|
55
|
+
}
|
56
|
+
RUCY_END
|
57
|
+
|
58
|
+
static
|
59
|
+
RUCY_DEF1(set_damping, damping)
|
60
|
+
{
|
61
|
+
CHECK;
|
62
|
+
|
63
|
+
THIS->set_damping(to<float>(damping));
|
64
|
+
}
|
65
|
+
RUCY_END
|
66
|
+
|
67
|
+
static
|
68
|
+
RUCY_DEF0(get_damping)
|
69
|
+
{
|
70
|
+
CHECK;
|
71
|
+
|
72
|
+
return value(THIS->damping());
|
73
|
+
}
|
74
|
+
RUCY_END
|
75
|
+
|
76
|
+
|
77
|
+
static Class cReverb;
|
78
|
+
|
79
|
+
void
|
80
|
+
Init_beeps_reverb ()
|
81
|
+
{
|
82
|
+
Module mBeeps = define_module("Beeps");
|
83
|
+
|
84
|
+
cReverb = mBeeps.define_class("Reverb", Beeps::processor_class());
|
85
|
+
cReverb.define_alloc_func(alloc);
|
86
|
+
cReverb.define_method("mix=", set_mix);
|
87
|
+
cReverb.define_method("mix", get_mix);
|
88
|
+
cReverb.define_method("room_size=", set_room_size);
|
89
|
+
cReverb.define_method("room_size", get_room_size);
|
90
|
+
cReverb.define_method("damping=", set_damping);
|
91
|
+
cReverb.define_method("damping", get_damping);
|
92
|
+
}
|
93
|
+
|
94
|
+
|
95
|
+
namespace Beeps
|
96
|
+
{
|
97
|
+
|
98
|
+
|
99
|
+
Class
|
100
|
+
reverb_class ()
|
101
|
+
{
|
102
|
+
return cReverb;
|
103
|
+
}
|
104
|
+
|
105
|
+
|
106
|
+
}// Beeps
|
@@ -0,0 +1,136 @@
|
|
1
|
+
#include "beeps/ruby/signals.h"
|
2
|
+
|
3
|
+
|
4
|
+
#include "defs.h"
|
5
|
+
|
6
|
+
|
7
|
+
RUCY_DEFINE_VALUE_FROM_TO(BEEPS_EXPORT, Beeps::Signals)
|
8
|
+
|
9
|
+
#define THIS to<Beeps::Signals*>(self)
|
10
|
+
|
11
|
+
#define CHECK RUCY_CHECK_OBJ(Beeps::Signals, self)
|
12
|
+
|
13
|
+
|
14
|
+
static
|
15
|
+
RUCY_DEF_ALLOC(alloc, klass)
|
16
|
+
{
|
17
|
+
return new_type<Beeps::Signals>(klass);
|
18
|
+
}
|
19
|
+
RUCY_END
|
20
|
+
|
21
|
+
static
|
22
|
+
RUCY_DEF1(initialize_copy, obj)
|
23
|
+
{
|
24
|
+
CHECK;
|
25
|
+
*THIS = to<Beeps::Signals*>(obj)->dup();
|
26
|
+
return self;
|
27
|
+
}
|
28
|
+
RUCY_END
|
29
|
+
|
30
|
+
static
|
31
|
+
RUCY_DEF0(get_sample_rate)
|
32
|
+
{
|
33
|
+
CHECK;
|
34
|
+
|
35
|
+
return value(THIS->sample_rate());
|
36
|
+
}
|
37
|
+
RUCY_END
|
38
|
+
|
39
|
+
static
|
40
|
+
RUCY_DEF0(get_nchannels)
|
41
|
+
{
|
42
|
+
CHECK;
|
43
|
+
|
44
|
+
return value(THIS->nchannels());
|
45
|
+
}
|
46
|
+
RUCY_END
|
47
|
+
|
48
|
+
static
|
49
|
+
RUCY_DEF0(get_nsamples)
|
50
|
+
{
|
51
|
+
CHECK;
|
52
|
+
|
53
|
+
return value(THIS->nsamples());
|
54
|
+
}
|
55
|
+
RUCY_END
|
56
|
+
|
57
|
+
static
|
58
|
+
RUCY_DEF0(get_capacity)
|
59
|
+
{
|
60
|
+
CHECK;
|
61
|
+
|
62
|
+
return value(THIS->capacity());
|
63
|
+
}
|
64
|
+
RUCY_END
|
65
|
+
|
66
|
+
static
|
67
|
+
RUCY_DEF0(is_empty)
|
68
|
+
{
|
69
|
+
CHECK;
|
70
|
+
|
71
|
+
return value(THIS->empty());
|
72
|
+
}
|
73
|
+
RUCY_END
|
74
|
+
|
75
|
+
static
|
76
|
+
RUCY_DEF1(each, channel_)
|
77
|
+
{
|
78
|
+
CHECK;
|
79
|
+
|
80
|
+
uint nchannels = THIS->nchannels();
|
81
|
+
uint nsamples = THIS->nsamples();
|
82
|
+
const auto* samples = THIS->samples();
|
83
|
+
|
84
|
+
if (channel_)
|
85
|
+
{
|
86
|
+
int channel = to<int>(channel_);
|
87
|
+
if (channel < 0)
|
88
|
+
argument_error(__FILE__, __LINE__);
|
89
|
+
if (channel >= nchannels)
|
90
|
+
argument_error(__FILE__, __LINE__);
|
91
|
+
|
92
|
+
const auto* p = samples + channel;
|
93
|
+
for (uint i = 0; i < nsamples; ++i, p += nchannels)
|
94
|
+
rb_yield(value(*p));
|
95
|
+
}
|
96
|
+
else
|
97
|
+
{
|
98
|
+
uint size = nsamples * nchannels;
|
99
|
+
for (uint i = 0; i < size; ++i)
|
100
|
+
rb_yield(value(samples[i]));
|
101
|
+
}
|
102
|
+
}
|
103
|
+
RUCY_END
|
104
|
+
|
105
|
+
|
106
|
+
static Class cSignals;
|
107
|
+
|
108
|
+
void
|
109
|
+
Init_beeps_signals ()
|
110
|
+
{
|
111
|
+
Module mBeeps = define_module("Beeps");
|
112
|
+
|
113
|
+
cSignals = mBeeps.define_class("Signals");
|
114
|
+
cSignals.define_alloc_func(alloc);
|
115
|
+
cSignals.define_private_method("initialize_copy", initialize_copy);
|
116
|
+
cSignals.define_method("sample_rate", get_sample_rate);
|
117
|
+
cSignals.define_method("nchannels", get_nchannels);
|
118
|
+
cSignals.define_method("nsamples", get_nsamples);
|
119
|
+
cSignals.define_method("capacity", get_capacity);
|
120
|
+
cSignals.define_method("empty?", is_empty);
|
121
|
+
cSignals.define_method("each!", each);
|
122
|
+
}
|
123
|
+
|
124
|
+
|
125
|
+
namespace Beeps
|
126
|
+
{
|
127
|
+
|
128
|
+
|
129
|
+
Class
|
130
|
+
signals_class ()
|
131
|
+
{
|
132
|
+
return cSignals;
|
133
|
+
}
|
134
|
+
|
135
|
+
|
136
|
+
}// Beeps
|
data/include/beeps/beeps.h
CHANGED