mirror of
https://github.com/eliasstepanik/strudel.git
synced 2026-01-11 21:58:37 +00:00
commit
087423c754
@ -83,8 +83,7 @@ const generic_params = [
|
||||
*/
|
||||
['f', 'amp', 'like @gain@, but linear.'],
|
||||
/**
|
||||
* A pattern of numbers to specify the attack time of an envelope applied to each sample.
|
||||
* [More info about envelopes](/learn/synths-samples-effects/#envelope)
|
||||
* Amplitude envelope attack time: Specifies how long it takes for the sound to reach its peak value, relative to the onset.
|
||||
*
|
||||
* @name attack
|
||||
* @param {number | Pattern} attack time in seconds.
|
||||
@ -92,11 +91,7 @@ const generic_params = [
|
||||
* note("c3 e3").attack("<0 .1 .5>")
|
||||
*
|
||||
*/
|
||||
[
|
||||
'f',
|
||||
'attack',
|
||||
'a pattern of numbers to specify the attack time (in seconds) of an envelope applied to each sample.',
|
||||
],
|
||||
['f', 'attack'],
|
||||
|
||||
/**
|
||||
* Select the sound bank to use. To be used together with `s`. The bank name (+ "_") will be prepended to the value of `s`.
|
||||
@ -110,8 +105,8 @@ const generic_params = [
|
||||
['f', 'bank', 'selects sound bank to use'],
|
||||
|
||||
/**
|
||||
* Gain envelope decay time = the time it takes after the attack time to reach the sustain level.
|
||||
* [More info about envelopes](/learn/synths-samples-effects/#envelope)
|
||||
* Amplitude envelope decay time: the time it takes after the attack time to reach the sustain level.
|
||||
* Note that the decay is only audible if the sustain value is lower than 1.
|
||||
*
|
||||
* @name decay
|
||||
* @param {number | Pattern} time decay time in seconds
|
||||
@ -121,7 +116,7 @@ const generic_params = [
|
||||
*/
|
||||
['f', 'decay', ''],
|
||||
/**
|
||||
* Gain envelope sustain level. [More info about envelopes](/learn/synths-samples-effects/#envelope)
|
||||
* Amplitude envelope sustain level: The level which is reached after attack / decay, being sustained until the offset.
|
||||
*
|
||||
* @name sustain
|
||||
* @param {number | Pattern} gain sustain level between 0 and 1
|
||||
@ -131,7 +126,7 @@ const generic_params = [
|
||||
*/
|
||||
['f', 'sustain', ''],
|
||||
/**
|
||||
* Gain envelope release time. [More info about envelopes](/learn/synths-samples-effects/#envelope)
|
||||
* Amplitude envelope release time: The time it takes after the offset to go from sustain level to zero.
|
||||
*
|
||||
* @name release
|
||||
* @param {number | Pattern} time release time in seconds
|
||||
@ -151,30 +146,30 @@ const generic_params = [
|
||||
],
|
||||
// TODO: in tidal, it seems to be normalized
|
||||
/**
|
||||
* Sets the center frequency of the band-pass filter.
|
||||
* Sets the center frequency of the **b**and-**p**ass **f**ilter.
|
||||
*
|
||||
* @name bandf
|
||||
* @name bpf
|
||||
* @param {number | Pattern} frequency center frequency
|
||||
* @synonyms bpf
|
||||
* @synonyms bandf
|
||||
* @example
|
||||
* s("bd sd,hh*3").bandf("<1000 2000 4000 8000>")
|
||||
* s("bd sd,hh*3").bpf("<1000 2000 4000 8000>")
|
||||
*
|
||||
*/
|
||||
['f', 'bandf', 'A pattern of numbers from 0 to 1. Sets the center frequency of the band-pass filter.'],
|
||||
['f', 'bpf', ''],
|
||||
['f', 'bandf', 'A pattern of numbers from 0 to 1. Sets the center frequency of the band-pass filter.'],
|
||||
// TODO: in tidal, it seems to be normalized
|
||||
/**
|
||||
* Sets the q-factor of the band-pass filter
|
||||
* Sets the **b**and-**p**ass **q**-factor (resonance)
|
||||
*
|
||||
* @name bandq
|
||||
* @name bpq
|
||||
* @param {number | Pattern} q q factor
|
||||
* @synonyms bpq
|
||||
* @synonyms bandq
|
||||
* @example
|
||||
* s("bd sd").bandf(500).bandq("<0 1 2 3>")
|
||||
* s("bd sd").bpf(500).bpq("<0 1 2 3>")
|
||||
*
|
||||
*/
|
||||
['f', 'bandq', 'a pattern of anumbers from 0 to 1. Sets the q-factor of the band-pass filter.'],
|
||||
['f', 'bpq', ''],
|
||||
['f', 'bandq', 'a pattern of anumbers from 0 to 1. Sets the q-factor of the band-pass filter.'],
|
||||
/**
|
||||
* a pattern of numbers from 0 to 1. Skips the beginning of each sample, e.g. `0.25` to cut off the first quarter from each sample.
|
||||
*
|
||||
@ -282,50 +277,49 @@ const generic_params = [
|
||||
'In the style of classic drum-machines, `cut` will stop a playing sample as soon as another samples with in same cutgroup is to be played. An example would be an open hi-hat followed by a closed one, essentially muting the open.',
|
||||
],
|
||||
/**
|
||||
* Applies the cutoff frequency of the low-pass filter.
|
||||
* Applies the cutoff frequency of the **l**ow-**p**ass **f**ilter.
|
||||
*
|
||||
* @name cutoff
|
||||
* @name lpf
|
||||
* @param {number | Pattern} frequency audible between 0 and 20000
|
||||
* @synonyms lpf
|
||||
* @synonyms cutoff
|
||||
* @example
|
||||
* s("bd sd,hh*3").cutoff("<4000 2000 1000 500 200 100>")
|
||||
* s("bd sd,hh*3").lpf("<4000 2000 1000 500 200 100>")
|
||||
*
|
||||
*/
|
||||
['f', 'cutoff', 'a pattern of numbers from 0 to 1. Applies the cutoff frequency of the low-pass filter.'],
|
||||
['f', 'lpf'],
|
||||
['f', 'cutoff', 'a pattern of numbers from 0 to 1. Applies the cutoff frequency of the low-pass filter.'],
|
||||
/**
|
||||
* Applies the cutoff frequency of the high-pass filter.
|
||||
* Applies the cutoff frequency of the **h**igh-**p**ass **f**ilter.
|
||||
*
|
||||
* @name hcutoff
|
||||
* @name hpf
|
||||
* @param {number | Pattern} frequency audible between 0 and 20000
|
||||
* @synonyms hpf
|
||||
* @synonyms hcutoff
|
||||
* @example
|
||||
* s("bd sd,hh*4").hcutoff("<4000 2000 1000 500 200 100>")
|
||||
* s("bd sd,hh*4").hpf("<4000 2000 1000 500 200 100>")
|
||||
*
|
||||
*/
|
||||
['f', 'hcutoff', ''],
|
||||
['f', 'hpf', ''],
|
||||
['f', 'hcutoff', ''],
|
||||
/**
|
||||
* Applies the resonance of the high-pass filter.
|
||||
* Controls the **h**igh-**p**ass **q**-value.
|
||||
*
|
||||
* @name hresonance
|
||||
* @name hpq
|
||||
* @param {number | Pattern} q resonance factor between 0 and 50
|
||||
* @synonyms hpq
|
||||
* @synonyms hresonance
|
||||
* @example
|
||||
* s("bd sd,hh*4").hcutoff(2000).hresonance("<0 10 20 30>")
|
||||
* s("bd sd,hh*4").hpf(2000).hpq("<0 10 20 30>")
|
||||
*
|
||||
*/
|
||||
['f', 'hpq', ''],
|
||||
['f', 'hresonance', ''],
|
||||
// TODO: add hpq synonym
|
||||
['f', 'hpq', ''],
|
||||
/**
|
||||
* Applies the cutoff frequency of the low-pass filter.
|
||||
* Controls the **l**ow-**p**ass **q**-value.
|
||||
*
|
||||
* @name resonance
|
||||
* @name lpq
|
||||
* @param {number | Pattern} q resonance factor between 0 and 50
|
||||
* @synonyms lpq
|
||||
* @synonyms resonance
|
||||
* @example
|
||||
* s("bd sd,hh*4").cutoff(2000).resonance("<0 10 20 30>")
|
||||
* s("bd sd,hh*4").lpf(2000).lpq("<0 10 20 30>")
|
||||
*
|
||||
*/
|
||||
['f', 'lpq'],
|
||||
|
||||
@ -861,44 +861,6 @@ exports[`runs examples > example "attack" example index 0 1`] = `
|
||||
]
|
||||
`;
|
||||
|
||||
exports[`runs examples > example "bandf" example index 0 1`] = `
|
||||
[
|
||||
"[ 0/1 → 1/2 | s:bd bandf:1000 ]",
|
||||
"[ 1/2 → 1/1 | s:sd bandf:1000 ]",
|
||||
"[ 0/1 → 1/3 | s:hh bandf:1000 ]",
|
||||
"[ 1/3 → 2/3 | s:hh bandf:1000 ]",
|
||||
"[ 2/3 → 1/1 | s:hh bandf:1000 ]",
|
||||
"[ 1/1 → 3/2 | s:bd bandf:2000 ]",
|
||||
"[ 3/2 → 2/1 | s:sd bandf:2000 ]",
|
||||
"[ 1/1 → 4/3 | s:hh bandf:2000 ]",
|
||||
"[ 4/3 → 5/3 | s:hh bandf:2000 ]",
|
||||
"[ 5/3 → 2/1 | s:hh bandf:2000 ]",
|
||||
"[ 2/1 → 5/2 | s:bd bandf:4000 ]",
|
||||
"[ 5/2 → 3/1 | s:sd bandf:4000 ]",
|
||||
"[ 2/1 → 7/3 | s:hh bandf:4000 ]",
|
||||
"[ 7/3 → 8/3 | s:hh bandf:4000 ]",
|
||||
"[ 8/3 → 3/1 | s:hh bandf:4000 ]",
|
||||
"[ 3/1 → 7/2 | s:bd bandf:8000 ]",
|
||||
"[ 7/2 → 4/1 | s:sd bandf:8000 ]",
|
||||
"[ 3/1 → 10/3 | s:hh bandf:8000 ]",
|
||||
"[ 10/3 → 11/3 | s:hh bandf:8000 ]",
|
||||
"[ 11/3 → 4/1 | s:hh bandf:8000 ]",
|
||||
]
|
||||
`;
|
||||
|
||||
exports[`runs examples > example "bandq" example index 0 1`] = `
|
||||
[
|
||||
"[ 0/1 → 1/2 | s:bd bandf:500 bandq:0 ]",
|
||||
"[ 1/2 → 1/1 | s:sd bandf:500 bandq:0 ]",
|
||||
"[ 1/1 → 3/2 | s:bd bandf:500 bandq:1 ]",
|
||||
"[ 3/2 → 2/1 | s:sd bandf:500 bandq:1 ]",
|
||||
"[ 2/1 → 5/2 | s:bd bandf:500 bandq:2 ]",
|
||||
"[ 5/2 → 3/1 | s:sd bandf:500 bandq:2 ]",
|
||||
"[ 3/1 → 7/2 | s:bd bandf:500 bandq:3 ]",
|
||||
"[ 7/2 → 4/1 | s:sd bandf:500 bandq:3 ]",
|
||||
]
|
||||
`;
|
||||
|
||||
exports[`runs examples > example "bank" example index 0 1`] = `
|
||||
[
|
||||
"[ 0/1 → 1/2 | s:bd bank:RolandTR909 ]",
|
||||
@ -921,6 +883,44 @@ exports[`runs examples > example "begin" example index 0 1`] = `
|
||||
]
|
||||
`;
|
||||
|
||||
exports[`runs examples > example "bpf" example index 0 1`] = `
|
||||
[
|
||||
"[ 0/1 → 1/2 | s:bd bpf:1000 ]",
|
||||
"[ 1/2 → 1/1 | s:sd bpf:1000 ]",
|
||||
"[ 0/1 → 1/3 | s:hh bpf:1000 ]",
|
||||
"[ 1/3 → 2/3 | s:hh bpf:1000 ]",
|
||||
"[ 2/3 → 1/1 | s:hh bpf:1000 ]",
|
||||
"[ 1/1 → 3/2 | s:bd bpf:2000 ]",
|
||||
"[ 3/2 → 2/1 | s:sd bpf:2000 ]",
|
||||
"[ 1/1 → 4/3 | s:hh bpf:2000 ]",
|
||||
"[ 4/3 → 5/3 | s:hh bpf:2000 ]",
|
||||
"[ 5/3 → 2/1 | s:hh bpf:2000 ]",
|
||||
"[ 2/1 → 5/2 | s:bd bpf:4000 ]",
|
||||
"[ 5/2 → 3/1 | s:sd bpf:4000 ]",
|
||||
"[ 2/1 → 7/3 | s:hh bpf:4000 ]",
|
||||
"[ 7/3 → 8/3 | s:hh bpf:4000 ]",
|
||||
"[ 8/3 → 3/1 | s:hh bpf:4000 ]",
|
||||
"[ 3/1 → 7/2 | s:bd bpf:8000 ]",
|
||||
"[ 7/2 → 4/1 | s:sd bpf:8000 ]",
|
||||
"[ 3/1 → 10/3 | s:hh bpf:8000 ]",
|
||||
"[ 10/3 → 11/3 | s:hh bpf:8000 ]",
|
||||
"[ 11/3 → 4/1 | s:hh bpf:8000 ]",
|
||||
]
|
||||
`;
|
||||
|
||||
exports[`runs examples > example "bpq" example index 0 1`] = `
|
||||
[
|
||||
"[ 0/1 → 1/2 | s:bd bpf:500 bpq:0 ]",
|
||||
"[ 1/2 → 1/1 | s:sd bpf:500 bpq:0 ]",
|
||||
"[ 1/1 → 3/2 | s:bd bpf:500 bpq:1 ]",
|
||||
"[ 3/2 → 2/1 | s:sd bpf:500 bpq:1 ]",
|
||||
"[ 2/1 → 5/2 | s:bd bpf:500 bpq:2 ]",
|
||||
"[ 5/2 → 3/1 | s:sd bpf:500 bpq:2 ]",
|
||||
"[ 3/1 → 7/2 | s:bd bpf:500 bpq:3 ]",
|
||||
"[ 7/2 → 4/1 | s:sd bpf:500 bpq:3 ]",
|
||||
]
|
||||
`;
|
||||
|
||||
exports[`runs examples > example "cat" example index 0 1`] = `
|
||||
[
|
||||
"[ 0/1 → 1/2 | s:hh ]",
|
||||
@ -1254,31 +1254,6 @@ exports[`runs examples > example "cut" example index 0 1`] = `
|
||||
]
|
||||
`;
|
||||
|
||||
exports[`runs examples > example "cutoff" example index 0 1`] = `
|
||||
[
|
||||
"[ 0/1 → 1/2 | s:bd cutoff:4000 ]",
|
||||
"[ 1/2 → 1/1 | s:sd cutoff:4000 ]",
|
||||
"[ 0/1 → 1/3 | s:hh cutoff:4000 ]",
|
||||
"[ 1/3 → 2/3 | s:hh cutoff:4000 ]",
|
||||
"[ 2/3 → 1/1 | s:hh cutoff:4000 ]",
|
||||
"[ 1/1 → 3/2 | s:bd cutoff:2000 ]",
|
||||
"[ 3/2 → 2/1 | s:sd cutoff:2000 ]",
|
||||
"[ 1/1 → 4/3 | s:hh cutoff:2000 ]",
|
||||
"[ 4/3 → 5/3 | s:hh cutoff:2000 ]",
|
||||
"[ 5/3 → 2/1 | s:hh cutoff:2000 ]",
|
||||
"[ 2/1 → 5/2 | s:bd cutoff:1000 ]",
|
||||
"[ 5/2 → 3/1 | s:sd cutoff:1000 ]",
|
||||
"[ 2/1 → 7/3 | s:hh cutoff:1000 ]",
|
||||
"[ 7/3 → 8/3 | s:hh cutoff:1000 ]",
|
||||
"[ 8/3 → 3/1 | s:hh cutoff:1000 ]",
|
||||
"[ 3/1 → 7/2 | s:bd cutoff:500 ]",
|
||||
"[ 7/2 → 4/1 | s:sd cutoff:500 ]",
|
||||
"[ 3/1 → 10/3 | s:hh cutoff:500 ]",
|
||||
"[ 10/3 → 11/3 | s:hh cutoff:500 ]",
|
||||
"[ 11/3 → 4/1 | s:hh cutoff:500 ]",
|
||||
]
|
||||
`;
|
||||
|
||||
exports[`runs examples > example "decay" example index 0 1`] = `
|
||||
[
|
||||
"[ 0/1 → 1/2 | note:c3 decay:0.1 sustain:0 ]",
|
||||
@ -1898,61 +1873,61 @@ exports[`runs examples > example "gain" example index 0 1`] = `
|
||||
]
|
||||
`;
|
||||
|
||||
exports[`runs examples > example "hcutoff" example index 0 1`] = `
|
||||
exports[`runs examples > example "hpf" example index 0 1`] = `
|
||||
[
|
||||
"[ 0/1 → 1/2 | s:bd hcutoff:4000 ]",
|
||||
"[ 1/2 → 1/1 | s:sd hcutoff:4000 ]",
|
||||
"[ 0/1 → 1/4 | s:hh hcutoff:4000 ]",
|
||||
"[ 1/4 → 1/2 | s:hh hcutoff:4000 ]",
|
||||
"[ 1/2 → 3/4 | s:hh hcutoff:4000 ]",
|
||||
"[ 3/4 → 1/1 | s:hh hcutoff:4000 ]",
|
||||
"[ 1/1 → 3/2 | s:bd hcutoff:2000 ]",
|
||||
"[ 3/2 → 2/1 | s:sd hcutoff:2000 ]",
|
||||
"[ 1/1 → 5/4 | s:hh hcutoff:2000 ]",
|
||||
"[ 5/4 → 3/2 | s:hh hcutoff:2000 ]",
|
||||
"[ 3/2 → 7/4 | s:hh hcutoff:2000 ]",
|
||||
"[ 7/4 → 2/1 | s:hh hcutoff:2000 ]",
|
||||
"[ 2/1 → 5/2 | s:bd hcutoff:1000 ]",
|
||||
"[ 5/2 → 3/1 | s:sd hcutoff:1000 ]",
|
||||
"[ 2/1 → 9/4 | s:hh hcutoff:1000 ]",
|
||||
"[ 9/4 → 5/2 | s:hh hcutoff:1000 ]",
|
||||
"[ 5/2 → 11/4 | s:hh hcutoff:1000 ]",
|
||||
"[ 11/4 → 3/1 | s:hh hcutoff:1000 ]",
|
||||
"[ 3/1 → 7/2 | s:bd hcutoff:500 ]",
|
||||
"[ 7/2 → 4/1 | s:sd hcutoff:500 ]",
|
||||
"[ 3/1 → 13/4 | s:hh hcutoff:500 ]",
|
||||
"[ 13/4 → 7/2 | s:hh hcutoff:500 ]",
|
||||
"[ 7/2 → 15/4 | s:hh hcutoff:500 ]",
|
||||
"[ 15/4 → 4/1 | s:hh hcutoff:500 ]",
|
||||
"[ 0/1 → 1/2 | s:bd hpf:4000 ]",
|
||||
"[ 1/2 → 1/1 | s:sd hpf:4000 ]",
|
||||
"[ 0/1 → 1/4 | s:hh hpf:4000 ]",
|
||||
"[ 1/4 → 1/2 | s:hh hpf:4000 ]",
|
||||
"[ 1/2 → 3/4 | s:hh hpf:4000 ]",
|
||||
"[ 3/4 → 1/1 | s:hh hpf:4000 ]",
|
||||
"[ 1/1 → 3/2 | s:bd hpf:2000 ]",
|
||||
"[ 3/2 → 2/1 | s:sd hpf:2000 ]",
|
||||
"[ 1/1 → 5/4 | s:hh hpf:2000 ]",
|
||||
"[ 5/4 → 3/2 | s:hh hpf:2000 ]",
|
||||
"[ 3/2 → 7/4 | s:hh hpf:2000 ]",
|
||||
"[ 7/4 → 2/1 | s:hh hpf:2000 ]",
|
||||
"[ 2/1 → 5/2 | s:bd hpf:1000 ]",
|
||||
"[ 5/2 → 3/1 | s:sd hpf:1000 ]",
|
||||
"[ 2/1 → 9/4 | s:hh hpf:1000 ]",
|
||||
"[ 9/4 → 5/2 | s:hh hpf:1000 ]",
|
||||
"[ 5/2 → 11/4 | s:hh hpf:1000 ]",
|
||||
"[ 11/4 → 3/1 | s:hh hpf:1000 ]",
|
||||
"[ 3/1 → 7/2 | s:bd hpf:500 ]",
|
||||
"[ 7/2 → 4/1 | s:sd hpf:500 ]",
|
||||
"[ 3/1 → 13/4 | s:hh hpf:500 ]",
|
||||
"[ 13/4 → 7/2 | s:hh hpf:500 ]",
|
||||
"[ 7/2 → 15/4 | s:hh hpf:500 ]",
|
||||
"[ 15/4 → 4/1 | s:hh hpf:500 ]",
|
||||
]
|
||||
`;
|
||||
|
||||
exports[`runs examples > example "hresonance" example index 0 1`] = `
|
||||
exports[`runs examples > example "hpq" example index 0 1`] = `
|
||||
[
|
||||
"[ 0/1 → 1/2 | s:bd hcutoff:2000 hresonance:0 ]",
|
||||
"[ 1/2 → 1/1 | s:sd hcutoff:2000 hresonance:0 ]",
|
||||
"[ 0/1 → 1/4 | s:hh hcutoff:2000 hresonance:0 ]",
|
||||
"[ 1/4 → 1/2 | s:hh hcutoff:2000 hresonance:0 ]",
|
||||
"[ 1/2 → 3/4 | s:hh hcutoff:2000 hresonance:0 ]",
|
||||
"[ 3/4 → 1/1 | s:hh hcutoff:2000 hresonance:0 ]",
|
||||
"[ 1/1 → 3/2 | s:bd hcutoff:2000 hresonance:10 ]",
|
||||
"[ 3/2 → 2/1 | s:sd hcutoff:2000 hresonance:10 ]",
|
||||
"[ 1/1 → 5/4 | s:hh hcutoff:2000 hresonance:10 ]",
|
||||
"[ 5/4 → 3/2 | s:hh hcutoff:2000 hresonance:10 ]",
|
||||
"[ 3/2 → 7/4 | s:hh hcutoff:2000 hresonance:10 ]",
|
||||
"[ 7/4 → 2/1 | s:hh hcutoff:2000 hresonance:10 ]",
|
||||
"[ 2/1 → 5/2 | s:bd hcutoff:2000 hresonance:20 ]",
|
||||
"[ 5/2 → 3/1 | s:sd hcutoff:2000 hresonance:20 ]",
|
||||
"[ 2/1 → 9/4 | s:hh hcutoff:2000 hresonance:20 ]",
|
||||
"[ 9/4 → 5/2 | s:hh hcutoff:2000 hresonance:20 ]",
|
||||
"[ 5/2 → 11/4 | s:hh hcutoff:2000 hresonance:20 ]",
|
||||
"[ 11/4 → 3/1 | s:hh hcutoff:2000 hresonance:20 ]",
|
||||
"[ 3/1 → 7/2 | s:bd hcutoff:2000 hresonance:30 ]",
|
||||
"[ 7/2 → 4/1 | s:sd hcutoff:2000 hresonance:30 ]",
|
||||
"[ 3/1 → 13/4 | s:hh hcutoff:2000 hresonance:30 ]",
|
||||
"[ 13/4 → 7/2 | s:hh hcutoff:2000 hresonance:30 ]",
|
||||
"[ 7/2 → 15/4 | s:hh hcutoff:2000 hresonance:30 ]",
|
||||
"[ 15/4 → 4/1 | s:hh hcutoff:2000 hresonance:30 ]",
|
||||
"[ 0/1 → 1/2 | s:bd hpf:2000 hpq:0 ]",
|
||||
"[ 1/2 → 1/1 | s:sd hpf:2000 hpq:0 ]",
|
||||
"[ 0/1 → 1/4 | s:hh hpf:2000 hpq:0 ]",
|
||||
"[ 1/4 → 1/2 | s:hh hpf:2000 hpq:0 ]",
|
||||
"[ 1/2 → 3/4 | s:hh hpf:2000 hpq:0 ]",
|
||||
"[ 3/4 → 1/1 | s:hh hpf:2000 hpq:0 ]",
|
||||
"[ 1/1 → 3/2 | s:bd hpf:2000 hpq:10 ]",
|
||||
"[ 3/2 → 2/1 | s:sd hpf:2000 hpq:10 ]",
|
||||
"[ 1/1 → 5/4 | s:hh hpf:2000 hpq:10 ]",
|
||||
"[ 5/4 → 3/2 | s:hh hpf:2000 hpq:10 ]",
|
||||
"[ 3/2 → 7/4 | s:hh hpf:2000 hpq:10 ]",
|
||||
"[ 7/4 → 2/1 | s:hh hpf:2000 hpq:10 ]",
|
||||
"[ 2/1 → 5/2 | s:bd hpf:2000 hpq:20 ]",
|
||||
"[ 5/2 → 3/1 | s:sd hpf:2000 hpq:20 ]",
|
||||
"[ 2/1 → 9/4 | s:hh hpf:2000 hpq:20 ]",
|
||||
"[ 9/4 → 5/2 | s:hh hpf:2000 hpq:20 ]",
|
||||
"[ 5/2 → 11/4 | s:hh hpf:2000 hpq:20 ]",
|
||||
"[ 11/4 → 3/1 | s:hh hpf:2000 hpq:20 ]",
|
||||
"[ 3/1 → 7/2 | s:bd hpf:2000 hpq:30 ]",
|
||||
"[ 7/2 → 4/1 | s:sd hpf:2000 hpq:30 ]",
|
||||
"[ 3/1 → 13/4 | s:hh hpf:2000 hpq:30 ]",
|
||||
"[ 13/4 → 7/2 | s:hh hpf:2000 hpq:30 ]",
|
||||
"[ 7/2 → 15/4 | s:hh hpf:2000 hpq:30 ]",
|
||||
"[ 15/4 → 4/1 | s:hh hpf:2000 hpq:30 ]",
|
||||
]
|
||||
`;
|
||||
|
||||
@ -2385,6 +2360,60 @@ exports[`runs examples > example "loopAtCps" example index 0 1`] = `
|
||||
]
|
||||
`;
|
||||
|
||||
exports[`runs examples > example "lpf" example index 0 1`] = `
|
||||
[
|
||||
"[ 0/1 → 1/2 | s:bd lpf:4000 ]",
|
||||
"[ 1/2 → 1/1 | s:sd lpf:4000 ]",
|
||||
"[ 0/1 → 1/3 | s:hh lpf:4000 ]",
|
||||
"[ 1/3 → 2/3 | s:hh lpf:4000 ]",
|
||||
"[ 2/3 → 1/1 | s:hh lpf:4000 ]",
|
||||
"[ 1/1 → 3/2 | s:bd lpf:2000 ]",
|
||||
"[ 3/2 → 2/1 | s:sd lpf:2000 ]",
|
||||
"[ 1/1 → 4/3 | s:hh lpf:2000 ]",
|
||||
"[ 4/3 → 5/3 | s:hh lpf:2000 ]",
|
||||
"[ 5/3 → 2/1 | s:hh lpf:2000 ]",
|
||||
"[ 2/1 → 5/2 | s:bd lpf:1000 ]",
|
||||
"[ 5/2 → 3/1 | s:sd lpf:1000 ]",
|
||||
"[ 2/1 → 7/3 | s:hh lpf:1000 ]",
|
||||
"[ 7/3 → 8/3 | s:hh lpf:1000 ]",
|
||||
"[ 8/3 → 3/1 | s:hh lpf:1000 ]",
|
||||
"[ 3/1 → 7/2 | s:bd lpf:500 ]",
|
||||
"[ 7/2 → 4/1 | s:sd lpf:500 ]",
|
||||
"[ 3/1 → 10/3 | s:hh lpf:500 ]",
|
||||
"[ 10/3 → 11/3 | s:hh lpf:500 ]",
|
||||
"[ 11/3 → 4/1 | s:hh lpf:500 ]",
|
||||
]
|
||||
`;
|
||||
|
||||
exports[`runs examples > example "lpq" example index 0 1`] = `
|
||||
[
|
||||
"[ 0/1 → 1/2 | s:bd lpf:2000 lpq:0 ]",
|
||||
"[ 1/2 → 1/1 | s:sd lpf:2000 lpq:0 ]",
|
||||
"[ 0/1 → 1/4 | s:hh lpf:2000 lpq:0 ]",
|
||||
"[ 1/4 → 1/2 | s:hh lpf:2000 lpq:0 ]",
|
||||
"[ 1/2 → 3/4 | s:hh lpf:2000 lpq:0 ]",
|
||||
"[ 3/4 → 1/1 | s:hh lpf:2000 lpq:0 ]",
|
||||
"[ 1/1 → 3/2 | s:bd lpf:2000 lpq:10 ]",
|
||||
"[ 3/2 → 2/1 | s:sd lpf:2000 lpq:10 ]",
|
||||
"[ 1/1 → 5/4 | s:hh lpf:2000 lpq:10 ]",
|
||||
"[ 5/4 → 3/2 | s:hh lpf:2000 lpq:10 ]",
|
||||
"[ 3/2 → 7/4 | s:hh lpf:2000 lpq:10 ]",
|
||||
"[ 7/4 → 2/1 | s:hh lpf:2000 lpq:10 ]",
|
||||
"[ 2/1 → 5/2 | s:bd lpf:2000 lpq:20 ]",
|
||||
"[ 5/2 → 3/1 | s:sd lpf:2000 lpq:20 ]",
|
||||
"[ 2/1 → 9/4 | s:hh lpf:2000 lpq:20 ]",
|
||||
"[ 9/4 → 5/2 | s:hh lpf:2000 lpq:20 ]",
|
||||
"[ 5/2 → 11/4 | s:hh lpf:2000 lpq:20 ]",
|
||||
"[ 11/4 → 3/1 | s:hh lpf:2000 lpq:20 ]",
|
||||
"[ 3/1 → 7/2 | s:bd lpf:2000 lpq:30 ]",
|
||||
"[ 7/2 → 4/1 | s:sd lpf:2000 lpq:30 ]",
|
||||
"[ 3/1 → 13/4 | s:hh lpf:2000 lpq:30 ]",
|
||||
"[ 13/4 → 7/2 | s:hh lpf:2000 lpq:30 ]",
|
||||
"[ 7/2 → 15/4 | s:hh lpf:2000 lpq:30 ]",
|
||||
"[ 15/4 → 4/1 | s:hh lpf:2000 lpq:30 ]",
|
||||
]
|
||||
`;
|
||||
|
||||
exports[`runs examples > example "lrate" example index 0 1`] = `
|
||||
[
|
||||
"[ 0/1 → 1/1 | n:0 s:supersquare leslie:1 lrate:1 ]",
|
||||
@ -3048,35 +3077,6 @@ exports[`runs examples > example "reset" example index 0 1`] = `
|
||||
]
|
||||
`;
|
||||
|
||||
exports[`runs examples > example "resonance" example index 0 1`] = `
|
||||
[
|
||||
"[ 0/1 → 1/2 | s:bd cutoff:2000 resonance:0 ]",
|
||||
"[ 1/2 → 1/1 | s:sd cutoff:2000 resonance:0 ]",
|
||||
"[ 0/1 → 1/4 | s:hh cutoff:2000 resonance:0 ]",
|
||||
"[ 1/4 → 1/2 | s:hh cutoff:2000 resonance:0 ]",
|
||||
"[ 1/2 → 3/4 | s:hh cutoff:2000 resonance:0 ]",
|
||||
"[ 3/4 → 1/1 | s:hh cutoff:2000 resonance:0 ]",
|
||||
"[ 1/1 → 3/2 | s:bd cutoff:2000 resonance:10 ]",
|
||||
"[ 3/2 → 2/1 | s:sd cutoff:2000 resonance:10 ]",
|
||||
"[ 1/1 → 5/4 | s:hh cutoff:2000 resonance:10 ]",
|
||||
"[ 5/4 → 3/2 | s:hh cutoff:2000 resonance:10 ]",
|
||||
"[ 3/2 → 7/4 | s:hh cutoff:2000 resonance:10 ]",
|
||||
"[ 7/4 → 2/1 | s:hh cutoff:2000 resonance:10 ]",
|
||||
"[ 2/1 → 5/2 | s:bd cutoff:2000 resonance:20 ]",
|
||||
"[ 5/2 → 3/1 | s:sd cutoff:2000 resonance:20 ]",
|
||||
"[ 2/1 → 9/4 | s:hh cutoff:2000 resonance:20 ]",
|
||||
"[ 9/4 → 5/2 | s:hh cutoff:2000 resonance:20 ]",
|
||||
"[ 5/2 → 11/4 | s:hh cutoff:2000 resonance:20 ]",
|
||||
"[ 11/4 → 3/1 | s:hh cutoff:2000 resonance:20 ]",
|
||||
"[ 3/1 → 7/2 | s:bd cutoff:2000 resonance:30 ]",
|
||||
"[ 7/2 → 4/1 | s:sd cutoff:2000 resonance:30 ]",
|
||||
"[ 3/1 → 13/4 | s:hh cutoff:2000 resonance:30 ]",
|
||||
"[ 13/4 → 7/2 | s:hh cutoff:2000 resonance:30 ]",
|
||||
"[ 7/2 → 15/4 | s:hh cutoff:2000 resonance:30 ]",
|
||||
"[ 15/4 → 4/1 | s:hh cutoff:2000 resonance:30 ]",
|
||||
]
|
||||
`;
|
||||
|
||||
exports[`runs examples > example "restart" example index 0 1`] = `
|
||||
[
|
||||
"[ 0/1 → 1/2 | s:bd ]",
|
||||
|
||||
@ -76,6 +76,7 @@ export const SIDEBAR: Sidebar = {
|
||||
{ text: 'REPL', link: 'technical-manual/repl' },
|
||||
{ text: 'Docs', link: 'technical-manual/docs' },
|
||||
{ text: 'Testing', link: 'technical-manual/testing' },
|
||||
{ text: 'Packages', link: 'technical-manual/packages' },
|
||||
// { text: 'Internals', link: 'technical-manual/internals' },
|
||||
],
|
||||
},
|
||||
|
||||
@ -12,13 +12,98 @@ import { JsDoc } from '../../docs/JsDoc';
|
||||
Whether you're using a synth or a sample, you can apply any of the following built-in audio effects.
|
||||
As you might suspect, the effects can be chained together, and they accept a pattern string as their argument.
|
||||
|
||||
## bandf
|
||||
# Filters
|
||||
|
||||
<JsDoc client:idle name="bandf" h={0} />
|
||||
Filters are an essential building block of [subtractive synthesis](https://en.wikipedia.org/wiki/Subtractive_synthesis).
|
||||
Strudel comes with 3 types of filters:
|
||||
|
||||
## bandq
|
||||
- low-pass filter: low frequencies may _pass_, high frequencies are cut off
|
||||
- high-pass filter: high frequencies may _pass_, low frequencies are cut off
|
||||
- band-pass filters: only a frequency band may _pass_, low and high frequencies around are cut off
|
||||
|
||||
<JsDoc client:idle name="bandq" h={0} />
|
||||
Each filter has 2 parameters:
|
||||
|
||||
- cutoff: the frequency at which the filter starts to work. e.g. a low-pass filter with a cutoff of 1000Hz allows frequencies below 1000Hz to pass.
|
||||
- q-value: Controls the resonance of the filter. Higher values sound more aggressive. Also see [Q-Factor](https://en.wikipedia.org/wiki/Q_factor)
|
||||
|
||||
## lpf
|
||||
|
||||
<JsDoc client:idle name="lpf" h={0} />
|
||||
|
||||
## lpq
|
||||
|
||||
<JsDoc client:idle name="lpq" h={0} />
|
||||
|
||||
## hpf
|
||||
|
||||
<JsDoc client:idle name="hpf" h={0} />
|
||||
|
||||
## hpq
|
||||
|
||||
<JsDoc client:idle name="hpq" h={0} />
|
||||
|
||||
## bpf
|
||||
|
||||
<JsDoc client:idle name="bpf" h={0} />
|
||||
|
||||
## bpq
|
||||
|
||||
<JsDoc client:idle name="bpq" h={0} />
|
||||
|
||||
## vowel
|
||||
|
||||
<JsDoc client:idle name="vowel" h={0} />
|
||||
|
||||
# Amplitude Envelope
|
||||
|
||||
The amplitude [envelope](<https://en.wikipedia.org/wiki/Envelope_(music)>) controls the dynamic contour of a sound.
|
||||
Strudel uses ADSR envelopes, which are probably the most common way to describe an envelope:
|
||||
|
||||

|
||||
|
||||
[image link](https://commons.wikimedia.org/wiki/File:ADSR_parameter.svg)
|
||||
|
||||
## attack
|
||||
|
||||
<JsDoc client:idle name="attack" h={0} />
|
||||
|
||||
## decay
|
||||
|
||||
<JsDoc client:idle name="decay" h={0} />
|
||||
|
||||
## sustain
|
||||
|
||||
<JsDoc client:idle name="sustain" h={0} />
|
||||
|
||||
## release
|
||||
|
||||
<JsDoc client:idle name="release" h={0} />
|
||||
|
||||
# Dynamics
|
||||
|
||||
## gain
|
||||
|
||||
<JsDoc client:idle name="gain" h={0} />
|
||||
|
||||
## velocity
|
||||
|
||||
<JsDoc client:idle name="velocity" h={0} />
|
||||
|
||||
# Panning
|
||||
|
||||
## jux
|
||||
|
||||
<JsDoc client:idle name="jux" h={0} />
|
||||
|
||||
## juxBy
|
||||
|
||||
<JsDoc client:idle name="juxBy" h={0} />
|
||||
|
||||
## pan
|
||||
|
||||
<JsDoc client:idle name="pan" h={0} />
|
||||
|
||||
# Waveshaping
|
||||
|
||||
## coarse
|
||||
|
||||
@ -28,50 +113,10 @@ As you might suspect, the effects can be chained together, and they accept a pat
|
||||
|
||||
<JsDoc client:idle name="crush" h={0} />
|
||||
|
||||
## cutoff
|
||||
|
||||
<JsDoc client:idle name="cutoff" h={0} />
|
||||
|
||||
## gain
|
||||
|
||||
<JsDoc client:idle name="gain" h={0} />
|
||||
|
||||
## hcutoff
|
||||
|
||||
<JsDoc client:idle name="hcutoff" h={0} />
|
||||
|
||||
## hresonance
|
||||
|
||||
<JsDoc client:idle name="hresonance" h={0} />
|
||||
|
||||
## pan
|
||||
|
||||
<JsDoc client:idle name="pan" h={0} />
|
||||
|
||||
## resonance
|
||||
|
||||
<JsDoc client:idle name="resonance" h={0} />
|
||||
|
||||
## shape
|
||||
|
||||
<JsDoc client:idle name="shape" h={0} />
|
||||
|
||||
## velocity
|
||||
|
||||
<JsDoc client:idle name="velocity" h={0} />
|
||||
|
||||
## vowel
|
||||
|
||||
<JsDoc client:idle name="vowel" h={0} />
|
||||
|
||||
## jux
|
||||
|
||||
<JsDoc client:idle name="jux" h={0} />
|
||||
|
||||
## juxBy
|
||||
|
||||
<JsDoc client:idle name="juxBy" h={0} />
|
||||
|
||||
# Global Effects
|
||||
|
||||
## Local vs Global Effects
|
||||
|
||||
@ -28,15 +28,3 @@ The power of patterns allows us to sequence any _param_ independently:
|
||||
|
||||
Now we not only pattern the notes, but the sound as well!
|
||||
`sawtooth` `square` and `triangle` are the basic waveforms available in `s`.
|
||||
|
||||
## Ampltude Envelope
|
||||
|
||||
You can control the envelope of a synth using the `attack`, `decay`, `sustain` and `release` functions:
|
||||
|
||||
<MiniRepl
|
||||
client:idle
|
||||
tune={`note("c2 <eb2 <g2 g1>>").s('sawtooth')
|
||||
.attack(.1).decay(.1).sustain(.2).release(.1)`}
|
||||
/>
|
||||
|
||||
<br />
|
||||
|
||||
@ -1,10 +1,79 @@
|
||||
---
|
||||
title: Strudel Packages
|
||||
layout: ../../layouts/MainLayout.astro
|
||||
---
|
||||
|
||||
import { MiniRepl } from '../../docs/MiniRepl';
|
||||
|
||||
## Strudel Packages
|
||||
|
||||
The [strudel repo](github.com/tidalcycles/strudel) is organized into packages, using [npm workspaces](https://docs.npmjs.com/cli/v7/using-npm/workspaces).
|
||||
Publishing packages is done with [lerna](https://lerna.js.org/).
|
||||
|
||||
There are different packages for different purposes. They..
|
||||
|
||||
- split up the code into smaller chunks
|
||||
- can be selectively used to implement some sort of time based system
|
||||
|
||||
Please refer to the individual README files in the [packages folder](https://github.com/tidalcycles/strudel/tree/main/packages)
|
||||
[See the latest published packages on npm](https://www.npmjs.com/search?q=%40strudel.cycles).
|
||||
|
||||
TODO
|
||||
### Important bits
|
||||
|
||||
- The [root package.json](https://github.com/tidalcycles/strudel/blob/main/package.json) specifies `packages/*` as `workspaces`
|
||||
- Each folder in `packages` comes with its own `package.json`, defining a package name of the format `@strudel.cycles/<name>`
|
||||
- Running `npm i` from the root folder will symlink all packages to the `node_modules` folder, e.g. `node_modules/@strudel.cycles/core` symlinks `packages/core`
|
||||
- These symlinks allow importing the packages with their package name, instead of a relative path, e.g. `import { seq } from '@strudel.cycles/core'`, instead of `import { seq } from '../core/`.
|
||||
This works because the [bare module import](https://vitejs.dev/guide/features.html#npm-dependency-resolving-and-pre-bundling) `@strudel.cycles/core` is resolved to `node_modules/@strudel.cycles/core`.
|
||||
In a project that installs the published packages from npm, these imports will still work, whereas relative ones might not.
|
||||
- When a strudel package is importing from another strudel package, the package that is imported from should be listed in the `dependencies` field of the `package.json`.
|
||||
For example, [@strudel.cycles/mini lists `@strudel.cycles/core` as a dependency](https://github.com/tidalcycles/strudel/blob/main/packages/mini/package.json).
|
||||
- In development, files in any package can be changed and saved to instantly update the dev server via [hot module replacement](https://vitejs.dev/guide/features.html#hot-module-replacement)
|
||||
- To publish packages, `npx lerna publish` will check which packages were changed since the last publish and publish only those.
|
||||
The version numbers in the dependencies of each packages will be updated automatically to the latest version.
|
||||
|
||||
### Building & Publishing
|
||||
|
||||
Currently, all packages are only published as ESM with vite flavour.
|
||||
To build standardized ESM and CJS files, a `vite.config.js` like that is needed:
|
||||
|
||||
```js
|
||||
import { defineConfig } from 'vite';
|
||||
import { dependencies } from './package.json';
|
||||
import { resolve } from 'path';
|
||||
|
||||
// https://vitejs.dev/config/
|
||||
export default defineConfig({
|
||||
plugins: [],
|
||||
build: {
|
||||
lib: {
|
||||
entry: resolve(__dirname, 'index.mjs'),
|
||||
formats: ['es', 'cjs'],
|
||||
fileName: (ext) => ({ es: 'index.mjs', cjs: 'index.js' }[ext]),
|
||||
},
|
||||
rollupOptions: {
|
||||
external: [...Object.keys(dependencies)],
|
||||
},
|
||||
target: 'esnext',
|
||||
},
|
||||
});
|
||||
```
|
||||
|
||||
This will build `index.mjs` (ESM) and `index.js` (CJS) to the dist folder.
|
||||
|
||||
### What's the main file?
|
||||
|
||||
Currently, each package uses the unbundled `index.mjs` as its main file, which must change for the published version.
|
||||
There are 2 ways to handle this:
|
||||
|
||||
1. `main` = `dist/index.js`, `module` = `dist/index.mjs`. The built files are used. This means that changing a source file won't take effect in the dev server without a rebuild.
|
||||
2. Use different `package.json` files for dev vs publish. So the unbuilt `index.mjs` could be used in dev, while the built files can be used when publishing.
|
||||
|
||||
Option 1 could be done with [workspace watching](https://lerna.js.org/docs/features/workspace-watching), although it might make the dev server less snappy..
|
||||
Option 2 can be done by [publishing just the dist folder and copying over the `package.json` file](https://stackoverflow.com/questions/37862712/how-to-publish-contents-only-of-a-specific-folder).
|
||||
Sadly, [this does not fit into how lerna works](https://github.com/lerna/lerna/issues/91).
|
||||
|
||||
https://github.com/changesets/changesets
|
||||
|
||||
https://turbo.build/repo/docs/handbook/publishing-packages/versioning-and-publishing
|
||||
|
||||
https://pnpm.io/workspaces
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user