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
@@ -0,0 +1,64 @@
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
+ VALUE alloc(VALUE klass)
17
+ {
18
+ return value(new Beeps::RubyProcessor<Beeps::PitchShift>, klass);
19
+ }
20
+
21
+ static
22
+ VALUE set_shift(VALUE self, VALUE shift)
23
+ {
24
+ CHECK;
25
+
26
+ THIS->set_shift(to<float>(shift));
27
+ return shift;
28
+ }
29
+
30
+ static
31
+ VALUE get_shift(VALUE self)
32
+ {
33
+ CHECK;
34
+
35
+ return value(THIS->shift());
36
+ }
37
+
38
+
39
+ static Class cPitchShift;
40
+
41
+ void
42
+ Init_beeps_pitch_shift ()
43
+ {
44
+ Module mBeeps = rb_define_module("Beeps");
45
+
46
+ cPitchShift = mBeeps.define_class("PitchShift", Beeps::processor_class());
47
+ rb_define_alloc_func(cPitchShift, alloc);
48
+ rb_define_method(cPitchShift, "shift=", RUBY_METHOD_FUNC(set_shift), 1);
49
+ rb_define_method(cPitchShift, "shift", RUBY_METHOD_FUNC(get_shift), 0);
50
+ }
51
+
52
+
53
+ namespace Beeps
54
+ {
55
+
56
+
57
+ Class
58
+ pitch_shift_class ()
59
+ {
60
+ return cPitchShift;
61
+ }
62
+
63
+
64
+ }// 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
@@ -18,6 +18,32 @@ VALUE alloc(VALUE klass)
18
18
  Beeps::beeps_error(__FILE__, __LINE__);
19
19
  }
20
20
 
21
+ static
22
+ VALUE reset(VALUE self)
23
+ {
24
+ CHECK;
25
+
26
+ THIS->reset();
27
+ return self;
28
+ }
29
+
30
+ static
31
+ VALUE set_input(VALUE self, VALUE input)
32
+ {
33
+ CHECK;
34
+
35
+ THIS->set_input(input ? to<Beeps::Processor*>(input) : NULL);
36
+ return input;
37
+ }
38
+
39
+ static
40
+ VALUE get_input(VALUE self)
41
+ {
42
+ CHECK;
43
+
44
+ return value(THIS->input());
45
+ }
46
+
21
47
 
22
48
  static Class cProcessor;
23
49
 
@@ -28,6 +54,9 @@ Init_beeps_processor ()
28
54
 
29
55
  cProcessor = rb_define_class_under(mBeeps, "Processor", rb_cObject);
30
56
  rb_define_alloc_func(cProcessor, alloc);
57
+ rb_define_method(cProcessor, "reset", RUBY_METHOD_FUNC(reset), 0);
58
+ rb_define_method(cProcessor, "input=", RUBY_METHOD_FUNC(set_input), 1);
59
+ rb_define_method(cProcessor, "input", RUBY_METHOD_FUNC(get_input), 0);
31
60
  }
32
61
 
33
62
 
@@ -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
@@ -18,11 +18,13 @@ VALUE alloc(VALUE klass)
18
18
  }
19
19
 
20
20
  static
21
- VALUE initialize(VALUE self, VALUE processor, VALUE seconds)
21
+ VALUE setup(VALUE self, VALUE processor, VALUE seconds, VALUE nchannels, VALUE sample_rate)
22
22
  {
23
- RUCY_CHECK_OBJ(Beeps::Sound, self);
23
+ CHECK;
24
24
 
25
- *THIS = Beeps::Sound(to<Beeps::Processor*>(processor), to<float>(seconds));
25
+ *THIS = Beeps::Sound(
26
+ to<Beeps::Processor*>(processor),
27
+ to<float>(seconds), to<uint>(nchannels), to<double>(sample_rate));
26
28
  return self;
27
29
  }
28
30
 
@@ -31,10 +33,82 @@ VALUE play(VALUE self)
31
33
  {
32
34
  CHECK;
33
35
 
34
- THIS->play();
36
+ return value(THIS->play());
37
+ }
38
+
39
+ static
40
+ VALUE save(VALUE self, VALUE path)
41
+ {
42
+ CHECK;
43
+
44
+ THIS->save(path.c_str());
35
45
  return self;
36
46
  }
