musicality 0.8.0 → 0.9.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (146) hide show
  1. checksums.yaml +4 -4
  2. data/ChangeLog.md +27 -1
  3. data/README.md +153 -10
  4. data/bin/collidify +102 -0
  5. data/bin/lilify +57 -29
  6. data/bin/midify +64 -24
  7. data/bin/musicality +39 -0
  8. data/examples/composition/auto_counterpoint.rb +4 -5
  9. data/examples/composition/part_generator.rb +8 -2
  10. data/examples/composition/scale_exercise.rb +1 -1
  11. data/examples/notation/notes.rb +27 -0
  12. data/examples/notation/parts.rb +51 -0
  13. data/examples/notation/scores.rb +38 -0
  14. data/examples/notation/twinkle.rb +34 -0
  15. data/examples/notation/twinkle.score +33 -0
  16. data/lib/musicality.rb +46 -11
  17. data/lib/musicality/composition/dsl/score_dsl.rb +2 -2
  18. data/lib/musicality/composition/dsl/score_methods.rb +10 -7
  19. data/lib/musicality/notation/conversion/change_conversion.rb +1 -1
  20. data/lib/musicality/notation/conversion/note_time_converter.rb +6 -23
  21. data/lib/musicality/notation/conversion/score_conversion.rb +15 -15
  22. data/lib/musicality/notation/conversion/score_converter.rb +50 -67
  23. data/lib/musicality/notation/model/articulations.rb +3 -2
  24. data/lib/musicality/notation/model/change.rb +15 -6
  25. data/lib/musicality/notation/model/dynamics.rb +11 -8
  26. data/lib/musicality/notation/model/instrument.rb +61 -0
  27. data/lib/musicality/notation/model/instruments.rb +111 -0
  28. data/lib/musicality/notation/model/key.rb +137 -0
  29. data/lib/musicality/notation/model/keys.rb +37 -0
  30. data/lib/musicality/notation/model/link.rb +6 -19
  31. data/lib/musicality/notation/model/mark.rb +43 -0
  32. data/lib/musicality/notation/model/marks.rb +11 -0
  33. data/lib/musicality/notation/model/meter.rb +4 -0
  34. data/lib/musicality/notation/model/note.rb +42 -28
  35. data/lib/musicality/notation/model/part.rb +18 -5
  36. data/lib/musicality/notation/model/pitch.rb +13 -4
  37. data/lib/musicality/notation/model/score.rb +104 -66
  38. data/lib/musicality/notation/model/symbols.rb +16 -11
  39. data/lib/musicality/notation/parsing/articulation_parsing.rb +38 -38
  40. data/lib/musicality/notation/parsing/articulation_parsing.treetop +14 -14
  41. data/lib/musicality/notation/parsing/link_parsing.rb +6 -6
  42. data/lib/musicality/notation/parsing/link_parsing.treetop +3 -3
  43. data/lib/musicality/notation/parsing/mark_parsing.rb +138 -0
  44. data/lib/musicality/notation/parsing/mark_parsing.treetop +31 -0
  45. data/lib/musicality/notation/parsing/note_node.rb +19 -12
  46. data/lib/musicality/notation/parsing/note_parsing.rb +218 -87
  47. data/lib/musicality/notation/parsing/note_parsing.treetop +9 -5
  48. data/lib/musicality/notation/parsing/numbers/nonnegative_integer_parsing.rb +7 -2
  49. data/lib/musicality/notation/parsing/numbers/nonnegative_integer_parsing.treetop +1 -1
  50. data/lib/musicality/notation/parsing/numbers/positive_integer_parsing.rb +6 -4
  51. data/lib/musicality/notation/parsing/numbers/positive_integer_parsing.treetop +1 -1
  52. data/lib/musicality/notation/util/function.rb +41 -18
  53. data/lib/musicality/packable.rb +156 -0
  54. data/lib/musicality/performance/conversion/glissando_converter.rb +2 -2
  55. data/lib/musicality/performance/conversion/note_sequence_extractor.rb +223 -70
  56. data/lib/musicality/performance/conversion/portamento_converter.rb +5 -2
  57. data/lib/musicality/performance/conversion/score_collator.rb +70 -64
  58. data/lib/musicality/performance/midi/midi_events.rb +3 -3
  59. data/lib/musicality/performance/midi/midi_settings.rb +127 -0
  60. data/lib/musicality/performance/midi/midi_util.rb +8 -2
  61. data/lib/musicality/performance/midi/part_sequencer.rb +19 -18
  62. data/lib/musicality/performance/midi/score_sequencer.rb +13 -9
  63. data/lib/musicality/performance/midi/score_sequencing.rb +5 -5
  64. data/lib/musicality/performance/model/attack.rb +8 -0
  65. data/lib/musicality/performance/model/duration_functions.rb +23 -0
  66. data/lib/musicality/performance/model/note_sequence.rb +52 -95
  67. data/lib/musicality/performance/model/separation.rb +10 -0
  68. data/lib/musicality/performance/supercollider/add_actions.rb +13 -0
  69. data/lib/musicality/performance/supercollider/bundle.rb +18 -0
  70. data/lib/musicality/performance/supercollider/conductor.rb +125 -0
  71. data/lib/musicality/performance/supercollider/group.rb +71 -0
  72. data/lib/musicality/performance/supercollider/message.rb +26 -0
  73. data/lib/musicality/performance/supercollider/node.rb +122 -0
  74. data/lib/musicality/performance/supercollider/performer.rb +123 -0
  75. data/lib/musicality/performance/supercollider/score_conducting.rb +17 -0
  76. data/lib/musicality/performance/supercollider/server.rb +8 -0
  77. data/lib/musicality/performance/supercollider/synth.rb +43 -0
  78. data/lib/musicality/performance/supercollider/synthdef.rb +57 -0
  79. data/lib/musicality/performance/supercollider/synthdef_settings.rb +23 -0
  80. data/lib/musicality/performance/supercollider/synthdefs.rb +1654 -0
  81. data/lib/musicality/{composition/model/pitch_class.rb → pitch_class.rb} +1 -1
  82. data/lib/musicality/{composition/model/pitch_classes.rb → pitch_classes.rb} +9 -9
  83. data/lib/musicality/printing/lilypond/clef.rb +12 -0
  84. data/lib/musicality/printing/lilypond/key_engraving.rb +9 -0
  85. data/lib/musicality/printing/lilypond/lilypond_settings.rb +105 -0
  86. data/lib/musicality/printing/lilypond/meter_engraving.rb +1 -1
  87. data/lib/musicality/printing/lilypond/note_engraving.rb +112 -30
  88. data/lib/musicality/printing/lilypond/part_engraver.rb +114 -3
  89. data/lib/musicality/printing/lilypond/pitch_class_engraving.rb +22 -0
  90. data/lib/musicality/printing/lilypond/pitch_engraving.rb +2 -15
  91. data/lib/musicality/printing/lilypond/score_engraver.rb +44 -73
  92. data/lib/musicality/printing/lilypond/score_engraving.rb +3 -3
  93. data/lib/musicality/project/create_tasks.rb +31 -0
  94. data/lib/musicality/project/file_cleaner.rb +19 -0
  95. data/lib/musicality/project/file_raker.rb +107 -0
  96. data/lib/musicality/project/load_config.rb +43 -0
  97. data/lib/musicality/project/project.rb +64 -0
  98. data/lib/musicality/version.rb +1 -1
  99. data/musicality.gemspec +3 -0
  100. data/spec/composition/util/random_sampler_spec.rb +1 -1
  101. data/spec/notation/conversion/measure_note_map_spec.rb +1 -1
  102. data/spec/notation/conversion/note_time_converter_spec.rb +5 -85
  103. data/spec/notation/conversion/score_conversion_spec.rb +6 -41
  104. data/spec/notation/conversion/score_converter_spec.rb +19 -137
  105. data/spec/notation/model/change_spec.rb +55 -0
  106. data/spec/notation/model/key_spec.rb +171 -0
  107. data/spec/notation/model/link_spec.rb +34 -5
  108. data/spec/notation/model/meter_spec.rb +15 -0
  109. data/spec/notation/model/note_spec.rb +33 -27
  110. data/spec/notation/model/part_spec.rb +53 -4
  111. data/spec/notation/model/pitch_spec.rb +15 -0
  112. data/spec/notation/model/score_spec.rb +64 -72
  113. data/spec/notation/parsing/link_nodes_spec.rb +3 -3
  114. data/spec/notation/parsing/link_parsing_spec.rb +6 -6
  115. data/spec/notation/parsing/note_node_spec.rb +34 -9
  116. data/spec/notation/parsing/note_parsing_spec.rb +11 -9
  117. data/spec/notation/parsing/numbers/nonnegative_integer_spec.rb +4 -0
  118. data/spec/notation/parsing/pitch_node_spec.rb +0 -1
  119. data/spec/notation/util/value_computer_spec.rb +2 -2
  120. data/spec/performance/conversion/glissando_converter_spec.rb +9 -9
  121. data/spec/performance/conversion/note_sequence_extractor_spec.rb +48 -53
  122. data/spec/performance/conversion/portamento_converter_spec.rb +11 -9
  123. data/spec/performance/conversion/score_collator_spec.rb +59 -63
  124. data/spec/performance/midi/midi_util_spec.rb +22 -8
  125. data/spec/performance/midi/part_sequencer_spec.rb +2 -2
  126. data/spec/performance/midi/score_sequencer_spec.rb +12 -10
  127. data/spec/performance/midi/score_sequencing_spec.rb +2 -2
  128. data/spec/performance/model/note_sequence_spec.rb +41 -134
  129. data/spec/printing/note_engraving_spec.rb +204 -0
  130. data/spec/printing/score_engraver_spec.rb +40 -0
  131. data/spec/spec_helper.rb +1 -0
  132. metadata +69 -23
  133. data/examples/notation/hip.rb +0 -32
  134. data/examples/notation/missed_connection.rb +0 -26
  135. data/examples/notation/song1.rb +0 -33
  136. data/examples/notation/song2.rb +0 -32
  137. data/lib/musicality/notation/model/links.rb +0 -11
  138. data/lib/musicality/notation/packing/change_packing.rb +0 -56
  139. data/lib/musicality/notation/packing/part_packing.rb +0 -31
  140. data/lib/musicality/notation/packing/score_packing.rb +0 -123
  141. data/lib/musicality/performance/model/note_attacks.rb +0 -19
  142. data/lib/musicality/performance/util/note_linker.rb +0 -28
  143. data/spec/notation/packing/change_packing_spec.rb +0 -304
  144. data/spec/notation/packing/part_packing_spec.rb +0 -66
  145. data/spec/notation/packing/score_packing_spec.rb +0 -255
  146. data/spec/performance/util/note_linker_spec.rb +0 -68
