This commit is contained in:
Felix Roos 2022-03-18 19:53:52 +01:00
parent 88bcfc5e48
commit c263eac7fd
10 changed files with 93 additions and 15 deletions

15
docs/dist/App.js vendored
View File

@ -1,10 +1,11 @@
import React, {useCallback, useLayoutEffect, useRef, useState} from "../_snowpack/pkg/react.js";
import * as Tone from "../_snowpack/pkg/tone.js";
import CodeMirror, {markEvent, markParens} from "./CodeMirror.js";
import cx from "./cx.js";
import {evaluate} from "./evaluate.js";
import logo from "./logo.svg.proxy.js";
import {useWebMidi} from "./midi.js";
import playStatic from "./static.js";
import {defaultSynth} from "./tone.js";
import * as tunes from "./tunes.js";
import useRepl from "./useRepl.js";
const [_, codeParam] = window.location.href.split("#");
@ -14,13 +15,6 @@ try {
} catch (err) {
console.warn("failed to decode", err);
}
const defaultSynth = new Tone.PolySynth().chain(new Tone.Gain(0.5), Tone.getDestination());
defaultSynth.set({
oscillator: {type: "triangle"},
envelope: {
release: 0.01
}
});
function getRandomTune() {
const allTunes = Object.values(tunes);
const randomItem = (arr) => arr[Math.floor(Math.random() * arr.length)];
@ -145,6 +139,9 @@ function App() {
readOnly: true,
ref: logBox,
style: {fontFamily: "monospace"}
})));
})), /* @__PURE__ */ React.createElement("button", {
className: "fixed right-4 bottom-2 z-[11]",
onClick: () => playStatic(code)
}, "static"));
}
export default App;

48
docs/dist/static.js vendored Normal file
View File

@ -0,0 +1,48 @@
import * as Tone from "../_snowpack/pkg/tone.js";
import {State, TimeSpan} from "../_snowpack/link/strudel.js";
import {getPlayableNoteValue} from "../_snowpack/link/util.js";
import {evaluate} from "./evaluate.js";
async function playStatic(code) {
let start, took;
const seconds = Number(prompt("How many seconds to run?")) || 60;
start = performance.now();
const {pattern: pat} = await evaluate(code);
took = performance.now() - start;
console.log("evaluate took", took, "ms");
Tone.getTransport().stop();
start = performance.now();
const events = pat?.query(new State(new TimeSpan(0, seconds)))?.filter((event) => event.part.begin.valueOf() === event.whole.begin.valueOf())?.map((event) => ({
time: event.whole.begin.valueOf(),
duration: event.whole.end.sub(event.whole.begin).valueOf(),
value: event.value,
context: event.context
}));
took = performance.now() - start;
console.log("query took", took, "ms");
start = performance.now();
events.forEach((event) => {
Tone.getTransport().schedule((time) => {
try {
const {onTrigger, velocity} = event.context;
if (!onTrigger) {
if (defaultSynth) {
const note = getPlayableNoteValue(event);
defaultSynth.triggerAttackRelease(note, event.duration, time, velocity);
} else {
throw new Error("no defaultSynth passed to useRepl.");
}
} else {
onTrigger(time, event);
}
} catch (err) {
console.warn(err);
err.message = "unplayable event: " + err?.message;
pushLog(err.message);
}
}, event.time);
});
took = performance.now() - start;
console.log("schedule took", took, "ms");
Tone.getTransport().start("+0.5");
}
export default playStatic;

7
docs/dist/tone.js vendored
View File