37
47
 
48
+ static
49
+ VALUE get_sample_rate(VALUE self)
50
+ {
51
+ CHECK;
52
+
53
+ return value(THIS->sample_rate());
54
+ }
55
+
56
+ static
57
+ VALUE get_nchannels(VALUE self)
58
+ {
59
+ CHECK;
60
+
61
+ return value(THIS->nchannels());
62
+ }
63
+
64
+ static
65
+ VALUE get_seconds(VALUE self)
66
+ {
67
+ CHECK;
68
+
69
+ return value(THIS->seconds());
70
+ }
71
+
72
+ static
73
+ VALUE set_gain(VALUE self, VALUE gain)
74
+ {
75
+ CHECK;
76
+
77
+ THIS->set_gain(to<float>(gain));
78
+ return gain;
79
+ }
80
+
81
+ static
82
+ VALUE get_gain(VALUE self)
83
+ {
84
+ CHECK;
85
+
86
+ return value(THIS->gain());
87
+ }
88
+
89
+ static
90
+ VALUE set_loop(VALUE self, VALUE loop)
91
+ {
92
+ CHECK;
93
+
94
+ THIS->set_loop(to<bool>(loop));
95
+ return loop;
96
+ }
97
+
98
+ static
99
+ VALUE get_loop(VALUE self)
100
+ {
101
+ CHECK;
102
+
103
+ return value(THIS->loop());
104
+ }
105
+
106
+ static
107
+ VALUE load(VALUE self, VALUE path)
108
+ {
109
+ return value(Beeps::load_sound(to<const char*>(path)));
110
+ }
111
+
38
112
 
39
113
  static Class cSound;
40
114
 
@@ -45,8 +119,17 @@ Init_beeps_sound ()
45
119
 
46
120
  cSound = rb_define_class_under(mBeeps, "Sound", rb_cObject);
47
121
  rb_define_alloc_func(cSound, alloc);
48
- rb_define_private_method(cSound, "initialize", RUBY_METHOD_FUNC(initialize), 2);
49
- rb_define_method(cSound, "play", RUBY_METHOD_FUNC(play), 0);
122
+ rb_define_private_method(cSound, "setup", RUBY_METHOD_FUNC(setup), 4);
123
+ cSound.define_private_method("play!", play);
124
+ rb_define_method(cSound, "save", RUBY_METHOD_FUNC(save), 1);
125
+ rb_define_method(cSound, "sample_rate", RUBY_METHOD_FUNC(get_sample_rate), 0);
126
+ rb_define_method(cSound, "nchannels", RUBY_METHOD_FUNC(get_nchannels), 0);
127
+ rb_define_method(cSound, "seconds", RUBY_METHOD_FUNC(get_seconds), 0);
128
+ rb_define_method(cSound, "gain=", RUBY_METHOD_FUNC(set_gain), 1);
129
+ rb_define_method(cSound, "gain", RUBY_METHOD_FUNC(get_gain), 0);
130
+ rb_define_method(cSound, "loop=", RUBY_METHOD_FUNC(set_loop), 1);
131
+ rb_define_method(cSound, "loop", RUBY_METHOD_FUNC(get_loop), 0);
132
+ rb_define_singleton_method(cSound, "load", RUBY_METHOD_FUNC(load), 1);
50
133
  }
51
134
 
52
135
 
