Compare commits

...

9 Commits

Author SHA1 Message Date
Jade (Rose) Rowland 03cd4a4bdd Merge branch 'main' into show 2025-11-20 22:26:24 -05:00
Jade (Rose) Rowland a00316c3ef show 2025-10-23 19:59:01 -07:00
Jade (Rose) Rowland f3b3d0c2f3 Merge branch 'main' into show 2025-10-17 22:31:33 -04:00
Jade (Rose) Rowland 0bfd013add merge main 2025-10-17 01:37:11 -04:00
Jade (Rose) Rowland ee6f9f1f18 Merge branch 'main' into show 2025-10-01 18:29:16 -04:00
Jade (Rose) Rowland 4247cad97f Merge remote-tracking branch 'origin/solo' into show 2025-09-30 02:10:23 -04:00
Jade (Rose) Rowland 4d5ded6076 Merge branch 'main' into show 2025-09-30 00:39:09 -04:00
Jade (Rose) Rowland d943dce11c customize editor 2025-09-30 00:38:35 -04:00
Felix Roos 7f103e77e3 prefix "S" for solo 2025-07-28 04:05:21 +02:00
5 changed files with 25 additions and 50 deletions
+11 -2
View File
@@ -152,9 +152,9 @@ export function repl({
// allows muting a pattern x with x_ or _x
return silence;
}
if (id === '$') {
if (id.includes('$')) {
// allows adding anonymous patterns with $:
id = `$${anonymousIndex}`;
id = `${id}${anonymousIndex}`;
anonymousIndex++;
}
pPatterns[id] = this;
@@ -218,6 +218,15 @@ export function repl({
for (const [key, value] of Object.entries(pPatterns)) {
patterns.push(value.withState((state) => state.setControls({ id: key })));
}
// if there are solo patterns, only use those
const soloPatterns = Object.entries(pPatterns).filter(([key]) => key.length > 1 && key.startsWith('S'));
if (soloPatterns.length) {
patterns = Object.values(Object.fromEntries(soloPatterns));
}
if (eachTransform) {
// Explicit lambda so only element (not index and array) are passed
patterns = patterns.map((x) => eachTransform(x));
+4 -4
View File
@@ -4,13 +4,13 @@ export default function UdelsHeader(Props) {
const { numWindows, setNumWindows } = Props;
return (
<header id="header" className="flex text-white z-[100] text-lg select-none bg-neutral-800">
<header id="header" className="flex text-white z-[100] text-lg select-none bg-black">
<div className="px-4 items-center gap-2 flex space-x-2 md:pt-0 select-none">
<h1 onClick={() => {}} className={'text-l cursor-pointer flex gap-4'}>
<div className={'mt-[1px] cursor-pointer'}>🌀</div>
<div className={'mt-[1px] cursor-pointer'}>🦄</div>
<div className={'animate-pulse'}>
<span className="">strudel</span> <span className="text-sm">-UDELS</span>
<div>
<span className="font-mono text-">SWITCH ANGEL</span>
</div>
</h1>
<NumberInput value={numWindows} setValue={setNumWindows} />
+4 -44
View File
@@ -47,12 +47,12 @@ export function Header({ context, embedded = false }) {
}
}}
>
<span className="block text-foreground rotate-90"></span>
<span className="block text-foreground ">*</span>
</div>
{!isZen && (
<div className="space-x-2">
<span className="">strudel</span>
<span className="text-sm font-medium">REPL</span>
<span className="">Switch Angel</span>
<span className="text-sm font-medium"></span>
{!isEmbedded && isButtonRowHidden && (
<a href={`${baseNoTrailing}/learn`} className="text-sm opacity-25 font-medium">
DOCS
@@ -82,47 +82,7 @@ export function Header({ context, embedded = false }) {
<>loading...</>
)}
</button>
<button
onClick={handleEvaluate}
title="update"
className={cx(
'flex items-center space-x-1',
!isEmbedded ? 'p-2' : 'px-2',
!isDirty || !activeCode ? 'opacity-50' : 'hover:opacity-50',
)}
>
{!isEmbedded && <span>update</span>}
</button>
{/* !isEmbedded && (
<button
title="shuffle"
className="hover:opacity-50 p-2 flex items-center space-x-1"
onClick={handleShuffle}
>
<span> shuffle</span>
</button>
) */}
{!isEmbedded && (
<button
title="share"
className={cx(
'cursor-pointer hover:opacity-50 flex items-center space-x-1',
!isEmbedded ? 'p-2' : 'px-2',
)}
onClick={handleShare}
>
<span>share</span>
</button>
)}
{!isEmbedded && (
<a
title="learn"
href={`${baseNoTrailing}/workshop/getting-started/`}
className={cx('hover:opacity-50 flex items-center space-x-1', !isEmbedded ? 'p-2' : 'px-2')}
>
<span>learn</span>
</a>
)}
{/* {isEmbedded && (
<button className={cx('hover:opacity-50 px-2')}>
<a href={window.location.href} target="_blank" rel="noopener noreferrer" title="Open in REPL">
@@ -79,6 +79,7 @@ const updateCodeWindow = (context, patternData, reset = false) => {
context.handleUpdate(patternData, reset);
};
function UserPatterns({ context }) {
const activePattern = useActivePattern();
const viewingPatternStore = useViewingPatternData();
+5
View File
@@ -36,6 +36,7 @@ import { getRandomTune, initCode, loadModules, shareCode } from './util.mjs';
import './Repl.css';
import { setInterval, clearInterval } from 'worker-timers';
import { getMetadata } from '../metadata_parser';
import jadeScriptsRaw from '../../../../../../switchangel/strudel-scripts/allscripts.js?raw'
const { latestCode, maxPolyphony, audioDeviceName, multiChannelOrbits } = settingsMap.get();
let modulesLoading, presets, drawContext, clearCanvas, audioReady;
@@ -142,6 +143,10 @@ export function useReplContext() {
msg = `Default code has been loaded`;
}
editor.setCode(code);
// console.info(jadeScriptsRaw)
editor.repl.evaluate(jadeScriptsRaw)
setDocumentTitle(code);
logger(`Welcome to Strudel! ${msg} Press play or hit ctrl+enter to run it!`, 'highlight');
});