@@ -1,3 +1,3 @@
1
1
  module Musicality
2
- VERSION = "0.8.0"
2
+ VERSION = "0.9.0"
3
3
  end
data/musicality.gemspec CHANGED
@@ -28,4 +28,7 @@ Gem::Specification.new do |spec|
28
28
  spec.add_dependency "treetop", "~> 1.5"
29
29
  spec.add_dependency 'midilib', '~> 2.0'
30
30
  spec.add_dependency 'docopt', '~> 0.5'
31
+ spec.add_dependency 'ruby-osc', '~> 0.4'
32
+
33
+ spec.required_ruby_version = '>= 2.0'
31
34
  end
@@ -28,7 +28,7 @@ describe RandomSampler do
28
28
  sampler.values.each_with_index do |val,i|
29
29
  count = counts[val]
30
30
  tgt_prob = sampler.probabilities[i]
31
- (count / 1000.to_f).should be_within(0.05).of(tgt_prob)
31
+ (count / 1000.to_f).should be_within(0.1).of(tgt_prob)
32
32
  end
33
33
  end
34
34
  end
@@ -35,7 +35,7 @@ describe 'Conversion.measure_note_map' do
35
35
  @first_mc_off = 3
36
36
  @start_meter = THREE_FOUR
37
37
  @new_meter = TWO_FOUR
