beeps 0.1.31 → 0.1.33

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 (81) hide show
  1. checksums.yaml +4 -4
  2. data/.doc/ext/beeps/adsr.cpp +139 -0
  3. data/.doc/ext/beeps/analyser.cpp +128 -0
  4. data/.doc/ext/beeps/beeps.cpp +9 -1
  5. data/.doc/ext/beeps/file_in.cpp +55 -9
  6. data/.doc/ext/beeps/gain.cpp +64 -0
  7. data/.doc/ext/beeps/mic_in.cpp +83 -0
  8. data/.doc/ext/beeps/native.cpp +20 -8
  9. data/.doc/ext/beeps/oscillator.cpp +88 -0
  10. data/.doc/ext/beeps/pitch_shift.cpp +64 -0
  11. data/.doc/ext/beeps/processor.cpp +31 -2
  12. data/.doc/ext/beeps/sound.cpp +90 -7
  13. data/.doc/ext/beeps/sound_player.cpp +156 -0
  14. data/.doc/ext/beeps/time_stretch.cpp +64 -0
  15. data/.github/workflows/release-gem.yml +62 -0
  16. data/.github/workflows/test.yml +0 -6
  17. data/.github/workflows/utils.rb +13 -5
  18. data/ChangeLog.md +13 -0
  19. data/Rakefile +27 -6
  20. data/VERSION +1 -1
  21. data/beeps.gemspec +2 -2
  22. data/ext/beeps/adsr.cpp +150 -0
  23. data/ext/beeps/analyser.cpp +134 -0
  24. data/ext/beeps/beeps.cpp +10 -1
  25. data/ext/beeps/extconf.rb +1 -2
  26. data/ext/beeps/file_in.cpp +60 -9
  27. data/ext/beeps/gain.cpp +67 -0
  28. data/ext/beeps/mic_in.cpp +88 -0
  29. data/ext/beeps/native.cpp +20 -8
  30. data/ext/beeps/oscillator.cpp +93 -0
  31. data/ext/beeps/pitch_shift.cpp +67 -0
  32. data/ext/beeps/processor.cpp +34 -2
  33. data/ext/beeps/sound.cpp +99 -7
  34. data/ext/beeps/sound_player.cpp +169 -0
  35. data/ext/beeps/time_stretch.cpp +67 -0
  36. data/include/beeps/beeps.h +2 -1
  37. data/include/beeps/filter.h +179 -0
  38. data/include/beeps/generator.h +120 -0
  39. data/include/beeps/processor.h +37 -68
  40. data/include/beeps/ruby/filter.h +78 -0
  41. data/include/beeps/ruby/generator.h +60 -0
  42. data/include/beeps/ruby/processor.h +5 -45
  43. data/include/beeps/ruby/sound.h +14 -3
  44. data/include/beeps/signals.h +10 -4
  45. data/include/beeps/sound.h +67 -2
  46. data/lib/beeps/beeps.rb +6 -1
  47. data/lib/beeps/processor.rb +95 -15
  48. data/lib/beeps/sound.rb +29 -2
  49. data/src/adsr.cpp +245 -0
  50. data/src/analyser.cpp +254 -0
  51. data/src/beeps.cpp +11 -2
  52. data/src/file_in.cpp +94 -0
  53. data/src/gain.cpp +55 -0
  54. data/src/mic_in.cpp +262 -0
  55. data/src/mic_in.h +20 -0
  56. data/src/openal.cpp +2 -1
  57. data/src/oscillator.cpp +145 -0
  58. data/src/osx/signals.mm +83 -0
  59. data/src/pitch_shift.cpp +82 -0
  60. data/src/processor.cpp +202 -88
  61. data/src/processor.h +98 -0
  62. data/src/signals.cpp +326 -20
  63. data/src/signals.h +192 -2
  64. data/src/sound.cpp +735 -113
  65. data/src/sound.h +6 -1
  66. data/src/time_stretch.cpp +91 -0
  67. data/test/helper.rb +2 -1
  68. data/test/test_beeps.rb +10 -7
  69. data/test/test_beeps_init.rb +18 -0
  70. data/test/test_file_in.rb +15 -0
  71. data/test/test_processor.rb +50 -0
  72. data/test/test_sound.rb +87 -11
  73. data/test/test_sound_player.rb +134 -0
  74. metadata +55 -17
  75. data/.doc/ext/beeps/sawtooth_wave.cpp +0 -61
  76. data/.doc/ext/beeps/sine_wave.cpp +0 -61
  77. data/.doc/ext/beeps/square_wave.cpp +0 -61
  78. data/.github/workflows/release.yml +0 -34
  79. data/ext/beeps/sawtooth_wave.cpp +0 -64
  80. data/ext/beeps/sine_wave.cpp +0 -64
  81. data/ext/beeps/square_wave.cpp +0 -64
