beeps 0.3.3 → 0.3.4
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/mixer.cpp +85 -0
- data/.doc/ext/beeps/native.cpp +2 -0
- data/.doc/ext/beeps/oscillator.cpp +54 -0
- data/.doc/ext/beeps/processor.cpp +10 -0
- data/ChangeLog.md +23 -0
- data/VERSION +1 -1
- data/beeps.gemspec +4 -2
- data/ext/beeps/mixer.cpp +89 -0
- data/ext/beeps/native.cpp +2 -0
- data/ext/beeps/oscillator.cpp +58 -0
- data/ext/beeps/processor.cpp +11 -0
- data/include/beeps/filter.h +41 -0
- data/include/beeps/generator.h +16 -1
- data/include/beeps/processor.h +2 -0
- data/include/beeps/ruby/filter.h +11 -0
- data/include/beeps/ruby/processor.h +17 -1
- data/lib/beeps/processor.rb +76 -17
- data/src/envelope.cpp +14 -5
- data/src/mixer.cpp +112 -0
- data/src/oscillator.cpp +280 -6
- data/src/processor.cpp +14 -7
- data/src/signals.cpp +24 -6
- data/src/signals.h +8 -1
- data/test/test_processor.rb +1 -1
- metadata +16 -11
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 5d9c6ae53f77b24432e874ac56187e8c448347750683dd92f74b22fc1615cfad
|
4
|
+
data.tar.gz: 8c112bf5ddfdb4873a6bd21fd8176d355bf140f1f331b101a59e50262e7f3f3a
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 9dcf30f834b652150b9b67a3360468b47540ad48cc86da0ed24f0c4feb3d9a9f14cd16c388c0ec36bdd2ac3c5e4ae61007670818b0d5d838ff9714ee4832a6ca
|
7
|
+
data.tar.gz: d3fc7fc4f8342037839eb56e797fb9b31a35cf13916c267c85fa593039e3223fb7b9601daccd4430dce415324050bf7af01bd9db80cc9629bf13a7c246e54f12
|
@@ -0,0 +1,85 @@
|
|
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::Mixer)
|
9
|
+
|
10
|
+
#define THIS to<Beeps::Mixer*>(self)
|
11
|
+
|
12
|
+
#define CHECK RUCY_CHECK_OBJ(Beeps::Mixer, self)
|
13
|
+
|
14
|
+
|
15
|
+
static
|
16
|
+
VALUE alloc(VALUE klass)
|
17
|
+
{
|
18
|
+
return value(new Beeps::RubyProcessor<Beeps::Mixer>, klass);
|
19
|
+
}
|
20
|
+
|
21
|
+
static
|
22
|
+
VALUE add_input(VALUE self, VALUE inputs)
|
23
|
+
{
|
24
|
+
CHECK;
|
25
|
+
|
26
|
+
const Value* array = inputs.as_array();
|
27
|
+
size_t size = inputs.size();
|
28
|
+
|
29
|
+
for (size_t i = 0; i < size; ++i)
|
30
|
+
THIS->add_input(to<Beeps::Processor*>(array[i]));
|
31
|
+
return inputs;
|
32
|
+
}
|
33
|
+
|
34
|
+
static
|
35
|
+
VALUE remove_input(VALUE self, VALUE inputs)
|
36
|
+
{
|
37
|
+
CHECK;
|
38
|
+
|
39
|
+
const Value* array = inputs.as_array();
|
40
|
+
size_t size = inputs.size();
|
41
|
+
|
42
|
+
for (size_t i = 0; i < size; ++i)
|
43
|
+
THIS->remove_input(to<Beeps::Processor*>(array[i]));
|
44
|
+
return inputs;
|
45
|
+
}
|
46
|
+
|
47
|
+
static
|
48
|
+
VALUE each_input(VALUE self)
|
49
|
+
{
|
50
|
+
CHECK;
|
51
|
+
|
52
|
+
Value ret;
|
53
|
+
for (auto& input : *THIS)
|
54
|
+
ret = rb_yield(value(input.get()));
|
55
|
+
return ret;
|
56
|
+
}
|
57
|
+
|
58
|
+
|
59
|
+
static Class cMixer;
|
60
|
+
|
61
|
+
void
|
62
|
+
Init_beeps_mixer ()
|
63
|
+
{
|
64
|
+
Module mBeeps = rb_define_module("Beeps");
|
65
|
+
|
66
|
+
cMixer = mBeeps.define_class("Mixer", Beeps::processor_class());
|
67
|
+
rb_define_alloc_func(cMixer, alloc);
|
68
|
+
cMixer.define_method( "add_input!", add_input);
|
69
|
+
cMixer.define_method("remove_input!", remove_input);
|
70
|
+
cMixer.define_method( "each_input!", each_input);
|
71
|
+
}
|
72
|
+
|
73
|
+
|
74
|
+
namespace Beeps
|
75
|
+
{
|
76
|
+
|
77
|
+
|
78
|
+
Class
|
79
|
+
mixer_class ()
|
80
|
+
{
|
81
|
+
return cMixer;
|
82
|
+
}
|
83
|
+
|
84
|
+
|
85
|
+
}// Beeps
|
data/.doc/ext/beeps/native.cpp
CHANGED
@@ -14,6 +14,7 @@ void Init_beeps_file_in ();
|
|
14
14
|
void Init_beeps_mic_in ();
|
15
15
|
|
16
16
|
void Init_beeps_gain ();
|
17
|
+
void Init_beeps_mixer ();
|
17
18
|
void Init_beeps_envelope ();
|
18
19
|
void Init_beeps_time_stretch ();
|
19
20
|
void Init_beeps_pitch_shift ();
|
@@ -44,6 +45,7 @@ extern "C" void
|
|
44
45
|
Init_beeps_mic_in();
|
45
46
|
|
46
47
|
Init_beeps_gain();
|
48
|
+
Init_beeps_mixer();
|
47
49
|
Init_beeps_envelope();
|
48
50
|
Init_beeps_time_stretch();
|
49
51
|
Init_beeps_pitch_shift();
|
@@ -35,6 +35,37 @@ VALUE get_type(VALUE self)
|
|
35
35
|
return value(THIS->type());
|
36
36
|
}
|
37
37
|
|
38
|
+
static
|
39
|
+
VALUE set_samples(VALUE self, VALUE samples)
|
40
|
+
{
|
41
|
+
CHECK;
|
42
|
+
|
43
|
+
Value* array = samples.as_array();
|
44
|
+
size_t size = samples.size();
|
45
|
+
|
46
|
+
std::vector<float> floats;
|
47
|
+
floats.reserve(size);
|
48
|
+
for (size_t i = 0; i < size; ++i)
|
49
|
+
floats.push_back(to<float>(array[i]));
|
50
|
+
|
51
|
+
THIS->set_samples(&floats[0], floats.size());
|
52
|
+
}
|
53
|
+
|
54
|
+
static
|
55
|
+
VALUE each_sample(VALUE self)
|
56
|
+
{
|
57
|
+
CHECK;
|
58
|
+
|
59
|
+
const float* floats = THIS->samples();
|
60
|
+
size_t size = THIS->nsamples();
|
61
|
+
if (!floats || size == 0) return Qnil;
|
62
|
+
|
63
|
+
Value ret;
|
64
|
+
for (size_t i = 0; i < size; ++i)
|
65
|
+
ret = rb_yield(value(floats[i]));
|
66
|
+
return ret;
|
67
|
+
}
|
68
|
+
|
38
69
|
static
|
39
70
|
VALUE set_frequency(VALUE self, VALUE frequency)
|
40
71
|
{
|
@@ -52,6 +83,23 @@ VALUE get_frequency(VALUE self)
|
|
52
83
|
return value(THIS->frequency());
|
53
84
|
}
|
54
85
|
|
86
|
+
static
|
87
|
+
VALUE set_phase(VALUE self, VALUE phase)
|
88
|
+
{
|
89
|
+
CHECK;
|
90
|
+
|
91
|
+
THIS->set_phase(to<float>(phase));
|
92
|
+
return phase;
|
93
|
+
}
|
94
|
+
|
95
|
+
static
|
96
|
+
VALUE get_phase(VALUE self)
|
97
|
+
{
|
98
|
+
CHECK;
|
99
|
+
|
100
|
+
return value(THIS->phase());
|
101
|
+
}
|
102
|
+
|
55
103
|
|
56
104
|
static Class cOscillator;
|
57
105
|
|
@@ -64,14 +112,20 @@ Init_beeps_oscillator ()
|
|
64
112
|
rb_define_alloc_func(cOscillator, alloc);
|
65
113
|
rb_define_method(cOscillator, "type=", RUBY_METHOD_FUNC(set_type), 1);
|
66
114
|
rb_define_method(cOscillator, "type", RUBY_METHOD_FUNC(get_type), 0);
|
115
|
+
rb_define_method(cOscillator, "samples=", RUBY_METHOD_FUNC(set_samples), 1);
|
116
|
+
cOscillator.define_method("each_sample!", each_sample);
|
67
117
|
rb_define_method(cOscillator, "frequency=", RUBY_METHOD_FUNC(set_frequency), 1);
|
68
118
|
rb_define_method(cOscillator, "frequency", RUBY_METHOD_FUNC(get_frequency), 0);
|
119
|
+
rb_define_method(cOscillator, "phase=", RUBY_METHOD_FUNC(set_phase), 1);
|
120
|
+
rb_define_method(cOscillator, "phase", RUBY_METHOD_FUNC(get_phase), 0);
|
69
121
|
|
70
122
|
cOscillator.define_const("TYPE_NONE", Beeps::Oscillator::TYPE_NONE);
|
71
123
|
cOscillator.define_const("SINE", Beeps::Oscillator::SINE);
|
72
124
|
cOscillator.define_const("TRIANGLE", Beeps::Oscillator::TRIANGLE);
|
73
125
|
cOscillator.define_const("SQUARE", Beeps::Oscillator::SQUARE);
|
74
126
|
cOscillator.define_const("SAWTOOTH", Beeps::Oscillator::SAWTOOTH);
|
127
|
+
cOscillator.define_const("NOISE", Beeps::Oscillator::NOISE);
|
128
|
+
cOscillator.define_const("SAMPLES", Beeps::Oscillator::SAMPLES);
|
75
129
|
}
|
76
130
|
|
77
131
|
|
@@ -11,6 +11,8 @@ RUCY_DEFINE_WRAPPER_VALUE_FROM_TO(BEEPS_EXPORT, Beeps::Processor)
|
|
11
11
|
|
12
12
|
#define CHECK RUCY_CHECK_OBJ(Beeps::Processor, self)
|
13
13
|
|
14
|
+
#define CALL(fun) RUCY_CALL_SUPER(THIS, fun)
|
15
|
+
|
14
16
|
|
15
17
|
static
|
16
18
|
VALUE alloc(VALUE klass)
|
@@ -44,6 +46,13 @@ VALUE get_input(VALUE self)
|
|
44
46
|
return value(THIS->input());
|
45
47
|
}
|
46
48
|
|
49
|
+
static
|
50
|
+
VALUE on_start(VALUE self)
|
51
|
+
{
|
52
|
+
CHECK;
|
53
|
+
CALL(on_start());
|
54
|
+
}
|
55
|
+
|
47
56
|
|
48
57
|
static Class cProcessor;
|
49
58
|
|
@@ -57,6 +66,7 @@ Init_beeps_processor ()
|
|
57
66
|
rb_define_method(cProcessor, "reset", RUBY_METHOD_FUNC(reset), 0);
|
58
67
|
rb_define_method(cProcessor, "input=", RUBY_METHOD_FUNC(set_input), 1);
|
59
68
|
rb_define_method(cProcessor, "input", RUBY_METHOD_FUNC(get_input), 0);
|
69
|
+
rb_define_method(cProcessor, "on_start", RUBY_METHOD_FUNC(on_start), 0);
|
60
70
|
}
|
61
71
|
|
62
72
|
|
data/ChangeLog.md
CHANGED
@@ -1,6 +1,29 @@
|
|
1
1
|
# beeps ChangeLog
|
2
2
|
|
3
3
|
|
4
|
+
## [v0.3.4] - 2025-03-07
|
5
|
+
|
6
|
+
- Add Mixer class
|
7
|
+
- Add Processor#add_input
|
8
|
+
- Add Processor#on_start
|
9
|
+
- Add new oscillator type NOISE
|
10
|
+
- Add new oscillator type SAMPLES, and add Oscillator#samples=
|
11
|
+
- Add Oscillator#phase/phase=
|
12
|
+
- Add 'openal' to msys2_mingw_dependencies
|
13
|
+
|
14
|
+
- Processor.new can take inputs
|
15
|
+
- Processor#<< returns self
|
16
|
+
- Square and sawtooth oscillators discard the first some amount of samples
|
17
|
+
- Oscillator::set_type() takes over the phase value
|
18
|
+
- Noise oscillator can take frequency parameter
|
19
|
+
- Gain#initialize can take param for gain
|
20
|
+
- Envelop's default attack, decay, and release time are changed from 0.01 to 0.005
|
21
|
+
- Envelop#initialize can take attack, decay, sustain, and release params
|
22
|
+
- The attack and release can be canceled by passing 0 to the attack_time and release_time of the Envelope
|
23
|
+
|
24
|
+
- Temporarily delete Processor#<< to review specifications
|
25
|
+
|
26
|
+
|
4
27
|
## [v0.3.3] - 2025-01-23
|
5
28
|
|
6
29
|
- Update dependencies
|
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
0.3.
|
1
|
+
0.3.4
|
data/beeps.gemspec
CHANGED
@@ -25,8 +25,8 @@ Gem::Specification.new do |s|
|
|
25
25
|
s.platform = Gem::Platform::RUBY
|
26
26
|
s.required_ruby_version = '>= 3.0.0'
|
27
27
|
|
28
|
-
s.add_dependency 'xot', '~> 0.3.
|
29
|
-
s.add_dependency 'rucy', '~> 0.3.
|
28
|
+
s.add_dependency 'xot', '~> 0.3.4', '>= 0.3.4'
|
29
|
+
s.add_dependency 'rucy', '~> 0.3.4', '>= 0.3.4'
|
30
30
|
|
31
31
|
s.files = `git ls-files`.split $/
|
32
32
|
s.executables = s.files.grep(%r{^bin/}) {|f| File.basename f}
|
@@ -34,5 +34,7 @@ Gem::Specification.new do |s|
|
|
34
34
|
s.extra_rdoc_files = rdocs.to_a
|
35
35
|
s.has_rdoc = true
|
36
36
|
|
37
|
+
s.metadata['msys2_mingw_dependencies'] = 'openal'
|
38
|
+
|
37
39
|
s.extensions << 'Rakefile'
|
38
40
|
end
|
data/ext/beeps/mixer.cpp
ADDED
@@ -0,0 +1,89 @@
|
|
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::Mixer)
|
9
|
+
|
10
|
+
#define THIS to<Beeps::Mixer*>(self)
|
11
|
+
|
12
|
+
#define CHECK RUCY_CHECK_OBJ(Beeps::Mixer, self)
|
13
|
+
|
14
|
+
|
15
|
+
static
|
16
|
+
RUCY_DEF_ALLOC(alloc, klass)
|
17
|
+
{
|
18
|
+
return value(new Beeps::RubyProcessor<Beeps::Mixer>, klass);
|
19
|
+
}
|
20
|
+
RUCY_END
|
21
|
+
|
22
|
+
static
|
23
|
+
RUCY_DEF1(add_input, inputs)
|
24
|
+
{
|
25
|
+
CHECK;
|
26
|
+
|
27
|
+
const Value* array = inputs.as_array();
|
28
|
+
size_t size = inputs.size();
|
29
|
+
|
30
|
+
for (size_t i = 0; i < size; ++i)
|
31
|
+
THIS->add_input(to<Beeps::Processor*>(array[i]));
|
32
|
+
return inputs;
|
33
|
+
}
|
34
|
+
RUCY_END
|
35
|
+
|
36
|
+
static
|
37
|
+
RUCY_DEF1(remove_input, inputs)
|
38
|
+
{
|
39
|
+
CHECK;
|
40
|
+
|
41
|
+
const Value* array = inputs.as_array();
|
42
|
+
size_t size = inputs.size();
|
43
|
+
|
44
|
+
for (size_t i = 0; i < size; ++i)
|
45
|
+
THIS->remove_input(to<Beeps::Processor*>(array[i]));
|
46
|
+
return inputs;
|
47
|
+
}
|
48
|
+
RUCY_END
|
49
|
+
|
50
|
+
static
|
51
|
+
RUCY_DEF0(each_input)
|
52
|
+
{
|
53
|
+
CHECK;
|
54
|
+
|
55
|
+
Value ret;
|
56
|
+
for (auto& input : *THIS)
|
57
|
+
ret = rb_yield(value(input.get()));
|
58
|
+
return ret;
|
59
|
+
}
|
60
|
+
RUCY_END
|
61
|
+
|
62
|
+
|
63
|
+
static Class cMixer;
|
64
|
+
|
65
|
+
void
|
66
|
+
Init_beeps_mixer ()
|
67
|
+
{
|
68
|
+
Module mBeeps = define_module("Beeps");
|
69
|
+
|
70
|
+
cMixer = mBeeps.define_class("Mixer", Beeps::processor_class());
|
71
|
+
cMixer.define_alloc_func(alloc);
|
72
|
+
cMixer.define_method( "add_input!", add_input);
|
73
|
+
cMixer.define_method("remove_input!", remove_input);
|
74
|
+
cMixer.define_method( "each_input!", each_input);
|
75
|
+
}
|
76
|
+
|
77
|
+
|
78
|
+
namespace Beeps
|
79
|
+
{
|
80
|
+
|
81
|
+
|
82
|
+
Class
|
83
|
+
mixer_class ()
|
84
|
+
{
|
85
|
+
return cMixer;
|
86
|
+
}
|
87
|
+
|
88
|
+
|
89
|
+
}// Beeps
|
data/ext/beeps/native.cpp
CHANGED
@@ -14,6 +14,7 @@ void Init_beeps_file_in ();
|
|
14
14
|
void Init_beeps_mic_in ();
|
15
15
|
|
16
16
|
void Init_beeps_gain ();
|
17
|
+
void Init_beeps_mixer ();
|
17
18
|
void Init_beeps_envelope ();
|
18
19
|
void Init_beeps_time_stretch ();
|
19
20
|
void Init_beeps_pitch_shift ();
|
@@ -44,6 +45,7 @@ extern "C" void
|
|
44
45
|
Init_beeps_mic_in();
|
45
46
|
|
46
47
|
Init_beeps_gain();
|
48
|
+
Init_beeps_mixer();
|
47
49
|
Init_beeps_envelope();
|
48
50
|
Init_beeps_time_stretch();
|
49
51
|
Init_beeps_pitch_shift();
|
data/ext/beeps/oscillator.cpp
CHANGED
@@ -38,6 +38,39 @@ RUCY_DEF0(get_type)
|
|
38
38
|
}
|
39
39
|
RUCY_END
|
40
40
|
|
41
|
+
static
|
42
|
+
RUCY_DEF1(set_samples, samples)
|
43
|
+
{
|
44
|
+
CHECK;
|
45
|
+
|
46
|
+
Value* array = samples.as_array();
|
47
|
+
size_t size = samples.size();
|
48
|
+
|
49
|
+
std::vector<float> floats;
|
50
|
+
floats.reserve(size);
|
51
|
+
for (size_t i = 0; i < size; ++i)
|
52
|
+
floats.push_back(to<float>(array[i]));
|
53
|
+
|
54
|
+
THIS->set_samples(&floats[0], floats.size());
|
55
|
+
}
|
56
|
+
RUCY_END
|
57
|
+
|
58
|
+
static
|
59
|
+
RUCY_DEF0(each_sample)
|
60
|
+
{
|
61
|
+
CHECK;
|
62
|
+
|
63
|
+
const float* floats = THIS->samples();
|
64
|
+
size_t size = THIS->nsamples();
|
65
|
+
if (!floats || size == 0) return Qnil;
|
66
|
+
|
67
|
+
Value ret;
|
68
|
+
for (size_t i = 0; i < size; ++i)
|
69
|
+
ret = rb_yield(value(floats[i]));
|
70
|
+
return ret;
|
71
|
+
}
|
72
|
+
RUCY_END
|
73
|
+
|
41
74
|
static
|
42
75
|
RUCY_DEF1(set_frequency, frequency)
|
43
76
|
{
|
@@ -57,6 +90,25 @@ RUCY_DEF0(get_frequency)
|
|
57
90
|
}
|
58
91
|
RUCY_END
|
59
92
|
|
93
|
+
static
|
94
|
+
RUCY_DEF1(set_phase, phase)
|
95
|
+
{
|
96
|
+
CHECK;
|
97
|
+
|
98
|
+
THIS->set_phase(to<float>(phase));
|
99
|
+
return phase;
|
100
|
+
}
|
101
|
+
RUCY_END
|
102
|
+
|
103
|
+
static
|
104
|
+
RUCY_DEF0(get_phase)
|
105
|
+
{
|
106
|
+
CHECK;
|
107
|
+
|
108
|
+
return value(THIS->phase());
|
109
|
+
}
|
110
|
+
RUCY_END
|
111
|
+
|
60
112
|
|
61
113
|
static Class cOscillator;
|
62
114
|
|
@@ -69,14 +121,20 @@ Init_beeps_oscillator ()
|
|
69
121
|
cOscillator.define_alloc_func(alloc);
|
70
122
|
cOscillator.define_method("type=", set_type);
|
71
123
|
cOscillator.define_method("type", get_type);
|
124
|
+
cOscillator.define_method( "samples=", set_samples);
|
125
|
+
cOscillator.define_method("each_sample!", each_sample);
|
72
126
|
cOscillator.define_method("frequency=", set_frequency);
|
73
127
|
cOscillator.define_method("frequency", get_frequency);
|
128
|
+
cOscillator.define_method("phase=", set_phase);
|
129
|
+
cOscillator.define_method("phase", get_phase);
|
74
130
|
|
75
131
|
cOscillator.define_const("TYPE_NONE", Beeps::Oscillator::TYPE_NONE);
|
76
132
|
cOscillator.define_const("SINE", Beeps::Oscillator::SINE);
|
77
133
|
cOscillator.define_const("TRIANGLE", Beeps::Oscillator::TRIANGLE);
|
78
134
|
cOscillator.define_const("SQUARE", Beeps::Oscillator::SQUARE);
|
79
135
|
cOscillator.define_const("SAWTOOTH", Beeps::Oscillator::SAWTOOTH);
|
136
|
+
cOscillator.define_const("NOISE", Beeps::Oscillator::NOISE);
|
137
|
+
cOscillator.define_const("SAMPLES", Beeps::Oscillator::SAMPLES);
|
80
138
|
}
|
81
139
|
|
82
140
|
|
data/ext/beeps/processor.cpp
CHANGED
@@ -11,6 +11,8 @@ RUCY_DEFINE_WRAPPER_VALUE_FROM_TO(BEEPS_EXPORT, Beeps::Processor)
|
|
11
11
|
|
12
12
|
#define CHECK RUCY_CHECK_OBJ(Beeps::Processor, self)
|
13
13
|
|
14
|
+
#define CALL(fun) RUCY_CALL_SUPER(THIS, fun)
|
15
|
+
|
14
16
|
|
15
17
|
static
|
16
18
|
RUCY_DEF_ALLOC(alloc, klass)
|
@@ -48,6 +50,14 @@ RUCY_DEF0(get_input)
|
|
48
50
|
}
|
49
51
|
RUCY_END
|
50
52
|
|
53
|
+
static
|
54
|
+
RUCY_DEF0(on_start)
|
55
|
+
{
|
56
|
+
CHECK;
|
57
|
+
CALL(on_start());
|
58
|
+
}
|
59
|
+
RUCY_END
|
60
|
+
|
51
61
|
|
52
62
|
static Class cProcessor;
|
53
63
|
|
@@ -61,6 +71,7 @@ Init_beeps_processor ()
|
|
61
71
|
cProcessor.define_method("reset", reset);
|
62
72
|
cProcessor.define_method("input=", set_input);
|
63
73
|
cProcessor.define_method("input", get_input);
|
74
|
+
cProcessor.define_method("on_start", on_start);
|
64
75
|
}
|
65
76
|
|
66
77
|
|
data/include/beeps/filter.h
CHANGED
@@ -37,6 +37,47 @@ namespace Beeps
|
|
37
37
|
};// Gain
|
38
38
|
|
39
39
|
|
40
|
+
class Mixer : public Filter
|
41
|
+
{
|
42
|
+
|
43
|
+
typedef Filter Super;
|
44
|
+
|
45
|
+
public:
|
46
|
+
|
47
|
+
typedef std::vector<Processor::Ref> InputList;
|
48
|
+
|
49
|
+
typedef InputList:: iterator iterator;
|
50
|
+
|
51
|
+
typedef InputList::const_iterator const_iterator;
|
52
|
+
|
53
|
+
Mixer (Processor* input = NULL);
|
54
|
+
|
55
|
+
virtual ~Mixer ();
|
56
|
+
|
57
|
+
virtual void add_input (Processor* input);
|
58
|
+
|
59
|
+
virtual void remove_input (Processor* input);
|
60
|
+
|
61
|
+
virtual iterator begin ();
|
62
|
+
|
63
|
+
virtual const_iterator begin () const;
|
64
|
+
|
65
|
+
virtual iterator end ();
|
66
|
+
|
67
|
+
virtual const_iterator end () const;
|
68
|
+
|
69
|
+
virtual void filter (
|
70
|
+
Context* context, Signals* signals, uint* offset) override;
|
71
|
+
|
72
|
+
virtual operator bool () const override;
|
73
|
+
|
74
|
+
struct Data;
|
75
|
+
|
76
|
+
Xot::PImpl<Data> self;
|
77
|
+
|
78
|
+
};// Mixer
|
79
|
+
|
80
|
+
|
40
81
|
class Envelope : public Filter
|
41
82
|
{
|
42
83
|
|
data/include/beeps/generator.h
CHANGED
@@ -18,10 +18,15 @@ namespace Beeps
|
|
18
18
|
|
19
19
|
public:
|
20
20
|
|
21
|
-
enum Type
|
21
|
+
enum Type
|
22
|
+
{
|
23
|
+
TYPE_NONE = 0, SINE, TRIANGLE, SQUARE, SAWTOOTH, NOISE, SAMPLES
|
24
|
+
};
|
22
25
|
|
23
26
|
Oscillator (Type type = SINE);
|
24
27
|
|
28
|
+
Oscillator (float* samples, size_t size);
|
29
|
+
|
25
30
|
virtual ~Oscillator ();
|
26
31
|
|
27
32
|
virtual void reset () override;
|
@@ -30,10 +35,20 @@ namespace Beeps
|
|
30
35
|
|
31
36
|
virtual Type type () const;
|
32
37
|
|
38
|
+
virtual void set_samples (float* samples, size_t size);
|
39
|
+
|
40
|
+
virtual const float* samples () const;
|
41
|
+
|
42
|
+
virtual size_t nsamples () const;
|
43
|
+
|
33
44
|
virtual void set_frequency (float frequency);
|
34
45
|
|
35
46
|
virtual float frequency () const;
|
36
47
|
|
48
|
+
virtual void set_phase (float phase);
|
49
|
+
|
50
|
+
virtual float phase () const;
|
51
|
+
|
37
52
|
virtual void generate (
|
38
53
|
Context* context, Signals* signals, uint* offset) override;
|
39
54
|
|
data/include/beeps/processor.h
CHANGED
data/include/beeps/ruby/filter.h
CHANGED
@@ -11,6 +11,8 @@
|
|
11
11
|
|
12
12
|
RUCY_DECLARE_WRAPPER_VALUE_FROM_TO(BEEPS_EXPORT, Beeps::Gain)
|
13
13
|
|
14
|
+
RUCY_DECLARE_WRAPPER_VALUE_FROM_TO(BEEPS_EXPORT, Beeps::Mixer)
|
15
|
+
|
14
16
|
RUCY_DECLARE_WRAPPER_VALUE_FROM_TO(BEEPS_EXPORT, Beeps::Envelope)
|
15
17
|
|
16
18
|
RUCY_DECLARE_WRAPPER_VALUE_FROM_TO(BEEPS_EXPORT, Beeps::TimeStretch)
|
@@ -27,6 +29,9 @@ namespace Beeps
|
|
27
29
|
BEEPS_EXPORT Rucy::Class gain_class ();
|
28
30
|
// class Beeps::Gain
|
29
31
|
|
32
|
+
BEEPS_EXPORT Rucy::Class mixer_class ();
|
33
|
+
// class Beeps::Mixer
|
34
|
+
|
30
35
|
BEEPS_EXPORT Rucy::Class envelope_class ();
|
31
36
|
// class Beeps::Envelope
|
32
37
|
|
@@ -53,6 +58,12 @@ namespace Rucy
|
|
53
58
|
return Beeps::gain_class();
|
54
59
|
}
|
55
60
|
|
61
|
+
template <> inline Class
|
62
|
+
get_ruby_class<Beeps::Mixer> ()
|
63
|
+
{
|
64
|
+
return Beeps::mixer_class();
|
65
|
+
}
|
66
|
+
|
56
67
|
template <> inline Class
|
57
68
|
get_ruby_class<Beeps::Envelope> ()
|
58
69
|
{
|
@@ -21,7 +21,23 @@ namespace Beeps
|
|
21
21
|
|
22
22
|
|
23
23
|
template <typename T>
|
24
|
-
class RubyProcessor : public Rucy::ClassWrapper<T>
|
24
|
+
class RubyProcessor : public Rucy::ClassWrapper<T>
|
25
|
+
{
|
26
|
+
|
27
|
+
typedef Rucy::ClassWrapper<T> Super;
|
28
|
+
|
29
|
+
public:
|
30
|
+
|
31
|
+
virtual void on_start ()
|
32
|
+
{
|
33
|
+
RUCY_SYM(on_start);
|
34
|
+
if (this->is_overridable())
|
35
|
+
this->value.call(on_start);
|
36
|
+
else
|
37
|
+
Super::on_start();
|
38
|
+
}
|
39
|
+
|
40
|
+
};// RubyProcessor
|
25
41
|
|
26
42
|
|
27
43
|
}// Beeps
|