mirror of
https://codeberg.org/uzu/strudel
synced 2026-07-21 20:55:12 -04:00
Compare commits
19 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| 3a37b4825a | |||
| 4d13b981f1 | |||
| 7691403fd0 | |||
| 3b6e3624be | |||
| ab12c6ae0a | |||
| 4a894b0be2 | |||
| 4ad305550e | |||
| cf5c502a05 | |||
| e136e95375 | |||
| 004c0baa59 | |||
| 5f44ae9c4b | |||
| 66828e17d3 | |||
| b2f90ecb3b | |||
| ccf2a6de52 | |||
| 9416f317d4 | |||
| 75b6f59212 | |||
| 84238c8999 | |||
| 2dd528134a | |||
| fef50e654c |
+23
-13
@@ -551,6 +551,28 @@ export const { tremoloshape } = registerControl('tremoloshape', 'tremshape');
|
||||
|
||||
export const { drive } = registerControl('drive');
|
||||
|
||||
/**
|
||||
* waveshaping distortion with selectable algorithms
|
||||
*
|
||||
* @name shape
|
||||
* @param {number | Pattern} amount
|
||||
* @example
|
||||
* $: s("909bd").beat("0,4,8,11,14",16).shape("<2 4 1>").shapetype("<0 1 2>*2")
|
||||
*
|
||||
*/
|
||||
export const { shape } = registerControl(['shape', 'shapevol', 'shapetype']);
|
||||
|
||||
/**
|
||||
* filter overdrive for supported filter types
|
||||
*
|
||||
* @name shapetype
|
||||
* @param {number | Pattern} type
|
||||
* @example
|
||||
* $: s("909bd").beat("0,4,8,11,14",16).shape("2").shapetype("<0 1 2>")
|
||||
*
|
||||
*/
|
||||
export const { shapeType } = registerControl('shapetype');
|
||||
|
||||
/**
|
||||
* Create byte beats with custom expressions
|
||||
*
|
||||
@@ -1510,19 +1532,7 @@ export const { roomsize, size, sz, rsize } = registerControl('roomsize', 'size',
|
||||
// ['sclap'],
|
||||
// ['sclaves'],
|
||||
// ['scrash'],
|
||||
/**
|
||||
* (Deprecated) Wave shaping distortion. WARNING: can suddenly get unpredictably loud.
|
||||
* Please use distort instead, which has a more predictable response curve
|
||||
* second option in optional array syntax (ex: ".9:.5") applies a postgain to the output
|
||||
*
|
||||
*
|
||||
* @name shape
|
||||
* @param {number | Pattern} distortion between 0 and 1
|
||||
* @example
|
||||
* s("bd sd [~ bd] sd,hh*8").shape("<0 .2 .4 .6 .8>")
|
||||
*
|
||||
*/
|
||||
export const { shape } = registerControl(['shape', 'shapevol']);
|
||||
|
||||
/**
|
||||
* Wave shaping distortion. CAUTION: it can get loud.
|
||||
* Second option in optional array syntax (ex: ".9:.5") applies a postgain to the output.
|
||||
|
||||
@@ -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 { errorLogger, logger } from './logger.mjs';
|
||||
|
||||
export class Cyclist {
|
||||
constructor({
|
||||
@@ -76,7 +76,7 @@ export class Cyclist {
|
||||
}
|
||||
});
|
||||
} catch (e) {
|
||||
logger(`[cyclist] error: ${e.message}`);
|
||||
errorLogger(e);
|
||||
onError?.(e);
|
||||
}
|
||||
},
|
||||
|
||||
@@ -4,6 +4,12 @@ let debounce = 1000,
|
||||
lastMessage,
|
||||
lastTime;
|
||||
|
||||
export function errorLogger(e, origin = 'cyclist') {
|
||||
//TODO: add some kind of debug flag that enables this while in dev mode
|
||||
// console.error(e)
|
||||
logger(`[${origin}] error: ${e.message}`);
|
||||
}
|
||||
|
||||
export function logger(message, type, data = {}) {
|
||||
let t = performance.now();
|
||||
if (lastMessage === message && t - lastTime < debounce) {
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
import { NeoCyclist } from './neocyclist.mjs';
|
||||
import { Cyclist } from './cyclist.mjs';
|
||||
import { evaluate as _evaluate } from './evaluate.mjs';
|
||||
import { logger } from './logger.mjs';
|
||||
import { errorLogger, logger } from './logger.mjs';
|
||||
import { setTime } from './time.mjs';
|
||||
import { evalScope } from './evaluate.mjs';
|
||||
import { register, Pattern, isPattern, silence, stack } from './pattern.mjs';
|
||||
@@ -256,6 +256,6 @@ export const getTrigger =
|
||||
await hap.context.onTrigger(hap, getTime(), cps, t);
|
||||
}
|
||||
} catch (err) {
|
||||
logger(`[cyclist] error: ${err.message}`, 'error');
|
||||
errorLogger(err, 'getTrigger');
|
||||
}
|
||||
};
|
||||
|
||||
@@ -36,7 +36,7 @@ export async function prebake() {
|
||||
samples(`${ds}/tidal-drum-machines.json`),
|
||||
samples(`${ds}/piano.json`),
|
||||
samples(`${ds}/Dirt-Samples.json`),
|
||||
samples(`${ds}/EmuSP12.json`),
|
||||
samples(`https://raw.githubusercontent.com/tidalcycles/uzu-drumkit/main/strudel.json`),
|
||||
samples(`${ds}/vcsl.json`),
|
||||
samples(`${ds}/mridangam.json`),
|
||||
]);
|
||||
|
||||
@@ -277,3 +277,18 @@ export function applyFM(param, value, begin) {
|
||||
}
|
||||
return { stop };
|
||||
}
|
||||
|
||||
export const saturationAlgos = [
|
||||
(x, k) => ((1 + k) * x) / (1 + k * Math.abs(x)), //S Curve sourced from: https://www.nickwritesablog.com/sound-design-in-web-audio-neurofunk-bass-part-1/
|
||||
(x, k) => Math.tanh(x * k),
|
||||
];
|
||||
|
||||
export function makeSaturationCurve(amount, n_samples, algo = 0) {
|
||||
const k = typeof amount === 'number' ? amount : 50;
|
||||
const curve = new Float32Array(n_samples);
|
||||
for (let i = 0; i < n_samples; i++) {
|
||||
const x = (i * 2) / n_samples - 1;
|
||||
curve[i] = saturationAlgos[algo % saturationAlgos.length]?.(x, amount);
|
||||
}
|
||||
return curve;
|
||||
}
|
||||
|
||||
@@ -9,7 +9,7 @@ import './reverb.mjs';
|
||||
import './vowel.mjs';
|
||||
import { clamp, nanFallback, _mod, cycleToSeconds, secondsToCycle } from './util.mjs';
|
||||
import workletsUrl from './worklets.mjs?audioworklet';
|
||||
import { createFilter, gainNode, getCompressor, getWorklet } from './helpers.mjs';
|
||||
import { createFilter, gainNode, getCompressor, getWorklet, makeSaturationCurve } from './helpers.mjs';
|
||||
import { map } from 'nanostores';
|
||||
import { logger } from './logger.mjs';
|
||||
import { loadBuffer } from './sampler.mjs';
|
||||
@@ -147,6 +147,7 @@ let defaultDefaultValues = {
|
||||
phaserdepth: 0.75,
|
||||
shapevol: 1,
|
||||
distortvol: 1,
|
||||
saturatevol: 1,
|
||||
delay: 0,
|
||||
byteBeatExpression: '0',
|
||||
delayfeedback: 0.5,
|
||||
@@ -346,21 +347,23 @@ function getDelay(orbit, delaytime, delayfeedback, t, channels) {
|
||||
export function getLfo(audioContext, begin, end, properties = {}) {
|
||||
const { shape = 0, ...props } = properties;
|
||||
const { dcoffset = -0.5, depth = 1 } = properties;
|
||||
return getWorklet(audioContext, 'lfo-processor', {
|
||||
const lfoprops = {
|
||||
frequency: 1,
|
||||
depth,
|
||||
skew: 0,
|
||||
skew: 0.5,
|
||||
phaseoffset: 0,
|
||||
time: begin,
|
||||
begin,
|
||||
end,
|
||||
shape: getModulationShapeInput(shape),
|
||||
dcoffset,
|
||||
min: dcoffset - depth * 0.5,
|
||||
max: dcoffset + depth * 0.5,
|
||||
min: dcoffset * depth,
|
||||
max: dcoffset * depth + depth,
|
||||
curve: 1,
|
||||
...props,
|
||||
});
|
||||
};
|
||||
|
||||
return getWorklet(audioContext, 'lfo-processor', lfoprops);
|
||||
}
|
||||
|
||||
export function getSyncedLfo(audioContext, time, end, cps, cycle, properties = {}) {
|
||||
@@ -571,6 +574,7 @@ export const superdough = async (value, t, hapDuration, cps = 0.5, cycle = 0.5)
|
||||
crush,
|
||||
shape,
|
||||
shapevol = getDefaultValue('shapevol'),
|
||||
shapetype,
|
||||
distort,
|
||||
distortvol = getDefaultValue('distortvol'),
|
||||
pan,
|
||||
@@ -674,6 +678,14 @@ export const superdough = async (value, t, hapDuration, cps = 0.5, cycle = 0.5)
|
||||
// gain stage
|
||||
chain.push(gainNode(gain));
|
||||
|
||||
if (shape != null) {
|
||||
const shaper = new WaveShaperNode(ac);
|
||||
shaper.curve = makeSaturationCurve(shape, ac.sampleRate, shapetype);
|
||||
const shapeGain = new GainNode(ac, { gain: shapevol });
|
||||
chain.push(shaper);
|
||||
chain.push(shapeGain);
|
||||
}
|
||||
|
||||
//filter
|
||||
const ftype = getFilterType(value.ftype);
|
||||
if (cutoff !== undefined) {
|
||||
@@ -739,7 +751,6 @@ export const superdough = async (value, t, hapDuration, cps = 0.5, cycle = 0.5)
|
||||
// effects
|
||||
coarse !== undefined && chain.push(getWorklet(ac, 'coarse-processor', { coarse }));
|
||||
crush !== undefined && chain.push(getWorklet(ac, 'crush-processor', { crush }));
|
||||
shape !== undefined && chain.push(getWorklet(ac, 'shape-processor', { shape, postgain: shapevol }));
|
||||
distort !== undefined && chain.push(getWorklet(ac, 'distort-processor', { distort, postgain: distortvol }));
|
||||
|
||||
if (tremolosync != null) {
|
||||
|
||||
@@ -9,12 +9,13 @@ import {
|
||||
getVibratoOscillator,
|
||||
webAudioTimeout,
|
||||
getWorklet,
|
||||
makeSaturationCurve,
|
||||
} from './helpers.mjs';
|
||||
import { getNoiseMix, getNoiseOscillator } from './noise.mjs';
|
||||
|
||||
const getFrequencyFromValue = (value) => {
|
||||
const getFrequencyFromValue = (value, defaultNote = 36) => {
|
||||
let { note, freq } = value;
|
||||
note = note || 36;
|
||||
note = note || defaultNote;
|
||||
if (typeof note === 'string') {
|
||||
note = noteToMidi(note); // e.g. c3 => 48
|
||||
}
|
||||
@@ -84,6 +85,75 @@ export function registerSynthSounds() {
|
||||
{ type: 'synth', prebake: true },
|
||||
);
|
||||
});
|
||||
|
||||
registerSound(
|
||||
'909bd',
|
||||
(t, value, onended) => {
|
||||
const { duration, decay = 0.5, pdecay = 0.5, penv = 36, clip } = value;
|
||||
const ctx = getAudioContext();
|
||||
const attackhold = 0.02;
|
||||
const noiselvl = 1.2;
|
||||
const noisedecay = 0.025;
|
||||
const mixGain = 1;
|
||||
|
||||
const o = ctx.createOscillator();
|
||||
o.type = 'triangle';
|
||||
o.frequency.value = getFrequencyFromValue(value, 29);
|
||||
o.detune.setValueAtTime(penv * 100, 0);
|
||||
o.detune.setValueAtTime(penv * 100, t);
|
||||
o.detune.exponentialRampToValueAtTime(0.001, t + pdecay);
|
||||
const g = gainNode(1);
|
||||
g.gain.setValueAtTime(1, t + attackhold);
|
||||
g.gain.exponentialRampToValueAtTime(0.001, t + attackhold + decay);
|
||||
o.start(t);
|
||||
|
||||
const noise = getNoiseOscillator('brown', t, 2);
|
||||
const noiseGain = gainNode(1);
|
||||
noiseGain.gain.setValueAtTime(noiselvl, t);
|
||||
noiseGain.gain.exponentialRampToValueAtTime(0.001, t + noisedecay);
|
||||
|
||||
const sat = new WaveShaperNode(ctx);
|
||||
// tri to sine diode shaper emulation
|
||||
sat.curve = makeSaturationCurve(2, ctx.sampleRate, 1);
|
||||
|
||||
const mix = gainNode(mixGain);
|
||||
|
||||
o.onended = () => {
|
||||
o.disconnect();
|
||||
g.disconnect();
|
||||
sat.disconnect();
|
||||
noise.node.disconnect();
|
||||
noiseGain.disconnect();
|
||||
mix.disconnect();
|
||||
onended();
|
||||
};
|
||||
|
||||
const node = o.connect(sat).connect(g).connect(mix);
|
||||
noise.node.connect(noiseGain).connect(mix);
|
||||
|
||||
const holdEnd = t + decay;
|
||||
let end = holdEnd + 0.01;
|
||||
if (clip != null) {
|
||||
end = Math.min(t + clip * duration, end);
|
||||
}
|
||||
|
||||
// prevent clicking
|
||||
mix.gain.setValueAtTime(mixGain, end - 0.01);
|
||||
mix.gain.linearRampToValueAtTime(0, end);
|
||||
|
||||
o.stop(end);
|
||||
noise.stop(end);
|
||||
|
||||
return {
|
||||
node,
|
||||
stop: (endTime) => {
|
||||
o.stop(endTime);
|
||||
},
|
||||
};
|
||||
},
|
||||
{ type: 'synth', prebake: true },
|
||||
);
|
||||
|
||||
registerSound(
|
||||
'supersaw',
|
||||
(begin, value, onended) => {
|
||||
|
||||
@@ -81,6 +81,7 @@ function getParamValue(block, param) {
|
||||
}
|
||||
return param[0];
|
||||
}
|
||||
|
||||
const waveShapeNames = Object.keys(waveshapes);
|
||||
class LFOProcessor extends AudioWorkletProcessor {
|
||||
static get parameterDescriptors() {
|
||||
@@ -129,11 +130,12 @@ class LFOProcessor extends AudioWorkletProcessor {
|
||||
const depth = parameters['depth'][0];
|
||||
const skew = parameters['skew'][0];
|
||||
const phaseoffset = parameters['phaseoffset'][0];
|
||||
const min = parameters['min'][0];
|
||||
const max = parameters['max'][0];
|
||||
|
||||
const curve = parameters['curve'][0];
|
||||
|
||||
const dcoffset = parameters['dcoffset'][0];
|
||||
const min = parameters['min'][0];
|
||||
const max = parameters['max'][0];
|
||||
const shape = waveShapeNames[parameters['shape'][0]];
|
||||
|
||||
const blockSize = output[0].length ?? 0;
|
||||
@@ -145,8 +147,9 @@ class LFOProcessor extends AudioWorkletProcessor {
|
||||
const dt = frequency / sampleRate;
|
||||
for (let n = 0; n < blockSize; n++) {
|
||||
for (let i = 0; i < output.length; i++) {
|
||||
const modval = (waveshapes[shape](this.phase, skew) + dcoffset) * depth;
|
||||
output[i][n] = clamp(Math.pow(modval, curve), min, max);
|
||||
let modval = (waveshapes[shape](this.phase, skew) + dcoffset) * depth;
|
||||
modval = Math.pow(modval, curve);
|
||||
output[i][n] = clamp(modval, min, max);
|
||||
}
|
||||
this.incrementPhase(dt);
|
||||
}
|
||||
|
||||
@@ -8612,54 +8612,51 @@ exports[`runs examples > example "setcpm" example index 0 1`] = `
|
||||
|
||||
exports[`runs examples > example "shape" example index 0 1`] = `
|
||||
[
|
||||
"[ 0/1 → 1/8 | s:hh shape:0 ]",
|
||||
"[ 0/1 → 1/4 | s:bd shape:0 ]",
|
||||
"[ 1/8 → 1/4 | s:hh shape:0 ]",
|
||||
"[ 1/4 → 3/8 | s:hh shape:0 ]",
|
||||
"[ 1/4 → 1/2 | s:sd shape:0 ]",
|
||||
"[ 3/8 → 1/2 | s:hh shape:0 ]",
|
||||
"[ 1/2 → 5/8 | s:hh shape:0 ]",
|
||||
"[ 5/8 → 3/4 | s:bd shape:0 ]",
|
||||
"[ 5/8 → 3/4 | s:hh shape:0 ]",
|
||||
"[ 3/4 → 7/8 | s:hh shape:0 ]",
|
||||
"[ 3/4 → 1/1 | s:sd shape:0 ]",
|
||||
"[ 7/8 → 1/1 | s:hh shape:0 ]",
|
||||
"[ 1/1 → 9/8 | s:hh shape:0.2 ]",
|
||||
"[ 1/1 → 5/4 | s:bd shape:0.2 ]",
|
||||
"[ 9/8 → 5/4 | s:hh shape:0.2 ]",
|
||||
"[ 5/4 → 11/8 | s:hh shape:0.2 ]",
|
||||
"[ 5/4 → 3/2 | s:sd shape:0.2 ]",
|
||||
"[ 11/8 → 3/2 | s:hh shape:0.2 ]",
|
||||
"[ 3/2 → 13/8 | s:hh shape:0.2 ]",
|
||||
"[ 13/8 → 7/4 | s:bd shape:0.2 ]",
|
||||
"[ 13/8 → 7/4 | s:hh shape:0.2 ]",
|
||||
"[ 7/4 → 15/8 | s:hh shape:0.2 ]",
|
||||
"[ 7/4 → 2/1 | s:sd shape:0.2 ]",
|
||||
"[ 15/8 → 2/1 | s:hh shape:0.2 ]",
|
||||
"[ 2/1 → 17/8 | s:hh shape:0.4 ]",
|
||||
"[ 2/1 → 9/4 | s:bd shape:0.4 ]",
|
||||
"[ 17/8 → 9/4 | s:hh shape:0.4 ]",
|
||||
"[ 9/4 → 19/8 | s:hh shape:0.4 ]",
|
||||
"[ 9/4 → 5/2 | s:sd shape:0.4 ]",
|
||||
"[ 19/8 → 5/2 | s:hh shape:0.4 ]",
|
||||
"[ 5/2 → 21/8 | s:hh shape:0.4 ]",
|
||||
"[ 21/8 → 11/4 | s:bd shape:0.4 ]",
|
||||
"[ 21/8 → 11/4 | s:hh shape:0.4 ]",
|
||||
"[ 11/4 → 23/8 | s:hh shape:0.4 ]",
|
||||
"[ 11/4 → 3/1 | s:sd shape:0.4 ]",
|
||||
"[ 23/8 → 3/1 | s:hh shape:0.4 ]",
|
||||
"[ 3/1 → 25/8 | s:hh shape:0.6 ]",
|
||||
"[ 3/1 → 13/4 | s:bd shape:0.6 ]",
|
||||
"[ 25/8 → 13/4 | s:hh shape:0.6 ]",
|
||||
"[ 13/4 → 27/8 | s:hh shape:0.6 ]",
|
||||
"[ 13/4 → 7/2 | s:sd shape:0.6 ]",
|
||||
"[ 27/8 → 7/2 | s:hh shape:0.6 ]",
|
||||
"[ 7/2 → 29/8 | s:hh shape:0.6 ]",
|
||||
"[ 29/8 → 15/4 | s:bd shape:0.6 ]",
|
||||
"[ 29/8 → 15/4 | s:hh shape:0.6 ]",
|
||||
"[ 15/4 → 31/8 | s:hh shape:0.6 ]",
|
||||
"[ 15/4 → 4/1 | s:sd shape:0.6 ]",
|
||||
"[ 31/8 → 4/1 | s:hh shape:0.6 ]",
|
||||
"[ 0/1 → 1/16 | s:909bd shape:2 shapetype:0 ]",
|
||||
"[ 1/4 → 5/16 | s:909bd shape:2 shapetype:0 ]",
|
||||
"[ 1/2 → 9/16 | s:909bd shape:2 shapetype:1 ]",
|
||||
"[ 11/16 → 3/4 | s:909bd shape:2 shapetype:1 ]",
|
||||
"[ 7/8 → 15/16 | s:909bd shape:2 shapetype:1 ]",
|
||||
"[ 1/1 → 17/16 | s:909bd shape:4 shapetype:2 ]",
|
||||
"[ 5/4 → 21/16 | s:909bd shape:4 shapetype:2 ]",
|
||||
"[ 3/2 → 25/16 | s:909bd shape:4 shapetype:0 ]",
|
||||
"[ 27/16 → 7/4 | s:909bd shape:4 shapetype:0 ]",
|
||||
"[ 15/8 → 31/16 | s:909bd shape:4 shapetype:0 ]",
|
||||
"[ 2/1 → 33/16 | s:909bd shape:1 shapetype:1 ]",
|
||||
"[ 9/4 → 37/16 | s:909bd shape:1 shapetype:1 ]",
|
||||
"[ 5/2 → 41/16 | s:909bd shape:1 shapetype:2 ]",
|
||||
"[ 43/16 → 11/4 | s:909bd shape:1 shapetype:2 ]",
|
||||
"[ 23/8 → 47/16 | s:909bd shape:1 shapetype:2 ]",
|
||||
"[ 3/1 → 49/16 | s:909bd shape:2 shapetype:0 ]",
|
||||
"[ 13/4 → 53/16 | s:909bd shape:2 shapetype:0 ]",
|
||||
"[ 7/2 → 57/16 | s:909bd shape:2 shapetype:1 ]",
|
||||
"[ 59/16 → 15/4 | s:909bd shape:2 shapetype:1 ]",
|
||||
"[ 31/8 → 63/16 | s:909bd shape:2 shapetype:1 ]",
|
||||
]
|
||||
`;
|
||||
|
||||
exports[`runs examples > example "shapetype" example index 0 1`] = `
|
||||
[
|
||||
"[ 0/1 → 1/16 | s:909bd shape:2 shapetype:0 ]",
|
||||
"[ 1/4 → 5/16 | s:909bd shape:2 shapetype:0 ]",
|
||||
"[ 1/2 → 9/16 | s:909bd shape:2 shapetype:0 ]",
|
||||
"[ 11/16 → 3/4 | s:909bd shape:2 shapetype:0 ]",
|
||||
"[ 7/8 → 15/16 | s:909bd shape:2 shapetype:0 ]",
|
||||
"[ 1/1 → 17/16 | s:909bd shape:2 shapetype:1 ]",
|
||||
"[ 5/4 → 21/16 | s:909bd shape:2 shapetype:1 ]",
|
||||
"[ 3/2 → 25/16 | s:909bd shape:2 shapetype:1 ]",
|
||||
"[ 27/16 → 7/4 | s:909bd shape:2 shapetype:1 ]",
|
||||
"[ 15/8 → 31/16 | s:909bd shape:2 shapetype:1 ]",
|
||||
"[ 2/1 → 33/16 | s:909bd shape:2 shapetype:2 ]",
|
||||
"[ 9/4 → 37/16 | s:909bd shape:2 shapetype:2 ]",
|
||||
"[ 5/2 → 41/16 | s:909bd shape:2 shapetype:2 ]",
|
||||
"[ 43/16 → 11/4 | s:909bd shape:2 shapetype:2 ]",
|
||||
"[ 23/8 → 47/16 | s:909bd shape:2 shapetype:2 ]",
|
||||
"[ 3/1 → 49/16 | s:909bd shape:2 shapetype:0 ]",
|
||||
"[ 13/4 → 53/16 | s:909bd shape:2 shapetype:0 ]",
|
||||
"[ 7/2 → 57/16 | s:909bd shape:2 shapetype:0 ]",
|
||||
"[ 59/16 → 15/4 | s:909bd shape:2 shapetype:0 ]",
|
||||
"[ 31/8 → 63/16 | s:909bd shape:2 shapetype:0 ]",
|
||||
]
|
||||
`;
|
||||
|
||||
|
||||
@@ -1,17 +0,0 @@
|
||||
{
|
||||
"_base": "https://raw.githubusercontent.com/ritchse/tidal-drum-machines/main/machines/EmuSP12/",
|
||||
"bd": ["emusp12-bd/Bassdrum-01.wav","emusp12-bd/Bassdrum-02.wav","emusp12-bd/Bassdrum-03.wav","emusp12-bd/Bassdrum-04.wav","emusp12-bd/Bassdrum-05.wav","emusp12-bd/Bassdrum-06.wav","emusp12-bd/Bassdrum-07.wav","emusp12-bd/Bassdrum-08.wav","emusp12-bd/Bassdrum-09.wav","emusp12-bd/Bassdrum-10.wav","emusp12-bd/Bassdrum-11.wav","emusp12-bd/Bassdrum-12.wav","emusp12-bd/Bassdrum-13.wav","emusp12-bd/Bassdrum-14.wav"],
|
||||
"cb": ["emusp12-cb/Cowbell.wav"],
|
||||
"cp": ["emusp12-cp/Clap.wav"],
|
||||
"cr": ["emusp12-cr/Crash.wav"],
|
||||
"hh": ["emusp12-hh/Hat Closed-01.wav","emusp12-hh/Hat Closed-02.wav"],
|
||||
"ht": ["emusp12-ht/Tom H-01.wav","emusp12-ht/Tom H-02.wav","emusp12-ht/Tom H-03.wav","emusp12-ht/Tom H-04.wav","emusp12-ht/Tom H-05.wav","emusp12-ht/Tom H-06.wav"],
|
||||
"lt": ["emusp12-lt/Tom L-01.wav","emusp12-lt/Tom L-02.wav","emusp12-lt/Tom L-03.wav","emusp12-lt/Tom L-04.wav","emusp12-lt/Tom L-05.wav","emusp12-lt/Tom L-06.wav"],
|
||||
"misc": ["emusp12-misc/Metal-01.wav","emusp12-misc/Metal-02.wav","emusp12-misc/Metal-03.wav","emusp12-misc/Scratch.wav","emusp12-misc/Shot-01.wav","emusp12-misc/Shot-02.wav","emusp12-misc/Shot-03.wav"],
|
||||
"mt": ["emusp12-mt/Tom M-01.wav","emusp12-mt/Tom M-02.wav","emusp12-mt/Tom M-03.wav","emusp12-mt/Tom M-05.wav"],
|
||||
"oh": ["emusp12-oh/Hhopen1.wav"],
|
||||
"perc": ["emusp12-perc/Blow1.wav"],
|
||||
"rd": ["emusp12-rd/Ride.wav"],
|
||||
"rim": ["emusp12-rim/zRim Shot-01.wav","emusp12-rim/zRim Shot-02.wav"],
|
||||
"sd": ["emusp12-sd/Snaredrum-01.wav","emusp12-sd/Snaredrum-02.wav","emusp12-sd/Snaredrum-03.wav","emusp12-sd/Snaredrum-04.wav","emusp12-sd/Snaredrum-05.wav","emusp12-sd/Snaredrum-06.wav","emusp12-sd/Snaredrum-07.wav","emusp12-sd/Snaredrum-08.wav","emusp12-sd/Snaredrum-09.wav","emusp12-sd/Snaredrum-10.wav","emusp12-sd/Snaredrum-11.wav","emusp12-sd/Snaredrum-12.wav","emusp12-sd/Snaredrum-13.wav","emusp12-sd/Snaredrum-14.wav","emusp12-sd/Snaredrum-15.wav","emusp12-sd/Snaredrum-16.wav","emusp12-sd/Snaredrum-17.wav","emusp12-sd/Snaredrum-18.wav","emusp12-sd/Snaredrum-19.wav","emusp12-sd/Snaredrum-20.wav","emusp12-sd/Snaredrum-21.wav"]
|
||||
}
|
||||
@@ -28,7 +28,10 @@ export async function prebake() {
|
||||
prebake: true,
|
||||
tag: 'drum-machines',
|
||||
}),
|
||||
samples(`${baseNoTrailing}/EmuSP12.json`, undefined, { prebake: true, tag: 'drum-machines' }),
|
||||
samples(`https://raw.githubusercontent.com/tidalcycles/uzu-drumkit/main/strudel.json`, undefined, {
|
||||
prebake: true,
|
||||
tag: 'drum-machines',
|
||||
}),
|
||||
samples(`${baseNoTrailing}/mridangam.json`, undefined, { prebake: true, tag: 'drum-machines' }),
|
||||
samples(
|
||||
{
|
||||
|
||||
Reference in New Issue
Block a user