musicality 0.11.1 → 0.12.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (124) hide show
  1. checksums.yaml +5 -5
  2. data/.coveralls.yml +1 -0
  3. data/.ruby-version +1 -1
  4. data/.travis.yml +4 -0
  5. data/ChangeLog.md +11 -0
  6. data/README.md +3 -0
  7. data/Rakefile +11 -3
  8. data/lib/musicality/composition/model/rhythm.rb +33 -0
  9. data/lib/musicality/composition/model/rhythm_class.rb +30 -0
  10. data/lib/musicality/composition/sequencing/drum_machine/drum_kit.rb +18 -0
  11. data/lib/musicality/composition/sequencing/drum_machine/drum_machine.rb +59 -0
  12. data/lib/musicality/composition/sequencing/drum_machine/drum_parts.rb +21 -0
  13. data/lib/musicality/composition/sequencing/drum_machine/drum_pattern.rb +66 -0
  14. data/lib/musicality/composition/sequencing/drum_machine/drum_patterns/pop_drum_patterns.rb +146 -0
  15. data/lib/musicality/composition/sequencing/note_array.rb +33 -0
  16. data/lib/musicality/composition/sequencing/note_fifo.rb +73 -0
  17. data/lib/musicality/composition/sequencing/sequenceable.rb +9 -0
  18. data/lib/musicality/composition/sequencing/sequencer.rb +35 -0
  19. data/lib/musicality/errors.rb +2 -2
  20. data/lib/musicality/notation/model/dynamics.rb +2 -2
  21. data/lib/musicality/notation/model/key.rb +42 -91
  22. data/lib/musicality/notation/model/keys.rb +35 -34
  23. data/lib/musicality/notation/model/note.rb +31 -9
  24. data/lib/musicality/notation/model/pitch.rb +2 -2
  25. data/lib/musicality/notation/parsing/convenience_methods.rb +23 -12
  26. data/lib/musicality/notation/parsing/duration_parsing.rb +3 -3
  27. data/lib/musicality/notation/parsing/key_parsing.rb +150 -0
  28. data/lib/musicality/notation/parsing/key_parsing.treetop +37 -0
  29. data/lib/musicality/notation/parsing/meter_parsing.rb +3 -3
  30. data/lib/musicality/notation/parsing/numbers/nonnegative_float_parsing.rb +3 -1
  31. data/lib/musicality/notation/parsing/numbers/nonnegative_integer_parsing.rb +1 -0
  32. data/lib/musicality/notation/parsing/numbers/nonnegative_rational_parsing.rb +1 -1
  33. data/lib/musicality/notation/parsing/numbers/positive_float_parsing.rb +4 -1
  34. data/lib/musicality/notation/parsing/numbers/positive_rational_parsing.rb +1 -1
  35. data/lib/musicality/notation/parsing/parseable.rb +13 -17
  36. data/lib/musicality/notation/parsing/pitch_parsing.rb +7 -0
  37. data/lib/musicality/notation/parsing/segment_parsing.rb +3 -0
  38. data/lib/musicality/performance/conversion/note_sequence_extractor.rb +82 -134
  39. data/lib/musicality/performance/model/note_sequence.rb +22 -3
  40. data/lib/musicality/performance/supercollider/performer.rb +2 -2
  41. data/lib/musicality/performance/supercollider/sc_drum_kits.rb +29 -0
  42. data/lib/musicality/performance/supercollider/synthdefs/bass.rb +211 -0
  43. data/lib/musicality/performance/supercollider/synthdefs/claps.rb +80 -0
  44. data/lib/musicality/performance/supercollider/synthdefs/cymbals.rb +57 -0
  45. data/lib/musicality/performance/supercollider/synthdefs/hihats.rb +67 -0
  46. data/lib/musicality/performance/supercollider/synthdefs/kicks.rb +158 -0
  47. data/lib/musicality/performance/supercollider/synthdefs/mario.rb +49 -0
  48. data/lib/musicality/performance/supercollider/{synthdefs.rb → synthdefs/other.rb} +0 -767
  49. data/lib/musicality/performance/supercollider/synthdefs/pianos.rb +46 -0
  50. data/lib/musicality/performance/supercollider/synthdefs/snares.rb +169 -0
  51. data/lib/musicality/performance/supercollider/synthdefs/toms.rb +25 -0
  52. data/lib/musicality/performance/supercollider/synthdefs/volume.rb +20 -0
  53. data/lib/musicality/pitch_class.rb +1 -1
  54. data/lib/musicality/pitch_classes.rb +3 -5
  55. data/lib/musicality/version.rb +1 -1
  56. data/lib/musicality.rb +25 -1
  57. data/musicality.gemspec +3 -2
  58. data/spec/composition/convenience_methods_spec.rb +8 -8
  59. data/spec/composition/generation/random_rhythm_generator_spec.rb +5 -5
  60. data/spec/composition/model/pitch_class_spec.rb +22 -16
  61. data/spec/composition/model/pitch_classes_spec.rb +5 -5
  62. data/spec/composition/model/rhythm_class_spec.rb +42 -0
  63. data/spec/composition/model/rhythm_spec.rb +43 -0
  64. data/spec/composition/model/scale_class_spec.rb +26 -26
  65. data/spec/composition/model/scale_spec.rb +38 -38
  66. data/spec/composition/sequencing/drum_machine/drum_machine_spec.rb +67 -0
  67. data/spec/composition/sequencing/drum_machine/drum_pattern_spec.rb +58 -0
  68. data/spec/composition/sequencing/note_array_spec.rb +94 -0
  69. data/spec/composition/sequencing/note_fifo_spec.rb +183 -0
  70. data/spec/composition/sequencing/sequencer_spec.rb +76 -0
  71. data/spec/composition/util/adding_sequence_spec.rb +33 -33
  72. data/spec/composition/util/compound_sequence_spec.rb +6 -6
  73. data/spec/composition/util/note_generation_spec.rb +34 -34
  74. data/spec/composition/util/probabilities_spec.rb +7 -7
  75. data/spec/composition/util/random_sampler_spec.rb +3 -3
  76. data/spec/composition/util/repeating_sequence_spec.rb +28 -28
  77. data/spec/musicality_spec.rb +1 -1
  78. data/spec/notation/conversion/change_conversion_spec.rb +87 -87
  79. data/spec/notation/conversion/note_time_converter_spec.rb +22 -22
  80. data/spec/notation/conversion/score_conversion_spec.rb +1 -1
  81. data/spec/notation/conversion/score_converter_spec.rb +31 -31
  82. data/spec/notation/conversion/tempo_conversion_spec.rb +11 -11
  83. data/spec/notation/model/change_spec.rb +80 -80
  84. data/spec/notation/model/key_spec.rb +135 -69
  85. data/spec/notation/model/link_spec.rb +27 -27
  86. data/spec/notation/model/meter_spec.rb +28 -28
  87. data/spec/notation/model/note_spec.rb +68 -47
  88. data/spec/notation/model/part_spec.rb +19 -19
  89. data/spec/notation/model/pitch_spec.rb +69 -68
  90. data/spec/notation/model/score_spec.rb +50 -47
  91. data/spec/notation/parsing/articulation_parsing_spec.rb +4 -4
  92. data/spec/notation/parsing/convenience_methods_spec.rb +49 -10
  93. data/spec/notation/parsing/duration_nodes_spec.rb +13 -13
  94. data/spec/notation/parsing/duration_parsing_spec.rb +10 -10
  95. data/spec/notation/parsing/key_parsing_spec.rb +19 -0
  96. data/spec/notation/parsing/link_nodes_spec.rb +7 -7
  97. data/spec/notation/parsing/link_parsing_spec.rb +4 -4
  98. data/spec/notation/parsing/meter_parsing_spec.rb +5 -5
  99. data/spec/notation/parsing/note_node_spec.rb +19 -19
  100. data/spec/notation/parsing/note_parsing_spec.rb +4 -4
  101. data/spec/notation/parsing/numbers/nonnegative_float_spec.rb +8 -8
  102. data/spec/notation/parsing/numbers/nonnegative_integer_spec.rb +2 -2
  103. data/spec/notation/parsing/numbers/nonnegative_rational_spec.rb +1 -1
  104. data/spec/notation/parsing/numbers/positive_float_spec.rb +8 -8
  105. data/spec/notation/parsing/numbers/positive_integer_spec.rb +6 -6
  106. data/spec/notation/parsing/numbers/positive_rational_spec.rb +6 -6
  107. data/spec/notation/parsing/pitch_node_spec.rb +7 -7
  108. data/spec/notation/parsing/pitch_parsing_spec.rb +2 -2
  109. data/spec/notation/parsing/segment_parsing_spec.rb +3 -3
  110. data/spec/notation/util/function_spec.rb +15 -15
  111. data/spec/notation/util/transition_spec.rb +12 -12
  112. data/spec/notation/util/value_computer_spec.rb +35 -36
  113. data/spec/performance/conversion/glissando_converter_spec.rb +24 -24
  114. data/spec/performance/conversion/note_sequence_extractor_spec.rb +39 -39
  115. data/spec/performance/conversion/portamento_converter_spec.rb +23 -23
  116. data/spec/performance/midi/midi_util_spec.rb +41 -41
  117. data/spec/performance/midi/part_sequencer_spec.rb +10 -10
  118. data/spec/performance/midi/score_sequencer_spec.rb +15 -15
  119. data/spec/performance/midi/score_sequencing_spec.rb +2 -2
  120. data/spec/performance/util/optimization_spec.rb +9 -9
  121. data/spec/printing/note_engraving_spec.rb +16 -16
  122. data/spec/printing/score_engraver_spec.rb +5 -5
  123. data/spec/spec_helper.rb +5 -0
  124. metadata +85 -30
