Merge branch 'tidalcycles:main' into envelope_improvements

This commit is contained in:
Jade (Rose) Rowland 2024-01-01 18:47:28 -05:00 committed by GitHub
commit 3eface706c
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
9 changed files with 195 additions and 6 deletions

View File

@ -30,11 +30,12 @@ let audioContext;
export const setDefaultAudioContext = () => {
audioContext = new AudioContext();
return audioContext;
};
export const getAudioContext = () => {
if (!audioContext) {
setDefaultAudioContext();
return setDefaultAudioContext();
}
return audioContext;
};

29
pnpm-lock.yaml generated
View File

@ -481,6 +481,9 @@ importers:
'@algolia/client-search':
specifier: ^4.22.0
version: 4.22.0
'@astro-community/astro-embed-youtube':
specifier: ^0.4.3
version: 0.4.3(astro@4.0.8)
'@astrojs/mdx':
specifier: ^2.0.3
version: 2.0.3(astro@4.0.8)
@ -598,6 +601,9 @@ importers:
react-hook-inview:
specifier: ^4.5.0
version: 4.5.0(react-dom@18.2.0)(react@18.2.0)
react-lite-youtube-embed:
specifier: ^2.4.0
version: 2.4.0(react-dom@18.2.0)(react@18.2.0)
rehype-autolink-headings:
specifier: ^7.1.0
version: 7.1.0
@ -794,6 +800,15 @@ packages:
leven: 3.1.0
dev: true
/@astro-community/astro-embed-youtube@0.4.3(astro@4.0.8):
resolution: {integrity: sha512-zXtPmR9yxrTo6cuLhH8v+r62bsXbsLJgsU2FiZalPr4bXJxAUQEIlG46S/qK0AEXi9uNShKqy4+zBaJ98xTVEg==}
peerDependencies:
astro: ^2.0.0 || ^3.0.0-beta || ^4.0.0-beta
dependencies:
astro: 4.0.8(@types/node@20.10.6)(typescript@5.3.3)
lite-youtube-embed: 0.2.0
dev: false
/@astrojs/compiler@2.3.4:
resolution: {integrity: sha512-33/YtWoBCE0cBUNy1kh78FCDXBoBANX87ShgATlAHECYbG2+buNTAgq4Xgz4t5NgnEHPN21GIBC2Mvvwisoutw==}
@ -8902,6 +8917,10 @@ packages:
uc.micro: 1.0.6
dev: true
/lite-youtube-embed@0.2.0:
resolution: {integrity: sha512-XXXAk5sbvtjjwbie3XG+6HppgTm1HTGL/Uk9z9NkJH53o7puZLur434heHzAjkS60hZB3vT4ls25zl5rMiX4EA==}
dev: false
/load-json-file@4.0.0:
resolution: {integrity: sha512-Kx8hMakjX03tiGTLAIdJ+lL0htKnXjEZN6hk/tozf/WOuYGdZBJrZ+rCJRbVCugsjB3jMLn9746NsQIf5VjBMw==}
engines: {node: '>=4'}
@ -11287,6 +11306,16 @@ packages:
resolution: {integrity: sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w==}
dev: true
/react-lite-youtube-embed@2.4.0(react-dom@18.2.0)(react@18.2.0):
resolution: {integrity: sha512-Xo6cM1zPlROvvM97JkqQIoXstlQDaC4+DawmM7BB7Hh1cXrkBHEGq1iJlQxBTUWAUklmpcC7ph7qg7CztXtABQ==}
peerDependencies:
react: '>=18.2.0'
react-dom: '>=18.2.0'
dependencies:
react: 18.2.0
react-dom: 18.2.0(react@18.2.0)
dev: false
/react-refresh@0.14.0:
resolution: {integrity: sha512-wViHqhAd8OHeLS/IRMJjTSDHF3U9eWi62F/MledQGPdJGDhodXJ9PBLNGr6WWL7qlH12Mt3TyTpbS+hGXMjCzQ==}
engines: {node: '>=0.10.0'}

View File

