Commit
·
bf8ae4c
1
Parent(s):
eb5d99b
reseed splice context fix
Browse files- jam_worker.py +62 -9
jam_worker.py
CHANGED
|
@@ -271,35 +271,88 @@ class JamWorker(threading.Thread):
|
|
| 271 |
depth = original_tokens.shape[1]
|
| 272 |
frames_per_bar = self._frames_per_bar()
|
| 273 |
|
| 274 |
-
# 1) Anchor tail
|
| 275 |
-
# Use floor, not round, to avoid grabbing an extra bar.
|
| 276 |
anchor = self._bar_aligned_tail(original_tokens, math.floor(anchor_bars))
|
| 277 |
|
| 278 |
-
# 2) Fill remainder with recent (
|
| 279 |
a = anchor.shape[0]
|
| 280 |
remain = max(ctx_frames - a, 0)
|
|
|
|
|
|
|
|
|
|
| 281 |
if remain > 0:
|
| 282 |
bars_fit = remain // frames_per_bar
|
| 283 |
if bars_fit >= 1:
|
| 284 |
want_recent_frames = int(bars_fit * frames_per_bar)
|
| 285 |
-
|
|
|
|
| 286 |
else:
|
| 287 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 288 |
else:
|
| 289 |
-
|
|
|
|
| 290 |
|
| 291 |
-
|
| 292 |
if out.shape[0] > ctx_frames:
|
| 293 |
out = out[-ctx_frames:]
|
| 294 |
|
| 295 |
-
#
|
| 296 |
-
|
|
|
|
|
|
|
|
|
|
| 297 |
if max_bar_aligned > 0 and out.shape[0] != max_bar_aligned:
|
| 298 |
out = out[-max_bar_aligned:]
|
| 299 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 300 |
if out.shape[1] != depth:
|
| 301 |
out = out[:, :depth]
|
| 302 |
return out
|
|
|
|
| 303 |
|
| 304 |
def _realign_emit_pointer_to_bar(self, sr_model: int):
|
| 305 |
"""Advance _next_emit_start to the next bar boundary in model-sample space."""
|
|
|
|
| 271 |
depth = original_tokens.shape[1]
|
| 272 |
frames_per_bar = self._frames_per_bar()
|
| 273 |
|
| 274 |
+
# 1) Anchor tail (whole bars)
|
|
|
|
| 275 |
anchor = self._bar_aligned_tail(original_tokens, math.floor(anchor_bars))
|
| 276 |
|
| 277 |
+
# 2) Fill remainder with recent (prefer whole bars)
|
| 278 |
a = anchor.shape[0]
|
| 279 |
remain = max(ctx_frames - a, 0)
|
| 280 |
+
|
| 281 |
+
recent = recent_tokens[:0]
|
| 282 |
+
used_recent = 0 # frames taken from the END of recent_tokens
|
| 283 |
if remain > 0:
|
| 284 |
bars_fit = remain // frames_per_bar
|
| 285 |
if bars_fit >= 1:
|
| 286 |
want_recent_frames = int(bars_fit * frames_per_bar)
|
| 287 |
+
used_recent = min(want_recent_frames, recent_tokens.shape[0])
|
| 288 |
+
recent = recent_tokens[-used_recent:] if used_recent > 0 else recent_tokens[:0]
|
| 289 |
else:
|
| 290 |
+
used_recent = min(remain, recent_tokens.shape[0])
|
| 291 |
+
recent = recent_tokens[-used_recent:] if used_recent > 0 else recent_tokens[:0]
|
| 292 |
+
|
| 293 |
+
# 3) Concat in order [anchor, recent]
|
| 294 |
+
if anchor.size or recent.size:
|
| 295 |
+
out = np.concatenate([anchor, recent], axis=0)
|
| 296 |
else:
|
| 297 |
+
# fallback: just take the last ctx window from recent
|
| 298 |
+
out = recent_tokens[-ctx_frames:]
|
| 299 |
|
| 300 |
+
# 4) Trim if we overshot
|
| 301 |
if out.shape[0] > ctx_frames:
|
| 302 |
out = out[-ctx_frames:]
|
| 303 |
|
| 304 |
+
# 5) Snap the **END** to the nearest LOWER bar boundary
|
| 305 |
+
if frames_per_bar > 0:
|
| 306 |
+
max_bar_aligned = (out.shape[0] // frames_per_bar) * frames_per_bar
|
| 307 |
+
else:
|
| 308 |
+
max_bar_aligned = out.shape[0]
|
| 309 |
if max_bar_aligned > 0 and out.shape[0] != max_bar_aligned:
|
| 310 |
out = out[-max_bar_aligned:]
|
| 311 |
|
| 312 |
+
# 6) Left-fill to reach ctx_frames **without moving the END**
|
| 313 |
+
deficit = ctx_frames - out.shape[0]
|
| 314 |
+
if deficit > 0:
|
| 315 |
+
left_parts = []
|
| 316 |
+
|
| 317 |
+
# Prefer frames immediately BEFORE the region we used from 'recent_tokens'
|
| 318 |
+
if used_recent < recent_tokens.shape[0]:
|
| 319 |
+
take = min(deficit, recent_tokens.shape[0] - used_recent)
|
| 320 |
+
if used_recent > 0:
|
| 321 |
+
left_parts.append(recent_tokens[-(used_recent + take) : -used_recent])
|
| 322 |
+
else:
|
| 323 |
+
left_parts.append(recent_tokens[-take:])
|
| 324 |
+
|
| 325 |
+
# Then take frames immediately BEFORE the 'anchor' in original_tokens
|
| 326 |
+
if sum(p.shape[0] for p in left_parts) < deficit and anchor.shape[0] > 0:
|
| 327 |
+
need = deficit - sum(p.shape[0] for p in left_parts)
|
| 328 |
+
a_len = anchor.shape[0]
|
| 329 |
+
avail = max(original_tokens.shape[0] - a_len, 0)
|
| 330 |
+
take2 = min(need, avail)
|
| 331 |
+
if take2 > 0:
|
| 332 |
+
left_parts.append(original_tokens[-(a_len + take2) : -a_len])
|
| 333 |
+
|
| 334 |
+
# Still short? tile from what's available
|
| 335 |
+
have = sum(p.shape[0] for p in left_parts)
|
| 336 |
+
if have < deficit:
|
| 337 |
+
base = out if out.shape[0] > 0 else (recent_tokens if recent_tokens.shape[0] > 0 else original_tokens)
|
| 338 |
+
reps = int(np.ceil((deficit - have) / max(1, base.shape[0])))
|
| 339 |
+
left_parts.append(np.tile(base, (reps, 1))[: (deficit - have)])
|
| 340 |
+
|
| 341 |
+
left = np.concatenate(left_parts, axis=0)
|
| 342 |
+
out = np.concatenate([left[-deficit:], out], axis=0)
|
| 343 |
+
|
| 344 |
+
# 7) Final guard to exact length
|
| 345 |
+
if out.shape[0] > ctx_frames:
|
| 346 |
+
out = out[-ctx_frames:]
|
| 347 |
+
elif out.shape[0] < ctx_frames:
|
| 348 |
+
reps = int(np.ceil(ctx_frames / max(1, out.shape[0])))
|
| 349 |
+
out = np.tile(out, (reps, 1))[-ctx_frames:]
|
| 350 |
+
|
| 351 |
+
# 8) Depth guard
|
| 352 |
if out.shape[1] != depth:
|
| 353 |
out = out[:, :depth]
|
| 354 |
return out
|
| 355 |
+
|
| 356 |
|
| 357 |
def _realign_emit_pointer_to_bar(self, sr_model: int):
|
| 358 |
"""Advance _next_emit_start to the next bar boundary in model-sample space."""
|