@@ -4,7 +4,7 @@ require 'yaml'
4
4
  describe Pitch do
5
5
 
6
6
  before :each do
7
- @cases =
7
+ @cases =
8
8
  [
9
9
  { :octave => 1, :semitone => 0, :cent => 0, :ratio => 2.0, :total_cents => 1200 },
10
10
  { :octave => 2, :semitone => 0, :cent => 0, :ratio => 4.0, :total_cents => 2400 },
@@ -21,32 +21,32 @@ describe Pitch do
21
21
  { :octave => -5, :semitone => -2, :cent => -77, :ratio => 0.02663, :total_cents => -6277 }
22
22
  ]
23
23
  end
24
-
24
+
25
25
  it "should be constructable with no parameters (no error raised)" do
26
- lambda { Pitch.new }.should_not raise_error
26
+ expect(lambda { Pitch.new }).to_not raise_error
27
27
  end
28
-
28
+
29
29
  it "should take keyword args" do
30
30
  obj = Pitch.new octave: 4, semitone: 3, cent: 5
31
- obj.octave.should eq(4)
32
- obj.semitone.should eq(3)
33
- obj.cent.should eq(5)
31
+ expect(obj.octave).to eq(4)
32
+ expect(obj.semitone).to eq(3)
33
+ expect(obj.cent).to eq(5)
34
34
  end
