beeps 0.1.32 → 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 (78) 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 +4 -1
  16. data/ChangeLog.md +8 -0
  17. data/Rakefile +26 -4
  18. data/VERSION +1 -1
  19. data/beeps.gemspec +2 -2
  20. data/ext/beeps/adsr.cpp +150 -0
  21. data/ext/beeps/analyser.cpp +134 -0
  22. data/ext/beeps/beeps.cpp +10 -1
  23. data/ext/beeps/extconf.rb +1 -2
  24. data/ext/beeps/file_in.cpp +60 -9
  25. data/ext/beeps/gain.cpp +67 -0
  26. data/ext/beeps/mic_in.cpp +88 -0
  27. data/ext/beeps/native.cpp +20 -8
  28. data/ext/beeps/oscillator.cpp +93 -0
  29. data/ext/beeps/pitch_shift.cpp +67 -0
  30. data/ext/beeps/processor.cpp +34 -2
  31. data/ext/beeps/sound.cpp +99 -7
  32. data/ext/beeps/sound_player.cpp +169 -0
  33. data/ext/beeps/time_stretch.cpp +67 -0
  34. data/include/beeps/beeps.h +2 -1
  35. data/include/beeps/filter.h +179 -0
  36. data/include/beeps/generator.h +120 -0
  37. data/include/beeps/processor.h +37 -68
  38. data/include/beeps/ruby/filter.h +78 -0
  39. data/include/beeps/ruby/generator.h +60 -0
  40. data/include/beeps/ruby/processor.h +5 -45
  41. data/include/beeps/ruby/sound.h +14 -3
  42. data/include/beeps/signals.h +10 -4
  43. data/include/beeps/sound.h +67 -2
  44. data/lib/beeps/beeps.rb +6 -1
  45. data/lib/beeps/processor.rb +95 -15
  46. data/lib/beeps/sound.rb +29 -2
  47. data/src/adsr.cpp +245 -0
  48. data/src/analyser.cpp +254 -0
  49. data/src/beeps.cpp +11 -2
  50. data/src/file_in.cpp +94 -0
  51. data/src/gain.cpp +55 -0
  52. data/src/mic_in.cpp +262 -0
  53. data/src/mic_in.h +20 -0
  54. data/src/openal.cpp +2 -1
  55. data/src/oscillator.cpp +145 -0
  56. data/src/osx/signals.mm +83 -0
  57. data/src/pitch_shift.cpp +82 -0
  58. data/src/processor.cpp +202 -88
  59. data/src/processor.h +98 -0
  60. data/src/signals.cpp +326 -20
  61. data/src/signals.h +192 -2
  62. data/src/sound.cpp +735 -113
  63. data/src/sound.h +6 -1
  64. data/src/time_stretch.cpp +91 -0
  65. data/test/helper.rb +2 -1
  66. data/test/test_beeps.rb +10 -7
  67. data/test/test_beeps_init.rb +18 -0
  68. data/test/test_file_in.rb +15 -0
  69. data/test/test_processor.rb +50 -0
  70. data/test/test_sound.rb +87 -11
  71. data/test/test_sound_player.rb +134 -0
  72. metadata +54 -16
  73. data/.doc/ext/beeps/sawtooth_wave.cpp +0 -61
  74. data/.doc/ext/beeps/sine_wave.cpp +0 -61
  75. data/.doc/ext/beeps/square_wave.cpp +0 -61
  76. data/ext/beeps/sawtooth_wave.cpp +0 -64
  77. data/ext/beeps/sine_wave.cpp +0 -64
  78. data/ext/beeps/square_wave.cpp +0 -64
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
@@ -0,0 +1,120 @@
1
+ // -*- c++ -*-
2
+ #pragma once
3
+ #ifndef __BEEPS_GENERATOR_H__
4
+ #define __BEEPS_GENERATOR_H__
5
+
6
+
7
+ #include <beeps/processor.h>
8
+
9
+
10
+ namespace Beeps
11
+ {
12
+
13
+
14
+ class Oscillator : public Generator
15
+ {
16
+
17
+ typedef Generator Super;
18
+
19
+ public:
20
+
21
+ enum Type {NONE = 0, SINE, TRIANGLE, SQUARE, SAWTOOTH};
22
+
23
+ Oscillator (Type type = SINE);
24
+
25
+ virtual ~Oscillator ();
26
+
27
+ virtual void reset () override;
28
+
29
+ virtual void set_type (Type type);
30
+
31
+ virtual Type type () const;
32
+
33
+ virtual void set_frequency (float frequency);
34
+
35
+ virtual float frequency () const;
36
+
37
+ virtual void generate (
38
+ Context* context, Signals* signals, uint* offset) override;
39
+
40
+ virtual operator bool () const override;
41
+
42
+ struct Data;
43
+
44
+ Xot::PImpl<Data> self;
45
+
46
+ };// Oscillator
47
+
48
+
49
+ class FileIn : public Generator
50
+ {
51
+
52
+ typedef Generator Super;
53
+
54
+ public:
55
+
56
+ FileIn (const char* path = NULL);
57
+
58
+ virtual ~FileIn ();
59
+
60
+ virtual void reset () override;
61
+
62
+ virtual void set_path(const char* path);
63
+
64
+ virtual const char* path () const;
65
+
66
+ virtual double sample_rate () const;
67
+
68
+ virtual uint nchannels () const;
69
+
70
+ virtual uint nsamples () const;
71
+
72
+ virtual float seconds () const;
73
+
74
+ virtual void generate (
75
+ Context* context, Signals* signals, uint* offset) override;
76
+
77
+ virtual operator bool () const override;
78
+
79
+ struct Data;
80
+
81
+ Xot::PImpl<Data> self;
82
+
83
+ };// FileIn
84
+
85
+
86
+ class MicIn : public Generator
87
+ {
88
+
89
+ typedef Generator Super;
90
+
91
+ public:
92
+
93
+ MicIn (uint nchannels = 1, double sample_rate = 0);
94
+
95
+ virtual ~MicIn ();
96
+
97
+ virtual void start ();
98
+
99
+ virtual void stop ();
100
+
101
+ virtual double sample_rate () const;
102
+
103
+ virtual uint nchannels () const;
104
+
105
+ virtual void generate (
106
+ Context* context, Signals* signals, uint* offset) override;
107
+
108
+ virtual operator bool () const override;
109
+
110
+ struct Data;
111
+
112
+ Xot::PImpl<Data> self;
113
+
114
+ };// MicIn
115
+
116
+
117
+ }// Beeps
118
+
119
+
120
+ #endif//EOH