collavoce 0.0.5 → 0.0.6
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/Rakefile +26 -0
- data/spec/note_spec.rb +79 -0
- data/spec/spec_helper.rb +5 -0
- data/spec/tracker_spec.rb +26 -0
- data/spec/voice_spec.rb +85 -0
- metadata +7 -2
data/Rakefile
ADDED
@@ -0,0 +1,26 @@
|
|
1
|
+
require 'rake/gempackagetask'
|
2
|
+
|
3
|
+
begin
|
4
|
+
spec = Gem::Specification.load(Dir['*.gemspec'].first)
|
5
|
+
gem = Rake::GemPackageTask.new(spec)
|
6
|
+
gem.define
|
7
|
+
rescue TypeError
|
8
|
+
end
|
9
|
+
|
10
|
+
desc "Push gem to rubygems.org"
|
11
|
+
task :push => :gem do
|
12
|
+
sh "gem push #{gem.package_dir}/#{gem.gem_file}"
|
13
|
+
end
|
14
|
+
|
15
|
+
desc "Play a tune"
|
16
|
+
task :demo do
|
17
|
+
sh "ruby -Ilib examples/zelda.rb"
|
18
|
+
end
|
19
|
+
|
20
|
+
desc "Run all specs"
|
21
|
+
task :specs do
|
22
|
+
sh "rspec spec"
|
23
|
+
end
|
24
|
+
|
25
|
+
task :test => :specs
|
26
|
+
task :default => :specs
|
data/spec/note_spec.rb
ADDED
@@ -0,0 +1,79 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe Collavoce::Note do
|
4
|
+
Note = Collavoce::Note
|
5
|
+
|
6
|
+
it "converts basic notes" do
|
7
|
+
Note.new("C").value.should == 60
|
8
|
+
Note.new("D").value.should == 62
|
9
|
+
end
|
10
|
+
|
11
|
+
it "converts sharps and flats" do
|
12
|
+
Note.new("C#").value.should == 61
|
13
|
+
Note.new("C##").value.should == 62
|
14
|
+
Note.new("Eb").value.should == 63
|
15
|
+
Note.new("Ebb").value.should == 62
|
16
|
+
end
|
17
|
+
|
18
|
+
it "converts octaves" do
|
19
|
+
Note.new("C5").value.should == 72
|
20
|
+
Note.new("C3").value.should == 48
|
21
|
+
end
|
22
|
+
|
23
|
+
it "converts duration" do
|
24
|
+
Note.new("C5w").duration.should == 1
|
25
|
+
Note.new("C#5h").duration.should == 1.to_f / 2
|
26
|
+
Note.new("Db3q").duration.should == 1.to_f / 4
|
27
|
+
Note.new("Ee").duration.should == 1.to_f / 8
|
28
|
+
Note.new("Fbs").duration.should == 1.to_f / 16
|
29
|
+
Note.new("G#t").duration.should == 1.to_f / 32
|
30
|
+
|
31
|
+
Note.new("C").duration.should == 1.to_f / 4
|
32
|
+
end
|
33
|
+
|
34
|
+
it "converts complex durations" do
|
35
|
+
Note.new("C#5hs").duration.should == 1.to_f / 2 + 1.to_f / 16
|
36
|
+
end
|
37
|
+
|
38
|
+
it "converts rests" do
|
39
|
+
Note.new("Rs").value.should be_nil
|
40
|
+
Note.new("Rs").duration.should == 1.to_f / 16
|
41
|
+
end
|
42
|
+
|
43
|
+
it "augments and diminshes" do
|
44
|
+
c = Note.new("C")
|
45
|
+
c.value.should == 60
|
46
|
+
c.aug.value.should == 61
|
47
|
+
c.dim.value.should == 59
|
48
|
+
c.dim!
|
49
|
+
c.value.should == 59
|
50
|
+
c.aug!
|
51
|
+
c.value.should == 60
|
52
|
+
end
|
53
|
+
|
54
|
+
it "raises a useful exception if the note isn't parsable" do
|
55
|
+
lambda { Note.new("OMFG") }.should raise_error(Collavoce::Note::UnparsableError)
|
56
|
+
end
|
57
|
+
|
58
|
+
it "knows about equality" do
|
59
|
+
Note.new("C").should == Note.new("C")
|
60
|
+
Note.new("C").should_not == Note.new("D")
|
61
|
+
Note.new("Cs").should_not == Note.new("Ce")
|
62
|
+
end
|
63
|
+
|
64
|
+
it "should play itself on a receiver" do
|
65
|
+
@receiver = mock('receiver')
|
66
|
+
@note = Note.new("C")
|
67
|
+
|
68
|
+
@receiver.expects(:send).with(is_a(Note::ShortMessage), 0).twice
|
69
|
+
@note.expects(:sleep).with(1)
|
70
|
+
|
71
|
+
@note.play(@receiver, 0, 4)
|
72
|
+
end
|
73
|
+
|
74
|
+
it "should just pause on rests" do
|
75
|
+
@note = Note.new("R")
|
76
|
+
@note.expects(:sleep).with(1)
|
77
|
+
@note.play(nil, nil, 4)
|
78
|
+
end
|
79
|
+
end
|
data/spec/spec_helper.rb
ADDED
@@ -0,0 +1,26 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
class MelodyA < Collavoce::Voice
|
4
|
+
notes %w(C D E)
|
5
|
+
end
|
6
|
+
|
7
|
+
class MelodyB < Collavoce::Voice
|
8
|
+
notes %w(F G)
|
9
|
+
end
|
10
|
+
|
11
|
+
describe Collavoce::Tracker do
|
12
|
+
it "should play a list of voices" do
|
13
|
+
MelodyA.any_instance.expects(:run)
|
14
|
+
MelodyB.any_instance.expects(:run)
|
15
|
+
@tracker = Collavoce::Tracker.new([MelodyA, MelodyB])
|
16
|
+
@tracker.run
|
17
|
+
end
|
18
|
+
|
19
|
+
it "should play multiple tracks (in parallel)" do
|
20
|
+
MelodyA.any_instance.expects(:run)
|
21
|
+
MelodyB.any_instance.expects(:run)
|
22
|
+
@tracker = Collavoce::Tracker.new([MelodyA],
|
23
|
+
[MelodyB])
|
24
|
+
@tracker.run
|
25
|
+
end
|
26
|
+
end
|
data/spec/voice_spec.rb
ADDED
@@ -0,0 +1,85 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
class TestVoice < Collavoce::Voice
|
4
|
+
channel 3
|
5
|
+
notes %w(C D E F)
|
6
|
+
end
|
7
|
+
|
8
|
+
describe Collavoce::Voice do
|
9
|
+
before(:each) do
|
10
|
+
@receiver = mock('receiver')
|
11
|
+
@voice = TestVoice.new(:bpm => 60)
|
12
|
+
@voice.stubs(:receiver).returns(@receiver)
|
13
|
+
@receiver.stubs(:send)
|
14
|
+
end
|
15
|
+
|
16
|
+
it "plays notes to the system receiver" do
|
17
|
+
Collavoce::Note.any_instance.expects(:play).times(4)
|
18
|
+
@voice.play
|
19
|
+
end
|
20
|
+
|
21
|
+
it "plays notes on the specified 1-indexed channel (internal is 0-indexed)" do
|
22
|
+
Collavoce::Note.any_instance.expects(:play).with(@receiver, 2, 4).times(4)
|
23
|
+
@voice.play
|
24
|
+
end
|
25
|
+
|
26
|
+
it "has helpers for modifying groups of notes" do
|
27
|
+
@voice.mod_notes(&:dim!)
|
28
|
+
@voice.notes[0].should == Collavoce::Note.new("Cb")
|
29
|
+
@voice.notes[1].should == Collavoce::Note.new("Db")
|
30
|
+
@voice.mod_notes(2, 3, &:aug!)
|
31
|
+
@voice.notes[2].should == Collavoce::Note.new("E")
|
32
|
+
@voice.notes[3].should == Collavoce::Note.new("F")
|
33
|
+
end
|
34
|
+
|
35
|
+
it "has helpers for diminishing and augmenting notes" do
|
36
|
+
@voice.dim_notes
|
37
|
+
@voice.notes[0].should == Collavoce::Note.new("Cb")
|
38
|
+
@voice.notes[1].should == Collavoce::Note.new("Db")
|
39
|
+
@voice.aug_notes(2, 3)
|
40
|
+
@voice.notes[2].should == Collavoce::Note.new("E")
|
41
|
+
@voice.notes[3].should == Collavoce::Note.new("F")
|
42
|
+
end
|
43
|
+
|
44
|
+
it "stops playing when Collavoce.stop is called" do
|
45
|
+
Collavoce.stop
|
46
|
+
Collavoce::Note.any_instance.expects(:play).never
|
47
|
+
@voice.play
|
48
|
+
end
|
49
|
+
|
50
|
+
it "tells the user if there are no output devices" do
|
51
|
+
@voice.stubs(:output_devices).returns([])
|
52
|
+
expect { @voice.device }.to raise_error(RuntimeError, /No output devices/)
|
53
|
+
end
|
54
|
+
|
55
|
+
it "tells the user if the requested device wasn't found" do
|
56
|
+
Collavoce.device_name = "bob"
|
57
|
+
@voice.stubs(:output_devices).returns([])
|
58
|
+
expect { @voice.device }.to raise_error(RuntimeError, /bob/)
|
59
|
+
end
|
60
|
+
|
61
|
+
def make_mock_device(name)
|
62
|
+
info = stub_everything('info')
|
63
|
+
info.stubs(:get_name).returns(name)
|
64
|
+
device = stub_everything('device')
|
65
|
+
device.stubs(:get_device_info).returns(info)
|
66
|
+
device
|
67
|
+
end
|
68
|
+
|
69
|
+
|
70
|
+
it "picks the first device if no device was specified" do
|
71
|
+
Collavoce.device_name = nil
|
72
|
+
mock_device = make_mock_device('not bob')
|
73
|
+
@voice.stubs(:output_devices).returns([mock_device])
|
74
|
+
$stderr.stubs(:puts)
|
75
|
+
@voice.device.should == mock_device
|
76
|
+
end
|
77
|
+
|
78
|
+
it "uses the output device specifed by Collavoce.device" do
|
79
|
+
Collavoce.device_name = "bob"
|
80
|
+
mock_device = make_mock_device('bob')
|
81
|
+
@voice.stubs(:output_devices).returns([make_mock_device('not bob'), mock_device])
|
82
|
+
@voice.device.should == mock_device
|
83
|
+
end
|
84
|
+
end
|
85
|
+
|
metadata
CHANGED
@@ -5,8 +5,8 @@ version: !ruby/object:Gem::Version
|
|
5
5
|
segments:
|
6
6
|
- 0
|
7
7
|
- 0
|
8
|
-
-
|
9
|
-
version: 0.0.
|
8
|
+
- 6
|
9
|
+
version: 0.0.6
|
10
10
|
platform: ruby
|
11
11
|
authors:
|
12
12
|
- Mat Schaffer
|
@@ -51,12 +51,17 @@ extra_rdoc_files:
|
|
51
51
|
- README.rdoc
|
52
52
|
files:
|
53
53
|
- .gemtest
|
54
|
+
- Rakefile
|
54
55
|
- README.rdoc
|
55
56
|
- lib/collavoce.rb
|
56
57
|
- lib/collavoce/note.rb
|
57
58
|
- lib/collavoce/sigint.rb
|
58
59
|
- lib/collavoce/tracker.rb
|
59
60
|
- lib/collavoce/voice.rb
|
61
|
+
- spec/note_spec.rb
|
62
|
+
- spec/spec_helper.rb
|
63
|
+
- spec/tracker_spec.rb
|
64
|
+
- spec/voice_spec.rb
|
60
65
|
has_rdoc: true
|
61
66
|
homepage: https://github.com/matschaffer/collavoce
|
62
67
|
licenses: []
|