2022-08-21 11:22:30 +02:00

4 lines
10 KiB
JavaScript

"use strict";Object.defineProperties(exports,{__esModule:{value:!0},[Symbol.toStringTag]:{value:"Module"}});var t=require("react"),oe=require("@uiw/react-codemirror"),S=require("@codemirror/view"),H=require("@codemirror/state"),se=require("@codemirror/lang-javascript"),u=require("@lezer/highlight"),ne=require("@uiw/codemirror-themes"),ce=require("react-hook-inview"),U=require("@strudel.cycles/eval"),ie=require("@strudel.cycles/core/util.mjs"),k=require("@strudel.cycles/tone"),V=require("@strudel.cycles/core"),T=require("@strudel.cycles/midi");function $(e){return e&&typeof e=="object"&&"default"in e?e:{default:e}}var m=$(t),le=$(oe),ue=ne.createTheme({theme:"dark",settings:{background:"#222",foreground:"#75baff",caret:"#ffcc00",selection:"rgba(128, 203, 196, 0.5)",selectionMatch:"#036dd626",lineHighlight:"#8a91991a",gutterBackground:"transparent",gutterForeground:"#676e95"},styles:[{tag:u.tags.keyword,color:"#c792ea"},{tag:u.tags.operator,color:"#89ddff"},{tag:u.tags.special(u.tags.variableName),color:"#eeffff"},{tag:u.tags.typeName,color:"#f07178"},{tag:u.tags.atom,color:"#f78c6c"},{tag:u.tags.number,color:"#ff5370"},{tag:u.tags.definition(u.tags.variableName),color:"#82aaff"},{tag:u.tags.string,color:"#c3e88d"},{tag:u.tags.special(u.tags.string),color:"#f07178"},{tag:u.tags.comment,color:"#7d8799"},{tag:u.tags.variableName,color:"#f07178"},{tag:u.tags.tagName,color:"#ff5370"},{tag:u.tags.bracket,color:"#a2a1a4"},{tag:u.tags.meta,color:"#ffcb6b"},{tag:u.tags.attributeName,color:"#c792ea"},{tag:u.tags.propertyName,color:"#c792ea"},{tag:u.tags.className,color:"#decb6b"},{tag:u.tags.invalid,color:"#ffffff"}]});const z=H.StateEffect.define(),de=H.StateField.define({create(){return S.Decoration.none},update(e,a){try{for(let s of a.effects)if(s.is(z))if(s.value){const c=S.Decoration.mark({attributes:{style:"background-color: #FFCA2880"}});e=S.Decoration.set([c.range(0,a.newDoc.length)])}else e=S.Decoration.set([]);return e}catch(s){return console.warn("flash error",s),e}},provide:e=>S.EditorView.decorations.from(e)}),Q=e=>{e.dispatch({effects:z.of(!0)}),setTimeout(()=>{e.dispatch({effects:z.of(!1)})},200)},A=H.StateEffect.define(),fe=H.StateField.define({create(){return S.Decoration.none},update(e,a){try{for(let s of a.effects)if(s.is(A)){const c=s.value.map(d=>(d.context.locations||[]).map(({start:l,end:i})=>{const f=d.context.color||"#FFCA28";let o=a.newDoc.line(l.line).from+l.column,r=a.newDoc.line(i.line).from+i.column;const b=a.newDoc.length;return o>b||r>b?void 0:S.Decoration.mark({attributes:{style:`outline: 1.5px solid ${f};`}}).range(o,r)})).flat().filter(Boolean)||[];e=S.Decoration.set(c,!0)}return e}catch{return S.Decoration.set([])}},provide:e=>S.EditorView.decorations.from(e)}),ge=[se.javascript(),ue,fe,de];function J({value:e,onChange:a,onViewChanged:s,onSelectionChange:c,options:d,editorDidMount:l}){const i=t.useCallback(r=>{a?.(r)},[a]),f=t.useCallback(r=>{s?.(r)},[s]),o=t.useCallback(r=>{r.selectionSet&&c&&c?.(r.state.selection)},[c]);return m.default.createElement(m.default.Fragment,null,m.default.createElement(le.default,{value:e,onChange:i,onCreateEditor:f,onUpdate:o,extensions:ge}))}function G(e){const{onEvent:a,onQuery:s,onSchedule:c,ready:d=!0,onDraw:l}=e,[i,f]=t.useState(!1),o=1,r=()=>Math.floor(k.Tone.getTransport().seconds/o),b=(h=r())=>{const w=new V.TimeSpan(h,h+1),N=s?.(new V.State(w))||[];c?.(N,h);const F=w.begin.valueOf();k.Tone.getTransport().cancel(F);const _=(h+1)*o-.5,R=Math.max(k.Tone.getTransport().seconds,_)+.1;k.Tone.getTransport().schedule(()=>{b(h+1)},R),N?.filter(E=>E.part.begin.equals(E.whole?.begin)).forEach(E=>{k.Tone.getTransport().schedule(M=>{a(M,E,k.Tone.getContext().currentTime),k.Tone.Draw.schedule(()=>{l?.(M,E)},M)},E.part.begin.valueOf())})};t.useEffect(()=>{d&&b()},[a,c,s,l,d]);const C=async()=>{f(!0),await k.Tone.start(),k.Tone.getTransport().start("+0.1")},v=()=>{k.Tone.getTransport().pause(),f(!1)};return{start:C,stop:v,onEvent:a,started:i,setStarted:f,toggle:()=>i?v():C(),query:b,activeCycle:r}}function X(e){return t.useEffect(()=>(window.addEventListener("message",e),()=>window.removeEventListener("message",e)),[e]),t.useCallback(a=>window.postMessage(a,"*"),[])}let me=()=>Math.floor((1+Math.random())*65536).toString(16).substring(1);const he=e=>encodeURIComponent(btoa(e));function Y({tune:e,defaultSynth:a,autolink:s=!0,onEvent:c,onDraw:d}){const l=t.useMemo(()=>me(),[]),[i,f]=t.useState(e),[o,r]=t.useState(),[b,C]=t.useState(""),[v,y]=t.useState(),[h,w]=t.useState(!1),[N,F]=t.useState(""),[_,R]=t.useState(),E=t.useMemo(()=>i!==o||v,[i,o,v]),M=t.useCallback(g=>C(n=>n+`${n?`
`:""}${g}`),[]),L=t.useMemo(()=>{if(o&&!o.includes("strudel disable-highlighting"))return(g,n)=>d?.(g,n,o)},[o,d]),P=t.useMemo(()=>o&&o.includes("strudel hide-header"),[o]),W=t.useMemo(()=>o&&o.includes("strudel hide-console"),[o]),p=G({onDraw:L,onEvent:t.useCallback((g,n,te)=>{try{c?.(n),n.context.logs?.length&&n.context.logs.forEach(M);const{onTrigger:q,velocity:re}=n.context;if(q)q(g,n,te,1);else if(a){const ae=ie.getPlayableNoteValue(n);a.triggerAttackRelease(ae,n.duration.valueOf(),g,re)}else throw new Error("no defaultSynth passed to useRepl.")}catch(q){console.warn(q),q.message="unplayable event: "+q?.message,M(q.message)}},[c,M,a]),onQuery:t.useCallback(g=>{try{return _?.query(g)||[]}catch(n){return console.warn(n),n.message="query error: "+n.message,y(n),[]}},[_]),onSchedule:t.useCallback((g,n)=>ee(g),[]),ready:!!_&&!!o}),j=X(({data:{from:g,type:n}})=>{n==="start"&&g!==l&&(p.setStarted(!1),r(void 0))}),B=t.useCallback(async(g=i)=>{if(o&&!E){y(void 0),p.start();return}try{w(!0);const n=await U.evaluate(g);p.start(),j({type:"start",from:l}),R(()=>n.pattern),s&&(window.location.hash="#"+encodeURIComponent(btoa(i))),F(he(i)),y(void 0),r(g),w(!1)}catch(n){n.message="evaluation error: "+n.message,console.warn(n),y(n)}},[o,E,i,p,s,l,j]),ee=(g,n)=>{g.length};return{hideHeader:P,hideConsole:W,pending:h,code:i,setCode:f,pattern:_,error:v,cycle:p,setPattern:R,dirty:E,log:b,togglePlay:()=>{p.started?p.stop():B()},setActiveCode:r,activateCode:B,activeCode:o,pushLog:M,hash:N}}function O(...e){return e.filter(Boolean).join(" ")}let x=[],I;function Z({view:e,pattern:a,active:s}){t.useEffect(()=>{if(e)if(a&&s){let d=function(){try{const l=k.Tone.getTransport().seconds,f=[Math.max(I||l,l-1/10),l+1/60];I=l+1/60,x=x.filter(r=>r.whole.end>l);const o=a.queryArc(...f).filter(r=>r.hasOnset());x=x.concat(o),e.dispatch({effects:A.of(x)})}catch{e.dispatch({effects:A.of([])})}c=requestAnimationFrame(d)},c=requestAnimationFrame(d);return()=>{cancelAnimationFrame(c)}}else x=[],e.dispatch({effects:A.of([])})},[a,s,e])}const pe="_container_3i85k_1",be="_header_3i85k_5",ve="_buttons_3i85k_9",ye="_button_3i85k_9",we="_buttonDisabled_3i85k_17",Ee="_error_3i85k_21",Me="_body_3i85k_25";var D={container:pe,header:be,buttons:ve,button:ye,buttonDisabled:we,error:Ee,body:Me};function K({type:e}){return m.default.createElement("svg",{xmlns:"http://www.w3.org/2000/svg",className:"sc-h-5 sc-w-5",viewBox:"0 0 20 20",fill:"currentColor"},{refresh:m.default.createElement("path",{fillRule:"evenodd",d:"M4 2a1 1 0 011 1v2.101a7.002 7.002 0 0111.601 2.566 1 1 0 11-1.885.666A5.002 5.002 0 005.999 7H9a1 1 0 010 2H4a1 1 0 01-1-1V3a1 1 0 011-1zm.008 9.057a1 1 0 011.276.61A5.002 5.002 0 0014.001 13H11a1 1 0 110-2h5a1 1 0 011 1v5a1 1 0 11-2 0v-2.101a7.002 7.002 0 01-11.601-2.566 1 1 0 01.61-1.276z",clipRule:"evenodd"}),play:m.default.createElement("path",{fillRule:"evenodd",d:"M10 18a8 8 0 100-16 8 8 0 000 16zM9.555 7.168A1 1 0 008 8v4a1 1 0 001.555.832l3-2a1 1 0 000-1.664l-3-2z",clipRule:"evenodd"}),pause:m.default.createElement("path",{fillRule:"evenodd",d:"M18 10a8 8 0 11-16 0 8 8 0 0116 0zM7 8a1 1 0 012 0v4a1 1 0 11-2 0V8zm5-1a1 1 0 00-1 1v4a1 1 0 102 0V8a1 1 0 00-1-1z",clipRule:"evenodd"})}[e])}function Ce({tune:e,defaultSynth:a,hideOutsideView:s=!1,theme:c,init:d,onEvent:l,enableKeyboard:i}){const{code:f,setCode:o,pattern:r,activeCode:b,activateCode:C,evaluateOnly:v,error:y,cycle:h,dirty:w,togglePlay:N,stop:F}=Y({tune:e,defaultSynth:a,autolink:!1,onEvent:l});t.useEffect(()=>{d&&v()},[e,d]);const[_,R]=t.useState(),[E,M]=ce.useInView({threshold:.01}),L=t.useRef(),P=t.useMemo(()=>((M||!s)&&(L.current=!0),M||L.current),[M,s]);return Z({view:_,pattern:r,active:h.started&&!b?.includes("strudel disable-highlighting")}),t.useLayoutEffect(()=>{if(i){const W=async p=>{(p.ctrlKey||p.altKey)&&(p.code==="Enter"?(p.preventDefault(),Q(_),await C()):p.code==="Period"&&(h.stop(),p.preventDefault()))};return window.addEventListener("keydown",W,!0),()=>window.removeEventListener("keydown",W,!0)}},[i,r,f,C,h,_]),m.default.createElement("div",{className:D.container,ref:E},m.default.createElement("div",{className:D.header},m.default.createElement("div",{className:D.buttons},m.default.createElement("button",{className:O(D.button,h.started?"sc-animate-pulse":""),onClick:()=>N()},m.default.createElement(K,{type:h.started?"pause":"play"})),m.default.createElement("button",{className:O(w?D.button:D.buttonDisabled),onClick:()=>C()},m.default.createElement(K,{type:"refresh"}))),y&&m.default.createElement("div",{className:D.error},y.message)),m.default.createElement("div",{className:D.body},P&&m.default.createElement(J,{value:f,onChange:o,onViewChanged:R})))}function ke({defaultOutput:e,interval:a,getTime:s,code:c,evalOnMount:d=!0}){const[l,i]=t.useState(),[f,o]=t.useState(),[r,b]=t.useState(c),C=c!==r,v=t.useMemo(()=>new V.Scheduler({interval:a,onTrigger:e,onError:i,getTime:s}),[e,a]),y=t.useCallback(async()=>{if(!c){console.log("no code..");return}try{const{pattern:w}=await U.evaluate(c);b(c),v?.setPattern(w),o()}catch(w){o(w),console.warn("eval error",w)}},[c,v]),h=t.useRef();return t.useEffect(()=>{!h.current&&d&&(h.current=!0,y())},[y,d]),{schedulerError:l,scheduler:v,evalError:f,evaluate:y,activeCode:r,isDirty:C}}const _e=e=>t.useLayoutEffect(()=>(window.addEventListener("keydown",e,!0),()=>window.removeEventListener("keydown",e,!0)),[e]);function Te(e){const{ready:a,connected:s,disconnected:c}=e,[d,l]=t.useState(!0),[i,f]=t.useState(T.WebMidi?.outputs||[]);return t.useEffect(()=>{T.enableWebMidi().then(()=>{T.WebMidi.addListener("connected",r=>{f([...T.WebMidi.outputs]),s?.(T.WebMidi,r)}),T.WebMidi.addListener("disconnected",r=>{f([...T.WebMidi.outputs]),c?.(T.WebMidi,r)}),a?.(T.WebMidi),l(!1)}).catch(r=>{if(r){console.error(r),console.warn("Web Midi could not be enabled..");return}})},[a,s,c,i]),{loading:d,outputs:i,outputByName:r=>T.WebMidi.getOutputByName(r)}}exports.CodeMirror=J;exports.MiniRepl=Ce;exports.cx=O;exports.flash=Q;exports.useCycle=G;exports.useHighlighting=Z;exports.useKeydown=_e;exports.usePostMessage=X;exports.useRepl=Y;exports.useStrudel=ke;exports.useWebMidi=Te;