@@ -0,0 +1,156 @@
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
+ VALUE alloc(VALUE klass)
16
+ {
17
+ return new_type<Beeps::SoundPlayer>(klass);
18
+ }
19
+
20
+ static
21
+ VALUE play(VALUE self)
22
+ {
23
+ CHECK;
24
+
25
+ THIS->play();
26
+ return self;
27
+ }
28
+
29
+ static
30
+ VALUE pause(VALUE self)
31
+ {
32
+ CHECK;
33
+
34
+ THIS->pause();
35
+ return self;
36
+ }
37
+
38
+ static
39
+ VALUE rewind(VALUE self)
40
+ {
41
+ CHECK;
42
+
43
+ THIS->rewind();
44
+ return self;
45
+ }
46
+
47
+ static
48
+ VALUE stop(VALUE self)
49
+ {
50
+ CHECK;
51
+
52
+ THIS->stop();
53
+ return self;
54
+ }
55
+
56
+ static
57
+ VALUE is_playing(VALUE self)
58
+ {
59
+ CHECK;
60
+
61
+ return value(THIS->is_playing());
62
+ }
63
+
64
+ static
65
+ VALUE is_paused(VALUE self)
66
+ {
67
+ CHECK;
68
+
69
+ return value(THIS->is_paused());
70
+ }
71
+
72
+ static
73
+ VALUE is_stopped(VALUE self)
74
+ {
75
+ CHECK;
76
+
77
+ return value(THIS->is_stopped());
78
+ }
79
+
80
+ static
81
+ VALUE set_gain(VALUE self, VALUE gain)
82
+ {
83
+ CHECK;
84
+
85
+ THIS->set_gain(to<float>(gain));
86
+ return gain;
87
+ }
88
+
89
+ static
90
+ VALUE get_gain(VALUE self)
91
+ {
92
+ CHECK;
93
+
94
+ return value(THIS->gain());
95
+ }
96
+
97
+ static
98
+ VALUE set_loop(VALUE self, VALUE loop)
99
+ {
100
+ CHECK;
101
+
102
+ THIS->set_loop(to<bool>(loop));
103
+ return loop;
104
+ }
105
+
106
+ static
107
+ VALUE get_loop(VALUE self)
108
+ {
109
+ CHECK;
110
+
111
+ return value(THIS->loop());
112
+ }
113
+
114
+ static
115
+ VALUE stop_all(VALUE self)
116
+ {
117
+ Beeps::stop_all_sound_players();
118
+ }
119
+
120
+
121
+ static Class cSoundPlayer;
122
+
123
+ void
124
+ Init_beeps_sound_player ()
125
+ {
126
+ Module mBeeps = rb_define_module("Beeps");
127
+
128
+ cSoundPlayer = rb_define_class_under(mBeeps, "SoundPlayer", rb_cObject);
129
+ rb_define_alloc_func(cSoundPlayer, alloc);
130
+ rb_define_method(cSoundPlayer, "play", RUBY_METHOD_FUNC(play), 0);
131
+ rb_define_method(cSoundPlayer, "pause", RUBY_METHOD_FUNC(pause), 0);
132
+ rb_define_method(cSoundPlayer, "rewind", RUBY_METHOD_FUNC(rewind), 0);
133
+ rb_define_method(cSoundPlayer, "stop", RUBY_METHOD_FUNC(stop), 0);
134
+ cSoundPlayer.define_method("playing?", is_playing);
135
+ cSoundPlayer.define_method("paused?", is_paused);
136
+ cSoundPlayer.define_method("stopped?", is_stopped);
137
+ rb_define_method(cSoundPlayer, "gain=", RUBY_METHOD_FUNC(set_gain), 1);
138
+ rb_define_method(cSoundPlayer, "gain", RUBY_METHOD_FUNC(get_gain), 0);
139
+ rb_define_method(cSoundPlayer, "loop=", RUBY_METHOD_FUNC(set_loop), 1);
140
+ rb_define_method(cSoundPlayer, "loop", RUBY_METHOD_FUNC(get_loop), 0);
141
+ rb_define_singleton_method(cSoundPlayer, "stop_all", RUBY_METHOD_FUNC(stop_all), 0);
142
+ }
143
+
144
+
145
+ namespace Beeps
146
+ {
147
+
148
+
149
+ Class
150
+ sound_player_class ()
151
+ {
152
+ return cSoundPlayer;
153
+ }
154
+
155
+
156
+ }// Beeps
@@ -0,0 +1,64 @@
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
+ VALUE alloc(VALUE klass)
17
+ {
18
+ return value(new Beeps::RubyProcessor<Beeps::TimeStretch>, klass);
19
+ }
20
+
21
+ static
22
+ VALUE set_scale(VALUE self, VALUE scale)
23
+ {
24
+ CHECK;
25
+
26
+ THIS->set_scale(to<float>(scale));
27
+ return scale;
28
+ }
29
+
30
+ static
31
+ VALUE get_scale(VALUE self)
32
+ {
33
+ CHECK;
34
+
35
+ return value(THIS->scale());
36
+ }
37
+
38
+
39
+ static Class cTimeStretch;
40
+
41
+ void
42
+ Init_beeps_time_stretch ()
43
+ {
44
+ Module mBeeps = rb_define_module("Beeps");
45
+
46
+ cTimeStretch = mBeeps.define_class("TimeStretch", Beeps::processor_class());
47
+ rb_define_alloc_func(cTimeStretch, alloc);
48
+ rb_define_method(cTimeStretch, "scale=", RUBY_METHOD_FUNC(set_scale), 1);
49
+ rb_define_method(cTimeStretch, "scale", RUBY_METHOD_FUNC(get_scale), 0);
50
+ }
51
+
52
+
53
+ namespace Beeps
54
+ {
55
+
56
+
57
+ Class
58
+ time_stretch_class ()
59
+ {
60
+ return cTimeStretch;
61
+ }
62
+
63
+
64
+ }// Beeps
@@ -20,8 +20,11 @@ jobs:
20
20
  - name: setup dependencies
