diff --git a/iclc2023/slides/package.json b/iclc2023/slides/package.json
index d377696ff..5bbfa0c8a 100644
--- a/iclc2023/slides/package.json
+++ b/iclc2023/slides/package.json
@@ -12,14 +12,17 @@
"@mdx-js/rollup": "^2.3.0",
"@nanostores/persistent": "^0.7.0",
"@nanostores/react": "^0.4.1",
+ "@strudel.cycles/core": "workspace:*",
+ "@strudel.cycles/react": "workspace:*",
+ "@strudel.cycles/soundfonts": "workspace:*",
+ "@strudel.cycles/tonal": "workspace:*",
+ "@strudel.cycles/webaudio": "workspace:*",
+ "@uiw/codemirror-themes-all": "^4.19.8",
"nanostores": "^0.7.4",
"react": "^18.2.0",
"react-dom": "^18.2.0",
- "@strudel.cycles/react": "workspace:*",
- "@strudel.cycles/core": "workspace:*",
- "@strudel.cycles/tonal": "workspace:*",
- "@strudel.cycles/webaudio": "workspace:*",
- "@strudel.cycles/soundfonts": "workspace:*"
+ "react-syntax-highlighter": "^15.5.0",
+ "remark-gfm": "^3.0.1"
},
"devDependencies": {
"@tailwindcss/typography": "^0.5.8",
diff --git a/iclc2023/slides/public/img/haskell.png b/iclc2023/slides/public/img/haskell.png
new file mode 100644
index 000000000..c41182f7d
Binary files /dev/null and b/iclc2023/slides/public/img/haskell.png differ
diff --git a/iclc2023/slides/public/img/js.jpg b/iclc2023/slides/public/img/js.jpg
new file mode 100644
index 000000000..6c3b56670
Binary files /dev/null and b/iclc2023/slides/public/img/js.jpg differ
diff --git a/iclc2023/slides/public/img/ports.png b/iclc2023/slides/public/img/ports.png
new file mode 100644
index 000000000..a179accef
Binary files /dev/null and b/iclc2023/slides/public/img/ports.png differ
diff --git a/iclc2023/slides/public/img/strudelflow.png b/iclc2023/slides/public/img/strudelflow.png
new file mode 100644
index 000000000..72cdf494b
Binary files /dev/null and b/iclc2023/slides/public/img/strudelflow.png differ
diff --git a/iclc2023/slides/src/Highlight.jsx b/iclc2023/slides/src/Highlight.jsx
new file mode 100644
index 000000000..bf366c877
--- /dev/null
+++ b/iclc2023/slides/src/Highlight.jsx
@@ -0,0 +1,17 @@
+import SyntaxHighlighter from 'react-syntax-highlighter';
+import { atomOneDark } from 'react-syntax-highlighter/dist/esm/styles/hljs';
+
+Object.assign(atomOneDark.hljs, { padding: '10px' });
+
+function Highlight({ code, language }) {
+ console.log('atomOneDark', atomOneDark);
+ return (
+
<_MiniRepl
+ hideHeader={hideHeader}
tune={tune}
hideOutsideView={true}
drawTime={drawTime}
punchcard={punchcard}
canvasHeight={canvasHeight}
fontSize={32}
+ theme={atomone}
// theme={themes[theme]}
/>
diff --git a/iclc2023/slides/src/Slides.jsx b/iclc2023/slides/src/Slides.jsx
index 9cfbaf0ba..33076325b 100644
--- a/iclc2023/slides/src/Slides.jsx
+++ b/iclc2023/slides/src/Slides.jsx
@@ -16,7 +16,7 @@ const loadedMDXFiles = await Promise.all(
}),
);
-const order = ['01', '02'];
+const order = ['01', '02-0', '02-1', '02-2', '03'];
const slideEntries = order.map((name) => loadedMDXFiles.find(([file]) => file === name));
@@ -39,13 +39,13 @@ function Slides() {
next();
}
});
- useEvent('keydown', (e) => {
+ /*useEvent('keydown', (e) => {
if (e.key === 'Home') {
prev();
} else if (e.key === 'End') {
next();
}
- });
+ });*/
return (
@@ -58,7 +58,7 @@ function Slides() {
i > activeIndex && 'translate-x-full',
)}
>
-
diff --git a/iclc2023/slides/src/SyntaxComparison.jsx b/iclc2023/slides/src/SyntaxComparison.jsx
new file mode 100644
index 000000000..95d851c51
--- /dev/null
+++ b/iclc2023/slides/src/SyntaxComparison.jsx
@@ -0,0 +1,74 @@
+import { useState } from 'react';
+import { SlideRepl } from './SlideRepl.jsx';
+import Highlight from './Highlight.jsx';
+
+const snippets = [
+ [`sound "bd ~ [sd cp]"`, [`sound("bd ~ [sd cp]")`], 'Mini Notation'], //
+ [`sound "bd ~ [sd cp]" # speed "1 2"`, [`sound("bd ~ [sd cp]").speed("1 2")`], 'Composing Patterns'],
+ [
+ `fast 2 $ sound "bd ~ [sd cp]"`,
+ [`fast(2, sound("bd ~ [sd cp]"))`, `sound("bd ~ [sd cp]").fast(2)`],
+ 'Patterns Transformations',
+ ],
+ [
+ `speed "1 2 3" + "4 5" # s "bd"`,
+ ['speed("1 2 3".add("4 5")).s("bd")', '"1 2 3".add("4 5").speed().s("bd")'],
+ 'Pattern Arithmetic',
+ ],
+ [
+ `jux rev
+ $ every 3 (fast 2)
+ $ sound "bd sd"`,
+ [
+ `sound("bd sd")
+ .every(3, fast(2))
+ .jux(rev)`,
+ ],
+ ],
+ [
+ `jux rev
+ $ every "<3 5>" (fast "1 2")
+ $ sound "bd sd cp mt"`,
+ [
+ `sound("bd sd cp mt")
+ .every("<3 5>", fast("1 2"))
+ .jux(rev)`,
+ ],
+ ],
+];
+
+function SyntaxComparison() {
+ const [step, setStep] = useState(1);
+ return (
+ <>
+
+ {/*
*/}
+ {snippets.slice(0, step).map(([hs, js, label], i) => (
+
+
{label}
+
+
+

+
+
+
+ {js.map((c) => (
+
+

+
+
+ ))}
+
+
+
+ ))}
+
+ {step < snippets.length &&
}
+ >
+ );
+}
+
+export default SyntaxComparison;
diff --git a/iclc2023/slides/src/prebake.mjs b/iclc2023/slides/src/prebake.mjs
index 5e37fe9c2..946dfa3f5 100644
--- a/iclc2023/slides/src/prebake.mjs
+++ b/iclc2023/slides/src/prebake.mjs
@@ -15,6 +15,7 @@ export async function prebake() {
}),
samples(`./EmuSP12.json`, `./EmuSP12/`, { prebake: true, tag: 'drum-machines' }), */
// samples('github:tidalcycles/Dirt-Samples/master'),
+ samples('github:tidalcycles/Dirt-Samples/master'),
]);
}
/*
diff --git a/iclc2023/slides/src/slides/01.mdx b/iclc2023/slides/src/slides/01.mdx
index 63879d49b..52cd13981 100644
--- a/iclc2023/slides/src/slides/01.mdx
+++ b/iclc2023/slides/src/slides/01.mdx
@@ -1 +1,5 @@
+import { SlideRepl } from '../SlideRepl.jsx';
+
# Strudel
+
+
diff --git a/iclc2023/slides/src/slides/02-0.mdx b/iclc2023/slides/src/slides/02-0.mdx
new file mode 100644
index 000000000..36401c234
--- /dev/null
+++ b/iclc2023/slides/src/slides/02-0.mdx
@@ -0,0 +1,6 @@
+# What is Strudel
+
+- a port of Tidal Cycles to JavaScript
+- a browser based editor for zero-install live coding: [strudel.tidalcycles.org](https://strudel.tidalcycles.org)
+- multiple outputs: Web Audio, OSC, MIDI, ...
+- "Strudel" = internationally known as delicious pastry, but also "swirl" / "whirlpool" in german (a tidal can cause a whirlpool!)
diff --git a/iclc2023/slides/src/slides/02-1.mdx b/iclc2023/slides/src/slides/02-1.mdx
new file mode 100644
index 000000000..e8db1d394
--- /dev/null
+++ b/iclc2023/slides/src/slides/02-1.mdx
@@ -0,0 +1,3 @@
+# TidalCycles Port
+
+
\ No newline at end of file
diff --git a/iclc2023/slides/src/slides/02-2.mdx b/iclc2023/slides/src/slides/02-2.mdx
new file mode 100644
index 000000000..3e644abbd
--- /dev/null
+++ b/iclc2023/slides/src/slides/02-2.mdx
@@ -0,0 +1,5 @@
+import SyntaxComparison from '../SyntaxComparison.jsx';
+
+# Syntax Comparison
+
+
diff --git a/iclc2023/slides/src/slides/02.mdx b/iclc2023/slides/src/slides/02.mdx
deleted file mode 100644
index 637164d6a..000000000
--- a/iclc2023/slides/src/slides/02.mdx
+++ /dev/null
@@ -1,5 +0,0 @@
-import { SlideRepl } from '../SlideRepl.jsx';
-
-# What is Strudel
-
-
diff --git a/iclc2023/slides/src/slides/03.mdx b/iclc2023/slides/src/slides/03.mdx
new file mode 100644
index 000000000..216af1557
--- /dev/null
+++ b/iclc2023/slides/src/slides/03.mdx
@@ -0,0 +1,3 @@
+# REPL
+
+
diff --git a/iclc2023/slides/vite.config.js b/iclc2023/slides/vite.config.js
index 9c27be08c..57e81ade2 100644
--- a/iclc2023/slides/vite.config.js
+++ b/iclc2023/slides/vite.config.js
@@ -1,8 +1,15 @@
import { defineConfig } from 'vite';
import react from '@vitejs/plugin-react';
import mdx from '@mdx-js/rollup';
+import gfm from 'remark-gfm';
+
+const options = {
+ // See https://mdxjs.com/advanced/plugins
+ remarkPlugins: [gfm],
+ rehypePlugins: [],
+};
// https://vitejs.dev/config/
export default defineConfig({
- plugins: [react(), mdx()],
+ plugins: [react(), mdx(options)],
});
diff --git a/packages/react/src/components/MiniRepl.jsx b/packages/react/src/components/MiniRepl.jsx
index c469bb124..731e51d8d 100644
--- a/packages/react/src/components/MiniRepl.jsx
+++ b/packages/react/src/components/MiniRepl.jsx
@@ -22,6 +22,7 @@ export function MiniRepl({
punchcard,
canvasHeight = 200,
fontSize = 18,
+ hideHeader = false,
theme,
}) {
drawTime = drawTime || (punchcard ? [0, 4] : undefined);
@@ -110,33 +111,35 @@ export function MiniRepl({
return (
-
-
-
-
+ {!hideHeader && (
+
+
+
+
+
- {error &&
{error.message}
}
-
+ )}
{show && (
)}
+ {error &&
{error.message}
}
{drawTime && (