@@ -0,0 +1,67 @@
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::PitchShift)
9
+
10
+ #define THIS to<Beeps::PitchShift*>(self)
11
+
12
+ #define CHECK RUCY_CHECK_OBJ(Beeps::PitchShift, self)
13
+
14
+
15
+ static
16
+ RUCY_DEF_ALLOC(alloc, klass)
17
+ {
18
+ return value(new Beeps::RubyProcessor<Beeps::PitchShift>, klass);
19
+ }
20
+ RUCY_END
21
+
22
+ static
23
+ RUCY_DEF1(set_shift, shift)
24
+ {
25
+ CHECK;
26
+
27
+ THIS->set_shift(to<float>(shift));
28
+ return shift;
29
+ }
30
+ RUCY_END
31
+
32
+ static
33
+ RUCY_DEF0(get_shift)
34
+ {
35
+ CHECK;
36
+
37
+ return value(THIS->shift());
38
+ }
39
+ RUCY_END
40
+
41
+
42
+ static Class cPitchShift;
43
+
44
+ void
45
+ Init_beeps_pitch_shift ()
46
+ {
47
+ Module mBeeps = define_module("Beeps");
48
+
49
+ cPitchShift = mBeeps.define_class("PitchShift", Beeps::processor_class());
50
+ cPitchShift.define_alloc_func(alloc);
51
+ cPitchShift.define_method("shift=", set_shift);
52
+ cPitchShift.define_method("shift", get_shift);
53
+ }
54
+
55
+
56
+ namespace Beeps
57
+ {
58
+
59
+
60
+ Class
61
+ pitch_shift_class ()
62
+ {
63
+ return cPitchShift;
64
+ }
65
+
66
+
67
+ }// Beeps
@@ -5,11 +5,11 @@
5
5
  #include "defs.h"
6
6
 
7
7
 
8
- RUCY_DEFINE_VALUE_FROM_TO(Beeps::Processor)
8
+ RUCY_DEFINE_WRAPPER_VALUE_FROM_TO(Beeps::Processor)
9
9
 
10
10
  #define THIS to<Beeps::Processor*>(self)
11
11
 
12
- #define CHECK RUCY_CHECK_OBJECT(Beeps::Processor, self)
12
+ #define CHECK RUCY_CHECK_OBJ(Beeps::Processor, self)
13
13
 
14
14
 
15
15
  static
@@ -19,6 +19,35 @@ RUCY_DEF_ALLOC(alloc, klass)
19
19
  }
20
20
  RUCY_END
21
21
 
22
+ static
23
+ RUCY_DEF0(reset)
24
+ {
25
+ CHECK;
26
+
27
+ THIS->reset();
28
+ return self;
29
+ }
30
+ RUCY_END
31
+
32
+ static
33
+ RUCY_DEF1(set_input, input)
34
+ {
35
+ CHECK;
36
+
37
+ THIS->set_input(input ? to<Beeps::Processor*>(input) : NULL);
38
+ return input;
39
+ }
40
+ RUCY_END
41
+
42
+ static
43
+ RUCY_DEF0(get_input)
44
+ {
45
+ CHECK;
46
+
47
+ return value(THIS->input());
48
+ }
49
+ RUCY_END
50
+
22
51
 
23
52
  static Class cProcessor;
24
53
 
