rubyonacid 0.2.0 → 0.3.0
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/README.textile +4 -0
- data/VERSION +1 -1
- data/examples/ascii.rb +5 -7
- data/examples/midi.rb +14 -42
- data/examples/raw_audio.rb +10 -40
- data/examples/rinda_agent.rb +11 -50
- data/examples/svg.rb +85 -0
- data/examples/wxruby.rb +12 -62
- data/lib/rubyonacid/factories/all.rb +13 -0
- data/lib/rubyonacid/factories/combination.rb +11 -0
- data/lib/rubyonacid/factories/constant.rb +3 -1
- data/lib/rubyonacid/factories/example.rb +63 -0
- data/lib/rubyonacid/factories/flash.rb +1 -0
- data/lib/rubyonacid/factories/increment.rb +1 -0
- data/lib/rubyonacid/factories/input.rb +67 -0
- data/lib/rubyonacid/factories/loop.rb +2 -1
- data/lib/rubyonacid/factories/meta.rb +6 -1
- data/lib/rubyonacid/factories/random.rb +1 -0
- data/lib/rubyonacid/factories/random_walk.rb +29 -0
- data/lib/rubyonacid/factories/rinda.rb +2 -0
- data/lib/rubyonacid/factories/sine.rb +2 -0
- data/lib/rubyonacid/factories/skip.rb +1 -0
- data/lib/rubyonacid/factory.rb +4 -1
- data/spec/factories/input_spec.rb +96 -0
- data/spec/factories/random_walk_spec.rb +27 -0
- data/spec/factories/rinda_spec.rb +17 -10
- data/spec/factories/sine_spec.rb +0 -2
- data/spec/shared_factory_specs.rb +1 -2
- metadata +12 -5
- data/examples/permutations.rb +0 -40
- data/examples/quality_render.rb +0 -46
- data/examples/random_yaml.rb +0 -51
data/README.textile
CHANGED
@@ -75,6 +75,10 @@ Start by looking at the code for the bundled factories in the lib/rubyonacid/fac
|
|
75
75
|
|
76
76
|
h1. Resources
|
77
77
|
|
78
|
+
API documentation is hosted on RDoc.info.
|
79
|
+
|
80
|
+
"RDoc documentation":http://rdoc.info/projects/jaymcgavren/rubyonacid
|
81
|
+
|
78
82
|
The project page on GitHub lets you browse the latest code, or clone or fork the source repo for yourself.
|
79
83
|
|
80
84
|
"GitHub project":http://www.github.com/jaymcgavren/rubyonacid
|
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
0.
|
1
|
+
0.3.0
|
data/examples/ascii.rb
CHANGED
@@ -1,3 +1,5 @@
|
|
1
|
+
require 'rubyonacid/factories/all'
|
2
|
+
|
1
3
|
#This method takes any Factory and uses it to determine the length of lines to print.
|
2
4
|
def make_lines(factory)
|
3
5
|
#Show what factory we're working with.
|
@@ -11,33 +13,29 @@ def make_lines(factory)
|
|
11
13
|
end
|
12
14
|
|
13
15
|
#Random factories generate a random number between 0 and 1.
|
14
|
-
require 'rubyonacid/factories/random'
|
15
16
|
make_lines RubyOnAcid::RandomFactory.new
|
16
17
|
|
18
|
+
#Random walk factories increase or decrease the prior return value within a given amount.
|
19
|
+
make_lines RubyOnAcid::RandomWalkFactory.new(0.1)
|
20
|
+
|
17
21
|
#Loop factories loop from 0 to 1 (or 1 to 0 if the increment value is negative).
|
18
|
-
require 'rubyonacid/factories/loop'
|
19
22
|
make_lines RubyOnAcid::LoopFactory.new(0.2)
|
20
23
|
make_lines RubyOnAcid::LoopFactory.new(-0.2)
|
21
24
|
|
22
25
|
#Constant factories always return the same value,
|
23
|
-
require 'rubyonacid/factories/constant'
|
24
26
|
make_lines RubyOnAcid::ConstantFactory.new(0.5)
|
25
27
|
|
26
28
|
#This flash factory returns 0 twice, then 1 twice, then 0 twice, etc.
|
27
|
-
require 'rubyonacid/factories/flash'
|
28
29
|
make_lines RubyOnAcid::FlashFactory.new(2)
|
29
30
|
|
30
31
|
#Sine factories produce a "wave" pattern.
|
31
|
-
require 'rubyonacid/factories/sine'
|
32
32
|
make_lines RubyOnAcid::SineFactory.new(0.3)
|
33
33
|
|
34
34
|
#A RepeatFactory wraps another factory, queries it, and repeats the same value a certain number of times.
|
35
|
-
require 'rubyonacid/factories/repeat'
|
36
35
|
factory_to_repeat = RubyOnAcid::LoopFactory.new(0.3)
|
37
36
|
make_lines RubyOnAcid::RepeatFactory.new(factory_to_repeat, 2)
|
38
37
|
|
39
38
|
#A CombinationFactory combines the values of two or more other factories.
|
40
|
-
require 'rubyonacid/factories/combination'
|
41
39
|
factories_to_combine = [
|
42
40
|
RubyOnAcid::SineFactory.new(0.1),
|
43
41
|
RubyOnAcid::SineFactory.new(-0.2)
|
data/examples/midi.rb
CHANGED
@@ -1,55 +1,27 @@
|
|
1
1
|
require 'rubygems'
|
2
|
-
require 'rubyonacid/factories/
|
3
|
-
require 'rubyonacid/factories/constant'
|
4
|
-
require 'rubyonacid/factories/flash'
|
5
|
-
require 'rubyonacid/factories/loop'
|
6
|
-
require 'rubyonacid/factories/random'
|
7
|
-
require 'rubyonacid/factories/repeat'
|
8
|
-
require 'rubyonacid/factories/sine'
|
9
|
-
require 'rubyonacid/factories/skip'
|
2
|
+
require 'rubyonacid/factories/example'
|
10
3
|
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
factory
|
15
|
-
#Loop factories loop from 0.0 to 1.0 (or 1.0 to 0.0 if the increment value is negative).
|
16
|
-
factory.factory_pool << RubyOnAcid::LoopFactory.new(0.01)
|
17
|
-
factory.factory_pool << RubyOnAcid::LoopFactory.new(-0.01)
|
18
|
-
factory.factory_pool << RubyOnAcid::LoopFactory.new(0.001)
|
19
|
-
factory.factory_pool << RubyOnAcid::LoopFactory.new(-0.001)
|
20
|
-
#Constant factories always return the same value,
|
21
|
-
factory.factory_pool << RubyOnAcid::ConstantFactory.new(rand)
|
22
|
-
factory.factory_pool << RubyOnAcid::ConstantFactory.new(rand)
|
23
|
-
factory.factory_pool << RubyOnAcid::FlashFactory.new(rand(100))
|
24
|
-
#Sine factories produce a "wave" pattern.
|
25
|
-
factory.factory_pool << RubyOnAcid::SineFactory.new(0.1)
|
26
|
-
factory.factory_pool << RubyOnAcid::SineFactory.new(-0.1)
|
27
|
-
factory.factory_pool << RubyOnAcid::SineFactory.new(0.01)
|
28
|
-
factory.factory_pool << RubyOnAcid::SineFactory.new(-0.01)
|
29
|
-
factory.factory_pool << RubyOnAcid::RepeatFactory.new(
|
30
|
-
RubyOnAcid::LoopFactory.new(random_factory.within(:increment, -0.1, 0.1)),
|
31
|
-
random_factory.within(:interval, 2, 100)
|
32
|
-
)
|
33
|
-
factory.factory_pool << RubyOnAcid::RepeatFactory.new(
|
34
|
-
RubyOnAcid::SineFactory.new(random_factory.within(:increment, -0.1, 0.1)),
|
35
|
-
random_factory.within(:interval, 2, 100)
|
36
|
-
)
|
37
|
-
|
38
|
-
#A skip factory, in charge of randomly resetting the meta factory.
|
4
|
+
#This factory chooses notes, play durations, etc.
|
5
|
+
factory = RubyOnAcid::ExampleFactory.new
|
6
|
+
|
7
|
+
#This factory randomly resets the meta factory.
|
39
8
|
@resetter = RubyOnAcid::SkipFactory.new(0.999)
|
40
9
|
|
41
|
-
|
42
|
-
require 'midiator'
|
10
|
+
begin
|
11
|
+
require 'midiator'
|
12
|
+
rescue LoadError
|
13
|
+
raise "It appears that MIDIator is not installed. 'sudo gem install midiator' to install it."
|
14
|
+
end
|
43
15
|
|
44
16
|
midi = MIDIator::Interface.new
|
45
17
|
midi.autodetect_driver
|
46
18
|
|
47
19
|
loop do
|
48
20
|
midi.play(
|
49
|
-
factory.
|
50
|
-
factory.
|
51
|
-
factory.
|
52
|
-
factory.
|
21
|
+
factory.get(:note, :min => 10, :max => 127).to_i,
|
22
|
+
factory.get(:duration, :max => 0.1),
|
23
|
+
factory.get(:channel, :max => 10).to_i,
|
24
|
+
factory.get(:velocity, :max => 127)
|
53
25
|
)
|
54
26
|
factory.reset_assignments if @resetter.boolean(:reset)
|
55
27
|
end
|
data/examples/raw_audio.rb
CHANGED
@@ -1,51 +1,21 @@
|
|
1
|
-
|
2
|
-
require 'rubyonacid/factories/meta'
|
3
|
-
require 'rubyonacid/factories/constant'
|
4
|
-
require 'rubyonacid/factories/flash'
|
5
|
-
require 'rubyonacid/factories/loop'
|
6
|
-
require 'rubyonacid/factories/random'
|
7
|
-
require 'rubyonacid/factories/repeat'
|
8
|
-
require 'rubyonacid/factories/sine'
|
9
|
-
require 'rubyonacid/factories/skip'
|
10
|
-
|
11
|
-
def generate_factories
|
12
|
-
|
13
|
-
random_factory = RubyOnAcid::RandomFactory.new
|
1
|
+
puts "This demo writes raw 8-bit PCM data to a file. Ctrl-C to stop. Import the file to Audacity (or a similar audio editing program) to hear the results."
|
14
2
|
|
15
|
-
|
16
|
-
|
17
|
-
#Loop factories loop from 0.0 to 1.0 (or 1.0 to 0.0 if the increment value is negative).
|
18
|
-
factory_pool << RubyOnAcid::LoopFactory.new(random_factory.within(:increment, -0.01, 0.01))
|
19
|
-
#Constant factories always return the same value,
|
20
|
-
factory_pool << RubyOnAcid::ConstantFactory.new(rand)
|
21
|
-
factory_pool << RubyOnAcid::ConstantFactory.new(rand)
|
22
|
-
factory_pool << RubyOnAcid::FlashFactory.new(rand(100))
|
23
|
-
#Sine factories produce a "wave" pattern.
|
24
|
-
factory_pool << RubyOnAcid::SineFactory.new(random_factory.within(:increment, -0.01, 0.01))
|
25
|
-
factory_pool << RubyOnAcid::RepeatFactory.new(
|
26
|
-
RubyOnAcid::LoopFactory.new(random_factory.within(:increment, -0.1, 0.1)),
|
27
|
-
random_factory.within(:interval, 2, 100)
|
28
|
-
)
|
29
|
-
factory_pool << RubyOnAcid::RepeatFactory.new(
|
30
|
-
RubyOnAcid::SineFactory.new(random_factory.within(:increment, -0.1, 0.1)),
|
31
|
-
random_factory.within(:interval, 2, 100)
|
32
|
-
)
|
33
|
-
factory_pool
|
34
|
-
end
|
3
|
+
require 'rubygems'
|
4
|
+
require 'rubyonacid/factories/example'
|
35
5
|
|
36
|
-
#
|
37
|
-
|
6
|
+
#This factory chooses notes, play durations, etc.
|
7
|
+
factory = RubyOnAcid::ExampleFactory.new
|
8
|
+
|
9
|
+
#This factory randomly resets the meta factory.
|
10
|
+
@resetter = RubyOnAcid::SkipFactory.new(0.999)
|
38
11
|
|
39
|
-
factory = RubyOnAcid::MetaFactory.new
|
40
|
-
factory.factory_pool = generate_factories
|
41
12
|
File.open("raw_audio.dat", "w") do |file|
|
42
13
|
loop do
|
43
|
-
channel_count = factory.
|
14
|
+
channel_count = factory.get(:channel_count, :max => 3).to_i
|
44
15
|
channel_count.times do |i|
|
45
|
-
file.putc factory.
|
16
|
+
file.putc factory.get(i, :max => 255).to_i
|
46
17
|
end
|
47
18
|
if @resetter.boolean(:reset)
|
48
|
-
factory.factory_pool = generate_factories
|
49
19
|
factory.reset_assignments
|
50
20
|
end
|
51
21
|
end
|
data/examples/rinda_agent.rb
CHANGED
@@ -1,16 +1,10 @@
|
|
1
1
|
require 'rubygems'
|
2
|
-
|
3
|
-
require '
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
require 'rubyonacid/factories/
|
8
|
-
require 'rubyonacid/factories/repeat'
|
9
|
-
require 'rubyonacid/factories/rinda'
|
10
|
-
require 'rubyonacid/factories/sine'
|
11
|
-
require 'rubyonacid/factories/skip'
|
12
|
-
|
13
|
-
|
2
|
+
begin
|
3
|
+
require 'wx'
|
4
|
+
rescue LoadError
|
5
|
+
raise "It appears that wxruby is not installed. 'sudo gem install wxruby' to install it."
|
6
|
+
end
|
7
|
+
require 'rubyonacid/factories/example'
|
14
8
|
|
15
9
|
class MyApp < Wx::App
|
16
10
|
|
@@ -19,18 +13,16 @@ class MyApp < Wx::App
|
|
19
13
|
|
20
14
|
def on_init
|
21
15
|
|
22
|
-
@f = RubyOnAcid::RindaFactory.new(ARGV[0])
|
23
|
-
@f.default_factory =
|
16
|
+
@f = RubyOnAcid::RindaFactory.new(ARGV[0] || "druby://127.0.0.1:7632")
|
17
|
+
@f.default_factory = RubyOnAcid::ExampleFactory.new
|
24
18
|
@f.start_service
|
25
19
|
|
26
20
|
#A skip factory, in charge of randomly resetting the meta factory.
|
27
21
|
@resetter = RubyOnAcid::SkipFactory.new(0.999)
|
28
22
|
|
29
|
-
#
|
23
|
+
#Set up window.
|
30
24
|
frame = Wx::Frame.new(nil, :size => [WIDTH, HEIGHT])
|
31
25
|
frame.show
|
32
|
-
|
33
|
-
#Displays drawing.
|
34
26
|
window = Wx::Window.new(frame, :size => [WIDTH, HEIGHT])
|
35
27
|
|
36
28
|
#Animate periodically.
|
@@ -40,38 +32,7 @@ class MyApp < Wx::App
|
|
40
32
|
@f.default_factory.reset_assignments if @resetter.boolean(:reset)
|
41
33
|
end
|
42
34
|
t.start(33)
|
43
|
-
|
44
|
-
end
|
45
|
-
|
46
|
-
def create_factory
|
47
|
-
random_factory = RubyOnAcid::RandomFactory.new
|
48
|
-
|
49
|
-
#The MetaFactory assigns factories to requested value types.
|
50
|
-
meta_factory = RubyOnAcid::MetaFactory.new
|
51
|
-
#Loop factories loop from 0.0 to 1.0 (or 1.0 to 0.0 if the increment value is negative).
|
52
|
-
meta_factory.factory_pool << RubyOnAcid::LoopFactory.new(0.01)
|
53
|
-
meta_factory.factory_pool << RubyOnAcid::LoopFactory.new(-0.01)
|
54
|
-
meta_factory.factory_pool << RubyOnAcid::LoopFactory.new(0.001)
|
55
|
-
meta_factory.factory_pool << RubyOnAcid::LoopFactory.new(-0.001)
|
56
|
-
#Constant factories always return the same value,
|
57
|
-
meta_factory.factory_pool << RubyOnAcid::ConstantFactory.new(rand)
|
58
|
-
meta_factory.factory_pool << RubyOnAcid::ConstantFactory.new(rand)
|
59
|
-
meta_factory.factory_pool << RubyOnAcid::FlashFactory.new(rand(100))
|
60
|
-
#Sine factories produce a "wave" pattern.
|
61
|
-
meta_factory.factory_pool << RubyOnAcid::SineFactory.new(0.1)
|
62
|
-
meta_factory.factory_pool << RubyOnAcid::SineFactory.new(-0.1)
|
63
|
-
meta_factory.factory_pool << RubyOnAcid::SineFactory.new(0.01)
|
64
|
-
meta_factory.factory_pool << RubyOnAcid::SineFactory.new(-0.01)
|
65
|
-
meta_factory.factory_pool << RubyOnAcid::RepeatFactory.new(
|
66
|
-
RubyOnAcid::LoopFactory.new(random_factory.within(:increment, -0.1, 0.1)),
|
67
|
-
random_factory.within(:interval, 2, 100)
|
68
|
-
)
|
69
|
-
meta_factory.factory_pool << RubyOnAcid::RepeatFactory.new(
|
70
|
-
RubyOnAcid::SineFactory.new(random_factory.within(:increment, -0.1, 0.1)),
|
71
|
-
random_factory.within(:interval, 2, 100)
|
72
|
-
)
|
73
|
-
|
74
|
-
meta_factory
|
35
|
+
|
75
36
|
end
|
76
37
|
|
77
38
|
def render(surface)
|
@@ -81,7 +42,7 @@ class MyApp < Wx::App
|
|
81
42
|
@f.get(:blue, :max => 255).to_i,
|
82
43
|
@f.get(:alpha, :min => 50, :max => 200).to_i
|
83
44
|
)
|
84
|
-
surface.pen = Wx::Pen.new(color, @f.
|
45
|
+
surface.pen = Wx::Pen.new(color, @f.get(:width, :min => 1, :max => 5).to_i)
|
85
46
|
surface.brush = Wx::Brush.new(color, Wx::SOLID)
|
86
47
|
case @f.choose(:shape,
|
87
48
|
:arc,
|
data/examples/svg.rb
ADDED
@@ -0,0 +1,85 @@
|
|
1
|
+
require 'rubygems'
|
2
|
+
require 'rubyonacid/factories/example'
|
3
|
+
|
4
|
+
def svg(factory)
|
5
|
+
return <<-EOD.strip
|
6
|
+
<?xml version="1.0" standalone="no"?>
|
7
|
+
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
|
8
|
+
<svg width="100%" height="100%" xmlns="http://www.w3.org/2000/svg" version="1.1">
|
9
|
+
#{shapes(factory).join("\n")}
|
10
|
+
</svg>
|
11
|
+
EOD
|
12
|
+
end
|
13
|
+
|
14
|
+
def shapes(factory)
|
15
|
+
shapes = []
|
16
|
+
1000.times do
|
17
|
+
shapes << case factory.choose(:shape, :rectangle, :ellipse, :line)
|
18
|
+
when :rectangle : rectangle(factory)
|
19
|
+
when :ellipse : ellipse(factory)
|
20
|
+
when :line : line(factory)
|
21
|
+
end
|
22
|
+
end
|
23
|
+
shapes
|
24
|
+
end
|
25
|
+
|
26
|
+
def rectangle(factory)
|
27
|
+
return <<-EOD
|
28
|
+
<rect
|
29
|
+
x='#{factory.get(:x, :max => 100)}%'
|
30
|
+
y='#{factory.get(:y, :max => 100)}%'
|
31
|
+
width='#{factory.get(:width, :max => 300)}'
|
32
|
+
height='#{factory.get(:height, :max => 300)}'
|
33
|
+
style='#{style(factory)}'
|
34
|
+
transform='#{transform(factory)}'
|
35
|
+
/>
|
36
|
+
EOD
|
37
|
+
end
|
38
|
+
|
39
|
+
def ellipse(factory)
|
40
|
+
return <<-EOD
|
41
|
+
<ellipse
|
42
|
+
cx='#{factory.get(:x, :max => 100)}%'
|
43
|
+
cy='#{factory.get(:y, :max => 100)}%'
|
44
|
+
rx='#{factory.get(:width, :max => 300)}'
|
45
|
+
ry='#{factory.get(:height, :max => 300)}'
|
46
|
+
style='#{style(factory)}'
|
47
|
+
transform='#{transform(factory)}'
|
48
|
+
/>
|
49
|
+
EOD
|
50
|
+
end
|
51
|
+
|
52
|
+
def line(factory)
|
53
|
+
return <<-EOD
|
54
|
+
<line
|
55
|
+
x1='#{factory.get(:x, :max => 100)}%'
|
56
|
+
y1='#{factory.get(:y, :max => 100)}%'
|
57
|
+
x2='#{factory.get(:x2, :max => 100)}%'
|
58
|
+
y2='#{factory.get(:y2, :max => 100)}%'
|
59
|
+
stroke='#{color(factory)}'
|
60
|
+
stroke-width='#{factory.get(:width, :max => 20)}'
|
61
|
+
stroke-opacity='#{factory.get(:opacity)}'
|
62
|
+
/>
|
63
|
+
EOD
|
64
|
+
end
|
65
|
+
|
66
|
+
def style(factory)
|
67
|
+
"fill:#{color(factory)};fill-opacity:#{factory.get(:opacity)};"
|
68
|
+
end
|
69
|
+
|
70
|
+
def color(factory)
|
71
|
+
"rgb(#{factory.get(:red, :max => 255).to_i},#{factory.get(:green, :max => 255).to_i},#{factory.get(:blue, :max => 255).to_i})"
|
72
|
+
end
|
73
|
+
|
74
|
+
def transform(factory)
|
75
|
+
return <<-EOD
|
76
|
+
rotate(#{factory.get(:rotation, :max => 360)})
|
77
|
+
translate(#{factory.get(:x_translate, :max => 100)}, #{factory.get(:y_translate, :max => 100)})
|
78
|
+
scale(#{factory.get(:scale, :max => 2)})
|
79
|
+
skewX(#{factory.get(:x_skew, :max => 360)})
|
80
|
+
skewY(#{factory.get(:y_skew, :max => 360)})
|
81
|
+
EOD
|
82
|
+
end
|
83
|
+
|
84
|
+
factory = RubyOnAcid::ExampleFactory.new
|
85
|
+
puts svg(factory)
|
data/examples/wxruby.rb
CHANGED
@@ -1,15 +1,10 @@
|
|
1
1
|
require 'rubygems'
|
2
|
-
|
3
|
-
require '
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
require 'rubyonacid/factories/
|
8
|
-
require 'rubyonacid/factories/random'
|
9
|
-
require 'rubyonacid/factories/repeat'
|
10
|
-
require 'rubyonacid/factories/sine'
|
11
|
-
require 'rubyonacid/factories/skip'
|
12
|
-
|
2
|
+
begin
|
3
|
+
require 'wx'
|
4
|
+
rescue LoadError
|
5
|
+
raise "It appears that wxruby is not installed. 'sudo gem install wxruby' to install it."
|
6
|
+
end
|
7
|
+
require 'rubyonacid/factories/example'
|
13
8
|
|
14
9
|
|
15
10
|
class MyApp < Wx::App
|
@@ -19,16 +14,15 @@ class MyApp < Wx::App
|
|
19
14
|
|
20
15
|
def on_init
|
21
16
|
|
22
|
-
|
17
|
+
#This factory will be in charge of all drawing coordinates, colors, etc.
|
18
|
+
@f = RubyOnAcid::ExampleFactory.new
|
23
19
|
|
24
20
|
#A skip factory, in charge of randomly resetting the meta factory.
|
25
21
|
@resetter = RubyOnAcid::SkipFactory.new(0.999)
|
26
22
|
|
27
|
-
#
|
23
|
+
#Set up window.
|
28
24
|
frame = Wx::Frame.new(nil, :size => [WIDTH, HEIGHT])
|
29
25
|
frame.show
|
30
|
-
|
31
|
-
#Displays drawing.
|
32
26
|
window = Wx::Window.new(frame, :size => [WIDTH, HEIGHT])
|
33
27
|
|
34
28
|
#Animate periodically.
|
@@ -41,51 +35,7 @@ class MyApp < Wx::App
|
|
41
35
|
|
42
36
|
end
|
43
37
|
|
44
|
-
|
45
|
-
def create_factory
|
46
|
-
|
47
|
-
random_factory = RubyOnAcid::RandomFactory.new
|
48
|
-
|
49
|
-
source_factories = []
|
50
|
-
#Loop factories loop from 0.0 to 1.0 (or 1.0 to 0.0 if the increment value is negative).
|
51
|
-
source_factories << RubyOnAcid::LoopFactory.new(0.01)
|
52
|
-
source_factories << RubyOnAcid::LoopFactory.new(-0.01)
|
53
|
-
source_factories << RubyOnAcid::LoopFactory.new(0.001)
|
54
|
-
source_factories << RubyOnAcid::LoopFactory.new(-0.001)
|
55
|
-
#Constant factories always return the same value,
|
56
|
-
source_factories << RubyOnAcid::ConstantFactory.new(rand)
|
57
|
-
source_factories << RubyOnAcid::ConstantFactory.new(rand)
|
58
|
-
source_factories << RubyOnAcid::FlashFactory.new(rand(100))
|
59
|
-
#Sine factories produce a "wave" pattern.
|
60
|
-
source_factories << RubyOnAcid::SineFactory.new(0.1)
|
61
|
-
source_factories << RubyOnAcid::SineFactory.new(-0.1)
|
62
|
-
source_factories << RubyOnAcid::SineFactory.new(0.01)
|
63
|
-
source_factories << RubyOnAcid::SineFactory.new(-0.01)
|
64
|
-
#A RepeatFactory wraps another factory, queries it, and repeats the same value a certain number of times.
|
65
|
-
source_factories << RubyOnAcid::RepeatFactory.new(
|
66
|
-
RubyOnAcid::LoopFactory.new(random_factory.within(:increment, -0.1, 0.1)),
|
67
|
-
random_factory.get(:interval, :min => 2, :max => 100)
|
68
|
-
)
|
69
|
-
source_factories << RubyOnAcid::RepeatFactory.new(
|
70
|
-
RubyOnAcid::SineFactory.new(random_factory.within(:increment, -0.1, 0.1)),
|
71
|
-
random_factory.get(:interval, :min => 2, :max => 100)
|
72
|
-
)
|
73
|
-
#A CombinationFactory combines the values of two or more other factories.
|
74
|
-
combination_factory = RubyOnAcid::CombinationFactory.new
|
75
|
-
2.times do
|
76
|
-
combination_factory.source_factories << source_factories[rand(source_factories.length)]
|
77
|
-
end
|
78
|
-
source_factories << combination_factory
|
79
|
-
|
80
|
-
#The MetaFactory pulls requested value types from the other factories.
|
81
|
-
meta_factory = RubyOnAcid::MetaFactory.new
|
82
|
-
meta_factory.factory_pool = source_factories
|
83
|
-
|
84
|
-
meta_factory
|
85
|
-
|
86
|
-
end
|
87
|
-
|
88
|
-
|
38
|
+
#Choose a shape and color and draw it to the given surface.
|
89
39
|
def render(surface)
|
90
40
|
color = Wx::Colour.new(
|
91
41
|
@f.get(:red, :max => 255).to_i,
|
@@ -93,7 +43,7 @@ class MyApp < Wx::App
|
|
93
43
|
@f.get(:blue, :max => 255).to_i,
|
94
44
|
@f.get(:alpha, :min => 50, :max => 200).to_i
|
95
45
|
)
|
96
|
-
surface.pen = Wx::Pen.new(color, @f.
|
46
|
+
surface.pen = Wx::Pen.new(color, @f.get(:width, :min => 1, :max => 5).to_i)
|
97
47
|
surface.brush = Wx::Brush.new(color, Wx::SOLID)
|
98
48
|
case @f.choose(:shape,
|
99
49
|
:arc,
|
@@ -139,7 +89,7 @@ class MyApp < Wx::App
|
|
139
89
|
end
|
140
90
|
end
|
141
91
|
|
142
|
-
|
92
|
+
#Create an array of points for drawing complex shapes.
|
143
93
|
def make_point_array
|
144
94
|
points = []
|
145
95
|
3.times do |i|
|
@@ -0,0 +1,13 @@
|
|
1
|
+
require 'rubyonacid/factories/combination'
|
2
|
+
require 'rubyonacid/factories/constant'
|
3
|
+
require 'rubyonacid/factories/flash'
|
4
|
+
require 'rubyonacid/factories/increment'
|
5
|
+
require 'rubyonacid/factories/input'
|
6
|
+
require 'rubyonacid/factories/loop'
|
7
|
+
require 'rubyonacid/factories/meta'
|
8
|
+
require 'rubyonacid/factories/random'
|
9
|
+
require 'rubyonacid/factories/random_walk'
|
10
|
+
require 'rubyonacid/factories/repeat'
|
11
|
+
require 'rubyonacid/factories/rinda'
|
12
|
+
require 'rubyonacid/factories/sine'
|
13
|
+
require 'rubyonacid/factories/skip'
|
@@ -4,15 +4,24 @@ module RubyOnAcid
|
|
4
4
|
|
5
5
|
class CombinationFactory < Factory
|
6
6
|
|
7
|
+
#Causes get_unit value of all source_factories to be added together.
|
7
8
|
ADD = :add
|
9
|
+
#Takes the get_unit value of the first of the source_factories and subtracts the get_unit value of all subsequent ones.
|
8
10
|
SUBTRACT = :subtract
|
11
|
+
#Causes get_unit value of all source_factories to be multiplied.
|
9
12
|
MULTIPLY = :multiply
|
13
|
+
#Takes the get_unit value of the first of the source_factories and divides the result by the get_unit value of all subsequent ones.
|
10
14
|
DIVIDE = :divide
|
15
|
+
#Causes get_unit values above 1 to be truncated at 1 and values below 0 to be truncated at 0.
|
11
16
|
CONSTRAIN = :constrain
|
17
|
+
#Causes get_unit values above 1 to wrap to 0 and values below 0 to wrap to 1.
|
12
18
|
WRAP = :wrap
|
13
19
|
|
20
|
+
#An array of factories to be queried by get_unit.
|
14
21
|
attr_accessor :source_factories
|
22
|
+
#The operation get_unit will perform.
|
15
23
|
attr_accessor :operation
|
24
|
+
#The method get_unit will use to constrain values between 0 and 1.
|
16
25
|
attr_accessor :constrain_mode
|
17
26
|
|
18
27
|
def initialize(options = {})
|
@@ -22,6 +31,8 @@ class CombinationFactory < Factory
|
|
22
31
|
@constrain_mode = options[:constrain_mode] || WRAP
|
23
32
|
end
|
24
33
|
|
34
|
+
#Queries all source_factories with given key and combines their return values with the set operation.
|
35
|
+
#Values will be constrained between 0 and 1 with the set constrain_mode.
|
25
36
|
def get_unit(key)
|
26
37
|
combined_value = combine(key)
|
27
38
|
constrain(combined_value)
|
@@ -2,8 +2,10 @@ require 'rubyonacid/factory'
|
|
2
2
|
|
3
3
|
module RubyOnAcid
|
4
4
|
|
5
|
+
#A factory that returns a preset value for all keys.
|
5
6
|
class ConstantFactory < Factory
|
6
7
|
|
8
|
+
#A value between 0 and 1 that get_unit will return.
|
7
9
|
attr_accessor :value
|
8
10
|
def value=(value)
|
9
11
|
raise "assigned #{value} to value, must be between -1 and 1" if value < -1 or value > 1
|
@@ -15,7 +17,7 @@ class ConstantFactory < Factory
|
|
15
17
|
@value = value
|
16
18
|
end
|
17
19
|
|
18
|
-
#
|
20
|
+
#Returns assigned value.
|
19
21
|
def get_unit(key)
|
20
22
|
@value
|
21
23
|
end
|
@@ -0,0 +1,63 @@
|
|
1
|
+
require 'rubyonacid/factories/all'
|
2
|
+
|
3
|
+
module RubyOnAcid
|
4
|
+
|
5
|
+
#A preconfigured factory with all the bells and whistles.
|
6
|
+
#Use this if you want to get up and running quickly and don't need to tweak the settings.
|
7
|
+
class ExampleFactory < MetaFactory
|
8
|
+
|
9
|
+
|
10
|
+
def initialize
|
11
|
+
super
|
12
|
+
@factory_pool = create_factories
|
13
|
+
end
|
14
|
+
|
15
|
+
|
16
|
+
private
|
17
|
+
|
18
|
+
|
19
|
+
def create_factories
|
20
|
+
|
21
|
+
random_factory = RubyOnAcid::RandomFactory.new
|
22
|
+
|
23
|
+
source_factories = []
|
24
|
+
|
25
|
+
5.times do
|
26
|
+
factory = RubyOnAcid::LoopFactory.new
|
27
|
+
factory.interval = random_factory.get(:increment, :min => -0.1, :max => 0.1)
|
28
|
+
source_factories << factory
|
29
|
+
end
|
30
|
+
3.times do
|
31
|
+
factory = RubyOnAcid::ConstantFactory.new
|
32
|
+
factory.value = random_factory.get(:constant)
|
33
|
+
source_factories << factory
|
34
|
+
end
|
35
|
+
source_factories << RubyOnAcid::FlashFactory.new(
|
36
|
+
random_factory.get(:interval, :max => 100)
|
37
|
+
)
|
38
|
+
4.times do
|
39
|
+
factory = RubyOnAcid::SineFactory.new
|
40
|
+
factory.interval = random_factory.get(:increment, :min => -0.1, :max => 0.1)
|
41
|
+
source_factories << factory
|
42
|
+
end
|
43
|
+
2.times do
|
44
|
+
factory = RubyOnAcid::RepeatFactory.new
|
45
|
+
factory.repeat_count = random_factory.get(:interval, :min => 2, :max => 100)
|
46
|
+
factory.source_factory = source_factories[rand(source_factories.length)]
|
47
|
+
source_factories << factory
|
48
|
+
end
|
49
|
+
combination_factory = RubyOnAcid::CombinationFactory.new
|
50
|
+
2.times do
|
51
|
+
combination_factory.source_factories << source_factories[rand(source_factories.length)]
|
52
|
+
end
|
53
|
+
source_factories << combination_factory
|
54
|
+
source_factories << RubyOnAcid::RandomWalkFactory.new(0.1)
|
55
|
+
|
56
|
+
source_factories
|
57
|
+
|
58
|
+
end
|
59
|
+
|
60
|
+
|
61
|
+
end
|
62
|
+
|
63
|
+
end
|
@@ -0,0 +1,67 @@
|
|
1
|
+
require 'rubyonacid/factory'
|
2
|
+
|
3
|
+
module RubyOnAcid
|
4
|
+
|
5
|
+
class InputFactory < Factory
|
6
|
+
|
7
|
+
attr_accessor :default_factory
|
8
|
+
|
9
|
+
def initialize
|
10
|
+
super
|
11
|
+
@input_values = {}
|
12
|
+
@key_assignments = {}
|
13
|
+
@largest_seen_values = {}
|
14
|
+
@smallest_seen_values = {}
|
15
|
+
end
|
16
|
+
|
17
|
+
def get_unit(key)
|
18
|
+
current_key = assigned_key(key)
|
19
|
+
if @input_values[current_key] and @input_values[current_key].length > 0
|
20
|
+
return scale(current_key, @input_values[current_key].shift) || default_value(key)
|
21
|
+
else
|
22
|
+
return default_value(key)
|
23
|
+
end
|
24
|
+
end
|
25
|
+
|
26
|
+
def default_value(key)
|
27
|
+
@default_factory ? @default_factory.get_unit(key) : 0.0
|
28
|
+
end
|
29
|
+
|
30
|
+
def put(key, value)
|
31
|
+
value = value.to_f
|
32
|
+
@input_values[key] ||= []
|
33
|
+
@input_values[key] << value
|
34
|
+
@smallest_seen_values[key] ||= 0.0
|
35
|
+
if @largest_seen_values[key] == nil or @smallest_seen_values[key] > @largest_seen_values[key]
|
36
|
+
@largest_seen_values[key] = @smallest_seen_values[key] + 1.0
|
37
|
+
end
|
38
|
+
@smallest_seen_values[key] = value if value < @smallest_seen_values[key]
|
39
|
+
@largest_seen_values[key] = value if value > @largest_seen_values[key]
|
40
|
+
end
|
41
|
+
|
42
|
+
def clear_input_values
|
43
|
+
@input_values = {}
|
44
|
+
end
|
45
|
+
|
46
|
+
def clear_assigned_keys
|
47
|
+
@assigned_keys = {}
|
48
|
+
end
|
49
|
+
|
50
|
+
private
|
51
|
+
|
52
|
+
def assigned_key(key)
|
53
|
+
return @key_assignments[key] if @key_assignments[key]
|
54
|
+
key_pool = @input_values.keys - @key_assignments.values
|
55
|
+
@key_assignments[key] = key_pool[rand(key_pool.length)]
|
56
|
+
@key_assignments[key]
|
57
|
+
end
|
58
|
+
|
59
|
+
#Scales a value between the largest and smallest values seen for a key.
|
60
|
+
#Returns a value in the range 0 to 1.
|
61
|
+
def scale(key, value)
|
62
|
+
(value - @smallest_seen_values[key]) / (@largest_seen_values[key] - @smallest_seen_values[key])
|
63
|
+
end
|
64
|
+
|
65
|
+
end
|
66
|
+
|
67
|
+
end
|
@@ -2,9 +2,10 @@ require 'rubyonacid/factory'
|
|
2
2
|
|
3
3
|
module RubyOnAcid
|
4
4
|
|
5
|
+
#Loops from the minimum value to the maximum and around again.
|
5
6
|
class LoopFactory < Factory
|
6
7
|
|
7
|
-
#
|
8
|
+
#An amount between 0 and 1 to increment counters by.
|
8
9
|
attr_accessor :interval
|
9
10
|
def interval=(value)
|
10
11
|
raise "assigned #{value} to interval, must be between -1 and 1" if value < -1 or value > 1
|
@@ -2,10 +2,11 @@ require 'rubyonacid/factory'
|
|
2
2
|
|
3
3
|
module RubyOnAcid
|
4
4
|
|
5
|
+
#The MetaFactory assigns factories to requested value types.
|
5
6
|
class MetaFactory < Factory
|
6
7
|
|
8
|
+
#An array of Factory objects to assign to keys.
|
7
9
|
attr_accessor :factory_pool
|
8
|
-
attr_accessor :assigned_factories
|
9
10
|
|
10
11
|
def initialize(factory_pool = [])
|
11
12
|
super
|
@@ -13,15 +14,19 @@ class MetaFactory < Factory
|
|
13
14
|
@assigned_factories = {}
|
14
15
|
end
|
15
16
|
|
17
|
+
#Assign a factory for subsequent get_unit requests for the given key.
|
16
18
|
def assign_factory(key, factory)
|
17
19
|
@assigned_factories[key] = factory
|
18
20
|
end
|
19
21
|
|
22
|
+
#Returns the value of get_unit from the Factory assigned to the given key.
|
23
|
+
#When a key is needed that a Factory is not already assigned to, one will be assigned at random from the factory_pool.
|
20
24
|
def get_unit(key)
|
21
25
|
@assigned_factories[key] ||= @factory_pool[rand(@factory_pool.length)]
|
22
26
|
@assigned_factories[key].get_unit(key)
|
23
27
|
end
|
24
28
|
|
29
|
+
#Clear all factory assignments.
|
25
30
|
def reset_assignments
|
26
31
|
@assigned_factories.clear
|
27
32
|
end
|
@@ -0,0 +1,29 @@
|
|
1
|
+
require 'rubyonacid/factory'
|
2
|
+
|
3
|
+
module RubyOnAcid
|
4
|
+
|
5
|
+
#Increments from the minimum value, stopping at the maximum, or decrements from the maximum value, stopping at the minimum.
|
6
|
+
class RandomWalkFactory < Factory
|
7
|
+
|
8
|
+
#The maximum amount to change counters by.
|
9
|
+
attr_accessor :interval
|
10
|
+
|
11
|
+
def initialize(interval = 0.001)
|
12
|
+
super
|
13
|
+
@start_value = 0.0
|
14
|
+
@values = {}
|
15
|
+
@interval = interval
|
16
|
+
end
|
17
|
+
|
18
|
+
#Increment counter for given key and return it. Constrain between 0 and 1.
|
19
|
+
def get_unit(key)
|
20
|
+
@values[key] ||= rand
|
21
|
+
@values[key] += (rand * (2 * @interval)) - @interval
|
22
|
+
@values[key] = 1.0 if @values[key] > 1.0
|
23
|
+
@values[key] = 0.0 if @values[key] < 0.0
|
24
|
+
@values[key]
|
25
|
+
end
|
26
|
+
|
27
|
+
end
|
28
|
+
|
29
|
+
end
|
@@ -3,6 +3,7 @@ require 'rubyonacid/factory'
|
|
3
3
|
|
4
4
|
module RubyOnAcid
|
5
5
|
|
6
|
+
#Allows values to be sent over the network. For more information, see the Ruby standard library documentation for Rinda.
|
6
7
|
class RindaFactory < Factory
|
7
8
|
|
8
9
|
#Time in seconds to wait for a value before giving up and returning a default value for the given key.
|
@@ -21,6 +22,7 @@ class RindaFactory < Factory
|
|
21
22
|
@prior_values = {}
|
22
23
|
end
|
23
24
|
|
25
|
+
#Create the Rinda TupleSpace for clients to write to.
|
24
26
|
def start_service
|
25
27
|
DRb.start_service
|
26
28
|
@space = Rinda::TupleSpaceProxy.new(DRbObject.new(nil, @uri))
|
@@ -2,8 +2,10 @@ require 'rubyonacid/factory'
|
|
2
2
|
|
3
3
|
module RubyOnAcid
|
4
4
|
|
5
|
+
#Produces a "wave" pattern.
|
5
6
|
class SineFactory < Factory
|
6
7
|
|
8
|
+
#Counters used to calculate sine values will be incremented by this amount with each query.
|
7
9
|
attr_accessor :interval
|
8
10
|
|
9
11
|
def initialize(interval = 0.1)
|
data/lib/rubyonacid/factory.rb
CHANGED
@@ -1,5 +1,7 @@
|
|
1
1
|
module RubyOnAcid
|
2
2
|
|
3
|
+
#The parent class for all other Factories.
|
4
|
+
#Should not normally be instantiated directly.
|
3
5
|
class Factory
|
4
6
|
|
5
7
|
def initialize(*args)
|
@@ -16,7 +18,7 @@ class Factory
|
|
16
18
|
def get(key, options = {})
|
17
19
|
@minimums[key] = (options[:min] || @minimums[key] || 0.0)
|
18
20
|
@maximums[key] = (options[:max] || @maximums[key] || (@minimums[key] > 1.0 ? @minimums[key] + 1.0 : 1.0))
|
19
|
-
get_unit(key) * (@maximums[key] - @minimums[key]) + @minimums[key]
|
21
|
+
(get_unit(key) * (@maximums[key] - @minimums[key])) + @minimums[key]
|
20
22
|
end
|
21
23
|
|
22
24
|
#Returns true if get_unit(key) returns greater than 0.5.
|
@@ -33,6 +35,7 @@ class Factory
|
|
33
35
|
all_choices[index]
|
34
36
|
end
|
35
37
|
|
38
|
+
|
36
39
|
end
|
37
40
|
|
38
41
|
end
|
@@ -0,0 +1,96 @@
|
|
1
|
+
require File.join(File.dirname(__FILE__), '..', 'spec_helper')
|
2
|
+
require "rubyonacid/factories/input"
|
3
|
+
require "shared_factory_specs"
|
4
|
+
|
5
|
+
include RubyOnAcid
|
6
|
+
|
7
|
+
describe InputFactory do
|
8
|
+
|
9
|
+
before :each do
|
10
|
+
@it = InputFactory.new
|
11
|
+
end
|
12
|
+
|
13
|
+
describe "general behavior" do
|
14
|
+
|
15
|
+
before :each do
|
16
|
+
@it.put(:foo, 0.0)
|
17
|
+
@it.put(:foo, 1.0)
|
18
|
+
end
|
19
|
+
|
20
|
+
it_should_behave_like "a factory"
|
21
|
+
|
22
|
+
end
|
23
|
+
|
24
|
+
describe "#get_unit" do
|
25
|
+
|
26
|
+
it "retrieves values assigned to a key" do
|
27
|
+
@it.put(:x, 0.1)
|
28
|
+
@it.get(:x).should == 0.1
|
29
|
+
end
|
30
|
+
|
31
|
+
it "retrieves multiple input values in order" do
|
32
|
+
@it.put(:x, 0.1)
|
33
|
+
@it.put(:x, 0.2)
|
34
|
+
@it.get(:x).should == 0.1
|
35
|
+
@it.get(:x).should == 0.2
|
36
|
+
end
|
37
|
+
|
38
|
+
it "maps to a different key if the requested one isn't present" do
|
39
|
+
@it.put(:x, 0.1)
|
40
|
+
@it.get(:y).should == 0.1
|
41
|
+
end
|
42
|
+
|
43
|
+
it "returns 0 if a key is assigned but has no values" do
|
44
|
+
@it.put(:x, 0.1)
|
45
|
+
@it.put(:x, 0.2)
|
46
|
+
@it.get(:y).should == 0.1
|
47
|
+
@it.get(:y).should == 0.2
|
48
|
+
@it.put(:z, 0.3)
|
49
|
+
@it.get(:y).should == 0.0
|
50
|
+
end
|
51
|
+
|
52
|
+
end
|
53
|
+
|
54
|
+
describe "scaling" do
|
55
|
+
|
56
|
+
it "scales highest seen values for a key to 0 to 1 range" do
|
57
|
+
@it.put(:x, 0.0)
|
58
|
+
@it.put(:x, 1.0)
|
59
|
+
@it.get(:x).should be_close(0.0, MARGIN)
|
60
|
+
@it.get(:x).should be_close(1.0, MARGIN)
|
61
|
+
@it.put(:x, 0.0)
|
62
|
+
@it.put(:x, 1.0)
|
63
|
+
@it.put(:x, 2.0)
|
64
|
+
@it.get(:x).should be_close(0.0, MARGIN)
|
65
|
+
@it.get(:x).should be_close(0.5, MARGIN)
|
66
|
+
@it.get(:x).should be_close(1.0, MARGIN)
|
67
|
+
@it.put(:x, 0.0)
|
68
|
+
@it.put(:x, 3.0)
|
69
|
+
@it.put(:x, 4.0)
|
70
|
+
@it.get(:x).should be_close(0.0, MARGIN)
|
71
|
+
@it.get(:x).should be_close(0.75, MARGIN)
|
72
|
+
@it.get(:x).should be_close(1.0, MARGIN)
|
73
|
+
end
|
74
|
+
|
75
|
+
it "scales lowest seen values for a key to 0 to 1 range" do
|
76
|
+
@it.put(:x, 0.0)
|
77
|
+
@it.put(:x, 1.0)
|
78
|
+
@it.get(:x).should be_close(0.0, MARGIN)
|
79
|
+
@it.get(:x).should be_close(1.0, MARGIN)
|
80
|
+
@it.put(:x, 0.0)
|
81
|
+
@it.put(:x, 1.0)
|
82
|
+
@it.put(:x, -2.0)
|
83
|
+
@it.get(:x).should be_close(0.666, MARGIN)
|
84
|
+
@it.get(:x).should be_close(1.0, MARGIN)
|
85
|
+
@it.get(:x).should be_close(0.0, MARGIN)
|
86
|
+
@it.put(:x, -2.0)
|
87
|
+
@it.put(:x, 2.0)
|
88
|
+
@it.put(:x, 1.0)
|
89
|
+
@it.get(:x).should be_close(0.0, MARGIN)
|
90
|
+
@it.get(:x).should be_close(1.0, MARGIN)
|
91
|
+
@it.get(:x).should be_close(0.75, MARGIN)
|
92
|
+
end
|
93
|
+
|
94
|
+
end
|
95
|
+
|
96
|
+
end
|
@@ -0,0 +1,27 @@
|
|
1
|
+
require File.join(File.dirname(__FILE__), '..', 'spec_helper')
|
2
|
+
require "shared_factory_specs"
|
3
|
+
require 'rubyonacid/factories/random_walk'
|
4
|
+
|
5
|
+
include RubyOnAcid
|
6
|
+
|
7
|
+
describe RandomWalkFactory do
|
8
|
+
|
9
|
+
|
10
|
+
before :each do
|
11
|
+
@it = RandomWalkFactory.new
|
12
|
+
end
|
13
|
+
|
14
|
+
it_should_behave_like "a factory"
|
15
|
+
|
16
|
+
it "increases or decreases prior key value by random amount within given interval" do
|
17
|
+
values = []
|
18
|
+
values << @it.get_unit(:x)
|
19
|
+
@it.interval = 0.3
|
20
|
+
values << @it.get_unit(:x)
|
21
|
+
values[1].should be_close(values[0], 0.3)
|
22
|
+
@it.interval = 0.01
|
23
|
+
values << @it.get_unit(:x)
|
24
|
+
values[2].should be_close(values[1], 0.01)
|
25
|
+
end
|
26
|
+
|
27
|
+
end
|
@@ -4,28 +4,35 @@ require 'rubyonacid/factories/rinda'
|
|
4
4
|
|
5
5
|
include RubyOnAcid
|
6
6
|
|
7
|
+
require 'rinda/rinda'
|
8
|
+
require 'rinda/tuplespace'
|
9
|
+
DRb.start_service
|
10
|
+
DRb.start_service("druby://127.0.0.1:7632", Rinda::TupleSpace.new)
|
11
|
+
|
7
12
|
describe RindaFactory do
|
8
13
|
|
9
|
-
|
10
14
|
before :each do
|
11
15
|
@it = RindaFactory.new
|
12
|
-
uri = "druby://127.0.0.1:
|
13
|
-
@it.uri = uri
|
14
|
-
require 'rinda/rinda'
|
15
|
-
require 'rinda/tuplespace'
|
16
|
-
DRb.start_service
|
17
|
-
DRb.start_service(uri, Rinda::TupleSpace.new)
|
16
|
+
@it.uri = "druby://127.0.0.1:7632"
|
18
17
|
@space = Rinda::TupleSpaceProxy.new(DRbObject.new(nil, @it.uri))
|
19
18
|
end
|
20
19
|
|
21
|
-
|
20
|
+
describe "general behavior" do
|
21
|
+
|
22
|
+
before :each do
|
23
|
+
@it.start_service
|
24
|
+
end
|
25
|
+
|
26
|
+
it_should_behave_like "a factory"
|
27
|
+
|
28
|
+
end
|
22
29
|
|
23
30
|
it "gets keys from Rinda server" do
|
24
31
|
@it.start_service
|
25
32
|
@space.write([:x, 0.5])
|
26
33
|
@it.get_unit(:x).should == 0.5
|
27
34
|
@space.write([:y, 0.6])
|
28
|
-
@it.get_unit(:
|
35
|
+
@it.get_unit(:y).should == 0.6
|
29
36
|
end
|
30
37
|
|
31
38
|
it "gets keys from a backup factory when it cannot retrieve values via Rinda" do
|
@@ -36,4 +43,4 @@ describe RindaFactory do
|
|
36
43
|
@it.get_unit(:a).should == 0.74
|
37
44
|
end
|
38
45
|
|
39
|
-
end
|
46
|
+
end
|
data/spec/factories/sine_spec.rb
CHANGED
@@ -15,7 +15,6 @@ describe SineFactory do
|
|
15
15
|
|
16
16
|
it "loops between 0 and 1" do
|
17
17
|
@it.interval = 1.0
|
18
|
-
# @it.get_unit(:x).should be_close(0.500, MARGIN)
|
19
18
|
@it.get_unit(:x).should be_close(0.920, MARGIN)
|
20
19
|
@it.get_unit(:x).should be_close(0.954, MARGIN)
|
21
20
|
@it.get_unit(:x).should be_close(0.570, MARGIN)
|
@@ -26,7 +25,6 @@ describe SineFactory do
|
|
26
25
|
|
27
26
|
it "can take a different interval" do
|
28
27
|
@it.interval = 0.5
|
29
|
-
# @it.get_unit(:x).should be_close(0.500, MARGIN)
|
30
28
|
@it.get_unit(:x).should be_close(0.740, MARGIN)
|
31
29
|
@it.get_unit(:x).should be_close(0.920, MARGIN)
|
32
30
|
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: rubyonacid
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.3.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Jay McGavren
|
@@ -9,7 +9,7 @@ autorequire:
|
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
11
|
|
12
|
-
date: 2009-12-
|
12
|
+
date: 2009-12-11 00:00:00 -07:00
|
13
13
|
default_executable:
|
14
14
|
dependencies:
|
15
15
|
- !ruby/object:Gem::Dependency
|
@@ -41,19 +41,24 @@ files:
|
|
41
41
|
- examples/midi.rb
|
42
42
|
- examples/raw_audio.rb
|
43
43
|
- examples/rinda_agent.rb
|
44
|
+
- examples/svg.rb
|
44
45
|
- examples/wxruby.rb
|
45
46
|
- features/rubyonacid.feature
|
46
47
|
- features/step_definitions/rubyonacid_steps.rb
|
47
48
|
- features/support/env.rb
|
48
49
|
- generators.png
|
49
50
|
- lib/rubyonacid.rb
|
51
|
+
- lib/rubyonacid/factories/all.rb
|
50
52
|
- lib/rubyonacid/factories/combination.rb
|
51
53
|
- lib/rubyonacid/factories/constant.rb
|
54
|
+
- lib/rubyonacid/factories/example.rb
|
52
55
|
- lib/rubyonacid/factories/flash.rb
|
53
56
|
- lib/rubyonacid/factories/increment.rb
|
57
|
+
- lib/rubyonacid/factories/input.rb
|
54
58
|
- lib/rubyonacid/factories/loop.rb
|
55
59
|
- lib/rubyonacid/factories/meta.rb
|
56
60
|
- lib/rubyonacid/factories/random.rb
|
61
|
+
- lib/rubyonacid/factories/random_walk.rb
|
57
62
|
- lib/rubyonacid/factories/repeat.rb
|
58
63
|
- lib/rubyonacid/factories/rinda.rb
|
59
64
|
- lib/rubyonacid/factories/sine.rb
|
@@ -63,9 +68,11 @@ files:
|
|
63
68
|
- spec/factories/constant_spec.rb
|
64
69
|
- spec/factories/flash_spec.rb
|
65
70
|
- spec/factories/increment_spec.rb
|
71
|
+
- spec/factories/input_spec.rb
|
66
72
|
- spec/factories/loop_spec.rb
|
67
73
|
- spec/factories/meta_spec.rb
|
68
74
|
- spec/factories/random_spec.rb
|
75
|
+
- spec/factories/random_walk_spec.rb
|
69
76
|
- spec/factories/repeat_spec.rb
|
70
77
|
- spec/factories/rinda_spec.rb
|
71
78
|
- spec/factories/sine_spec.rb
|
@@ -106,9 +113,11 @@ test_files:
|
|
106
113
|
- spec/factories/constant_spec.rb
|
107
114
|
- spec/factories/flash_spec.rb
|
108
115
|
- spec/factories/increment_spec.rb
|
116
|
+
- spec/factories/input_spec.rb
|
109
117
|
- spec/factories/loop_spec.rb
|
110
118
|
- spec/factories/meta_spec.rb
|
111
119
|
- spec/factories/random_spec.rb
|
120
|
+
- spec/factories/random_walk_spec.rb
|
112
121
|
- spec/factories/repeat_spec.rb
|
113
122
|
- spec/factories/rinda_spec.rb
|
114
123
|
- spec/factories/sine_spec.rb
|
@@ -118,9 +127,7 @@ test_files:
|
|
118
127
|
- spec/spec_helper.rb
|
119
128
|
- examples/ascii.rb
|
120
129
|
- examples/midi.rb
|
121
|
-
- examples/permutations.rb
|
122
|
-
- examples/quality_render.rb
|
123
|
-
- examples/random_yaml.rb
|
124
130
|
- examples/raw_audio.rb
|
125
131
|
- examples/rinda_agent.rb
|
132
|
+
- examples/svg.rb
|
126
133
|
- examples/wxruby.rb
|
data/examples/permutations.rb
DELETED
@@ -1,40 +0,0 @@
|
|
1
|
-
require 'rubygems'
|
2
|
-
require 'rubyonacid/factories/meta'
|
3
|
-
require 'rubyonacid/factories/flash'
|
4
|
-
require 'rubyonacid/factories/increment'
|
5
|
-
require 'rubyonacid/factories/loop'
|
6
|
-
require 'rubyonacid/factories/random'
|
7
|
-
require 'rubyonacid/factories/sine'
|
8
|
-
require 'rubyonacid/factories/skip'
|
9
|
-
|
10
|
-
factories = []
|
11
|
-
factories << RubyOnAcid::LoopFactory.new(0.001)
|
12
|
-
factories << RubyOnAcid::LoopFactory.new(-0.001)
|
13
|
-
factories << RubyOnAcid::LoopFactory.new(0.01)
|
14
|
-
factories << RubyOnAcid::LoopFactory.new(-0.01)
|
15
|
-
factories << RubyOnAcid::LoopFactory.new(0.1)
|
16
|
-
factories << RubyOnAcid::LoopFactory.new(-0.1)
|
17
|
-
factories << RubyOnAcid::IncrementFactory.new(0.001)
|
18
|
-
factories << RubyOnAcid::RandomFactory.new
|
19
|
-
factories << RubyOnAcid::FlashFactory.new(1)
|
20
|
-
factories << RubyOnAcid::FlashFactory.new(3)
|
21
|
-
factories << RubyOnAcid::FlashFactory.new(50)
|
22
|
-
factories << RubyOnAcid::FlashFactory.new(100)
|
23
|
-
factories << RubyOnAcid::SineFactory.new(0.1)
|
24
|
-
factories << RubyOnAcid::SineFactory.new(-0.1)
|
25
|
-
factories << RubyOnAcid::SineFactory.new(0.01)
|
26
|
-
factories << RubyOnAcid::SineFactory.new(-0.01)
|
27
|
-
factories << RubyOnAcid::SineFactory.new(0.001)
|
28
|
-
factories << RubyOnAcid::SineFactory.new(-0.001)
|
29
|
-
|
30
|
-
keys = [:red, :green, :blue, :alpha, :width, :x, :y, :x2, :y2]
|
31
|
-
|
32
|
-
factories.permutation(keys.length).each_with_index do |permutation, i|
|
33
|
-
meta_factory = RubyOnAcid::MetaFactory.new
|
34
|
-
keys.each do |key|
|
35
|
-
meta_factory.assign_factory(key, permutation.shift)
|
36
|
-
end
|
37
|
-
File.open(sprintf('%05d.yml', i), "w") do |file|
|
38
|
-
YAML.dump(meta_factory, file)
|
39
|
-
end
|
40
|
-
end
|
data/examples/quality_render.rb
DELETED
@@ -1,46 +0,0 @@
|
|
1
|
-
require File.join(File.dirname(__FILE__), 'wxruby.rb')
|
2
|
-
|
3
|
-
|
4
|
-
|
5
|
-
class MyApp
|
6
|
-
|
7
|
-
WIDTH = 1920
|
8
|
-
HEIGHT = 1080
|
9
|
-
|
10
|
-
def on_init
|
11
|
-
|
12
|
-
ARGV.each do |file_name|
|
13
|
-
|
14
|
-
puts "Processing #{file_name}"
|
15
|
-
|
16
|
-
@f = YAML.load_file(file_name)
|
17
|
-
|
18
|
-
frame = Wx::Frame.new(nil, :size => [WIDTH, HEIGHT])
|
19
|
-
|
20
|
-
|
21
|
-
#Displays drawing.
|
22
|
-
bitmap = Wx::Bitmap.new(WIDTH, HEIGHT)
|
23
|
-
bitmap.draw do |surface|
|
24
|
-
surface.brush = Wx::BLACK_BRUSH
|
25
|
-
surface.draw_rectangle(0, 0, WIDTH, HEIGHT)
|
26
|
-
end
|
27
|
-
10000.times do
|
28
|
-
bitmap.draw {|surface| render(surface)}
|
29
|
-
end
|
30
|
-
bitmap.draw do |surface|
|
31
|
-
surface.text_foreground = Wx::Colour.new(255, 255, 255, 255)
|
32
|
-
surface.draw_text("©2009 Jay McGavren. Licensed under a Creative Commons Attribution-Share Alike 3.0 United States License: http://creativecommons.org/licenses/by-sa/3.0/us/", 10, HEIGHT - 20)
|
33
|
-
end
|
34
|
-
|
35
|
-
bitmap.save_file(file_name + ".png", Wx::BITMAP_TYPE_PNG)
|
36
|
-
|
37
|
-
end
|
38
|
-
|
39
|
-
exit
|
40
|
-
|
41
|
-
end
|
42
|
-
|
43
|
-
end
|
44
|
-
|
45
|
-
app = MyApp.new
|
46
|
-
app.main_loop
|
data/examples/random_yaml.rb
DELETED
@@ -1,51 +0,0 @@
|
|
1
|
-
require File.join(File.dirname(__FILE__), 'wxruby.rb')
|
2
|
-
|
3
|
-
|
4
|
-
class MyApp
|
5
|
-
|
6
|
-
WIDTH = 320
|
7
|
-
HEIGHT = 320
|
8
|
-
|
9
|
-
def on_init
|
10
|
-
|
11
|
-
(1..1000).each do |file_number|
|
12
|
-
|
13
|
-
file_name = sprintf("%05d_random.jpg", file_number)
|
14
|
-
|
15
|
-
@f = create_factory
|
16
|
-
|
17
|
-
frame = Wx::Frame.new(nil, :size => [WIDTH, HEIGHT])
|
18
|
-
|
19
|
-
bitmap = Wx::Bitmap.new(WIDTH, HEIGHT)
|
20
|
-
bitmap.draw do |surface|
|
21
|
-
surface.brush = Wx::BLACK_BRUSH
|
22
|
-
surface.draw_rectangle(0, 0, WIDTH, HEIGHT)
|
23
|
-
end
|
24
|
-
10000.times do
|
25
|
-
bitmap.draw {|surface| render(surface)}
|
26
|
-
end
|
27
|
-
bitmap.draw do |surface|
|
28
|
-
surface.text_foreground = Wx::Colour.new(255, 255, 255, 255)
|
29
|
-
y = 0
|
30
|
-
@f.to_yaml.split("\n").each do |line|
|
31
|
-
surface.draw_text(line, 0, y)
|
32
|
-
y += 10
|
33
|
-
end
|
34
|
-
end
|
35
|
-
|
36
|
-
File.open(file_name + ".yml", "w") do |file|
|
37
|
-
YAML.dump(@f, file)
|
38
|
-
end
|
39
|
-
|
40
|
-
bitmap.save_file(file_name, Wx::BITMAP_TYPE_JPEG)
|
41
|
-
|
42
|
-
end
|
43
|
-
|
44
|
-
exit
|
45
|
-
|
46
|
-
end
|
47
|
-
|
48
|
-
end
|
49
|
-
|
50
|
-
app = MyApp.new
|
51
|
-
app.main_loop
|