35
-
35
+
36
36
  it "should use default octave, semitone, and cent if none is given" do
37
37
  p = Pitch.new
38
- p.ratio.should be_within(0.01).of(1.0)
39
- p.total_cents.should eq(0)
38
+ expect(p.ratio).to be_within(0.01).of(1.0)
39
+ expect(p.total_cents).to eq(0)
40
40
  end
41
-
41
+
42
42
  it "should use the octave and semitone given during construction" do
43
43
  @cases.each do |case_data|
44
44
  p = Pitch.new octave: case_data[:octave], semitone: case_data[:semitone], cent: case_data[:cent]
45
- p.ratio.should be_within(0.01).of case_data[:ratio]
46
- p.total_cents.should be case_data[:total_cents]
45
+ expect(p.ratio).to be_within(0.01).of case_data[:ratio]
46
+ expect(p.total_cents).to be case_data[:total_cents]
47
47
  end
48
48
  end
49
-
49
+
50
50
  describe '#diff' do
51
51
  it 'should return the difference between the given pitch, in semitones' do
52
52
  [
@@ -57,28 +57,28 @@ describe Pitch do
57
57
  [A5,Pitch.new(octave:5, semitone: 5, cent: 22),378/100.0],
58
58
  [A5,Pitch.new(octave:5, semitone: 11, cent: 85),-285/100.0],
59
59
  ].each do |a,b,c|
60
- a.diff(b).should eq(c)
60
+ expect(a.diff(b)).to eq(c)
61
61
  end
62
62
  end
63
63
  end
64
-
64
+
65
65
  describe '#transpose' do
66
66
  it 'should make a new pitch, adding the given interval to total semitones' do
67
67
  [0,1,2,5,12,13,-1,-2,-5,-12,-13].each do |interval|
68
68
  pitch = Eb3.transpose(interval)