@@ -29,6 +58,9 @@ Init_beeps_processor ()
29
58
 
30
59
  cProcessor = mBeeps.define_class("Processor");
31
60
  cProcessor.define_alloc_func(alloc);
61
+ cProcessor.define_method("reset", reset);
62
+ cProcessor.define_method("input=", set_input);
63
+ cProcessor.define_method("input", get_input);
32
64
  }
33
65
 
34
66
 
data/ext/beeps/sound.cpp CHANGED
@@ -8,7 +8,7 @@ RUCY_DEFINE_VALUE_FROM_TO(Beeps::Sound)
8
8
 
9
9
  #define THIS to<Beeps::Sound*>(self)
10
10
 
11
- #define CHECK RUCY_CHECK_OBJECT(Beeps::Sound, self)
11
+ #define CHECK RUCY_CHECK_OBJ(Beeps::Sound, self)
12
12
 
13
13
 
14
14
  static
@@ -19,11 +19,13 @@ RUCY_DEF_ALLOC(alloc, klass)
19
19
  RUCY_END
20
20
 
21
21
  static
22
- RUCY_DEF2(initialize, processor, seconds)
22
+ RUCY_DEF4(setup, processor, seconds, nchannels, sample_rate)
23
23
  {
24
- RUCY_CHECK_OBJ(Beeps::Sound, self);
24
+ CHECK;
25
25
 
26
- *THIS = Beeps::Sound(to<Beeps::Processor*>(processor), to<float>(seconds));
26
+ *THIS = Beeps::Sound(
27
+ to<Beeps::Processor*>(processor),
28
+ to<float>(seconds), to<uint>(nchannels), to<double>(sample_rate));
27
29
  return self;
28
30
  }
29
31
  RUCY_END
@@ -33,11 +35,92 @@ RUCY_DEF0(play)
33
35
  {
34
36
  CHECK;
35
37
 
36
- THIS->play();
38
+ return value(THIS->play());
39
+ }
40
+ RUCY_END
41
+
42
+ static
43
+ RUCY_DEF1(save, path)
44
+ {
45
+ CHECK;
46
+
47
+ THIS->save(path.c_str());
37
48
  return self;
38
49
  }
39
50
  RUCY_END
40
51
 
52
+ static
53
+ RUCY_DEF0(get_sample_rate)
54
+ {
55
+ CHECK;
56
+
57
+ return value(THIS->sample_rate());
58
+ }
59
+ RUCY_END
60
+
61
+ static
62
+ RUCY_DEF0(get_nchannels)
63
+ {
64
+ CHECK;
65
+
66
+ return value(THIS->nchannels());
67
+ }
68
+ RUCY_END
69
+
70
+ static
71
+ RUCY_DEF0(get_seconds)
72
+ {
73
+ CHECK;
74
+
75
+ return value(THIS->seconds());
76
+ }
77
+ RUCY_END
78
+
79
+ static
80
+ RUCY_DEF1(set_gain, gain)
81
+ {
82
+ CHECK;
83
+
84
+ THIS->set_gain(to<float>(gain));
85
+ return gain;
86
+ }
87
+ RUCY_END
88
+
89
+ static
90
+ RUCY_DEF0(get_gain)
91
+ {
92
+ CHECK;
93
+
94
+ return value(THIS->gain());
95
+ }
96
+ RUCY_END
97
+
98
+ static
99
+ RUCY_DEF1(set_loop, loop)
100
+ {
101
+ CHECK;
102
+
103
+ THIS->set_loop(to<bool>(loop));
104
+ return loop;
105
+ }
106
+ RUCY_END
107
+
108
+ static
109
+ RUCY_DEF0(get_loop)
110
+ {
111
+ CHECK;
112
+
113
+ return value(THIS->loop());
114
+ }
115
+ RUCY_END
116
+
117
+ static
118
+ RUCY_DEF1(load, path)
119
+ {
120
+ return value(Beeps::load_sound(to<const char*>(path)));
121
+ }
122
+ RUCY_END
123
+
41
124
 
42
125
  static Class cSound;