@ -13,6 +13,7 @@
},
"dependencies": {
"@algolia/client-search": "^4.22.0",
"@astro-community/astro-embed-youtube": "^0.4.3",
"@astrojs/mdx": "^2.0.3",
"@astrojs/react": "^3.0.9",
"@astrojs/tailwind": "^5.1.0",
@ -52,6 +53,7 @@
"react": "^18.2.0",
"react-dom": "^18.2.0",
"react-hook-inview": "^4.5.0",
"react-lite-youtube-embed": "^2.4.0",
"rehype-autolink-headings": "^7.1.0",
"rehype-slug": "^6.0.0",
"rehype-urls": "^1.2.0",

View File

@ -62,4 +62,19 @@ const showMoreSection = CONFIG.COMMUNITY_INVITE_URL;
</li>
)
}
<li class="header-link depth-2">
<a rel="me" href="https://social.toplap.org/@strudel" target="_blank" class="flex items-center space-x-2">
<svg xmlns="http://www.w3.org/2000/svg" class="w-4 h-4" viewBox="0 0 216.4144 232.00976">
<path
fill="currentColor"
d="M211.80734 139.0875c-3.18125 16.36625-28.4925 34.2775-57.5625 37.74875-15.15875 1.80875-30.08375 3.47125-45.99875 2.74125-26.0275-1.1925-46.565-6.2125-46.565-6.2125 0 2.53375.15625 4.94625.46875 7.2025 3.38375 25.68625 25.47 27.225 46.39125 27.9425 21.11625.7225 39.91875-5.20625 39.91875-5.20625l.8675 19.09s-14.77 7.93125-41.08125 9.39c-14.50875.7975-32.52375-.365-53.50625-5.91875C9.23234 213.82 1.40609 165.31125.20859 116.09125c-.365-14.61375-.14-28.39375-.14-39.91875 0-50.33 32.97625-65.0825 32.97625-65.0825C49.67234 3.45375 78.20359.2425 107.86484 0h.72875c29.66125.2425 58.21125 3.45375 74.8375 11.09 0 0 32.975 14.7525 32.975 65.0825 0 0 .41375 37.13375-4.59875 62.915"
></path>
<path
fill="black"
d="M177.50984 80.077v60.94125h-24.14375v-59.15c0-12.46875-5.24625-18.7975-15.74-18.7975-11.6025 0-17.4175 7.5075-17.4175 22.3525v32.37625H96.20734V85.42325c0-14.845-5.81625-22.3525-17.41875-22.3525-10.49375 0-15.74 6.32875-15.74 18.7975v59.15H38.90484V80.077c0-12.455 3.17125-22.3525 9.54125-29.675 6.56875-7.3225 15.17125-11.07625 25.85-11.07625 12.355 0 21.71125 4.74875 27.8975 14.2475l6.01375 10.08125 6.015-10.08125c6.185-9.49875 15.54125-14.2475 27.8975-14.2475 10.6775 0 19.28 3.75375 25.85 11.07625 6.36875 7.3225 9.54 17.22 9.54 29.675"
></path>
</svg>
<span>@strudel on Mastodon</span></a
>
</li>
</ul>

View File

