mirror of
https://codeberg.org/uzu/strudel
synced 2026-07-21 20:55:12 -04:00
Compare commits
10 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| 535a822d2a | |||
| 08cc9b03d7 | |||
| 46949d165d | |||
| 88b94b21b8 | |||
| 80d6a1903a | |||
| 35d98f4d40 | |||
| 2c7198a5f0 | |||
| 58c88c56ba | |||
| ecad4d0b11 | |||
| fddb66d74c |
@@ -10,7 +10,7 @@ function getExports(code) {
|
||||
let ast;
|
||||
try {
|
||||
ast = parse(code, {
|
||||
ecmaVersion: 11,
|
||||
ecmaVersion: 'latest',
|
||||
sourceType: 'module',
|
||||
});
|
||||
} catch (err) {
|
||||
@@ -49,9 +49,7 @@ function getExports(code) {
|
||||
}
|
||||
|
||||
function isDocumented(name, docs) {
|
||||
return docs.find(
|
||||
(d) => d.name === name || d.tags?.find((t) => t.title === 'synonyms' && t.value.split(', ').includes(name)),
|
||||
);
|
||||
return docs.find((d) => d.name === name || d.synonyms?.includes(name));
|
||||
}
|
||||
|
||||
async function getUndocumented(path, docs) {
|
||||
|
||||
@@ -3289,6 +3289,7 @@ export const striate = register('striate', function (n, pat) {
|
||||
/**
|
||||
* Makes the sample fit the given number of cycles by changing the speed.
|
||||
* @name loopAt
|
||||
* @synonyms loopat
|
||||
* @memberof Pattern
|
||||
* @returns Pattern
|
||||
* @example
|
||||
@@ -3421,6 +3422,7 @@ export const fit = register('fit', (pat) =>
|
||||
* given by a global clock and this function will be
|
||||
* deprecated/removed.
|
||||
* @name loopAtCps
|
||||
* @synonyms loopatcps
|
||||
* @memberof Pattern
|
||||
* @returns Pattern
|
||||
* @example
|
||||
|
||||
@@ -10,11 +10,27 @@ import Fraction from './fraction.mjs';
|
||||
|
||||
import { id, keyAlias, getCurrentKeyboardState } from './util.mjs';
|
||||
|
||||
/**
|
||||
* A `signal` consisting of a constant value. Similar to `pure`, except that function
|
||||
* creates a pattern with one event per cycle, whereas this pattern doesn't have an intrinsic
|
||||
* structure.
|
||||
*
|
||||
* @param {*} value The constant value of the resulting pattern
|
||||
* @returns Pattern
|
||||
*/
|
||||
export function steady(value) {
|
||||
// A continuous value
|
||||
return new Pattern((state) => [new Hap(undefined, state.span, value)]);
|
||||
}
|
||||
|
||||
/**
|
||||
* Creates a "signal", an unstructured pattern consisting of a single value that changes
|
||||
* over time.
|
||||
*
|
||||
*
|
||||
* @param {*} func
|
||||
* @returns Pattern
|
||||
*/
|
||||
export const signal = (func) => {
|
||||
const query = (state) => [new Hap(undefined, state.span, func(state.span.begin))];
|
||||
return new Pattern(query);
|
||||
@@ -23,7 +39,7 @@ export const signal = (func) => {
|
||||
/**
|
||||
* A sawtooth signal between 0 and 1.
|
||||
*
|
||||
* @return {Pattern}
|
||||
* @type {Pattern}
|
||||
* @example
|
||||
* note("<c3 [eb3,g3] g2 [g3,bb3]>*8")
|
||||
* .clip(saw.slow(2))
|
||||
@@ -157,6 +173,7 @@ export const time = signal(id);
|
||||
/**
|
||||
* The mouse's x position value ranges from 0 to 1.
|
||||
* @name mousex
|
||||
* @synonyms mouseX
|
||||
* @return {Pattern}
|
||||
* @example
|
||||
* n(mousex.segment(4).range(0,7)).scale("C:minor")
|
||||
@@ -166,6 +183,7 @@ export const time = signal(id);
|
||||
/**
|
||||
* The mouse's y position value ranges from 0 to 1.
|
||||
* @name mousey
|
||||
* @synonyms mouseY
|
||||
* @return {Pattern}
|
||||
* @example
|
||||
* n(mousey.segment(4).range(0,7)).scale("C:minor")
|
||||
@@ -215,10 +233,6 @@ const timeToRandsPrime = (seed, n) => {
|
||||
|
||||
const timeToRands = (t, n) => timeToRandsPrime(timeToIntSeed(t), n);
|
||||
|
||||
/**
|
||||
*
|
||||
*/
|
||||
|
||||
/**
|
||||
* A discrete pattern of numbers from 0 to n-1
|
||||
* @example
|
||||
@@ -389,17 +403,23 @@ export const chooseInWith = (pat, xs) => {
|
||||
|
||||
/**
|
||||
* Chooses randomly from the given list of elements.
|
||||
* @synonyms chooseOut
|
||||
* @param {...any} xs values / patterns to choose from.
|
||||
* @returns {Pattern} - a continuous pattern.
|
||||
* @example
|
||||
* note("c2 g2!2 d2 f1").s(choose("sine", "triangle", "bd:6"))
|
||||
*/
|
||||
export const choose = (...xs) => chooseWith(rand, xs);
|
||||
|
||||
// todo: doc
|
||||
export const chooseIn = (...xs) => chooseInWith(rand, xs);
|
||||
export const chooseOut = choose;
|
||||
|
||||
/**
|
||||
* As with {choose}, but the structure comes from the chosen values, rather
|
||||
* than the pattern you're using to choose with.
|
||||
* @param {...any} xs
|
||||
* @returns
|
||||
*/
|
||||
export const chooseIn = (...xs) => chooseInWith(rand, xs);
|
||||
|
||||
/**
|
||||
* Chooses from the given list of values (or patterns of values), according
|
||||
* to the pattern that the method is called on. The pattern should be in
|
||||
@@ -496,6 +516,7 @@ function _perlin(t) {
|
||||
const v = interp(t - ta)(timeToRand(ta))(timeToRand(tb));
|
||||
return v;
|
||||
}
|
||||
|
||||
export const perlinWith = (tpat) => {
|
||||
return tpat.fmap(_perlin);
|
||||
};
|
||||
@@ -541,6 +562,15 @@ export const perlin = perlinWith(time.fmap((v) => Number(v)));
|
||||
*/
|
||||
export const berlin = berlinWith(time.fmap((v) => Number(v)));
|
||||
|
||||
/**
|
||||
* Removes events from a pattern given a signal of numbers and a cutoff
|
||||
* value for interpreting that pattern as true or false.
|
||||
* @param {number} withPat - A numeric pattern for comparing the main pattern
|
||||
* against. Values higher than the cutoff will let events through and lower
|
||||
* values will remove events from the main pattern
|
||||
* @param {number} cutoff - The threshold value to use when interpreting the
|
||||
* `withPat`
|
||||
*/
|
||||
export const degradeByWith = register(
|
||||
'degradeByWith',
|
||||
(withPat, x, pat) => pat.fmap((a) => (_) => a).appLeft(withPat.filterValues((v) => v > x)),
|
||||
|
||||
@@ -14,12 +14,7 @@ npm i @strudel/gamepad --save
|
||||
import { gamepad } from '@strudel/gamepad';
|
||||
|
||||
// Initialize gamepad (optional index parameter, defaults to 0)
|
||||
const pad = gamepad(0); // Default mapping is XBOX {a: 0, b: 1, x: 2, y: 3}
|
||||
|
||||
//const pad = gamepad(0, 'XBOX'); // XBOX button mapping {a: 0, b: 1, x: 2, y: 3}
|
||||
//const pad = gamepad(0, 'NES'); // Nintendo button mapping {a: 1, b: 0, x: 3, y: 2}
|
||||
//const pad = gamepad(0, {a: 0, b: 1, x: 2, y: 3}); // Custom mapping
|
||||
|
||||
const pad = gamepad(0);
|
||||
|
||||
// Use gamepad inputs in patterns
|
||||
const pattern = sequence([
|
||||
@@ -91,7 +86,6 @@ $: sound("hadoken").gain(pad.checkSequence(HADOKEN))
|
||||
## Multiple Gamepads
|
||||
|
||||
You can connect multiple gamepads by specifying the gamepad index:
|
||||
Make sure to press buttons on all connected gamepads before hitting play, so the browser can properly detect them.
|
||||
|
||||
```javascript
|
||||
const pad1 = gamepad(0); // First gamepad
|
||||
|
||||
@@ -107,32 +107,9 @@ $: s("free_hadouken -").slow(2)
|
||||
samples({free_hadouken: 'https://cdn.freesound.org/previews/67/67674_111920-lq.mp3'})
|
||||
`} />
|
||||
|
||||
### Button Sequences
|
||||
|
||||
### Button Mappings
|
||||
|
||||
The gamepad module supports different button mapping configurations to accommodate various gamepad layouts:
|
||||
|
||||
- **XBOX** (Default): Standard Xbox-style mapping where A=0, B=1, X=2, Y=3
|
||||
- **NES**: Nintendo-style mapping where B=0, A=1, Y=2, X=3
|
||||
- **Custom**: Define your own button mapping by passing an object with button assignments
|
||||
|
||||
You can specify the mapping when initializing the gamepad:
|
||||
|
||||
<MiniRepl
|
||||
client:idle
|
||||
tune={`
|
||||
const pad1 = gamepad(0); // Default mapping is XBOX {a: 0, b: 1, x: 2, y: 3}
|
||||
const pad2 = gamepad(1, 'XBOX'); // XBOX button mapping {a: 0, b: 1, x: 2, y: 3}
|
||||
const pad3 = gamepad(2, 'NES'); // Nintendo button mapping {a: 1, b: 0, x: 3, y: 2}
|
||||
const pad4 = gamepad(3, {a: 0, b: 1, x: 2, y: 3}); // Custom mapping
|
||||
`}
|
||||
/>
|
||||
|
||||
### Multiple Gamepads
|
||||
## Multiple Gamepads
|
||||
|
||||
Strudel supports multiple gamepads. You can specify the gamepad index to connect to different devices.
|
||||
Make sure to press buttons on all connected gamepads before hitting play, so the browser can properly detect them.
|
||||
|
||||
<MiniRepl
|
||||
client:idle
|
||||
|
||||
+28
-119
@@ -1,62 +1,35 @@
|
||||
// @strudel/gamepad/index.mjs
|
||||
|
||||
import { signal } from '@strudel/core';
|
||||
import { logger } from '@strudel/core';
|
||||
|
||||
// Button mapping for Logitech Dual Action (STANDARD GAMEPAD Vendor: 046d Product: c216)
|
||||
|
||||
const buttonMapSettings = {
|
||||
XBOX: {
|
||||
// XBOX mapping default
|
||||
a: 0,
|
||||
b: 1,
|
||||
x: 2,
|
||||
y: 3,
|
||||
lb: 4,
|
||||
rb: 5,
|
||||
lt: 6,
|
||||
rt: 7,
|
||||
back: 8,
|
||||
start: 9,
|
||||
u: 12,
|
||||
up: 12,
|
||||
d: 13,
|
||||
down: 13,
|
||||
l: 14,
|
||||
left: 14,
|
||||
r: 15,
|
||||
right: 15,
|
||||
},
|
||||
NES: {
|
||||
// Nintendo mapping
|
||||
a: 1,
|
||||
b: 0,
|
||||
x: 3,
|
||||
y: 2,
|
||||
lb: 4,
|
||||
rb: 5,
|
||||
lt: 6,
|
||||
rt: 7,
|
||||
back: 8,
|
||||
start: 9,
|
||||
u: 12,
|
||||
up: 12,
|
||||
d: 13,
|
||||
down: 13,
|
||||
l: 14,
|
||||
left: 14,
|
||||
r: 15,
|
||||
right: 15,
|
||||
},
|
||||
export const buttonMap = {
|
||||
a: 0,
|
||||
b: 1,
|
||||
x: 2,
|
||||
y: 3,
|
||||
lb: 4,
|
||||
rb: 5,
|
||||
lt: 6,
|
||||
rt: 7,
|
||||
back: 8,
|
||||
start: 9,
|
||||
u: 12,
|
||||
up: 12,
|
||||
d: 13,
|
||||
down: 13,
|
||||
l: 14,
|
||||
left: 14,
|
||||
r: 15,
|
||||
right: 15,
|
||||
};
|
||||
|
||||
class ButtonSequenceDetector {
|
||||
constructor(timeWindow = 1000, mapping) {
|
||||
constructor(timeWindow = 1000) {
|
||||
this.sequence = [];
|
||||
this.timeWindow = timeWindow;
|
||||
this.lastInputTime = 0;
|
||||
this.buttonStates = Array(16).fill(0); // Track previous state of each button
|
||||
this.buttonMap = mapping;
|
||||
// Button mapping for character inputs
|
||||
}
|
||||
|
||||
@@ -71,8 +44,7 @@ class ButtonSequenceDetector {
|
||||
}
|
||||
|
||||
// Store the button name instead of index
|
||||
const buttonName =
|
||||
Object.keys(this.buttonMap).find((key) => this.buttonMap[key] === buttonIndex) || buttonIndex.toString();
|
||||
const buttonName = Object.keys(buttonMap).find((key) => buttonMap[key] === buttonIndex) || buttonIndex.toString();
|
||||
|
||||
this.sequence.push({
|
||||
input: buttonName,
|
||||
@@ -115,9 +87,9 @@ class ButtonSequenceDetector {
|
||||
// Check if either the input matches directly or they refer to the same button in the map
|
||||
return (
|
||||
input === target ||
|
||||
this.buttonMap[input] === this.buttonMap[target] ||
|
||||
buttonMap[input] === buttonMap[target] ||
|
||||
// Also check if the numerical index matches
|
||||
this.buttonMap[input] === parseInt(target)
|
||||
buttonMap[input] === parseInt(target)
|
||||
);
|
||||
})
|
||||
? 1
|
||||
@@ -126,10 +98,9 @@ class ButtonSequenceDetector {
|
||||
}
|
||||
|
||||
class GamepadHandler {
|
||||
constructor(index = 0, mapping) {
|
||||
constructor(index = 0) {
|
||||
// Add index parameter
|
||||
this._gamepads = {};
|
||||
this._mapping = mapping;
|
||||
this._activeGamepad = index; // Use provided index
|
||||
this._axes = [0, 0, 0, 0];
|
||||
this._buttons = Array(16).fill(0);
|
||||
@@ -172,66 +143,12 @@ class GamepadHandler {
|
||||
}
|
||||
}
|
||||
|
||||
// Add utility function to list all connected gamepads
|
||||
export const listGamepads = () => {
|
||||
const gamepads = navigator.getGamepads();
|
||||
const connectedGamepads = Array.from(gamepads)
|
||||
.filter((gp) => gp !== null)
|
||||
.map((gp) => ({
|
||||
index: gp.index,
|
||||
id: gp.id,
|
||||
mapping: gp.mapping,
|
||||
buttons: gp.buttons.length,
|
||||
axes: gp.axes.length,
|
||||
connected: gp.connected,
|
||||
timestamp: gp.timestamp,
|
||||
}));
|
||||
// Format the gamepads info into a readable string
|
||||
const gamepadsInfo = connectedGamepads.map((gp) => `${gp.index}: ${gp.id}`).join('\n');
|
||||
|
||||
logger(`[gamepad] available gamepads:\n${gamepadsInfo}`);
|
||||
return connectedGamepads;
|
||||
};
|
||||
|
||||
// Module-level state store for toggle states
|
||||
const gamepadStates = new Map();
|
||||
|
||||
export const gamepad = (index = 0, mapping = 'XBOX') => {
|
||||
// list connected gamepads
|
||||
const connectedGamepads = listGamepads();
|
||||
|
||||
// Check if the requested gamepad index exists
|
||||
const requestedGamepad = connectedGamepads.find((gp) => gp.index === index);
|
||||
if (!requestedGamepad) {
|
||||
throw new Error(
|
||||
`[gamepad] gamepad at index ${index} not found. available gamepads: ${connectedGamepads.map((gp) => gp.index).join(', ')}`,
|
||||
);
|
||||
}
|
||||
|
||||
// Handle button mapping
|
||||
let buttonMap = buttonMapSettings.XBOX;
|
||||
|
||||
if (typeof mapping === 'string') {
|
||||
buttonMap = buttonMapSettings[mapping.toUpperCase()];
|
||||
} else if (typeof mapping === 'object') {
|
||||
buttonMap = { ...buttonMapSettings.XBOX, ...mapping };
|
||||
// Check that all mapping values are valid button indices
|
||||
const maxButtons = requestedGamepad.buttons; // Standard gamepad has 16 buttons
|
||||
for (const [key, value] of Object.entries(mapping)) {
|
||||
if (typeof value !== 'number' || value < 0 || value >= maxButtons) {
|
||||
throw new Error(
|
||||
`[gamepad] invalid button mapping for '${key}': ${value}. Must be a number between 0 and ${maxButtons - 1}`,
|
||||
);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (!buttonMap) {
|
||||
throw new Error(`[gamepad] button mapping '${mapping}' not found`);
|
||||
}
|
||||
|
||||
const handler = new GamepadHandler(index, buttonMap);
|
||||
const sequenceDetector = new ButtonSequenceDetector(2000, buttonMap);
|
||||
export const gamepad = (index = 0) => {
|
||||
const handler = new GamepadHandler(index);
|
||||
const sequenceDetector = new ButtonSequenceDetector(2000);
|
||||
|
||||
// Base signal that polls gamepad state and handles sequence detection
|
||||
const baseSignal = signal((t) => {
|
||||
@@ -301,14 +218,8 @@ export const gamepad = (index = 0, mapping = 'XBOX') => {
|
||||
return baseSignal.fmap(() => sequenceDetector.checkSequence(sequence));
|
||||
};
|
||||
const checkSequence = btnSequence;
|
||||
const sequence = btnSequence;
|
||||
const btnSeq = btnSequence;
|
||||
const btnseq = btnSequence;
|
||||
const seq = btnSequence;
|
||||
|
||||
logger(
|
||||
`[gamepad] connected to gamepad ${index} (${requestedGamepad.id}) with ${typeof mapping === 'object' ? 'custom' : mapping} mapping`,
|
||||
);
|
||||
const btnseq = btnSeq;
|
||||
|
||||
// Return an object with all controls
|
||||
return {
|
||||
@@ -323,11 +234,9 @@ export const gamepad = (index = 0, mapping = 'XBOX') => {
|
||||
]),
|
||||
),
|
||||
checkSequence,
|
||||
sequence,
|
||||
btnSequence,
|
||||
btnSeq,
|
||||
btnseq,
|
||||
seq,
|
||||
raw: baseSignal,
|
||||
};
|
||||
};
|
||||
|
||||
+250
-171
@@ -32,7 +32,12 @@
|
||||
"/packages/codemirror/keybindings.mjs": [
|
||||
"keybindings"
|
||||
],
|
||||
"/packages/codemirror/themes/strudel-theme.mjs": [],
|
||||
"/packages/codemirror/themes/theme-helper.mjs": [
|
||||
"createTheme"
|
||||
],
|
||||
"/packages/codemirror/themes/strudel-theme.mjs": [
|
||||
"settings"
|
||||
],
|
||||
"/packages/codemirror/themes/bluescreen.mjs": [
|
||||
"settings"
|
||||
],
|
||||
@@ -48,7 +53,103 @@
|
||||
"/packages/codemirror/themes/algoboy.mjs": [
|
||||
"settings"
|
||||
],
|
||||
"/packages/codemirror/themes/terminal.mjs": [
|
||||
"/packages/codemirror/themes/CutiePi.mjs": [
|
||||
"settings"
|
||||
],
|
||||
"/packages/codemirror/themes/sonic-pink.mjs": [
|
||||
"settings"
|
||||
],
|
||||
"/packages/codemirror/themes/red-text.mjs": [
|
||||
"settings"
|
||||
],
|
||||
"/packages/codemirror/themes/green-text.mjs": [
|
||||
"settings"
|
||||
],
|
||||
"/packages/codemirror/themes/archBtw.mjs": [
|
||||
"settings"
|
||||
],
|
||||
"/packages/codemirror/themes/fruitDaw.mjs": [
|
||||
"settings"
|
||||
],
|
||||
"/packages/codemirror/themes/bluescreenlight.mjs": [
|
||||
"settings"
|
||||
],
|
||||
"/packages/codemirror/themes/androidstudio.mjs": [
|
||||
"settings"
|
||||
],
|
||||
"/packages/codemirror/themes/atomone.mjs": [
|
||||
"settings"
|
||||
],
|
||||
"/packages/codemirror/themes/aura.mjs": [
|
||||
"settings"
|
||||
],
|
||||
"/packages/codemirror/themes/darcula.mjs": [
|
||||
"settings"
|
||||
],
|
||||
"/packages/codemirror/themes/dracula.mjs": [
|
||||
"settings"
|
||||
],
|
||||
"/packages/codemirror/themes/duotoneDark.mjs": [
|
||||
"settings"
|
||||
],
|
||||
"/packages/codemirror/themes/eclipse.mjs": [
|
||||
"settings"
|
||||
],
|
||||
"/packages/codemirror/themes/githubDark.mjs": [
|
||||
"settings"
|
||||
],
|
||||
"/packages/codemirror/themes/githubLight.mjs": [
|
||||
"settings"
|
||||
],
|
||||
"/packages/codemirror/themes/gruvboxDark.mjs": [
|
||||
"settings"
|
||||
],
|
||||
"/packages/codemirror/themes/gruvboxLight.mjs": [
|
||||
"settings"
|
||||
],
|
||||
"/packages/codemirror/themes/materialDark.mjs": [
|
||||
"settings"
|
||||
],
|
||||
"/packages/codemirror/themes/materialLight.mjs": [
|
||||
"settings"
|
||||
],
|
||||
"/packages/codemirror/themes/nord.mjs": [
|
||||
"settings"
|
||||
],
|
||||
"/packages/codemirror/themes/monokai.mjs": [
|
||||
"settings"
|
||||
],
|
||||
"/packages/codemirror/themes/solarizedDark.mjs": [
|
||||
"settings"
|
||||
],
|
||||
"/packages/codemirror/themes/solarizedLight.mjs": [
|
||||
"settings"
|
||||
],
|
||||
"/packages/codemirror/themes/sublime.mjs": [
|
||||
"settings"
|
||||
],
|
||||
"/packages/codemirror/themes/tokyoNight.mjs": [
|
||||
"settings"
|
||||
],
|
||||
"/packages/codemirror/themes/tokioNightStorm.mjs": [
|
||||
"settings"
|
||||
],
|
||||
"/packages/codemirror/themes/tokyoNightDay.mjs": [
|
||||
"settings"
|
||||
],
|
||||
"/packages/codemirror/themes/vscodeDark.mjs": [
|
||||
"settings"
|
||||
],
|
||||
"/packages/codemirror/themes/vscodeLight.mjs": [
|
||||
"settings"
|
||||
],
|
||||
"/packages/codemirror/themes/xcodeLight.mjs": [
|
||||
"settings"
|
||||
],
|
||||
"/packages/codemirror/themes/bbedit.mjs": [
|
||||
"settings"
|
||||
],
|
||||
"/packages/codemirror/themes/noctisLilac.mjs": [
|
||||
"settings"
|
||||
],
|
||||
"/packages/codemirror/themes.mjs": [
|
||||
@@ -61,7 +162,12 @@
|
||||
"activateTheme"
|
||||
],
|
||||
"/packages/codemirror/slider.mjs": [
|
||||
"acorn parse error: SyntaxError: undefined"
|
||||
"sliderValues",
|
||||
"SliderWidget",
|
||||
"setSliderWidgets",
|
||||
"updateSliderWidgets",
|
||||
"sliderPlugin",
|
||||
"sliderWithID"
|
||||
],
|
||||
"/packages/codemirror/widget.mjs": [
|
||||
"addWidget",
|
||||
@@ -78,6 +184,59 @@
|
||||
"StrudelMirror"
|
||||
],
|
||||
"/packages/codemirror/index.mjs": [],
|
||||
"/packages/core/logger.mjs": [
|
||||
"logKey",
|
||||
"errorLogger",
|
||||
"logger"
|
||||
],
|
||||
"/packages/core/util.mjs": [
|
||||
"isNoteWithOctave",
|
||||
"isNote",
|
||||
"tokenizeNote",
|
||||
"noteToMidi",
|
||||
"midiToFreq",
|
||||
"freqToMidi",
|
||||
"valueToMidi",
|
||||
"getEventOffsetMs",
|
||||
"_mod",
|
||||
"averageArray",
|
||||
"nanFallback",
|
||||
"getSoundIndex",
|
||||
"getPlayableNoteValue",
|
||||
"getFrequency",
|
||||
"rotate",
|
||||
"pipe",
|
||||
"compose",
|
||||
"flatten",
|
||||
"id",
|
||||
"constant",
|
||||
"listRange",
|
||||
"curry",
|
||||
"parseNumeral",
|
||||
"mapArgs",
|
||||
"numeralArgs",
|
||||
"parseFractional",
|
||||
"fractionalArgs",
|
||||
"splitAt",
|
||||
"zipWith",
|
||||
"pairs",
|
||||
"clamp",
|
||||
"sol2note",
|
||||
"uniq",
|
||||
"uniqsort",
|
||||
"uniqsortr",
|
||||
"unicodeToBase64",
|
||||
"base64ToUnicode",
|
||||
"code2hash",
|
||||
"hash2code",
|
||||
"objectMap",
|
||||
"cycleToSeconds",
|
||||
"ClockCollator",
|
||||
"getPerformanceTimeSeconds",
|
||||
"keyAlias",
|
||||
"getCurrentKeyboardState",
|
||||
"stringifyValues"
|
||||
],
|
||||
"/packages/core/fraction.mjs": [
|
||||
"gcd",
|
||||
"lcm"
|
||||
@@ -91,45 +250,6 @@
|
||||
"/packages/core/state.mjs": [
|
||||
"State"
|
||||
],
|
||||
"/packages/core/logger.mjs": [
|
||||
"logKey",
|
||||
"logger"
|
||||
],
|
||||
"/packages/core/util.mjs": [
|
||||
"isNoteWithOctave",
|
||||
"isNote",
|
||||
"tokenizeNote",
|
||||
"noteToMidi",
|
||||
"midiToFreq",
|
||||
"freqToMidi",
|
||||
"valueToMidi",
|
||||
"_mod",
|
||||
"nanFallback",
|
||||
"getSoundIndex",
|
||||
"getPlayableNoteValue",
|
||||
"getFrequency",
|
||||
"rotate",
|
||||
"pipe",
|
||||
"compose",
|
||||
"flatten",
|
||||
"constant",
|
||||
"listRange",
|
||||
"curry",
|
||||
"parseNumeral",
|
||||
"mapArgs",
|
||||
"numeralArgs",
|
||||
"parseFractional",
|
||||
"fractionalArgs",
|
||||
"splitAt",
|
||||
"zipWith",
|
||||
"clamp",
|
||||
"sol2note",
|
||||
"unicodeToBase64",
|
||||
"base64ToUnicode",
|
||||
"code2hash",
|
||||
"hash2code",
|
||||
"objectMap"
|
||||
],
|
||||
"/packages/core/value.mjs": [
|
||||
"unionWithObj",
|
||||
"valued",
|
||||
@@ -138,10 +258,8 @@
|
||||
],
|
||||
"/packages/core/drawLine.mjs": [],
|
||||
"/packages/core/pattern.mjs": [
|
||||
"calculateSteps",
|
||||
"setStringParser",
|
||||
"polyrhythm",
|
||||
"pr",
|
||||
"pm",
|
||||
"nothing",
|
||||
"isPattern",
|
||||
"reify",
|
||||
@@ -149,8 +267,12 @@
|
||||
"stackRight",
|
||||
"stackCentre",
|
||||
"stackBy",
|
||||
"fastcat",
|
||||
"_polymeterListSteps",
|
||||
"bind",
|
||||
"innerBind",
|
||||
"outerBind",
|
||||
"squeezeBind",
|
||||
"stepBind",
|
||||
"polyBind",
|
||||
"set",
|
||||
"keep",
|
||||
"keepif",
|
||||
@@ -174,96 +296,51 @@
|
||||
"func",
|
||||
"compressSpan",
|
||||
"compressspan",
|
||||
"fastgap",
|
||||
"focusSpan",
|
||||
"focusspan",
|
||||
"density",
|
||||
"sparsity",
|
||||
"zoomArc",
|
||||
"zoomarc",
|
||||
"inv",
|
||||
"juxby",
|
||||
"echowith",
|
||||
"stutWith",
|
||||
"stutwith",
|
||||
"iterback",
|
||||
"slowchunk",
|
||||
"slowChunk",
|
||||
"chunkback",
|
||||
"fastchunk",
|
||||
"bypass",
|
||||
"hsla",
|
||||
"hsl",
|
||||
"loopat",
|
||||
"loopatcps"
|
||||
"_retime",
|
||||
"_slices",
|
||||
"_fitslice",
|
||||
"_match",
|
||||
"_polymeterListSteps",
|
||||
"shrinklist",
|
||||
"s_cat",
|
||||
"s_alt",
|
||||
"s_polymeter",
|
||||
"s_taper",
|
||||
"s_taperlist",
|
||||
"s_add",
|
||||
"s_sub",
|
||||
"s_expand",
|
||||
"s_extend",
|
||||
"s_contract",
|
||||
"s_tour",
|
||||
"s_zip",
|
||||
"steps",
|
||||
"_morph"
|
||||
],
|
||||
"/packages/core/controls.mjs": [
|
||||
"createParam",
|
||||
"sound",
|
||||
"src",
|
||||
"att",
|
||||
"fmi",
|
||||
"isControlName",
|
||||
"registerControl",
|
||||
"fmrelease",
|
||||
"fmvelocity",
|
||||
"analyze",
|
||||
"fft",
|
||||
"dec",
|
||||
"sus",
|
||||
"rel",
|
||||
"hold",
|
||||
"bandf",
|
||||
"bp",
|
||||
"bandq",
|
||||
"loopb",
|
||||
"loope",
|
||||
"ch",
|
||||
"duck",
|
||||
"phaserrate",
|
||||
"phasr",
|
||||
"ph",
|
||||
"phs",
|
||||
"phc",
|
||||
"phd",
|
||||
"phasdp",
|
||||
"cutoff",
|
||||
"ctf",
|
||||
"lp",
|
||||
"lpe",
|
||||
"hpe",
|
||||
"bpe",
|
||||
"lpa",
|
||||
"hpa",
|
||||
"bpa",
|
||||
"lpd",
|
||||
"hpd",
|
||||
"bpd",
|
||||
"lps",
|
||||
"hps",
|
||||
"bps",
|
||||
"lpr",
|
||||
"hpr",
|
||||
"bpr",
|
||||
"fanchor",
|
||||
"vibrato",
|
||||
"v",
|
||||
"vmod",
|
||||
"hcutoff",
|
||||
"hp",
|
||||
"hresonance",
|
||||
"resonance",
|
||||
"delayfb",
|
||||
"dfb",
|
||||
"delayt",
|
||||
"dt",
|
||||
"lock",
|
||||
"det",
|
||||
"fadeTime",
|
||||
"fadeOutTime",
|
||||
"fadeInTime",
|
||||
"patt",
|
||||
"pdec",
|
||||
"psustain",
|
||||
"psus",
|
||||
"prel",
|
||||
"gate",
|
||||
"gat",
|
||||
"activeLabel",
|
||||
@@ -291,26 +368,13 @@
|
||||
"offset",
|
||||
"octaves",
|
||||
"mode",
|
||||
"rlp",
|
||||
"rdim",
|
||||
"rfade",
|
||||
"ir",
|
||||
"size",
|
||||
"sz",
|
||||
"rsize",
|
||||
"dist",
|
||||
"compressorKnee",
|
||||
"compressorRatio",
|
||||
"compressorAttack",
|
||||
"compressorRelease",
|
||||
"waveloss",
|
||||
"density",
|
||||
"expression",
|
||||
"sustainpedal",
|
||||
"tremolodepth",
|
||||
"tremdp",
|
||||
"tremolorate",
|
||||
"tremr",
|
||||
"fshift",
|
||||
"fshiftnote",
|
||||
"fshiftphase",
|
||||
@@ -336,27 +400,15 @@
|
||||
"binshift",
|
||||
"hbrick",
|
||||
"lbrick",
|
||||
"midichan",
|
||||
"control",
|
||||
"ccn",
|
||||
"ccv",
|
||||
"polyTouch",
|
||||
"midibend",
|
||||
"miditouch",
|
||||
"ctlNum",
|
||||
"frameRate",
|
||||
"frames",
|
||||
"hours",
|
||||
"midicmd",
|
||||
"minutes",
|
||||
"progNum",
|
||||
"seconds",
|
||||
"songPtr",
|
||||
"uid",
|
||||
"val",
|
||||
"cps",
|
||||
"legato",
|
||||
"dur",
|
||||
"zrand",
|
||||
"curve",
|
||||
"deltaSlide",
|
||||
@@ -368,44 +420,40 @@
|
||||
"zmod",
|
||||
"zcrush",
|
||||
"zdelay",
|
||||
"tremolo",
|
||||
"zzfx",
|
||||
"colour",
|
||||
"createParams",
|
||||
"ad",
|
||||
"ds",
|
||||
"ar"
|
||||
"ar",
|
||||
"midimap",
|
||||
"ctlNum",
|
||||
"polyTouch",
|
||||
"getControlName"
|
||||
],
|
||||
"/packages/core/euclid.mjs": [
|
||||
"bjork",
|
||||
"e",
|
||||
"euclidrot"
|
||||
],
|
||||
"/packages/core/zyklus.mjs": [],
|
||||
"/packages/core/signal.mjs": [
|
||||
"steady",
|
||||
"signal",
|
||||
"isaw",
|
||||
"isaw2",
|
||||
"saw2",
|
||||
"sine2",
|
||||
"cosine2",
|
||||
"square2",
|
||||
"tri2",
|
||||
"time",
|
||||
"randrun",
|
||||
"_brandBy",
|
||||
"_irand",
|
||||
"pickSqueeze",
|
||||
"pickmodSqueeze",
|
||||
"__chooseWith",
|
||||
"randcat",
|
||||
"wrandcat",
|
||||
"chooseIn",
|
||||
"chooseOut",
|
||||
"perlinWith",
|
||||
"degradeByWith"
|
||||
"berlinWith",
|
||||
"degradeByWith",
|
||||
"_keyDown"
|
||||
],
|
||||
"/packages/core/pick.mjs": [],
|
||||
"/packages/core/speak.mjs": [
|
||||
"speak"
|
||||
],
|
||||
"/packages/core/evaluate.mjs": [
|
||||
"strudelScope",
|
||||
"evalScope",
|
||||
"evaluate"
|
||||
],
|
||||
@@ -440,13 +488,18 @@
|
||||
"isTauri"
|
||||
],
|
||||
"/packages/desktopbridge/midibridge.mjs": [],
|
||||
"/packages/desktopbridge/oscbridge.mjs": [],
|
||||
"/packages/desktopbridge/oscbridge.mjs": [
|
||||
"oscTriggerTauri"
|
||||
],
|
||||
"/packages/desktopbridge/index.mjs": [],
|
||||
"/packages/draw/draw.mjs": [
|
||||
"getDrawContext",
|
||||
"cleanupDraw",
|
||||
"Framer",
|
||||
"Drawer"
|
||||
"Drawer",
|
||||
"getComputedPropertyValue",
|
||||
"getTheme",
|
||||
"setTheme"
|
||||
],
|
||||
"/packages/draw/animate.mjs": [
|
||||
"x",
|
||||
@@ -467,16 +520,19 @@
|
||||
"convertHexToNumber"
|
||||
],
|
||||
"/packages/draw/pianoroll.mjs": [
|
||||
"__pianoroll",
|
||||
"getDrawOptions",
|
||||
"getPunchcardPainter",
|
||||
"drawPianoroll"
|
||||
],
|
||||
"/packages/draw/spiral.mjs": [],
|
||||
"/packages/draw/pitchwheel.mjs": [],
|
||||
"/packages/draw/index.mjs": [],
|
||||
"/packages/midi/midi.mjs": [
|
||||
"WebMidi",
|
||||
"enableWebMidi",
|
||||
"midin"
|
||||
"midicontrolMap",
|
||||
"midisoundMap"
|
||||
],
|
||||
"/packages/midi/index.mjs": [],
|
||||
"/packages/mini/krill-parser.js": [],
|
||||
@@ -496,12 +552,11 @@
|
||||
"/packages/repl/prebake.mjs": [
|
||||
"prebake"
|
||||
],
|
||||
"/packages/repl/repl-component.mjs": [
|
||||
"acorn parse error: SyntaxError: undefined"
|
||||
],
|
||||
"/packages/repl/repl-component.mjs": [],
|
||||
"/packages/repl/index.mjs": [],
|
||||
"/packages/soundfonts/gm.mjs": [],
|
||||
"/packages/soundfonts/fontloader.mjs": [
|
||||
"setSoundfontUrl",
|
||||
"getFontBufferSource",
|
||||
"getFontPitch",
|
||||
"registerSoundfonts"
|
||||
@@ -522,6 +577,7 @@
|
||||
"vowelFormant"
|
||||
],
|
||||
"/packages/superdough/logger.mjs": [
|
||||
"errorLogger",
|
||||
"logger",
|
||||
"setLogger"
|
||||
],
|
||||
@@ -534,10 +590,19 @@
|
||||
"valueToMidi",
|
||||
"nanFallback",
|
||||
"_mod",
|
||||
"getSoundIndex"
|
||||
"getSoundIndex",
|
||||
"cycleToSeconds",
|
||||
"secondsToCycle"
|
||||
],
|
||||
"/packages/superdough/noise.mjs": [
|
||||
"getNoiseBuffer",
|
||||
"getNoiseOscillator",
|
||||
"getNoiseMix"
|
||||
],
|
||||
"/packages/superdough/helpers.mjs": [
|
||||
"noises",
|
||||
"gainNode",
|
||||
"getWorklet",
|
||||
"getParamADSR",
|
||||
"getCompressor",
|
||||
"getADSRValues",
|
||||
@@ -550,6 +615,8 @@
|
||||
],
|
||||
"/packages/superdough/sampler.mjs": [
|
||||
"getCachedBuffer",
|
||||
"getSampleInfo",
|
||||
"getSampleBuffer",
|
||||
"getSampleBufferSource",
|
||||
"loadBuffer",
|
||||
"reverseBuffer",
|
||||
@@ -559,18 +626,32 @@
|
||||
"onTriggerSample"
|
||||
],
|
||||
"/packages/superdough/superdough.mjs": [
|
||||
"DEFAULT_MAX_POLYPHONY",
|
||||
"setMaxPolyphony",
|
||||
"setMultiChannelOrbits",
|
||||
"soundMap",
|
||||
"registerSound",
|
||||
"applyGainCurve",
|
||||
"setGainCurve",
|
||||
"getSound",
|
||||
"getAudioDevices",
|
||||
"setDefault",
|
||||
"resetDefaults",
|
||||
"setDefaultValue",
|
||||
"getDefaultValue",
|
||||
"setDefaultValues",
|
||||
"resetDefaultValues",
|
||||
"setVersionDefaults",
|
||||
"resetLoadedSounds",
|
||||
"setDefaultAudioContext",
|
||||
"getAudioContext",
|
||||
"getWorklet",
|
||||
"getAudioContextCurrentTime",
|
||||
"initAudio",
|
||||
"initAudioOnFirstClick",
|
||||
"initializeAudioOutput",
|
||||
"connectToDestination",
|
||||
"panic",
|
||||
"getLfo",
|
||||
"analysers",
|
||||
"analysersData",
|
||||
"getAnalyserById",
|
||||
@@ -579,17 +660,13 @@
|
||||
"superdough",
|
||||
"superdoughTrigger"
|
||||
],
|
||||
"/packages/superdough/noise.mjs": [
|
||||
"getNoiseOscillator",
|
||||
"getNoiseMix"
|
||||
],
|
||||
"/packages/superdough/synth.mjs": [
|
||||
"registerSynthSounds",
|
||||
"waveformN",
|
||||
"getOscillator"
|
||||
],
|
||||
"/packages/superdough/zzfx_fork.mjs": [
|
||||
"acorn parse error: SyntaxError: undefined"
|
||||
"buildSamples"
|
||||
],
|
||||
"/packages/superdough/zzfx.mjs": [
|
||||
"getZZFX",
|
||||
@@ -640,6 +717,7 @@
|
||||
],
|
||||
"/packages/transpiler/transpiler.mjs": [
|
||||
"registerWidgetType",
|
||||
"registerLanguage",
|
||||
"transpiler",
|
||||
"getWidgetID"
|
||||
],
|
||||
@@ -654,6 +732,7 @@
|
||||
"drawTimeScope",
|
||||
"drawFrequencyScope"
|
||||
],
|
||||
"/packages/webaudio/spectrum.mjs": [],
|
||||
"/packages/webaudio/index.mjs": [],
|
||||
"/packages/xen/xen.mjs": [
|
||||
"edo",
|
||||
|
||||
Reference in New Issue
Block a user