Transporte: al cargar un track el loop arranca desde cero
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:
parent
b6dbe97a62
commit
921647020c
4 changed files with 53 additions and 42 deletions
|
|
@ -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();
|
||||
};
|
||||
|
||||
|
|
|
|||
|
|
@ -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) => {
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue