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