musicality 0.8.0 → 0.9.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/ChangeLog.md +27 -1
- data/README.md +153 -10
- data/bin/collidify +102 -0
- data/bin/lilify +57 -29
- data/bin/midify +64 -24
- data/bin/musicality +39 -0
- data/examples/composition/auto_counterpoint.rb +4 -5
- data/examples/composition/part_generator.rb +8 -2
- data/examples/composition/scale_exercise.rb +1 -1
- data/examples/notation/notes.rb +27 -0
- data/examples/notation/parts.rb +51 -0
- data/examples/notation/scores.rb +38 -0
- data/examples/notation/twinkle.rb +34 -0
- data/examples/notation/twinkle.score +33 -0
- data/lib/musicality.rb +46 -11
- data/lib/musicality/composition/dsl/score_dsl.rb +2 -2
- data/lib/musicality/composition/dsl/score_methods.rb +10 -7
- data/lib/musicality/notation/conversion/change_conversion.rb +1 -1
- data/lib/musicality/notation/conversion/note_time_converter.rb +6 -23
- data/lib/musicality/notation/conversion/score_conversion.rb +15 -15
- data/lib/musicality/notation/conversion/score_converter.rb +50 -67
- data/lib/musicality/notation/model/articulations.rb +3 -2
- data/lib/musicality/notation/model/change.rb +15 -6
- data/lib/musicality/notation/model/dynamics.rb +11 -8
- data/lib/musicality/notation/model/instrument.rb +61 -0
- data/lib/musicality/notation/model/instruments.rb +111 -0
- data/lib/musicality/notation/model/key.rb +137 -0
- data/lib/musicality/notation/model/keys.rb +37 -0
- data/lib/musicality/notation/model/link.rb +6 -19
- data/lib/musicality/notation/model/mark.rb +43 -0
- data/lib/musicality/notation/model/marks.rb +11 -0
- data/lib/musicality/notation/model/meter.rb +4 -0
- data/lib/musicality/notation/model/note.rb +42 -28
- data/lib/musicality/notation/model/part.rb +18 -5
- data/lib/musicality/notation/model/pitch.rb +13 -4
- data/lib/musicality/notation/model/score.rb +104 -66
- data/lib/musicality/notation/model/symbols.rb +16 -11
- data/lib/musicality/notation/parsing/articulation_parsing.rb +38 -38
- data/lib/musicality/notation/parsing/articulation_parsing.treetop +14 -14
- data/lib/musicality/notation/parsing/link_parsing.rb +6 -6
- data/lib/musicality/notation/parsing/link_parsing.treetop +3 -3
- data/lib/musicality/notation/parsing/mark_parsing.rb +138 -0
- data/lib/musicality/notation/parsing/mark_parsing.treetop +31 -0
- data/lib/musicality/notation/parsing/note_node.rb +19 -12
- data/lib/musicality/notation/parsing/note_parsing.rb +218 -87
- data/lib/musicality/notation/parsing/note_parsing.treetop +9 -5
- data/lib/musicality/notation/parsing/numbers/nonnegative_integer_parsing.rb +7 -2
- data/lib/musicality/notation/parsing/numbers/nonnegative_integer_parsing.treetop +1 -1
- data/lib/musicality/notation/parsing/numbers/positive_integer_parsing.rb +6 -4
- data/lib/musicality/notation/parsing/numbers/positive_integer_parsing.treetop +1 -1
- data/lib/musicality/notation/util/function.rb +41 -18
- data/lib/musicality/packable.rb +156 -0
- data/lib/musicality/performance/conversion/glissando_converter.rb +2 -2
- data/lib/musicality/performance/conversion/note_sequence_extractor.rb +223 -70
- data/lib/musicality/performance/conversion/portamento_converter.rb +5 -2
- data/lib/musicality/performance/conversion/score_collator.rb +70 -64
- data/lib/musicality/performance/midi/midi_events.rb +3 -3
- data/lib/musicality/performance/midi/midi_settings.rb +127 -0
- data/lib/musicality/performance/midi/midi_util.rb +8 -2
- data/lib/musicality/performance/midi/part_sequencer.rb +19 -18
- data/lib/musicality/performance/midi/score_sequencer.rb +13 -9
- data/lib/musicality/performance/midi/score_sequencing.rb +5 -5
- data/lib/musicality/performance/model/attack.rb +8 -0
- data/lib/musicality/performance/model/duration_functions.rb +23 -0
- data/lib/musicality/performance/model/note_sequence.rb +52 -95
- data/lib/musicality/performance/model/separation.rb +10 -0
- data/lib/musicality/performance/supercollider/add_actions.rb +13 -0
- data/lib/musicality/performance/supercollider/bundle.rb +18 -0
- data/lib/musicality/performance/supercollider/conductor.rb +125 -0
- data/lib/musicality/performance/supercollider/group.rb +71 -0
- data/lib/musicality/performance/supercollider/message.rb +26 -0
- data/lib/musicality/performance/supercollider/node.rb +122 -0
- data/lib/musicality/performance/supercollider/performer.rb +123 -0
- data/lib/musicality/performance/supercollider/score_conducting.rb +17 -0
- data/lib/musicality/performance/supercollider/server.rb +8 -0
- data/lib/musicality/performance/supercollider/synth.rb +43 -0
- data/lib/musicality/performance/supercollider/synthdef.rb +57 -0
- data/lib/musicality/performance/supercollider/synthdef_settings.rb +23 -0
- data/lib/musicality/performance/supercollider/synthdefs.rb +1654 -0
- data/lib/musicality/{composition/model/pitch_class.rb → pitch_class.rb} +1 -1
- data/lib/musicality/{composition/model/pitch_classes.rb → pitch_classes.rb} +9 -9
- data/lib/musicality/printing/lilypond/clef.rb +12 -0
- data/lib/musicality/printing/lilypond/key_engraving.rb +9 -0
- data/lib/musicality/printing/lilypond/lilypond_settings.rb +105 -0
- data/lib/musicality/printing/lilypond/meter_engraving.rb +1 -1
- data/lib/musicality/printing/lilypond/note_engraving.rb +112 -30
- data/lib/musicality/printing/lilypond/part_engraver.rb +114 -3
- data/lib/musicality/printing/lilypond/pitch_class_engraving.rb +22 -0
- data/lib/musicality/printing/lilypond/pitch_engraving.rb +2 -15
- data/lib/musicality/printing/lilypond/score_engraver.rb +44 -73
- data/lib/musicality/printing/lilypond/score_engraving.rb +3 -3
- data/lib/musicality/project/create_tasks.rb +31 -0
- data/lib/musicality/project/file_cleaner.rb +19 -0
- data/lib/musicality/project/file_raker.rb +107 -0
- data/lib/musicality/project/load_config.rb +43 -0
- data/lib/musicality/project/project.rb +64 -0
- data/lib/musicality/version.rb +1 -1
- data/musicality.gemspec +3 -0
- data/spec/composition/util/random_sampler_spec.rb +1 -1
- data/spec/notation/conversion/measure_note_map_spec.rb +1 -1
- data/spec/notation/conversion/note_time_converter_spec.rb +5 -85
- data/spec/notation/conversion/score_conversion_spec.rb +6 -41
- data/spec/notation/conversion/score_converter_spec.rb +19 -137
- data/spec/notation/model/change_spec.rb +55 -0
- data/spec/notation/model/key_spec.rb +171 -0
- data/spec/notation/model/link_spec.rb +34 -5
- data/spec/notation/model/meter_spec.rb +15 -0
- data/spec/notation/model/note_spec.rb +33 -27
- data/spec/notation/model/part_spec.rb +53 -4
- data/spec/notation/model/pitch_spec.rb +15 -0
- data/spec/notation/model/score_spec.rb +64 -72
- data/spec/notation/parsing/link_nodes_spec.rb +3 -3
- data/spec/notation/parsing/link_parsing_spec.rb +6 -6
- data/spec/notation/parsing/note_node_spec.rb +34 -9
- data/spec/notation/parsing/note_parsing_spec.rb +11 -9
- data/spec/notation/parsing/numbers/nonnegative_integer_spec.rb +4 -0
- data/spec/notation/parsing/pitch_node_spec.rb +0 -1
- data/spec/notation/util/value_computer_spec.rb +2 -2
- data/spec/performance/conversion/glissando_converter_spec.rb +9 -9
- data/spec/performance/conversion/note_sequence_extractor_spec.rb +48 -53
- data/spec/performance/conversion/portamento_converter_spec.rb +11 -9
- data/spec/performance/conversion/score_collator_spec.rb +59 -63
- data/spec/performance/midi/midi_util_spec.rb +22 -8
- data/spec/performance/midi/part_sequencer_spec.rb +2 -2
- data/spec/performance/midi/score_sequencer_spec.rb +12 -10
- data/spec/performance/midi/score_sequencing_spec.rb +2 -2
- data/spec/performance/model/note_sequence_spec.rb +41 -134
- data/spec/printing/note_engraving_spec.rb +204 -0
- data/spec/printing/score_engraver_spec.rb +40 -0
- data/spec/spec_helper.rb +1 -0
- metadata +69 -23
- data/examples/notation/hip.rb +0 -32
- data/examples/notation/missed_connection.rb +0 -26
- data/examples/notation/song1.rb +0 -33
- data/examples/notation/song2.rb +0 -32
- data/lib/musicality/notation/model/links.rb +0 -11
- data/lib/musicality/notation/packing/change_packing.rb +0 -56
- data/lib/musicality/notation/packing/part_packing.rb +0 -31
- data/lib/musicality/notation/packing/score_packing.rb +0 -123
- data/lib/musicality/performance/model/note_attacks.rb +0 -19
- data/lib/musicality/performance/util/note_linker.rb +0 -28
- data/spec/notation/packing/change_packing_spec.rb +0 -304
- data/spec/notation/packing/part_packing_spec.rb +0 -66
- data/spec/notation/packing/score_packing_spec.rb +0 -255
- 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
|