Skip to content

v3.14.0 - A walk whose arms swing past its sides is witnessed where its middle rows read a body rising whole, one on a picture swaying once a cycle or slower held named, the body's word one line in both places

Choose a tag to compare

@aldegad aldegad released this 31 Oct 14:12
· 47 commits to main since this release

Upgrading from 3.13.0: some walk cuts and crossing readings change, and a set's alignment can change with them. The body's word is now one line, its top line or its first solid row, rising and falling twice an interval on the screen and over its feet, the same line in both places, and where a band of the upper body moves on the beat the rows down the middle of the body tell a body rising whole from a picture zoomed with it. Now witnessed: a walk whose arms swing past its sides where the rows down its middle read a body rising whole; such a cut stands, or a crossing interval that was left on steps is read as a cycle, and its cut can change: the search's cut stands, or a shorter two-step cut is chosen. Now held, named: a walk rising and falling on its legs on a picture swaying up and down once a cycle or slower. It was witnessed over its feet alone, but a head rising twice in one step said the same in one place, and a half cycle stood on it, so a line must now say so in both places. Its loop says cycle-unwitnessed, and video-cycle-align --cycles <loop>=1 settles it where it is one cycle. Also held now: a head rising twice in one step, and a line on a beat of its own over feet that do the rising and falling, which stood before. video-loop run on its own can now write four steps on a cut of two cycles it used to hold cycle-unwitnessed; video-set leaves it out of alignment (cycle-four-steps) and video-cycle-align run on its own stops on it. A set's alignment can change: a loop newly witnessed joins it, so the set's length, and the frames made between for the others, can change.

Walks that stay held, named: a walk whose rows down its middle fit a zoom as well as they fit standing; a walk whose top line a tail takes and whose first solid row says so only on the screen, the shape of a head rising twice in one step; a walk whose body rises and falls once in the cut; a cut whose line over the feet does not read twice the cut; a search's cut kept where no two-step cut closes. video-cycle-align --cycles <loop>=1 settles each that is one cycle.