@ -0,0 +1,124 @@
import { useState } from 'react';
import LiteYouTubeEmbed from 'react-lite-youtube-embed';
import 'react-lite-youtube-embed/dist/LiteYouTubeEmbed.css';
export function shuffleArray(array) {
array = [...array];
for (let i = array.length - 1; i > 0; i--) {
const j = Math.floor(Math.random() * (i + 1));
[array[i], array[j]] = [array[j], array[i]];
}
return array;
}
let _shuffled;
export function Showcase() {
const [videos, setVideos] = useState(_shuffled);
return (
<>
<div className="flex space-x-2">
<button className="bg-lineHighlight p-2 rounded-md" onClick={() => setVideos(shuffleArray(_videos))}>
<span>shuffle videos</span>
</button>
<button className="bg-lineHighlight p-2 rounded-md" onClick={() => setVideos(_videos)}>
<span>newest first</span>
</button>
</div>
{videos.map((video, i) => (
<div key={i}>
<h2>{video.title}</h2>
<LiteYouTubeEmbed {...video} />
{video.description && <p>{video.description}</p>}
</div>
))}
</>
);
}
let _videos = [
// solstice 2023
{ title: 'Jade Rose @ solstice stream 2023', id: 'wg0vW5Ac7L0' },
{
title: 'eddyflux @ solstice stream 2023',
id: 'DX8E99kC7q0',
description:
'A from-scratch session, starting with sample loops, later transitioning to more electronic territory.',
},
{
title: 'CCC @ solstice stream 2023',
id: '3uLTIDQa_Lc',
params: 'start=24',
},
{ title: 'letSeaTstrudeL @ solstice stream 2023', id: 'fTiX6dVtdWQ' },
{ title: 'totalgee (Glen F) @ solstice stream 2023', id: 'IvI6uaE3nLU' },
{ title: 'Dan Gorelick @ solstice stream 2023', id: 'qMJEljJyPi0' },
//
/* { // not sure if this is copyrighted ...
title: 'Creative Coding @ Chalmers University of Technology, video by svt.se',
id: '4zgHeNpG4wU',
}, */
{ title: 'Switch Angel - Morrow', id: 'qiatPuJpxLs' },
{
title: 'Jade Rose - Into your spell',
id: 'lxQgBeLQBgk',
description:
'Jade Rose performing with various synths via MIDI, superdirt via OSC and the native strudel superdough engine + vocal parts!',
},
// algo afro futures
{
title: 'Emma Osman @ (Algo|Afro) Futures 2023',
id: 'zUoZvkZ3J7Q',
params: 'start=1278',
},
{
title: 'Zach B @ (Algo|Afro) Futures 2023',
id: 'zUoZvkZ3J7Q',
params: 'start=2547',
},
{
title: 'Jamal Lloyd Davis @ (Algo|Afro) Futures 2023',
id: 'zUoZvkZ3J7Q',
params: 'start=3883',
},
{
title: 'Jim Osman @ (Algo|Afro) Futures 2023',
id: 'zUoZvkZ3J7Q',
params: 'start=5155',
},
{
title: 'φ @ (Algo|Afro) Futures 2023',
id: 'zUoZvkZ3J7Q',
params: 'start=7809',
},
{
title: 'Tomilola Olumide @ (Algo|Afro) Futures 2023',
id: 'zUoZvkZ3J7Q',
params: 'start=9224',
},
{
title: 'Tyga Blue @ (Algo|Afro) Futures 2023',
id: 'zUoZvkZ3J7Q',
params: 'start=10909',
},
//
{
title: 'boggo - Live Coding Metal Djents',
id: 'n0rhn9-PRwE',
description: 'A rare sight: live coded Metal Djents, where strudel is sending MIDI to bespoke synth!',
},
{
title: 'froos @ Solstice Night Stream December 2022',
id: 'P1DDsOvcyco',
params: 'start=19',
},
{ title: 'froos @ WAC 2022 Day', id: 'KWIotFWVOi4' },
{
title: 'yaxu & olivia - Algorithmic Pattern Live Stream',
id: 'Jvs7Q4cdLy4',
description:
'A first foray into combining (an early version) strudel and hydra, using flok for collaborative coding.',
},
{ title: 'froos @ Algorave 10th Birthday stream', id: 'IcMSocdKwvw' },
];
_shuffled = shuffleArray(_videos);

View File

@ -54,8 +54,12 @@ export const SIDEBAR: Sidebar = {
],
},
en: {
Presentation: [
{ text: 'What is Strudel?', link: 'workshop/getting-started' },
{ text: 'Showcase', link: 'intro/showcase' },
],
Workshop: [
{ text: 'Getting Started', link: 'workshop/getting-started' },
// { text: 'Getting Started', link: 'workshop/getting-started' },
{ text: 'First Sounds', link: 'workshop/first-sounds' },
{ text: 'First Notes', link: 'workshop/first-notes' },
{ text: 'First Effects', link: 'workshop/first-effects' },

View File

@ -10,5 +10,6 @@ import { Repl } from '../repl/Repl';
</head>
<body class="h-app-height bg-background">
<Repl client:only="react" />
<a rel="me" href="https://social.toplap.org/@strudel" target="_blank" class="hidden">mastodon</a>
</body>
</html>

View File

@ -0,0 +1,12 @@
---
title: Showcase
layout: ../../layouts/MainLayout.astro
---
import { Showcase } from '../../components/Showcase';
# Showcase
This page contains a randomly shuffled selection of videos that show people using strudel in some way.
<Showcase client:only="react" />

View File

@ -19,10 +19,14 @@ export const getAudioDevices = async () => {
};
export const setAudioDevice = async (id) => {
const audioCtx = getAudioContext();
let audioCtx = getAudioContext();
if (audioCtx.sinkId === id) {
return;
}
await audioCtx.suspend();
await audioCtx.close();
audioCtx = setDefaultAudioContext();
await audioCtx.resume();
const isValidID = (id ?? '').length > 0;
if (isValidID) {
try {
@ -30,9 +34,6 @@ export const setAudioDevice = async (id) => {
} catch {
logger('failed to set audio interface', 'warning');
}
} else {
// reset the audio context and dont set the sink id if it is invalid AKA System Standard selection
setDefaultAudioContext();
}
initializeAudioOutput();
};