scruby 0.2.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 (69) hide show
  1. data/.gitignore +5 -0
  2. data/.rspec +1 -0
  3. data/Gemfile +4 -0
  4. data/Gemfile.lock +53 -0
  5. data/README.rdoc +65 -0
  6. data/Rakefile +10 -0
  7. data/TODO.markdown +3 -0
  8. data/examples/example.rb +73 -0
  9. data/lib/scruby/buffer.rb +153 -0
  10. data/lib/scruby/bus.rb +67 -0
  11. data/lib/scruby/control_name.rb +29 -0
  12. data/lib/scruby/core_ext/array.rb +44 -0
  13. data/lib/scruby/core_ext/delegator_array.rb +44 -0
  14. data/lib/scruby/core_ext/fixnum.rb +8 -0
  15. data/lib/scruby/core_ext/numeric.rb +25 -0
  16. data/lib/scruby/core_ext/object.rb +23 -0
  17. data/lib/scruby/core_ext/proc.rb +11 -0
  18. data/lib/scruby/core_ext/string.rb +5 -0
  19. data/lib/scruby/core_ext/symbol.rb +5 -0
  20. data/lib/scruby/core_ext/typed_array.rb +54 -0
  21. data/lib/scruby/env.rb +93 -0
  22. data/lib/scruby/group.rb +24 -0
  23. data/lib/scruby/node.rb +102 -0
  24. data/lib/scruby/server.rb +182 -0
  25. data/lib/scruby/synth.rb +50 -0
  26. data/lib/scruby/synthdef.rb +109 -0
  27. data/lib/scruby/ticker.rb +92 -0
  28. data/lib/scruby/ugens/buffer_read_write.rb +98 -0
  29. data/lib/scruby/ugens/demand.rb +9 -0
  30. data/lib/scruby/ugens/disk_in_out.rb +33 -0
  31. data/lib/scruby/ugens/env_gen.rb +38 -0
  32. data/lib/scruby/ugens/in_out.rb +46 -0
  33. data/lib/scruby/ugens/multi_out.rb +53 -0
  34. data/lib/scruby/ugens/operation_indices.yaml +92 -0
  35. data/lib/scruby/ugens/operation_ugens.rb +63 -0
  36. data/lib/scruby/ugens/panner.rb +137 -0
  37. data/lib/scruby/ugens/ugen.rb +173 -0
  38. data/lib/scruby/ugens/ugen_defs.yaml +3123 -0
  39. data/lib/scruby/ugens/ugen_operations.rb +57 -0
  40. data/lib/scruby/ugens/ugens.rb +95 -0
  41. data/lib/scruby/version.rb +3 -0
  42. data/lib/scruby.rb +65 -0
  43. data/scruby.gemspec +27 -0
  44. data/spec/buffer_read_write_spec.rb +333 -0
  45. data/spec/buffer_spec.rb +199 -0
  46. data/spec/bus_spec.rb +184 -0
  47. data/spec/core_ext/core_ext_spec.rb +120 -0
  48. data/spec/core_ext/delegator_array_spec.rb +144 -0
  49. data/spec/core_ext/typed_array_spec.rb +95 -0
  50. data/spec/demand_spec.rb +81 -0
  51. data/spec/disk_in_out_spec.rb +138 -0
  52. data/spec/env_gen_spec.rb +23 -0
  53. data/spec/env_spec.rb +73 -0
  54. data/spec/group_spec.rb +71 -0
  55. data/spec/helper.rb +20 -0
  56. data/spec/in_out_spec.rb +127 -0
  57. data/spec/integration_spec.rb +88 -0
  58. data/spec/multiout_ugen_spec.rb +86 -0
  59. data/spec/node_spec.rb +112 -0
  60. data/spec/operation_ugens_spec.rb +196 -0
  61. data/spec/panner_spec.rb +271 -0
  62. data/spec/server.rb +12 -0
  63. data/spec/server_spec.rb +198 -0
  64. data/spec/synth_spec.rb +103 -0
  65. data/spec/synthdef_spec.rb +267 -0
  66. data/spec/ugen_operations_spec.rb +100 -0
  67. data/spec/ugen_spec.rb +356 -0
  68. data/spec/ugens_spec.rb +65 -0
  69. metadata +207 -0