Walk and run loops

  • Changed: the body's word is one line in both places (local_cycle.body_word, local_cycle.TOP_LINES, local_cycle.bob_word(..., line=), local_cycle.read_cycles, local_cycle.cut_word). local_cycle.body_word(signals, interval) reads each line of local_cycle.TOP_LINES ({'top': 'its top line', 'first_row': 'its first solid row'}), in that order, with local_cycle.bob_word(signals, interval, feet=False, line='top') in both places of local_cycle.CUT_LINES, and says "cycles" where one line says so on the screen and over its feet, the same line in both, never one line on the screen and the other over the feet. read_cycles reads it on the crossing interval, and cut_word reads it on the cut L, L/2 and 2L through local_cycle._cut_lines, saying "two steps", "four steps" or "one step" only where the same line says so in both places. On the screen alone a head rising twice in one step reads as two steps, and the feet leave no such rise and fall over them; over the feet alone the two feet's heights, taken in by turns, read as the body's, and the screen line has none of them. Two lines are read because top passes over what is narrower than half the frame's widest row, so a tail or a cape lifted over the head takes it off the head where the first solid row stays on the body's top, and the first solid row takes an ear's or a hat's tip in; neither is the better line. The price is the design's: a walk whose rise and fall shows in one place only is not witnessed. why strings that said "its top line" now say the line's name, and the cut's why where nothing says is each place's why, repeated ones once, joined by "; ".
  • New: the rows down the middle of the body (legs.body_signals first_row, strips, legs.STRIP, legs.DEEP, local_cycle.body_depth, BOB_RIGID, STRIP_FLOOR, STRIP_SHIFT, STRIP_SHIFT_MIN). legs.body_signals(frames) also returns first_row (per frame, the first solid row) and strips (per frame, the rows down the middle of the body: legs.DEEP = 0.7 of its median height from the first solid row, legs.STRIP = 0.12 of that height either side of the mean column of the solid pixels among them, each row's mean premultiplied colour and mean cover, shape frames by rows by 4, values 0..1); neither is recorded in any report, and legs.strike_signals and gait.silhouette.signals are unchanged. local_cycle.body_depth(signals, interval) reads the strip at the top of the rise against the bottom: the frames where the rise and fall twice an interval of the line over its lowest row stands a half or more of the way to the top and to the bottom, each set's strips in a median, each fit moved as it fits best, in steps of a twelfth of the most and at least half a row, at most STRIP_SHIFT (0.03) of the body's height either way and at least STRIP_SHIFT_MIN (3) rows. It returns need, risen, rigid, zoom, ratio (zoom of rigid), moved and frames, or None where no strip is read, the rise and fall is none, a set holds under two frames or the frames at the top are not the taller. local_cycle.own_beat reads the body's own on less_lowest alone where ratio is BOB_RIGID (1.0) or more, holds where it is under, and leaves the bands to decide where it is not read: no depth, or moved under STRIP_FLOOR (CUE_FLOOR * legs.TONE, half the step the colours are drawn in, about 0.00196: under it the strip is as good as plain to that zoom). A body rising whole carries those rows as they are; a zoom as far as the rise draws them longer; arms swinging across the bands hardly touch them. So a walk whose arms swing past its sides on the beat is witnessed where the rows down its middle read a body rising whole, and the bands no longer hold it there. A body one flat colour down its middle has no strip to read, and the bands decide as they did. A picture zoomed on the beat with every band seen drawn against the zoom and a strip as plain is still read as the body's own.
  • New: a line must be at least BOB_OWN of what is left against the lowest row on the screen (local_cycle.bob_word). After the less_lowest gate and before the bands, where beat is under BOB_OWN (0.3) times less_lowest, nothing is witnessed, and why says "its lowest row does the rising and falling: {name} does so twice an interval {beat} rows on the screen, {percent} of the {less_lowest} left against its lowest row (at least 30%), and the body's own is not told from it". Read every four frames, a line on a beat of twelve leaves nothing of it twice an interval of 24, and still correlates there; what is left against the lowest row is then all the lowest row's.
  • Changed: report fields. cycle.step_count.cycles.bob gains top_line, the line that said so, where it says "cycles", and feet, the record over the feet, its says and top_line the same. body in bob, lines.*.bob and lines.*.on gains depth: null or {need, risen, rigid, zoom, moved, ratio, frames} (need, rigid, zoom and moved rounded to 5 places, risen to 2, ratio to 3), a measure recorded as the other measures are, not a verdict. cycle.cut_witness.by is ["screen", "feet"] or ["order"], never one place; cut_witness.lines.screen.says and lines.feet.says are the body's word, the same in both, the cut's word where by is ["screen", "feet"] and the body's reading as it stood where it is ["order"]; lines.*.bob, lines.*.on and on carry top_line. No report key tells a right hold from a false one. why strings changed as docs/loop-repair.md says: the line's name in place of "its top line", "on the screen and over its feet" in the crossings' why, the new gate's why, the strip's why, the band gate's why extended with what the rows down the middle tell, and mark read of the line that stood.
  • Changed: Python callers. New local_cycle.body_word, local_cycle.body_depth and local_cycle.TOP_LINES; local_cycle.bob_word takes line, a TOP_LINES key; local_cycle._cut_line and local_cycle.CUT_WORDS are gone.
  • Tests (tests/video/test_walk_steps.py, tests/video/test_cycle_align.py, tests/video/test_loop_silent_pass.py). Renamed test_a_walk_rising_on_its_legs_on_a_picture_swaying_once_a_cycle_or_slower_is_held_as_cut_named (was ..._is_witnessed_one_cycle), test_a_walk_whose_feet_meet_once_a_cycle_its_arms_swinging_past_its_sides_is_cut_one_cycle (was ..._is_cut_two_intervals_with_a_warning) and test_a_walk_whose_arms_swing_past_its_sides_reads_as_one_whose_arms_swing_within_them (was test_a_walk_whose_arms_swing_past_its_sides_is_never_witnessed_its_crossings_left_on_steps_or_its_cut_held). test_a_fixed_cut_of_one_cycle_whose_crossings_mark_cycles_is_counted_two_steps now says a walk seen from behind on twos, its arms swinging past its sides, is counted two steps, the same as one whose arms swing within its sides, because the rows down the middle of the body read a body rising whole (it used to say its crossings were left on steps, its fixed cut counted one step, and failed). New tests for a top line on a quick beat of its own over feet rising twice an interval, a head rising twice in one step, a cape taking the top line off the head, a line on the screen and another over the feet, the rows down the middle of a body, a reason both lines of a body give (naming neither) said once, on a crossing interval and on a cut, and video-cycle-align on its own stopping on a walk its body reads four steps. Synthetic frames only.

Install or update:

pip install --upgrade "sprite-gen @ git+https://github.com/aldegad/sprite-gen.git@v3.14.0"

The wheel, the source archive and SHA256SUMS are attached. Full notes in CHANGELOG.md.