69
- pitch.should_not be Eb3
70
- pitch.diff(Eb3).should eq(interval)
69
+ expect(pitch).to_not be Eb3
70
+ expect(pitch.diff(Eb3)).to eq(interval)
71
71
  end
72
72
  end
73
73
  end
74
-
74
+
75
75
  describe '#+' do
76
76
  it 'should produce same result as #transpose' do
77
77
  [0,1,2,5,12,13,-1,-2,-5,-12,-13].each do |interval|
78
78
  pitch = Eb3 + interval
79
- pitch.should_not be Eb3
79
+ expect(pitch).to_not be Eb3
80
80
  pitch2 = Eb3.transpose(interval)
81
- pitch.should eq(pitch2)
81
+ expect(pitch).to eq(pitch2)
82
82
  end
83
83
  end
84
84
  end
@@ -87,37 +87,37 @@ describe Pitch do
87
87
  it 'should produce same result as #transpose, with negative interval' do
88
88
  [0,1,2,5,12,13,-1,-2,-5,-12,-13].each do |interval|
89
89
  pitch = Eb3 - interval
90
- pitch.should_not be Eb3
90
+ expect(pitch).to_not be Eb3
91
91
  pitch2 = Eb3.transpose(-interval)
92
- pitch.should eq(pitch2)
92
+ expect(pitch).to eq(pitch2)
93
93
  end
94
94
  end
95
95
  end
96
96
 
97
97
  describe '.total_semitones' do
98
98
  it 'should convert to whole/fractional total semitones value' do
99
- C4.total_semitones.should eq(48)
100
- C5.total_semitones.should eq(60)
101
- C4.transpose(0.1).total_semitones.should eq(48.1)
102
- C5.transpose(0.19).total_semitones.should eq(60.19)
103
- C5.transpose(-0.19).total_semitones.should eq(59.81)
99
+ expect(C4.total_semitones).to eq(48)
100
+ expect(C5.total_semitones).to eq(60)
101
+ expect(C4.transpose(0.1).total_semitones).to eq(48.1)
102
+ expect(C5.transpose(0.19).total_semitones).to eq(60.19)
103
+ expect(C5.transpose(-0.19).total_semitones).to eq(59.81)
104
104
  end
105
105
  end
106
-
106
+
107
107
  describe '.from_semitones' do
108
108
  it 'should convert (rounded) fractional part to cent value' do
109
- Pitch.from_semitones(4).total_cents.should eq(400)
110
- Pitch.from_semitones(4.11).total_cents.should eq(411)
111
- Pitch.from_semitones(57.123).total_cents.should eq(5712)
112
- Pitch.from_semitones(57.125).total_cents.should eq(5713)
109
+ expect(Pitch.from_semitones(4).total_cents).to eq(400)
110
+ expect(Pitch.from_semitones(4.11).total_cents).to eq(411)
111
+ expect(Pitch.from_semitones(57.123).total_cents).to eq(5712)
112
+ expect(Pitch.from_semitones(57.125).total_cents).to eq(5713)
113
113
  end
114
114
  end
115
-
115
+
116
116
  describe '.from_ratio' do
117
117
  it 'should return a Pitch with given ratio' do
118
118
  @cases.each do |case_data|
119
119
  p = Pitch.from_ratio case_data[:ratio]
120
- p.total_cents.should eq case_data[:total_cents]
120
+ expect(p.total_cents).to eq case_data[:total_cents]
121
121
  end
122
122
  end
123
123
  end
@@ -125,93 +125,94 @@ describe Pitch do
125
125
  describe '.from_freq' do
126
126
  it 'should make a pitch whose freq is approximately the given freq' do
127
127
  [16.35, 440.0, 987.77].each do |given_freq|
128
- pitch = Pitch.from_freq given_freq
129
- pitch.freq.should be_within(0.01).of(given_freq)
128
+ pitch = Pitch.from_freq given_freq
129
+ expect(pitch.freq).to be_within(0.01).of(given_freq)
130
130
  end
131
131
  end
132
132
  end
133
-
133
+
134
134
  it "should be comparable to other pitches" do
135
135
  p1 = Pitch.new semitone: 1
136
136
  p2 = Pitch.new semitone: 2
137
137
  p3 = Pitch.new semitone: 3
138
138
 