21
21
  run: "ruby -I.github/workflows -rutils -e 'setup_dependencies'"
22
22
 
23
+ - name: install gems
24
+ run: gem install yard
25
+
23
26
  - name: test
24
- run: rake test
27
+ run: rake quiet test
25
28
 
26
29
  - name: create gem
27
30
  id: gem
data/ChangeLog.md CHANGED
@@ -1,6 +1,14 @@
1
1
  # beeps ChangeLog
2
2
 
3
3
 
4
+ ## [v0.1.33] - 2023-04-22
5
+
6
+ - Stream playback is now supported.
7
+ - Pause, resume, and stop after playback, as well as methods to check the status of the playback.
8
+ - Support for saving and loading sound files
9
+ - Added Oscillator, MicIn, Gain, ADSR, TimeStretch, PitchShift, and Analyser classes.
10
+
11
+
4
12
  ## [v0.1.32] - 2023-03-01
5
13
 
6
14
  - fix bugs
data/Rakefile CHANGED
@@ -13,14 +13,36 @@ require 'beeps/extension'
13
13
 
14
14
 
15
15
  EXTENSIONS = [Xot, Rucy, Beeps]
16
- TESTS_ALONE = ['test/test_beeps.rb']
16
+ TESTS_ALONE = ['test/test_beeps_init.rb']
17
17
 
18
18
  use_external_library 'https://github.com/thestk/stk',
19
- tag: 'v4.6.0',
20
- incdir: 'include',
21
- srcdir: 'src',
19
+ tag: '4.6.2',
20
+ incdirs: 'include',
21
+ srcdirs: 'src',
22
22
  excludes: %w[stk/src/include Tcp Udp Socket Thread Mutex InetWv /Rt]
23
23
 
24
+ use_external_library 'https://github.com/adamstark/AudioFile',
25
+ tag: '1.1.1',
26
+ srcdirs: 'NOSRC',
27
+ excludes: %w[examples/ tests/]
28
+
29
+ use_external_library 'https://github.com/avaneev/r8brain-free-src',
30
+ tag: 'version-6.2',
31
+ excludes: %w[DLL/ bench/ other/ pffft_double example.cpp],
32
+ &proc {
33
+ filter_file('r8bconf.h') do |conf|
34
+ <<~EOS + conf
35
+ #ifndef R8B_PFFFT
36
+ #define R8B_PFFFT 1
37
+ #endif
38
+ EOS
39
+ end
40
+ }
41
+
42
+ use_external_library 'https://github.com/Signalsmith-Audio/signalsmith-stretch',
43
+ commit: 'fddcdb628f326ef187b7e5694f285f35a528aba3',
44
+ srcdirs: 'NOSRC'
45
+
24
46
  default_tasks :ext
25
47
  build_native_library
26
48
  build_ruby_extension
data/VERSION CHANGED
@@ -1 +1 @@
1
- 0.1.32
1
+ 0.1.33
data/beeps.gemspec CHANGED
@@ -28,8 +28,8 @@ Gem::Specification.new do |s|
28
28
  s.platform = Gem::Platform::RUBY
29
29
  s.required_ruby_version = '>= 2.7.0'
30
30
 
31
- s.add_runtime_dependency 'xot', '~> 0.1.32'
32
- s.add_runtime_dependency 'rucy', '~> 0.1.32'
31
+ s.add_runtime_dependency 'xot', '~> 0.1.33'
32
+ s.add_runtime_dependency 'rucy', '~> 0.1.33'
33
33
 