@@ -0,0 +1,271 @@
1
+ require File.expand_path(File.dirname(__FILE__)) + "/helper"
2
+
3
+ require "scruby/core_ext/delegator_array"
4
+ require "scruby/control_name"
5
+ require "scruby/env"
6
+ require "scruby/ugens/ugen"
7
+ require "scruby/ugens/ugen_operations"
8
+ require "scruby/ugens/multi_out"
9
+ require "scruby/ugens/ugens"
10
+ require "scruby/ugens/panner"
11
+
12
+ include Scruby
13
+ include Ugens
14
+
15
+ class MockUgen < Ugen
16
+ class << self; public :new; end
17
+ end
18
+
19
+ describe 'Panner' do
20
+ shared_examples_for 'Panner' do
21
+ before do
22
+ @pan = @class.send @method, *@params
23
+ @inputs ||= @params
24
+ @instance = @pan.first.source
25
+ end
26
+
27
+ it "should output a DelegatorArray" do
28
+ @pan.should be_a(DelegatorArray)
29
+ end
30
+
31
+ it "should have correct rate" do
32
+ @instance.rate.should == @rate
33
+ end
34
+
35
+ it "should return an array of output proxies" do
36
+ @pan.should be_a(Array)
37
+ @pan.should have(@channels).proxies
38
+ @pan.each_with_index do |proxy, i|
39
+ proxy.source.should be_a(@class)
40
+ proxy.should be_a(OutputProxy)
41
+ proxy.output_index.should == i
42
+ end
43
+ end
44
+
45
+ it "should set inputs" do
46
+ @instance.inputs.should == @inputs
47
+ end
48
+
49
+ it "should accept control rate inputs unless rate is audio"
50
+ end
51
+
52
+ shared_examples_for 'Panner with control rate' do
53
+ before do
54
+ @method = :kr
55
+ @rate = :control
56
+ end
57
+ it_should_behave_like 'Panner'
58
+ end
59
+
60
+ shared_examples_for 'Panner with audio rate' do
61
+ before do
62
+ @method = :ar
63
+ @rate = :audio
64
+ end
65
+ it_should_behave_like 'Panner'
66
+
67
+ it "should just accept audio inputs if rate is audio" # do
68
+ # lambda { @class.new( :audio, MockUgen.new(:control) ) }.should raise_error(ArgumentError)
69
+ # end
70
+ end
71
+
72
+ shared_examples_for 'Panner with array as input' do
73
+ it "should have n channels" do
74
+ @arrayed.should have(@ugens.size).proxies
75
+ end
76
+
77
+ it "should have array as channel" do
78
+ @arrayed.each { |a| a.should have(@channels).proxies }
79
+ end
80
+
81
+ it "should have the same source class" do
82
+ @arrayed.flatten.source.uniq.should have(@ugens.size).elements
83
+ end
84
+ end
85
+
86
+ shared_examples_for 'Multi input panner' do
87
+ describe "two ugens as input" do
88
+ before do
89
+ @params[0] = @ugens = [@ugen] * 2
90
+ @arrayed = @class.ar *@params
91
+ end
92
+ it_should_behave_like 'Panner with array as input'
93
+ end
94
+
95
+ describe "four ugens as input" do
96
+ before do
97
+ @params[0] = @ugens = [@ugen] * 4
98
+ @arrayed = @class.ar *@params
99
+ # p @arrayed.first.first.source.output_specs
100
+ end
101
+ it_should_behave_like 'Panner with array as input'
102
+ end
103
+ end
104
+
105
+ describe Pan2 do
106
+ before do
107
+ @class = Pan2
108
+ @ugen = MockUgen.new :audio, 1, 2
109
+ @params = @ugen, 0.5, 1.0
110
+ @channels = 2
111
+ end
112
+ it_should_behave_like 'Panner with audio rate'
113
+ it_should_behave_like 'Panner with control rate'
114
+ it_should_behave_like 'Multi input panner'
115
+
116
+
117
+ it "should have keyword args" do
118
+ @class.ar( @ugen, :level => 2.0 ).first.source.inputs.should == [@ugen, 0.0, 2.0]
119
+ end
120
+ end
121
+
122
+ describe LinPan2 do
123
+ before do
124
+ @class = LinPan2
125
+ @ugen = MockUgen.new :audio, 1, 2
126
+ @params = @ugen, 0.5, 1.0
127
+ @channels = 2
128
+ end
129
+ it_should_behave_like 'Panner with audio rate'
130
+ it_should_behave_like 'Panner with control rate'
131
+ it_should_behave_like 'Multi input panner'
132
+
133
+ it "should have keyword args" do
134
+ @class.ar( @ugen, :level => 2.0 ).first.source.inputs.should == [@ugen, 0.0, 2.0]
135
+ end
136
+ end
137
+
138
+ describe Pan4 do
139
+ before do
140
+ @class = Pan4
141
+ @ugen = MockUgen.new :audio, 1, 2
142
+ @params = @ugen, 0.5, 0.5, 1.0
143
+ @channels = 4
144
+ end
145
+ it_should_behave_like 'Panner with audio rate'
146
+ it_should_behave_like 'Panner with control rate'
147
+ it_should_behave_like 'Multi input panner'
148
+
149
+ it "should have keyword args" do
150
+ @class.ar( @ugen, :level => 2.0 ).first.source.inputs.should == [@ugen, 0.0, 0.0, 2.0]
151
+ end
152
+ end
153
+
154
+ describe Balance2 do
155
+ before do
156
+ @class = Balance2
157
+ @ugen = MockUgen.new :audio, 1, 2
158
+ @ugen2 = MockUgen.new :audio, 2, 4
159
+ @params = @ugen, @ugen2, 0.5, 1.0
160
+ @channels = 2
161
+ end
162
+ it_should_behave_like 'Panner with audio rate'
163
+ it_should_behave_like 'Panner with control rate'
164
+ it_should_behave_like 'Multi input panner'
165
+
166
+ it "should have keyword args" do
167
+ @class.ar( @ugen, @ugen2 , :level => 2.0 ).first.source.inputs.should == [@ugen, @ugen2 , 0.0, 2.0]
168
+ end
169
+ end
170
+
171
+ describe Rotate2 do
172
+ before do
173
+ @class = Rotate2
174
+ @ugen = MockUgen.new :audio, 1, 2
175
+ @ugen2 = MockUgen.new :audio, 2, 4
176
+ @params = @ugen, @ugen2, 0.5
177
+ @channels = 2
178
+ end
179
+ it_should_behave_like 'Panner with audio rate'
180
+ it_should_behave_like 'Panner with control rate'
181
+ it_should_behave_like 'Multi input panner'
182
+
183
+ # it "should have keyword args" do
184
+ # @class.ar( @ugen, @ugen2 , :level => 2.0 ).first.source.inputs.should == [@ugen, @ugen2 , 0.0, 2.0]
185
+ # end
186
+ end
187
+
188
+ describe PanB do
189
+ before do
190
+ @class = PanB
191
+ @ugen = MockUgen.new :audio, 1, 2
192
+ @params = @ugen, 0.5, 0.5, 1.0
193
+ @channels = 4
194
+ end
195
+ it_should_behave_like 'Panner with audio rate'
196
+ it_should_behave_like 'Panner with control rate'
197
+ it_should_behave_like 'Multi input panner'
198
+
199
+ # it "should have keyword args" do
200
+ # @class.ar( @ugen, @ugen2 , :level => 2.0 ).first.source.inputs.should == [@ugen, @ugen2 , 0.0, 2.0]
201
+ # end
202
+ end
203
+
204
+ describe PanB2 do
205
+ before do
206
+ @class = PanB2
207
+ @ugen = MockUgen.new :audio, 1, 2
208
+ @params = @ugen, 0.5, 1.0
209
+ @channels = 3
210
+ end
211
+ it_should_behave_like 'Panner with audio rate'
212
+ it_should_behave_like 'Panner with control rate'
213
+ it_should_behave_like 'Multi input panner'
214
+
215
+ # it "should have keyword args" do
216
+ # @class.ar( @ugen, @ugen2 , :level => 2.0 ).first.source.inputs.should == [@ugen, @ugen2 , 0.0, 2.0]
217
+ # end
218
+ end
219
+
220
+ describe BiPanB2 do
221
+ before do
222
+ @class = BiPanB2
223
+ @ugen2 = MockUgen.new(:audio, 2, 4)
224
+ @ugen = MockUgen.new :audio, 1, 2
225
+ @params = @ugen, @ugen2, 0.5, 0.5
226
+ @channels = 3
227
+ end
228
+ it_should_behave_like 'Panner with audio rate'
229
+ it_should_behave_like 'Panner with control rate'
230
+ it_should_behave_like 'Multi input panner'
231
+
232
+ # it "should have keyword args" do
233
+ # @class.ar( @ugen, @ugen2 , :level => 2.0 ).first.source.inputs.should == [@ugen, @ugen2 , 0.0, 2.0]
234
+ # end
235
+ end
236
+
237
+ describe DecodeB2, 'five channels' do
238
+ before do
239
+ @class = DecodeB2
240
+ @params = 5, 0.5, 0.5, 0.5, 0.5
241
+ @inputs = 0.5, 0.5, 0.5, 0.5
242
+ @channels = 5
243
+ end
244
+ it_should_behave_like 'Panner with audio rate'
245
+ it_should_behave_like 'Panner with control rate'
246
+
247
+ end
248
+
249
+ describe DecodeB2, 'seven channels' do
250
+ before do
251
+ @class = DecodeB2
252
+ @params = 7, 0.5, 0.5, 0.5, 0.5
253
+ @inputs = 0.5, 0.5, 0.5, 0.5
254
+ @channels = 7
255
+ end
256
+ it_should_behave_like 'Panner with audio rate'
257
+ it_should_behave_like 'Panner with control rate'
258
+ end
259
+
260
+ describe PanAz, 'five channels' do
261
+ before do
262
+ @class = PanAz
263
+ @ugen = MockUgen.new(:audio, 1, 2)
264
+ @params = 5, @ugen, 0.5, 0.5, 0.5, 0.5
265
+ @inputs = @ugen, 0.5, 0.5, 0.5, 0.5
266
+ @channels = 5
267
+ end
268
+ it_should_behave_like 'Panner with audio rate'
269
+ it_should_behave_like 'Panner with control rate'
270
+ end
271
+ end
data/spec/server.rb ADDED
@@ -0,0 +1,12 @@
1
+ class Scruby::Server
2
+ attr_reader :output
3
+ def puts string
4
+ @output ||= ""
5
+ @output << string
6
+ string
7
+ end
8
+
9
+ def flush
10
+ @output = ''
11
+ end
12
+ end
@@ -0,0 +1,198 @@
1
+ require File.expand_path(File.dirname(__FILE__)) + "/helper"
2
+
3
+ require 'arguments'
4
+ require 'tempfile'
5
+ require 'scruby/node'
6
+ require 'scruby/core_ext/array'
7
+ require 'scruby/core_ext/typed_array'
8
+ require 'scruby/bus'
9
+ require "scruby/server"
10
+
11
+ include Scruby
12
+
13
+ module Mocks
14
+ class Bus; end
15
+ class Buffer; end
16
+ end
17
+
18
+ Thread.abort_on_exception = true
19
+
20
+ class Scruby::Server
21
+ attr_reader :output
22
+
23
+ def puts string
24
+ @output ||= ""
25
+ @output << string
26
+ string
27
+ end
28
+
29
+ def flush
30
+ @output = ''
31
+ end
32
+ end
33
+
34
+ class Scruby::Buffer
35
+ def == other
36
+ self.class == other.class
37
+ end
38
+ end
39
+
40
+ describe Message do
41
+ it "should encode array as Message Blob" do
42
+ m = Message.new "/b_allocRead", 1, "path", 1, -1, ["/b_query", 1]
43
+ m.encode.should == "/b_allocRead\000\000\000\000,isiib\000\000\000\000\000\001path\000\000\000\000\000\000\000\001\377\377\377\377\000\000\000\024/b_query\000\000\000\000,i\000\000\000\000\000\001"
44
+ end
45
+ end
46
+
47
+ describe Server do
48
+
49
+ describe "booting" do
50
+ before do
51
+ @server = Server.new
52
+ end
53
+
54
+ after do
55
+ @server.quit
56
+ end
57
+
58
+ it "should not rise scynth not found error" do
59
+ lambda{ @server.boot }.should_not raise_error(Server::SCError)
60
+ end
61
+
62
+ it "should not reboot" do
63
+ @server.boot
64
+ Thread.should_not_receive(:new)
65
+ @server.boot
66
+ end
67
+
68
+ it "should remove server from server list" do
69
+ @server.boot
70
+ @server.quit
71
+ Server.all.should be_empty
72
+ end
73
+
74
+ it "should raise scsynth not found error" do
75
+ lambda{ @server = Server.new(:path => '/not_scsynth'); @server.boot }.should raise_error(Server::SCError)
76
+ end
77
+
78
+ it "should add self to a list of servers" do
79
+ s = Server.new
80
+ Server.all.should include(s)
81
+ end
82
+ end
83
+
84
+ describe 'sending OSC' do
85
+ before :all do
86
+ @server = Server.new
87
+ @server.boot
88
+ @server.send "/dumpOSC", 3
89
+ sleep 0.05
90
+ end
91
+
92
+ after :all do
93
+ @server.quit
94
+ end
95
+
96
+ before do
97
+ @server.flush
98
+ end
99
+
100
+ it "should send dump" do
101
+ @server.send "/dumpOSC", 1
102
+ sleep 0.1
103
+ @server.output.should =~ %r{/dumpOSC}
104
+ end
105
+
106
+ it "should send synthdef" do
107
+ sdef = mock 'sdef', :encode => [ 83, 67, 103, 102, 0, 0, 0, 1, 0, 1, 4, 104, 111, 108, 97, 0, 2, 67, -36, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 6, 83, 105, 110, 79, 115, 99, 2, 0, 2, 0, 1, 0, 0, -1, -1, 0, 0, -1, -1, 0, 1, 2, 0, 0 ].pack('C*')
108
+ @server.send_synth_def sdef
109
+ sleep 0.1
110
+ @server.output.should =~ %r{\[ "#bundle", 1, \n\s*\[ "/d_recv", DATA\[56\], 0 \]\n\]}
111
+ end
112
+
113
+ it "should send synthdef2" do
114
+ sdef = mock 'sdef', :encode => [83, 67, 103, 102, 0, 0, 0, 1, 0, 1, 3, 114, 101, 99, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 6, 98, 117, 102, 110, 117, 109, 0, 0, 0, 3, 7, 67, 111, 110, 116, 114, 111, 108, 1, 0, 0, 0, 1, 0, 0, 1, 2, 73, 110, 2, 0, 1, 0, 2, 0, 0, 255, 255, 0, 0, 2, 2, 7, 68, 105, 115, 107, 79, 117, 116, 2, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 1, 0, 0].pack('C*')
115
+ @server.send_synth_def sdef
116
+ sleep 0.1
117
+ @server.output.should =~ %r{\[ "#bundle", 1, \n\s*\[ "/d_recv", DATA\[100\], 0 \]\n\]}
118
+ end
119
+ end
120
+
121
+ shared_examples_for 'allocator' do
122
+ it "should allow less than @max_size elements" do
123
+ @server.__send__( :allocate, @kind, (1..@allowed_elements).map{ @class.new } )
124
+ @server.__send__(@kind).size.should == @max_size
125
+ end
126
+
127
+ it "should not allow more than @max_size elements" do
128
+ lambda { @server.__send__( :allocate, @kind, (1..@max_size+1).map{ @class.new } ) }.should raise_error(SCError)
129
+ end
130
+
131
+ it "should try to allocate lowest nil slot" do
132
+ @server.__send__(@kind).concat([nil, nil, @class.new, nil, nil, nil, @class.new])
133
+ @server.__send__ :allocate, @kind, buffer = @class.new
134
+ @server.__send__(@kind).index(buffer).should == @index_start
135
+ end
136
+
137
+ it "should allocate various elements in available contiguous indices" do
138
+ @server.__send__(@kind).concat([nil, nil, @class.new, nil, nil, nil, @class.new])
139
+ @server.__send__ :allocate, @kind, @class.new, @class.new, @class.new
140
+ elements = @server.__send__(@kind)[@max_size-@allowed_elements..-1].compact
141
+ elements.should have(5).elements
142
+ end
143
+
144
+ it "should allocate by appending various elements" do
145
+ @server.__send__(@kind).concat([nil, nil, @class.new, nil, nil, nil, @class.new])
146
+ @server.__send__ :allocate, @kind, @class.new, @class.new, @class.new, @class.new
147
+ elements = @server.__send__(@kind)[@max_size-@allowed_elements..-1].compact
148
+ elements.should have(6).elements
149
+ end
150
+
151
+ it "should not surpass the max buffer limit" do
152
+ @server.__send__( :allocate, @kind, (1..@allowed_elements-2).map{ |i| @class.new if i % 2 == 0 } )
153
+ lambda { @server.__send__ :allocate, @kind, @class.new, @class.new, @class.new }.should raise_error
154
+ end
155
+
156
+ it "should allocate by appending" do
157
+ @server.__send__( :allocate, @kind, (1..@allowed_elements-3).map{ |i| @class.new if i % 2 == 0 } )
158
+ @server.__send__ :allocate, @kind, @class.new, @class.new, @class.new
159
+ @server.__send__(@kind).size.should == @max_size
160
+ end
161
+ end
162
+
163
+ describe 'buffers allocation' do
164
+ before do
165
+ @server = Server.new
166
+ @kind = :buffers
167
+ @class = ::Mocks::Buffer
168
+ @allowed_elements = @max_size = 1024
169
+ @index_start = 0
170
+ end
171
+ it_should_behave_like 'allocator'
172
+ end
173
+
174
+ describe 'control_buses allocation' do
175
+ before do
176
+ @server = Server.new
177
+ @kind = :control_buses
178
+ @class = ::Mocks::Bus
179
+ @allowed_elements = @max_size = 4096
180
+ @index_start = 0
181
+ end
182
+ it_should_behave_like 'allocator'
183
+ end
184
+
185
+ describe 'audio_buses allocation' do
186
+ before do
187
+ @server = Server.new
188
+ @kind = :audio_buses
189
+ @class = ::Mocks::Bus
190
+ @allowed_elements = 112
191
+ @max_size = 128
192
+ @index_start = 16
193
+ end
194
+ it_should_behave_like 'allocator'
195
+ end
196
+
197
+ end
198
+
@@ -0,0 +1,103 @@
1
+ require File.expand_path(File.dirname(__FILE__)) + "/helper"
2
+
3
+
4
+ require "scruby/core_ext/typed_array"
5
+ require "scruby/node"
6
+ require "scruby/bus"
7
+ require "scruby/group"
8
+ require "scruby/synth"
9
+ require "scruby/server"
10
+ require File.join( File.expand_path(File.dirname(__FILE__)), "server")
11
+
12
+ include Scruby
13
+
14
+ describe Synth do
15
+
16
+ before :all do
17
+ Server.clear
18
+ @server = Server.new
19
+ @server.boot
20
+ @server.send "/dumpOSC", 3
21
+ sleep 0.05
22
+ end
23
+
24
+ after :all do
25
+ @server.quit
26
+ sleep 1
27
+ end
28
+
29
+ before do
30
+ @server.flush
31
+ end
32
+
33
+ describe 'instantiation with node target' do
34
+ before do
35
+ Node.reset!
36
+ @target = Node.new( (0..3).map{ Server.new } )
37
+ @synth = Synth.new :synth, {:attack => 10}, @target
38
+ end
39
+
40
+ it "should initialize" do
41
+ @synth.name.should == 'synth'
42
+ @synth.servers.should == @target.servers
43
+ end
44
+
45
+ it "should initialize not passing servers and have default servers" do
46
+ s = Synth.new( 'synth' )
47
+ s.servers.should == Server.all
48
+ end
49
+ end
50
+
51
+ describe 'instantiaton messaging' do
52
+ it "should send /s_new message" do
53
+ synth = Synth.new :synth, :attack => 10
54
+ sleep 0.05
55
+ @server.output.should =~ %r{\[ "/s_new", "#{ synth.name }", #{ synth.id }, 0, 1, "attack", 10 \]}
56
+ end
57
+
58
+ it "should send set message and return self" do
59
+ synth = Synth.new :synth, :attack => 10
60
+ synth.set( :attack => 20 ).should be_a(Synth)
61
+ sleep 0.05
62
+ @server.output.should =~ %r{\[ "/n_set", #{ synth.id }, "attack", 20 \]}
63
+ end
64
+ end
65
+
66
+ describe 'Default Group' do
67
+ it "should send after message" do
68
+ synth = Synth.after nil, :synth, :attack => 10
69
+ synth.should be_a(Synth)
70
+ sleep 0.05
71
+ @server.output.should =~ %r{\[ "/s_new", "#{ synth.name }", #{ synth.id }, 3, 1, "attack", 10 \]}
72
+ end
73
+
74
+ it "should send before message" do
75
+ synth = Synth.before nil, :synth, :attack => 10
76
+ synth.should be_a(Synth)
77
+ sleep 0.05
78
+ @server.output.should =~ %r{\[ "/s_new", "#{ synth.name }", #{ synth.id }, 2, 1, "attack", 10 \]}
79
+ end
80
+
81
+ it "should send head message" do
82
+ synth = Synth.head nil, :synth, :attack => 10
83
+ synth.should be_a(Synth)
84
+ sleep 0.05
85
+ @server.output.should =~ %r{\[ "/s_new", "#{ synth.name }", #{ synth.id }, 0, 1, "attack", 10 \]}
86
+ end
87
+
88
+ it "should send tail message" do
89
+ synth = Synth.tail nil, :synth, :attack => 10
90
+ synth.should be_a(Synth)
91
+ sleep 0.05
92
+ @server.output.should =~ %r{\[ "/s_new", "#{ synth.name }", #{ synth.id }, 1, 1, "attack", 10 \]}
93
+ end
94
+
95
+ it "should send replace message" do
96
+ synth = Synth.replace nil, :synth, :attack => 10
97
+ synth.should be_a(Synth)
98
+ sleep 0.05
99
+ @server.output.should =~ %r{\[ "/s_new", "#{ synth.name }", #{ synth.id }, 4, 1, "attack", 10 \]}
100
+ end
101
+ end
102
+
103
+ end