139
- p1.should eq(Pitch.new semitone: 1)
140
- p2.should eq(Pitch.new semitone: 2)
141
- p3.should eq(Pitch.new semitone: 3)
142
-
143
- p1.should be < p2
144
- p1.should be < p3
145
- p2.should be < p3
146
- p3.should be > p2
147
- p3.should be > p1
148
- p2.should be > p1
149
- end
150
-
139
+ expect(p1).to eq(Pitch.new semitone: 1)
140
+ expect(p2).to eq(Pitch.new semitone: 2)
141
+ expect(p3).to eq(Pitch.new semitone: 3)
142
+
143
+ expect(p1).to be < p2
144
+ expect(p1).to be < p3
145
+ expect(p2).to be < p3
146
+ expect(p3).to be > p2
147
+ expect(p3).to be > p1
148
+ expect(p2).to be > p1
149
+ end
150
+
151
151
  it "should have freq of 440 for A4" do
152
152
  a4 = Pitch.new octave: 4, semitone: 9
153
- a4.freq.should be_within(0.01).of(440.0)
153
+ expect(a4.freq).to be_within(0.01).of(440.0)
154
154
  end
155
-
155
+
156
156
  describe '#to_yaml' do
157
157
  it 'should produce YAML that can be loaded' do
158
158
  p = Pitch.new(octave: 1, semitone: 2)
159
- YAML.load(p.to_yaml).should eq p
159
+ expect(YAML.load(p.to_yaml)).to eq p
160
160
  end
161
161
  end
162
162
 
163
163
  describe '#pack' do
164
164
  it 'should produce a Hash' do
165
- Bb3.pack.should be_a Hash
165
+ expect(Bb3.pack).to be_a Hash
166
166
  end
167
167
  end
168
168
 
169
169
  describe 'unpack' do
170
170
  it 'should produce an object equal the original' do
171
171
  p2 = Pitch.unpack Bb3.pack
172
- p2.should be_a Pitch
173
- p2.should eq Bb3
172
+ expect(p2).to be_a Pitch
173
+ expect(p2).to eq Bb3
174
174
  end
175
175
  end
176
-
176
+
177
177
  describe '#to_s' do
178
178
  context 'on-letter semitones' do
179
179
  it 'should return the semitone letter + octave number' do
180
180
  { C0 => "C0", D1 => "D1", E7 => "E7",
181
181
  F8 => "F8", G3 => "G3", A4 => "A4",
182
182
  B5 => "B5", C2 => "C2" }.each do |p,s|
183
- p.to_s.should eq s
183
+ expect(p.to_s).to eq s
184
184
  end
185
185
  end
186
186
  end
187
-
187
+
188
188
  context 'off-letter semitones' do
189
189
  context 'sharpit set false' do
190
190
  it 'should return semitone letter + "b" + octave number' do
191
191
  { Db0 => "Db0", Eb1 => "Eb1", Gb7 => "Gb7",
192
192
  Ab4 => "Ab4", Bb1 => "Bb1" }.each do |p,s|
193
- p.to_s(false).should eq s
193
+ expect(p.to_s(false)).to eq s
194
194
  end
195
195
  end
196
196
  end
197
-
197
+
198
198
  context 'sharpit set true' do
199
199
  it 'should return semitone letter + "#" + octave number' do
200
200
  { Db0 => "C#0", Eb1 => "D#1", Gb7 => "F#7",
201
201
  Ab4 => "G#4", Bb1 => "A#1" }.each do |p,s|
202
- p.to_s(true).should eq s
202
+ expect(p.to_s(true)).to eq s
203
203
  end
204
204
  end
205
205
  end
206
206
  end
207
-
207
+
208
208
  context 'non-zero cent value' do
209
209
  it 'should append +n (n = cent value)' do
210
- { C0.transpose(0.01) => "C0+1", E1.transpose(0.15) => "E1+15",
211
- G5.transpose(-0.55) => "Gb5+45"
212
- }.each do |p,s|
213
- p.to_s.should eq s
214
- end
210
+ {
211
+ C0.transpose(0.01) => "C0+1", E1.transpose(0.15) => "E1+15",
212
+ G5.transpose(-0.55) => "Gb5+45"
213
+ }.each do |p,s|
214
+ expect(p.to_s).to eq s
215
+ end
215
216
  end
216
217
  end
217
218
  end
@@ -4,7 +4,7 @@ describe Score do
4
4
  describe '#title' do
