# -*- coding: utf-8 -*-
# 動画「ロボットの頭脳は、脳のように分かれるのか」— 考察回「壁打ちの型」の1本目(もとは LOG424)の場面
# 型の決まり: 動画/_ネタ帳/考察回_壁打ちの型/(台本たたき・絵コンテ・動きの試し)
# 紙(考察ノート)の文字は真ん中にそろえる/線を使わず面で分ける(事実=墨・エイイチの見立て=濃い灰・ハコブくん=薄い灰)
# 朱は判子とリアクション(遅っ・ボツ・この見立ては、エイイチから)だけ/字幕は今まで通り(出る・消えるだけ)
# 脱線(画面いっぱいの絵)は4回: 引退式(マンガ)・宇宙・コップ・紙の山(どれも Gemini で作った絵)
import os
from kabe_kit import *
import scene_kit as _sk
_tl = Timeline()
# 3版(2026-11-02)で足したつなぎの文。2版の番号 p の文の前に入れた。場面の中では、2版の番号か、この名前で時刻を書く
NEW = {"tsukkomi": 14, "musk_b": 15, "more_b": 28, "fail_b": 46, "sum_b": 62}
_INS = sorted(NEW.values())
def ix(i):
"""2版の番号(または NEW の名前)→ いまの番号"""
if isinstance(i, str):
return ix(NEW[i]) - 1
return i + sum(1 for p in _INS if p <= i)
class _TLx:
idx = _tl.idx
start = staticmethod(lambda i: _tl.start(ix(i)))
speech = staticmethod(lambda i: _tl.speech(ix(i)))
end = staticmethod(lambda i: _tl.end(ix(i)))
tl = _TLx
N = len(_tl.idx)
A = lambda i, off=0.0: tl.start(i) + off # 動画の頭からの秒
S = tl.speech # その文を読み終わるまでの長さ
LOGO = _sk.LOGO
BRAND = f'
'
SANS = "font-family:'Noto Sans CJK JP',sans-serif;"
BG = "src/bg/"
BLOCKS = []
def block(name, sents, fn, video=None):
sents = sorted([ix(o) for o in sents] + [ix(k) for k, p in NEW.items() if p in sents]) # いまの番号にする(足した文は、次の文の場面に入れる)
b0 = _tl.start(sents[0])
T = lambda i, off=0.0: tl.start(i) - b0 + off
E = lambda i: tl.end(i) - b0
b = dict(name=name, sents=sents)
if video:
b["video"] = video
else:
b["html"] = page(fn(T, E) + BRAND)
BLOCKS.append(b)
def line(text, t, size=30, weight=700, step=0.05, style=""):
return f'
{ink(text, t, step)}
'
def qline(text, t, size=46, step=0.06, style=""):
return f'{ink(text, t, step)}
'
# ================= 0 つかみ =================
def hook(T, E):
num = lambda v, t: (f''
f'{v} 秒
')
col = lambda v, t, lab, tl_: (f'{num(v, t)}'
f'
{ink(lab, tl_)}
')
return paper(tag("考察ノート") + ''
+ f'
{col("0.05", T(0, 0.15), "ロボット専用のAI", T(2, 0.3))}{col("18.6", T(0, 1.35), "何にでも使える大きなAI", T(2, 3.7))}
'
+ line("ロボットを動かすAIが、1回考えるのにかかる時間", T(1, 0.5), size=30, weight=500)
+ card("mi", ink("LLMは反応が遅い。動くものには、そのままでは使えない", T(3, 0.5), 0.04), T(3, 0.2), "見立て ・ エイイチ", w=820, anim="wipe")
+ card("hb", ink("僕の頭も、そっち側です", T(4, 1.3), 0.05), T(4, 1.2), "ハコブくん", w=520, style="font-size:30px")
+ '
', 0.0)
block("hook", [0, 1, 2, 3, 4], hook)
def hook_q(T, E):
return paper(tag("考察回 壁打ち") +
''
f'ロボットの
'
f'頭脳は、
'
f'脳のように
'
f'{land("分かれる", T(5, 2.0), "font-size:104px;font-weight:900")}のか。
', 0.0)
block("hook_q", [5], hook_q)
# ================= 1 自己紹介(DAY124 の映像とテロップ) =================
O_TITLE = '
フィジカルAI解説
案内役:ハコブくん(AI音声)
'
O_EIICHI = '
エイイチ
デザイナー/ロボティクスの研究・開発
'
O_OUTRO = '
相談は概要欄の連絡先から
高評価・チャンネル登録/コメントはエイイチが全部読んでいます
'
OVERLAYS = {"title": _sk.overlay(O_TITLE), "title_eiichi": _sk.overlay(O_EIICHI), "outro": _sk.overlay(O_OUTRO)}
_t_title = tl.end(7) - tl.start(6)
block("title", [6, 7], None, video=("src/day124_crop.mp4", 4.5, "png/ovl/title.png"))
block("title_eiichi", [8], None, video=("src/day124_crop.mp4", 4.5 + _t_title, "png/ovl/title_eiichi.png"))
def title_kabe(T, E):
return paper(tag("考察回") + ''
+ f'
{land("壁打ち", T(9, 0.5))}
'
+ line("エイイチの考えに、ハコブくんが付き合う", T(9, 1.3), size=34, weight=500)
+ '
', 0.0)
block("title_kabe", [9], title_kabe)
# ================= 2 持ち込み =================
def bring(T, E):
fly = (T(13, 3.2), E(13) - 0.15)
return (dassen(BG + "引退式.jpg", fly[0] + 0.05, fly[1],
words="祝・引退", word_style="top:212px;left:820px;right:auto;width:660px;transform:rotate(-1deg);font-size:78px;color:#141311;-webkit-text-stroke:0;text-shadow:none",
src_note="絵は生成AI(Gemini)で作成")
+ paper(tag("持ち込み") + ''
+ line("夜、エイイチから 画面写真が7枚", T(10, 0.3), size=28, weight=500)
+ qline("ロボット専用の大きな頭脳は、いらなくなる?", T(11, 3.0))
+ card("fact", ink("何にでも使える大きなAIが、追加の練習なしで、ブロックを器に入れた", T(12, 0.5), 0.035), T(12, 0.2), "海外の投資家の書き込み", w=860)
+ card("hb", "π0.5 は、引退", T(13, 0.6), "ハコブくん", w=420, botsu=T("tsukkomi", 0.7), fade=T("tsukkomi", 0.9), style="font-size:30px")
+ card("mi", ink("汎用モデルも、使い所次第。組み合わせになる", T(14, 0.5), 0.045), T(14, 0.2), "見立て ・ エイイチ", w=820, anim="wipe")
+ '
' + f'出どころ:Robonomics「Robotics\' New Era After Astra」
',
0.0, flights=[fly])
+ stamp("まだ現役", T("tsukkomi", 0.1), "right:380px;top:470px;font-size:44px")
+ shake_js([(T("tsukkomi", 0.42), 0.25)]))
block("bring", [10, 11, 12, 13, 14], bring)
def musk(T, E):
fly = (T(16, -0.15), T(18, 0.0))
return (dassen(BG + "宇宙.jpg", fly[0] + 0.1, fly[1] - 0.05, words="超知能の|
|ほぼ100%は|
|!深宇宙|で計算。",
word_style="top:230px;font-size:104px", src_note="出どころ:イーロン・マスクさんの X の投稿(2026-10-27)/絵は生成AI(Gemini)")
+ paper(tag("そのころ") + ''
+ qline("イーロン・マスクさんの投稿", T(15, 1.6))
+ line("この話の少し前の、別の投稿", T(15, 2.6), size=26, weight=500, style="color:#5a564f")
+ card("fact", '超知能の、ほぼ100%は、深宇宙で計算される。明らかに。
"~100% of SI will be deep space compute. Obviously."
',
T(18, 0.45), "訳", w=860, style="font-size:30px")
+ card("hb", "宇宙は、今日は置いておく", T(18, 1.1), "ハコブくん", w=520, style="font-size:30px")
+ '
', 0.0, flights=[fly]))
block("musk", [15, 16, 17, 18], musk)
# ================= 3 やり取り1:遅い頭 =================
def think(T, E):
c0, c1 = T(19, 0.3), T(20, -0.1)
return (paper(tag("やり取り 1 / 考え中") + ''
+ f'
ハコブくん 考え中
'
+ f'
0.0{land("秒", T(20, 0.05), "font-size:100px")}
'
+ line("大きなAIなら、1回考えるのに、だいたいこのくらい", T(22, 0.5), size=34, weight=500, style="margin-top:24px")
+ '
', 0.0)
+ stamp("遅っ", T(21, 0.0), "right:350px;top:560px;font-size:64px")
+ counter_js("cnt", c0, c1, 18.6) + shake_js([(T(21, 0.3), 0.3)]))
block("think", [19, 20, 21, 22], think)
def cup(T, E):
return (dassen(BG + "コップ.jpg", T(24, 0.2), E(24) + 5, words="考え中……", word_style="top:120px;font-size:120px",
src_note="絵は生成AI(Gemini)で作成")
+ paper(tag("その間に") + ''
+ line("π0.5 が、動きを直せる回数", T(23, 0.4), size=32, weight=700)
+ f'
0{land("回ほど", T(23, 3.0), "font-size:80px")}
'
+ line("18.6秒 ÷ 0.05秒", T(23, 3.3), size=26, weight=500, style="color:#8a857c")
+ '
', 0.0, flights=[(T(24, 0.1), E(24) + 9)])
+ counter_js("c370", T(23, 1.0), T(23, 2.9), 370, dec=0))
block("cup", [23, 24], cup)
def detail(T, E):
c = lambda n, v, t: card("fact", f'{v} 秒', t, f"使い方 {n}", w=250, fade=T(26, 0.3))
return paper(tag("ちなみに") + ''
+ f'
{c(1, "11.5", T(25, 1.0))}{c(2, "13.4", T(25, 1.4))}{c(3, "18.6", T(25, 1.8))}
'
+ line("使い方によって、11秒から19秒まで", T(25, 3.4), size=30, weight=500)
+ card("hb", 'ロボットのAIは脳のように分業する
pixelstomotors.com / LOG424
', T(27, 0.15), "サイトの記事", w=720, style="font-size:32px;margin-top:20px")
+ '
' + '出どころ:NVIDIA「Astranomy」(2026-10-14)
', 0.0)
block("detail", [25, 26, 27], detail)
def faster(T, E):
return paper(tag("やり取り 1 / 遅い頭") + ''
+ line("大きなAIだけでは、間に合わない", T("more_b", 0.4), size=32, weight=700)
+ card("mi", ink("もっと工夫が必要", T(28, 0.4), 0.06), T(28, 0.15), "見立て ・ エイイチ", w=600, anim="wipe")
+ card("hb", "AIは毎年賢くなる。そのうち速くなる", T(29, 0.6), "ハコブくん", w=640, botsu=T(31, 2.5), fade=T(31, 2.7), style="font-size:30px")
+ card("mi", ink("LLMの進化で、反応の速さは上がらないのでは", T(30, 0.4), 0.045), T(30, 0.15), "見立て ・ エイイチ", w=820, anim="wipe")
+ qline("……半分、おっしゃる通り", T(31, 1.6), size=44)
+ '
', 0.0)
block("faster", [28, 29, 30, 31], faster)
def faster2(T, E):
return paper(tag("ハコブくんの見立て") + ''
+ '
'
+ card("fact", ink("賢くなるほど、考える時間が長く", T(32, 1.0), 0.05), T(32, 0.5), "大きなAI", w=430)
+ card("hb", ink("速くなる", T(32, 9.9), 0.08), T(32, 9.6), "小さくした版", w=330, style="font-size:40px;font-weight:700")
+ '
' + line("と、僕は見ています", T(32, 6.8), size=26, weight=500, style="color:#5a564f")
+ '
', 0.0)
block("faster2", [32], faster2)
# ================= 4 山場:脳 =================
def split(T, E):
big = lambda a, b, t, k: (f''
f'{a}{b}
')
return paper(tag("だから") + ''
+ qline("分けるしかない", T(33, 0.3), size=52)
+ f'
{big("遅く考える", "頭", T(33, 2.4), "fact")}{big("速く直す", "手", T(33, 3.6), "fact")}
'
+ '
', 0.0)
block("split", [33], split)
def brain_ei(T, E):
return (''
''
''
'
'
f'人も、
'
f'{land("小脳", T(34, 1.0), "font-weight:900;font-size:80px")}と'
f'{land("大脳", T(34, 1.8), "font-weight:900;font-size:80px")}で、
'
f'役割が分かれている。
'
+ stamp("この見立ては、エイイチから", T(34, 4.6), "left:740px;top:740px")
+ shake_js([(T(34, 4.95), 0.3)]))
block("brain_ei", [34], brain_ei)
def brain(T, E):
row = lambda b, txt, t, extra="": (f'')
hl = T(39, 2.3)
return paper(tag("脳の分かれ方") + ''
+ row("大脳", "考えて決める所", T(36, 0.3))
+ row("小脳", "練習で覚えた動きを合わせる所", T(36, 2.9))
+ (f'
'
f'反射脳を通らずに、体を動かす脊髄
')
+ f'
'
+ card("fact", "ぶつかりそうになったら、止まる仕組み", T(41, 0.5), "ロボットの反射", w=760)
+ '
', 0.0)
block("brain", [35, 36, 37, 38, 39, 40, 41], brain)
def cerebellum(T, E):
return paper(tag("小脳") + ''
+ line("人の小脳の神経細胞は、考える大脳の表面の", T(42, 2.7), size=30, weight=500)
+ f'
{land("4倍", T(42, 5.8))}{land("ほど", T(42, 6.1))}
'
+ line("動きを合わせる所に、こんなに多く", T(43, 0.4), size=30, weight=500)
+ card("mi", ink("頭より、体のほうが忙しい", T(44, 0.4), 0.06), T(44, 0.15), "エイイチ", w=600, anim="wipe")
+ card("hb", "僕も、運ぶほうが忙しい", T(45, 0.6), "ハコブくん", w=520, style="font-size:30px")
+ '
' + '出どころ:Herculano-Houzel の研究(小脳と大脳皮質の神経細胞の数)
', 0.0)
block("cerebellum", [42, 43, 44, 45], cerebellum)
# ================= 5 やり取り2:失敗の手直し =================
FALL_T = None
def fail(T, E):
tf = T(48, S(48) + 0.15)
return (paper(tag("やり取り 2 / 失敗の手直し") + ''
+ qline("忙しい小脳は、どう育つ?", T("fail_b", 0.4), size=40)
+ card("mi", ink("失敗を手直しするデータの積み重ねは、思っている以上に大事", T(46, 0.5), 0.04), T(46, 0.2), "見立て ・ エイイチ", w=860, anim="wipe")
+ card("fact", ink("転びかけて、持ち直す → 考えずに乗れる", T(47, 0.8), 0.045), T(47, 0.4), "自転車", w=760)
+ card("hb", "小脳を鍛えるため、毎晩転ぶ", T(48, 1.6), "ハコブくん", w=560, botsu=T(49, 1.4), fade=T(49, 1.6), style="font-size:30px")
+ card("mi", ink("失敗だけ覚えちゃって、良くない", T(49, 0.4), 0.05), T(49, 0.15), "見立て ・ エイイチ", w=640, anim="wipe")
+ '
', 0.0)
+ f'ドテッ
'
+ shake_js([(tf + 0.3, 0.25)]))
block("fail", [46, 47, 48, 49, 50], fail)
def three(T, E):
lab = lambda txt, t: f'{ink(txt, t, 0.05)}
'
seg = lambda txt, w, bg, fg, t, fade=None: (
f'{txt}
')
rule = lambda txt, t, style="": f'{land(txt, t)}
'
return paper(tag("記録を、3つの時点で切る") + ''
+ '
'
+ f'
{lab("① 失敗した瞬間", T(51, 3.4))}
'
+ f'
{lab("② 手直しを始めた瞬間", T(51, 4.8))}
'
+ f'
{lab("③ 戻った瞬間", T(51, 6.3))}
'
+ '
'
+ seg("失敗の区間", 260, "#cfc8ba", "#22201c", T(51, 3.6), fade=T(52, 0.9))
+ seg("手直しの区間", 400, "#22201c", "#f5f3ee", T(51, 5.0))
+ seg("戻ったあと", 260, "#ece9e2", "#22201c", T(51, 6.5)) + '
'
+ '
'
+ f'
{rule("学ばせない", T(52, 0.6), "color:#8a857c")}
'
+ f'
{rule("重く学ばせる", T(52, 2.4), "font-size:38px;font-weight:900")}
'
+ '
'
+ '
'
+ card("fact", "何度も失敗する場所には、きれいなお手本を足す", T(52, 4.9), "もう1つ", w=900)
+ '
', 0.0)
block("three", [51, 52], three)
def web(T, E):
return paper(tag("汎用AIに、いちばん足りないもの") + ''
+ qline("インターネットの動画には、", T(53, 0.3), size=46)
+ f'
{land("持ち直す場面", T(53, 2.0), "font-size:64px;font-weight:900")}{ink("が、ほとんど写っていない", T(53, 2.6), 0.06)}
'
+ '
'
+ card("mi", ink("これ、今おれがやってる", T(54, 0.4), 0.06), T(54, 0.15), "エイイチ", w=560, anim="wipe")
+ '
', 0.0)
block("web", [53, 54], web)
# ================= 6 やり取り3:記憶の整理 =================
LOG_DASSEN = None
def log(T, E):
d0, d1 = T(55, 7.2), T(56, -0.05)
return (dassen(BG + "紙の山.jpg", d0 + 0.05, d1 - 0.05, words="!424|本", word_style="top:120px;font-size:150px",
src_note="絵は生成AI(Gemini)で作成")
+ paper(tag("やり取り 3 / 記憶の整理") + ''
+ f'
LOG 0
'
+ line("全部、全文で残している", T(55, 2.2), size=30, weight=500)
+ '
'
+ card("mi", ink("LOGは、全部の積み重ね。基幹情報", T(56, 0.4), 0.05), T(56, 0.15), "見立て ・ エイイチ", w=760, anim="wipe")
+ card("mi", ink("情報がたくさんあるだけでは、言葉や動きは良くならない", T(57, 0.4), 0.04), T(57, 0.15), "見立て ・ エイイチ", w=860, anim="wipe")
+ '
', 0.0, flights=[(d0, d1)])
+ counter_js("c424", T(55, 3.9), T(55, 6.1), 424, dec=0))
block("log", [55, 56, 57], log)
def hippo(T, E):
col = lambda lab, body, chip, t1, t2: (
f''
+ card("fact", ink(body, t1 + 0.3, 0.05), t1, lab, w=380)
+ f'
{chip}
')
return paper(tag("脳の整理") + ''
+ '
'
+ col("海馬", "その日の出来事を、いったん残す", "記事の全文", T(58, 2.0), T(59, 0.5))
+ f'
{ink("眠っている間に", T(58, 4.6), 0.06)}
{land("→", T(58, 5.6), "font-size:40px")}
'
+ col("大脳の表面", "大事なものが、移っていく", "整理した記事", T(58, 6.3), T(59, 2.3))
+ '
'
+ card("mi", ink("残す基準は、まだまだこれから", T(60, 0.4), 0.05), T(60, 0.15), "見立て ・ エイイチ", w=640, anim="wipe")
+ card("hb", "残した理由を、一言ずつ書いておく", T(61, 0.6), "ハコブくん", w=600, style="font-size:30px")
+ '
', 0.0)
block("hippo", [58, 59, 60, 61], hippo)
# ================= 7 まとめ =================
SUM_CSS = """@keyframes gather { from { opacity:0; transform: translate(var(--dx),var(--dy)) rotate(var(--r)); } to { opacity:1; transform: none; } }"""
def summ(T, E):
row = lambda b, mid, right, dx, dy, r, t: (f'{b}{mid}{right}
')
b3 = lambda txt, t: card("hb", txt, t, None, w=250, botsu=t + 0.25, style="font-size:24px;padding:12px 16px")
return (''
+ paper(tag("残したもの") + ''
+ row("大脳", "何にでも使える大きなAI", "遅く考える", 420, 420, 8, 0.3)
+ row("小脳", "π0.5 のような専用のAI", "速く直す", 300, -60, -6, 0.45)
+ row("反射", "ぶつかる前に止まる仕組み", "考える前に", -420, 180, 10, 0.6)
+ f'
'
f'{ink("速い手を育てるのは、", T(62, 2.6), 0.06)}
{land("失敗を手直しした記録。", T(62, 4.0), "font-size:56px")}
'
+ f'
{b3("π0.5 は引退", T(63, 1.0))}{b3("そのうち速くなる", T(63, 1.4))}{b3("毎晩転ぶ", T(63, 1.8))}
'
+ '
', 0.0))
block("sum", [62, 63], summ)
# ================= 8 残った問い =================
def rest(T, E):
return paper(tag("残った問い") + ''
+ qline("手直しの区間を分けて学ばせたら、", T(64, 2.0), size=44)
+ qline("戻れる率は、どれだけ変わるか。", T(64, 4.3), size=44)
+ line("続きは、机の上の実験で確かめる", T(64, 7.4), size=28, weight=500, style="color:#5a564f;margin-top:6px")
+ '
'
+ card("hb", 'このノートの全文
pixelstomotors.com / LOG424
', T(65, 0.3), "サイトの記事", w=600)
+ line("数字の出どころは、概要欄に", T(65, 3.4), size=26, weight=500, style="color:#5a564f")
+ '
', 0.0)
block("rest", [64, 65], rest)
def ask(T, E):
return paper(tag("あなたの現場では") + ''
+ qline("あなたの現場では、", T(66, 0.2), size=54)
+ qline("失敗の記録は、どこに", T(66, 1.3), size=54)
+ qline("残っていますか。", T(66, 2.4), size=54)
+ '
'
+ f'
ハコブくん 考え中
'
+ f'
{land("0.0秒", T(67, 1.2))}
'
+ '
', 0.0)
block("ask", [66, 67, 68], ask)
# ================= 9 アウトロ =================
block("outro", [69, 70, 71], None, video=("src/day124_crop.mp4", 18.0, "png/ovl/outro.png"))
assert [i for b in BLOCKS for i in b["sents"]] == list(range(N)), "場面の文の番号が抜けている・重なっている"
# ================= ハコブくん =================
# 表情は narration.py の表情が基本。ここは文の途中で替える所: (文, 文の頭から何秒, 何秒間, 表情)
HK_FACE = [
(3, 0.3, 6.5, "doubt"),
(13, 3.2, 3.0, "joy"), ("tsukkomi", 0.0, 1.8, "surprise"), (14, 0.0, 4.6, "trouble"),
(17, 0.0, 1.9, "smile"),
(21, 0.1, 1.3, "trouble"),
(24, 0.2, 5.6, "think"),
(26, 0.0, 2.4, "doubt"),
(28, 0.0, 2.4, "base"),
(30, 0.4, 4.2, "surprise"),
(31, 2.6, 2.6, "trouble"),
(34, 0.0, 7.0, "surprise"),
(38, S(38) + 0.85, 1.0, "x"),
(40, 0.0, 2.6, "doubt"),
(44, 0.0, 3.2, "joy"),
(46, 0.0, 6.0, "think"),
(48, S(48) + 0.1, 4.3, "x"),
(49, 0.0, 3.2, "x"),
(54, 0.4, 2.6, "smile"),
(56, 0.0, 8.4, "think"),
(60, 0.0, 3.1, "smile"),
(67, 0.0, 2.5, "smile"),
]
HK_FACE = [(A(i, a), A(i, a) + d, f) for i, a, d, f in HK_FACE]
# 体ごとの動き: jump=驚いて全身で飛び出す / fall=前のめりにコケる(up で起き上がる) / reflex=のけぞる
HK_MOVES = [
dict(kind="jump", t0=A(16, 0.25), dur=3.4),
dict(kind="jump", t0=A(35, 0.0), dur=1.9),
dict(kind="reflex", t0=A(38, S(38) + 0.85), dur=0.9),
dict(kind="fall", t0=A(48, S(48) + 0.1), t1=A(50, 0.0), dur=0.5),
]
HK_ALPHA = [(A(34, 0.0), tl.end(34), 0.3),
(A(13, 3.3), tl.end(13) - 0.15, 0.0)] # 引退式の絵には泣いているハコブくんが描いてあるので、重ねない # 暗い場面(エイイチの見立て)では薄く
# ================= エイイチ =================
# (文, 文の頭から何秒, 姿) 1腕組み 2うなずく 3指さす 4首をかしげる 5ひらめく 6のけぞって驚く 7半目でツッコむ 8吹き出して笑う
EI_POSE = [
(0, 0.0, 1), (3, 0.0, 3), (4, 0.0, 7), (4, 1.4, 1),
(8, 0.0, 2), (9, 0.0, 1),
(10, 0.0, 1), (12, 0.0, 4), (13, 3.2, 6), ("tsukkomi", 0.0, 7), (14, 0.0, 3),
(15, 0.0, 1), (16, 0.2, 6), (17, 0.0, 7), (18, 0.4, 1),
(19, 0.0, 1), (21, 0.0, 7), (22, 2.0, 1),
(23, 0.0, 4), (24, 3.0, 6), (25, 0.0, 1), (26, 0.0, 7), (27, 0.9, 2), ("more_b", 0.0, 1),
(28, 0.0, 3), (29, 1.5, 4), (30, 0.0, 3), (31, 0.0, 1), (32, 3.0, 2),
(33, 0.0, 1), (34, 0.0, 5), (35, 0.0, 6), (36, 0.0, 2),
(38, 0.0, 3), (40, 0.0, 4), (41, 1.0, 2),
(42, 0.0, 4), (43, 0.0, 2), (44, 0.0, 3), (45, 0.4, 8),
("fail_b", 0.0, 4), (46, 0.0, 3), (47, 0.0, 2), (48, S(48) + 0.3, 8), (49, 0.0, 7), (50, 0.5, 1),
(51, 0.0, 2), (53, 0.0, 4), (54, 0.0, 3),
(55, 0.0, 1), (55, 7.2, 6), (56, 0.0, 3), (57, 0.0, 1),
(58, 0.0, 4), (59, 0.0, 2), (60, 0.0, 3), (61, 0.0, 2),
("sum_b", 0.0, 2), (63, 0.8, 8),
(64, 0.0, 1), (65, 0.0, 2),
(66, 0.0, 1), (67, 0.0, 3), (68, 0.3, 8),
(69, 0.0, 2),
]
EI_POSE = sorted((A(i, a), p) for i, a, p in EI_POSE)
# 置き方の替え: (開始, 終了, 置き方)。hide=出さない / big=暗い場面で大きく光らせる / buried=紙の山に埋もれる
# slide=ハコブくんへ指を近づける(反射の実演)
EI_PLACE = [
(A(6), tl.end(7), "hide"),
(A(34), tl.end(34), "big"),
(A(55, 7.25), A(56, -0.05), "buried"),
(A(38, S(38) + 0.05), A(39, 1.4), "slide"),
]
# ================= 効果音 =================
# (文, 文の頭から何秒, 音, ナレーションより何dB)
SE = [
(13, 3.2, "se_whoosh", -10), ("tsukkomi", 0.1, "se_pop", -8), ("tsukkomi", 0.7, "se_pop", -12),
(16, -0.15, "se_whoosh", -10), (18, 0.0, "se_whoosh", -14),
(21, 0.0, "se_pop", -8),
(24, 0.1, "se_whoosh", -10),
(31, 2.5, "se_pop", -12),
(34, 4.6, "se_pop", -8),
(35, 0.0, "se_rise", -10),
(38, S(38) + 0.85, "se_pop", -10),
(48, S(48) + 0.1, "se_whoosh", -12), (48, S(48) + 0.45, "se_pop", -6), (49, 1.4, "se_pop", -12),
(55, 7.2, "se_whoosh", -10), (56, -0.05, "se_whoosh", -14),
(63, 1.25, "se_pop", -14), (63, 1.65, "se_pop", -14), (63, 2.05, "se_pop", -14),
(67, 1.2, "se_ding", -12),
] + [(19, 0.3 + k, "se_tick", -16) for k in range(6)]
SE = [(ix(i), off, f, lv) for i, off, f, lv in SE] # audio_mix.py はいまの番号で読む
# 一覧の画像に撮る時刻(場面の頭からの秒)。書かない場面は最後の0.4秒前
def _rel(b, i, off=0.0):
return tl.start(i) - _tl.start(b["sents"][0]) + off
SHEET = {}
for _b in BLOCKS:
_end = _tl.end(_b["sents"][-1]) - _tl.start(_b["sents"][0]) - 0.4
SHEET[_b["name"]] = [_end]
_B = {b["name"]: b for b in BLOCKS}
SHEET["bring"] = [_rel(_B["bring"], 13, 2.0), _rel(_B["bring"], 13, 4.4), SHEET["bring"][0]]
SHEET["musk"] = [_rel(_B["musk"], 16, 1.6), _rel(_B["musk"], 17, 0.5), SHEET["musk"][0]]
SHEET["think"] = [_rel(_B["think"], 19, 3.0), SHEET["think"][0]]
SHEET["cup"] = [_rel(_B["cup"], 23, 4.0), SHEET["cup"][0]]
SHEET["brain"] = [_rel(_B["brain"], 35, 0.5), _rel(_B["brain"], 38, S(38) + 0.9), SHEET["brain"][0]]
SHEET["fail"] = [_rel(_B["fail"], 48, S(48) + 0.8), SHEET["fail"][0]]
SHEET["log"] = [_rel(_B["log"], 55, 8.5), SHEET["log"][0]]
SHEET["title"] = [2.0]