38
- @score = Score::Measured.new(@start_meter, 120,
38
+ @score = Score::Tempo.new(@start_meter, 120,
39
39
  meter_changes: { @first_mc_off => Change::Immediate.new(@new_meter) },
40
40
  tempo_changes: {
41
41
  "1/2".to_r => Change::Gradual.linear(100,1),
@@ -1,92 +1,12 @@
1
1
  require File.expand_path(File.dirname(__FILE__) + '/../../spec_helper')
2
2
 
3
- describe NoteTimeConverter::Unmeasured do
4
- describe '#notes_per_second_at' do
5
- it 'should convert tempo using Tempo::QNPM.to_nps' do
6
- tc = ValueComputer.new(
7
- 120, 1 => Change::Gradual.linear(100,1), 2 => Change::Gradual.linear(150,1))
8
- converter = NoteTimeConverter::Unmeasured.new(tc,200)
9
- (0..2).step(0.2).each do |offset|
10
- nps = Tempo::QNPM.to_nps(tc.at(offset))
11
- converter.notes_per_second_at(offset).should eq(nps)
12
- end
13
- end
14
- end
15
-
16
- describe "#time_elapsed" do
17
- context "constant tempo" do
18
- before :each do
19
- @tempo_computer = ValueComputer.new 120
20
- sample_rate = 48
21
- @converter = NoteTimeConverter::Unmeasured.new(@tempo_computer, sample_rate)
22
- end
23
-
24
- it "should return a time of zero when note end is zero." do
25
- @converter.time_elapsed(0, 0).should eq(0)
26
- end
27
-
28
- it "should return a time of 1 second when note end is equal to the initial notes-per-second" do
29
- note_end = @converter.notes_per_second_at(0)
30
- @converter.time_elapsed(0, note_end).should eq(1)
31
- end
32
- end
33
-
34
- context "linear tempo-change" do
35
- before :each do
36
- @tempo_computer = ValueComputer.new(
37
- 120, 1 => Change::Gradual.linear(60, 1))
38
- sample_rate = 200
39
- @converter = NoteTimeConverter::Unmeasured.new(@tempo_computer, sample_rate)
40
- end
41
-
42
- it "should return a time of zero when note end is zero." do
43
- @converter.time_elapsed(0.0, 0.0).should eq(0.0)
44
- end
45
-
46
- it "should return a time of 3 sec during a 1-note long transition from 120bpm to 60bpm" do
47
- @converter.notes_per_second_at(1.0).should eq(0.5)
48
- @converter.notes_per_second_at(2.0).should eq(0.25)
49
-
50
- @converter.time_elapsed(1.0, 2.0).should be_within(0.05).of(2.77)
51
- end
52
-
53
- end
54
- end
55
-
56
- describe "#note_time_map" do
57
- context "constant tempo" do
58
- before :each do
59
- @tempo_computer = ValueComputer.new 120
60
- sample_rate = 4800
61
- @converter = NoteTimeConverter::Unmeasured.new(
62
- @tempo_computer, sample_rate)
63
- end
64
-
65
- it "should map offset 0.0 to time 0.0" do
66
- map = @converter.note_time_map [0.0]
67
- map[0.0].should eq(0.0)
68
- end
69
-
70
- it "should map offset 0.25 to time 0.5" do
71
- map = @converter.note_time_map [0.0, 0.25]
72
- map[0.25].should be_within(0.01).of(0.5)
73
- end
74
-
75
- it "should map offset 1.0 to time 2.0" do
76
- map = @converter.note_time_map [0.0, 1.0]
77
- map[1.0].should be_within(0.01).of(2.0)
78
- end
79
- end
80
- end
81
- end
82
-
83
- describe NoteTimeConverter::Measured do
3
+ describe NoteTimeConverter::Tempo do
84
4
  describe '#notes_per_second_at' do
85
5
  it 'should convert tempo using Tempo::BPM.to_nps' do
86
6
  tc = ValueComputer.new(120, 1 => Change::Gradual.linear(100,1),
87
7
  2 => Change::Gradual.linear(150,1))
88
8
  bdc = ValueComputer.new(0.25.to_r, 2.5 => Change::Immediate.new(0.375.to_r))
89
- converter = NoteTimeConverter::Measured.new(tc,bdc,200)
9
+ converter = NoteTimeConverter.new(tc,bdc,200)
90
10
  (0..3.2).step(0.2).each do |offset|
91
11
  nps = Tempo::BPM.to_nps(tc.at(offset), bdc.at(offset))
92
12
  converter.notes_per_second_at(offset).should eq(nps)
@@ -100,7 +20,7 @@ describe NoteTimeConverter::Measured do
100
20
  @tempo_computer = ValueComputer.new 120
101
21
  @bdur_computer = ValueComputer.new Rational(1,4)
102
22
  sample_rate = 48
103
- @converter = NoteTimeConverter::Measured.new(@tempo_computer, @bdur_computer, sample_rate)
23
+ @converter = NoteTimeConverter.new(@tempo_computer, @bdur_computer, sample_rate)
104
24
  end
105
25
 
106
26
  it "should return a time of zero when note end is zero." do
@@ -118,7 +38,7 @@ describe NoteTimeConverter::Measured do
118
38
  @tempo_computer = ValueComputer.new(120, 1 => Change::Gradual.linear(60, 1))
119
39
  @bdur_computer = ValueComputer.new Rational(1,4)
120
40
  sample_rate = 200
121
- @converter = NoteTimeConverter::Measured.new(@tempo_computer, @bdur_computer, sample_rate)
41
+ @converter = NoteTimeConverter.new(@tempo_computer, @bdur_computer, sample_rate)
122
42
  end
123
43
 
124
44
  it "should return a time of zero when note end is zero." do
@@ -141,7 +61,7 @@ describe NoteTimeConverter::Measured do
141
61
  @tempo_computer = ValueComputer.new 120
142
62
  @bdur_computer = ValueComputer.new Rational(1,4)
143
63
  sample_rate = 4800
144
- @converter = NoteTimeConverter::Measured.new(@tempo_computer, @bdur_computer, sample_rate)
64
+ @converter = NoteTimeConverter.new(@tempo_computer, @bdur_computer, sample_rate)
145
65
  end
146
66
 
147
67
  it "should map offset 0.0 to time 0.0" do
@@ -1,6 +1,6 @@
1
1
  require File.expand_path(File.dirname(__FILE__) + '/../../spec_helper')
2
2
 
3
- describe Score::Measured do
3
+ describe Score::Tempo do
4
4
  before :all do
5
5
  @parts = {
6
6
  "piano" => Part.new(Dynamics::MP,
@@ -23,7 +23,7 @@ describe Score::Measured do
23
23
  1 => Change::Immediate.new(TWO_FOUR),
24
24
  3 => Change::Immediate.new(SIX_EIGHT)
25
25
  }
26
- @score = Score::Measured.new(THREE_FOUR, 120,
26
+ @score = Score::Tempo.new(THREE_FOUR, 120,
27
27
  parts: @parts,
28
28
  program: @prog,
29
29
  tempo_changes: tcs,
@@ -94,7 +94,7 @@ describe Score::Measured do
94
94
  context 'meter change at offset 0' do
95
95
  before :all do
96
96
  @change = Change::Immediate.new(THREE_FOUR)
97
- @score2 = Score::Measured.new(FOUR_FOUR, 120, meter_changes: { 0 => @change })
97
+ @score2 = Score::Tempo.new(FOUR_FOUR, 120, meter_changes: { 0 => @change })
98
98
  @mdurs2 = @score2.measure_durations
99
99
  end
100
100
 
@@ -113,7 +113,7 @@ describe Score::Measured do
113
113
 
114
114
  context 'no meter changes' do
115
115
  before :all do
116
- @score3 = Score::Measured.new(FOUR_FOUR, 120)
116
+ @score3 = Score::Tempo.new(FOUR_FOUR, 120)
117
117
  @mdurs3 = @score3.measure_durations
118
118
  end
119
119
 
@@ -132,45 +132,10 @@ describe Score::Measured do
132
132
  end
133
133
 
134
134
  describe '#to_timed' do
135
- it 'should use ScoreConverter::Measured#convert_score' do
135
+ it 'should use ScoreConverter#convert_score' do
136
136
  nscore1 = @score.to_timed(200)
137
- nscore2 = ScoreConverter::Measured.new(@score,200).convert_score
137
+ nscore2 = ScoreConverter.new(@score,200).convert_score
138
138
  nscore1.should eq(nscore2)
139
139
  end
140
140
  end
141
141
  end
142
-
143
- describe Score::Unmeasured do
144
- before :all do
145
- @parts = {
146
- "piano" => Part.new(Dynamics::MP,
147
- notes: [Note.quarter(C4), Note.eighth(F3), Note.whole(C4), Note.half(D4)]*12,
148
- dynamic_changes: {
149
- 1 => Change::Immediate.new(Dynamics::MF),
150
- 5 => Change::Immediate.new(Dynamics::FF),
151
- 6 => Change::Gradual.linear(Dynamics::MF,2),
152
- 14 => Change::Immediate.new(Dynamics::PP),
153
- }
154
- )
155
- }
156
- @prog = [0...3,4...7,1...20,17..."45/2".to_r]
157
- tcs = {
158
- 0 => Change::Immediate.new(120),
159
- 4 => Change::Gradual.linear(60,2),
160
- 11 => Change::Immediate.new(110)
161
- }
162
- @score = Score::Unmeasured.new(120,
163
- parts: @parts,
164
- program: @prog,
165
- tempo_changes: tcs,
166
- )
167
- end
168
-
169
- describe '#to_timed' do
170
- it 'should use ScoreConverter::Unmeasured#convert_score' do
171
- nscore1 = @score.to_timed(200)
172
- nscore2 = ScoreConverter::Unmeasured.new(@score,200).convert_score
173
- nscore1.should eq(nscore2)
174
- end
175
- end
176
- end
@@ -1,15 +1,11 @@
1
1
  require File.expand_path(File.dirname(__FILE__) + '/../../spec_helper')
2
2
 
3
- describe ScoreConverter::TempoBased do
4
-
5
- end
6
-
7
- describe ScoreConverter::Measured do
3
+ describe ScoreConverter do
8
4
  describe '#initialize' do
9
5
  context 'current score is invalid' do
10
6
  it 'should raise NotValidError' do
11
- score = Score::Measured.new(1, 120)
12
- expect { ScoreConverter::Measured.new(score,200) }.to raise_error(NotValidError)
7
+ score = Score::Tempo.new(1, 120)
8
+ expect { ScoreConverter.new(score,200) }.to raise_error(NotValidError)
13
9
  end
14
10
  end
15
11
  end
@@ -18,19 +14,19 @@ describe ScoreConverter::Measured do
18
14
  before :each do
19
15
  @changeA = Change::Immediate.new(Dynamics::PP)
20
16
  @changeB = Change::Gradual.linear(Dynamics::F, 2)
21
- @score = Score::Measured.new(FOUR_FOUR, 120,
17
+ @score = Score::Tempo.new(FOUR_FOUR, 120,
22
18
  parts: {"simple" => Part.new(Dynamics::MP, dynamic_changes: { 1 => @changeA, 3 => @changeB })}
23
19
  )
24
20
  end
25
21
 
26
22
  it 'should return Hash with original part names' do
27
- parts = ScoreConverter::Measured.new(@score,200).convert_parts
23
+ parts = ScoreConverter.new(@score,200).convert_parts
28
24
  parts.should be_a Hash
29
25
  parts.keys.sort.should eq(@score.parts.keys.sort)
30
26
  end
31
27
 
32
28
  it 'should convert part dynamic change offsets from measure-based to note-based' do
33
- parts = ScoreConverter::Measured.new(@score,200).convert_parts
29
+ parts = ScoreConverter.new(@score,200).convert_parts
34
30
  parts.should have_key("simple")
35
31
  part = parts["simple"]
36
32
  part.dynamic_changes.keys.sort.should eq([2,6])
@@ -41,7 +37,7 @@ describe ScoreConverter::Measured do
41
37
  change.duration.should eq(4)
42
38
 
43
39
  #@score.start_meter = THREE_FOUR
44
- #parts = ScoreConverter::Measured.new(@score,200).convert_parts
40
+ #parts = ScoreConverter.new(@score,200).convert_parts
45
41
  #parts.should have_key("simple")
46
42
  #part = parts["simple"]
47
43
  #part.dynamic_changes.keys.sort.should eq([Rational(3,4),Rational(9,4)])
@@ -55,13 +51,13 @@ describe ScoreConverter::Measured do
55
51
 
56
52
  #context 'gradual changes with positive elapsed and/or remaining' do
57
53
  # it 'should change elapsed and remaining so they reflect note-based offsets' do
58
- # score = Score::Measured.new(THREE_FOUR,120, parts: {
54
+ # score = Score::Tempo.new(THREE_FOUR,120, parts: {
59
55
  # "abc" => Part.new(Dynamics::P, dynamic_changes: {
60
56
  # 2 => Change::Gradual.linear(Dynamics::F,2,1,3),
61
57
  # 7 => Change::Gradual.linear(Dynamics::F,1,4,5)
62
58
  # })
63
59
  # })
64
- # converter = ScoreConverter::Measured.new(score)
60
+ # converter = ScoreConverter.new(score)
65
61
  # parts = converter.convert_parts
66
62
  # dcs = parts["abc"].dynamic_changes
67
63
  #
@@ -75,8 +71,8 @@ describe ScoreConverter::Measured do
75
71
  describe '#convert_program' do
76
72
  before :each do
77
73
  @prog = [0...4,2...5]
78
- @score = Score::Measured.new(FOUR_FOUR, 120, program: @prog)
79
- @converter = ScoreConverter::Measured.new(@score,200)
74
+ @score = Score::Tempo.new(FOUR_FOUR, 120, program: @prog)
75
+ @converter = ScoreConverter.new(@score,200)
80
76
  end
81
77
 
82
78
  it 'shuld return array with same size' do
@@ -86,7 +82,7 @@ describe ScoreConverter::Measured do
86
82
  end
87
83
 
88
84
  it 'should convert program segments offsets from measure-based to note-based' do
89
- prog = ScoreConverter::Measured.new(@score,200).convert_program
85
+ prog = ScoreConverter.new(@score,200).convert_program
90
86
  prog.size.should eq(2)
91
87
  prog[0].first.should eq(0)
92
88
  prog[0].last.should eq(8)
@@ -94,7 +90,7 @@ describe ScoreConverter::Measured do
94
90
  prog[1].last.should eq(10)
95
91
 
96
92
  @score.start_meter = THREE_FOUR
97
- prog = ScoreConverter::Measured.new(@score,200).convert_program
93
+ prog = ScoreConverter.new(@score,200).convert_program
98
94
  prog.size.should eq(2)
99
95
  prog[0].first.should eq(0)
100
96
  prog[0].last.should eq(6)
@@ -105,15 +101,15 @@ describe ScoreConverter::Measured do
105
101
 
106
102
  describe '#convert_score' do
107
103
  it 'should return a timed score' do
108
- score = Score::Measured.new(FOUR_FOUR, 120)
109
- converter = ScoreConverter::Measured.new(score,200)
104
+ score = Score::Tempo.new(FOUR_FOUR, 120)
105
+ converter = ScoreConverter.new(score,200)
110
106
  converter.convert_score.should be_a Score::Timed
111
107
  end
112
108
 
113
109
  it 'should use output from convert_program' do
114
110
  prog =[0...4,2...5]
115
- score = Score::Measured.new(FOUR_FOUR, 120, program: prog)
116
- converter = ScoreConverter::Measured.new(score,200)
111
+ score = Score::Tempo.new(FOUR_FOUR, 120, program: prog)
112
+ converter = ScoreConverter.new(score,200)
117
113
  nscore = converter.convert_score
118
114
  nscore.program.should eq(converter.convert_program)
119
115
  end
@@ -121,126 +117,12 @@ describe ScoreConverter::Measured do
121
117
  it 'should use output from convert_parts' do
122
118
  changeA = Change::Immediate.new(Dynamics::PP)
123
119
  changeB = Change::Gradual.linear(Dynamics::F, 2)
124
- score = Score::Measured.new(FOUR_FOUR, 120,
120
+ score = Score::Tempo.new(FOUR_FOUR, 120,
125
121
  parts: {"simple" => Part.new(Dynamics::MP, dynamic_changes: { 1 => changeA, 3 => changeB })}
126
122
  )
127
- converter = ScoreConverter::Measured.new(score,200)
123
+ converter = ScoreConverter.new(score,200)
128
124
  nscore = converter.convert_score
129
125
  nscore.parts.should eq(converter.convert_parts)
130
126
  end
131
127
  end
132
128
  end
133
-
134
- describe ScoreConverter::Unmeasured do
135
- describe '#initialize' do
136
- context 'current score is invalid' do
137
- it 'should raise NotValidError' do
138
- score = Score::Unmeasured.new(-1)
139
- expect { ScoreConverter::Unmeasured.new(score,200) }.to raise_error(NotValidError)
140
- end
141
- end
142
- end
143
-
144
- describe '#convert_parts' do
145
- before :each do
146
- @changeA = Change::Immediate.new(Dynamics::PP)
147
- @changeB = Change::Gradual.linear(Dynamics::F, 2)
148
- @score = Score::Unmeasured.new(120,
149
- parts: {
150
- "normal" => Part.new(Dynamics::MP,
151
- dynamic_changes: { 1 => @changeA, 3 => @changeB },
152
- notes: "/4C2 /8D2 /8E2 /2C2".to_notes * 4),
153
- "empty" => Part.new(Dynamics::PP)
154
- }
155
- )
156
- @parts = ScoreConverter::Unmeasured.new(@score,200).convert_parts
157
- end
158
-
159
- it 'should return Hash with original part names' do
160
- @parts.should be_a Hash
161
- @parts.keys.sort.should eq(@score.parts.keys.sort)
162
- end
163
-
164
- it 'should convert part dynamic change offsets from note-based to time-based' do
165
- part = @parts["normal"]
166
- part.dynamic_changes.keys.sort.should eq([2,6])
167
- change = part.dynamic_changes[2.0]
168
- change.end_value.should eq(@changeA.end_value)
169
- change = part.dynamic_changes[6.0]
170
- change.end_value.should eq(@changeB.end_value)
171
- change.duration.should eq(4.0)
172
- end
173
-
174
- it 'should convert note durations to time durations' do
175
- part = @parts["normal"]
176
- part.notes.map {|x| x.duration }.should eq([0.5,0.25,0.25,1]*4)
177
- end
178
-
179
- context 'trimmed, gradual changes' do
180
- it 'should change preceding and remaining so they reflect time-based duration' do
181
- score = Score::Unmeasured.new(120, parts: {
182
- "abc" => Part.new(Dynamics::P, dynamic_changes: {
183
- 2 => Change::Gradual.linear(Dynamics::F,4).to_trimmed(2,1),
184
- 7 => Change::Gradual.linear(Dynamics::F,5).to_trimmed(1,3)
185
- })
186
- })
187
- converter = ScoreConverter::Unmeasured.new(score,200)
188
- parts = converter.convert_parts
189
- dcs = parts["abc"].dynamic_changes
190
-
191
- dcs.keys.should eq([4,14])
192
- dcs[4.0].should eq(Change::Gradual.linear(Dynamics::F,8).to_trimmed(4,2))
193
- dcs[14.0].should eq(Change::Gradual.linear(Dynamics::F,10).to_trimmed(2,6))
194
- end
195
- end
196
- end
197
-
198
- describe '#convert_program' do
199
- before :each do
200
- @prog = [0...4,2...5]
201
- @score = Score::Unmeasured.new(120, program: @prog)
202
- @converter = ScoreConverter::Unmeasured.new(@score,200)
203
- @prog2 = @converter.convert_program
204
- end
205
-
206
- it 'should return array with same size' do
207
- @prog2.should be_a Array
208
- @prog2.size.should eq(@prog.size)
209
- end
210
-
211
- it 'should convert program segments offsets from note-based to time-based' do
212
- prog = @prog2
213
- prog[0].first.should eq(0)
214
- prog[0].last.should eq(8)
215
- prog[1].first.should eq(4)
216
- prog[1].last.should eq(10)
217
- end
218
- end
219
-
220
- describe '#convert_score' do
221
- it 'should return an timed score' do
222
- score = Score::Unmeasured.new(120)
223
- converter = ScoreConverter::Unmeasured.new(score,200)
224
- converter.convert_score.should be_a Score::Timed
225
- end
226
-
227
- it 'should use output from convert_program' do
228
- prog = [0...4,2...5]
229
- score = Score::Unmeasured.new(120, program: prog)
230
- converter = ScoreConverter::Unmeasured.new(score,200)
231
- nscore = converter.convert_score
232
- nscore.program.should eq(converter.convert_program)
233
- end
234
-
235
- it 'should use output from convert_parts' do
236
- changeA = Change::Immediate.new(Dynamics::PP)
237
- changeB = Change::Gradual.linear(Dynamics::F, 2)
238
- score = Score::Unmeasured.new(120,
239
- parts: {"simple" => Part.new(Dynamics::MP, dynamic_changes: { 1 => changeA, 3 => changeB })}
240
- )
241
- converter = ScoreConverter::Unmeasured.new(score,200)
242
- nscore = converter.convert_score
243
- nscore.parts.should eq(converter.convert_parts)
244
- end
245
- end
246
- end