43
126
 
@@ -48,8 +131,17 @@ Init_beeps_sound ()
48
131
 
49
132
  cSound = mBeeps.define_class("Sound");
50
133
  cSound.define_alloc_func(alloc);
51
- cSound.define_private_method("initialize", initialize);
52
- cSound.define_method("play", play);
134
+ cSound.define_private_method("setup", setup);
135
+ cSound.define_private_method("play!", play);
136
+ cSound.define_method("save", save);
137
+ cSound.define_method("sample_rate", get_sample_rate);
138
+ cSound.define_method("nchannels", get_nchannels);
139
+ cSound.define_method("seconds", get_seconds);
140
+ cSound.define_method("gain=", set_gain);
141
+ cSound.define_method("gain", get_gain);
142
+ cSound.define_method("loop=", set_loop);
143
+ cSound.define_method("loop", get_loop);
144
+ cSound.define_singleton_method("load", load);
53
145
  }
54
146
 
55
147
 
@@ -0,0 +1,169 @@
1
+ #include "beeps/ruby/sound.h"
2
+
3
+
4
+ #include "defs.h"
5
+
6
+
7
+ RUCY_DEFINE_VALUE_FROM_TO(Beeps::SoundPlayer)
8
+
9
+ #define THIS to<Beeps::SoundPlayer*>(self)
10
+
11
+ #define CHECK RUCY_CHECK_OBJ(Beeps::SoundPlayer, self)
12
+
13
+
14
+ static
15
+ RUCY_DEF_ALLOC(alloc, klass)
16
+ {
17
+ return new_type<Beeps::SoundPlayer>(klass);
18
+ }
19
+ RUCY_END
20
+
21
+ static
22
+ RUCY_DEF0(play)
23
+ {
24
+ CHECK;
25
+
26
+ THIS->play();
27
+ return self;
28
+ }
29
+ RUCY_END
30
+
31
+ static
32
+ RUCY_DEF0(pause)
33
+ {
34
+ CHECK;
35
+
36
+ THIS->pause();
37
+ return self;
38
+ }
39
+ RUCY_END
40
+
41
+ static
42
+ RUCY_DEF0(rewind)
43
+ {
44
+ CHECK;
45
+
46
+ THIS->rewind();
47
+ return self;
48
+ }
49
+ RUCY_END
50
+
51
+ static
52
+ RUCY_DEF0(stop)
53
+ {
54
+ CHECK;
55
+
56
+ THIS->stop();
57
+ return self;
58
+ }
59
+ RUCY_END
60
+
61
+ static
62
+ RUCY_DEF0(is_playing)
63
+ {
64
+ CHECK;
65
+
66
+ return value(THIS->is_playing());
67
+ }
68
+ RUCY_END
69
+
70
+ static
71
+ RUCY_DEF0(is_paused)
72
+ {
73
+ CHECK;
74
+
75
+ return value(THIS->is_paused());
76
+ }
77
+ RUCY_END
78
+
79
+ static
80
+ RUCY_DEF0(is_stopped)
81
+ {
82
+ CHECK;
83
+
84
+ return value(THIS->is_stopped());
85
+ }
86
+ RUCY_END
87
+
88
+ static
89
+ RUCY_DEF1(set_gain, gain)
90
+ {
91
+ CHECK;
92
+
93
+ THIS->set_gain(to<float>(gain));
94
+ return gain;
95
+ }
96
+ RUCY_END
97
+
98
+ static
99
+ RUCY_DEF0(get_gain)
100
+ {
101
+ CHECK;
102
+
103
+ return value(THIS->gain());
104
+ }
105
+ RUCY_END
106
+
107
+ static
108
+ RUCY_DEF1(set_loop, loop)
109
+ {
110
+ CHECK;
111
+
112
+ THIS->set_loop(to<bool>(loop));
113
+ return loop;
114
+ }
115
+ RUCY_END
116
+
117
+ static
118
+ RUCY_DEF0(get_loop)
119
+ {
120
+ CHECK;
121
+
122
+ return value(THIS->loop());
123
+ }
124
+ RUCY_END
125
+
126
+ static
127
+ RUCY_DEF0(stop_all)
128
+ {
129
+ Beeps::stop_all_sound_players();
130
+ }
131
+ RUCY_END
132
+
133
+
134
+ static Class cSoundPlayer;
135
+
136
+ void
137
+ Init_beeps_sound_player ()
138
+ {
139
+ Module mBeeps = define_module("Beeps");
140
+
141
+ cSoundPlayer = mBeeps.define_class("SoundPlayer");
142
+ cSoundPlayer.define_alloc_func(alloc);
143
+ cSoundPlayer.define_method("play", play);
144
+ cSoundPlayer.define_method("pause", pause);
145
+ cSoundPlayer.define_method("rewind", rewind);
146
+ cSoundPlayer.define_method("stop", stop);
147
+ cSoundPlayer.define_method("playing?", is_playing);
148
+ cSoundPlayer.define_method("paused?", is_paused);
149
+ cSoundPlayer.define_method("stopped?", is_stopped);
150
+ cSoundPlayer.define_method("gain=", set_gain);
151
+ cSoundPlayer.define_method("gain", get_gain);
152
+ cSoundPlayer.define_method("loop=", set_loop);
153
+ cSoundPlayer.define_method("loop", get_loop);
154
+ cSoundPlayer.define_singleton_method("stop_all", stop_all);
155
+ }
156
+
157
+
158
+ namespace Beeps
159
+ {
160
+
161
+
162
+ Class
163
+ sound_player_class ()
164
+ {
165
+ return cSoundPlayer;
166
+ }
167
+
168
+
169
+ }// Beeps
@@ -0,0 +1,67 @@
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::TimeStretch)
9
+
10
+ #define THIS to<Beeps::TimeStretch*>(self)
11
+
12
+ #define CHECK RUCY_CHECK_OBJ(Beeps::TimeStretch, self)
13
+
14
+
15
+ static
16
+ RUCY_DEF_ALLOC(alloc, klass)
17
+ {
18
+ return value(new Beeps::RubyProcessor<Beeps::TimeStretch>, klass);
19
+ }
20
+ RUCY_END
21
+
22
+ static
23
+ RUCY_DEF1(set_scale, scale)
24
+ {
25
+ CHECK;
26
+
27
+ THIS->set_scale(to<float>(scale));
28
+ return scale;
29
+ }
30
+ RUCY_END
31
+
32
+ static
33
+ RUCY_DEF0(get_scale)
34
+ {
35
+ CHECK;
36
+
37
+ return value(THIS->scale());
38
+ }
39
+ RUCY_END
40
+
41
+
42
+ static Class cTimeStretch;
43
+
44
+ void
45
+ Init_beeps_time_stretch ()
46
+ {
47
+ Module mBeeps = define_module("Beeps");
48
+
49
+ cTimeStretch = mBeeps.define_class("TimeStretch", Beeps::processor_class());
50
+ cTimeStretch.define_alloc_func(alloc);
51
+ cTimeStretch.define_method("scale=", set_scale);
52
+ cTimeStretch.define_method("scale", get_scale);
53
+ }
54
+
55
+
56
+ namespace Beeps
57
+ {
58
+
59
+
60
+ Class
61
+ time_stretch_class ()
62
+ {
63
+ return cTimeStretch;
64
+ }
65
+
66
+
67
+ }// Beeps
@@ -15,8 +15,9 @@ namespace Beeps
15
15
 
