HARU / NO CENTER OFFICIAL MUSIC VIDEO · 2026SONG 0:04.034 BAR 03 · INTRO · AFTER EFFECTSCENTER: NOT FOUND3840 × 2160 · 30 FPS · 128.25 BPMCASE STUDY · 2:12
Case study制作事例
HARU「NO CENTER」
中心なんて 最初から 無かったでしょう
There was never a center to begin with, was there?
A measuring world,and the girl who spills out of it.
すべてを測る世界と、そこからはみ出す少女。
HARU 「NO CENTER」 is an original song and music video by ASTRA MOTION. We wrote the lyrics, designed the character, produced the reference track and directed every frame — then turned each decision into a rule that could be measured, checked and rendered at native 4K.
128.25BPMBeat grid from kick and snare onsets · 69 bars · 18 sections
4+1Colour worlds, plus one accent that survives every grade
611080p character takes · 49 FHD + 12 V2V remasters
290Frames of After Effects intro, built entirely by script
51.7sOf the song set in a Blender world · 40 %
0Misaligned cuts in the final sync check
3840×2160Native render · only the character takes are upscaled
01Conceptコンセプト
One lyricbecame the rule.
ひとつの歌詞が、映像のルールになった。
The pre-chorus asks a question, and the film answers it with a rule: the centre is empty. A measuring HUD keeps looking for it — CENTER: NOT FOUND — and HARU never stands in it.
AI doesn't know the beauty we see, hear and feel, so we translate it into numbers — a colour temperature for a sunset, a BPM for the bar that takes our breath away. The film stages that translation: a paper city that measures, averages and centres everything, and a girl who doesn't fit its grid.
The worlds switch only on section and bar boundaries, never on the beat. One colour survives every grade: HARU's red iris. Her mint jacket is the only colour outside the palette, so she can be found in any world.
世界はセクションと小節の境目でだけ切り替わる。どのグレードでも残るのは、赤い瞳だけ。
PAPER#ECE6D8
Cream paper, teal grid, ink type. The measuring world.
INK#0E0D10
Near black, white type, one red point. Chorus and system.
SIGNAL RED#DE1218
Red, halftone, ink shadows. The three drops.
WHITEOUT#FAF8F4
Overexposed white, one red point. Hit frames and the break.
ACCENT#86B7A0
The mint jacket. The red iris survives every grade.
Ten style frames before a single shot.
Look development, composited from real take frames: one frame per world and section, built before the edit so every later decision had a target.
実際のテイクから合成した10枚のスタイルフレーム。編集の前に、すべての判断の基準を作りました。
AIntro · 午前零時 方眼紙の街
BVerse · 平均 平面 平行線 · 61 clones
CBuild · 線を引くほど
DChorus 1a · DON'T ENTER
EDrop 1 · 中心
FInterlude · MEASURING... ERROR
GDrop 2 · OUTSIDE
HDrop 3 · NO CENTER callback
IBreak · はみ出したまま
JCharacter grade · key only vs graded
Style frames A–J · 1600 × 900 · composited from FHD and 480p take frames
NO CENTERDON'T ENTERDON'T MEASUREMY PRESSURENO BORDERNO ORDERI BENDI BREAKI DON'T FIT YOUR SHAPE
02Music to picture音と映像
Cut to the music,not to the lyric.
歌詞ではなく、音楽で切る。
Before any picture, the song was measured. A beat grid from kick and snare onsets. Lyric timing from a consensus of three aligners — MMS, stable-ts and WhisperX — snapped to vocal onsets within ±50 ms. Sections from measured energy and from stems entering or leaving, not from the song's tags.
PaperInkSignal redWhiteoutBars: sub-bass energy per bar (HARU_motion.json) · band: sections · dashed: structure hits · song time
01
Nothing moves on every beat.
Worlds, colour and camera set-ups change on 1-, 2- and 4-bar boundaries. Only discrete events hit the beat — landings, world steps, type slams — and they live on the world and type layers, never on the character.
拍ごとに揺らさない。切り替えは1・2・4小節の境目で。
02
Cut where the music changes.
On the downbeat where the music turns, not where the lyric ends. The final hook holds to the first beat of bar 51 at 93.86 s, although its line ends at 93.42 s — off by even 0.4 s, a cut reads as a mistake.
歌詞の終わりではなく、音楽が変わる頭拍で切る。
03
Then check it by machine.
A sync check finds the music's boundaries by Foote novelty over two bars of beat-synced energy and MFCCs, then matches each one to a scene change within 3.5 frames. Final master: 0 misaligned, audio +0 ms.
境界はプログラムで照合。最終マスターのずれは0。
03Characterキャラクター
One model sheet.Every take answers to it.
一枚のモデルシートに、すべてのテイクが従う。
1
2
3
4
5
6
7
8
Model sheet · three views · character design by ASTRA MOTION
HARU was designed in-house: a three-view model sheet, a front face and eight expressions. They are the reference for every generated take — and the standard each take is judged against.
07Mint bomber, #86B7A0 — the only colour outside the palette
08Balloon joggers, chunky white sneakers
A take that misses the sheet — hair length, ties, outfit — is rejected and regenerated, never patched in the composite.
髪の長さ、髪留め、衣装が違えば作り直す。合成でごまかさない。
Serious真顔
Glareにらみ
Shout叫び
Gritted食いしばり
Sorrow哀しみ
Cold冷たい目
Singing歌唱
Eyes shut目を閉じる
The take protocol.
Prompt in a fixed order. Framing and lens, crisp line art, tempo and bar structure (128 BPM, changes on 1-, 2- or 4-bar units, holds like a statue), the face and the gaze, the character pinned to the sheet, a flat chroma-blue backing, then the negatives: no floor, shadow, particles or text.
Reference the song. Up to seven image references — sheet, face, expressions — and an audio reference cut from the full mix, starting one second before the shot.
Lip sync is a gate. Mouth opening is correlated with the vocal line by line. A take that sings the right shapes on its own timing is time-warped at syllable onsets, within ±1 frame, rather than thrown away.
Respect the frame. 16:9 close-ups are used full frame — never cropped, scaled or rolled; the camera moves the world around them. Only 3:4 and 9:16 full-body takes become objects: cards, standees, clones.
Plate to final.
Because close-ups are never reframed, the raw take sits exactly under the finished shot. Drag across to take the world, the type and the grade away.
クローズアップは一切リフレームしないので、素材テイクは完成画の真下にぴたりと重なります。
Take · rawFinal · 4K
03Chorus 1a · MY PRESSURE · 48.50 s · S06B FHDDrag to compare
Remastered, not regenerated.
Performance is locked first, in 480p drafts that are quick to direct: acting, lip sync and timing are approved there. The approved takes are then remastered video-to-video at 1080p with Seedance 2.5, keeping every frame of the performance. Measured on the first remaster: about ten times the fine detail of the resized draft, with the mouth matching at a correlation of 0.998.
Only the stretches the edit uses are sent, packed into four-second inputs: ten requests instead of eighteen. Each result is retimed onto the draft's frames and colour-matched with its own 17³ LUT.
V2VPre-chorus hold · 44.55 s · S05A, same frame · face crop 1.7×Drag to compare
04After Effectsアフターエフェクツ
An introbuilt by script.
スクリプトで組み上げたイントロ。
AE · 0.29–7.62 sExtendScript build · loop
The first 9.63 seconds — 290 frames — are an After Effects composition generated entirely by ExtendScript. Python prepares what it needs — take frames, cut frames, lyric timing, a tracked eye point for the reticle — and the script builds the project, logs every effect parameter and writes check frames, without ever touching the app window.
Built-in effects only, so the project renders anywhere. Time remapping with pixel-motion blending keeps the eye opening right up to the cut instead of freezing on a repeated frame. For the master, the same script rebuilds the comp at twice the scale and renders natively at 3840 × 2160.
1.50 sBlueprint draw-on
Grid, compass and a needle star labelled CENTER draw themselves in.
5.00 sLyrics at eye level
午前零時 / 方眼紙の街, split left and right in vertical Mincho.
7.00 sReticle
A red sight hunts across the closed eye, then locks onto the pupil.
7.67 sTorn-star window
The first bass hit tears a four-point star open; the eye opens inside it.
9.30 sEclipse ring
The ring's front half crosses over her, the back half passes behind.
The eclipse ring, as code.
Every motif is a function. This one builds the eclipse: a rim flare that runs around the disc, a zig-zag corona turning three degrees a second, a thin red ring, then radial streaks and two glows. Sizes are written in design pixels and scaled once, so the same build renders at 1080p or natively at 4K.
モチーフはすべて関数。デザイン座標で書き、倍率ひとつで1080pにも4Kにも組み上がります。
ae_ref/haru_ref_build.jsxExtendScript · excerpt
functionbuildEclipse() {
var c = pre('PC_ECLIPSE', 2000, 2000);
var s = shapeL(c, 'eclipse', false); tp(s, POS).setValue(px([1000, 1000]));
var g = grp(s, 'rim flare'); ellP(g, 1300);
var t = trimP(g, 0, 7, 0); t.property('ADBE Vector Trim Offset').expression = 'time*95';
strokeP(g, C.white, 15, 100);
…
g = grp(s, 'corona'); ellP(g, 1384); zigP(g, 24, 100); strokeP(g, C.paper, 1.5, 45);
gt(g, 'ADBE Vector Rotation').expression = 'time*3';
…
g = grp(s, 'red ring'); ellP(g, 1236); strokeP(g, C.red, 2.2, 85);
g = grp(s, 'disc'); ellP(g, 1300); fillP(g, C.disc, 100);
var a = adj(c, 'ADJ streaks + glow');
var rb = fx(a, 'ADBE Radial Blur', 'zoom streaks'); sp(rb, 1, 10); sp(rb, 2, px([1000, 1000])); sp(rb, 3, 2); sp(rb, 4, 2);
glow(a, 'glow tight', 50, 45, 2.2);
glow(a, 'glow wide', 30, 220, 0.9);
return c;
}
05Blenderブレンダー
Worldsbuilt in code.
コードで建てた世界。
Blender runs headless, driven by Python. Geometry, Geometry Nodes, camera keys and renders all come from scripts, so a world can be re-timed to the song and rendered again at 4K from the same source. The numbers on screen are measured from the scene itself.
Blender · 60.10–67.62 sDrop 1 · water world · loop
9.67–13.37 s
Data scan
As the camera cranes up, her body is redrawn as wire mesh, points and coordinates. The values are real: beats, Blender-measured 3D readings, tracked pupils, bass level.
60.17–68.10 s
Water world
A 1.3 m ice cube shatters into 193 shards on the drop's first beat. Rings spread, wire polyhedra and a ribbon of her real waveform appear, then 36,000 grains of sand close into an empty circle: CENTER: NOT FOUND.
69.53–75.03 s
Canvas
A card storm on a giant canvas, then one unbroken zoom-out sweep onto the data plan, and a data room where the scan reads ERROR.
86.20–93.83 s
4 FEEDS
A 2 × 2 wall of feeds in black-and-white chrome with mixed typefaces. The red neon line she draws becomes the crosshair between them, and the camera tours C → D → B → A.
101.50–123.77 s
Rail world
A runaway locomotive. Through the build, speed, ring spacing and lens width grow every bar; the last drop keeps running down the same track in the colour of each row.
123.80–128.30 s
193 → 1
Her closing spell pulls the 193 shards of drop 1's cube back into one. Shot at f/0.6 with six-sample motion blur, then the world goes black.
The same 193 shards, twice.
The ice cube is cut into tetrahedra from a fixed seed. Drop 1 throws the pieces outward on its first beat; the ending calls the same function with the same seed, so the shards that gather into one cube at the very end are exactly the ones that flew apart in the drop.
同じシードから、同じ193片。ドロップで砕けた欠片が、エンディングでひとつに戻ります。
xpoly/scripts/plan.pyPython · excerpt
defmake_shards(seed=11):
rng = np.random.default_rng(seed)
h = CUBE_S / 2
pts = [np.array([x, y, z]) for x in (-h, h) for y in (-h, h) for z in (-h, h)]
… # + 30 points on the faces, 12 inside
out = []
for tet inDelaunay(pts).simplices:
V = pts[tet]
vol = abs(np.linalg.det(np.stack([V[1] - V[0], V[2] - V[0], V[3] - V[0]]))) / 6if vol < 1e3:
continue
c = V.mean(0)
…
d = c / h + 0.35 * rng.normal(size=3)
d /= np.linalg.norm(d)
speed = (2400 + 3400 * rng.random()) * (900 / max(size, 300)) ** 0.35
…
order = np.argsort([-s['vol'] for s in out])
for i in (order[5], order[11]): # two red shards, mid-sized
out[i]['red'] = True
return out
Straight out of EEVEE.
The 4 FEEDS sets before compositing: a shard burst, falling chrome slivers, a mirrored grid floor, a block tunnel and a white room.
4 FEEDS · raw EEVEE frames · song 86.7–92.5 s
PAPER
INK
SIGNAL RED
WHITEOUT
One city, four worlds.
Look development in Blender: a paper city of 88 buildings, the lyrics set vertically on its walls, a red CENTER target in the middle of the boulevard — rendered with the same camera in all four worlds to prove the pipeline against the palette.
同じ街、同じカメラで4つの世界を描き分けたルック開発。
06Compositing合成
One rendererfor the final.
最終画は、ひとつのレンダラーで。
Every frame of the master is written by our own compositor: Python with NumPy and Pillow, Metal kernels, and PyTorch MPS for keying. It places the keyed takes, the worlds, the type and the HUD on a 2.5D camera, and splices in the After Effects and Blender renders frame for frame.
Compositor + Blender water world · drop 1, 60.17–68.13 s
Compositor · drop 1 rage, 68.13–69.53 s
Blender canvas · card storm and sweep, 69.53–75.07 s
Compositor · countdown to drop 2, 75.07–86.20 s
Blender 4 FEEDS · final hook, 86.20–93.87 s
Compositor · break, 93.87–101.50 s
Compositor + Blender rail world · build, 101.50–107.90 s
Blender rail world · drop 3 first cut, 107.90–110.70 s
Compositor + Blender rail world · last drop, 110.70–120.07 s
Blender 4 FEEDS · drop 3 callback, 120.07–121.93 s
Compositor + Blender rail world · glare, 121.93–123.80 s
Blender polyhedra · ending spell, 123.80–128.30 s
0:000:301:001:302:00
52 %Compositor
23 %Compositor over a Blender world
17 %Blender splice
8 %After Effects splice
Type in three tiers.
L
Slam
One or two words at 40–70 % of the frame height. They land a frame before the syllable with a two-frame overshoot, and leave on the next phrase with motion blur.
M
Architecture
Phrases set on 3D floors and walls. The camera passes over them, so the perspective, not the animation, does the work.
S
Measure
A small mono HUD of time, BPM, coordinates and readings — the voice of the measuring world. Small, but many.
Key
Translucent hair, kept.
A chroma key built for white hair: a matte from the local backing colour, a guided filter that redraws the half-resolution 4:2:0 chroma edge at full resolution, and unmixing of the blue from the edge colour, computed on the GPU.
Grade
A sticker no more.
Shadows tinted to each world, a 6–10 px rim in the world's colour, halftone shadows only in the drops, highlight glow and grain — so a keyed figure sits inside the frame instead of on top of it.
4K
Upscale once, render the rest.
Type, worlds, HUD, effects, the AE intro and the Blender splices are rendered natively at 3840 × 2160. Only the character takes are upscaled, once per source: Real-ESRGAN for 480p drafts, Real-CUGAN 2× with 25 % of the source for 1080p takes. The finished composite is never upscaled.
Out of the frame, by rule.
Letterbox bars stay pure black. Only an outstretched limb may cross them — never the head or the body — and only on chosen hits. In that frame the world alone drops out of focus and the figure pushes 6 % toward the lens.
レターボックスを越えるのは、伸ばした手足だけ。頭と体は枠の内側に残す。
Interlude · 69.53–75.03 sBlender canvas + compositor HUD · loop
07Direction演出ルール
The ruleswe held the film to.
この映像に課したルール。
01
Vary the kind of shot, not the speed.
Each section was planned with its own world, camera grammar and type scale, and every edit is audited for its mix of shots — front busts, centred frames, rolls, full bodies. The energy comes from what changes, not from cutting faster.
02
Motion follows the structure.
Nothing bobs on every beat. World, colour and camera set-ups change on bar boundaries; only landings, world steps and slams hit the beat.
03
Cut where the music changes.
On the downbeat, never where the lyric ends.
04
The body carries the drops.
Full-body standees on a 3D floor, clone cascades, squad unison and punch holds — not cards and close-ups.
05
Lip sync is a gate.
A mouth that doesn't match the line is never used for singing. Slide it line by line first; what still doesn't match becomes a silhouette.
06
Never crop a close-up.
16:9 takes stay full frame. The camera moves the world around them.
07
The sheet is law.
Anything off-model is regenerated. The composite never covers for a take.
08
Flash-safe by default.
At most three full-frame flashes a second. Where a drop strobes on purpose, a warning card opens the film.
08Delivery納品と検証
Measuredbefore it shipped.
出す前に、測る。
Resolution
3840 × 2160, native
Frame rate
30 fps
Video
HEVC (hvc1) · 60 Mbps
Colour
BT.709
Audio
AAC 48 kHz · 320 kbps
Length
3,969 frames · 2:12.30
Opening
4 s photosensitivity card, silent
Sync
Music boundaries matched to scene changes within 3.5 frames: 0 misaligned, audio +0 ms.
Flash
Harding-style one-second windows on the master. Where the drops strobe by design, the warning card says so. Every clip on this page passes the same check.
Completeness
Every compositor part, splice and card frame present before the encode: 0 missing.
Change control
A change re-renders only its window, at 4K, and the frames around it are compared byte for byte with the previous master.