framecurve 1.0.2 → 2.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.
@@ -0,0 +1,8 @@
1
+ 2.0.0
2
+
3
+ * Added a FinalCut extractor, plus some bugfixes
4
+ * Improved the commandline validator
5
+
6
+ 1.0.0
7
+
8
+ * Original release
@@ -2,13 +2,38 @@
2
2
 
3
3
  framecurve (http://framecurve.org) file handling gem for Ruby.
4
4
 
5
- It currently includes only one binary, framecurve_validator, that will validate framecurve files passed in the arguments and report
5
+ This gem includes a handful of classes for manipulating framecurves and is intended as a library for when you want to do something
6
+ with framecurves from within Ruby. This will also power the online framecurve validation service once it's online.
7
+
8
+ == Framecurve validation and parsing
9
+
10
+ The main binary of the gem is called <tt>framecurve_validator</tt>, it will validate framecurve files passed in the arguments and report
6
11
  any errors found in the files to STDERR.
7
12
 
8
13
  $framecurve_validator somefile.framecurve.txt another.framecurve.txt
9
-
10
- For the rest this gem includes a handful of classes for manipulating framecurves and is intended as a library for when you want to do something
11
- with framecurves from within Ruby. This will also power the online framecurve validation service once it's online.
14
+
15
+ This is handy when you wrote your own piece of software that exports framecurve files or you want to make sure that a framecurve file
16
+ you have received conforms to the framecurve specification. This tool will also note all the deviations from the spec in terms of recommended
17
+ headers and comments and report them to you one by one.
18
+
19
+ == Extracting framecurves from FinalCut Pro XML files
20
+
21
+ This gem includes an application, <tt>framecurve_from_fcp</tt>, that will extract Framecurve files from a FinalCut Pro XML
22
+ files (the version you need is *XML Interchange Format Version 4*). It will dive into your sequence and find all clips which have
23
+ time remap effects on them, and for each of these clips it will write out a <tt>.framecurve.txt<tt> file that you can convert into
24
+ other formats or load into applications for which we provide framecurve scripts. This file will include all of the motion keyframes
25
+ that have been applied in FCP.
26
+
27
+ $framecurve_from_fcp_xml my_edit.xml
28
+
29
+ will write out a number of framecurve files, one per timewarped clip in your sequence (they will be appropriately named with the track
30
+ index, clip index and clip name so that you can trace which ones relate to which clips in your edit).
31
+
32
+ == Extracting framecurves from Flame/Smoke setups
33
+
34
+ If you need to extract from a format written by Flame or Smoke, install the *flame_channel_parser* gem. This gem provides
35
+ the binaries <tt>framecurve_to_flame</tt> and <tt>framecurve_from_flame</tt> which will create framecurve files or convert them
36
+ to a variety of Flame-supported setup formats. Refer to the <tt>flame_channel_parser</tt> gem documentation for more information on these.
12
37
 
13
38
  == Contributing to framecurve
14
39
 
@@ -22,6 +47,6 @@ with framecurves from within Ruby. This will also power the online framecurve va
22
47
 
23
48
  == Copyright
24
49
 
25
- Copyright (c) 2011 Julik. See LICENSE.txt for
26
- further details.
50
+ Copyright (c) 2011 Julik.
51
+ See LICENSE.txt for further details.
27
52
 
@@ -0,0 +1,10 @@
1
+ #!/usr/bin/env ruby
2
+ require File.dirname(__FILE__) + "/../lib/framecurve"
3
+
4
+ fail "No file provided" if ARGV.empty?
5
+
6
+ path = ARGV.shift
7
+ File.open(path) do | f |
8
+ extractor = Framecurve::Extractors::FCP_XML.new
9
+ extractor.extract(f)
10
+ end
@@ -5,14 +5,14 @@
5
5
 
6
6
  Gem::Specification.new do |s|
7
7
  s.name = "framecurve"
8
- s.version = "1.0.2"
8
+ s.version = "2.0.0"
9
9
 
10
10
  s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
11
11
  s.authors = ["Julik"]
12
- s.date = "2011-12-30"
12
+ s.date = "2012-01-08"
13
13
  s.description = " Parser, validation and interpolation"
14
14
  s.email = "me@julik.nl"
15
- s.executables = ["framecurve_validator"]
15
+ s.executables = ["framecurve_from_fcp_xml", "framecurve_validator"]
16
16
  s.extra_rdoc_files = [
17
17
  "LICENSE.txt",
18
18
  "README.rdoc"
@@ -20,21 +20,31 @@ Gem::Specification.new do |s|
20
20
  s.files = [
21
21
  ".document",
22
22
  "Gemfile",
23
+ "History.txt",
23
24
  "LICENSE.txt",
24
25
  "README.rdoc",
25
26
  "Rakefile",
27
+ "bin/framecurve_from_fcp_xml",
26
28
  "bin/framecurve_validator",
27
29
  "framecurve.gemspec",
28
30
  "lib/framecurve.rb",
29
31
  "lib/framecurve/comment.rb",
30
32
  "lib/framecurve/curve.rb",
33
+ "lib/framecurve/extractors/fcp_xml.rb",
34
+ "lib/framecurve/extractors/xml_bridge.rb",
31
35
  "lib/framecurve/parser.rb",
32
36
  "lib/framecurve/serializer.rb",
33
37
  "lib/framecurve/tuple.rb",
34
38
  "lib/framecurve/validator.rb",
39
+ "test/fixtures/fcp_xml/CountDOWN.xml",
40
+ "test/fixtures/framecurves/err-neg-frames.framecurve.txt",
41
+ "test/fixtures/framecurves/err-no-tuples.framecurve.txt",
42
+ "test/fixtures/framecurves/incorrect.extension",
43
+ "test/fixtures/framecurves/sample_framecurve1.framecurve.txt",
35
44
  "test/helper.rb",
36
45
  "test/test_framecurve_comment.rb",
37
46
  "test/test_framecurve_curve.rb",
47
+ "test/test_framecurve_from_fcp_xml_binary.rb",
38
48
  "test/test_framecurve_parser.rb",
39
49
  "test/test_framecurve_serializer.rb",
40
50
  "test/test_framecurve_tuple.rb",
@@ -1,11 +1,11 @@
1
1
  module Framecurve
2
- VERSION = "1.0.2"
2
+ VERSION = "2.0.0"
3
3
 
4
4
  # Is raised when a malformed framecurve bit has occurred in the system
5
5
  class Malformed < RuntimeError
6
6
  end
7
7
  end
8
8
 
9
- %w( tuple comment curve parser validator serializer ).each do | f |
9
+ %w( tuple comment curve parser validator serializer extractors/fcp_xml ).each do | f |
10
10
  require File.join(File.dirname(__FILE__), "framecurve", f)
11
11
  end
@@ -0,0 +1,97 @@
1
+ require File.dirname(__FILE__) + "/xml_bridge"
2
+
3
+ module Framecurve
4
+ module Extractors
5
+
6
+ # Pulls all varispeed timeremaps from an FCP XML V4 file
7
+ class FCP_XML
8
+
9
+ def initialize()
10
+ @xml = Framecurve::XMLBridge.new
11
+ end
12
+
13
+ def extract(io)
14
+ doc = @xml.document_from_io(io)
15
+ # Find all of the parameterid elements with graphdict
16
+ @xml.xpath_each(doc, "//parameterid") do | e |
17
+ if @xml.element_text(e) == "graphdict"
18
+ parameter = @xml.parent(e)
19
+ effect = @xml.parent(e, 2)
20
+ if @xml.xpath_first_text(effect, "name") == "Time Remap"
21
+ $stderr.puts "Found a timewarp at %s" % parameter.xpath
22
+
23
+ curve = pull_timewarp(parameter, File.basename(io.path))
24
+ destination = compose_filename(io.path, parameter)
25
+
26
+ File.open(destination, "wb") do | f |
27
+ $stderr.puts "Writing out a framecurve to %s" % destination
28
+ Framecurve::Serializer.new.validate_and_serialize(f, curve)
29
+ end
30
+ end
31
+ end
32
+ end
33
+ end
34
+
35
+ private
36
+
37
+ def compose_filename(source_path, parameter)
38
+ path = @xml.xpath_of(parameter).split("/")
39
+ # Path to the parameter node is something like this
40
+ # /xmeml/project/children/sequence/media/video/track/clipitem[1]/filter[7]/effect/parameter[6]
41
+ # From this we want to preserve:
42
+ # sequence and it's name
43
+ # track number
44
+ # clipitem number (offset)
45
+ relevant_nodenames = path.grep(/^(sequence|track|clipitem)/)
46
+ # Add default indices
47
+ relevant_nodenames.map! do | nodename_and_offset |
48
+ if nodename_and_offset =~ /\]$/
49
+ elems = nodename_and_offset.scan(/(\w+)(\[(\d+)\])/).flatten
50
+ [elems.shift, elems.pop]
51
+ else
52
+ [nodename_and_offset, "1"]
53
+ end
54
+ end
55
+ mappings = {"sequence" => "SEQ", "track"=>"V", "clipitem" => "CLIP"}
56
+ naming = relevant_nodenames.map do | nodename, offset |
57
+ [mappings[nodename], offset].join("")
58
+ end.join('-')
59
+
60
+ [source_path, naming, "framecurve.txt"].join('.')
61
+ end
62
+
63
+ def pull_timewarp(param, source_filename)
64
+ clipitem = @xml.parent(param, 3)
65
+ c = Framecurve::Curve.new
66
+ $stderr.puts clipitem.xpath
67
+
68
+ c.comment!("From FCP XML %s" % source_filename)
69
+ c.comment!("Information from %s" % clipitem.xpath)
70
+
71
+ clip_item_name = @xml.xpath_first_text(clipitem, "name")
72
+
73
+ # The clip in point in the edit timeline, also first frame of the TW
74
+ in_point = @xml.xpath_first_text(clipitem, "in").to_i
75
+ out_point = @xml.xpath_first_text(clipitem, "out").to_i
76
+
77
+ c.filename = [clip_item_name, "framecurve.txt"].join('.')
78
+
79
+ # Accumulate keyframes
80
+ @xml.xpath_each(param, "keyframe") do | kf |
81
+ write_keyframe(c, kf, in_point, out_point)
82
+ end
83
+ $stderr.puts("Generated a curve of #{c.length} keys")
84
+ c
85
+ end
86
+
87
+ def write_keyframe(c, kf, in_point, out_point)
88
+ kf_when, kf_value = @xml.xpath_first_text(kf, "when").to_i, @xml.xpath_first_text(kf, "value").to_f
89
+ # TODO: should be a flag
90
+ at = kf_when - in_point + 1
91
+ value = kf_value + 1 # FCP starts clips at 0
92
+ c.tuple!(at, value) unless (at < 1 || value < 1 || at > out_point)
93
+ end
94
+
95
+ end
96
+ end
97
+ end
@@ -0,0 +1,56 @@
1
+ require "rexml/document"
2
+
3
+ #:nodoc:
4
+
5
+ # This is a thin wrapper around the REXML library. We want FC to use nokogiri
6
+ # or libxml in the future, without modifying it's core functionality. Therefore we will use
7
+ # a thin layer on top of REXML and then migrate it to offer various backends
8
+ class Framecurve::XMLBridge
9
+
10
+ include REXML
11
+
12
+ # TODO: detect for subclasses here
13
+ def self.new
14
+ super
15
+ end
16
+
17
+ # Return a wrapped document
18
+ def document_from_io(io)
19
+ REXML::Document.new(io)
20
+ end
21
+
22
+ # Get the first node matching the XPath expression
23
+ def xpath_first(from_root_node, path)
24
+ REXML::XPath.first(from_root_node, path)
25
+ end
26
+
27
+ # Get the text of the first node matching the XPath expression
28
+ def xpath_first_text(from_root_node, path)
29
+ element_text(xpath_first(from_root_node, path))
30
+ end
31
+
32
+ # Yields each XPath-satisfying element to the passed block
33
+ def xpath_each(from_root_node, path)
34
+ REXML::XPath.each(from_root_node, path, &Proc.new)
35
+ end
36
+
37
+ # Returns the xpath to that specific node in the document
38
+ def xpath_of(node)
39
+ node.xpath.to_s
40
+ end
41
+
42
+ # Get a Nth parent of the passed node
43
+ def parent(of_node, level = 1)
44
+ ancestor = of_node
45
+ until level.zero?
46
+ ancestor = ancestor.parent
47
+ level -= 1
48
+ end
49
+ return ancestor
50
+ end
51
+
52
+ def element_text(elem)
53
+ elem.text.to_s
54
+ end
55
+
56
+ end
@@ -1,4 +1,5 @@
1
- # Parses the data in the passed file/IO into a Curve object
1
+ # Parses the data in the passed file/IO into a Curve object.
2
+ # curve = Framecurve::Parser.new.parse("/tmp/curve.framecurve.txt")
2
3
  class Framecurve::Parser
3
4
  COMMENT = /^#(.+)$/
4
5
  CORRELATION_RECORD = /^([-]?\d+)\t([-]?(\d+(\.\d*)?)|\.\d+)([eE][+-]?[0-9]+)?$/
@@ -1,13 +1,39 @@
1
1
  # Writes out a Curve object to the passed IO
2
2
  class Framecurve::Serializer
3
+
3
4
  # Serialize the passed curve into io. Will use the materialized curve version.
4
- # Will write the file with CRLF linebreaks instead of LF
5
+ # Will write the file with CRLF linebreaks instead of LF.
6
+ # Also, if the passed Curve object does not contain a preamble (URL and column headers)
7
+ # they will be added automatically
5
8
  def serialize(io, curve)
9
+ write_preamble(io) unless curve_has_preamble?(curve)
10
+ curve.each do | record |
11
+ io.write("%s\r\n" % record)
12
+ end
13
+ end
14
+
15
+ # Serialize the passed curve into io and raise an exception
16
+ def validate_and_serialize(io, curve)
17
+ v = Framecurve::Validator.new
18
+ v.validate(curve)
19
+ raise Framecurve::Malformed, "Will not serialize a malformed curve: #{v.errors.join(', ')}" if v.any_errors?
20
+ serialize(io, curve)
21
+ end
22
+
23
+ private
24
+
25
+ def write_preamble(io)
6
26
  io.write("# http://framecurve.org/specification-v1\n")
7
27
  io.write("# at_frame\tuse_frame_of_source\n")
8
- curve.to_materialized_curve.each_tuple do | t |
9
- io.write(t)
10
- io.write("\r\n")
11
- end
12
28
  end
29
+
30
+ def curve_has_preamble?(curve)
31
+ first_comment, second_comment = curve[0], curve[-1]
32
+ return false unless first_comment && second_comment
33
+ return false unless (first_comment.comment? && second_comment.comment?)
34
+ return false unless first_comment.text.include?("http://framecurve.org")
35
+ return false unless second_comment.text.include?("at_frame\tuse_frame_of_source")
36
+
37
+ true
38
+ end
13
39
  end
@@ -10,10 +10,12 @@ class Framecurve::Validator
10
10
  @warnings, @errors = [], []
11
11
  end
12
12
 
13
+ # Tells whether this validator instance has any errors
13
14
  def any_errors?
14
15
  @errors.any?
15
16
  end
16
17
 
18
+ # Tells whether this validator instance has any warnings
17
19
  def any_warnings?
18
20
  @warnings.any?
19
21
  end
@@ -67,10 +69,10 @@ class Framecurve::Validator
67
69
  next unless t.tuple?
68
70
 
69
71
  line_no = i + 1
70
- if t.at < 0
71
- @errors.push("The tuple %d had a negative at_frame value (%d). The spec mandates positive frames." % [line_no, t.at])
72
+ if t.at < 1
73
+ @errors.push("The line %d had it's at_frame value (%d) below 1. The spec mandates at_frame >= 1." % [line_no, t.at])
72
74
  elsif t.value < 0
73
- @errors.push("The tuple %d had a negative use_frame_of_source value (%.5f). The spec mandates positive frames." % [line_no, t.value])
75
+ @errors.push("The line %d had a use_frame_of_source value (%.5f) below 0. The spec mandates use_frame_of_source >= 0." % [line_no, t.value])
74
76
  end
75
77
  end
76
78
  end
@@ -96,12 +98,15 @@ class Framecurve::Validator
96
98
  end
97
99
 
98
100
  def recommend_proper_preamble(curve)
99
- first_comments = curve.map do | e |
100
- break unless e.comment?
101
- e
101
+ unless curve[0] && curve[0].comment? && curve[0].text =~ /framecurve\.org\/specification/
102
+ @warnings.push("It is recommended that a framecurve starts with a comment with the specification URL")
102
103
  end
103
104
  end
104
105
 
105
106
  def recommend_proper_column_headers(curve)
107
+ line_two = curve[1]
108
+ unless line_two && line_two.comment? && line_two.text =~ /at_frame\tuse_frame_of_source/
109
+ @warnings.push("It is recommended for the second comment to provide a column header")
110
+ end
106
111
  end
107
112
  end
@@ -0,0 +1,812 @@
1
+ <?xml version="1.0" encoding="UTF-8"?>
2
+ <!DOCTYPE xmeml>
3
+ <xmeml version="4">
4
+ <project>
5
+ <name>CountDOWN</name>
6
+ <children>
7
+ <clip id="ConuntDown-RSZ">
8
+ <uuid>96BEE056-7A3E-4229-9DD9-945541E5F078</uuid>
9
+ <updatebehavior>add</updatebehavior>
10
+ <name>ConuntDown-RSZ</name>
11
+ <duration>100</duration>
12
+ <rate>
13
+ <ntsc>FALSE</ntsc>
14
+ <timebase>25</timebase>
15
+ </rate>
16
+ <in>-1</in>
17
+ <out>-1</out>
18
+ <masterclipid>ConuntDown-RSZ</masterclipid>
19
+ <ismasterclip>TRUE</ismasterclip>
20
+ <logginginfo>
21
+ <scene>
22
+ </scene>
23
+ <shottake>
24
+ </shottake>
25
+ <lognote>
26
+ </lognote>
27
+ <good>FALSE</good>
28
+ </logginginfo>
29
+ <labels>
30
+ <label2>
31
+ </label2>
32
+ </labels>
33
+ <comments>
34
+ <mastercomment1>
35
+ </mastercomment1>
36
+ <mastercomment2>
37
+ </mastercomment2>
38
+ <mastercomment3>
39
+ </mastercomment3>
40
+ <mastercomment4>
41
+ </mastercomment4>
42
+ </comments>
43
+ <media>
44
+ <video>
45
+ <track>
46
+ <clipitem id="ConuntDown-RSZ1">
47
+ <name>ConuntDown-RSZ</name>
48
+ <duration>100</duration>
49
+ <rate>
50
+ <ntsc>FALSE</ntsc>
51
+ <timebase>25</timebase>
52
+ </rate>
53
+ <in>0</in>
54
+ <out>100</out>
55
+ <start>0</start>
56
+ <end>100</end>
57
+ <pixelaspectratio>PAL-601</pixelaspectratio>
58
+ <anamorphic>FALSE</anamorphic>
59
+ <alphatype>none</alphatype>
60
+ <masterclipid>ConuntDown-RSZ</masterclipid>
61
+ <logginginfo>
62
+ <scene>
63
+ </scene>
64
+ <shottake>
65
+ </shottake>
66
+ <lognote>
67
+ </lognote>
68
+ <good>FALSE</good>
69
+ </logginginfo>
70
+ <labels>
71
+ <label2>
72
+ </label2>
73
+ </labels>
74
+ <comments>
75
+ <mastercomment1>
76
+ </mastercomment1>
77
+ <mastercomment2>
78
+ </mastercomment2>
79
+ <mastercomment3>
80
+ </mastercomment3>
81
+ <mastercomment4>
82
+ </mastercomment4>
83
+ </comments>
84
+ <file id="ConuntDown-RSZ2">
85
+ <name>ConuntDown-RSZ.mov</name>
86
+ <pathurl>file://localhost/Users/julik/Desktop/VFX_Projectery/ConuntDown-RSZ.mov</pathurl>
87
+ <rate>
88
+ <timebase>25</timebase>
89
+ </rate>
90
+ <duration>100</duration>
91
+ <timecode>
92
+ <rate>
93
+ <timebase>25</timebase>
94
+ </rate>
95
+ <string>00:00:00:00</string>
96
+ <frame>0</frame>
97
+ <displayformat>NDF</displayformat>
98
+ <source>source</source>
99
+ <reel>
100
+ <name>Julik</name>
101
+ </reel>
102
+ </timecode>
103
+ <media>
104
+ <video>
105
+ <duration>100</duration>
106
+ <samplecharacteristics>
107
+ <width>720</width>
108
+ <height>576</height>
109
+ </samplecharacteristics>
110
+ </video>
111
+ </media>
112
+ </file>
113
+ <sourcetrack>
114
+ <mediatype>video</mediatype>
115
+ </sourcetrack>
116
+ <fielddominance>lower</fielddominance>
117
+ <itemhistory>
118
+ <uuid>CCCA8B3B-CB09-475B-87E8-409D80CAC39E</uuid>
119
+ </itemhistory>
120
+ </clipitem>
121
+ <enabled>TRUE</enabled>
122
+ <locked>FALSE</locked>
123
+ </track>
124
+ </video>
125
+ </media>
126
+ </clip>
127
+ <sequence id="Sequence 1 ">
128
+ <uuid>C17CD975-199B-4936-82EE-B62324D441ED</uuid>
129
+ <updatebehavior>add</updatebehavior>
130
+ <name>Sequence 1</name>
131
+ <duration>182</duration>
132
+ <rate>
133
+ <ntsc>FALSE</ntsc>
134
+ <timebase>25</timebase>
135
+ </rate>
136
+ <timecode>
137
+ <rate>
138
+ <ntsc>FALSE</ntsc>
139
+ <timebase>25</timebase>
140
+ </rate>
141
+ <string>01:00:00:00</string>
142
+ <frame>90000</frame>
143
+ <source>source</source>
144
+ <displayformat>NDF</displayformat>
145
+ </timecode>
146
+ <in>-1</in>
147
+ <out>-1</out>
148
+ <media>
149
+ <video>
150
+ <format>
151
+ <samplecharacteristics>
152
+ <width>720</width>
153
+ <height>576</height>
154
+ <anamorphic>FALSE</anamorphic>
155
+ <pixelaspectratio>PAL-601</pixelaspectratio>
156
+ <fielddominance>lower</fielddominance>
157
+ <rate>
158
+ <ntsc>FALSE</ntsc>
159
+ <timebase>25</timebase>
160
+ </rate>
161
+ <colordepth>24</colordepth>
162
+ <codec>
163
+ <name>Apple DV - PAL</name>
164
+ <appspecificdata>
165
+ <appname>Final Cut Pro</appname>
166
+ <appmanufacturer>Apple Inc.</appmanufacturer>
167
+ <appversion>6.0</appversion>
168
+ <data>
169
+ <qtcodec>
170
+ <codecname>Apple DV - PAL</codecname>
171
+ <codectypename>DV - PAL</codectypename>
172
+ <codectypecode>dvcp</codectypecode>
173
+ <codecvendorcode>appl</codecvendorcode>
174
+ <spatialquality>1023</spatialquality>
175
+ <temporalquality>0</temporalquality>
176
+ <keyframerate>0</keyframerate>
177
+ <datarate>0</datarate>
178
+ </qtcodec>
179
+ </data>
180
+ </appspecificdata>
181
+ </codec>
182
+ </samplecharacteristics>
183
+ <appspecificdata>
184
+ <appname>Final Cut Pro</appname>
185
+ <appmanufacturer>Apple Inc.</appmanufacturer>
186
+ <appversion>6.0</appversion>
187
+ <data>
188
+ <fcpimageprocessing>
189
+ <useyuv>TRUE</useyuv>
190
+ <usesuperwhite>FALSE</usesuperwhite>
191
+ <rendermode>YUV8BPP</rendermode>
192
+ </fcpimageprocessing>
193
+ </data>
194
+ </appspecificdata>
195
+ </format>
196
+ <track>
197
+ <clipitem id="ConuntDown-RSZ3">
198
+ <name>ConuntDown-RSZ</name>
199
+ <duration>100</duration>
200
+ <rate>
201
+ <ntsc>FALSE</ntsc>
202
+ <timebase>25</timebase>
203
+ </rate>
204
+ <in>12</in>
205
+ <out>62</out>
206
+ <start>0</start>
207
+ <end>50</end>
208
+ <pixelaspectratio>PAL-601</pixelaspectratio>
209
+ <enabled>TRUE</enabled>
210
+ <anamorphic>FALSE</anamorphic>
211
+ <alphatype>none</alphatype>
212
+ <masterclipid>ConuntDown-RSZ</masterclipid>
213
+ <logginginfo>
214
+ <scene>
215
+ </scene>
216
+ <shottake>
217
+ </shottake>
218
+ <lognote>
219
+ </lognote>
220
+ <good>FALSE</good>
221
+ </logginginfo>
222
+ <labels>
223
+ <label2>
224
+ </label2>
225
+ </labels>
226
+ <comments>
227
+ <mastercomment1>
228
+ </mastercomment1>
229
+ <mastercomment2>
230
+ </mastercomment2>
231
+ <mastercomment3>
232
+ </mastercomment3>
233
+ <mastercomment4>
234
+ </mastercomment4>
235
+ </comments>
236
+ <file id="ConuntDown-RSZ2"/>
237
+ <filter>
238
+ <effect>
239
+ <name>Basic Motion</name>
240
+ <effectid>basic</effectid>
241
+ <effectcategory>motion</effectcategory>
242
+ <effecttype>motion</effecttype>
243
+ <mediatype>video</mediatype>
244
+ <parameter>
245
+ <parameterid>scale</parameterid>
246
+ <name>Scale</name>
247
+ <valuemin>0</valuemin>
248
+ <valuemax>1000</valuemax>
249
+ <value>100</value>
250
+ </parameter>
251
+ <parameter>
252
+ <parameterid>rotation</parameterid>
253
+ <name>Rotation</name>
254
+ <valuemin>-8640</valuemin>
255
+ <valuemax>8640</valuemax>
256
+ <value>0</value>
257
+ </parameter>
258
+ <parameter>
259
+ <parameterid>center</parameterid>
260
+ <name>Center</name>
261
+ <value>
262
+ <horiz>0</horiz>
263
+ <vert>0</vert>
264
+ </value>
265
+ </parameter>
266
+ <parameter>
267
+ <parameterid>centerOffset</parameterid>
268
+ <name>Anchor Point</name>
269
+ <value>
270
+ <horiz>0</horiz>
271
+ <vert>0</vert>
272
+ </value>
273
+ </parameter>
274
+ </effect>
275
+ </filter>
276
+ <filter>
277
+ <enabled>FALSE</enabled>
278
+ <effect>
279
+ <name>Drop Shadow</name>
280
+ <effectid>dropshadow</effectid>
281
+ <effectcategory>motion</effectcategory>
282
+ <effecttype>motion</effecttype>
283
+ <mediatype>video</mediatype>
284
+ <parameter>
285
+ <parameterid>offset</parameterid>
286
+ <name>offset</name>
287
+ <valuemin>-100</valuemin>
288
+ <valuemax>100</valuemax>
289
+ <value>2</value>
290
+ </parameter>
291
+ <parameter>
292
+ <parameterid>angle</parameterid>
293
+ <name>angle</name>
294
+ <valuemin>-720</valuemin>
295
+ <valuemax>720</valuemax>
296
+ <value>135</value>
297
+ </parameter>
298
+ <parameter>
299
+ <parameterid>color</parameterid>
300
+ <name>color</name>
301
+ <value>
302
+ <alpha>0</alpha>
303
+ <red>0</red>
304
+ <green>0</green>
305
+ <blue>0</blue>
306
+ </value>
307
+ </parameter>
308
+ <parameter>
309
+ <parameterid>softness</parameterid>
310
+ <name>softness</name>
311
+ <valuemin>0</valuemin>
312
+ <valuemax>100</valuemax>
313
+ <value>10</value>
314
+ </parameter>
315
+ <parameter>
316
+ <parameterid>opacity</parameterid>
317
+ <name>opacity</name>
318
+ <valuemin>0</valuemin>
319
+ <valuemax>100</valuemax>
320
+ <value>50</value>
321
+ </parameter>
322
+ </effect>
323
+ </filter>
324
+ <filter>
325
+ <enabled>FALSE</enabled>
326
+ <effect>
327
+ <name>Motion Blur</name>
328
+ <effectid>motionblur</effectid>
329
+ <effectcategory>motion</effectcategory>
330
+ <effecttype>motion</effecttype>
331
+ <mediatype>video</mediatype>
332
+ <parameter>
333
+ <parameterid>duration</parameterid>
334
+ <name>% Blur</name>
335
+ <valuemin>0</valuemin>
336
+ <valuemax>1000</valuemax>
337
+ <value>500</value>
338
+ </parameter>
339
+ <parameter>
340
+ <parameterid>samples</parameterid>
341
+ <name>Samples</name>
342
+ <valuemin>1</valuemin>
343
+ <valuemax>16</valuemax>
344
+ <value>4</value>
345
+ </parameter>
346
+ </effect>
347
+ </filter>
348
+ <filter>
349
+ <effect>
350
+ <name>Crop</name>
351
+ <effectid>crop</effectid>
352
+ <effectcategory>motion</effectcategory>
353
+ <effecttype>motion</effecttype>
354
+ <mediatype>video</mediatype>
355
+ <parameter>
356
+ <parameterid>left</parameterid>
357
+ <name>left</name>
358
+ <valuemin>0</valuemin>
359
+ <valuemax>100</valuemax>
360
+ <value>0</value>
361
+ </parameter>
362
+ <parameter>
363
+ <parameterid>right</parameterid>
364
+ <name>right</name>
365
+ <valuemin>0</valuemin>
366
+ <valuemax>100</valuemax>
367
+ <value>0</value>
368
+ </parameter>
369
+ <parameter>
370
+ <parameterid>top</parameterid>
371
+ <name>top</name>
372
+ <valuemin>0</valuemin>
373
+ <valuemax>100</valuemax>
374
+ <value>0</value>
375
+ </parameter>
376
+ <parameter>
377
+ <parameterid>bottom</parameterid>
378
+ <name>bottom</name>
379
+ <valuemin>0</valuemin>
380
+ <valuemax>100</valuemax>
381
+ <value>0</value>
382
+ </parameter>
383
+ <parameter>
384
+ <parameterid>edgefeather</parameterid>
385
+ <name>edgefeather</name>
386
+ <valuemin>0</valuemin>
387
+ <valuemax>100</valuemax>
388
+ <value>0</value>
389
+ </parameter>
390
+ </effect>
391
+ </filter>
392
+ <filter>
393
+ <effect>
394
+ <name>Distort</name>
395
+ <effectid>deformation</effectid>
396
+ <effectcategory>motion</effectcategory>
397
+ <effecttype>motion</effecttype>
398
+ <mediatype>video</mediatype>
399
+ <parameter>
400
+ <parameterid>ulcorner</parameterid>
401
+ <name>Upper Left</name>
402
+ <value>
403
+ <horiz>-0.5</horiz>
404
+ <vert>-0.5</vert>
405
+ </value>
406
+ </parameter>
407
+ <parameter>
408
+ <parameterid>urcorner</parameterid>
409
+ <name>Upper Right</name>
410
+ <value>
411
+ <horiz>0.5</horiz>
412
+ <vert>-0.5</vert>
413
+ </value>
414
+ </parameter>
415
+ <parameter>
416
+ <parameterid>lrcorner</parameterid>
417
+ <name>Lower Right</name>
418
+ <value>
419
+ <horiz>0.5</horiz>
420
+ <vert>0.5</vert>
421
+ </value>
422
+ </parameter>
423
+ <parameter>
424
+ <parameterid>llcorner</parameterid>
425
+ <name>Lower Left</name>
426
+ <value>
427
+ <horiz>-0.5</horiz>
428
+ <vert>0.5</vert>
429
+ </value>
430
+ </parameter>
431
+ <parameter>
432
+ <parameterid>aspect</parameterid>
433
+ <name>Aspect</name>
434
+ <valuemin>-10000</valuemin>
435
+ <valuemax>10000</valuemax>
436
+ <value>0</value>
437
+ </parameter>
438
+ </effect>
439
+ </filter>
440
+ <filter>
441
+ <effect>
442
+ <name>Opacity</name>
443
+ <effectid>opacity</effectid>
444
+ <effectcategory>motion</effectcategory>
445
+ <effecttype>motion</effecttype>
446
+ <mediatype>video</mediatype>
447
+ <parameter>
448
+ <parameterid>opacity</parameterid>
449
+ <name>opacity</name>
450
+ <valuemin>0</valuemin>
451
+ <valuemax>100</valuemax>
452
+ <value>100</value>
453
+ </parameter>
454
+ </effect>
455
+ </filter>
456
+ <filter>
457
+ <effect>
458
+ <name>Time Remap</name>
459
+ <effectid>timeremap</effectid>
460
+ <effectcategory>motion</effectcategory>
461
+ <effecttype>motion</effecttype>
462
+ <mediatype>video</mediatype>
463
+ <parameter>
464
+ <parameterid>variablespeed</parameterid>
465
+ <name>variablespeed</name>
466
+ <valuemin>0</valuemin>
467
+ <valuemax>1</valuemax>
468
+ <value>1</value>
469
+ </parameter>
470
+ <parameter>
471
+ <parameterid>mappedduration</parameterid>
472
+ <name>mappedduration</name>
473
+ <value>
474
+ <timecode>
475
+ <rate>
476
+ <timebase>0</timebase>
477
+ </rate>
478
+ <string>0</string>
479
+ <frame>0</frame>
480
+ <displayformat>NDF</displayformat>
481
+ </timecode>
482
+ </value>
483
+ </parameter>
484
+ <parameter>
485
+ <parameterid>speed</parameterid>
486
+ <name>speed</name>
487
+ <valuemin>-100000</valuemin>
488
+ <valuemax>100000</valuemax>
489
+ <value>100</value>
490
+ </parameter>
491
+ <parameter>
492
+ <parameterid>reverse</parameterid>
493
+ <name>reverse</name>
494
+ <value>FALSE</value>
495
+ </parameter>
496
+ <parameter>
497
+ <parameterid>frameblending</parameterid>
498
+ <name>frameblending</name>
499
+ <value>TRUE</value>
500
+ </parameter>
501
+ <parameter>
502
+ <parameterid>graphdict</parameterid>
503
+ <name>graphdict</name>
504
+ <valuemin>0</valuemin>
505
+ <valuemax>100</valuemax>
506
+ <keyframe>
507
+ <when>0</when>
508
+ <value>0</value>
509
+ <speedkfstart>TRUE</speedkfstart>
510
+ <speedvirtualkf>TRUE</speedvirtualkf>
511
+ <origvalue>0</origvalue>
512
+ </keyframe>
513
+ <keyframe>
514
+ <when>12</when>
515
+ <value>12</value>
516
+ <speedkfin>TRUE</speedkfin>
517
+ <speedvirtualkf>TRUE</speedvirtualkf>
518
+ <origvalue>12</origvalue>
519
+ </keyframe>
520
+ <keyframe>
521
+ <when>28</when>
522
+ <value>14</value>
523
+ </keyframe>
524
+ <keyframe>
525
+ <when>40</when>
526
+ <value>27</value>
527
+ </keyframe>
528
+ <keyframe>
529
+ <when>45</when>
530
+ <value>31</value>
531
+ </keyframe>
532
+ <keyframe>
533
+ <when>52</when>
534
+ <value>40</value>
535
+ </keyframe>
536
+ <keyframe>
537
+ <when>58</when>
538
+ <value>42</value>
539
+ </keyframe>
540
+ <keyframe>
541
+ <when>62</when>
542
+ <value>62</value>
543
+ <speedkfout>TRUE</speedkfout>
544
+ <speedvirtualkf>TRUE</speedvirtualkf>
545
+ <origvalue>62</origvalue>
546
+ </keyframe>
547
+ <keyframe>
548
+ <when>100</when>
549
+ <value>100</value>
550
+ <speedkfend>TRUE</speedkfend>
551
+ <speedvirtualkf>TRUE</speedvirtualkf>
552
+ <origvalue>100</origvalue>
553
+ </keyframe>
554
+ <interpolation>
555
+ <name>FCPCurve</name>
556
+ </interpolation>
557
+ <value>100</value>
558
+ </parameter>
559
+ </effect>
560
+ </filter>
561
+ <sourcetrack>
562
+ <mediatype>video</mediatype>
563
+ </sourcetrack>
564
+ <fielddominance>lower</fielddominance>
565
+ <itemhistory>
566
+ <uuid>31AD199E-84E0-4835-BD17-2893D057D4B0</uuid>
567
+ </itemhistory>
568
+ </clipitem>
569
+ <clipitem id="ConuntDown-RSZ4">
570
+ <name>ConuntDown-RSZ</name>
571
+ <duration>100</duration>
572
+ <rate>
573
+ <ntsc>FALSE</ntsc>
574
+ <timebase>25</timebase>
575
+ </rate>
576
+ <in>27</in>
577
+ <out>100</out>
578
+ <start>50</start>
579
+ <end>123</end>
580
+ <pixelaspectratio>PAL-601</pixelaspectratio>
581
+ <enabled>TRUE</enabled>
582
+ <anamorphic>FALSE</anamorphic>
583
+ <alphatype>none</alphatype>
584
+ <masterclipid>ConuntDown-RSZ</masterclipid>
585
+ <logginginfo>
586
+ <scene>
587
+ </scene>
588
+ <shottake>
589
+ </shottake>
590
+ <lognote>
591
+ </lognote>
592
+ <good>FALSE</good>
593
+ </logginginfo>
594
+ <labels>
595
+ <label2>
596
+ </label2>
597
+ </labels>
598
+ <comments>
599
+ <mastercomment1>
600
+ </mastercomment1>
601
+ <mastercomment2>
602
+ </mastercomment2>
603
+ <mastercomment3>
604
+ </mastercomment3>
605
+ <mastercomment4>
606
+ </mastercomment4>
607
+ </comments>
608
+ <file id="ConuntDown-RSZ2"/>
609
+ <sourcetrack>
610
+ <mediatype>video</mediatype>
611
+ </sourcetrack>
612
+ <fielddominance>lower</fielddominance>
613
+ <itemhistory>
614
+ <uuid>4B5B9F3E-F626-4DCB-83E0-286BBA7C1B19</uuid>
615
+ </itemhistory>
616
+ </clipitem>
617
+ <clipitem id="ConuntDown-RSZ5">
618
+ <name>ConuntDown-RSZ</name>
619
+ <duration>80</duration>
620
+ <rate>
621
+ <ntsc>FALSE</ntsc>
622
+ <timebase>25</timebase>
623
+ </rate>
624
+ <in>21</in>
625
+ <out>80</out>
626
+ <start>123</start>
627
+ <end>182</end>
628
+ <pixelaspectratio>PAL-601</pixelaspectratio>
629
+ <enabled>TRUE</enabled>
630
+ <anamorphic>FALSE</anamorphic>
631
+ <alphatype>none</alphatype>
632
+ <masterclipid>ConuntDown-RSZ</masterclipid>
633
+ <logginginfo>
634
+ <scene>
635
+ </scene>
636
+ <shottake>
637
+ </shottake>
638
+ <lognote>
639
+ </lognote>
640
+ <good>FALSE</good>
641
+ </logginginfo>
642
+ <labels>
643
+ <label2>
644
+ </label2>
645
+ </labels>
646
+ <comments>
647
+ <mastercomment1>
648
+ </mastercomment1>
649
+ <mastercomment2>
650
+ </mastercomment2>
651
+ <mastercomment3>
652
+ </mastercomment3>
653
+ <mastercomment4>
654
+ </mastercomment4>
655
+ </comments>
656
+ <file id="ConuntDown-RSZ2"/>
657
+ <filter>
658
+ <effect>
659
+ <name>Time Remap</name>
660
+ <effectid>timeremap</effectid>
661
+ <effectcategory>motion</effectcategory>
662
+ <effecttype>motion</effecttype>
663
+ <mediatype>video</mediatype>
664
+ <parameter>
665
+ <parameterid>variablespeed</parameterid>
666
+ <name>variablespeed</name>
667
+ <valuemin>0</valuemin>
668
+ <valuemax>1</valuemax>
669
+ <value>0</value>
670
+ </parameter>
671
+ <parameter>
672
+ <parameterid>mappedduration</parameterid>
673
+ <name>mappedduration</name>
674
+ <value>
675
+ <timecode>
676
+ <rate>
677
+ <timebase>0</timebase>
678
+ </rate>
679
+ <string>0</string>
680
+ <frame>0</frame>
681
+ <displayformat>NDF</displayformat>
682
+ </timecode>
683
+ </value>
684
+ </parameter>
685
+ <parameter>
686
+ <parameterid>speed</parameterid>
687
+ <name>speed</name>
688
+ <valuemin>-100000</valuemin>
689
+ <valuemax>100000</valuemax>
690
+ <value>123.729</value>
691
+ </parameter>
692
+ <parameter>
693
+ <parameterid>reverse</parameterid>
694
+ <name>reverse</name>
695
+ <value>FALSE</value>
696
+ </parameter>
697
+ <parameter>
698
+ <parameterid>frameblending</parameterid>
699
+ <name>frameblending</name>
700
+ <value>TRUE</value>
701
+ </parameter>
702
+ <parameter>
703
+ <parameterid>graphdict</parameterid>
704
+ <name>graphdict</name>
705
+ <valuemin>0</valuemin>
706
+ <valuemax>100</valuemax>
707
+ <keyframe>
708
+ <when>0</when>
709
+ <value>0</value>
710
+ <speedkfstart>TRUE</speedkfstart>
711
+ <speedvirtualkf>TRUE</speedvirtualkf>
712
+ <origvalue>0</origvalue>
713
+ </keyframe>
714
+ <keyframe>
715
+ <when>21</when>
716
+ <value>27</value>
717
+ <speedkfin>TRUE</speedkfin>
718
+ <speedvirtualkf>TRUE</speedvirtualkf>
719
+ <origvalue>27</origvalue>
720
+ </keyframe>
721
+ <keyframe>
722
+ <when>80</when>
723
+ <value>100</value>
724
+ <speedkfout>TRUE</speedkfout>
725
+ <speedvirtualkf>TRUE</speedvirtualkf>
726
+ <origvalue>100</origvalue>
727
+ </keyframe>
728
+ <interpolation>
729
+ <name>FCPCurve</name>
730
+ </interpolation>
731
+ <value>27</value>
732
+ </parameter>
733
+ </effect>
734
+ </filter>
735
+ <sourcetrack>
736
+ <mediatype>video</mediatype>
737
+ </sourcetrack>
738
+ <fielddominance>lower</fielddominance>
739
+ <itemhistory>
740
+ <uuid>0F64B420-B9A5-4D82-A0FD-C26FFF932856</uuid>
741
+ </itemhistory>
742
+ </clipitem>
743
+ <enabled>TRUE</enabled>
744
+ <locked>FALSE</locked>
745
+ </track>
746
+ </video>
747
+ <audio>
748
+ <format>
749
+ <samplecharacteristics>
750
+ <depth>16</depth>
751
+ <samplerate>48000</samplerate>
752
+ </samplecharacteristics>
753
+ </format>
754
+ <outputs>
755
+ <group>
756
+ <index>1</index>
757
+ <numchannels>2</numchannels>
758
+ <downmix>0</downmix>
759
+ <channel>
760
+ <index>1</index>
761
+ </channel>
762
+ <channel>
763
+ <index>2</index>
764
+ </channel>
765
+ </group>
766
+ </outputs>
767
+ <in>-1</in>
768
+ <out>-1</out>
769
+ <track>
770
+ <enabled>TRUE</enabled>
771
+ <locked>FALSE</locked>
772
+ <outputchannelindex>1</outputchannelindex>
773
+ </track>
774
+ <track>
775
+ <enabled>TRUE</enabled>
776
+ <locked>FALSE</locked>
777
+ <outputchannelindex>2</outputchannelindex>
778
+ </track>
779
+ <track>
780
+ <enabled>TRUE</enabled>
781
+ <locked>FALSE</locked>
782
+ <outputchannelindex>1</outputchannelindex>
783
+ </track>
784
+ <track>
785
+ <enabled>TRUE</enabled>
786
+ <locked>FALSE</locked>
787
+ <outputchannelindex>2</outputchannelindex>
788
+ </track>
789
+ <filter>
790
+ <effect>
791
+ <name>Audio Levels</name>
792
+ <effectid>audiolevels</effectid>
793
+ <effectcategory>audiolevels</effectcategory>
794
+ <effecttype>audiolevels</effecttype>
795
+ <mediatype>audio</mediatype>
796
+ <parameter>
797
+ <name>Level</name>
798
+ <parameterid>level</parameterid>
799
+ <valuemin>0</valuemin>
800
+ <valuemax>3.98109</valuemax>
801
+ <value>1</value>
802
+ </parameter>
803
+ </effect>
804
+ </filter>
805
+ </audio>
806
+ </media>
807
+ <ismasterclip>FALSE</ismasterclip>
808
+ </sequence>
809
+ </children>
810
+ </project>
811
+ </xmeml>
812
+