Transporte: al cargar un track el loop arranca desde cero
Some checks are pending
Build and Deploy to warm (strudel.cc) / build (push) Waiting to run
Strudel tests / build (20) (push) Waiting to run

Cargar un proyecto (pestaña Projects o anterior/siguiente de la barra) deja
pendiente un reinicio que se aplica en la siguiente evaluacion: el tema nuevo
empieza en el ciclo 0 aunque el reloj del scheduler siga corriendo. Editar y
actualizar en vivo no reinicia nada. Funciona con Cyclist y NeoCyclist (ambos
tienen setCycle).

README-HACKLAB mas breve y con enlaces: upstream, TidalCycles, algorave,
librerias de samples y video introductorio.
This commit is contained in:
hacklab 2026-07-17 02:00:08 +02:00
parent b6dbe97a62
commit 921647020c
4 changed files with 53 additions and 42 deletions

View file

@ -2,7 +2,7 @@ import { useStore } from '@nanostores/react';
import { useEffect, useRef, useState } from 'react';
import cx from '@src/cx.mjs';
import { useT } from '@src/i18n.mjs';
import { $projects, $playing, parseMeta, fmt } from './panel/ProjectsTab.jsx';
import { $projects, $playing, $resetPending, parseMeta, fmt } from './panel/ProjectsTab.jsx';
// Barra de transporte estilo Spotify, FIJA debajo del editor de código:
// · fila superior: controles CENTRADOS (anterior / play-pausa / siguiente)
@ -98,6 +98,7 @@ export function TransportBar({ context }) {
const p = displayed[idx];
e.setCode(p.code);
$playing.set(p.name);
$resetPending.set(true); // el track nuevo arranca desde el ciclo 0
e.evaluate();
};

View file

@ -64,6 +64,9 @@ const migrate = (list) => {
export const $projects = atom(migrate(load()));
// nombre del sample cargado en el editor (compartido con la barra de transporte)
export const $playing = atom(null);
// true = se acaba de cargar un track: la proxima evaluacion arranca el loop
// desde el ciclo 0 (editar y actualizar en vivo no pasa por aqui)
export const $resetPending = atom(false);
const persist = (list) => {
try {
@ -261,6 +264,7 @@ export function ProjectsTab({ context }) {
ed.setCode(p.code);
setPreviewed(p);
$playing.set(p.name);
$resetPending.set(true);
};
const del = (p) => {

View file

@ -35,6 +35,7 @@ import { audioEngineTargets } from '../settings.mjs';
import { useStore } from '@nanostores/react';
import { prebake } from './prebake.mjs';
import { getRandomTune, initCode, loadModules, shareCode } from './util.mjs';
import { $resetPending } from './components/panel/ProjectsTab.jsx';
import './Repl.css';
import { setInterval, clearInterval } from 'worker-timers';
import { getMetadata } from '../metadata_parser';
@ -104,6 +105,11 @@ export function useReplContext() {
beforeEval: () => audioReady,
afterEval: (all) => {
const { code } = all;
// track recien cargado desde Projects: el loop arranca desde cero
if ($resetPending.get()) {
$resetPending.set(false);
editorRef.current?.repl?.scheduler?.setCycle?.(0);
}
//post to iframe parent (like Udels) if it exists...
window.parent?.postMessage(code);