framecurve 1.0.2 → 2.0.0

Sign up to get free protection for your applications and to get access to all the features.
@@ -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
+