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.
- data/.gitignore +5 -0
- data/.rspec +1 -0
- data/Gemfile +4 -0
- data/Gemfile.lock +53 -0
- data/README.rdoc +65 -0
- data/Rakefile +10 -0
- data/TODO.markdown +3 -0
- data/examples/example.rb +73 -0
- data/lib/scruby/buffer.rb +153 -0
- data/lib/scruby/bus.rb +67 -0
- data/lib/scruby/control_name.rb +29 -0
- data/lib/scruby/core_ext/array.rb +44 -0
- data/lib/scruby/core_ext/delegator_array.rb +44 -0
- data/lib/scruby/core_ext/fixnum.rb +8 -0
- data/lib/scruby/core_ext/numeric.rb +25 -0
- data/lib/scruby/core_ext/object.rb +23 -0
- data/lib/scruby/core_ext/proc.rb +11 -0
- data/lib/scruby/core_ext/string.rb +5 -0
- data/lib/scruby/core_ext/symbol.rb +5 -0
- data/lib/scruby/core_ext/typed_array.rb +54 -0
- data/lib/scruby/env.rb +93 -0
- data/lib/scruby/group.rb +24 -0
- data/lib/scruby/node.rb +102 -0
- data/lib/scruby/server.rb +182 -0
- data/lib/scruby/synth.rb +50 -0
- data/lib/scruby/synthdef.rb +109 -0
- data/lib/scruby/ticker.rb +92 -0
- data/lib/scruby/ugens/buffer_read_write.rb +98 -0
- data/lib/scruby/ugens/demand.rb +9 -0
- data/lib/scruby/ugens/disk_in_out.rb +33 -0
- data/lib/scruby/ugens/env_gen.rb +38 -0
- data/lib/scruby/ugens/in_out.rb +46 -0
- data/lib/scruby/ugens/multi_out.rb +53 -0
- data/lib/scruby/ugens/operation_indices.yaml +92 -0
- data/lib/scruby/ugens/operation_ugens.rb +63 -0
- data/lib/scruby/ugens/panner.rb +137 -0
- data/lib/scruby/ugens/ugen.rb +173 -0
- data/lib/scruby/ugens/ugen_defs.yaml +3123 -0
- data/lib/scruby/ugens/ugen_operations.rb +57 -0
- data/lib/scruby/ugens/ugens.rb +95 -0
- data/lib/scruby/version.rb +3 -0
- data/lib/scruby.rb +65 -0
- data/scruby.gemspec +27 -0
- data/spec/buffer_read_write_spec.rb +333 -0
- data/spec/buffer_spec.rb +199 -0
- data/spec/bus_spec.rb +184 -0
- data/spec/core_ext/core_ext_spec.rb +120 -0
- data/spec/core_ext/delegator_array_spec.rb +144 -0
- data/spec/core_ext/typed_array_spec.rb +95 -0
- data/spec/demand_spec.rb +81 -0
- data/spec/disk_in_out_spec.rb +138 -0
- data/spec/env_gen_spec.rb +23 -0
- data/spec/env_spec.rb +73 -0
- data/spec/group_spec.rb +71 -0
- data/spec/helper.rb +20 -0
- data/spec/in_out_spec.rb +127 -0
- data/spec/integration_spec.rb +88 -0
- data/spec/multiout_ugen_spec.rb +86 -0
- data/spec/node_spec.rb +112 -0
- data/spec/operation_ugens_spec.rb +196 -0
- data/spec/panner_spec.rb +271 -0
- data/spec/server.rb +12 -0
- data/spec/server_spec.rb +198 -0
- data/spec/synth_spec.rb +103 -0
- data/spec/synthdef_spec.rb +267 -0
- data/spec/ugen_operations_spec.rb +100 -0
- data/spec/ugen_spec.rb +356 -0
- data/spec/ugens_spec.rb +65 -0
- metadata +207 -0
@@ -0,0 +1,57 @@
|
|
1
|
+
module Scruby
|
2
|
+
module Ugens
|
3
|
+
# This module enables Ugen operations for Ugens, Numeric and Arrays, when any instance of this classes executes an operation with an Ugen a BinaryUgenOp
|
4
|
+
# is instantiated where both objects are the inputs of the operation, an UnaryUgenOp is instantiated for unary operations
|
5
|
+
# This are the permited operations:
|
6
|
+
#
|
7
|
+
# Binary:
|
8
|
+
# +, -, *, div, /, mod, <=, >=, minimum, maximum, lcm, gcd, round, roundUp, trunc, atan2, hypot, hypotApx, pow, leftShift, rightShift, unsignedRightShift, ring1, ring2, ring3, ring4, difsqr, sumsqr, sqrsum, sqrdif, absdif, thresh, amclip, scaleneg, clip2, excess, fold2, wrap2, rrand and exprand
|
9
|
+
#
|
10
|
+
# Unary:
|
11
|
+
# neg, bitNot, abs, asFloat, ceil, floor, frac, sign, squared, cubed, sqrt, exp, reciprocal, midicps, cpsmidi, midiratio, ratiomidi, dbamp, ampdb, octcps, cpsoct, log, log2, log10, sin, cos, tam, asin, acos, atan, sinh, cosh, tanh, rand, rand2, linrand, bilinrand, sum3rand, distort, softclip, coin, rectWindow, hanWindow, welWindow, triWindow, ramp and scurve
|
12
|
+
#
|
13
|
+
module UgenOperations
|
14
|
+
operation_indices = YAML::load File.open( File.dirname(__FILE__) + "/operation_indices.yaml" )
|
15
|
+
UNARY = operation_indices['unary']
|
16
|
+
BINARY = operation_indices['binary']
|
17
|
+
SAFE_NAMES = { :+ => :plus, :- => :minus, :* => :mult, :/ => :div2, :<= => :less_than_or_eql, :>= => :more_than_or_eql }
|
18
|
+
|
19
|
+
def self.included klass
|
20
|
+
# Define unary operations
|
21
|
+
UNARY.each_key do |op|
|
22
|
+
define_method(op){ UnaryOpUGen.new op, self } unless klass.instance_methods.include? op
|
23
|
+
end
|
24
|
+
|
25
|
+
# Define binary operations
|
26
|
+
ugen_subclass = klass.ancestors.include? Ugen
|
27
|
+
meth_def =
|
28
|
+
if ugen_subclass
|
29
|
+
proc do |safe, op|
|
30
|
+
proc{ |input| BinaryOpUGen.new op, self, input }
|
31
|
+
end
|
32
|
+
else
|
33
|
+
proc do |safe, op|
|
34
|
+
proc do |input|
|
35
|
+
if input.kind_of? Ugen
|
36
|
+
BinaryOpUGen.new op, self, input
|
37
|
+
else
|
38
|
+
__send__ "__original_#{ safe }", input
|
39
|
+
end
|
40
|
+
end
|
41
|
+
end
|
42
|
+
end
|
43
|
+
|
44
|
+
BINARY.each_key do |op|
|
45
|
+
safe = SAFE_NAMES[op]
|
46
|
+
define_method "__ugenop_#{ safe || op }", &meth_def.call(safe || op, op)
|
47
|
+
klass.send :alias_method, "__original_#{ safe || op }", op if safe unless ugen_subclass
|
48
|
+
klass.send :alias_method, op, "__ugenop_#{ safe || op }"
|
49
|
+
end
|
50
|
+
end
|
51
|
+
end
|
52
|
+
|
53
|
+
[Ugen, Fixnum, Float].each{ |k| k.send :include, UgenOperations }
|
54
|
+
end
|
55
|
+
end
|
56
|
+
|
57
|
+
|
@@ -0,0 +1,95 @@
|
|
1
|
+
module Scruby
|
2
|
+
module Ugens
|
3
|
+
|
4
|
+
#
|
5
|
+
# Default SuperCollider Ugens definitions are stored in the ugen_defs.yml file and are defined as Ruby classes on the fly, the yml format is:
|
6
|
+
#
|
7
|
+
# NewUgen:
|
8
|
+
# :control:
|
9
|
+
# - - :input
|
10
|
+
# -
|
11
|
+
# - - :freq
|
12
|
+
# - 440
|
13
|
+
# :audio:
|
14
|
+
# - - :input
|
15
|
+
# -
|
16
|
+
# - - :freq
|
17
|
+
# - 440
|
18
|
+
#
|
19
|
+
# To define a Ruby class corresponding to an Ugen +name+ should be passed and a hash of +rates+, inputs and default values, default values can be nil
|
20
|
+
#
|
21
|
+
# Ugens.define_ugen( 'NewUgen', {:control => [[:input, nil], [:freq, 440]], :audio => [[:input, nil], [:freq, 440]]} )
|
22
|
+
#
|
23
|
+
# The previous is equivalent as the following ruby code:
|
24
|
+
#
|
25
|
+
# class NewUgen < Ugen
|
26
|
+
# class << self
|
27
|
+
# def kr( input, freq = 440 )
|
28
|
+
# new :control, input, freq
|
29
|
+
# end
|
30
|
+
#
|
31
|
+
# def ar( input, freq = 440)
|
32
|
+
# new :audio, input, freq
|
33
|
+
# end
|
34
|
+
# # Makes possible passing args either in order or as argument hash
|
35
|
+
# named_arguments_for :ar, :kr
|
36
|
+
# end
|
37
|
+
# end
|
38
|
+
#
|
39
|
+
# In future versions Ugen definitions will be loaded from ~/Ugens or ~/.Ugens directories either as yml files or rb files
|
40
|
+
#
|
41
|
+
def self.define_ugen name, rates
|
42
|
+
rate_name = {:audio => :ar, :control => :kr, :scalar => :ir, :demand => :new}
|
43
|
+
|
44
|
+
methods = rates.collect do |rate, args|
|
45
|
+
if rate == :demand or rate == :scalar
|
46
|
+
<<-RUBY_EVAL
|
47
|
+
def new #{ args.collect{ |a, v| "#{ a } = #{ v.inspect }" }.join(', ') }
|
48
|
+
super #{ args.unshift([rate.inspect]).collect{ |a| a.first }.join(', ') }
|
49
|
+
end
|
50
|
+
RUBY_EVAL
|
51
|
+
else
|
52
|
+
args ||= []
|
53
|
+
args.push [:mul, 1], [:add, 0]
|
54
|
+
args.uniq!
|
55
|
+
assigns = []
|
56
|
+
args.each_with_index do |arg, index|
|
57
|
+
key, val = arg
|
58
|
+
assigns << %{
|
59
|
+
#{ key } = opts[:#{ key }] || args[#{ index }] || #{ val }
|
60
|
+
raise( ArgumentError.new("`#{ key }` value must be provided") ) unless #{ key }
|
61
|
+
}
|
62
|
+
end
|
63
|
+
|
64
|
+
new_args = [":#{ rate }"] + args[0...-2].collect{ |a| a.first }
|
65
|
+
<<-RUBY_EVAL
|
66
|
+
def #{ rate_name[rate] } *args
|
67
|
+
raise ArgumentError.new("wrong number of arguments (\#{ args } for #{ args.size })") if args.size > #{args.size}
|
68
|
+
opts = args.last.kind_of?( Hash ) ? args.pop : {}
|
69
|
+
#{ assigns.join("\n") }
|
70
|
+
new( #{ new_args.join(', ') } ).muladd( mul, add )
|
71
|
+
end
|
72
|
+
|
73
|
+
def params
|
74
|
+
@params
|
75
|
+
end
|
76
|
+
RUBY_EVAL
|
77
|
+
end
|
78
|
+
end.join("\n")
|
79
|
+
|
80
|
+
self.class_eval <<-RUBY_EVAL
|
81
|
+
class #{ name } < Ugen
|
82
|
+
@params = #{ rates.inspect }
|
83
|
+
class << self
|
84
|
+
#{ methods }
|
85
|
+
end
|
86
|
+
end
|
87
|
+
RUBY_EVAL
|
88
|
+
# # TODO: Load from ~/Ugens directory
|
89
|
+
end
|
90
|
+
|
91
|
+
YAML::load( File.open( File.dirname(__FILE__) + "/ugen_defs.yaml" ) ).each_pair do |key, value|
|
92
|
+
self.define_ugen key, value
|
93
|
+
end
|
94
|
+
end
|
95
|
+
end
|
data/lib/scruby.rb
ADDED
@@ -0,0 +1,65 @@
|
|
1
|
+
#--
|
2
|
+
# Copyright (c) 2008 Macario Ortega
|
3
|
+
#
|
4
|
+
# This program is free software: you can redistribute it and/or modify
|
5
|
+
# it under the terms of the GNU General Public License as published by
|
6
|
+
# the Free Software Foundation, either version 3 of the License, or
|
7
|
+
# any later version.
|
8
|
+
#
|
9
|
+
# This program is distributed in the hope that it will be useful,
|
10
|
+
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
11
|
+
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
12
|
+
# GNU General Public License for more details.
|
13
|
+
#
|
14
|
+
# You should have received a copy of the GNU General Public License
|
15
|
+
# along with this program. If not, see <http://www.gnu.org/licenses/>.
|
16
|
+
#++
|
17
|
+
|
18
|
+
require 'date'
|
19
|
+
require 'rubygems'
|
20
|
+
require 'arguments'
|
21
|
+
require 'ruby-osc'
|
22
|
+
require 'eventmachine'
|
23
|
+
require 'yaml'
|
24
|
+
|
25
|
+
$:.unshift(File.dirname(__FILE__)) unless $:.include?(File.dirname(__FILE__)) || $:.include?(File.expand_path(File.dirname(__FILE__)))
|
26
|
+
|
27
|
+
require "scruby/version"
|
28
|
+
|
29
|
+
require "scruby/core_ext/object"
|
30
|
+
require "scruby/core_ext/array"
|
31
|
+
require "scruby/core_ext/fixnum"
|
32
|
+
require "scruby/core_ext/numeric"
|
33
|
+
require "scruby/core_ext/proc"
|
34
|
+
require "scruby/core_ext/string"
|
35
|
+
require "scruby/core_ext/symbol"
|
36
|
+
require "scruby/core_ext/typed_array"
|
37
|
+
require "scruby/core_ext/delegator_array"
|
38
|
+
require "scruby/env"
|
39
|
+
require "scruby/control_name"
|
40
|
+
|
41
|
+
require "scruby/ugens/ugen"
|
42
|
+
require "scruby/ugens/ugen_operations"
|
43
|
+
require "scruby/ugens/multi_out"
|
44
|
+
require "scruby/ugens/panner"
|
45
|
+
require "scruby/ugens/buffer_read_write"
|
46
|
+
require "scruby/ugens/disk_in_out"
|
47
|
+
require "scruby/ugens/in_out"
|
48
|
+
|
49
|
+
require "scruby/ugens/operation_ugens"
|
50
|
+
|
51
|
+
require "scruby/ugens/ugens"
|
52
|
+
require "scruby/synthdef"
|
53
|
+
|
54
|
+
require "scruby/server"
|
55
|
+
require "scruby/ugens/env_gen"
|
56
|
+
|
57
|
+
require "scruby/node"
|
58
|
+
require "scruby/synth"
|
59
|
+
require "scruby/bus"
|
60
|
+
require "scruby/buffer"
|
61
|
+
|
62
|
+
require "scruby/ticker"
|
63
|
+
|
64
|
+
include Scruby
|
65
|
+
include Ugens
|
data/scruby.gemspec
ADDED
@@ -0,0 +1,27 @@
|
|
1
|
+
# -*- encoding: utf-8 -*-
|
2
|
+
$:.push File.expand_path("../lib", __FILE__)
|
3
|
+
require "scruby/version"
|
4
|
+
|
5
|
+
Gem::Specification.new do |s|
|
6
|
+
s.name = "scruby"
|
7
|
+
s.version = Scruby::VERSION
|
8
|
+
s.platform = Gem::Platform::RUBY
|
9
|
+
s.authors = ["Macario Ortega"]
|
10
|
+
s.email = ["macarui@gmail.com"]
|
11
|
+
s.homepage = "http://github.com/maca/scruby"
|
12
|
+
s.summary = %q{SuperCollider client for Ruby}
|
13
|
+
s.description = %q{SuperCollider client for Ruby}
|
14
|
+
|
15
|
+
s.rubyforge_project = "scruby"
|
16
|
+
|
17
|
+
s.add_development_dependency 'rspec'
|
18
|
+
s.add_development_dependency 'bundler'
|
19
|
+
s.add_dependency 'ruby-osc', '~> 0.3'
|
20
|
+
s.add_dependency 'arguments', '~> 0.6'
|
21
|
+
s.add_dependency 'live', '~> 0.1'
|
22
|
+
|
23
|
+
s.files = `git ls-files`.split("\n")
|
24
|
+
s.test_files = `git ls-files -- {test,spec,features}/*`.split("\n")
|
25
|
+
s.executables = `git ls-files -- bin/*`.split("\n").map{ |f| File.basename(f) }
|
26
|
+
s.require_paths = ["lib"]
|
27
|
+
end
|
@@ -0,0 +1,333 @@
|
|
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/operation_ugens"
|
9
|
+
require "scruby/ugens/multi_out"
|
10
|
+
require "scruby/ugens/ugens"
|
11
|
+
require "scruby/ugens/buffer_read_write"
|
12
|
+
|
13
|
+
include Scruby
|
14
|
+
include Ugens
|
15
|
+
|
16
|
+
class MockUgen < Ugen
|
17
|
+
class << self; public :new; end
|
18
|
+
end
|
19
|
+
|
20
|
+
|
21
|
+
describe 'Buffer Read Ugens' do
|
22
|
+
shared_examples_for 'Buffer reader Ugen' do
|
23
|
+
before do
|
24
|
+
@proxies = @class.send @method, *@params
|
25
|
+
@inputs ||= @params
|
26
|
+
@instance = @proxies.first.source
|
27
|
+
end
|
28
|
+
|
29
|
+
it "should output a DelegatorArray" do
|
30
|
+
@proxies.should be_a(DelegatorArray)
|
31
|
+
end
|
32
|
+
|
33
|
+
it "should have correct rate" do
|
34
|
+
@instance.rate.should == @rate
|
35
|
+
end
|
36
|
+
|
37
|
+
it "should return an array of output proxies" do
|
38
|
+
@proxies.should be_a(Array)
|
39
|
+
@proxies.should have(@channels).proxies
|
40
|
+
@proxies.each_with_index do |proxy, i|
|
41
|
+
proxy.source.should be_a(@class)
|
42
|
+
proxy.should be_a(OutputProxy)
|
43
|
+
proxy.output_index.should == i
|
44
|
+
end
|
45
|
+
end
|
46
|
+
|
47
|
+
it "should set inputs" do
|
48
|
+
@instance.inputs.should == @inputs
|
49
|
+
end
|
50
|
+
end
|
51
|
+
|
52
|
+
shared_examples_for 'Buffer reader Ugen with control rate' do
|
53
|
+
before do
|
54
|
+
@method = :kr
|
55
|
+
@rate = :control
|
56
|
+
end
|
57
|
+
it_should_behave_like 'Buffer reader Ugen'
|
58
|
+
end
|
59
|
+
|
60
|
+
shared_examples_for 'Buffer reader Ugen with audio rate' do
|
61
|
+
before do
|
62
|
+
@method = :ar
|
63
|
+
@rate = :audio
|
64
|
+
end
|
65
|
+
it_should_behave_like 'Buffer reader Ugen'
|
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
|
+
describe PlayBuf, 'Two channel' do
|
73
|
+
before do
|
74
|
+
@class = PlayBuf
|
75
|
+
@channels = 2
|
76
|
+
@inputs = 1.0, 1.0, 1.0, 1.0, 1.0, 1.0
|
77
|
+
@params = @channels, *@inputs
|
78
|
+
end
|
79
|
+
|
80
|
+
it_should_behave_like 'Buffer reader Ugen with control rate'
|
81
|
+
it_should_behave_like 'Buffer reader Ugen with audio rate'
|
82
|
+
end
|
83
|
+
|
84
|
+
describe PlayBuf, 'Four channel' do
|
85
|
+
before do
|
86
|
+
@class = PlayBuf
|
87
|
+
@channels = 4
|
88
|
+
@inputs = 1.0, 1.0, 1.0, 1.0, 1.0, 1.0
|
89
|
+
@params = @channels, *@inputs
|
90
|
+
end
|
91
|
+
|
92
|
+
it_should_behave_like 'Buffer reader Ugen with control rate'
|
93
|
+
it_should_behave_like 'Buffer reader Ugen with audio rate'
|
94
|
+
end
|
95
|
+
|
96
|
+
describe TGrains, 'Two Channel' do
|
97
|
+
before do
|
98
|
+
@class = TGrains
|
99
|
+
@channels = 2
|
100
|
+
@inputs = 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0
|
101
|
+
@params = @channels, *@inputs
|
102
|
+
end
|
103
|
+
|
104
|
+
it_should_behave_like 'Buffer reader Ugen with audio rate'
|
105
|
+
|
106
|
+
it "should require at least two channels" do
|
107
|
+
lambda { @class.ar 1, *@params[1..-1] }.should raise_error(ArgumentError)
|
108
|
+
end
|
109
|
+
end
|
110
|
+
|
111
|
+
describe TGrains, 'Four Channel' do
|
112
|
+
before do
|
113
|
+
@class = TGrains
|
114
|
+
@channels = 4
|
115
|
+
@inputs = 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0
|
116
|
+
@params = @channels, *@inputs
|
117
|
+
end
|
118
|
+
|
119
|
+
it_should_behave_like 'Buffer reader Ugen with audio rate'
|
120
|
+
|
121
|
+
it "should require at least two channels" do
|
122
|
+
lambda { @class.ar 1, *@params[1..-1] }.should raise_error(ArgumentError)
|
123
|
+
end
|
124
|
+
end
|
125
|
+
|
126
|
+
describe BufRd, 'Two channel' do
|
127
|
+
before do
|
128
|
+
@class = BufRd
|
129
|
+
@channels = 2
|
130
|
+
@inputs = 1.0, 1.0, 1.0, 1.0
|
131
|
+
@params = @channels, *@inputs
|
132
|
+
end
|
133
|
+
|
134
|
+
it_should_behave_like 'Buffer reader Ugen with control rate'
|
135
|
+
it_should_behave_like 'Buffer reader Ugen with audio rate'
|
136
|
+
|
137
|
+
it "should require audio rate for phase"
|
138
|
+
end
|
139
|
+
|
140
|
+
describe BufRd, 'Four channel' do
|
141
|
+
before do
|
142
|
+
@class = BufRd
|
143
|
+
@channels = 4
|
144
|
+
@inputs = 1.0, 1.0, 1.0, 1.0
|
145
|
+
@params = @channels, *@inputs
|
146
|
+
end
|
147
|
+
|
148
|
+
it_should_behave_like 'Buffer reader Ugen with control rate'
|
149
|
+
it_should_behave_like 'Buffer reader Ugen with audio rate'
|
150
|
+
end
|
151
|
+
|
152
|
+
end
|
153
|
+
|
154
|
+
describe 'Buffer write Ugens' do
|
155
|
+
shared_examples_for 'Buffer writter Ugen' do
|
156
|
+
before do
|
157
|
+
@buff_ugen = @class.send @method, *@params
|
158
|
+
end
|
159
|
+
|
160
|
+
it "should have correct rate" do
|
161
|
+
@buff_ugen.rate.should == @rate
|
162
|
+
end
|
163
|
+
|
164
|
+
it "should set inputs" do
|
165
|
+
@buff_ugen.inputs.should == @inputs
|
166
|
+
end
|
167
|
+
end
|
168
|
+
|
169
|
+
shared_examples_for 'Buffer writter Ugen with control rate' do
|
170
|
+
before do
|
171
|
+
@rate = :control
|
172
|
+
@method = :kr
|
173
|
+
end
|
174
|
+
it_should_behave_like 'Buffer writter Ugen'
|
175
|
+
end
|
176
|
+
|
177
|
+
shared_examples_for 'Buffer writter Ugen with audio rate' do
|
178
|
+
before do
|
179
|
+
@rate = :audio
|
180
|
+
@method = :ar
|
181
|
+
end
|
182
|
+
it_should_behave_like 'Buffer writter Ugen'
|
183
|
+
end
|
184
|
+
|
185
|
+
describe BufWr, 'array input' do
|
186
|
+
before do
|
187
|
+
@class = BufWr
|
188
|
+
@array = [MockUgen.new(:audio, 1, 2)]*4
|
189
|
+
@inputs = 1, 2, 3, *@array
|
190
|
+
@params = @array, 1, 2, 3
|
191
|
+
end
|
192
|
+
it_should_behave_like 'Buffer writter Ugen with audio rate'
|
193
|
+
it_should_behave_like 'Buffer writter Ugen with control rate'
|
194
|
+
|
195
|
+
it "should require phase to be audio rate"
|
196
|
+
end
|
197
|
+
|
198
|
+
describe BufWr, 'single input' do
|
199
|
+
before do
|
200
|
+
@class = BufWr
|
201
|
+
@array = MockUgen.new(:audio, 1, 2)
|
202
|
+
@inputs = 1, 2, 3, @array
|
203
|
+
@params = @array, 1, 2, 3
|
204
|
+
end
|
205
|
+
it_should_behave_like 'Buffer writter Ugen with audio rate'
|
206
|
+
it_should_behave_like 'Buffer writter Ugen with control rate'
|
207
|
+
|
208
|
+
it "should require phase to be audio rate"
|
209
|
+
end
|
210
|
+
|
211
|
+
describe RecordBuf, 'array input' do
|
212
|
+
before do
|
213
|
+
@class = RecordBuf
|
214
|
+
@array = [MockUgen.new(:audio, 1, 2)]*4
|
215
|
+
@inputs = 1, 2, 3, 4, 5, 6, 7, 8, *@array
|
216
|
+
@params = @array, 1, 2, 3, 4, 5, 6, 7, 8
|
217
|
+
end
|
218
|
+
it_should_behave_like 'Buffer writter Ugen with audio rate'
|
219
|
+
it_should_behave_like 'Buffer writter Ugen with control rate'
|
220
|
+
|
221
|
+
it "should require phase to be audio rate"
|
222
|
+
end
|
223
|
+
|
224
|
+
describe RecordBuf, 'single input' do
|
225
|
+
before do
|
226
|
+
@class = RecordBuf
|
227
|
+
@array = MockUgen.new(:audio, 1, 2)
|
228
|
+
@inputs = 1, 2, 3, 4, 5, 6, 7, 8, @array
|
229
|
+
@params = @array, 1, 2, 3, 4, 5, 6, 7, 8
|
230
|
+
end
|
231
|
+
it_should_behave_like 'Buffer writter Ugen with audio rate'
|
232
|
+
it_should_behave_like 'Buffer writter Ugen with control rate'
|
233
|
+
|
234
|
+
it "should require phase to be audio rate"
|
235
|
+
end
|
236
|
+
|
237
|
+
describe ScopeOut, 'array input' do
|
238
|
+
before do
|
239
|
+
@class = ScopeOut
|
240
|
+
@array = [MockUgen.new(:audio, 1, 2)]*4
|
241
|
+
@inputs = 1, *@array
|
242
|
+
@params = @array, 1
|
243
|
+
end
|
244
|
+
it_should_behave_like 'Buffer writter Ugen with audio rate'
|
245
|
+
it_should_behave_like 'Buffer writter Ugen with control rate'
|
246
|
+
|
247
|
+
it "should require phase to be audio rate"
|
248
|
+
end
|
249
|
+
|
250
|
+
describe ScopeOut, 'single input' do
|
251
|
+
before do
|
252
|
+
@class = ScopeOut
|
253
|
+
@array = MockUgen.new(:audio, 1, 2)
|
254
|
+
@inputs = 1, @array
|
255
|
+
@params = @array, 1
|
256
|
+
end
|
257
|
+
it_should_behave_like 'Buffer writter Ugen with audio rate'
|
258
|
+
it_should_behave_like 'Buffer writter Ugen with control rate'
|
259
|
+
|
260
|
+
it "should require phase to be audio rate"
|
261
|
+
end
|
262
|
+
|
263
|
+
describe Tap, 'single input' do
|
264
|
+
before do
|
265
|
+
@inputs = 5, 1, 0, SampleRate.ir.neg * 3, 1, 0
|
266
|
+
@buff_ugen = Tap.ar( 5, 2, 3 ).first.source
|
267
|
+
end
|
268
|
+
|
269
|
+
it "should be instance of PlayBuf" do
|
270
|
+
@buff_ugen.should be_a(PlayBuf)
|
271
|
+
end
|
272
|
+
|
273
|
+
it "should have correct rate" do
|
274
|
+
@buff_ugen.rate.should == :audio
|
275
|
+
end
|
276
|
+
|
277
|
+
it "should set inputs" do
|
278
|
+
@buff_ugen.inputs.should == @inputs
|
279
|
+
end
|
280
|
+
end
|
281
|
+
|
282
|
+
describe Tap, 'single input' do
|
283
|
+
before do
|
284
|
+
@inputs = 5, 1, 0, SampleRate.ir.neg * 3, 1, 0
|
285
|
+
@channels = 1
|
286
|
+
@proxies = Tap.ar( 5, @channels, 3 )
|
287
|
+
end
|
288
|
+
|
289
|
+
it "should have one proxy" do
|
290
|
+
@proxies.should have(@channels).proxy
|
291
|
+
end
|
292
|
+
|
293
|
+
it "should be instance of PlayBuf" do
|
294
|
+
@proxies.each{ |p| p.source.should be_a(PlayBuf) }
|
295
|
+
end
|
296
|
+
|
297
|
+
it "should have correct rate" do
|
298
|
+
@proxies.each{ |p| p.source.rate.should == :audio }
|
299
|
+
end
|
300
|
+
|
301
|
+
it "should set inputs" do
|
302
|
+
@proxies.each{ |p| p.source.inputs == @inputs }
|
303
|
+
end
|
304
|
+
end
|
305
|
+
|
306
|
+
describe Tap, 'multi input' do
|
307
|
+
before do
|
308
|
+
@inputs = 5, 1, 0, SampleRate.ir.neg * 3, 1, 0
|
309
|
+
@channels = 4
|
310
|
+
@proxies = Tap.ar( 5, @channels, 3 )
|
311
|
+
end
|
312
|
+
|
313
|
+
it "should have one proxy" do
|
314
|
+
@proxies.should have(@channels).proxy
|
315
|
+
end
|
316
|
+
|
317
|
+
it "should be instance of PlayBuf" do
|
318
|
+
@proxies.each{ |p| p.source.should be_a(PlayBuf) }
|
319
|
+
end
|
320
|
+
|
321
|
+
it "should have correct rate" do
|
322
|
+
@proxies.each{ |p| p.source.rate.should == :audio }
|
323
|
+
end
|
324
|
+
|
325
|
+
it "should set inputs" do
|
326
|
+
@proxies.each{ |p| p.source.inputs == @inputs }
|
327
|
+
end
|
328
|
+
end
|
329
|
+
|
330
|
+
#LocalBuf
|
331
|
+
#MaxLocalBufs
|
332
|
+
#ClearBuf
|
333
|
+
end
|