beeps 0.1.32 → 0.1.33

Sign up to get free protection for your applications and to get access to all the features.
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