mirror of
https://codeberg.org/uzu/strudel
synced 2026-07-22 21:23:21 -04:00
Compare commits
24 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| f4f04a7d57 | |||
| a3ac9646f5 | |||
| 12b89f9f88 | |||
| 166985a055 | |||
| 85e787214b | |||
| d198910a86 | |||
| 8ce6a881e6 | |||
| 7bc8576a68 | |||
| bbe95b3995 | |||
| 2dc921e375 | |||
| 3d13955c41 | |||
| ae9638c353 | |||
| 97cd3a5946 | |||
| ca3452bf52 | |||
| 7f528870b7 | |||
| 60e5682829 | |||
| d605fbbde8 | |||
| 21e6d81d34 | |||
| 85e79d9932 | |||
| 71dfbeea88 | |||
| ffcab7bf6c | |||
| c3f6a1d6ba | |||
| 35bfd8b3ff | |||
| c2720a5738 |
+1061
-123
File diff suppressed because it is too large
Load Diff
@@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"name": "@strudel/codemirror",
|
"name": "@strudel/codemirror",
|
||||||
"version": "1.2.6",
|
"version": "1.2.8",
|
||||||
"description": "Codemirror Extensions for Strudel",
|
"description": "Codemirror Extensions for Strudel",
|
||||||
"main": "index.mjs",
|
"main": "index.mjs",
|
||||||
"publishConfig": {
|
"publishConfig": {
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"name": "@strudel/core",
|
"name": "@strudel/core",
|
||||||
"version": "1.2.5",
|
"version": "1.2.6",
|
||||||
"description": "Port of Tidal Cycles to JavaScript",
|
"description": "Port of Tidal Cycles to JavaScript",
|
||||||
"main": "index.mjs",
|
"main": "index.mjs",
|
||||||
"type": "module",
|
"type": "module",
|
||||||
@@ -31,7 +31,7 @@
|
|||||||
},
|
},
|
||||||
"homepage": "https://strudel.cc",
|
"homepage": "https://strudel.cc",
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@kabelsalat/web": "^0.4.0",
|
"@kabelsalat/web": "^0.4.1",
|
||||||
"fraction.js": "^5.2.1"
|
"fraction.js": "^5.2.1"
|
||||||
},
|
},
|
||||||
"gitHead": "0e26d4e741500f5bae35b023608f062a794905c2",
|
"gitHead": "0e26d4e741500f5bae35b023608f062a794905c2",
|
||||||
|
|||||||
@@ -26,6 +26,7 @@ import {
|
|||||||
} from './util.mjs';
|
} from './util.mjs';
|
||||||
import drawLine from './drawLine.mjs';
|
import drawLine from './drawLine.mjs';
|
||||||
import { errorLogger, logger } from './logger.mjs';
|
import { errorLogger, logger } from './logger.mjs';
|
||||||
|
import { strudelScope } from './evaluate.mjs';
|
||||||
|
|
||||||
let stringParser;
|
let stringParser;
|
||||||
|
|
||||||
@@ -1683,7 +1684,9 @@ export function register(name, func, patternify = true, preserveSteps = false, j
|
|||||||
|
|
||||||
// toplevel functions get curried as well as patternified
|
// toplevel functions get curried as well as patternified
|
||||||
// because pfunc uses spread args, we need to state the arity explicitly!
|
// because pfunc uses spread args, we need to state the arity explicitly!
|
||||||
return curry(pfunc, null, arity);
|
const curried = curry(pfunc, null, arity);
|
||||||
|
strudelScope[name] = curried;
|
||||||
|
return curried;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Like register, but defaults to stepJoin
|
// Like register, but defaults to stepJoin
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"name": "@strudel/csound",
|
"name": "@strudel/csound",
|
||||||
"version": "1.2.6",
|
"version": "1.2.8",
|
||||||
"description": "csound bindings for strudel",
|
"description": "csound bindings for strudel",
|
||||||
"main": "index.mjs",
|
"main": "index.mjs",
|
||||||
"type": "module",
|
"type": "module",
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"name": "@strudel/draw",
|
"name": "@strudel/draw",
|
||||||
"version": "1.2.5",
|
"version": "1.2.6",
|
||||||
"description": "Helpers for drawing with Strudel",
|
"description": "Helpers for drawing with Strudel",
|
||||||
"main": "index.mjs",
|
"main": "index.mjs",
|
||||||
"type": "module",
|
"type": "module",
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"name": "@strudel/embed",
|
"name": "@strudel/embed",
|
||||||
"version": "1.1.1",
|
"version": "1.1.2",
|
||||||
"description": "Embeddable Web Component to load a Strudel REPL into an iframe",
|
"description": "Embeddable Web Component to load a Strudel REPL into an iframe",
|
||||||
"main": "embed.js",
|
"main": "embed.js",
|
||||||
"type": "module",
|
"type": "module",
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"name": "@strudel/gamepad",
|
"name": "@strudel/gamepad",
|
||||||
"version": "1.2.5",
|
"version": "1.2.6",
|
||||||
"description": "Gamepad Inputs for strudel",
|
"description": "Gamepad Inputs for strudel",
|
||||||
"main": "index.mjs",
|
"main": "index.mjs",
|
||||||
"type": "module",
|
"type": "module",
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"name": "@strudel/hydra",
|
"name": "@strudel/hydra",
|
||||||
"version": "1.2.5",
|
"version": "1.2.6",
|
||||||
"description": "Hydra integration for strudel",
|
"description": "Hydra integration for strudel",
|
||||||
"main": "hydra.mjs",
|
"main": "hydra.mjs",
|
||||||
"type": "module",
|
"type": "module",
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"name": "@strudel/midi",
|
"name": "@strudel/midi",
|
||||||
"version": "1.2.6",
|
"version": "1.2.8",
|
||||||
"description": "Midi API for strudel",
|
"description": "Midi API for strudel",
|
||||||
"main": "index.mjs",
|
"main": "index.mjs",
|
||||||
"type": "module",
|
"type": "module",
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"name": "@strudel/mini",
|
"name": "@strudel/mini",
|
||||||
"version": "1.2.5",
|
"version": "1.2.6",
|
||||||
"description": "Mini notation for strudel",
|
"description": "Mini notation for strudel",
|
||||||
"main": "index.mjs",
|
"main": "index.mjs",
|
||||||
"type": "module",
|
"type": "module",
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"name": "mondolang",
|
"name": "mondolang",
|
||||||
"version": "1.1.1",
|
"version": "1.1.2",
|
||||||
"description": "a language for functional composition that translates to js",
|
"description": "a language for functional composition that translates to js",
|
||||||
"main": "mondo.mjs",
|
"main": "mondo.mjs",
|
||||||
"type": "module",
|
"type": "module",
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"name": "@strudel/mondo",
|
"name": "@strudel/mondo",
|
||||||
"version": "1.1.5",
|
"version": "1.1.6",
|
||||||
"description": "mondo notation for strudel",
|
"description": "mondo notation for strudel",
|
||||||
"main": "mondough.mjs",
|
"main": "mondough.mjs",
|
||||||
"type": "module",
|
"type": "module",
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"name": "@strudel/motion",
|
"name": "@strudel/motion",
|
||||||
"version": "1.2.5",
|
"version": "1.2.6",
|
||||||
"description": "DeviceMotion API for strudel",
|
"description": "DeviceMotion API for strudel",
|
||||||
"main": "index.mjs",
|
"main": "index.mjs",
|
||||||
"type": "module",
|
"type": "module",
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"name": "@strudel/mqtt",
|
"name": "@strudel/mqtt",
|
||||||
"version": "1.2.5",
|
"version": "1.2.6",
|
||||||
"description": "MQTT API for strudel",
|
"description": "MQTT API for strudel",
|
||||||
"main": "mqtt.mjs",
|
"main": "mqtt.mjs",
|
||||||
"type": "module",
|
"type": "module",
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"name": "@strudel/osc",
|
"name": "@strudel/osc",
|
||||||
"version": "1.3.0",
|
"version": "1.3.2",
|
||||||
"description": "OSC messaging for strudel",
|
"description": "OSC messaging for strudel",
|
||||||
"main": "osc.mjs",
|
"main": "osc.mjs",
|
||||||
"bin": "./server.js",
|
"bin": "./server.js",
|
||||||
|
|||||||
Regular → Executable
@@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"name": "@strudel/reference",
|
"name": "@strudel/reference",
|
||||||
"version": "1.2.1",
|
"version": "1.2.2",
|
||||||
"description": "Headless reference of all strudel functions",
|
"description": "Headless reference of all strudel functions",
|
||||||
"main": "index.mjs",
|
"main": "index.mjs",
|
||||||
"type": "module",
|
"type": "module",
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"name": "@strudel/repl",
|
"name": "@strudel/repl",
|
||||||
"version": "1.2.7",
|
"version": "1.2.9",
|
||||||
"description": "Strudel REPL as a Web Component",
|
"description": "Strudel REPL as a Web Component",
|
||||||
"module": "index.mjs",
|
"module": "index.mjs",
|
||||||
"publishConfig": {
|
"publishConfig": {
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"name": "@strudel/sampler",
|
"name": "@strudel/sampler",
|
||||||
"version": "0.2.3",
|
"version": "0.2.4",
|
||||||
"description": "",
|
"description": "",
|
||||||
"keywords": [
|
"keywords": [
|
||||||
"tidalcycles",
|
"tidalcycles",
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"name": "@strudel/serial",
|
"name": "@strudel/serial",
|
||||||
"version": "1.2.5",
|
"version": "1.2.6",
|
||||||
"description": "Webserial API for strudel",
|
"description": "Webserial API for strudel",
|
||||||
"main": "serial.mjs",
|
"main": "serial.mjs",
|
||||||
"type": "module",
|
"type": "module",
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"name": "@strudel/soundfonts",
|
"name": "@strudel/soundfonts",
|
||||||
"version": "1.2.6",
|
"version": "1.2.8",
|
||||||
"description": "Soundsfont support for strudel",
|
"description": "Soundsfont support for strudel",
|
||||||
"main": "index.mjs",
|
"main": "index.mjs",
|
||||||
"publishConfig": {
|
"publishConfig": {
|
||||||
|
|||||||
@@ -154,9 +154,8 @@ export function getCompressor(ac, threshold, ratio, knee, attack, release) {
|
|||||||
attack: attack ?? 0.005,
|
attack: attack ?? 0.005,
|
||||||
release: release ?? 0.05,
|
release: release ?? 0.05,
|
||||||
};
|
};
|
||||||
const now = ac.currentTime;
|
|
||||||
Object.entries(options).forEach(([key, value]) => {
|
Object.entries(options).forEach(([key, value]) => {
|
||||||
node[key].setValueAtTime(value, now);
|
node[key].value = value;
|
||||||
});
|
});
|
||||||
return node;
|
return node;
|
||||||
}
|
}
|
||||||
@@ -242,9 +241,8 @@ export function createFilter(context, start, end, params, cps, cycle) {
|
|||||||
const factory = () => context.createBiquadFilter();
|
const factory = () => context.createBiquadFilter();
|
||||||
filter = getNodeFromPool('filter', factory);
|
filter = getNodeFromPool('filter', factory);
|
||||||
filter.type = type;
|
filter.type = type;
|
||||||
const now = context.currentTime;
|
|
||||||
Object.entries({ Q: q, frequency }).forEach(([key, value]) => {
|
Object.entries({ Q: q, frequency }).forEach(([key, value]) => {
|
||||||
filter[key].setValueAtTime(value, now);
|
filter[key].value = value;
|
||||||
});
|
});
|
||||||
frequencyParam = filter.frequency;
|
frequencyParam = filter.frequency;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"name": "superdough",
|
"name": "superdough",
|
||||||
"version": "1.2.6",
|
"version": "1.2.5",
|
||||||
"description": "simple web audio synth and sampler intended for live coding. inspired by superdirt and webdirt.",
|
"description": "simple web audio synth and sampler intended for live coding. inspired by superdirt and webdirt.",
|
||||||
"main": "index.mjs",
|
"main": "index.mjs",
|
||||||
"type": "module",
|
"type": "module",
|
||||||
@@ -36,7 +36,7 @@
|
|||||||
"vite-plugin-bundle-audioworklet": "workspace:*"
|
"vite-plugin-bundle-audioworklet": "workspace:*"
|
||||||
},
|
},
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@kabelsalat/lib": "^0.4.0",
|
"@kabelsalat/lib": "^0.4.1",
|
||||||
"nanostores": "^0.11.3"
|
"nanostores": "^0.11.3"
|
||||||
},
|
},
|
||||||
"engines": {
|
"engines": {
|
||||||
|
|||||||
@@ -613,7 +613,7 @@ export const superdough = async (value, t, hapDuration, cps = 0.5, cycle = 0.5)
|
|||||||
|
|
||||||
// Kabelsalat
|
// Kabelsalat
|
||||||
if (fx.workletSrc !== undefined) {
|
if (fx.workletSrc !== undefined) {
|
||||||
const workletNode = getWorklet(ac, 'generic-processor', {});
|
const workletNode = getWorklet(ac, 'generic-processor', {}, { outputChannelCount: [2] });
|
||||||
chain.connect(workletNode);
|
chain.connect(workletNode);
|
||||||
const workletSrc = fx.workletSrc
|
const workletSrc = fx.workletSrc
|
||||||
.replace(/\bpat\[(\d+)\]/g, (_, i) => fx.workletInputs[i])
|
.replace(/\bpat\[(\d+)\]/g, (_, i) => fx.workletInputs[i])
|
||||||
|
|||||||
@@ -178,11 +178,10 @@ export function registerSynthSounds() {
|
|||||||
};
|
};
|
||||||
const factory = () => new AudioWorkletNode(ac, 'supersaw-oscillator', { outputChannelCount: [2] });
|
const factory = () => new AudioWorkletNode(ac, 'supersaw-oscillator', { outputChannelCount: [2] });
|
||||||
const o = getNodeFromPool('supersaw', factory);
|
const o = getNodeFromPool('supersaw', factory);
|
||||||
const now = ac.currentTime;
|
|
||||||
Object.entries(params).forEach(([key, value]) => {
|
Object.entries(params).forEach(([key, value]) => {
|
||||||
const param = o.parameters.get(key);
|
const param = o.parameters.get(key);
|
||||||
const target = value !== undefined ? value : param.defaultValue;
|
const target = value !== undefined ? value : param.defaultValue;
|
||||||
param.setValueAtTime(target, now);
|
param.value = target;
|
||||||
});
|
});
|
||||||
o.port.postMessage({ type: 'initialize' });
|
o.port.postMessage({ type: 'initialize' });
|
||||||
const gainAdjustment = 1 / Math.sqrt(voices);
|
const gainAdjustment = 1 / Math.sqrt(voices);
|
||||||
|
|||||||
@@ -244,11 +244,10 @@ export async function onTriggerSynth(t, value, onended, tables, cps, frameLen) {
|
|||||||
};
|
};
|
||||||
const factory = () => new AudioWorkletNode(ac, 'wavetable-oscillator-processor', { outputChannelCount: [2] });
|
const factory = () => new AudioWorkletNode(ac, 'wavetable-oscillator-processor', { outputChannelCount: [2] });
|
||||||
const source = getNodeFromPool('wavetable', factory);
|
const source = getNodeFromPool('wavetable', factory);
|
||||||
const now = ac.currentTime;
|
|
||||||
Object.entries(params).forEach(([key, value]) => {
|
Object.entries(params).forEach(([key, value]) => {
|
||||||
const param = source.parameters.get(key);
|
const param = source.parameters.get(key);
|
||||||
const target = value !== undefined ? value : param.defaultValue;
|
const target = value !== undefined ? value : param.defaultValue;
|
||||||
param.setValueAtTime(target, now);
|
param.value = target;
|
||||||
});
|
});
|
||||||
source.port.postMessage({ type: 'initialize', payload });
|
source.port.postMessage({ type: 'initialize', payload });
|
||||||
if (ac.currentTime > t) {
|
if (ac.currentTime > t) {
|
||||||
|
|||||||
@@ -1540,12 +1540,20 @@ class GenericProcessor extends AudioWorkletProcessor {
|
|||||||
this.gateNode?.setValue(0);
|
this.gateNode?.setValue(0);
|
||||||
this.gateEnded = true;
|
this.gateEnded = true;
|
||||||
}
|
}
|
||||||
const outL = outputs[0][0];
|
const output = outputs[0];
|
||||||
const outR = outputs[0][1] ?? outputs[0][0];
|
const outL = output[0];
|
||||||
|
const outR = output[1];
|
||||||
for (let n = 0; n < blockSize; n++) {
|
for (let n = 0; n < blockSize; n++) {
|
||||||
this.genSample(this.playPos, this.nodes, input ? input[n] : 0, this.registers, this.outputs, this.sources);
|
this.genSample(this.playPos, this.nodes, input ? input[n] : 0, this.registers, this.outputs, this.sources);
|
||||||
outL[n] = this.outputs[0];
|
const left = this.outputs[0];
|
||||||
outR[n] = this.outputs[1];
|
const right = this.outputs[1];
|
||||||
|
// Spread to stereo if possible; else mixdown to mono
|
||||||
|
if (outR) {
|
||||||
|
outL[n] = left;
|
||||||
|
outR[n] = right;
|
||||||
|
} else {
|
||||||
|
outL[n] = 0.5 * (left + right);
|
||||||
|
}
|
||||||
this.playPos += 1 / sampleRate;
|
this.playPos += 1 / sampleRate;
|
||||||
}
|
}
|
||||||
return true;
|
return true;
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"name": "@strudel/tonal",
|
"name": "@strudel/tonal",
|
||||||
"version": "1.2.5",
|
"version": "1.2.6",
|
||||||
"description": "Tonal functions for strudel",
|
"description": "Tonal functions for strudel",
|
||||||
"main": "index.mjs",
|
"main": "index.mjs",
|
||||||
"publishConfig": {
|
"publishConfig": {
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"name": "@strudel/transpiler",
|
"name": "@strudel/transpiler",
|
||||||
"version": "1.2.5",
|
"version": "1.2.6",
|
||||||
"description": "Transpiler for strudel user code. Converts syntactically correct but semantically meaningless JS into evaluatable strudel code.",
|
"description": "Transpiler for strudel user code. Converts syntactically correct but semantically meaningless JS into evaluatable strudel code.",
|
||||||
"main": "index.mjs",
|
"main": "index.mjs",
|
||||||
"type": "module",
|
"type": "module",
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
{
|
{
|
||||||
"name": "vite-plugin-bundle-audioworklet",
|
"name": "vite-plugin-bundle-audioworklet",
|
||||||
"main": "./vite-plugin-bundle-audioworklet.js",
|
"main": "./vite-plugin-bundle-audioworklet.js",
|
||||||
"version": "0.1.1",
|
"version": "0.1.2",
|
||||||
"description": "",
|
"description": "",
|
||||||
"keywords": [
|
"keywords": [
|
||||||
"vite",
|
"vite",
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"name": "@strudel/web",
|
"name": "@strudel/web",
|
||||||
"version": "1.2.6",
|
"version": "1.2.8",
|
||||||
"description": "Easy to setup, opiniated bundle of Strudel for the browser.",
|
"description": "Easy to setup, opiniated bundle of Strudel for the browser.",
|
||||||
"module": "web.mjs",
|
"module": "web.mjs",
|
||||||
"publishConfig": {
|
"publishConfig": {
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"name": "@strudel/webaudio",
|
"name": "@strudel/webaudio",
|
||||||
"version": "1.2.6",
|
"version": "1.2.9",
|
||||||
"description": "Web Audio helpers for Strudel",
|
"description": "Web Audio helpers for Strudel",
|
||||||
"main": "index.mjs",
|
"main": "index.mjs",
|
||||||
"type": "module",
|
"type": "module",
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"name": "@strudel/xen",
|
"name": "@strudel/xen",
|
||||||
"version": "1.2.5",
|
"version": "1.2.6",
|
||||||
"description": "Xenharmonic API for strudel",
|
"description": "Xenharmonic API for strudel",
|
||||||
"main": "index.mjs",
|
"main": "index.mjs",
|
||||||
"type": "module",
|
"type": "module",
|
||||||
|
|||||||
Generated
+18
-18
@@ -41,7 +41,7 @@ importers:
|
|||||||
version: 2.2.7
|
version: 2.2.7
|
||||||
'@vitest/coverage-v8':
|
'@vitest/coverage-v8':
|
||||||
specifier: 3.0.4
|
specifier: 3.0.4
|
||||||
version: 3.0.4(vitest@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))
|
version: 3.0.4(vitest@3.0.4)
|
||||||
'@vitest/ui':
|
'@vitest/ui':
|
||||||
specifier: ^3.0.4
|
specifier: ^3.0.4
|
||||||
version: 3.0.4(vitest@3.0.4)
|
version: 3.0.4(vitest@3.0.4)
|
||||||
@@ -235,8 +235,8 @@ importers:
|
|||||||
packages/core:
|
packages/core:
|
||||||
dependencies:
|
dependencies:
|
||||||
'@kabelsalat/web':
|
'@kabelsalat/web':
|
||||||
specifier: ^0.4.0
|
specifier: ^0.4.1
|
||||||
version: 0.4.0
|
version: 0.4.1
|
||||||
fraction.js:
|
fraction.js:
|
||||||
specifier: ^5.2.1
|
specifier: ^5.2.1
|
||||||
version: 5.2.1
|
version: 5.2.1
|
||||||
@@ -522,8 +522,8 @@ importers:
|
|||||||
packages/superdough:
|
packages/superdough:
|
||||||
dependencies:
|
dependencies:
|
||||||
'@kabelsalat/lib':
|
'@kabelsalat/lib':
|
||||||
specifier: ^0.4.0
|
specifier: ^0.4.1
|
||||||
version: 0.4.0
|
version: 0.4.1
|
||||||
nanostores:
|
nanostores:
|
||||||
specifier: ^0.11.3
|
specifier: ^0.11.3
|
||||||
version: 0.11.3
|
version: 0.11.3
|
||||||
@@ -1975,14 +1975,14 @@ packages:
|
|||||||
resolution: {integrity: sha512-yYxMVH7Dqw6nO0d5NIV8OQWnitU8k6vXH8NtgqAfIa/IUqRMxRv/NUJJ08VEKbAakwxlgBl5PJdrU0dMPStsnw==}
|
resolution: {integrity: sha512-yYxMVH7Dqw6nO0d5NIV8OQWnitU8k6vXH8NtgqAfIa/IUqRMxRv/NUJJ08VEKbAakwxlgBl5PJdrU0dMPStsnw==}
|
||||||
engines: {node: '>=v12.0.0'}
|
engines: {node: '>=v12.0.0'}
|
||||||
|
|
||||||
'@kabelsalat/core@0.3.1':
|
'@kabelsalat/core@0.4.0':
|
||||||
resolution: {integrity: sha512-y2wHZyKnwbhJdGuwXvkaIb5vqbNTW6rMDnBslHGxQHTFX5xYyxJLOcuF2/EOB698t09kOVhmmpLXKbyokf3pOA==}
|
resolution: {integrity: sha512-5zV8nh8HffW8aexObXs5pE0xgL0jb1cHc3o8UN6AvK0mBt87fjZvW65E4rMslHyq+OuCscoBJW7B3MbYfWrwMQ==}
|
||||||
|
|
||||||
'@kabelsalat/lib@0.4.0':
|
'@kabelsalat/lib@0.4.1':
|
||||||
resolution: {integrity: sha512-UoOUhYOFShDjYCTne1edevCHHxSC07FsxG9tQ5GGOOzNoKMUpGVY8Ecq9X1GVyseQFvQBgz3aqAC6K8FPZp4ZQ==}
|
resolution: {integrity: sha512-gBCjrZKD9huTKNJuBC6BXM4PMQSg8otL8A/vp8j98P9v6yWTX1TuyaqdLg/1PrIAMV4hlWoav9ZD3YMFlrvouw==}
|
||||||
|
|
||||||
'@kabelsalat/web@0.4.0':
|
'@kabelsalat/web@0.4.1':
|
||||||
resolution: {integrity: sha512-uvcOJjpKf8PG6KrgY0QEpoV4IAbIPDXh73bPtFSdDcXApbkSyEEyeNE8IoqIlqfcjIX926IOCAx9nM6FsFp6DA==}
|
resolution: {integrity: sha512-ASkFhePJLx3GjadYOueI7sHKXBbRPk/a1pfslFeQNI9gU7yZq/KrnkmOmLrgrtixAsy7gyi1vWqkmRRvH3Ki6w==}
|
||||||
|
|
||||||
'@lerna/create@8.1.9':
|
'@lerna/create@8.1.9':
|
||||||
resolution: {integrity: sha512-DPnl5lPX4v49eVxEbJnAizrpMdMTBz1qykZrAbBul9rfgk531v8oAt+Pm6O/rpAleRombNM7FJb5rYGzBJatOQ==}
|
resolution: {integrity: sha512-DPnl5lPX4v49eVxEbJnAizrpMdMTBz1qykZrAbBul9rfgk531v8oAt+Pm6O/rpAleRombNM7FJb5rYGzBJatOQ==}
|
||||||
@@ -9276,16 +9276,16 @@ snapshots:
|
|||||||
dependencies:
|
dependencies:
|
||||||
lodash: 4.17.21
|
lodash: 4.17.21
|
||||||
|
|
||||||
'@kabelsalat/core@0.3.1': {}
|
'@kabelsalat/core@0.4.0': {}
|
||||||
|
|
||||||
'@kabelsalat/lib@0.4.0':
|
'@kabelsalat/lib@0.4.1':
|
||||||
dependencies:
|
dependencies:
|
||||||
'@kabelsalat/core': 0.3.1
|
'@kabelsalat/core': 0.4.0
|
||||||
|
|
||||||
'@kabelsalat/web@0.4.0':
|
'@kabelsalat/web@0.4.1':
|
||||||
dependencies:
|
dependencies:
|
||||||
'@kabelsalat/core': 0.3.1
|
'@kabelsalat/core': 0.4.0
|
||||||
'@kabelsalat/lib': 0.4.0
|
'@kabelsalat/lib': 0.4.1
|
||||||
|
|
||||||
'@lerna/create@8.1.9(encoding@0.1.13)(typescript@5.7.3)':
|
'@lerna/create@8.1.9(encoding@0.1.13)(typescript@5.7.3)':
|
||||||
dependencies:
|
dependencies:
|
||||||
@@ -10580,7 +10580,7 @@ snapshots:
|
|||||||
transitivePeerDependencies:
|
transitivePeerDependencies:
|
||||||
- supports-color
|
- supports-color
|
||||||
|
|
||||||
'@vitest/coverage-v8@3.0.4(vitest@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))':
|
'@vitest/coverage-v8@3.0.4(vitest@3.0.4)':
|
||||||
dependencies:
|
dependencies:
|
||||||
'@ampproject/remapping': 2.3.0
|
'@ampproject/remapping': 2.3.0
|
||||||
'@bcoe/v8-coverage': 1.0.2
|
'@bcoe/v8-coverage': 1.0.2
|
||||||
|
|||||||
@@ -1,14 +1,30 @@
|
|||||||
fetch('https://codeberg.org/api/v1/repos/uzu/strudel/pulls?state=closed&page=1')
|
// this script loads all merged PRs within the given page range
|
||||||
.then((res) => res.json())
|
// it can be used to update the CHANGELOG.md file in a semi-automated way
|
||||||
.then((pulls) => {
|
// the problem: codeberg doesn't support loading merged PRs, so we have to filter them in memory
|
||||||
const r = pulls
|
// luckily, we can sort after "recentupdate", which means we can do incremental changelog generation
|
||||||
.filter((pull) => pull.merged)
|
// todo: support setting a "last_updated" date, so the script would automatically check how far it has to go
|
||||||
.sort((a, b) => new Date(b.closed_at) - new Date(a.closed_at))
|
|
||||||
.map((pull) => `${pull.closed_at} ${pull.title} by ${pull.user.login || '?'} in: [#${pull.number}](${pull.url}) `)
|
|
||||||
.join('\n');
|
|
||||||
console.log(r);
|
|
||||||
});
|
|
||||||
|
|
||||||
/*
|
async function main() {
|
||||||
|
let pageStart = 1;
|
||||||
|
let pageEnd = 1;
|
||||||
|
let prs = [];
|
||||||
|
for (let p = pageStart; p <= pageEnd; p++) {
|
||||||
|
console.log(`load page ${p}/${pageEnd}`);
|
||||||
|
const res = await fetch(
|
||||||
|
`https://codeberg.org/api/v1/repos/uzu/strudel/pulls?state=closed&sort=recentupdate&page=${p}`,
|
||||||
|
);
|
||||||
|
const pulls = await res.json();
|
||||||
|
const merged = pulls.filter((pull) => pull.merged);
|
||||||
|
prs = prs.concat(merged);
|
||||||
|
}
|
||||||
|
const output = prs
|
||||||
|
.sort((a, b) => new Date(b.closed_at) - new Date(a.closed_at))
|
||||||
|
.map(
|
||||||
|
(pull) => `- ${pull.closed_at} ${pull.title} by @${pull.user.login || '?'} in: [#${pull.number}](${pull.url}) `,
|
||||||
|
)
|
||||||
|
.join('\n');
|
||||||
|
console.log('-------------');
|
||||||
|
console.log(output);
|
||||||
|
}
|
||||||
|
|
||||||
*/
|
main();
|
||||||
|
|||||||
@@ -53,6 +53,7 @@ Available tags are:
|
|||||||
- `@url`: web page(s) related to the music (git repository, Soundcloud link, etc.)
|
- `@url`: web page(s) related to the music (git repository, Soundcloud link, etc.)
|
||||||
- `@genre`: music genre(s) (pop, jazz, etc.)
|
- `@genre`: music genre(s) (pop, jazz, etc.)
|
||||||
- `@album`: music album name
|
- `@album`: music album name
|
||||||
|
- `@tag`: custom tag
|
||||||
|
|
||||||
Note to tool authors: _Never_ trust that a song has filled those fields with syntactically correct values; make sure your software is robust enough it doesn't break if it encounters bad values
|
Note to tool authors: _Never_ trust that a song has filled those fields with syntactically correct values; make sure your software is robust enough it doesn't break if it encounters bad values
|
||||||
|
|
||||||
@@ -92,3 +93,21 @@ If a tag doesn't accept a list, it can take multi-line values:
|
|||||||
the sofa in the living room.
|
the sofa in the living room.
|
||||||
*/
|
*/
|
||||||
```
|
```
|
||||||
|
|
||||||
|
# Searching meta-data in the online repl
|
||||||
|
|
||||||
|
Meta-data can be used in the search field of the patterns tab in the online repl.
|
||||||
|
|
||||||
|
For example to search for all patterns by a specific author use the search term
|
||||||
|
|
||||||
|
```
|
||||||
|
by: Ada L
|
||||||
|
```
|
||||||
|
|
||||||
|
or search for patterns with a specific genre like
|
||||||
|
|
||||||
|
```
|
||||||
|
genre: unicorns
|
||||||
|
```
|
||||||
|
|
||||||
|
Hint: If no meta-data property is provided in the search all patterns with a `@title`, `@by` or `@tag` matching the search term will be shown.
|
||||||
|
|||||||
Reference in New Issue
Block a user