Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Auto await samples #955

Merged
merged 3 commits into from
Feb 21, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion examples/buildless/headless-with-samples.html
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@
<script type="module">
import { initStrudel } from 'https://cdn.skypack.dev/@strudel/web@0.8.2';
initStrudel({
prebake: () => samples('github:tidalcycles/Dirt-Samples/master'),
prebake: () => samples('github:tidalcycles/dirt-samples'),
});
const click = (id, action) => document.getElementById(id).addEventListener('click', action);
click('a', () => evaluate(`s('bd,jvbass(3,8)').jux(rev)`));
Expand Down
2 changes: 1 addition & 1 deletion examples/buildless/minimal-repl.html
Original file line number Diff line number Diff line change
Expand Up @@ -52,7 +52,7 @@
});

function getTune() {
return `await samples('github:tidalcycles/Dirt-Samples/master')
return `samples('github:tidalcycles/dirt-samples')

stack(
// amen
Expand Down
12 changes: 6 additions & 6 deletions examples/codemirror-repl/tunes.mjs
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
export const bumpStreet = `// froos - "22 bump street", licensed with CC BY-NC-SA 4.0
await samples('github:felixroos/samples/main')
await samples('https://strudel.cc/tidal-drum-machines.json', 'github:ritchse/tidal-drum-machines/main/machines/')
samples('github:felixroos/samples')
samples('https://strudel.cc/tidal-drum-machines.json', 'github:ritchse/tidal-drum-machines/main/machines/')

"<[0,<6 7 9>,13,<17 20 22 26>]!2>/2"
// make it 22 edo
Expand Down Expand Up @@ -33,8 +33,8 @@ await samples('https://strudel.cc/tidal-drum-machines.json', 'github:ritchse/tid

export const trafficFlam = `// froos - "traffic flam", licensed with CC BY-NC-SA 4.0

await samples('github:felixroos/samples/main')
await samples('https://strudel.cc/tidal-drum-machines.json', 'github:ritchse/tidal-drum-machines/main/machines/')
samples('github:felixroos/samples')
samples('https://strudel.cc/tidal-drum-machines.json', 'github:ritchse/tidal-drum-machines/main/machines/')

addVoicings('hip', {
m11: ['2M 3m 4P 7m'],
Expand Down Expand Up @@ -69,8 +69,8 @@ export const funk42 = `// froos - how to funk in 42 lines of code
// adapted from "how to funk in two minutes" by marc rebillet https://www.youtube.com/watch?v=3vBwRfQbXkg
// thanks to peach for the transcription: https://www.youtube.com/watch?v=8eiPXvIgda4

await samples('github:felixroos/samples/main')
await samples('https://strudel.cc/tidal-drum-machines.json', 'github:ritchse/tidal-drum-machines/main/machines/')
samples('github:felixroos/samples')
samples('https://strudel.cc/tidal-drum-machines.json', 'github:ritchse/tidal-drum-machines/main/machines/')

setcps(.5)

Expand Down
2 changes: 1 addition & 1 deletion examples/headless-repl/index.html
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,7 @@
<script type="module">
import { initStrudel } from '@strudel/web';
initStrudel({
prebake: () => samples('github:tidalcycles/Dirt-Samples/master'),
prebake: () => samples('github:tidalcycles/dirt-samples'),
});

const click = (id, action) => document.getElementById(id).addEventListener('click', action);
Expand Down
2 changes: 1 addition & 1 deletion examples/minimal-repl/tune.mjs
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
export default `await samples('github:tidalcycles/Dirt-Samples/master')
export default `samples('github:tidalcycles/dirt-samples')

stack(
// amen
Expand Down
2 changes: 1 addition & 1 deletion examples/superdough/index.html
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,7 @@

const init = Promise.all([
initAudioOnFirstClick(),
samples('github:tidalcycles/Dirt-Samples/master'),
samples('github:tidalcycles/dirt-samples'),
registerSynthSounds(),
]);

Expand Down
2 changes: 1 addition & 1 deletion packages/core/controls.mjs
Original file line number Diff line number Diff line change
Expand Up @@ -292,7 +292,7 @@ const generic_params = [
* @name begin
* @param {number | Pattern} amount between 0 and 1, where 1 is the length of the sample
* @example
* samples({ rave: 'rave/AREUREADY.wav' }, 'github:tidalcycles/Dirt-Samples/master/')
* samples({ rave: 'rave/AREUREADY.wav' }, 'github:tidalcycles/dirt-samples')
* s("rave").begin("<0 .25 .5 .75>").fast(2)
*
*/
Expand Down
6 changes: 3 additions & 3 deletions packages/core/pattern.mjs
Original file line number Diff line number Diff line change
Expand Up @@ -2322,10 +2322,10 @@ const _loopAt = function (factor, pat, cps = 0.5) {
* @memberof Pattern
* @returns Pattern
* @example
* await samples('github:tidalcycles/Dirt-Samples/master')
* samples('github:tidalcycles/dirt-samples')
* s("breaks165").slice(8, "0 1 <2 2*2> 3 [4 0] 5 6 7".every(3, rev)).slow(0.75)
* @example
* await samples('github:tidalcycles/Dirt-Samples/master')
* samples('github:tidalcycles/dirt-samples')
* s("breaks125").fit().slice([0,.25,.5,.75], "0 1 1 <2 3>")
*/

Expand All @@ -2351,7 +2351,7 @@ export const slice = register(
* Works the same as slice, but changes the playback speed of each slice to match the duration of its step.
* @name splice
* @example
* await samples('github:tidalcycles/Dirt-Samples/master')
* samples('github:tidalcycles/dirt-samples')
* s("breaks165")
* .splice(8, "0 1 [2 3 0]@2 3 0@2 7")
*/
Expand Down
4 changes: 2 additions & 2 deletions packages/superdough/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,7 @@ import { superdough, samples, initAudioOnFirstClick, registerSynthSounds } from

const init = Promise.all([
initAudioOnFirstClick(),
samples('github:tidalcycles/Dirt-Samples/master'),
samples('github:tidalcycles/dirt-samples'),
registerSynthSounds(),
]);

Expand Down Expand Up @@ -148,7 +148,7 @@ The json file is expected to have the same format as described above.
Because it is common to use github for samples, there is a short way to load a sample map from github:

```js
samples('github:tidalcycles/Dirt-Samples/master')
samples('github:tidalcycles/dirt-samples')
```

The format is `github:<user>/<repo>/<branch>`.
Expand Down
2 changes: 1 addition & 1 deletion packages/superdough/sampler.mjs
Original file line number Diff line number Diff line change
Expand Up @@ -142,7 +142,7 @@ function getSamplesPrefixHandler(url) {
/**
* Loads a collection of samples to use with `s`
* @example
* samples('github:tidalcycles/Dirt-Samples/master');
* samples('github:tidalcycles/dirt-samples');
* s("[bd ~]*2, [~ hh]*2, ~ sd")
* @example
* samples({
Expand Down
3 changes: 3 additions & 0 deletions packages/transpiler/test/transpiler.test.mjs
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,9 @@ describe('transpiler', () => {
it('supports top level await', () => {
expect(transpiler("await samples('xxx');", simple).output).toEqual("await samples('xxx');");
});
it('adds await to bare samples call', () => {
expect(transpiler("samples('xxx');", simple).output).toEqual("await samples('xxx');");
});
/* it('parses dynamic imports', () => {
expect(
transpiler("const { default: foo } = await import('https://bar.com/foo.js');", {
Expand Down
19 changes: 16 additions & 3 deletions packages/transpiler/transpiler.mjs
Original file line number Diff line number Diff line change
@@ -1,8 +1,7 @@
import escodegen from 'escodegen';
import { getLeafLocations } from '@strudel/mini';
import { parse } from 'acorn';
import escodegen from 'escodegen';
import { walk } from 'estree-walker';
import { isNoteWithOctave } from '@strudel/core';
import { getLeafLocations } from '@strudel/mini';

export function transpiler(input, options = {}) {
const { wrapAsync = false, addReturn = true, emitMiniLocations = true, emitWidgets = true } = options;
Expand Down Expand Up @@ -47,6 +46,9 @@ export function transpiler(input, options = {}) {
});
return this.replace(widgetWithLocation(node));
}
if (isBareSamplesCall(node, parent)) {
return this.replace(withAwait(node));
}
},
leave(node, parent, prop, index) {},
});
Expand Down Expand Up @@ -119,3 +121,14 @@ function widgetWithLocation(node) {
node.callee.name = 'sliderWithID';
return node;
}

function isBareSamplesCall(node, parent) {
return node.type === 'CallExpression' && node.callee.name === 'samples' && parent.type !== 'AwaitExpression';
}

function withAwait(node) {
return {
type: 'AwaitExpression',
argument: node,
};
}
2 changes: 1 addition & 1 deletion packages/web/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -43,7 +43,7 @@ By default, no external samples are loaded, but you can add them like this:

```js
initStrudel({
prebake: () => samples('github:tidalcycles/Dirt-Samples/master'),
prebake: () => samples('github:tidalcycles/dirt-samples'),
});

document.getElementById('play').addEventListener('click',
Expand Down
2 changes: 1 addition & 1 deletion website/src/content/blog/release-0.8.0-himbeermuffin.mdx
Original file line number Diff line number Diff line change
Expand Up @@ -29,7 +29,7 @@ edit: the desktop app performance on linux is currently not that great.. the web
The desktop App has the same features as the webapp, with the additional ability to load samples from disk. It is currently not documented yet, but you can do something like

```js
await samples('~/music/xxx');
samples('~/music/xxx');

s('my_sound');
```
Expand Down
4 changes: 2 additions & 2 deletions website/src/examples.mjs
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
export const examples = [
`// "coastline" @by eddyflux
await samples('github:eddyflux/crate')
samples('github:eddyflux/crate')
setcps(.75)
let chords = chord("<Bbm9 Fm9>/4").dict('ireal')
stack(
Expand Down Expand Up @@ -30,7 +30,7 @@ stack(
.late("[0 .01]*4").late("[0 .01]*2").size(4)`,
`// "broken cut 1" @by froos

await samples('github:tidalcycles/Dirt-Samples/master')
samples('github:tidalcycles/dirt-samples')
samples({
'slap': 'https://cdn.freesound.org/previews/495/495416_10350281-lq.mp3',
'whirl': 'https://cdn.freesound.org/previews/495/495313_10350281-lq.mp3',
Expand Down
2 changes: 1 addition & 1 deletion website/src/pages/learn/getting-started.mdx
Original file line number Diff line number Diff line change
Expand Up @@ -51,7 +51,7 @@ Alternatively, you can get a taste of what Strudel can do by clicking play on th
bd: ['bd/BT0AADA.wav','bd/BT0AAD0.wav','bd/BT0A0DA.wav','bd/BT0A0D3.wav','bd/BT0A0D0.wav','bd/BT0A0A7.wav'],
sd: ['sd/rytm-01-classic.wav','sd/rytm-00-hard.wav'],
hh: ['hh27/000_hh27closedhh.wav','hh/000_hh3closedhh.wav'],
}, 'github:tidalcycles/Dirt-Samples/master/');
}, 'github:tidalcycles/dirt-samples');
stack(
s("bd,[~ <sd!3 sd(3,4,2)>],hh*8") // drums
.speed(perlin.range(.7,.9)) // random sample speed variation
Expand Down
20 changes: 10 additions & 10 deletions website/src/pages/learn/samples.mdx
Original file line number Diff line number Diff line change
Expand Up @@ -143,7 +143,7 @@ Because GitHub is a popular place for uploading open source samples, it has its
bd: 'bd/BT0AADA.wav',
sd: 'sd/rytm-01-classic.wav',
hh: 'hh27/000_hh27closedhh.wav',
}, 'github:tidalcycles/Dirt-Samples/master/');
}, 'github:tidalcycles/dirt-samples');
s("bd sd bd sd,hh*16")`}
/>

Expand Down Expand Up @@ -174,7 +174,7 @@ It is also possible, to declare multiple files for one sound, using the array no
bd: ['bd/BT0AADA.wav','bd/BT0AAD0.wav'],
sd: ['sd/rytm-01-classic.wav','sd/rytm-00-hard.wav'],
hh: ['hh27/000_hh27closedhh.wav','hh/000_hh3closedhh.wav'],
}, 'github:tidalcycles/Dirt-Samples/master/');
}, 'github:tidalcycles/dirt-samples');
s("bd:0 bd:1,~ <sd:0 sd:1> ~ sd:0,[hh:0 hh:1]*4")`}
/>

Expand All @@ -187,7 +187,7 @@ The sample number can also be set using `n`:
bd: ['bd/BT0AADA.wav','bd/BT0AAD0.wav'],
sd: ['sd/rytm-01-classic.wav','sd/rytm-00-hard.wav'],
hh: ['hh27/000_hh27closedhh.wav','hh/000_hh3closedhh.wav'],
}, 'github:tidalcycles/Dirt-Samples/master/');
}, 'github:tidalcycles/dirt-samples');
s("bd bd,~ sd ~ sd,hh*8").n("<0 1>")`}
/>

