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.
@@ -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
@@ -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
@@ -0,0 +1,5 @@
1
+ require 'collavoce'
2
+
3
+ RSpec.configure do |config|
4
+ config.mock_with :mocha
5
+ end
@@ -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
@@ -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
- - 5
9
- version: 0.0.5
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: []