16
16
  void fin ();
17
17
 
18
+ void process_streams ();
18
19
 
19
- uint sampling_rate ();
20
+ double sample_rate ();
20
21
 
21
22
 
22
23
  }// Beeps
@@ -0,0 +1,179 @@
1
+ // -*- c++ -*-
2
+ #pragma once
3
+ #ifndef __BEEPS_FILTER_H__
4
+ #define __BEEPS_FILTER_H__
5
+
6
+
7
+ #include <vector>
8
+ #include <beeps/processor.h>
9
+
10
+
11
+ namespace Beeps
12
+ {
13
+
14
+
15
+ class Gain : public Filter
16
+ {
17
+
18
+ typedef Filter Super;
19
+
20
+ public:
21
+
22
+ Gain (Processor* input = NULL);
23
+
24
+ virtual ~Gain ();
25
+
26
+ virtual void set_gain (float gain);
27
+
28
+ virtual float gain () const;
29
+
30
+ virtual void filter (
31
+ Context* context, Signals* signals, uint* offset) override;
32
+
33
+ struct Data;
34
+
35
+ Xot::PImpl<Data> self;
36
+
37
+ };// Gain
38
+
39
+
40
+ class ADSR : public Filter
41
+ {
42
+
43
+ typedef Filter Super;
44
+
45
+ public:
46
+
47
+ ADSR (Processor* input = NULL);
48
+
49
+ virtual ~ADSR ();
50
+
51
+ virtual void note_on (float delay = 0);
52
+
53
+ virtual void note_off (float delay = 0);
54
+
55
+ virtual void set_attack_time (float time);
56
+
57
+ virtual float attack_time () const;
58
+
59
+ virtual void set_decay_time (float time);
60
+
61
+ virtual float decay_time () const;
62
+
63
+ virtual void set_sustain_level (float level);
64
+
65
+ virtual float sustain_level () const;
66
+
67
+ virtual void set_release_time (float time);
68
+
69
+ virtual float release_time () const;
70
+
71
+ virtual void filter (
72
+ Context* context, Signals* signals, uint* offset) override;
73
+
74
+ virtual operator bool () const override;
75
+
76
+ struct Data;
77
+
78
+ Xot::PImpl<Data> self;
79
+
80
+ };// ADSR
81
+
82
+
83
+ class TimeStretch : public Filter
84
+ {
85
+
86
+ typedef Filter Super;
87
+
88
+ public:
89
+
90
+ TimeStretch (Processor* input = NULL);
91
+
92
+ virtual ~TimeStretch ();
93
+
94
+ virtual void reset () override;
95
+
96
+ virtual void set_scale (float scale);
97
+
98
+ virtual float scale () const;
99
+
100
+ virtual void filter (
101
+ Context* context, Signals* signals, uint* offset) override;
102
+
103
+ virtual operator bool () const override;
104
+
105
+ struct Data;
106
+
107
+ Xot::PImpl<Data> self;
108
+
109
+ };// TimeStretch
110
+
111
+
112
+ class PitchShift : public Filter
113
+ {
114
+
115
+ typedef Filter Super;
116
+
117
+ public:
118
+
119
+ PitchShift (Processor* input = NULL);
120
+
121
+ virtual ~PitchShift ();
122
+
123
+ virtual void reset () override;
124
+
125
+ virtual void set_shift (float shift);
126
+
127
+ virtual float shift () const;
128
+
129
+ virtual void filter (
130
+ Context* context, Signals* signals, uint* offset) override;
131
+
132
+ virtual operator bool () const override;
133
+
134
+ struct Data;
135
+
136
+ Xot::PImpl<Data> self;
137
+
138
+ };// PitchShift
139
+
140
+
141
+ class Analyser : public Filter
142
+ {
143
+
144
+ typedef Filter Super;
145
+
146
+ public:
147
+
148
+ typedef std::vector<float> Spectrum;
149
+
150
+ Analyser (uint fft_size = 1024, Processor* input = NULL);
151
+
152
+ virtual ~Analyser ();
153
+
154
+ virtual void set_fft_size (uint size);
155
+
156
+ virtual uint fft_size () const;
157
+
158
+ virtual float resolution () const;
159
+
160
+ virtual const Signals& signals () const;
161
+
162
+ virtual const Spectrum& spectrum () const;
163
+
164
+ virtual void filter (
165
+ Context* context, Signals* signals, uint* offset) override;
166
+
167
+ virtual operator bool () const override;
168
+
169
+ struct Data;
170
+
171
+ Xot::PImpl<Data> self;
172
+
173
+ };// Analyser
174
+
175
+
176
+ }// Beeps
177
+
178
+
179
+ #endif//EOH