musicality 0.11.1 → 0.12.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.
- checksums.yaml +5 -5
- data/.coveralls.yml +1 -0
- data/.ruby-version +1 -1
- data/.travis.yml +4 -0
- data/ChangeLog.md +11 -0
- data/README.md +3 -0
- data/Rakefile +11 -3
- data/lib/musicality/composition/model/rhythm.rb +33 -0
- data/lib/musicality/composition/model/rhythm_class.rb +30 -0
- data/lib/musicality/composition/sequencing/drum_machine/drum_kit.rb +18 -0
- data/lib/musicality/composition/sequencing/drum_machine/drum_machine.rb +59 -0
- data/lib/musicality/composition/sequencing/drum_machine/drum_parts.rb +21 -0
- data/lib/musicality/composition/sequencing/drum_machine/drum_pattern.rb +66 -0
- data/lib/musicality/composition/sequencing/drum_machine/drum_patterns/pop_drum_patterns.rb +146 -0
- data/lib/musicality/composition/sequencing/note_array.rb +33 -0
- data/lib/musicality/composition/sequencing/note_fifo.rb +73 -0
- data/lib/musicality/composition/sequencing/sequenceable.rb +9 -0
- data/lib/musicality/composition/sequencing/sequencer.rb +35 -0
- data/lib/musicality/errors.rb +2 -2
- data/lib/musicality/notation/model/dynamics.rb +2 -2
- data/lib/musicality/notation/model/key.rb +42 -91
- data/lib/musicality/notation/model/keys.rb +35 -34
- data/lib/musicality/notation/model/note.rb +31 -9
- data/lib/musicality/notation/model/pitch.rb +2 -2
- data/lib/musicality/notation/parsing/convenience_methods.rb +23 -12
- data/lib/musicality/notation/parsing/duration_parsing.rb +3 -3
- data/lib/musicality/notation/parsing/key_parsing.rb +150 -0
- data/lib/musicality/notation/parsing/key_parsing.treetop +37 -0
- data/lib/musicality/notation/parsing/meter_parsing.rb +3 -3
- data/lib/musicality/notation/parsing/numbers/nonnegative_float_parsing.rb +3 -1
- data/lib/musicality/notation/parsing/numbers/nonnegative_integer_parsing.rb +1 -0
- data/lib/musicality/notation/parsing/numbers/nonnegative_rational_parsing.rb +1 -1
- data/lib/musicality/notation/parsing/numbers/positive_float_parsing.rb +4 -1
- data/lib/musicality/notation/parsing/numbers/positive_rational_parsing.rb +1 -1
- data/lib/musicality/notation/parsing/parseable.rb +13 -17
- data/lib/musicality/notation/parsing/pitch_parsing.rb +7 -0
- data/lib/musicality/notation/parsing/segment_parsing.rb +3 -0
- data/lib/musicality/performance/conversion/note_sequence_extractor.rb +82 -134
- data/lib/musicality/performance/model/note_sequence.rb +22 -3
- data/lib/musicality/performance/supercollider/performer.rb +2 -2
- data/lib/musicality/performance/supercollider/sc_drum_kits.rb +29 -0
- data/lib/musicality/performance/supercollider/synthdefs/bass.rb +211 -0
- data/lib/musicality/performance/supercollider/synthdefs/claps.rb +80 -0
- data/lib/musicality/performance/supercollider/synthdefs/cymbals.rb +57 -0
- data/lib/musicality/performance/supercollider/synthdefs/hihats.rb +67 -0
- data/lib/musicality/performance/supercollider/synthdefs/kicks.rb +158 -0
- data/lib/musicality/performance/supercollider/synthdefs/mario.rb +49 -0
- data/lib/musicality/performance/supercollider/{synthdefs.rb → synthdefs/other.rb} +0 -767
- data/lib/musicality/performance/supercollider/synthdefs/pianos.rb +46 -0
- data/lib/musicality/performance/supercollider/synthdefs/snares.rb +169 -0
- data/lib/musicality/performance/supercollider/synthdefs/toms.rb +25 -0
- data/lib/musicality/performance/supercollider/synthdefs/volume.rb +20 -0
- data/lib/musicality/pitch_class.rb +1 -1
- data/lib/musicality/pitch_classes.rb +3 -5
- data/lib/musicality/version.rb +1 -1
- data/lib/musicality.rb +25 -1
- data/musicality.gemspec +3 -2
- data/spec/composition/convenience_methods_spec.rb +8 -8
- data/spec/composition/generation/random_rhythm_generator_spec.rb +5 -5
- data/spec/composition/model/pitch_class_spec.rb +22 -16
- data/spec/composition/model/pitch_classes_spec.rb +5 -5
- data/spec/composition/model/rhythm_class_spec.rb +42 -0
- data/spec/composition/model/rhythm_spec.rb +43 -0
- data/spec/composition/model/scale_class_spec.rb +26 -26
- data/spec/composition/model/scale_spec.rb +38 -38
- data/spec/composition/sequencing/drum_machine/drum_machine_spec.rb +67 -0
- data/spec/composition/sequencing/drum_machine/drum_pattern_spec.rb +58 -0
- data/spec/composition/sequencing/note_array_spec.rb +94 -0
- data/spec/composition/sequencing/note_fifo_spec.rb +183 -0
- data/spec/composition/sequencing/sequencer_spec.rb +76 -0
- data/spec/composition/util/adding_sequence_spec.rb +33 -33
- data/spec/composition/util/compound_sequence_spec.rb +6 -6
- data/spec/composition/util/note_generation_spec.rb +34 -34
- data/spec/composition/util/probabilities_spec.rb +7 -7
- data/spec/composition/util/random_sampler_spec.rb +3 -3
- data/spec/composition/util/repeating_sequence_spec.rb +28 -28
- data/spec/musicality_spec.rb +1 -1
- data/spec/notation/conversion/change_conversion_spec.rb +87 -87
- data/spec/notation/conversion/note_time_converter_spec.rb +22 -22
- data/spec/notation/conversion/score_conversion_spec.rb +1 -1
- data/spec/notation/conversion/score_converter_spec.rb +31 -31
- data/spec/notation/conversion/tempo_conversion_spec.rb +11 -11
- data/spec/notation/model/change_spec.rb +80 -80
- data/spec/notation/model/key_spec.rb +135 -69
- data/spec/notation/model/link_spec.rb +27 -27
- data/spec/notation/model/meter_spec.rb +28 -28
- data/spec/notation/model/note_spec.rb +68 -47
- data/spec/notation/model/part_spec.rb +19 -19
- data/spec/notation/model/pitch_spec.rb +69 -68
- data/spec/notation/model/score_spec.rb +50 -47
- data/spec/notation/parsing/articulation_parsing_spec.rb +4 -4
- data/spec/notation/parsing/convenience_methods_spec.rb +49 -10
- data/spec/notation/parsing/duration_nodes_spec.rb +13 -13
- data/spec/notation/parsing/duration_parsing_spec.rb +10 -10
- data/spec/notation/parsing/key_parsing_spec.rb +19 -0
- data/spec/notation/parsing/link_nodes_spec.rb +7 -7
- data/spec/notation/parsing/link_parsing_spec.rb +4 -4
- data/spec/notation/parsing/meter_parsing_spec.rb +5 -5
- data/spec/notation/parsing/note_node_spec.rb +19 -19
- data/spec/notation/parsing/note_parsing_spec.rb +4 -4
- data/spec/notation/parsing/numbers/nonnegative_float_spec.rb +8 -8
- data/spec/notation/parsing/numbers/nonnegative_integer_spec.rb +2 -2
- data/spec/notation/parsing/numbers/nonnegative_rational_spec.rb +1 -1
- data/spec/notation/parsing/numbers/positive_float_spec.rb +8 -8
- data/spec/notation/parsing/numbers/positive_integer_spec.rb +6 -6
- data/spec/notation/parsing/numbers/positive_rational_spec.rb +6 -6
- data/spec/notation/parsing/pitch_node_spec.rb +7 -7
- data/spec/notation/parsing/pitch_parsing_spec.rb +2 -2
- data/spec/notation/parsing/segment_parsing_spec.rb +3 -3
- data/spec/notation/util/function_spec.rb +15 -15
- data/spec/notation/util/transition_spec.rb +12 -12
- data/spec/notation/util/value_computer_spec.rb +35 -36
- data/spec/performance/conversion/glissando_converter_spec.rb +24 -24
- data/spec/performance/conversion/note_sequence_extractor_spec.rb +39 -39
- data/spec/performance/conversion/portamento_converter_spec.rb +23 -23
- data/spec/performance/midi/midi_util_spec.rb +41 -41
- data/spec/performance/midi/part_sequencer_spec.rb +10 -10
- data/spec/performance/midi/score_sequencer_spec.rb +15 -15
- data/spec/performance/midi/score_sequencing_spec.rb +2 -2
- data/spec/performance/util/optimization_spec.rb +9 -9
- data/spec/printing/note_engraving_spec.rb +16 -16
- data/spec/printing/score_engraver_spec.rb +5 -5
- data/spec/spec_helper.rb +5 -0
- metadata +85 -30
@@ -9,7 +9,7 @@ class_cases = { Duration => {
|
|
9
9
|
Note => {
|
10
10
|
'/2' => Note::half,
|
11
11
|
'99/10C2' => Note.new('99/10'.to_r, [C2]),
|
12
|
-
'5/2Db4,Eb5.' => Note.new('5/2'.to_r, [Db4,Eb5], articulation:STACCATO)
|
12
|
+
'5/2Db4,Eb5.' => Note.new('5/2'.to_r, [Db4,Eb5], articulation:STACCATO)
|
13
13
|
},
|
14
14
|
Pitch => {
|
15
15
|
'C2' => C2,
|
@@ -31,23 +31,23 @@ class_cases.each do |klass,cases|
|
|
31
31
|
describe("#{klass}.parse") do
|
32
32
|
it "should produce a single #{klass}" do
|
33
33
|
cases.each do |str,tgt|
|
34
|
-
klass.parse(str).
|
34
|
+
expect(klass.parse(str)).to eq(tgt)
|
35
35
|
end
|
36
36
|
end
|
37
37
|
end
|
38
|
-
|
38
|
+
|
39
39
|
describe("#{klass}.split_parse") do
|
40
40
|
context 'joined with whitespace, using default pattern' do
|
41
41
|
it "should produce multiple of #{klass}" do
|
42
42
|
str = cases.keys.join(" ")
|
43
|
-
klass.split_parse(str).
|
43
|
+
expect(klass.split_parse(str)).to eq(cases.values)
|
44
44
|
end
|
45
45
|
end
|
46
|
-
|
46
|
+
|
47
47
|
context 'joined by custom separator, using matching pattern' do
|
48
48
|
it "should raise produce multiple of #{klass}" do
|
49
49
|
str = cases.keys.join(";")
|
50
|
-
klass.split_parse(str,";").
|
50
|
+
expect(klass.split_parse(str,";")).to eq(cases.values)
|
51
51
|
end
|
52
52
|
end
|
53
53
|
end
|
@@ -64,7 +64,7 @@ end
|
|
64
64
|
describe "\##{method}" do
|
65
65
|
it "should return a #{klass}" do
|
66
66
|
class_cases[klass].each do |str,tgt|
|
67
|
-
str.send(method).
|
67
|
+
expect(str.send(method)).to eq(tgt)
|
68
68
|
end
|
69
69
|
end
|
70
70
|
end
|
@@ -72,6 +72,45 @@ end
|
|
72
72
|
end
|
73
73
|
end
|
74
74
|
|
75
|
+
# Failure cases
|
76
|
+
describe 'String' do
|
77
|
+
# Duration parsing
|
78
|
+
[:to_d, :to_dur, :to_duration].each do |method|
|
79
|
+
describe "\##{method}" do
|
80
|
+
it "should fail to parse 'A'" do
|
81
|
+
expect { 'A'.send(method) }.to raise_error(ParseError)
|
82
|
+
end
|
83
|
+
end
|
84
|
+
end
|
85
|
+
|
86
|
+
# Pitch parsing
|
87
|
+
[:to_p, :to_pitch].each do |method|
|
88
|
+
describe "\##{method}" do
|
89
|
+
it "should fail to parse '/2'" do
|
90
|
+
expect { '/2'.send(method) }.to raise_error(ParseError)
|
91
|
+
end
|
92
|
+
end
|
93
|
+
end
|
94
|
+
|
95
|
+
# Note parsing
|
96
|
+
[:to_n, :to_note].each do |method|
|
97
|
+
describe "\##{method}" do
|
98
|
+
it "should fail to parse 'A'" do
|
99
|
+
expect { 'A'.send(method) }.to raise_error(ParseError)
|
100
|
+
end
|
101
|
+
end
|
102
|
+
end
|
103
|
+
|
104
|
+
# Meter parsing
|
105
|
+
[:to_meter].each do |method|
|
106
|
+
describe "\##{method}" do
|
107
|
+
it "should fail to parse 'A'" do
|
108
|
+
expect { 'A'.send(method) }.to raise_error(ParseError)
|
109
|
+
end
|
110
|
+
end
|
111
|
+
end
|
112
|
+
end
|
113
|
+
|
75
114
|
{
|
76
115
|
Duration => [:to_ds, :to_durs, :to_durations],
|
77
116
|
Pitch => [:to_ps, :to_pitches],
|
@@ -83,14 +122,14 @@ end
|
|
83
122
|
context 'joined with whitespace' do
|
84
123
|
it "should return multiple of #{klass}" do
|
85
124
|
str = class_cases[klass].keys.join(" ")
|
86
|
-
str.send(method).
|
125
|
+
expect(str.send(method)).to eq(class_cases[klass].values)
|
87
126
|
end
|
88
127
|
end
|
89
|
-
|
128
|
+
|
90
129
|
context 'joined by custom separator, using matching pattern' do
|
91
130
|
it "should raise produce multiple of #{klass}" do
|
92
131
|
str = class_cases[klass].keys.join(";")
|
93
|
-
str.send(method,";").
|
132
|
+
expect(str.send(method,";")).to eq(class_cases[klass].values)
|
94
133
|
end
|
95
134
|
end
|
96
135
|
end
|
@@ -2,7 +2,7 @@ require File.expand_path(File.dirname(__FILE__) + '/../../spec_helper')
|
|
2
2
|
|
3
3
|
describe Parsing::NumDenNode do
|
4
4
|
dur_parser = Parsing::DurationParser.new
|
5
|
-
|
5
|
+
|
6
6
|
{
|
7
7
|
'1/2' => Rational(1,2),
|
8
8
|
'5/100' => Rational(5,100),
|
@@ -11,17 +11,17 @@ describe Parsing::NumDenNode do
|
|
11
11
|
res = dur_parser.parse(str)
|
12
12
|
context str do
|
13
13
|
it 'should parse as NumDenNode' do
|
14
|
-
res.
|
14
|
+
expect(res).to be_a Parsing::NumDenNode
|
15
15
|
end
|
16
16
|
|
17
17
|
describe '#to_r' do
|
18
18
|
r = res.to_r
|
19
19
|
it 'should produce a Rational' do
|
20
|
-
r.
|
20
|
+
expect(r).to be_a Rational
|
21
21
|
end
|
22
|
-
|
22
|
+
|
23
23
|
it 'should produce value matching input str' do
|
24
|
-
r.
|
24
|
+
expect(r).to eq tgt
|
25
25
|
end
|
26
26
|
end
|
27
27
|
end
|
@@ -38,17 +38,17 @@ describe Parsing::NumOnlyNode do
|
|
38
38
|
res = dur_parser.parse(str)
|
39
39
|
context str do
|
40
40
|
it 'should parse as NumOnlyNode' do
|
41
|
-
res.
|
41
|
+
expect(res).to be_a Parsing::NumOnlyNode
|
42
42
|
end
|
43
43
|
|
44
44
|
describe '#to_r' do
|
45
45
|
r = res.to_r
|
46
46
|
it 'should produce a Rational' do
|
47
|
-
r.
|
47
|
+
expect(r).to be_a Rational
|
48
48
|
end
|
49
|
-
|
49
|
+
|
50
50
|
it 'should produce value matching input str' do
|
51
|
-
r.
|
51
|
+
expect(r).to eq tgt
|
52
52
|
end
|
53
53
|
end
|
54
54
|
end
|
@@ -65,17 +65,17 @@ describe Parsing::DenOnlyNode do
|
|
65
65
|
res = dur_parser.parse(str)
|
66
66
|
context str do
|
67
67
|
it 'should parse as DenOnlyNode' do
|
68
|
-
res.
|
68
|
+
expect(res).to be_a Parsing::DenOnlyNode
|
69
69
|
end
|
70
70
|
|
71
71
|
describe '#to_r' do
|
72
72
|
r = res.to_r
|
73
73
|
it 'should produce a Rational' do
|
74
|
-
r.
|
74
|
+
expect(r).to be_a Rational
|
75
75
|
end
|
76
|
-
|
76
|
+
|
77
77
|
it 'should produce value matching input str' do
|
78
|
-
r.
|
78
|
+
expect(r).to eq tgt
|
79
79
|
end
|
80
80
|
end
|
81
81
|
end
|
@@ -6,12 +6,12 @@ describe Parsing::DurationParser do
|
|
6
6
|
@valid = {
|
7
7
|
:numbers => [1,5,50,3999,01,0010,0000005050],
|
8
8
|
}
|
9
|
-
|
9
|
+
|
10
10
|
@invalid = {
|
11
11
|
:numbers => [0,00],
|
12
|
-
}
|
12
|
+
}
|
13
13
|
end
|
14
|
-
|
14
|
+
|
15
15
|
context 'valid (non-zero) numerator and denominator' do
|
16
16
|
["n","n/","n/d","/d"].each do |expr|
|
17
17
|
it "should parse durations of the form #{expr}" do
|
@@ -19,7 +19,7 @@ describe Parsing::DurationParser do
|
|
19
19
|
@valid[:numbers].each do |d|
|
20
20
|
str = expr.gsub('n',"#{n}")
|
21
21
|
str = str.gsub('d',"#{d}")
|
22
|
-
dur_parser.parse(str).
|
22
|
+
expect(dur_parser.parse(str)).to_not be nil
|
23
23
|
end
|
24
24
|
end
|
25
25
|
end
|
@@ -33,13 +33,13 @@ describe Parsing::DurationParser do
|
|
33
33
|
@valid[:numbers].each do |d|
|
34
34
|
str = expr.gsub('n',"#{n}")
|
35
35
|
str = str.gsub('d',"#{d}")
|
36
|
-
dur_parser.parse(str).
|
36
|
+
expect(dur_parser.parse(str)).to be nil
|
37
37
|
end
|
38
38
|
end
|
39
39
|
end
|
40
40
|
end
|
41
41
|
end
|
42
|
-
|
42
|
+
|
43
43
|
context 'valid numerator and invalid (zero) denominator' do
|
44
44
|
["n/d","/d"].each do |expr|
|
45
45
|
it "should parse durations of the form #{expr}" do
|
@@ -47,13 +47,13 @@ describe Parsing::DurationParser do
|
|
47
47
|
@invalid[:numbers].each do |d|
|
48
48
|
str = expr.gsub('n',"#{n}")
|
49
49
|
str = str.gsub('d',"#{d}")
|
50
|
-
dur_parser.parse(str).
|
50
|
+
expect(dur_parser.parse(str)).to be nil
|
51
51
|
end
|
52
52
|
end
|
53
53
|
end
|
54
54
|
end
|
55
55
|
end
|
56
|
-
|
56
|
+
|
57
57
|
context 'invalid numerator and invalid denominator' do
|
58
58
|
["n","n/","n/d","/d"].each do |expr|
|
59
59
|
it "should parse durations of the form #{expr}" do
|
@@ -61,10 +61,10 @@ describe Parsing::DurationParser do
|
|
61
61
|
@invalid[:numbers].each do |d|
|
62
62
|
str = expr.gsub('n',"#{n}")
|
63
63
|
str = str.gsub('d',"#{d}")
|
64
|
-
dur_parser.parse(str).
|
64
|
+
expect(dur_parser.parse(str)).to be nil
|
65
65
|
end
|
66
66
|
end
|
67
67
|
end
|
68
68
|
end
|
69
|
-
end
|
69
|
+
end
|
70
70
|
end
|
@@ -0,0 +1,19 @@
|
|
1
|
+
require File.expand_path(File.dirname(__FILE__) + '/../../spec_helper')
|
2
|
+
|
3
|
+
describe Parsing::KeyParser do
|
4
|
+
before :all do
|
5
|
+
@parser = Parsing::KeyParser.new
|
6
|
+
end
|
7
|
+
|
8
|
+
{
|
9
|
+
"Cmaj" => Musicality::Keys::C_MAJOR,
|
10
|
+
"F#min" => Musicality::Keys::Fs_MINOR,
|
11
|
+
"Fmin" => Musicality::Keys::F_MINOR,
|
12
|
+
"Bbmaj" => Musicality::Keys::Bb_MAJOR
|
13
|
+
}.each do |str, key|
|
14
|
+
it "should parse #{str}" do
|
15
|
+
expect(@parser).to parse(str)
|
16
|
+
expect(str.to_key).to eq(key)
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
@@ -2,7 +2,7 @@ require File.expand_path(File.dirname(__FILE__) + '/../../spec_helper')
|
|
2
2
|
|
3
3
|
describe Parsing::LinkNode do
|
4
4
|
parser = Parsing::LinkParser.new
|
5
|
-
|
5
|
+
|
6
6
|
{
|
7
7
|
LINK_SYMBOLS[Link::Tie] => Link::Tie.new,
|
8
8
|
(LINK_SYMBOLS[Link::Glissando] + Db2.to_s) => Link::Glissando.new(Db2),
|
@@ -11,19 +11,19 @@ describe Parsing::LinkNode do
|
|
11
11
|
res = parser.parse(str)
|
12
12
|
context str do
|
13
13
|
it 'should parse as LinkNode' do
|
14
|
-
res.
|
14
|
+
expect(res).to be_a Parsing::LinkNode
|
15
15
|
end
|
16
|
-
|
16
|
+
|
17
17
|
describe '#to_pitch' do
|
18
18
|
l = res.to_link
|
19
19
|
it 'should produce a Link object' do
|
20
|
-
l.
|
20
|
+
expect(l).to be_a Link
|
21
21
|
end
|
22
|
-
|
22
|
+
|
23
23
|
it 'should produce pitch matching input str' do
|
24
|
-
l.
|
24
|
+
expect(l).to eq tgt
|
25
25
|
end
|
26
26
|
end
|
27
27
|
end
|
28
|
-
end
|
28
|
+
end
|
29
29
|
end
|
@@ -4,16 +4,16 @@ describe Parsing::LinkParser do
|
|
4
4
|
before :all do
|
5
5
|
@parser = Parsing::LinkParser.new
|
6
6
|
end
|
7
|
-
|
7
|
+
|
8
8
|
it "should parse #{LINK_SYMBOLS[Link::Tie]}" do
|
9
|
-
@parser.
|
9
|
+
expect(@parser).to parse(LINK_SYMBOLS[Link::Tie])
|
10
10
|
end
|
11
11
|
|
12
12
|
it "should parse #{LINK_SYMBOLS[Link::Glissando]} with target pitch" do
|
13
|
-
@parser.
|
13
|
+
expect(@parser).to parse(LINK_SYMBOLS[Link::Glissando] + C3.to_s)
|
14
14
|
end
|
15
15
|
|
16
16
|
it "should parse #{LINK_SYMBOLS[Link::Portamento]} with target pitch" do
|
17
|
-
@parser.
|
17
|
+
expect(@parser).to parse(LINK_SYMBOLS[Link::Portamento] + C3.to_s)
|
18
18
|
end
|
19
19
|
end
|
@@ -2,7 +2,7 @@ require File.expand_path(File.dirname(__FILE__) + '/../../spec_helper')
|
|
2
2
|
|
3
3
|
describe Parsing::MeterParser do
|
4
4
|
parser = Parsing::MeterParser.new
|
5
|
-
|
5
|
+
|
6
6
|
{
|
7
7
|
'4/4' => FOUR_FOUR,
|
8
8
|
'2*3/8' => SIX_EIGHT,
|
@@ -11,13 +11,13 @@ describe Parsing::MeterParser do
|
|
11
11
|
'3/4' => THREE_FOUR
|
12
12
|
}.each do |str,met|
|
13
13
|
res = parser.parse(str)
|
14
|
-
|
14
|
+
|
15
15
|
it "should parse #{str}" do
|
16
|
-
res.
|
16
|
+
expect(res).to_not be nil
|
17
17
|
end
|
18
|
-
|
18
|
+
|
19
19
|
it 'should produce node that properly converts to meter' do
|
20
|
-
res.to_meter.
|
20
|
+
expect(res.to_meter).to eq met
|
21
21
|
end
|
22
22
|
end
|
23
23
|
end
|
@@ -3,7 +3,7 @@ require File.expand_path(File.dirname(__FILE__) + '/../../spec_helper')
|
|
3
3
|
NOTE_PARSER = Parsing::NoteParser.new
|
4
4
|
|
5
5
|
describe Parsing::NoteNode do
|
6
|
-
context 'rest note' do
|
6
|
+
context 'rest note' do
|
7
7
|
{
|
8
8
|
'/2' => Note.new(Rational(1,2)),
|
9
9
|
'4/2' => Note.new(Rational(4,2)),
|
@@ -13,17 +13,17 @@ describe Parsing::NoteNode do
|
|
13
13
|
res = NOTE_PARSER.parse(str)
|
14
14
|
context str do
|
15
15
|
it 'should parse as NoteNode' do
|
16
|
-
res.
|
16
|
+
expect(res).to be_a Parsing::NoteNode
|
17
17
|
end
|
18
|
-
|
18
|
+
|
19
19
|
describe '#to_note' do
|
20
20
|
n = res.to_note
|
21
21
|
it 'should produce a Note' do
|
22
|
-
n.
|
22
|
+
expect(n).to be_a Note
|
23
23
|
end
|
24
|
-
|
24
|
+
|
25
25
|
it 'should produce value matching input str' do
|
26
|
-
n.
|
26
|
+
expect(n).to eq tgt
|
27
27
|
end
|
28
28
|
end
|
29
29
|
end
|
@@ -38,20 +38,20 @@ describe Parsing::NoteNode do
|
|
38
38
|
"56/33B1!" => Note.new(Rational(56,33),[B1],articulation:STACCATISSIMO),
|
39
39
|
}.each do |str,tgt|
|
40
40
|
res = NOTE_PARSER.parse(str)
|
41
|
-
|
41
|
+
|
42
42
|
context str do
|
43
43
|
it 'should parse as `Node' do
|
44
|
-
res.
|
44
|
+
expect(res).to be_a Parsing::NoteNode
|
45
45
|
end
|
46
|
-
|
46
|
+
|
47
47
|
describe '#to_note' do
|
48
48
|
n = res.to_note
|
49
49
|
it 'should produce a Note' do
|
50
|
-
n.
|
50
|
+
expect(n).to be_a Note
|
51
51
|
end
|
52
|
-
|
52
|
+
|
53
53
|
it 'should produce value matching input str' do
|
54
|
-
n.
|
54
|
+
expect(n).to eq tgt
|
55
55
|
end
|
56
56
|
end
|
57
57
|
end
|
@@ -69,18 +69,18 @@ describe Parsing::NoteNode do
|
|
69
69
|
res = NOTE_PARSER.parse(str)
|
70
70
|
context str do
|
71
71
|
it 'should parse as NoteNode' do
|
72
|
-
res.
|
72
|
+
expect(res).to be_a Parsing::NoteNode
|
73
73
|
end
|
74
|
-
|
74
|
+
|
75
75
|
describe '#to_note' do
|
76
76
|
n = res.to_note
|
77
77
|
|
78
78
|
it 'should produce a Note' do
|
79
|
-
n.
|
79
|
+
expect(n).to be_a Note
|
80
80
|
end
|
81
|
-
|
81
|
+
|
82
82
|
it 'should produce value matching input str' do
|
83
|
-
n.
|
83
|
+
expect(n).to eq tgt
|
84
84
|
end
|
85
85
|
end
|
86
86
|
end
|
@@ -96,7 +96,7 @@ describe Parsing::NoteNode do
|
|
96
96
|
it 'should produce a Note with marks set correctly' do
|
97
97
|
str = "#{begin_marks_str}/4Bb2#{end_marks_str}"
|
98
98
|
n = NOTE_PARSER.parse(str).to_note
|
99
|
-
n.marks.
|
99
|
+
expect(n.marks).to eq(begin_marks+end_marks)
|
100
100
|
end
|
101
101
|
end
|
102
102
|
end
|
@@ -107,7 +107,7 @@ describe Parsing::NoteNode do
|
|
107
107
|
it 'should produce a Note with marks set to []' do
|
108
108
|
str = "/4Bb2"
|
109
109
|
n = NOTE_PARSER.parse(str).to_note
|
110
|
-
n.marks.
|
110
|
+
expect(n.marks).to eq([])
|
111
111
|
end
|
112
112
|
end
|
113
113
|
end
|
@@ -4,7 +4,7 @@ describe Parsing::NoteParser do
|
|
4
4
|
before :all do
|
5
5
|
@parser = Parsing::NoteParser.new
|
6
6
|
end
|
7
|
-
|
7
|
+
|
8
8
|
valid_cases = {
|
9
9
|
'duration only' => ['1/4','/2','1','55/33'],
|
10
10
|
'single pitch' => ['/4C2','5/3Db3','/33E#8'],
|
@@ -26,11 +26,11 @@ describe Parsing::NoteParser do
|
|
26
26
|
'begins marks at the end' => ['1Bb3('],
|
27
27
|
'end marks at the beginning ' => [')3C3']
|
28
28
|
}
|
29
|
-
|
29
|
+
|
30
30
|
valid_cases.each do |descr, strs|
|
31
31
|
context(descr + ' (valid)') do
|
32
32
|
it 'should parse' do
|
33
|
-
strs.each {|s| @parser.
|
33
|
+
strs.each {|s| expect(@parser).to parse(s) }
|
34
34
|
end
|
35
35
|
end
|
36
36
|
end
|
@@ -38,7 +38,7 @@ describe Parsing::NoteParser do
|
|
38
38
|
invalid_cases.each do |descr, strs|
|
39
39
|
context(descr + ' (invalid)') do
|
40
40
|
it 'should not parse' do
|
41
|
-
strs.each {|s| @parser.
|
41
|
+
strs.each {|s| expect(@parser).to_not parse(s) }
|
42
42
|
end
|
43
43
|
end
|
44
44
|
end
|
@@ -6,23 +6,23 @@ describe Parsing::NonnegativeFloatParser do
|
|
6
6
|
["0.0","0e1","2e2","1.0","0.50","05.003e-10","1.555e+2","3.443214","0.001","0000.0030000"].each do |str|
|
7
7
|
res = parser.parse(str)
|
8
8
|
f = str.to_f
|
9
|
-
|
9
|
+
|
10
10
|
it "should parse '#{str}'" do
|
11
|
-
res.
|
11
|
+
expect(res).to_not be nil
|
12
12
|
end
|
13
13
|
|
14
14
|
it 'should return node that is convertible to float using #to_f method' do
|
15
|
-
res.to_f.
|
15
|
+
expect(res.to_f).to eq(f)
|
16
16
|
end
|
17
|
-
|
17
|
+
|
18
18
|
it 'should return node that is convertible to float using #to_num method' do
|
19
|
-
res.to_num.
|
19
|
+
expect(res.to_num).to eq(f)
|
20
20
|
end
|
21
21
|
end
|
22
|
-
|
22
|
+
|
23
23
|
["-1.0","-0e1"].each do |str|
|
24
24
|
it "should not parse '#{str}'" do
|
25
|
-
parser.
|
26
|
-
end
|
25
|
+
expect(parser).to_not parse(str)
|
26
|
+
end
|
27
27
|
end
|
28
28
|
end
|
@@ -5,11 +5,11 @@ describe Parsing::NonnegativeIntegerParser do
|
|
5
5
|
|
6
6
|
["1","50","05","502530","0"].each do |str|
|
7
7
|
it "should parse '#{str}'" do
|
8
|
-
parser.parse(str).
|
8
|
+
expect(parser.parse(str)).to_not be nil
|
9
9
|
end
|
10
10
|
end
|
11
11
|
|
12
12
|
it 'should not parse an empty string' do
|
13
|
-
parser.parse("").
|
13
|
+
expect(parser.parse("")).to be nil
|
14
14
|
end
|
15
15
|
end
|
@@ -6,23 +6,23 @@ describe Parsing::PositiveFloatParser do
|
|
6
6
|
["2e2","1.0","0.50","05.003e-10","1.555e+2","3.443214","0.001","0000.0030000"].each do |str|
|
7
7
|
res = parser.parse(str)
|
8
8
|
f = str.to_f
|
9
|
-
|
9
|
+
|
10
10
|
it "should parse '#{str}'" do
|
11
|
-
res.
|
11
|
+
expect(res).to_not be nil
|
12
12
|
end
|
13
13
|
|
14
14
|
it 'should return node that is convertible to float using #to_f method' do
|
15
|
-
res.to_f.
|
15
|
+
expect(res.to_f).to eq(f)
|
16
16
|
end
|
17
|
-
|
17
|
+
|
18
18
|
it 'should return node that is convertible to float using #to_num method' do
|
19
|
-
res.to_num.
|
19
|
+
expect(res.to_num).to eq(f)
|
20
20
|
end
|
21
21
|
end
|
22
|
-
|
22
|
+
|
23
23
|
["-2.0","-1.55e-2","0.0","0e1"].each do |str|
|
24
24
|
it "should not parse '#{str}'" do
|
25
|
-
parser.
|
26
|
-
end
|
25
|
+
expect(parser).to_not parse(str)
|
26
|
+
end
|
27
27
|
end
|
28
28
|
end
|
@@ -6,23 +6,23 @@ describe Parsing::PositiveIntegerParser do
|
|
6
6
|
["1","50","05","502530"].each do |str|
|
7
7
|
res = parser.parse(str)
|
8
8
|
i = str.to_i
|
9
|
-
|
9
|
+
|
10
10
|
it "should parse '#{str}'" do
|
11
|
-
res.
|
11
|
+
expect(res).to_not be nil
|
12
12
|
end
|
13
13
|
|
14
14
|
it 'should return node that is convertible to integer using #to_i method' do
|
15
|
-
res.to_i.
|
15
|
+
expect(res.to_i).to eq(i)
|
16
16
|
end
|
17
|
-
|
17
|
+
|
18
18
|
it 'should return node that is convertible to integer using #to_num method' do
|
19
|
-
res.to_num.
|
19
|
+
expect(res.to_num).to eq(i)
|
20
20
|
end
|
21
21
|
end
|
22
22
|
|
23
23
|
["0"].each do |str|
|
24
24
|
it "should not parse '#{str}'" do
|
25
|
-
parser.
|
25
|
+
expect(parser).to_not parse(str)
|
26
26
|
end
|
27
27
|
end
|
28
28
|
end
|
@@ -6,23 +6,23 @@ describe Parsing::PositiveRationalParser do
|
|
6
6
|
["1/2","50/50","050/003","502530/1","01/1"].each do |str|
|
7
7
|
res = parser.parse(str)
|
8
8
|
r = str.to_r
|
9
|
-
|
9
|
+
|
10
10
|
it "should parse '#{str}'" do
|
11
|
-
res.
|
11
|
+
expect(res).to_not be nil
|
12
12
|
end
|
13
13
|
|
14
14
|
it 'should return node that is convertible to rational using #to_r method' do
|
15
|
-
res.to_r.
|
15
|
+
expect(res.to_r).to eq(r)
|
16
16
|
end
|
17
|
-
|
17
|
+
|
18
18
|
it 'should return node that is convertible to rational using #to_num method' do
|
19
|
-
res.to_num.
|
19
|
+
expect(res.to_num).to eq(r)
|
20
20
|
end
|
21
21
|
end
|
22
22
|
|
23
23
|
["0/0","0/10","0000/1"].each do |str|
|
24
24
|
it "should not parse '#{str}'" do
|
25
|
-
parser.
|
25
|
+
expect(parser).to_not parse(str)
|
26
26
|
end
|
27
27
|
end
|
28
28
|
end
|
@@ -2,7 +2,7 @@ require File.expand_path(File.dirname(__FILE__) + '/../../spec_helper')
|
|
2
2
|
|
3
3
|
describe Parsing::PitchNode do
|
4
4
|
parser = Parsing::PitchParser.new
|
5
|
-
|
5
|
+
|
6
6
|
{
|
7
7
|
'C4' => C4,
|
8
8
|
'Db2' => Db2,
|
@@ -19,19 +19,19 @@ describe Parsing::PitchNode do
|
|
19
19
|
res = parser.parse(str)
|
20
20
|
context str do
|
21
21
|
it 'should parse as PitchNode' do
|
22
|
-
res.
|
22
|
+
expect(res).to be_a Parsing::PitchNode
|
23
23
|
end
|
24
|
-
|
24
|
+
|
25
25
|
describe '#to_pitch' do
|
26
26
|
p = res.to_pitch
|
27
27
|
it 'should produce a Pitch object' do
|
28
|
-
p.
|
28
|
+
expect(p).to be_a Pitch
|
29
29
|
end
|
30
|
-
|
30
|
+
|
31
31
|
it 'should produce pitch matching input str' do
|
32
|
-
p.
|
32
|
+
expect(p).to eq tgt
|
33
33
|
end
|
34
34
|
end
|
35
35
|
end
|
36
|
-
end
|
36
|
+
end
|
37
37
|
end
|