Expand Down Expand Up @@ -231,7 +231,7 @@ For pitched sounds, you can use `note`, just like with synths:
client:idle
tune={`samples({
'gtr': 'gtr/0001_cleanC.wav',
}, 'github:tidalcycles/Dirt-Samples/master/');
}, 'github:tidalcycles/dirt-samples');
note("g3 [bb3 c4] <g4 f4 eb4 f3>@2").s('gtr').gain(.5)`}
/>

Expand All @@ -242,7 +242,7 @@ If we want them to behave more like a synth, we can add `clip(1)`:
client:idle
tune={`samples({
'gtr': 'gtr/0001_cleanC.wav',
}, 'github:tidalcycles/Dirt-Samples/master/');
}, 'github:tidalcycles/dirt-samples');
note("g3 [bb3 c4] <g4 f4 eb4 f3>@2").s('gtr').clip(1)
.gain(.5)`}
/>
Expand All @@ -256,7 +256,7 @@ If we have 2 samples with different base pitches, we can make them in tune by sp
tune={`samples({
'gtr': 'gtr/0001_cleanC.wav',
'moog': { 'g3': 'moog/005_Mighty%20Moog%20G3.wav' },
}, 'github:tidalcycles/Dirt-Samples/master/');
}, 'github:tidalcycles/dirt-samples');
note("g3 [bb3 c4] <g4 f4 eb4 f3>@2").s("gtr,moog").clip(1)
.gain(.5)`}
/>
Expand All @@ -272,7 +272,7 @@ We can also declare different samples for different regions of the keyboard:
'g2': 'moog/004_Mighty%20Moog%20G2.wav',
'g3': 'moog/005_Mighty%20Moog%20G3.wav',
'g4': 'moog/006_Mighty%20Moog%20G4.wav',
}}, 'github:tidalcycles/Dirt-Samples/master/');
}}, 'github:tidalcycles/dirt-samples');
note("g2!2 <bb2 c3>!2, <c4@3 [<eb4 bb3> g4 f4]>")
.s('moog').clip(1)
.gain(.5).cpm(60)`}
Expand All @@ -287,7 +287,7 @@ With it, you can enter any sample name(s) to query from [freesound.org](https://

<MiniRepl
client:idle
tune={`await samples('shabda:bass:4,hihat:4,rimshot:2')
tune={`samples('shabda:bass:4,hihat:4,rimshot:2')
stack(
n("0 1 2 3 0 1 2 3").s('bass'),
n("0 1*2 2 3*2").s('hihat'),
Expand All @@ -300,8 +300,8 @@ Note that the language code and the gender parameters are optional and default t

<MiniRepl
client:idle
tune={`await samples('shabda/speech:the_drum,forever')
await samples('shabda/speech/fr-FR/m:magnifique')
tune={`samples('shabda/speech:the_drum,forever')
samples('shabda/speech/fr-FR/m:magnifique')
stack(
s("the_drum*2").chop(16).speed(rand.range(0.85,1.1)),
s("forever magnifique").slow(4).late(0.125)
Expand Down
20 changes: 10 additions & 10 deletions website/src/pages/recipes/recipes.mdx
Original file line number Diff line number Diff line change
Expand Up @@ -60,7 +60,7 @@ A sample can be looped and chopped like this:

<MiniRepl
client:visible
tune={`await samples('github:yaxu/clean-breaks/main')
tune={`samples('github:yaxu/clean-breaks')
s("amen/4").fit().chop(32)`}
punchcard
/>
Expand All @@ -71,7 +71,7 @@ Let's add randmized doubling + reversing:

<MiniRepl
client:visible
tune={`await samples('github:yaxu/clean-breaks/main')
tune={`samples('github:yaxu/clean-breaks')
s("amen/4").fit().chop(16).cut(1)
.sometimesBy(.5, ply("2"))
.sometimesBy(.25, mul(speed("-1")))`}
Expand All @@ -82,7 +82,7 @@ If we want to specify the order of samples, we can replace `chop` with `slice`:

<MiniRepl
client:visible
tune={`await samples('github:yaxu/clean-breaks/main')
tune={`samples('github:yaxu/clean-breaks')
s("amen/4").fit()
.slice(8, "<0 1 2 3 4*2 5 6 [6 7]>*2")
.cut(1).rarely(ply("2"))`}
Expand All @@ -93,7 +93,7 @@ If we use `splice` instead of `slice`, the speed adjusts to the duration of the

<MiniRepl
client:visible
tune={`await samples('github:yaxu/clean-breaks/main')
tune={`samples('github:yaxu/clean-breaks')
s("amen")
.splice(8, "<0 1 2 3 4*2 5 6 [6 7]>*2")
.cut(1).rarely(ply("2"))`}
Expand Down Expand Up @@ -213,7 +213,7 @@ Using `run` with `n`, we can rush through a sample bank:

<MiniRepl
client:visible
tune={`await samples('bubo:fox')
tune={`samples('bubo:fox')
n(run(8)).s("ftabla")`}
punchcard
/>
Expand All @@ -224,15 +224,15 @@ In this case, I hear the beginning at the third sample, which can be accounted f

<MiniRepl
client:visible
tune={`await samples('bubo:fox')
tune={`samples('bubo:fox')
n(run(8)).s("ftabla").early(2/8)`}
/>

Let's add some randomness:

<MiniRepl
client:visible
tune={`await samples('bubo:fox')
tune={`samples('bubo:fox')
n(run(8)).s("ftabla").early(2/8)
.sometimes(mul(speed("1.5")))`}
/>
Expand Down Expand Up @@ -299,23 +299,23 @@ To simplify loading wavetables, any sample that starts with `wt_` will be looped

<MiniRepl
client:visible
tune={`await samples('github:bubobubobubobubo/dough-waveforms/main')
tune={`samples('github:bubobubobubobubo/dough-waveforms')
note("c eb g bb").s("wt_dbass").clip(2)`}
/>

Running through different wavetables can also give interesting variations:

<MiniRepl
client:visible
tune={`await samples('github:bubobubobubobubo/dough-waveforms/main')
tune={`samples('github:bubobubobubobubo/dough-waveforms')
note("c2*8").s("wt_dbass").n(run(8))`}
/>

...adding a filter envelope + reverb:

<MiniRepl
client:visible
tune={`await samples('github:bubobubobubobubo/dough-waveforms/main')
tune={`samples('github:bubobubobubobubo/dough-waveforms')
note("c2*8").s("wt_dbass").n(run(8))
.lpf(perlin.range(200,2000).slow(8))
.lpenv(-3).lpa(.1).room(.5)`}
Expand Down
Loading
Loading