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.
Files changed (67) hide show
  1. checksums.yaml +4 -4
  2. data/.doc/ext/beeps/beeps.cpp +7 -0
  3. data/.doc/ext/beeps/high_pass.cpp +63 -0
  4. data/.doc/ext/beeps/low_pass.cpp +63 -0
  5. data/.doc/ext/beeps/native.cpp +8 -0
  6. data/.doc/ext/beeps/oscillator.cpp +87 -10
  7. data/.doc/ext/beeps/processor.cpp +14 -1
  8. data/.doc/ext/beeps/reverb.cpp +99 -0
  9. data/.doc/ext/beeps/signals.cpp +128 -0
  10. data/ChangeLog.md +24 -0
  11. data/Rakefile +1 -1
  12. data/VERSION +1 -1
  13. data/beeps.gemspec +2 -2
  14. data/ext/beeps/beeps.cpp +8 -0
  15. data/ext/beeps/high_pass.cpp +66 -0
  16. data/ext/beeps/low_pass.cpp +66 -0
  17. data/ext/beeps/native.cpp +8 -0
  18. data/ext/beeps/oscillator.cpp +95 -12
  19. data/ext/beeps/processor.cpp +15 -1
  20. data/ext/beeps/reverb.cpp +106 -0
  21. data/ext/beeps/signals.cpp +136 -0
  22. data/include/beeps/beeps.h +2 -2
  23. data/include/beeps/defs.h +3 -0
  24. data/include/beeps/filter.h +118 -17
  25. data/include/beeps/generator.h +50 -17
  26. data/include/beeps/processor.h +23 -6
  27. data/include/beeps/ruby/filter.h +33 -0
  28. data/include/beeps/ruby/signals.h +40 -0
  29. data/include/beeps/signals.h +1 -1
  30. data/lib/beeps/processor.rb +46 -1
  31. data/lib/beeps/signals.rb +19 -0
  32. data/lib/beeps.rb +1 -0
  33. data/src/analyser.cpp +34 -37
  34. data/src/beeps.cpp +7 -6
  35. data/src/envelope.cpp +60 -46
  36. data/src/file_in.cpp +6 -6
  37. data/src/gain.cpp +5 -5
  38. data/src/high_pass.cpp +57 -0
  39. data/src/low_pass.cpp +57 -0
  40. data/src/mic_in.cpp +16 -14
  41. data/src/mixer.cpp +38 -20
  42. data/src/oscillator.cpp +260 -168
  43. data/src/pitch_shift.cpp +6 -6
  44. data/src/processor.cpp +118 -11
  45. data/src/processor.h +8 -0
  46. data/src/reverb.cpp +124 -0
  47. data/src/sequencer.cpp +18 -14
  48. data/src/signals.cpp +264 -106
  49. data/src/signals.h +28 -89
  50. data/src/sound.cpp +28 -20
  51. data/src/time_stretch.cpp +6 -6
  52. data/src/win32/signals.cpp +8 -7
  53. data/src/x_pass.h +51 -0
  54. data/test/helper.rb +14 -0
  55. data/test/test_analyser.rb +26 -0
  56. data/test/test_envelope.rb +55 -0
  57. data/test/test_file_in.rb +22 -1
  58. data/test/test_gain.rb +28 -0
  59. data/test/test_high_pass.rb +41 -0
  60. data/test/test_low_pass.rb +41 -0
  61. data/test/test_mixer.rb +63 -0
  62. data/test/test_oscillator.rb +58 -0
  63. data/test/test_pitch_shift.rb +32 -0
  64. data/test/test_processor.rb +7 -0
  65. data/test/test_signals.rb +60 -0
  66. data/test/test_time_stretch.rb +36 -0
  67. 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();
@@ -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<float> floats;
50
- floats.reserve(size);
49
+ std::vector<Beeps::Sample> data;
50
+ data.reserve(size);
51
51
  for (size_t i = 0; i < size; ++i)
52
- floats.push_back(to<float>(array[i]));
52
+ data.push_back(to<Beeps::Sample>(array[i]));
53
53
 
54
- THIS->set_samples(&floats[0], floats.size());
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 float* floats = THIS->samples();
64
- size_t size = THIS->nsamples();
65
- if (!floats || size == 0) return Qnil;
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(floats[i]));
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
- THIS->set_frequency(to<float>(frequency));
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
- THIS->set_phase(to<float>(phase));
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=", set_phase);
129
- cOscillator.define_method("phase", get_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);
@@ -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
@@ -15,10 +15,10 @@ namespace Beeps
15
15
 
16
16
  void fin ();
17
17
 
18
- void process_streams ();
19
-
20
18
  double sample_rate ();
21
19
 
20
+ void process_streams ();
21
+
22
22
 
23
23
  }// Beeps
24
24
 
data/include/beeps/defs.h CHANGED
@@ -24,6 +24,9 @@ namespace Beeps
24
24
  using Xot::String;
25
25
 
26
26
 
27
+ typedef double Sample;
28
+
29
+
27
30
  }// Beeps
28
31
 
29
32