5
5
  context 'given no arg' do
6
6
  it 'should return the title' do
7
- Score.new(:title => "MyTitle").title.should eq("MyTitle")
7
+ expect(Score.new(:title => "MyTitle").title).to eq("MyTitle")
8
8
  end
9
9
  end
10
10
 
@@ -12,7 +12,7 @@ describe Score do
12
12
  it 'should assign the given value to title' do
13
13
  score = Score.new(:title => "MyTitle")
14
14
  score.title("A Better Title")
15
- score.title.should eq("A Better Title")
15
+ expect(score.title).to eq("A Better Title")
16
16
  end
17
17
  end
18
18
  end
@@ -20,7 +20,7 @@ describe Score do
20
20
  describe '#composer' do
21
21
  context 'given no arg' do
22
22
  it 'should return the composer' do
23
- Score.new(:composer => "Beethoven").composer.should eq("Beethoven")
23
+ expect(Score.new(:composer => "Beethoven").composer).to eq("Beethoven")
24
24
  end
25
25
  end
26
26
 
@@ -28,7 +28,7 @@ describe Score do
28
28
  it 'should assign the given value to composer' do
29
29
  score = Score.new(:composer => "Beethoven")
30
30
  score.composer("Mozart")
31
- score.composer.should eq("Mozart")
31
+ expect(score.composer).to eq("Mozart")
32
32
  end
33
33
  end
34
34
  end
@@ -37,14 +37,14 @@ describe Score do
37
37
  context 'has program with more than one segment' do
38
38
  it 'should return false' do
39
39
  score = Score.new(program: [0..2,0..2])
40
- score.collated?.should be false
40
+ expect(score.collated?).to be false
41
41
  end
42
42
  end
43
43
 
44
44
  context 'has program with 0 segments' do
45
45
  it 'should return false' do
46
46
  score = Score.new(program: [])
47
- score.collated?.should be false
47
+ expect(score.collated?).to be false
48
48
  end
49
49
  end
50
50
 
@@ -55,7 +55,7 @@ describe Score do
55
55
  score = Score.new(program: [0..2],
56
56
  parts: { "dummy" => Part.new(Dynamics::MP, notes: [Note.whole]*2)}
57
57
  )
58
- score.collated?.should be true
58
+ expect(score.collated?).to be true
59
59
  end
60
60
  end
61
61
 
@@ -64,9 +64,9 @@ describe Score do
64
64
  score = Score.new(program: [0..1],
65
65
  parts: { "dummy" => Part.new(Dynamics::MP, notes: [Note.whole]*2) }
66
66
  )
67
- score.collated?.should be false
67
+ expect(score.collated?).to be false
68
68
  score.program = [0..3]
69
- score.collated?.should be false
69
+ expect(score.collated?).to be false
70
70
  end
71
71
  end
72
72
  end
@@ -74,7 +74,7 @@ describe Score do
74
74
  context 'program segment does not start at 0' do
75
75
  it 'should return false' do
76
76
  score = Score.new(program: [1..2])
77
- score.collated?.should be false
77
+ expect(score.collated?).to be false
78
78
  end
79
79
  end
80
80
  end
@@ -83,25 +83,25 @@ describe Score do
83
83
  describe '#valid?' do
84
84
  context 'non-Range objects' do
85
85
  it 'should return false' do
86
- Score.new(program: [1,2,3]).should_not be_valid
86
+ expect(Score.new(program: [1,2,3])).to_not be_valid
87
87
  end
88
88
  end
89
89
 
90
90
  context 'increasing, positive segments' do
91
91
  it 'should return true' do
92
- Score.new(program: [0..2,1..2,0..4]).should be_valid
92
+ expect(Score.new(program: [0..2,1..2,0..4])).to be_valid
93
93
  end
94
94
  end
95
95
 
96
96
  context 'decreasing, positive segments' do
97
97
  it 'should return false' do
98
- Score.new(program: [2..0,2..1,04..0]).should be_invalid
98
+ expect(Score.new(program: [2..0,2..1,04..0])).to be_invalid
99
99
  end
100
100
  end
101
101
 
102
102
  context 'increasing, negative segments' do
103
103
  it 'should return false' do
104
- Score.new(program: [-1..2,-2..0,-2..2]).should be_invalid
104
+ expect(Score.new(program: [-1..2,-2..0,-2..2])).to be_invalid
105
105
  end
