musicality 0.8.0 → 0.9.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.
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