diff --git a/packages/codemirror/codemirror.mjs b/packages/codemirror/codemirror.mjs index f47f6eba5..37d7ea18d 100644 --- a/packages/codemirror/codemirror.mjs +++ b/packages/codemirror/codemirror.mjs @@ -13,7 +13,8 @@ import { lineNumbers, drawSelection, } from '@codemirror/view'; -import { repl, registerControl } from '@strudel/core'; +import { registerControl } from '@strudel/core'; +import { repl } from '@strudel/cyclist'; import { Drawer, cleanupDraw } from '@strudel/draw'; import { isAutoCompletionEnabled } from './autocomplete.mjs'; import { isTooltipEnabled } from './tooltip.mjs'; @@ -41,9 +42,9 @@ const extensions = { isMultiCursorEnabled: (on) => on ? [ - EditorState.allowMultipleSelections.of(true), - EditorView.clickAddsSelectionRange.of((ev) => ev.metaKey || ev.ctrlKey), - ] + EditorState.allowMultipleSelections.of(true), + EditorView.clickAddsSelectionRange.of((ev) => ev.metaKey || ev.ctrlKey), + ] : [], }; const compartments = Object.fromEntries(Object.keys(extensions).map((key) => [key, new Compartment()])); diff --git a/packages/codemirror/package.json b/packages/codemirror/package.json index 4f8508c90..f511dc97b 100644 --- a/packages/codemirror/package.json +++ b/packages/codemirror/package.json @@ -45,6 +45,7 @@ "@replit/codemirror-vim": "^6.2.1", "@replit/codemirror-vscode-keymap": "^6.0.2", "@strudel/core": "workspace:*", + "@strudel/cyclist": "workspace:*", "@strudel/draw": "workspace:*", "@strudel/transpiler": "workspace:*", "nanostores": "^0.11.3" diff --git a/packages/core/index.mjs b/packages/core/index.mjs index e4daf445a..5304739c7 100644 --- a/packages/core/index.mjs +++ b/packages/core/index.mjs @@ -7,9 +7,8 @@ This program is free software: you can redistribute it and/or modify it under th import * as controls from './controls.mjs'; // legacy export * from './euclid.mjs'; import Fraction from './fraction.mjs'; -import createClock from './zyklus.mjs'; import { logger } from './logger.mjs'; -export { Fraction, controls, createClock }; +export { Fraction, controls }; export * from './controls.mjs'; export * from './hap.mjs'; export * from './pattern.mjs'; @@ -18,13 +17,7 @@ export * from './pick.mjs'; export * from './state.mjs'; export * from './timespan.mjs'; export * from './util.mjs'; -export * from './speak.mjs'; -export * from './evaluate.mjs'; -export * from './repl.mjs'; -export * from './cyclist.mjs'; export * from './logger.mjs'; -export * from './time.mjs'; -export * from './ui.mjs'; export { default as drawLine } from './drawLine.mjs'; // below won't work with runtime.mjs (json import fails) /* import * as p from './package.json'; diff --git a/packages/core/clockworker.js b/packages/cyclist/clockworker.js similarity index 100% rename from packages/core/clockworker.js rename to packages/cyclist/clockworker.js diff --git a/packages/core/cyclist.mjs b/packages/cyclist/cyclist.mjs similarity index 99% rename from packages/core/cyclist.mjs rename to packages/cyclist/cyclist.mjs index fec819548..bd8c5a89d 100644 --- a/packages/core/cyclist.mjs +++ b/packages/cyclist/cyclist.mjs @@ -5,7 +5,7 @@ This program is free software: you can redistribute it and/or modify it under th */ import createClock from './zyklus.mjs'; -import { logger } from './logger.mjs'; +import { logger } from '@strudel/core'; export class Cyclist { constructor({ diff --git a/packages/core/evaluate.mjs b/packages/cyclist/evaluate.mjs similarity index 100% rename from packages/core/evaluate.mjs rename to packages/cyclist/evaluate.mjs diff --git a/packages/cyclist/index.mjs b/packages/cyclist/index.mjs new file mode 100644 index 000000000..4ca3598cf --- /dev/null +++ b/packages/cyclist/index.mjs @@ -0,0 +1,8 @@ +export * from './speak.mjs' +export * from './evaluate.mjs' +export * from './repl.mjs' +export * from './cyclist.mjs' +export * from './time.mjs' +export * from './ui.mjs' +import createClock from './zyklus.mjs' +export { createClock }; diff --git a/packages/cyclist/logger.mjs b/packages/cyclist/logger.mjs new file mode 100644 index 000000000..e13bf86ca --- /dev/null +++ b/packages/cyclist/logger.mjs @@ -0,0 +1,28 @@ +export const logKey = 'strudel.log'; + +let debounce = 1000, + lastMessage, + lastTime; + +export function logger(message, type, data = {}) { + let t = performance.now(); + if (lastMessage === message && t - lastTime < debounce) { + return; + } + lastMessage = message; + lastTime = t; + console.log(`%c${message}`, 'background-color: black;color:white;border-radius:15px'); + if (typeof document !== 'undefined' && typeof CustomEvent !== 'undefined') { + document.dispatchEvent( + new CustomEvent(logKey, { + detail: { + message, + type, + data, + }, + }), + ); + } +} + +logger.key = logKey; diff --git a/packages/core/neocyclist.mjs b/packages/cyclist/neocyclist.mjs similarity index 98% rename from packages/core/neocyclist.mjs rename to packages/cyclist/neocyclist.mjs index 5c175dc1f..2c42fdfb2 100644 --- a/packages/core/neocyclist.mjs +++ b/packages/cyclist/neocyclist.mjs @@ -5,7 +5,7 @@ This program is free software: you can redistribute it and/or modify it under th */ import { logger } from './logger.mjs'; -import { ClockCollator, cycleToSeconds } from './util.mjs'; +import { ClockCollator, cycleToSeconds } from '@strudel/core'; export class NeoCyclist { constructor({ onTrigger, onToggle, getTime }) { diff --git a/packages/cyclist/package.json b/packages/cyclist/package.json new file mode 100644 index 000000000..a7944bf8f --- /dev/null +++ b/packages/cyclist/package.json @@ -0,0 +1,40 @@ +{ + "name": "@strudel/cyclist", + "version": "1.2.2", + "description": "Event Scheduler for Strudel", + "main": "index.mjs", + "type": "module", + "publishConfig": { + "main": "dist/index.mjs" + }, + "scripts": { + "test": "vitest run", + "bench": "vitest bench", + "build": "vite build", + "prepublishOnly": "pnpm build" + }, + "repository": { + "type": "git", + "url": "git+https://codeberg.org/uzu/strudel.git" + }, + "keywords": [ + "tidalcycles", + "strudel", + "pattern", + "livecoding", + "algorave" + ], + "author": "Alex McLean (https://slab.org)", + "license": "AGPL-3.0-or-later", + "bugs": { + "url": "https://codeberg.org/uzu/strudel/issues" + }, + "homepage": "https://strudel.cc", + "dependencies": { + "@strudel/core": "*" + }, + "devDependencies": { + "vite": "^6.0.11", + "vitest": "^3.0.4" + } +} diff --git a/packages/core/repl.mjs b/packages/cyclist/repl.mjs similarity index 90% rename from packages/core/repl.mjs rename to packages/cyclist/repl.mjs index aeaa6418e..3b54ef2d7 100644 --- a/packages/core/repl.mjs +++ b/packages/cyclist/repl.mjs @@ -4,7 +4,7 @@ import { evaluate as _evaluate } from './evaluate.mjs'; import { logger } from './logger.mjs'; import { setTime } from './time.mjs'; import { evalScope } from './evaluate.mjs'; -import { register, Pattern, isPattern, silence, stack } from './pattern.mjs'; +import { register, Pattern, isPattern, silence, stack } from '@strudel/core'; export function repl({ defaultOutput, @@ -244,18 +244,18 @@ export function repl({ export const getTrigger = ({ getTime, defaultOutput }) => - async (hap, deadline, duration, cps, t) => { - // ^ this signature is different from hap.context.onTrigger, as set by Pattern.onTrigger(onTrigger) - // TODO: get rid of deadline after https://codeberg.org/uzu/strudel/pulls/1004 - try { - if (!hap.context.onTrigger || !hap.context.dominantTrigger) { - await defaultOutput(hap, deadline, duration, cps, t); + async (hap, deadline, duration, cps, t) => { + // ^ this signature is different from hap.context.onTrigger, as set by Pattern.onTrigger(onTrigger) + // TODO: get rid of deadline after https://codeberg.org/uzu/strudel/pulls/1004 + try { + if (!hap.context.onTrigger || !hap.context.dominantTrigger) { + await defaultOutput(hap, deadline, duration, cps, t); + } + if (hap.context.onTrigger) { + // call signature of output / onTrigger is different... + await hap.context.onTrigger(hap, getTime(), cps, t); + } + } catch (err) { + logger(`[cyclist] error: ${err.message}`, 'error'); } - if (hap.context.onTrigger) { - // call signature of output / onTrigger is different... - await hap.context.onTrigger(hap, getTime(), cps, t); - } - } catch (err) { - logger(`[cyclist] error: ${err.message}`, 'error'); - } - }; + }; diff --git a/packages/core/speak.mjs b/packages/cyclist/speak.mjs similarity index 97% rename from packages/core/speak.mjs rename to packages/cyclist/speak.mjs index e0f60184e..7c4a3d41f 100644 --- a/packages/core/speak.mjs +++ b/packages/cyclist/speak.mjs @@ -4,7 +4,7 @@ Copyright (C) 2022 Strudel contributors - see . */ -import { register } from './index.mjs'; +import { register } from '@strudel/core'; let synth; try { diff --git a/packages/core/time.mjs b/packages/cyclist/time.mjs similarity index 100% rename from packages/core/time.mjs rename to packages/cyclist/time.mjs diff --git a/packages/core/ui.mjs b/packages/cyclist/ui.mjs similarity index 100% rename from packages/core/ui.mjs rename to packages/cyclist/ui.mjs diff --git a/packages/cyclist/vite.config.js b/packages/cyclist/vite.config.js new file mode 100644 index 000000000..718798fb3 --- /dev/null +++ b/packages/cyclist/vite.config.js @@ -0,0 +1,20 @@ +import { defineConfig } from 'vite'; +import { dependencies } from './package.json'; +import { resolve } from 'path'; + +// https://vitejs.dev/config/ +export default defineConfig({ + base: './', + plugins: [], + build: { + lib: { + entry: resolve(__dirname, 'index.mjs'), + formats: ['es'], + fileName: (ext) => ({ es: 'index.mjs' })[ext], + }, + rollupOptions: { + external: [...Object.keys(dependencies)], + }, + target: 'esnext', + }, +}); diff --git a/packages/core/zyklus.mjs b/packages/cyclist/zyklus.mjs similarity index 100% rename from packages/core/zyklus.mjs rename to packages/cyclist/zyklus.mjs diff --git a/packages/draw/draw.mjs b/packages/draw/draw.mjs index a429395ff..95f8287f9 100644 --- a/packages/draw/draw.mjs +++ b/packages/draw/draw.mjs @@ -4,7 +4,8 @@ Copyright (C) 2022 Strudel contributors - see . */ -import { Pattern, getTime, State, TimeSpan } from '@strudel/core'; +import { Pattern, State, TimeSpan } from '@strudel/core'; +import { getTime } from '@strudel/cyclist'; export const getDrawContext = (id = 'test-canvas', options) => { let { contextType = '2d', pixelated = false, pixelRatio = window.devicePixelRatio } = options || {}; diff --git a/packages/draw/package.json b/packages/draw/package.json index ee1b8dd00..ca877b562 100644 --- a/packages/draw/package.json +++ b/packages/draw/package.json @@ -29,7 +29,8 @@ }, "homepage": "https://codeberg.org/uzu/strudel#readme", "dependencies": { - "@strudel/core": "workspace:*" + "@strudel/core": "workspace:*", + "@strudel/cyclist": "workspace:*" }, "devDependencies": { "vite": "^6.0.11" diff --git a/packages/hydra/hydra.mjs b/packages/hydra/hydra.mjs index 2cb265c2f..4eebf6130 100644 --- a/packages/hydra/hydra.mjs +++ b/packages/hydra/hydra.mjs @@ -1,5 +1,6 @@ import { getDrawContext } from '@strudel/draw'; -import { controls, getTime, reify } from '@strudel/core'; +import { controls, reify } from '@strudel/core'; +import { getTime } from '@strudel/cyclist'; let latestOptions; let hydra; diff --git a/packages/hydra/package.json b/packages/hydra/package.json index b022de87d..3c9e63f94 100644 --- a/packages/hydra/package.json +++ b/packages/hydra/package.json @@ -34,6 +34,7 @@ "homepage": "https://codeberg.org/uzu/strudel#readme", "dependencies": { "@strudel/core": "workspace:*", + "@strudel/cyclist": "workspace:*", "@strudel/draw": "workspace:*", "hydra-synth": "^1.3.29" }, diff --git a/packages/mondough/mondough.mjs b/packages/mondough/mondough.mjs index 15feb5d86..26b45cc85 100644 --- a/packages/mondough/mondough.mjs +++ b/packages/mondough/mondough.mjs @@ -1,5 +1,4 @@ import { - strudelScope, reify, fast, slow, @@ -12,6 +11,7 @@ import { degradeBy, silence, } from '@strudel/core'; +import { strudelScope } from '@strudel/cyclist'; import { registerLanguage } from '@strudel/transpiler'; import { MondoRunner } from 'mondolang'; diff --git a/packages/mondough/package.json b/packages/mondough/package.json index a034424c0..04bd42396 100644 --- a/packages/mondough/package.json +++ b/packages/mondough/package.json @@ -33,6 +33,7 @@ "homepage": "https://github.com/tidalcycles/strudel#readme", "dependencies": { "@strudel/core": "workspace:*", + "@strudel/cyclist": "workspace:*", "@strudel/transpiler": "workspace:*", "mondolang": "workspace:*" }, diff --git a/packages/osc/server.js b/packages/osc/server.js index 75fc5b1c0..35b684b13 100644 --- a/packages/osc/server.js +++ b/packages/osc/server.js @@ -17,7 +17,7 @@ const config = { }, udpClient: { host: 'localhost', // @param {string} Hostname of udp client for messaging - port: 57120, // @param {number} Port of udp client for messaging + port: 7771, // @param {number} Port of udp client for messaging }, wsServer: { host: 'localhost', // @param {string} Hostname of WebSocket server diff --git a/packages/transpiler/index.mjs b/packages/transpiler/index.mjs index 484c3e70c..ef9bcc6ea 100644 --- a/packages/transpiler/index.mjs +++ b/packages/transpiler/index.mjs @@ -1,4 +1,4 @@ -import { evaluate as _evaluate } from '@strudel/core'; +import { evaluate as _evaluate } from '@strudel/cyclist'; import { transpiler } from './transpiler.mjs'; export * from './transpiler.mjs'; diff --git a/packages/transpiler/package.json b/packages/transpiler/package.json index 2a5e39776..9337369af 100644 --- a/packages/transpiler/package.json +++ b/packages/transpiler/package.json @@ -31,6 +31,7 @@ "homepage": "https://codeberg.org/uzu/strudel#readme", "dependencies": { "@strudel/core": "workspace:*", + "@strudel/cyclist": "workspace:*", "@strudel/mini": "workspace:*", "acorn": "^8.14.0", "escodegen": "^2.1.0", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 7aecd35bd..3630886e5 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -209,6 +209,9 @@ importers: '@strudel/core': specifier: workspace:* version: link:../core + '@strudel/cyclist': + specifier: workspace:* + version: link:../cyclist '@strudel/draw': specifier: workspace:* version: link:../draw @@ -252,6 +255,19 @@ importers: specifier: ^6.0.11 version: 6.0.11(@types/node@22.10.10)(jiti@2.4.2)(lightningcss@1.29.1)(terser@5.37.0)(yaml@2.7.0) + packages/cyclist: + dependencies: + '@strudel/core': + specifier: '*' + version: 1.2.2 + devDependencies: + vite: + specifier: ^6.0.11 + version: 6.0.11(@types/node@22.10.10)(jiti@2.4.2)(lightningcss@1.29.1)(terser@5.37.0)(yaml@2.7.0) + vitest: + specifier: ^3.0.4 + version: 3.0.4(@types/debug@4.1.12)(@types/node@22.10.10)(@vitest/ui@3.0.4)(jiti@2.4.2)(lightningcss@1.29.1)(terser@5.37.0)(yaml@2.7.0) + packages/desktopbridge: dependencies: '@strudel/core': @@ -266,6 +282,9 @@ importers: '@strudel/core': specifier: workspace:* version: link:../core + '@strudel/cyclist': + specifier: workspace:* + version: link:../cyclist devDependencies: vite: specifier: ^6.0.11 @@ -301,6 +320,9 @@ importers: '@strudel/core': specifier: workspace:* version: link:../core + '@strudel/cyclist': + specifier: workspace:* + version: link:../cyclist '@strudel/draw': specifier: workspace:* version: link:../draw @@ -361,6 +383,9 @@ importers: '@strudel/core': specifier: workspace:* version: link:../core + '@strudel/cyclist': + specifier: workspace:* + version: link:../cyclist '@strudel/transpiler': specifier: workspace:* version: link:../transpiler @@ -560,6 +585,9 @@ importers: '@strudel/core': specifier: workspace:* version: link:../core + '@strudel/cyclist': + specifier: workspace:* + version: link:../cyclist '@strudel/mini': specifier: workspace:* version: link:../mini @@ -696,6 +724,9 @@ importers: '@strudel/csound': specifier: workspace:* version: link:../packages/csound + '@strudel/cyclist': + specifier: workspace:* + version: link:../packages/cyclist '@strudel/desktopbridge': specifier: workspace:* version: link:../packages/desktopbridge @@ -2453,6 +2484,9 @@ packages: '@sinclair/typebox@0.27.8': resolution: {integrity: sha512-+Fj43pSMwJs4KRrH/938Uf+uAELIgVBmQzg/q1YG10djyfA3TnrU8N8XzqCh/okZdszqBQTZf96idMfE5lnwTA==} + '@strudel/core@1.2.2': + resolution: {integrity: sha512-rPFAwV7Emz85HyKwfVVn+2cNOHCGBbWw6XImv0elnzRiXxKWMdmZfuSL3xgpheEg9WUgacgmzJL9kbvfCitGtA==} + '@supabase/auth-js@2.67.3': resolution: {integrity: sha512-NJDaW8yXs49xMvWVOkSIr8j46jf+tYHV0wHhrwOaLLMZSFO4g6kKAf+MfzQ2RaD06OCUkUHIzctLAxjTgEVpzw==} @@ -7657,6 +7691,7 @@ packages: workbox-google-analytics@7.0.0: resolution: {integrity: sha512-MEYM1JTn/qiC3DbpvP2BVhyIH+dV/5BjHk756u9VbwuAhu0QHyKscTnisQuz21lfRpOwiS9z4XdqeVAKol0bzg==} + deprecated: It is not compatible with newer versions of GA starting with v4, as long as you are using GAv3 it should be ok, but the package is not longer being maintained workbox-navigation-preload@7.0.0: resolution: {integrity: sha512-juWCSrxo/fiMz3RsvDspeSLGmbgC0U9tKqcUPZBCf35s64wlaLXyn2KdHHXVQrb2cqF7I0Hc9siQalainmnXJA==} @@ -9808,6 +9843,10 @@ snapshots: '@sinclair/typebox@0.27.8': {} + '@strudel/core@1.2.2': + dependencies: + fraction.js: 5.2.1 + '@supabase/auth-js@2.67.3': dependencies: '@supabase/node-fetch': 2.6.15 diff --git a/website/package.json b/website/package.json index 499758147..429ab58f9 100644 --- a/website/package.json +++ b/website/package.json @@ -26,6 +26,7 @@ "@nanostores/react": "^0.8.4", "@strudel/codemirror": "workspace:*", "@strudel/core": "workspace:*", + "@strudel/cyclist": "workspace:*", "@strudel/csound": "workspace:*", "@strudel/desktopbridge": "workspace:*", "@strudel/draw": "workspace:*", diff --git a/website/src/repl/util.mjs b/website/src/repl/util.mjs index ac27158f4..9c64b6aab 100644 --- a/website/src/repl/util.mjs +++ b/website/src/repl/util.mjs @@ -1,4 +1,5 @@ -import { evalScope, hash2code, logger } from '@strudel/core'; +import { hash2code, logger } from '@strudel/core'; +import { evalScope } from '@strudel/cyclist'; import { settingPatterns } from '../settings.mjs'; import { setVersionDefaults } from '@strudel/webaudio'; import { getMetadata } from '../metadata_parser';