106
106
  end
107
107
  end
@@ -126,15 +126,15 @@ describe Score::Tempo do
126
126
  describe '#initialize' do
127
127
  it 'should use empty containers for parameters not given' do
128
128
  s = Score::Tempo.new(120)
129
- s.parts.should be_empty
130
- s.program.should be_empty
131
- s.tempo_changes.should be_empty
132
- s.meter_changes.should be_empty
129
+ expect(s.parts).to be_empty
130
+ expect(s.program).to be_empty
131
+ expect(s.tempo_changes).to be_empty
132
+ expect(s.meter_changes).to be_empty
133
133
  end
134
134
 
135
135
  it 'should assign given parameters' do
136
136
  s = Score::Tempo.new(120)
137
- s.start_tempo.should eq 120
137
+ expect(s.start_tempo).to eq 120
138
138
 
139
139
  m = FOUR_FOUR
140
140
  parts = { "piano (LH)" => Samples::SAMPLE_PART }
@@ -149,34 +149,36 @@ describe Score::Tempo do
149
149
  meter_changes: mcs,
150
150
  tempo_changes: tcs
151
151
  )
152
- s.start_meter.should eq m
153
- s.parts.should eq parts
154
- s.program.should eq program
155
- s.meter_changes.should eq mcs
156
- s.tempo_changes.should eq tcs
152
+ expect(s.start_meter).to eq m
153
+ expect(s.parts).to eq parts
154
+ expect(s.program).to eq program
155
+ expect(s.meter_changes).to eq mcs
156
+ expect(s.tempo_changes).to eq tcs
157
157
  end
158
158
  end
159
159
 
160
160
  describe '#duration' do
161
161
  context 'with no parts' do
162
162
  it 'should return 0' do
163
- Score::Tempo.new(120).duration.should eq(0)
163
+ expect(Score::Tempo.new(120).duration).to eq(0)
164
164
  end
165
165
  end
166
166
  context 'with one part' do
167
167
  it 'should return the duration of the part, in notes' do
168
- Score::Tempo.new(120, parts: {
168
+ s = Score::Tempo.new(120, parts: {
169
169
  "abc" => Part.new(Dynamics::MF, notes: "/4 /4 /2 3/4".to_notes)
170
- }).duration.should eq(1.75)
170
+ })
171
+ expect(s.duration).to eq(1.75)
171
172
  end
172
173
  end
173
174
 
174
175
  context 'with two parts' do
175
176
  it 'should return the duration of the longest part, in notes' do
176
- Score::Tempo.new(120, parts: {
177
+ s = Score::Tempo.new(120, parts: {
177
178
  "abc" => Part.new(Dynamics::MF, notes: "/4 /4 /2 3/4".to_notes),
178
179
  "def" => Part.new(Dynamics::MF, notes: "/4 /4 /2 1".to_notes)
179
- }).duration.should eq(2)
180
+ })
181
+ expect(s.duration).to eq(2)
180
182
  end
181
183
  end
182
184
  end
@@ -194,7 +196,7 @@ describe Score::Tempo do
194
196
  }.each do |context_str,args|
195
197
  context context_str do
196
198
  it 'should return true' do
197
- Score::Tempo.new(*args).should be_valid
199
+ expect(Score::Tempo.new(*args)).to be_valid
198
200
  end
199
201
  end
200
202
  end
@@ -215,7 +217,7 @@ describe Score::Tempo do
215
217
  }.each do |context_str,args|
216
218
  context context_str do
217
219
  it 'should return false' do
218
- Score::Tempo.new(*args).should be_invalid
220
+ expect(Score::Tempo.new(*args)).to be_invalid
219
221
  end
220
222
  end
221
223
  end
@@ -223,25 +225,25 @@ describe Score::Tempo do
223
225
 
224
226
  describe '#pack' do
225
227
  it 'should produce a Hash' do
226
- @basic_score.pack.should be_a Hash
228
+ expect(@basic_score.pack).to be_a Hash
227
229
  end
228
230
 
229
231
  it 'should pack program as an array of strings' do
230
232
  program = @basic_score.pack[:program]
231
- program.each {|entry| entry.should be_a String}
233
+ program.each {|entry| expect(entry).to be_a String}
232
234
  end
233
235
 
234
236
  it 'should pack sections as a Hash of strings' do
