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,31 +0,0 @@
1
- module Musicality
2
-
3
- class Part
4
- def pack
5
- packed_notes = notes.map {|n| n.to_s }.join(" ")
6
- packed_dcs = Hash[ dynamic_changes.map do |offset,change|
7
- [ offset, change.pack ]
8
- end ]
9
-
10
- {
11
- 'notes' => packed_notes,
12
- 'start_dynamic' => start_dynamic,
13
- 'dynamic_changes' => packed_dcs
14
- }
15
- end
16
-
17
- def self.unpack packing
18
- unpacked_notes = Note.split_parse(packing["notes"])
19
- unpacked_dcs = Hash[ packing["dynamic_changes"].map do |offset,change|
20
- [ offset,Change.unpack(change) ]
21
- end ]
22
-
23
- new(
24
- packing["start_dynamic"],
25
- notes: unpacked_notes,
26
- dynamic_changes: unpacked_dcs
27
- )
28
- end
29
- end
30
-
31
- end
@@ -1,123 +0,0 @@
1
- module Musicality
2
-
3
- class Score
4
- class Timed < Score
5
- def pack
6
- pack_common
7
- end
8
-
9
- def self.unpack packing
10
- new(**Score.unpack_common(packing))
11
- end
12
- end
13
-
14
- class TempoBased < Score
15
- def pack
16
- pack_common.merge("start_tempo" => @start_tempo,
17
- "tempo_changes" => pack_tempo_changes)
18
- end
19
-
20
- def pack_tempo_changes
21
- Hash[ tempo_changes.map do |offset,change|
22
- [offset,change.pack]
23
- end ]
24
- end
25
-
26
- def self.unpack_tempo_changes packing
27
- Hash[ packing["tempo_changes"].map do |k,v|
28
- [k, Change.unpack(v) ]
29
- end ]
30
- end
31
-
32
- def self.unpack packing
33
- unpacked_tcs = Hash[ packing["tempo_changes"].map do |k,v|
34
- [k, Change.unpack(v) ]
35
- end ]
36
-
37
- Score.unpack_common(packing)
38
- new(packing["start_tempo"],
39
- tempo_changes: unpacked_tcs,
40
- **unpacked)
41
- end
42
- end
43
-
44
- class Unmeasured < TempoBased
45
- def self.unpack packing
46
- new(packing["start_tempo"],
47
- tempo_changes: unpack_tempo_changes(packing),
48
- **Score.unpack_common(packing))
49
- end
50
- end
51
-
52
- class Measured < TempoBased
53
- def pack
54
- return super().merge("start_meter" => pack_start_meter,
55
- "meter_changes" => pack_meter_changes)
56
- end
57
-
58
- def pack_meter_changes
59
- Hash[ meter_changes.map do |off,change|
60
- [off,change.pack(:with => :to_s)]
61
- end ]
62
- end
63
-
64
- def pack_start_meter
65
- start_meter.to_s
66
- end
67
-
68
- def self.unpack_meter_changes packing
69
- Hash[ packing["meter_changes"].map do |off,p|
70
- [off, Change.unpack(p, :with => :to_meter) ]
71
- end ]
72
- end
73
-
74
- def self.unpack_start_meter packing
75
- Meter.parse(packing["start_meter"])
76
- end
77
-
78
- def self.unpack packing
79
- new(unpack_start_meter(packing), packing["start_tempo"],
80
- tempo_changes: unpack_tempo_changes(packing),
81
- meter_changes: unpack_meter_changes(packing),
82
- **Score.unpack_common(packing))
83
- end
84
- end
85
-
86
- def self.unpack packing
87
- type = const_get(packing["type"])
88
- type.unpack(packing)
89
- end
90
-
91
- private
92
-
93
- def pack_common
94
- packed_parts = Hash[
95
- @parts.map do |name,part|
96
- [ name, part.pack ]
97
- end
98
- ]
99
- packed_prog = @program.map {|seg| seg.to_s }
100
-
101
- { "type" => self.class.to_s.split("::")[-1],
102
- "program" => packed_prog,
103
- "parts" => packed_parts,
104
- "title" => @title,
105
- "composer" => @composer
106
- }
107
- end
108
-
109
- def self.unpack_common packing
110
- unpacked_parts = Hash[ packing["parts"].map do |name,packed|
111
- [name, Part.unpack(packed)]
112
- end ]
113
- unpacked_prog = packing["program"].map {|str| Segment.parse(str) }
114
-
115
- { :program => unpacked_prog,
116
- :parts => unpacked_parts,
117
- :title => packing["title"],
118
- :composer => packing["composer"]
119
- }
120
- end
121
- end
122
-
123
- end
@@ -1,19 +0,0 @@
1
- module Musicality
2
-
3
- require 'singleton'
4
- class AccentedAttack
5
- include Singleton
6
-
7
- def accented?; return true; end
8
- end
9
-
10
- class UnaccentedAttack
11
- include Singleton
12
-
13
- def accented?; return false; end
14
- end
15
-
16
- ACCENTED = AccentedAttack.instance
17
- UNACCENTED = UnaccentedAttack.instance
18
-
19
- end
@@ -1,28 +0,0 @@
1
- module Musicality
2
-
3
- class NoteLinker
4
- def self.find_unlinked_pitches note
5
- linked = Set.new(note.pitches) & note.links.keys
6
- (Set.new(note.pitches) - linked).to_a
7
- end
8
-
9
- def self.find_untargeted_pitches note, next_note
10
- linked = Set.new(note.pitches) & note.links.keys
11
- targeted = Set.new(linked.map {|p| note.links[p].target_pitch })
12
- (Set.new(next_note.pitches) - targeted).to_a
13
- end
14
-
15
- def self.figure_links note, next_note
16
- unlinked = find_unlinked_pitches(note)
17
- untargeted = find_untargeted_pitches(note, next_note)
18
- Optimization.linking(unlinked, untargeted)
19
- end
20
-
21
- def self.fully_link note, next_note, link_class
22
- figure_links(note,next_note).each do |pitch,tgt_pitch|
23
- note.links[pitch] = link_class.new(tgt_pitch)
24
- end
25
- end
26
- end
27
-
28
- end
@@ -1,304 +0,0 @@
1
- require File.expand_path(File.dirname(__FILE__) + '/../../spec_helper')
2
-
3
- describe Change::Immediate do
4
- describe '#pack' do
5
- before :all do
6
- @c = Change::Immediate.new(0.5)
7
- @p = @c.pack
8
- end
9
-
10
- it 'should return a Hash' do
11
- @p.should be_a Hash
12
- end
13
-
14
- it 'should have "type" and "end_value" keys' do
15
- @p.should have_key("type")
16
- @p.should have_key("end_value")
17
- end
18
-
19
- it 'should assign "Immediate" to "type" key' do
20
- @p["type"].should eq("Immediate")
21
- end
22
-
23
- it 'should assign end_value to "end_value" key' do
24
- @p["end_value"].should eq(@c.end_value)
25
- end
26
-
27
- context 'given :with method' do
28
- it 'should send the :with method to end_value' do
29
- p = @c.pack(:with => :to_s)
30
- p["end_value"].should be_a String
31
- p["end_value"].to_f.should eq(@c.end_value)
32
- end
33
- end
34
- end
35
- end
36
-
37
- describe Change::Gradual do
38
- describe '#pack' do
39
- before :all do
40
- @c = Change::Gradual.linear(200,2.5)
41
- @p = @c.pack
42
- end
43
-
44
- it 'should return a Hash' do
45
- @p.should be_a Hash
46
- end
47
-
48
- it 'should have "type", "end_value", "duration", "transition", and keys' do
49
- @p.keys.sort.should eq(["duration","end_value","transition","type"])
50
- end
51
-
52
- it 'should assign "Gradual" to "type" key' do
53
- @p["type"].should eq("Gradual")
54
- end
55
-
56
- it 'should assign end_value to "end_value" key' do
57
- @p["end_value"].should eq(@c.end_value)
58
- end
59
-
60
- it 'should assign duration to "duration" key' do
61
- @p["duration"].should eq(@c.duration)
62
- end
63
-
64
- it 'should assign start value to "start_value" key' do
65
- @p["start_value"].should eq(@c.start_value)
66
- end
67
-
68
- it 'should assign transition to "transition" key' do
69
- @p["transition"].should eq(@c.transition)
70
- end
71
-
72
- context 'given :with method' do
73
- it 'should send the :with method to end_value' do
74
- p = @c.pack(:with => :to_s)
75
- p["end_value"].should be_a String
76
- p["end_value"].to_f.should eq(@c.end_value)
77
- end
78
- end
79
-
80
- context 'given start value' do
81
- it 'should assign start_value to "start_value" ' do
82
- c = Change::Gradual.linear(200,2.5,start_value: 20)
83
- p = c.pack
84
- p.should have_key("start_value")
85
- p["start_value"].should eq(c.start_value)
86
- end
87
-
88
- context 'given :with method' do
89
- it 'should send the :with method to end_value' do
90
- c = Change::Gradual.linear(200,2.5,start_value: 20)
91
- p = c.pack(:with => :to_s)
92
- p["start_value"].should be_a String
93
- p["start_value"].to_f.should eq(c.start_value)
94
- end
95
- end
96
- end
97
- end
98
- end
99
-
100
- describe Change::Gradual::Trimmed do
101
- describe '#pack' do
102
- before :all do
103
- @c = Change::Gradual::Trimmed.linear(200,2.5,preceding:1,remaining:0.5)
104
- @p = @c.pack
105
- end
106
-
107
- it 'should return a Hash' do
108
- @p.should be_a Hash
109
- end
110
-
111
- it 'should have "type", "end_value", "duration", "transition", "preceding", "remaining" keys' do
112
- @p.keys.sort.should eq(["duration","end_value","preceding","remaining","transition","type"])
113
- end
114
-
115
- it 'should assign "Gradual::Trimmed" to "type" key' do
116
- @p["type"].should eq("Gradual::Trimmed")
117
- end
118
-
119
- it 'should assign end_value to "end_value" key' do
120
- @p["end_value"].should eq(@c.end_value)
121
- end
122
-
123
- it 'should assign duration to "duration" key' do
124
- @p["duration"].should eq(@c.duration)
125
- end
126
-
127
- it 'should assign transition to "transition" key' do
128
- @p["transition"].should eq(@c.transition)
129
- end
130
-
131
- it 'should assign preceding to "preceding" key' do
132
- @p["preceding"].should eq(@c.preceding)
133
- end
134
-
135
- it 'should assign remaining to "remaining" key' do
136
- @p["remaining"].should eq(@c.remaining)
137
- end
138
-
139
- context 'given :with method' do
140
- it 'should send the :with method to end_value' do
141
- p = @c.pack(:with => :to_s)
142
- p["end_value"].should be_a String
143
- p["end_value"].to_f.should eq(@c.end_value)
144
- end
145
- end
146
-
147
- context 'given start value' do
148
- it 'should assign start_value to "start_value" ' do
149
- c = Change::Gradual.linear(200,2.5,start_value: 20).trim(0.5,0.5)
150
- p = c.pack
151
- p.should have_key("start_value")
152
- p["start_value"].should eq(c.start_value)
153
- end
154
-
155
- context 'given :with method' do
156
- it 'should send the :with method to end_value' do
157
- c = Change::Gradual.linear(200,2.5,start_value: 20).trim(0.5,0.5)
158
- p = c.pack(:with => :to_s)
159
- p["start_value"].should be_a String
160
- p["start_value"].to_f.should eq(c.start_value)
161
- end
162
- end
163
- end
164
- end
165
- end
166
-
167
- describe Change do
168
- describe '.unpack' do
169
- context 'given a packed immediate change' do
170
- before :all do
171
- @c = Change::Immediate.new(0.5)
172
- @a = @c.pack
173
- @c2 = Change.unpack(@a)
174
- end
175
-
176
- it 'should return a Change::Immediate' do
177
- @c2.should be_a Change::Immediate
178
- end
179
-
180
- it 'should successfully unpack the change end_value' do
181
- @c2.end_value.should eq @c.end_value
182
- end
183
-
184
- context 'pack/unpack using :with method' do
185
- it 'should use given :with method to convert end_value' do
186
- c = Change::Immediate.new(0.5)
187
- h = c.pack(:with => :to_s)
188
- c2 = Change.unpack(h)
189
- c2.end_value.should be_a String
190
- c3 = Change.unpack(h, :with => :to_f)
191
- c3.end_value.should be_a Float
192
- end
193
- end
194
- end
195
-
196
- context 'given a packed gradual change' do
197
- before :all do
198
- @c = Change::Gradual.sigmoid(0.3,1.5)
199
- @a = @c.pack
200
- @c2 = Change.unpack(@a)
201
- end
202
-
203
- it 'should return a Change::Gradual' do
204
- @c2.should be_a Change::Gradual
205
- end
206
-
207
- it 'should unpack the end_value' do
208
- @c2.end_value.should eq @c.end_value
209
- end
210
-
211
- it 'should unpack the change duration' do
212
- @c2.duration.should eq @c.duration
213
- end
214
-
215
- it 'should unpack the change transition' do
216
- @c2.transition.should eq @c.transition
217
- end
218
-
219
- it 'should unpack the change start_value' do
220
- @c2.start_value.should eq @c.start_value
221
- end
222
-
223
- context 'pack/unpack using :with method' do
224
- it 'should use given :with method to convert end_value' do
225
- c = Change::Gradual.linear(0.5,2)
226
- h = c.pack(:with => :to_s)
227
- c2 = Change.unpack(h)
228
- c2.end_value.should be_a String
229
- c3 = Change.unpack(h, :with => :to_f)
230
- c3.end_value.should be_a Float
231
- end
232
-
233
- context 'when change start_value is not nil' do
234
- it 'should use given :with method to convert start_value' do
235
- c = Change::Gradual.linear(0.5,2,start_value: 0.1)
236
- h = c.pack(:with => :to_s)
237
- c2 = Change.unpack(h)
238
- c2.start_value.should be_a String
239
- c3 = Change.unpack(h, :with => :to_f)
240
- c3.start_value.should be_a Float
241
- end
242
- end
243
- end
244
- end
245
-
246
- context 'given a packed gradual (trimmed) change' do
247
- before :all do
248
- @c = Change::Gradual::Trimmed.sigmoid(0.3,1.5,preceding:0.1,remaining:0.1)
249
- @a = @c.pack
250
- @c2 = Change.unpack(@a)
251
- end
252
-
253
- it 'should return a Change::Gradual' do
254
- @c2.should be_a Change::Gradual
255
- end
256
-
257
- it 'should successfully unpack the end_value' do
258
- @c2.end_value.should eq @c.end_value
259
- end
260
-
261
- it 'should successfully unpack the change duration' do
262
- @c2.duration.should eq @c.duration
263
- end
264
-
265
- it 'should successfully unpack the change transition' do
266
- @c2.transition.should eq @c.transition
267
- end
268
-
269
- it 'should unpack the change start_value' do
270
- @c2.start_value.should eq @c.start_value
271
- end
272
-
273
- it 'should successfully unpack the change preceding' do
274
- @c2.preceding.should eq @c.preceding
275
- end
276
-
277
- it 'should successfully unpack the change remaining' do
278
- @c2.remaining.should eq @c.remaining
279
- end
280
-
281
- context 'pack/unpack using :with method' do
282
- it 'should use given :with method to convert end_value' do
283
- c = Change::Gradual.linear(0.5,2).trim(0.4,0.3)
284
- h = c.pack(:with => :to_s)
285
- c2 = Change.unpack(h)
286
- c2.end_value.should be_a String
287
- c3 = Change.unpack(h, :with => :to_f)
288
- c3.end_value.should be_a Float
289
- end
290
-
291
- context 'when change start_value is not nil' do
292
- it 'should use given :with method to convert start_value' do
293
- c = Change::Gradual.linear(0.5,2,start_value: 0.1).trim(0.4,0.3)
294
- h = c.pack(:with => :to_s)
295
- c2 = Change.unpack(h)
296
- c2.start_value.should be_a String
297
- c3 = Change.unpack(h, :with => :to_f)
298
- c3.start_value.should be_a Float
299
- end
300
- end
301
- end
302
- end
303
- end
304
- end