読者です 読者をやめる 読者になる 読者になる

フシギにステキな素早いヤバさ

フシギにステキな素早いヤバさを追いかけて。俺は行くだろう。

FCPXMLから、ノンドロップタイムコードを導く計算式

CalcaというMacアプリを使っています。

Markdownを使って書けるテキストエディタみたいなものなのですが、計算をして表示してくれる機能があって、良いです。簡単なプログラミングツールみたいになります。

安定性と、日本語との相性はあんまりよくなさそうですが。

このアプリで、FCPXMLからチャプターマーカーのタイムコード(なんか分数で表記されています)を取り出して、HH:MM:SS:FFの形式で表記し直す方法を考えております。

そのXMLではこんな感じで表記されているのです。

<chapter-marker start="727727/7500s" duration="2002/60000s" value="チャプタ 2" posterOffset="11/30s"/>

<chapter-marker start="1940939/2500s" duration="2002/60000s" value="チャプタ 3" posterOffset="11/30s"/>

<chapter-marker start="39976937/15000s" duration="2002/60000s" value="チャプタ 4" posterOffset="11/30s"/>

<chapter-marker start="72563491/15000s" duration="2002/60000s" value="チャプタ 5" posterOffset="11/30s"/>

<chapter-marker start="223290067/30000s" duration="2002/60000s" value="チャプタ 6" posterOffset="11/30s"/>

Final Cut Pro X XML Format: About Final Cut Pro X XML Version 1.3

ノンドロップフレームタイムコードの計算

関数の定義

frames(x) = x / duration

ff(x) = frames(x) mod frame

seconds(x) = (frames(x) - ff(x)) / frame

ss(x) = seconds(x) mod second

minutes(x) = (seconds(x) - ss(x)) / second

mm(x) = minutes(x) mod minute

hours(x) = (minutes(x) - mm(x)) / minute

hh(x) = hours(x) mod hour

ここがまとめの関数です。

f(x) =
let duration = 2002/60000 in
let frame = 30 in
let second = 60 in
let minute = 60 in
let hour = 60 in
[hh(x),mm(x),ss(x),ff(x)]

計算の実行

c1 = f(727727/7500) => [0, 1, 36, 28]

c2 = f(1940939/2500) => [0, 12, 55, 18]

c3 = f(37037/80) => [0, 7, 42, 15]

c5 = f(39976937/15000) => [0, 44, 22, 14]

c6 = f(72563491/15000) => [1, 20, 32, 22]

c7 = f(223290067/30000) => [2, 3, 55, 17]

ドロップフレームタイムコードの計算

これの計算式がうまく思いつきません。

誰か教えてください。