@ -20,6 +20,13 @@ import {
} from "../_snowpack/pkg/tone.js";
import {Piano} from "../_snowpack/pkg/@tonejs/piano.js";
import {getPlayableNoteValue} from "../_snowpack/link/util.js";
export const defaultSynth = new PolySynth().chain(new Gain(0.5), getDestination());
defaultSynth.set({
oscillator: {type: "triangle"},
envelope: {
release: 0.01
}
});
const Pattern = _Pattern;
Pattern.prototype.tone = function(instrument) {
return this._withEvent((event) => {

View File

@ -933,6 +933,9 @@ select {
.static {
position: static;
}
.fixed {
position: fixed;
}
.absolute {
position: absolute;
}
@ -955,9 +958,15 @@ select {
.bottom-2 {
bottom: 0.5rem;
}
.right-4 {
right: 1rem;
}
.z-\[10\] {
z-index: 10;
}
.z-\[11\] {
z-index: 11;
}
.block {
display: block;
}

View File

@ -678,6 +678,8 @@ Ensure the default browser behavior of the `hidden` attribute.
pointer-events: none;
}.static {
position: static;
}.fixed {
position: fixed;
}.absolute {
position: absolute;
}.relative {
@ -693,8 +695,12 @@ Ensure the default browser behavior of the `hidden` attribute.
right: 0.5rem;
}.bottom-2 {
bottom: 0.5rem;
}.right-4 {
right: 1rem;
}.z-\[10\] {
z-index: 10;
}.z-\[11\] {
z-index: 11;
}.block {
display: block;
}.flex {
@ -1363,4 +1369,4 @@ span.CodeMirror-selectedtext { background: none; }
color: white !important;
}
/*# sourceMappingURL=index.c844960c.css.map */
/*# sourceMappingURL=index.2798a8d1.css.map */

File diff suppressed because one or more lines are too long

View File

@ -56757,6 +56757,8 @@ exports.default = thunkify;
},{"./curryN.js":"jngJ1","./internal/_curry1.js":"kHmsM","@parcel/transformer-js/src/esmodule-helpers.js":"gkKU3"}],"aBpVm":[function(require,module,exports) {
var parcelHelpers = require("@parcel/transformer-js/src/esmodule-helpers.js");
parcelHelpers.defineInteropFlag(exports);
parcelHelpers.export(exports, "defaultSynth", ()=>defaultSynth
);
parcelHelpers.export(exports, "amsynth", ()=>amsynth
);
parcelHelpers.export(exports, "duosynth", ()=>duosynth
@ -56807,6 +56809,15 @@ var _strudelMjs = require("../../strudel.mjs");
var _tone = require("tone");
var _piano = require("@tonejs/piano");
var _utilMjs = require("../../util.mjs");
const defaultSynth = new _tone.PolySynth().chain(new _tone.Gain(0.5), _tone.getDestination());
defaultSynth.set({
oscillator: {
type: 'triangle'
},
envelope: {
release: 0.01
}
});
// what about
// https://www.charlie-roberts.com/gibberish/playground/
const Pattern = _strudelMjs.Pattern;
@ -183303,4 +183314,4 @@ exports.default = cx;
},{"@parcel/transformer-js/src/esmodule-helpers.js":"gkKU3"}]},["3uVTb"], "3uVTb", "parcelRequire94c2")
//# sourceMappingURL=index.f8c9aeff.js.map
//# sourceMappingURL=index.c6dd21ba.js.map

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

@ -3,7 +3,7 @@
<head>
<meta charset="utf-8">
<link rel="icon" href="/tutorial/favicon.e3ab9dd9.ico">
<link rel="stylesheet" type="text/css" href="/tutorial/index.c844960c.css">
<link rel="stylesheet" type="text/css" href="/tutorial/index.2798a8d1.css">
<meta name="viewport" content="width=device-width, initial-scale=1">
<meta name="description" content="Strudel REPL">
<title>Strudel Tutorial</title>
@ -11,6 +11,6 @@
<body>
<div id="root"></div>
<noscript>You need to enable JavaScript to run this app.</noscript>
<script src="/tutorial/index.f8c9aeff.js" defer=""></script>
<script src="/tutorial/index.c6dd21ba.js" defer=""></script>
</body>
</html>