34
34
  s.add_development_dependency 'rake'
35
35
  s.add_development_dependency 'test-unit'
@@ -0,0 +1,150 @@
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::ADSR)
9
+
10
+ #define THIS to<Beeps::ADSR*>(self)
11
+
12
+ #define CHECK RUCY_CHECK_OBJ(Beeps::ADSR, self)
13
+
14
+
15
+ static
16
+ RUCY_DEF_ALLOC(alloc, klass)
17
+ {
18
+ return value(new Beeps::RubyProcessor<Beeps::ADSR>, klass);
19
+ }
20
+ RUCY_END
21
+
22
+ static
23
+ RUCY_DEF1(note_on, delay)
24
+ {
25
+ CHECK;
26
+
27
+ THIS->note_on(to<float>(delay));
28
+ }
29
+ RUCY_END
30
+
31
+ static
32
+ RUCY_DEF1(note_off, delay)
33
+ {
34
+ CHECK;
35
+
36
+ THIS->note_off(to<float>(delay));
37
+ }
38
+ RUCY_END
39
+
40
+ static
41
+ RUCY_DEF1(set_attack_time, time)
42
+ {
43
+ CHECK;
44
+
45
+ THIS->set_attack_time(to<float>(time));
46
+ return time;
47
+ }
48
+ RUCY_END
49
+
50
+ static
51
+ RUCY_DEF0(get_attack_time)
52
+ {
53
+ CHECK;
54
+
55
+ return value(THIS->attack_time());
56
+ }
57
+ RUCY_END
58
+
59
+ static
60
+ RUCY_DEF1(set_decay_time, time)
61
+ {
62
+ CHECK;
63
+
64
+ THIS->set_decay_time(to<float>(time));
65
+ return time;
66
+ }
67
+ RUCY_END
68
+
69
+ static
70
+ RUCY_DEF0(get_decay_time)
71
+ {
72
+ CHECK;
73
+
74
+ return value(THIS->decay_time());
75
+ }
76
+ RUCY_END
77
+
78
+ static
79
+ RUCY_DEF1(set_sustain_level, level)
80
+ {
81
+ CHECK;
82
+
83
+ THIS->set_sustain_level(to<float>(level));
84
+ return level;
85
+ }
86
+ RUCY_END
87
+
88
+ static
89
+ RUCY_DEF0(get_sustain_level)
90
+ {
91
+ CHECK;
92
+
93
+ return value(THIS->sustain_level());
94
+ }
95
+ RUCY_END
96
+
97
+ static
98
+ RUCY_DEF1(set_release_time, time)
99
+ {
100
+ CHECK;
101
+
102
+ THIS->set_release_time(to<float>(time));
103
+ return time;
104
+ }
105
+ RUCY_END
106
+
107
+ static
108
+ RUCY_DEF0(get_release_time)
109
+ {
110
+ CHECK;
111
+
112
+ return value(THIS->release_time());
113
+ }
114
+ RUCY_END
115
+
116
+
117
+ static Class cADSR;
118
+
119
+ void
120
+ Init_beeps_adsr ()
121
+ {
122
+ Module mBeeps = define_module("Beeps");
123
+
124
+ cADSR = mBeeps.define_class("ADSR", Beeps::processor_class());
125
+ cADSR.define_alloc_func(alloc);
126
+ cADSR.define_private_method("note_on!", note_on);
127
+ cADSR.define_private_method("note_off!", note_off);
128
+ cADSR.define_method( "attack_time=", set_attack_time);
129
+ cADSR.define_method( "attack_time", get_attack_time);
130
+ cADSR.define_method( "decay_time=", set_decay_time);
131
+ cADSR.define_method( "decay_time", get_decay_time);
132
+ cADSR.define_method("sustain_level=", set_sustain_level);
133
+ cADSR.define_method("sustain_level", get_sustain_level);
134
+ cADSR.define_method("release_time=", set_release_time);
135
+ cADSR.define_method("release_time", get_release_time);
136
+ }
137
+
138
+
139
+ namespace Beeps
140
+ {
141
+
142
+
143
+ Class
144
+ adsr_class ()
145
+ {
146
+ return cADSR;
147
+ }
148
+
149
+
150
+ }// Beeps