flame_channel_parser 3.0.0 → 4.0.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.
- data/.travis.yml +4 -0
- data/Gemfile +10 -0
- data/History.txt +5 -0
- data/README.rdoc +4 -2
- data/Rakefile +23 -10
- data/bin/{bake_flame_timewarp → framecurve_from_flame} +5 -1
- data/bin/framecurve_to_flame +22 -0
- data/flame_channel_parser.gemspec +130 -0
- data/lib/builder.rb +86 -0
- data/lib/flame_channel_parser.rb +31 -4
- data/lib/framecurve_writers/base.rb +49 -0
- data/lib/framecurve_writers/batch_timewarp.rb +41 -0
- data/lib/framecurve_writers/kronos.rb +23 -0
- data/lib/framecurve_writers/softfx_timewarp.rb +82 -0
- data/lib/framecurve_writers/templates/BatchTW.xml +118 -0
- data/lib/framecurve_writers/templates/SampleKronos.F_Kronos +376 -0
- data/lib/framecurve_writers/templates/TW_Sample.timewarp +79 -0
- data/lib/framecurve_writers/templates/key.xml +10 -0
- data/lib/timewarp_extractor.rb +18 -2
- data/lib/xml_parser.rb +90 -0
- data/test/helper.rb +18 -0
- data/test/snaps/BatchTimewar_proper.xml +157 -0
- data/test/snaps/BatchTimewarp_ext1.timewarp_node +1 -0
- data/test/test_base_timewarp_writer.rb +22 -0
- data/test/test_batch_timewarp_writer.rb +18 -0
- data/test/test_channel.rb +1 -2
- data/test/test_cli.rb +14 -13
- data/test/test_cli_framecurve_to_flame.rb +45 -0
- data/test/test_cli_timewarp_extractor.rb +19 -9
- data/test/test_extractor.rb +1 -3
- data/test/test_flame_builder.rb +68 -0
- data/test/test_flame_channel_parser.rb +2 -2
- data/test/test_interpolator.rb +15 -5
- data/test/test_key.rb +2 -2
- data/test/test_kronos_timewarp_writer.rb +16 -0
- data/test/test_segments.rb +1 -2
- data/test/test_softfx_timewarp_writer.rb +16 -0
- data/test/test_timewarp_extractor.rb +2 -4
- data/test/test_xml_setup.rb +37 -0
- data/test/timewarp_examples/TW_16_010_v01.output.txt +430 -428
- data/test/timewarp_examples/simple.framecurve.txt +32 -0
- data/test/timewarp_export_samples/BatchTW.timewarp_node +145 -0
- data/test/timewarp_export_samples/Kronos.F_Kronos +403 -0
- data/test/timewarp_export_samples/SoftFX.timewarp +81 -0
- metadata +127 -168
- data/.gemtest +0 -0
- data/Manifest.txt +0 -52
data/test/test_cli.rb
CHANGED
@@ -1,13 +1,11 @@
|
|
1
|
-
require "
|
2
|
-
require "stringio"
|
3
|
-
require "tempfile"
|
4
|
-
require "cli_test"
|
1
|
+
require "helper"
|
5
2
|
|
6
3
|
class TestCli < Test::Unit::TestCase
|
7
4
|
|
8
5
|
def setup
|
9
6
|
binary = File.expand_path(File.dirname(__FILE__) + "/../bin/bake_flame_channel")
|
10
7
|
@app = CLITest.new(binary)
|
8
|
+
assert_not_nil @app
|
11
9
|
end
|
12
10
|
|
13
11
|
def test_cli_with_no_args_produces_usage
|
@@ -39,20 +37,23 @@ class TestCli < Test::Unit::TestCase
|
|
39
37
|
|
40
38
|
def test_cli_with_curve_limits
|
41
39
|
full_path = File.expand_path(File.dirname(__FILE__)) + "/snaps/TW_015_010_v03.timewarp"
|
40
|
+
|
42
41
|
status, output, e = @app.run(" --keyframed-range-only " + full_path)
|
43
42
|
assert_equal 0, status
|
44
43
|
assert_equal 531, output.split("\n").length, "Should have output 513 frames"
|
45
44
|
end
|
46
45
|
|
47
46
|
def test_cli_with_output_to_file
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
|
56
|
-
|
47
|
+
begin
|
48
|
+
tf = Tempfile.new("experiment")
|
49
|
+
full_path = File.expand_path(File.dirname(__FILE__)) + "/snaps/TW.timewarp"
|
50
|
+
status, output, e = @app.run(" --to-file " + tf.path + " " + full_path)
|
51
|
+
|
52
|
+
assert_equal 0, status
|
53
|
+
assert_equal 0, output.length
|
54
|
+
assert_equal 747, File.read(tf.path).split("\n").length, "Should have output 816 frames"
|
55
|
+
ensure
|
56
|
+
tf.close!
|
57
|
+
end
|
57
58
|
end
|
58
59
|
end
|
@@ -0,0 +1,45 @@
|
|
1
|
+
require "helper"
|
2
|
+
require "set"
|
3
|
+
|
4
|
+
class TestCliFramecurveToFlame < Test::Unit::TestCase
|
5
|
+
|
6
|
+
BINARY = File.expand_path(File.dirname(__FILE__) + "/../bin/framecurve_to_flame")
|
7
|
+
FC_PATH = File.expand_path(File.dirname(__FILE__)) + "/timewarp_examples/simple.framecurve.txt"
|
8
|
+
RESULTS = %w(
|
9
|
+
simple.framecurve.txt.F_Kronos
|
10
|
+
simple.framecurve.txt.timewarp
|
11
|
+
simple.framecurve.txt.timewarp_node
|
12
|
+
)
|
13
|
+
|
14
|
+
# Run the binary under test with passed options, and return [exit_code, stdout_content, stderr_content]
|
15
|
+
def cli(commandline_arguments)
|
16
|
+
CLITest.new(BINARY).run(commandline_arguments)
|
17
|
+
end
|
18
|
+
|
19
|
+
def teardown
|
20
|
+
Dir.glob(FC_PATH + ".*").each do | export |
|
21
|
+
File.unlink(export)
|
22
|
+
end
|
23
|
+
end
|
24
|
+
|
25
|
+
def test_cli_with_no_args_produces_usage
|
26
|
+
status, o, e = cli('')
|
27
|
+
assert_equal(1, status)
|
28
|
+
assert_match( /No input file path provided/, e)
|
29
|
+
end
|
30
|
+
|
31
|
+
def test_cli_works
|
32
|
+
status, o, e = cli(FC_PATH)
|
33
|
+
assert_equal(0, status)
|
34
|
+
files = Dir.glob(FC_PATH + ".*")
|
35
|
+
assert_equal Set.new(RESULTS), Set.new(files.map{|f| File.basename(f)}), "Should have output these files"
|
36
|
+
|
37
|
+
files.each do | path |
|
38
|
+
channels = FlameChannelParser.parse_file_at(path)
|
39
|
+
the_channel = channels.find{|c| c.length == 30 }
|
40
|
+
|
41
|
+
assert_not_nil the_channel, "Should have exported at least one channel of 30 frames for #{path}"
|
42
|
+
end
|
43
|
+
end
|
44
|
+
|
45
|
+
end
|
@@ -1,17 +1,23 @@
|
|
1
|
-
require "
|
2
|
-
require "stringio"
|
3
|
-
require "tempfile"
|
4
|
-
require "cli_test"
|
1
|
+
require "helper"
|
5
2
|
|
6
|
-
class
|
3
|
+
class TestCliTimewarpExtractor < Test::Unit::TestCase
|
7
4
|
|
8
|
-
BINARY = File.expand_path(File.dirname(__FILE__) + "/../bin/
|
5
|
+
BINARY = File.expand_path(File.dirname(__FILE__) + "/../bin/framecurve_from_flame")
|
6
|
+
FC_PATH = File.expand_path(File.dirname(__FILE__)) + "/timewarp_examples/TW_016_010_v01.framecurve.txt"
|
7
|
+
TW_PATH = File.expand_path(File.dirname(__FILE__)) + "/timewarp_examples/TW_016_010_v01.timewarp"
|
9
8
|
|
10
9
|
# Run the binary under test with passed options, and return [exit_code, stdout_content, stderr_content]
|
11
10
|
def cli(commandline_arguments)
|
12
11
|
CLITest.new(BINARY).run(commandline_arguments)
|
13
12
|
end
|
14
13
|
|
14
|
+
def delete_test_files
|
15
|
+
File.unlink(FC_PATH) if File.exist?(FC_PATH)
|
16
|
+
end
|
17
|
+
|
18
|
+
alias_method :setup, :delete_test_files
|
19
|
+
alias_method :teardown, :delete_test_files
|
20
|
+
|
15
21
|
def test_cli_with_no_args_produces_usage
|
16
22
|
status, o, e = cli('')
|
17
23
|
assert_equal( -1, status)
|
@@ -26,9 +32,13 @@ class TestCli < Test::Unit::TestCase
|
|
26
32
|
end
|
27
33
|
|
28
34
|
def test_cli_with_proper_output
|
29
|
-
|
30
|
-
|
35
|
+
status, output, e = cli(" " + TW_PATH)
|
36
|
+
assert_equal '', output
|
37
|
+
assert File.exist?(FC_PATH)
|
38
|
+
|
39
|
+
content = File.read(FC_PATH)
|
40
|
+
assert content.include?("framecurve.org/"), "Should include the framecurve URL"
|
31
41
|
assert_equal 0, status
|
32
|
-
assert_equal 428,
|
42
|
+
assert_equal 428, content.split("\r\n").length, "Should have output 428 lines to file (first 2 lines are comments)"
|
33
43
|
end
|
34
44
|
end
|
data/test/test_extractor.rb
CHANGED
@@ -0,0 +1,68 @@
|
|
1
|
+
require "helper"
|
2
|
+
|
3
|
+
|
4
|
+
class FlameBuilderTest < Test::Unit::TestCase
|
5
|
+
def setup
|
6
|
+
@s = ""
|
7
|
+
@b = FlameChannelParser::Builder.new(StringIO.new(@s))
|
8
|
+
end
|
9
|
+
|
10
|
+
def test_write_loose
|
11
|
+
@b.write_loose!("Foo")
|
12
|
+
assert_equal "Foo\n", @s
|
13
|
+
end
|
14
|
+
|
15
|
+
def test_write_tuple
|
16
|
+
@b.write_tuple!("Foo", 3)
|
17
|
+
assert_equal "Foo 3\n", @s
|
18
|
+
end
|
19
|
+
|
20
|
+
def test_write_tuple_with_true
|
21
|
+
@b.write_tuple!("Foo", true)
|
22
|
+
assert_equal "Foo yes\n", @s
|
23
|
+
end
|
24
|
+
|
25
|
+
def test_write_tuple_with_false
|
26
|
+
@b.write_tuple!("Foo", false)
|
27
|
+
assert_equal "Foo no\n", @s
|
28
|
+
end
|
29
|
+
|
30
|
+
def test_write_block
|
31
|
+
@b.write_block!("Foo", 1) do | b |
|
32
|
+
b.write_tuple!("Baz", 2)
|
33
|
+
end
|
34
|
+
assert_equal "Foo 1\n\tBaz 2\n\tEnd\n", @s
|
35
|
+
end
|
36
|
+
|
37
|
+
def test_write_block_with_no_arg
|
38
|
+
@b.foo {|c| c.bar }
|
39
|
+
assert_equal "Foo\n\tBar\n\tEnd\n", @s
|
40
|
+
end
|
41
|
+
|
42
|
+
def test_write_block_with_args
|
43
|
+
@b.foo(:bar) {|c| c.bar }
|
44
|
+
assert_equal "Foo bar\n\tBar\n\tEnd\n", @s
|
45
|
+
end
|
46
|
+
|
47
|
+
def test_automissing_with_values
|
48
|
+
@b.some_key(2)
|
49
|
+
assert_equal "SomeKey 2\n", @s
|
50
|
+
end
|
51
|
+
|
52
|
+
def test_automissing_with_block
|
53
|
+
@b.some_key(2) do | b |
|
54
|
+
b.some_subkey
|
55
|
+
end
|
56
|
+
assert_equal "SomeKey 2\n\tSomeSubkey\n\tEnd\n", @s
|
57
|
+
end
|
58
|
+
|
59
|
+
def test_linebreak
|
60
|
+
@b.linebreak!(5)
|
61
|
+
assert_equal "\n" * 5, @s
|
62
|
+
end
|
63
|
+
|
64
|
+
def test_color_hash
|
65
|
+
@b.color_hash!(:triplet, 10, 12, 15)
|
66
|
+
assert_equal "Triplet\n\tRed 10\n\tGreen 12\n\tBlue 15\n", @s
|
67
|
+
end
|
68
|
+
end
|
data/test/test_interpolator.rb
CHANGED
@@ -1,5 +1,5 @@
|
|
1
|
-
require "
|
2
|
-
|
1
|
+
require "helper"
|
2
|
+
|
3
3
|
|
4
4
|
require File.dirname(__FILE__) + "/../lib/flame_channel_parser"
|
5
5
|
|
@@ -39,9 +39,19 @@ class TestInterpolator < Test::Unit::TestCase
|
|
39
39
|
constants = FlameChannelParser.parse(data).find{|c| c.name == "constants"}
|
40
40
|
interp = FlameChannelParser::Interpolator.new(constants)
|
41
41
|
|
42
|
-
vs = [770.41, 770.41, 770.41, 770.41, 770.41, 770.41, 770.41, 770.41, 770.41, 770.41, 770.41,
|
43
|
-
|
44
|
-
|
42
|
+
vs = [770.41, 770.41, 770.41, 770.41, 770.41, 770.41, 770.41, 770.41, 770.41, 770.41, 770.41,
|
43
|
+
770.41, 770.41, 770.41, 770.41, 770.41, 770.41, 770.41, 770.41, 770.41, 770.41, 770.41, 770.41,
|
44
|
+
770.41, 770.41, 770.41, 770.41, 770.41, 770.41, 770.41, 770.41, 770.41, 770.41, 770.41, 770.41,
|
45
|
+
770.41, 770.41, 770.41, 770.41, 770.41, 770.41, 770.41, 770.41, 770.41, 770.41, 770.41, 770.41,
|
46
|
+
770.41, 770.41, 858.177, 858.177, 858.177, 858.177, 858.177, 858.177, 858.177, 858.177,
|
47
|
+
858.177, 858.177, 858.177, 858.177, 858.177, 858.177, 858.177, 858.177, 858.177, 858.177,
|
48
|
+
858.177, 858.177, 858.177, 858.177, 858.177, 858.177, 858.177, 858.177, 858.177, 858.177,
|
49
|
+
858.177, 858.177, 939.407, 939.407, 939.407, 939.407, 939.407, 939.407, 939.407, 939.407,
|
50
|
+
939.407, 939.407, 939.407, 939.407, 939.407, 939.407, 939.407, 939.407, 939.407, 939.407,
|
51
|
+
939.407, 939.407, 939.407, 939.407, 939.407, 939.407, 939.407, 939.407, 939.407, 939.407,
|
52
|
+
939.407, 939.407, 939.407, 939.407, 939.407, 939.407, 939.407, 939.407, 939.407, 939.407,
|
53
|
+
939.407, 939.407, 939.407, 1017.36, 1017.36]
|
54
|
+
|
45
55
|
values = (-5..116).map{|f| interp.sample_at(f) }
|
46
56
|
assert_equal vs, values
|
47
57
|
end
|
data/test/test_key.rb
CHANGED
@@ -0,0 +1,16 @@
|
|
1
|
+
require "helper"
|
2
|
+
|
3
|
+
class TestKronosTimewarpWriter < Test::Unit::TestCase
|
4
|
+
def test_simple_export
|
5
|
+
buf = StringIO.new
|
6
|
+
w = FlameChannelParser::FramecurveWriters::Kronos.new
|
7
|
+
w.run_export(buf) do | key_writer |
|
8
|
+
key_writer.key(1, 123)
|
9
|
+
key_writer.key(15, 124)
|
10
|
+
key_writer.key(19, 200)
|
11
|
+
end
|
12
|
+
|
13
|
+
assert_same_buffer File.open(File.dirname(__FILE__) + "/timewarp_export_samples/Kronos.F_Kronos"), buf
|
14
|
+
end
|
15
|
+
|
16
|
+
end
|
data/test/test_segments.rb
CHANGED
@@ -0,0 +1,16 @@
|
|
1
|
+
require "helper"
|
2
|
+
|
3
|
+
class TestSoftfxTimewarpWriter < Test::Unit::TestCase
|
4
|
+
def test_simple_export
|
5
|
+
buf = StringIO.new
|
6
|
+
w = FlameChannelParser::FramecurveWriters::SoftfxTimewarp.new
|
7
|
+
w.run_export(buf) do | key_writer |
|
8
|
+
key_writer.key(1, 40)
|
9
|
+
key_writer.key(15, 56)
|
10
|
+
key_writer.key(21, 63)
|
11
|
+
key_writer.key(102, 102)
|
12
|
+
end
|
13
|
+
assert_same_buffer File.open(File.dirname(__FILE__) + "/timewarp_export_samples/SoftFX.timewarp"), buf
|
14
|
+
end
|
15
|
+
|
16
|
+
end
|
@@ -1,13 +1,11 @@
|
|
1
|
-
require "
|
2
|
-
require "flame_channel_parser"
|
3
|
-
require "stringio"
|
1
|
+
require "helper"
|
4
2
|
|
5
3
|
class TestTwextract < Test::Unit::TestCase
|
6
4
|
|
7
5
|
def test_parse_with_interpolated_setup
|
8
6
|
interpolated_io = StringIO.new
|
9
7
|
FlameChannelParser::TimewarpExtractor.new.extract(File.dirname(__FILE__) + "/timewarp_examples/TW_TEST.F_Kronos", :destination => interpolated_io)
|
10
|
-
assert_equal
|
8
|
+
assert_equal 83053, interpolated_io.pos
|
11
9
|
end
|
12
10
|
|
13
11
|
def test_parse_kronos_setup
|
@@ -0,0 +1,37 @@
|
|
1
|
+
require "helper"
|
2
|
+
|
3
|
+
|
4
|
+
class TestXMLParser < Test::Unit::TestCase
|
5
|
+
D = 0.0001
|
6
|
+
|
7
|
+
def test_parsing_timewarp_from_2012
|
8
|
+
data = File.open(File.dirname(__FILE__) + "/snaps/BatchTimewarp_ext1.timewarp_node")
|
9
|
+
p = FlameChannelParser::XMLParser.new
|
10
|
+
channels = p.parse(data)
|
11
|
+
|
12
|
+
assert_equal 12, channels.length, "Should have pulled 12 channels"
|
13
|
+
timing = channels.find{|c| c.path == "Timing"}
|
14
|
+
|
15
|
+
assert_not_nil timing
|
16
|
+
assert_kind_of FlameChannelParser::Channel, timing
|
17
|
+
assert_equal 4, timing.length
|
18
|
+
|
19
|
+
first_k = timing[0]
|
20
|
+
assert first_k.has_2012_tangents?
|
21
|
+
|
22
|
+
assert_in_delta D, 1, first_k.frame
|
23
|
+
assert_in_delta D, 1, first_k.value
|
24
|
+
assert_equal :hermite, first_k.curve_mode
|
25
|
+
assert_equal :linear, first_k.curve_order
|
26
|
+
assert_in_delta D, 8.666667, first_k.r_handle_x
|
27
|
+
assert_in_delta D, 0.75, first_k.l_handle_y
|
28
|
+
end
|
29
|
+
|
30
|
+
def test_xml_detected
|
31
|
+
data = File.open(File.dirname(__FILE__) + "/snaps/BatchTimewarp_ext1.timewarp_node")
|
32
|
+
channels = FlameChannelParser.parse(data)
|
33
|
+
assert_equal 12, channels.length, "Should have pulled 12 channels"
|
34
|
+
timing = channels.find{|c| c.path == "Timing"}
|
35
|
+
assert_not_nil timing
|
36
|
+
end
|
37
|
+
end
|
@@ -1,428 +1,430 @@
|
|
1
|
-
|
2
|
-
|
3
|
-
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
|
56
|
-
|
57
|
-
|
58
|
-
|
59
|
-
|
60
|
-
|
61
|
-
|
62
|
-
|
63
|
-
|
64
|
-
|
65
|
-
|
66
|
-
|
67
|
-
|
68
|
-
|
69
|
-
|
70
|
-
|
71
|
-
|
72
|
-
|
73
|
-
|
74
|
-
|
75
|
-
|
76
|
-
|
77
|
-
|
78
|
-
|
79
|
-
|
80
|
-
|
81
|
-
|
82
|
-
|
83
|
-
|
84
|
-
|
85
|
-
|
86
|
-
|
87
|
-
|
88
|
-
|
89
|
-
|
90
|
-
|
91
|
-
|
92
|
-
|
93
|
-
|
94
|
-
|
95
|
-
|
96
|
-
|
97
|
-
|
98
|
-
|
99
|
-
|
100
|
-
|
101
|
-
|
102
|
-
|
103
|
-
|
104
|
-
|
105
|
-
|
106
|
-
|
107
|
-
|
108
|
-
|
109
|
-
|
110
|
-
|
111
|
-
|
112
|
-
|
113
|
-
|
114
|
-
|
115
|
-
|
116
|
-
|
117
|
-
|
118
|
-
|
119
|
-
|
120
|
-
|
121
|
-
|
122
|
-
|
123
|
-
|
124
|
-
|
125
|
-
|
126
|
-
|
127
|
-
|
128
|
-
|
129
|
-
|
130
|
-
|
131
|
-
|
132
|
-
|
133
|
-
|
134
|
-
|
135
|
-
|
136
|
-
|
137
|
-
|
138
|
-
|
139
|
-
|
140
|
-
|
141
|
-
|
142
|
-
|
143
|
-
|
144
|
-
|
145
|
-
|
146
|
-
|
147
|
-
|
148
|
-
|
149
|
-
|
150
|
-
|
151
|
-
|
152
|
-
|
153
|
-
|
154
|
-
|
155
|
-
|
156
|
-
|
157
|
-
|
158
|
-
|
159
|
-
|
160
|
-
|
161
|
-
|
162
|
-
|
163
|
-
|
164
|
-
|
165
|
-
|
166
|
-
|
167
|
-
|
168
|
-
|
169
|
-
|
170
|
-
|
171
|
-
171
|
172
|
-
172
|
173
|
-
|
174
|
-
|
175
|
-
|
176
|
-
|
177
|
-
|
178
|
-
|
179
|
-
|
180
|
-
|
181
|
-
|
182
|
-
|
183
|
-
|
184
|
-
|
185
|
-
|
186
|
-
|
187
|
-
|
188
|
-
|
189
|
-
|
190
|
-
|
191
|
-
|
192
|
-
|
193
|
-
|
194
|
-
|
195
|
-
|
196
|
-
|
197
|
-
|
198
|
-
|
199
|
-
|
200
|
-
|
201
|
-
|
202
|
-
|
203
|
-
|
204
|
-
|
205
|
-
|
206
|
-
|
207
|
-
|
208
|
-
|
209
|
-
|
210
|
-
|
211
|
-
|
212
|
-
|
213
|
-
|
214
|
-
|
215
|
-
|
216
|
-
|
217
|
-
|
218
|
-
|
219
|
-
|
220
|
-
|
221
|
-
|
222
|
-
|
223
|
-
|
224
|
-
|
225
|
-
|
226
|
-
|
227
|
-
|
228
|
-
|
229
|
-
|
230
|
-
|
231
|
-
|
232
|
-
|
233
|
-
|
234
|
-
|
235
|
-
|
236
|
-
|
237
|
-
|
238
|
-
|
239
|
-
|
240
|
-
|
241
|
-
|
242
|
-
|
243
|
-
|
244
|
-
|
245
|
-
|
246
|
-
|
247
|
-
|
248
|
-
|
249
|
-
|
250
|
-
|
251
|
-
|
252
|
-
|
253
|
-
|
254
|
-
|
255
|
-
|
256
|
-
|
257
|
-
|
258
|
-
|
259
|
-
|
260
|
-
|
261
|
-
|
262
|
-
|
263
|
-
|
264
|
-
|
265
|
-
|
266
|
-
|
267
|
-
|
268
|
-
|
269
|
-
|
270
|
-
|
271
|
-
|
272
|
-
|
273
|
-
|
274
|
-
|
275
|
-
|
276
|
-
|
277
|
-
|
278
|
-
|
279
|
-
|
280
|
-
|
281
|
-
|
282
|
-
|
283
|
-
|
284
|
-
|
285
|
-
|
286
|
-
|
287
|
-
|
288
|
-
|
289
|
-
|
290
|
-
|
291
|
-
|
292
|
-
|
293
|
-
|
294
|
-
|
295
|
-
|
296
|
-
|
297
|
-
|
298
|
-
|
299
|
-
|
300
|
-
|
301
|
-
|
302
|
-
|
303
|
-
|
304
|
-
|
305
|
-
|
306
|
-
|
307
|
-
|
308
|
-
|
309
|
-
|
310
|
-
|
311
|
-
|
312
|
-
|
313
|
-
|
314
|
-
|
315
|
-
|
316
|
-
|
317
|
-
|
318
|
-
|
319
|
-
|
320
|
-
|
321
|
-
|
322
|
-
|
323
|
-
|
324
|
-
|
325
|
-
|
326
|
-
|
327
|
-
|
328
|
-
|
329
|
-
|
330
|
-
|
331
|
-
|
332
|
-
|
333
|
-
|
334
|
-
|
335
|
-
|
336
|
-
|
337
|
-
|
338
|
-
|
339
|
-
|
340
|
-
|
341
|
-
|
342
|
-
|
343
|
-
|
344
|
-
|
345
|
-
|
346
|
-
|
347
|
-
|
348
|
-
|
349
|
-
|
350
|
-
|
351
|
-
|
352
|
-
|
353
|
-
|
354
|
-
|
355
|
-
|
356
|
-
|
357
|
-
|
358
|
-
|
359
|
-
|
360
|
-
|
361
|
-
|
362
|
-
|
363
|
-
|
364
|
-
|
365
|
-
|
366
|
-
|
367
|
-
|
368
|
-
|
369
|
-
|
370
|
-
|
371
|
-
|
372
|
-
|
373
|
-
|
374
|
-
|
375
|
-
|
376
|
-
|
377
|
-
|
378
|
-
|
379
|
-
|
380
|
-
|
381
|
-
|
382
|
-
|
383
|
-
|
384
|
-
|
385
|
-
|
386
|
-
|
387
|
-
|
388
|
-
|
389
|
-
|
390
|
-
|
391
|
-
|
392
|
-
|
393
|
-
|
394
|
-
|
395
|
-
|
396
|
-
|
397
|
-
|
398
|
-
|
399
|
-
|
400
|
-
|
401
|
-
|
402
|
-
|
403
|
-
|
404
|
-
|
405
|
-
|
406
|
-
|
407
|
-
|
408
|
-
|
409
|
-
|
410
|
-
|
411
|
-
|
412
|
-
|
413
|
-
|
414
|
-
|
415
|
-
|
416
|
-
|
417
|
-
|
418
|
-
|
419
|
-
|
420
|
-
|
421
|
-
|
422
|
-
|
423
|
-
|
424
|
-
|
425
|
-
|
426
|
-
|
427
|
-
|
428
|
-
|
1
|
+
# http://framecurve.org/specification-v1
|
2
|
+
# at_frame use_frame_of_source
|
3
|
+
1 1.00000
|
4
|
+
2 2.00000
|
5
|
+
3 3.00000
|
6
|
+
4 4.00000
|
7
|
+
5 5.00000
|
8
|
+
6 6.00000
|
9
|
+
7 7.00000
|
10
|
+
8 8.00000
|
11
|
+
9 9.00000
|
12
|
+
10 10.00000
|
13
|
+
11 11.00000
|
14
|
+
12 12.00000
|
15
|
+
13 13.00000
|
16
|
+
14 14.00000
|
17
|
+
15 15.00000
|
18
|
+
16 16.00000
|
19
|
+
17 17.00000
|
20
|
+
18 18.00000
|
21
|
+
19 19.00000
|
22
|
+
20 20.00000
|
23
|
+
21 21.00000
|
24
|
+
22 22.00000
|
25
|
+
23 23.00000
|
26
|
+
24 24.00000
|
27
|
+
25 25.00000
|
28
|
+
26 26.00000
|
29
|
+
27 27.00000
|
30
|
+
28 28.00000
|
31
|
+
29 29.00000
|
32
|
+
30 30.00000
|
33
|
+
31 31.00000
|
34
|
+
32 32.00000
|
35
|
+
33 33.00000
|
36
|
+
34 34.00000
|
37
|
+
35 35.00000
|
38
|
+
36 36.00000
|
39
|
+
37 37.00000
|
40
|
+
38 38.00000
|
41
|
+
39 39.00000
|
42
|
+
40 40.00000
|
43
|
+
41 41.00000
|
44
|
+
42 42.00000
|
45
|
+
43 43.00000
|
46
|
+
44 44.00000
|
47
|
+
45 45.00000
|
48
|
+
46 46.00000
|
49
|
+
47 47.00000
|
50
|
+
48 48.00000
|
51
|
+
49 49.00000
|
52
|
+
50 50.00000
|
53
|
+
51 51.00000
|
54
|
+
52 52.00000
|
55
|
+
53 53.00000
|
56
|
+
54 54.00000
|
57
|
+
55 55.00000
|
58
|
+
56 56.00000
|
59
|
+
57 57.00000
|
60
|
+
58 58.00000
|
61
|
+
59 59.00000
|
62
|
+
60 60.00000
|
63
|
+
61 61.00000
|
64
|
+
62 62.00000
|
65
|
+
63 63.00000
|
66
|
+
64 64.00000
|
67
|
+
65 65.00000
|
68
|
+
66 66.00000
|
69
|
+
67 67.00000
|
70
|
+
68 68.00000
|
71
|
+
69 69.00000
|
72
|
+
70 70.00000
|
73
|
+
71 71.00000
|
74
|
+
72 72.00000
|
75
|
+
73 73.00000
|
76
|
+
74 74.00000
|
77
|
+
75 75.00000
|
78
|
+
76 76.00000
|
79
|
+
77 77.00000
|
80
|
+
78 78.00000
|
81
|
+
79 79.00000
|
82
|
+
80 80.00000
|
83
|
+
81 81.00000
|
84
|
+
82 82.00000
|
85
|
+
83 83.00000
|
86
|
+
84 84.00000
|
87
|
+
85 85.00000
|
88
|
+
86 86.00000
|
89
|
+
87 87.00000
|
90
|
+
88 88.00000
|
91
|
+
89 89.00000
|
92
|
+
90 90.00000
|
93
|
+
91 91.00000
|
94
|
+
92 92.00000
|
95
|
+
93 93.00000
|
96
|
+
94 94.00000
|
97
|
+
95 95.00000
|
98
|
+
96 96.00000
|
99
|
+
97 97.00000
|
100
|
+
98 98.00000
|
101
|
+
99 99.00000
|
102
|
+
100 100.00000
|
103
|
+
101 101.00000
|
104
|
+
102 102.00000
|
105
|
+
103 103.00000
|
106
|
+
104 104.00000
|
107
|
+
105 105.00000
|
108
|
+
106 106.00000
|
109
|
+
107 107.00000
|
110
|
+
108 108.00000
|
111
|
+
109 109.00000
|
112
|
+
110 110.00000
|
113
|
+
111 111.00000
|
114
|
+
112 112.00000
|
115
|
+
113 113.00000
|
116
|
+
114 114.00000
|
117
|
+
115 115.00000
|
118
|
+
116 116.00000
|
119
|
+
117 117.00000
|
120
|
+
118 118.00000
|
121
|
+
119 119.00000
|
122
|
+
120 120.00000
|
123
|
+
121 121.00000
|
124
|
+
122 122.00000
|
125
|
+
123 123.00000
|
126
|
+
124 124.00000
|
127
|
+
125 125.00000
|
128
|
+
126 126.00000
|
129
|
+
127 127.00000
|
130
|
+
128 128.00000
|
131
|
+
129 129.00000
|
132
|
+
130 130.00000
|
133
|
+
131 131.00000
|
134
|
+
132 132.00000
|
135
|
+
133 133.00000
|
136
|
+
134 134.00000
|
137
|
+
135 135.00000
|
138
|
+
136 136.00000
|
139
|
+
137 137.00000
|
140
|
+
138 138.00000
|
141
|
+
139 139.00000
|
142
|
+
140 140.00000
|
143
|
+
141 141.00000
|
144
|
+
142 142.00000
|
145
|
+
143 143.00000
|
146
|
+
144 144.00000
|
147
|
+
145 145.00000
|
148
|
+
146 146.00000
|
149
|
+
147 147.00000
|
150
|
+
148 148.00000
|
151
|
+
149 149.00000
|
152
|
+
150 150.00000
|
153
|
+
151 151.00000
|
154
|
+
152 152.00000
|
155
|
+
153 153.00000
|
156
|
+
154 154.00000
|
157
|
+
155 155.00000
|
158
|
+
156 156.00000
|
159
|
+
157 157.00000
|
160
|
+
158 158.00000
|
161
|
+
159 159.00000
|
162
|
+
160 160.00000
|
163
|
+
161 161.02799
|
164
|
+
162 162.11214
|
165
|
+
163 163.25276
|
166
|
+
164 164.45013
|
167
|
+
165 165.70456
|
168
|
+
166 167.01633
|
169
|
+
167 168.38575
|
170
|
+
168 169.81310
|
171
|
+
169 171.29868
|
172
|
+
170 172.84278
|
173
|
+
171 174.44571
|
174
|
+
172 176.10775
|
175
|
+
173 177.82920
|
176
|
+
174 179.61036
|
177
|
+
175 181.45151
|
178
|
+
176 183.35296
|
179
|
+
177 185.31499
|
180
|
+
178 187.33791
|
181
|
+
179 189.42200
|
182
|
+
180 191.52283
|
183
|
+
181 193.59401
|
184
|
+
182 195.63295
|
185
|
+
183 197.63706
|
186
|
+
184 199.60372
|
187
|
+
185 201.53033
|
188
|
+
186 203.41431
|
189
|
+
187 205.25304
|
190
|
+
188 207.04393
|
191
|
+
189 208.78438
|
192
|
+
190 210.47179
|
193
|
+
191 212.10355
|
194
|
+
192 213.67706
|
195
|
+
193 215.18974
|
196
|
+
194 216.63897
|
197
|
+
195 218.02216
|
198
|
+
196 219.33670
|
199
|
+
197 220.58000
|
200
|
+
198 221.77282
|
201
|
+
199 222.93894
|
202
|
+
200 224.08026
|
203
|
+
201 225.19868
|
204
|
+
202 226.29610
|
205
|
+
203 227.37442
|
206
|
+
204 228.43555
|
207
|
+
205 229.48138
|
208
|
+
206 230.51382
|
209
|
+
207 231.53478
|
210
|
+
208 232.54614
|
211
|
+
209 233.54982
|
212
|
+
210 234.54772
|
213
|
+
211 235.54173
|
214
|
+
212 236.53376
|
215
|
+
213 237.52572
|
216
|
+
214 238.51950
|
217
|
+
215 239.51700
|
218
|
+
216 240.51700
|
219
|
+
217 241.51700
|
220
|
+
218 242.51700
|
221
|
+
219 243.51700
|
222
|
+
220 244.51700
|
223
|
+
221 245.51700
|
224
|
+
222 246.51700
|
225
|
+
223 247.51700
|
226
|
+
224 248.51700
|
227
|
+
225 249.51700
|
228
|
+
226 250.51700
|
229
|
+
227 251.51700
|
230
|
+
228 252.51700
|
231
|
+
229 253.51700
|
232
|
+
230 254.51700
|
233
|
+
231 255.51700
|
234
|
+
232 256.51700
|
235
|
+
233 257.51700
|
236
|
+
234 258.51700
|
237
|
+
235 259.51700
|
238
|
+
236 260.51700
|
239
|
+
237 261.51700
|
240
|
+
238 262.51700
|
241
|
+
239 263.51700
|
242
|
+
240 264.51700
|
243
|
+
241 265.51700
|
244
|
+
242 266.51700
|
245
|
+
243 267.51700
|
246
|
+
244 268.51700
|
247
|
+
245 269.51700
|
248
|
+
246 270.51700
|
249
|
+
247 271.51700
|
250
|
+
248 272.51700
|
251
|
+
249 273.51700
|
252
|
+
250 274.51700
|
253
|
+
251 275.51700
|
254
|
+
252 276.51700
|
255
|
+
253 277.51700
|
256
|
+
254 278.51700
|
257
|
+
255 279.51700
|
258
|
+
256 280.51700
|
259
|
+
257 281.51700
|
260
|
+
258 282.51700
|
261
|
+
259 283.51700
|
262
|
+
260 284.51700
|
263
|
+
261 285.51700
|
264
|
+
262 286.51700
|
265
|
+
263 287.51700
|
266
|
+
264 288.51700
|
267
|
+
265 289.51700
|
268
|
+
266 290.51700
|
269
|
+
267 291.51700
|
270
|
+
268 292.51700
|
271
|
+
269 293.51700
|
272
|
+
270 294.51700
|
273
|
+
271 295.51700
|
274
|
+
272 296.51700
|
275
|
+
273 297.51700
|
276
|
+
274 298.51700
|
277
|
+
275 299.51700
|
278
|
+
276 300.51700
|
279
|
+
277 301.51700
|
280
|
+
278 302.51700
|
281
|
+
279 303.51700
|
282
|
+
280 304.51700
|
283
|
+
281 305.51700
|
284
|
+
282 306.51700
|
285
|
+
283 307.51700
|
286
|
+
284 308.51700
|
287
|
+
285 309.51700
|
288
|
+
286 310.51700
|
289
|
+
287 311.51700
|
290
|
+
288 312.51700
|
291
|
+
289 313.51700
|
292
|
+
290 314.51700
|
293
|
+
291 315.51700
|
294
|
+
292 316.51700
|
295
|
+
293 317.51700
|
296
|
+
294 318.51700
|
297
|
+
295 319.51700
|
298
|
+
296 320.51700
|
299
|
+
297 321.51700
|
300
|
+
298 322.51700
|
301
|
+
299 323.51700
|
302
|
+
300 324.51700
|
303
|
+
301 325.51700
|
304
|
+
302 326.51700
|
305
|
+
303 327.51700
|
306
|
+
304 328.51700
|
307
|
+
305 329.51700
|
308
|
+
306 330.51700
|
309
|
+
307 331.51700
|
310
|
+
308 332.51700
|
311
|
+
309 333.51700
|
312
|
+
310 334.51700
|
313
|
+
311 335.51700
|
314
|
+
312 336.51700
|
315
|
+
313 337.51700
|
316
|
+
314 338.51700
|
317
|
+
315 339.51700
|
318
|
+
316 340.51700
|
319
|
+
317 341.51700
|
320
|
+
318 342.51700
|
321
|
+
319 343.51700
|
322
|
+
320 344.51700
|
323
|
+
321 345.51700
|
324
|
+
322 346.51700
|
325
|
+
323 347.51700
|
326
|
+
324 348.51700
|
327
|
+
325 349.51700
|
328
|
+
326 350.51700
|
329
|
+
327 351.51700
|
330
|
+
328 352.51700
|
331
|
+
329 353.51700
|
332
|
+
330 354.51700
|
333
|
+
331 355.51700
|
334
|
+
332 356.51700
|
335
|
+
333 357.51700
|
336
|
+
334 358.51700
|
337
|
+
335 359.51700
|
338
|
+
336 360.51700
|
339
|
+
337 361.51700
|
340
|
+
338 362.51700
|
341
|
+
339 363.51700
|
342
|
+
340 364.51700
|
343
|
+
341 365.51700
|
344
|
+
342 366.51700
|
345
|
+
343 367.51700
|
346
|
+
344 368.51700
|
347
|
+
345 369.51700
|
348
|
+
346 370.51700
|
349
|
+
347 371.51700
|
350
|
+
348 372.51700
|
351
|
+
349 373.51700
|
352
|
+
350 374.51700
|
353
|
+
351 375.51700
|
354
|
+
352 376.51700
|
355
|
+
353 377.51700
|
356
|
+
354 378.51700
|
357
|
+
355 379.51700
|
358
|
+
356 380.51700
|
359
|
+
357 381.51700
|
360
|
+
358 382.51700
|
361
|
+
359 383.51700
|
362
|
+
360 384.51700
|
363
|
+
361 385.51700
|
364
|
+
362 386.51700
|
365
|
+
363 387.51700
|
366
|
+
364 388.51700
|
367
|
+
365 389.51700
|
368
|
+
366 390.51700
|
369
|
+
367 391.51700
|
370
|
+
368 392.51700
|
371
|
+
369 393.51700
|
372
|
+
370 394.51700
|
373
|
+
371 395.51700
|
374
|
+
372 396.51700
|
375
|
+
373 397.51700
|
376
|
+
374 398.51700
|
377
|
+
375 399.51700
|
378
|
+
376 400.51700
|
379
|
+
377 401.51700
|
380
|
+
378 402.51700
|
381
|
+
379 403.51700
|
382
|
+
380 404.51700
|
383
|
+
381 405.51700
|
384
|
+
382 406.51700
|
385
|
+
383 407.51700
|
386
|
+
384 408.51700
|
387
|
+
385 409.51700
|
388
|
+
386 410.51700
|
389
|
+
387 411.51700
|
390
|
+
388 412.51700
|
391
|
+
389 413.51700
|
392
|
+
390 414.51700
|
393
|
+
391 415.51700
|
394
|
+
392 416.51700
|
395
|
+
393 417.51700
|
396
|
+
394 418.51700
|
397
|
+
395 419.51700
|
398
|
+
396 420.51700
|
399
|
+
397 421.51700
|
400
|
+
398 422.51700
|
401
|
+
399 423.51700
|
402
|
+
400 424.51700
|
403
|
+
401 425.51700
|
404
|
+
402 426.51700
|
405
|
+
403 427.51700
|
406
|
+
404 428.51700
|
407
|
+
405 429.51700
|
408
|
+
406 430.51700
|
409
|
+
407 431.51700
|
410
|
+
408 432.51700
|
411
|
+
409 433.51700
|
412
|
+
410 434.51700
|
413
|
+
411 435.51700
|
414
|
+
412 436.51700
|
415
|
+
413 437.51700
|
416
|
+
414 438.51700
|
417
|
+
415 439.51700
|
418
|
+
416 440.51700
|
419
|
+
417 441.51700
|
420
|
+
418 442.51700
|
421
|
+
419 443.51700
|
422
|
+
420 444.51700
|
423
|
+
421 445.51700
|
424
|
+
422 446.51700
|
425
|
+
423 447.51700
|
426
|
+
424 448.51700
|
427
|
+
425 449.51700
|
428
|
+
426 450.51700
|
429
|
+
427 451.51700
|
430
|
+
428 452.51700
|