235
237
  program = @basic_score.pack[:sections]
236
- program.each {|name,entry| entry.should be_a String}
238
+ program.each {|name,entry| expect(entry).to be_a String}
237
239
  end
238
240
  end
239
241
 
240
242
  describe 'unpack' do
241
243
  it 'should produce an object equal the original' do
242
244
  score2 = Score::Tempo.unpack @basic_score.pack
243
- score2.should be_a Score
244
- score2.should eq @basic_score
245
+ expect(score2).to be_a Score
246
+ expect(score2).to eq @basic_score
245
247
  end
246
248
  end
247
249
  end
@@ -250,8 +252,8 @@ describe Score::Timed do
250
252
  describe '#initialize' do
251
253
  it 'should use empty containers for parameters not given' do
252
254
  s = Score::Timed.new
253
- s.parts.should be_empty
254
- s.program.should be_empty
255
+ expect(s.parts).to be_empty
256
+ expect(s.program).to be_empty
255
257
  end
256
258
 
257
259
  it 'should assign given parameters' do
@@ -259,17 +261,18 @@ describe Score::Timed do
259
261
  program = [0...0.75, 0...0.75]
260
262
 
261
263
  s = Score::Timed.new(parts: parts, program: program)
262
- s.parts.should eq parts
263
- s.program.should eq program
264
+ expect(s.parts).to eq parts
265
+ expect(s.program).to eq program
264
266
  end
265
267
  end
266
268
 
267
269
  describe '#duration' do
268
270
  it 'should return the duration of the longest part' do
269
- Score::Timed.new(parts: {
271
+ s = Score::Timed.new(parts: {
270
272
  "abc" => Part.new(Dynamics::MF, notes: "/4 /4 /2 3/4".to_notes),
271
273
  "def" => Part.new(Dynamics::MF, notes: "/4 /4 /2 1".to_notes)
272
- }).duration.should eq(2)
274
+ })
275
+ expect(s.duration).to eq(2)
273
276
  end
274
277
  end
275
278
 
@@ -280,7 +283,7 @@ describe Score::Timed do
280
283
  }.each do |context_str,args|
281
284
  context context_str do
282
285
  it 'should return true' do
283
- Score::Timed.new(*args).should be_valid
286
+ expect(Score::Timed.new(*args)).to be_valid
284
287
  end
285
288
  end
286
289
  end
@@ -291,7 +294,7 @@ describe Score::Timed do
291
294
  }.each do |context_str,args|
292
295
  context context_str do
293
296
  it 'should return false' do
294
- Score::Timed.new(*args).should be_invalid
297
+ expect(Score::Timed.new(*args)).to be_invalid
295
298
  end
296
299
  end
297
300
  end
@@ -303,7 +306,7 @@ describe Score::Timed do
303
306
  "abc" => Part.new(Dynamics::MF, notes: "/4 /4 /2 3/4".to_notes),
304
307
  "def" => Part.new(Dynamics::MF, notes: "/4 /4 /2 1".to_notes)
305
308
  })
306
- score.pack.should be_a Hash
309
+ expect(score.pack).to be_a Hash
307
310
  end
308
311
  end
309
312
 
@@ -314,8 +317,8 @@ describe Score::Timed do
314
317
  "def" => Part.new(Dynamics::MF, notes: "/4 /4 /2 1".to_notes)
315
318
  })
316
319
  score2 = Score::Timed.unpack score.pack
317
- score2.should be_a score.class
318
- score2.should eq score
320
+ expect(score2).to be_a score.class
321
+ expect(score2).to eq score
319
322
  end
320
323
  end
321
324
  end
@@ -2,15 +2,15 @@ require File.expand_path(File.dirname(__FILE__) + '/../../spec_helper')
2
2
 
3
3
  describe Parsing::ArticulationParser do
4
4
  parser = Parsing::ArticulationParser.new
5
-
5
+
6
6
  ARTICULATION_SYMBOLS.each do |art,str|
7
7
  res = parser.parse(str)
8
8
  it "should parse '#{str}'" do
9
- res.should_not be nil
9
+ expect(res).to_not be nil
10
10
  end
11
-
11
+
12
12
  it 'should return a node to responds to :to_articulation correctly' do
13
- res.to_articulation.should eq art
13
+ expect(res.to_articulation).to eq art
14
14
  end
15
15
  end
16
16
  end