@blackprint/nodes-multimedia
Version:
Blackprint nodes for multimedia
3 lines • 19.3 kB
JavaScript
/* MIT Licensed */
!async function(e,t){"use strict";var i,u,o,a,r,s,n,d,c,f,l,p,h,m,I,M,E,A,P,g;async function y(e){return"undefined"!=typeof sf&&void 0!==sf.loader?await sf.loader.mjs(e):Promise.all(e.map((e=>import(e))))}if(t.exports&&t.exports!==globalThis&&Object.defineProperty(t.exports,"__esModule",{value:!0}),y.task=function(){return"undefined"!=typeof sf&&void 0!==sf.loader?sf.loader.task:null},!e.Blackprint.Environment.isBrowser)return void console.log("@blackprint/nodes-multimedia is only for browser, nodes will not be registered");await y(["https://cdn.jsdelivr.net/npm/sfmediastream@latest"]);let O=e.Blackprint.loadScope({url:import.meta.url,hasInterface:!0,hasDocs:!0}),S=O.createContext("Multimedia");S.EventSlot={slot:"my-private-event-slot"},S.objLength=function(e){var t=0;for(var i in e)t++;return t};var N=S.fakeDestination=ScarletsMedia.audioContext.createGain();N.gain.value=0,N.connect(ScarletsMedia.audioContext.destination);class v extends O.Interface{init(){var e=this;this.node;e.input.In.on("value",(function({cable:t}){t.value.connect(e.audioInput)})).on("disconnect",(function({cable:t}){t.value.disconnect(e.audioInput)}))}}function C(e){var t=e.node,i=e.effect,u=e.data;for(let r in u){if(r.includes("$"))continue;let s=u[r],n=i[r];void 0!==s?n(s):s=u[r]=n(),s.constructor===Number&&(s=Number(s.toFixed(2))),Object.defineProperty(u,r,{enumerable:!0,get:()=>s,set(e){n(s=e)}});let d={which:r,data:e.data,whenChanged(e){n(s=e)}};var o=r[0].toUpperCase()+r.slice(1),a=t.createPort("input",o,s.constructor);a.on("value",(function({cable:e}){u[r]=e.value,d.default=e.value,n(e.value)})),a.insertComponent(null,"comp-port-input",d)}}S.MediaEffect=v,O.registerNode("Multimedia/Player",((i=class extends O.Node{constructor(e){super(e),this.setInterface("BPIC/Multimedia/Player").title="Media Player"}}).output={AudioNode:AudioNode,Element:HTMLVideoElement,MediaStream:O.Port.StructOf(MediaStream,{Video:{type:MediaStreamTrack,handle:e=>e.getVideoTracks()[0]},Audio:{type:MediaStreamTrack,handle:e=>e.getAudioTracks()[0]}}),Duration:Number},i.input={URL:String,Seek:Number,Play:O.Port.Trigger((function({iface:e}){e.play()})),Pause:O.Port.Trigger((function({iface:e}){e.pause()})),Stop:O.Port.Trigger((function({iface:e}){e.stop()}))},i)),O.registerInterface("BPIC/Multimedia/Player",S.IFace.Player=class extends O.Interface{constructor(e){super(e),this._paused=!0,this.player=document.createElement("video")}init(){let e=this;e.player.crossOrigin="anonymouse",e.player.preload="auto",e.player.autoload=!0,e.node.output.Element=e.player,e.node.output.AudioNode=ScarletsMedia.audioContext.createMediaElementSource(e.player),e.node.output.AudioNode.connect(N),e.player.oncanplay=function(){e.node.output.MediaStream=e.player.captureStream(),e.node.output.Duration=e.player.duration},e.player.onplay=function(){e._paused&&e.player.pause()},e.input.URL.on("value",S.EventSlot,(function({cable:t}){e.player.src=t.value})),e.input.Seek.on("value",S.EventSlot,(function({cable:t}){e.player.currentTime=t.value}))}play(){this._paused=!1,this.player.play()}pause(){this._paused=!0,this.player.pause()}stop(){this._paused=!0,this.player.pause(),this.player.currentTime=0}}),O.Sketch.registerInterface("BPIC/Multimedia/Player",{template:null},S.IFace.Player),O.registerNode("Multimedia/Display/Video",((u=class extends O.Node{constructor(e){super(e),this.setInterface("BPIC/Multimedia/Display/Video").title="Video Visualization"}}).input={MediaStream:MediaStream,VideoTrack:MediaStreamTrack},u)),O.registerInterface("BPIC/Multimedia/Display/Video",S.IFace.Video=class extends O.Interface{constructor(e){super(e),this.stream=null}init(){const{IInput:e,IOutput:t,Input:i,Output:u}=this.ref;var o=this;function a(){0===e.VideoTrack.cables.length&&0===e.MediaStream.cables.length&&(o.videoElement.trigger("pause",void 0,!0),o.videoElement.prop("srcObject",null),o.stream=null)}e.VideoTrack.on("value",S.EventSlot,(function({cable:t}){e.MediaStream.disconnectAll(),o.stream=new MediaStream([t.value]),o._playVideo()})),e.MediaStream.on("value",S.EventSlot,(function({cable:t}){e.VideoTrack.disconnectAll(),o.stream=t.value,o._playVideo()})),e.VideoTrack.on("disconnect",S.EventSlot,a),e.MediaStream.on("disconnect",S.EventSlot,a)}_playVideo(){let e=this._videoElement;for(let t=0;t<e.length;t++){let i=e[t];(i.srcObject!==this.stream||i.paused)&&(i.srcObject=this.stream,i.play().catch((function(){$(i.ownerDocument).once("pointerdown",(e=>i.play()))})))}}get videoElement(){return this._videoElement}set videoElement(e){if(null==e)return this._videoElement=$([]);void 0===e.addClass&&(e=$(e)),this._videoElement=e,e.prop("srcObject",this.stream),this._playVideo()}}),O.registerNode("Multimedia/Audio/Effect/Chorus",((o=class extends O.Node{constructor(e){super(e);let t=this.setInterface("BPIC/Multimedia/Audio/Effect/Chorus");t.title="Chorus",t.description="Multimedia Effect",t.data={mix:.5,rate:0,intensity:.75}}}).input={In:O.Port.ArrayOf(AudioNode)},o.output={Out:AudioNode},o)),O.registerInterface("BPIC/Multimedia/Audio/Effect/Chorus",S.IFace.Chorus=class extends S.MediaEffect{constructor(e){super(e),this.effect=ScarletsMediaEffect.chorus(),this.audioInput=this.effect.input,this.audioOutput=this.effect.output}init(){super.init(),this.node.output.Out=this.audioOutput,C(this)}}),O.Sketch.registerInterface("BPIC/Multimedia/Audio/Effect/Chorus",{template:null},S.IFace.Chorus),O.registerNode("Multimedia/Audio/Effect/ConReverb",((a=class extends O.Node{constructor(e){super(e);let t=this.setInterface("BPIC/Multimedia/Audio/Effect/ConReverb");t.title="ConReverb",t.description="Multimedia Effect",t.data={mix:.5}}imported(){let{Input:e,IInput:t}=this.ref,{iface:i}=this;t.Buffer.on("value",S.EventSlot,(function(t){i.effect.setBuffer(e.Buffer)}))}}).input={In:O.Port.ArrayOf(AudioNode),Buffer:AudioBuffer},a.output={Out:AudioNode},a)),O.registerInterface("BPIC/Multimedia/Audio/Effect/ConReverb",S.IFace.ConReverb=class extends S.MediaEffect{constructor(e){super(e),this.effect=ScarletsMediaEffect.conReverb(),this.audioInput=this.effect.input,this.audioOutput=this.effect.output}init(){super.init(),this.node.output.Out=this.audioOutput,C(this)}}),O.Sketch.registerInterface("BPIC/Multimedia/Audio/Effect/ConReverb",{template:null},S.IFace.ConReverb),O.registerNode("Multimedia/Audio/Effect/CutOff",((r=class extends O.Node{constructor(e){super(e);let t=this.setInterface("BPIC/Multimedia/Audio/Effect/CutOff");t.title="CutOff",t.description="Multimedia Effect",t.data={type:"lowpass",frequency:350,width:1}}}).input={In:O.Port.ArrayOf(AudioNode)},r.output={Out:AudioNode},r)),O.registerInterface("BPIC/Multimedia/Audio/Effect/CutOff",S.IFace.CutOff=class extends S.MediaEffect{constructor(e){super(e),this.effect=ScarletsMediaEffect.cutOff(),this.audioInput=this.effect.input,this.audioOutput=this.effect.output}init(){super.init(),this.node.output.Out=this.audioOutput,C(this)}}),O.Sketch.registerInterface("BPIC/Multimedia/Audio/Effect/CutOff",{template:null},S.IFace.CutOff),O.registerNode("Multimedia/Audio/Effect/Delay",((s=class extends O.Node{constructor(e){super(e);let t=this.setInterface("BPIC/Multimedia/Audio/Effect/Delay");t.title="Delay",t.description="Multimedia Effect",t.data={mix:.5,time:.3,feedback:.5}}}).input={In:O.Port.ArrayOf(AudioNode)},s.output={Out:AudioNode},s)),O.registerInterface("BPIC/Multimedia/Audio/Effect/Delay",S.IFace.Delay=class extends S.MediaEffect{constructor(e){super(e),this.effect=ScarletsMediaEffect.delay(),this.audioInput=this.effect.input,this.audioOutput=this.effect.output}init(){super.init(),this.node.output.Out=this.audioOutput,C(this)}}),O.Sketch.registerInterface("BPIC/Multimedia/Audio/Effect/Delay",{template:null},S.IFace.Delay),O.registerNode("Multimedia/Audio/Effect/Distortion",((n=class extends O.Node{constructor(e){super(e);let t=this.setInterface("BPIC/Multimedia/Audio/Effect/Distortion");t.title="Distortion",t.description="Multimedia Effect",t.data={set:.5}}}).input={In:O.Port.ArrayOf(AudioNode)},n.output={Out:AudioNode},n)),O.registerInterface("BPIC/Multimedia/Audio/Effect/Distortion",S.IFace.Distortion=class extends S.MediaEffect{constructor(e){super(e),this.effect=ScarletsMediaEffect.distortion(),this.audioInput=this.effect.input,this.audioOutput=this.effect.output}init(){super.init(),this.node.output.Out=this.audioOutput,C(this)}}),O.Sketch.registerInterface("BPIC/Multimedia/Audio/Effect/Distortion",{template:null},S.IFace.Distortion),O.registerNode("Multimedia/Audio/Effect/DubDelay",((d=class extends O.Node{constructor(e){super(e);let t=this.setInterface("BPIC/Multimedia/Audio/Effect/DubDelay");t.title="DubDelay",t.description="Multimedia Effect",t.data={mix:.5,time:.7,feedback:.5,cutoff:700}}}).input={In:O.Port.ArrayOf(AudioNode)},d.output={Out:AudioNode},d)),O.registerInterface("BPIC/Multimedia/Audio/Effect/DubDelay",S.IFace.DubDelay=class extends S.MediaEffect{constructor(e){super(e),this.effect=ScarletsMediaEffect.dubDelay(),this.audioInput=this.effect.input,this.audioOutput=this.effect.output}init(){super.init(),this.node.output.Out=this.audioOutput,C(this)}}),O.Sketch.registerInterface("BPIC/Multimedia/Audio/Effect/DubDelay",{template:null},S.IFace.DubDelay),O.registerNode("Multimedia/Audio/Effect/Equalizer",((c=class extends O.Node{constructor(e){super(e);let t=this.setInterface("BPIC/Multimedia/Audio/Effect/Equalizer");t.title="Equalizer",t.description="Multimedia Effect",t.data={frequency:.7,decibel:.5}}}).input={In:O.Port.ArrayOf(AudioNode)},c.output={Out:AudioNode},c)),O.registerInterface("BPIC/Multimedia/Audio/Effect/Equalizer",S.IFace.Equalizer=class extends S.MediaEffect{constructor(e){super(e),this.effect=ScarletsMediaEffect.equalizer(),this.audioInput=this.effect.input,this.audioOutput=this.effect.output}init(){super.init(),this.node.output.Out=this.audioOutput,C(this)}}),O.Sketch.registerInterface("BPIC/Multimedia/Audio/Effect/Equalizer",{template:null},S.IFace.Equalizer),O.registerNode("Multimedia/Audio/Effect/Fade",((f=class extends O.Node{constructor(e){super(e);let t=this.setInterface("BPIC/Multimedia/Audio/Effect/Fade");t.title="Fade",t.description="Multimedia Effect"}}).input={In:O.Port.ArrayOf(AudioNode),Start:O.Port.Trigger((function({iface:e}){let t=e.node,i=t.input;i.FadeIn?e.effect.in(i.Volume,i.Time,t.output.Finish):e.effect.out(i.Volume,i.Time,t.output.Finish)})),FadeIn:Boolean,Volume:Number,Time:Number},f.output={Out:AudioNode,Finish:O.Types.Trigger},f)),O.registerInterface("BPIC/Multimedia/Audio/Effect/Fade",S.IFace.Fade=class extends S.MediaEffect{constructor(e){super(e),this.effect=ScarletsMediaEffect.fade(),this.audioInput=this.effect.input,this.audioOutput=this.effect.output}init(){super.init(),this.node.output.Out=this.audioOutput,C(this)}}),O.Sketch.registerInterface("BPIC/Multimedia/Audio/Effect/Fade",{template:null},S.IFace.Fade),O.registerNode("Multimedia/Audio/Effect/Flanger",((l=class extends O.Node{constructor(e){super(e);let t=this.setInterface("BPIC/Multimedia/Audio/Effect/Flanger");t.title="Flanger",t.description="Multimedia Effect",t.data={mix:.5,time:.45,speed:.2,depth:.1,feedback:1.1}}}).input={In:O.Port.ArrayOf(AudioNode)},l.output={Out:AudioNode},l)),O.registerInterface("BPIC/Multimedia/Audio/Effect/Flanger",S.IFace.Flanger=class extends S.MediaEffect{constructor(e){super(e),this.effect=ScarletsMediaEffect.flanger(),this.audioInput=this.effect.input,this.audioOutput=this.effect.output}init(){super.init(),this.node.output.Out=this.audioOutput,C(this)}}),O.Sketch.registerInterface("BPIC/Multimedia/Audio/Effect/Flanger",{template:null},S.IFace.Flanger),O.registerNode("Multimedia/Audio/Effect/Harmonizer",((p=class extends O.Node{constructor(e){super(e);let t=this.setInterface("BPIC/Multimedia/Audio/Effect/Harmonizer");t.title="Harmonizer",t.description="Multimedia Effect",t.data={pitch:34,slope:.65,width:.15}}}).input={In:O.Port.ArrayOf(AudioNode)},p.output={Out:AudioNode},p)),O.registerInterface("BPIC/Multimedia/Audio/Effect/Harmonizer",S.IFace.Harmonizer=class extends S.MediaEffect{constructor(e){super(e),this.effect=ScarletsMediaEffect.harmonizer(),this.audioInput=this.effect.input,this.audioOutput=this.effect.output}init(){super.init(),this.node.output.Out=this.audioOutput,C(this)}}),O.Sketch.registerInterface("BPIC/Multimedia/Audio/Effect/Harmonizer",{template:null},S.IFace.Harmonizer),O.registerNode("Multimedia/Audio/Effect/Noise",((h=class extends O.Node{constructor(e){super(e);let t=this.setInterface("BPIC/Multimedia/Audio/Effect/Noise");t.title="Noise",t.description="Multimedia Effect"}}).input={In:O.Port.ArrayOf(AudioNode)},h.output={Out:AudioNode},h)),O.registerInterface("BPIC/Multimedia/Audio/Effect/Noise",S.IFace.Noise=class extends S.MediaEffect{constructor(e){super(e),this.effect=ScarletsMediaEffect.noise(),this.audioInput=this.effect.input,this.audioOutput=this.effect.output}init(){super.init(),this.node.output.Out=this.audioOutput,C(this)}}),O.Sketch.registerInterface("BPIC/Multimedia/Audio/Effect/Noise",{template:null},S.IFace.Noise),O.registerNode("Multimedia/Audio/Effect/PingPongDelay",((m=class extends O.Node{constructor(e){super(e);let t=this.setInterface("BPIC/Multimedia/Audio/Effect/PingPongDelay");t.title="PingPongDelay",t.description="Multimedia Effect",t.data={mix:.5,time:.3,feedback:.5}}}).input={In:O.Port.ArrayOf(AudioNode)},m.output={Out:AudioNode},m)),O.registerInterface("BPIC/Multimedia/Audio/Effect/PingPongDelay",S.IFace.PingPongDelay=class extends S.MediaEffect{constructor(e){super(e),this.effect=ScarletsMediaEffect.pingPongDelay(),this.audioInput=this.effect.input,this.audioOutput=this.effect.output}init(){super.init(),this.node.output.Out=this.audioOutput,C(this)}}),O.Sketch.registerInterface("BPIC/Multimedia/Audio/Effect/PingPongDelay",{template:null},S.IFace.PingPongDelay),O.registerNode("Multimedia/Audio/Effect/PitchShift",((I=class extends O.Node{constructor(e){super(e);let t=this.setInterface("BPIC/Multimedia/Audio/Effect/PitchShift");t.title="PitchShift",t.description="Multimedia Effect",t.data={shift:0}}}).input={In:O.Port.ArrayOf(AudioNode)},I.output={Out:AudioNode},I)),O.registerInterface("BPIC/Multimedia/Audio/Effect/PitchShift",S.IFace.PitchShift=class extends S.MediaEffect{constructor(e){super(e),this.effect=ScarletsMediaEffect.pitchShift(),this.audioInput=this.effect.input,this.audioOutput=this.effect.output}init(){super.init(),this.node.output.Out=this.audioOutput,C(this)}}),O.Sketch.registerInterface("BPIC/Multimedia/Audio/Effect/PitchShift",{template:null},S.IFace.PitchShift),O.registerNode("Multimedia/Audio/Effect/Reverb",((M=class extends O.Node{constructor(e){super(e);let t=this.setInterface("BPIC/Multimedia/Audio/Effect/Reverb");t.title="Reverb",t.description="Multimedia Effect",t.data={mix:1,time:1,decay:.1,reverse:!1}}}).input={In:O.Port.ArrayOf(AudioNode)},M.output={Out:AudioNode},M)),O.registerInterface("BPIC/Multimedia/Audio/Effect/Reverb",S.IFace.Reverb=class extends S.MediaEffect{constructor(e){super(e),this.effect=ScarletsMediaEffect.reverb(),this.audioInput=this.effect.input,this.audioOutput=this.effect.output}init(){super.init(),this.node.output.Out=this.audioOutput,C(this)}}),O.Sketch.registerInterface("BPIC/Multimedia/Audio/Effect/Reverb",{template:null},S.IFace.Reverb),O.registerNode("Multimedia/Audio/Effect/StereoPanner",((E=class extends O.Node{constructor(e){super(e);let t=this.setInterface("BPIC/Multimedia/Audio/Effect/StereoPanner");t.title="StereoPanner",t.description="Multimedia Effect",t.data={set:1}}}).input={In:O.Port.ArrayOf(AudioNode)},E.output={Out:AudioNode},E)),O.registerInterface("BPIC/Multimedia/Audio/Effect/StereoPanner",S.IFace.StereoPanner=class extends S.MediaEffect{constructor(e){super(e),this.effect=ScarletsMediaEffect.stereoPanner(),this.audioInput=this.effect.input,this.audioOutput=this.effect.output}init(){super.init(),this.node.output.Out=this.audioOutput,C(this)}}),O.Sketch.registerInterface("BPIC/Multimedia/Audio/Effect/StereoPanner",{template:null},S.IFace.StereoPanner),O.registerNode("Multimedia/Audio/Effect/Tremolo",((A=class extends O.Node{constructor(e){super(e);let t=this.setInterface("BPIC/Multimedia/Audio/Effect/Tremolo");t.title="Tremolo",t.description="Multimedia Effect",t.data={mix:.8,speed:.2,depth:1}}}).input={In:O.Port.ArrayOf(AudioNode)},A.output={Out:AudioNode},A)),O.registerInterface("BPIC/Multimedia/Audio/Effect/Tremolo",S.IFace.Tremolo=class extends S.MediaEffect{constructor(e){super(e),this.effect=ScarletsMediaEffect.tremolo(),this.audioInput=this.effect.input,this.audioOutput=this.effect.output}init(){super.init(),this.node.output.Out=this.audioOutput,C(this)}}),O.Sketch.registerInterface("BPIC/Multimedia/Audio/Effect/Tremolo",{template:null},S.IFace.Tremolo),O.registerNode("Multimedia/Audio/Input/Microphone",((P=class extends O.Node{constructor(e){super(e),this.setInterface("BPIC/Multimedia/Audio/Input/Microphone").title="Microphone"}}).output={Node:AudioNode},P)),O.registerInterface("BPIC/Multimedia/Audio/Input/Microphone",S.IFace.Microphone=class extends O.Interface{constructor(e){super(e),this.selected=0,this.devices=[],this._waitForInit=!1,this.stream=null}init(){let e=this;e._refreshList(),e.output.Node.on("connecting",S.EventSlot,(function({port:t,activate:i}){i(void 0),e.startStream(i)})).on("disconnect",S.EventSlot,(function(){0===e.output.Node.cables.length&&e.stopStream()}))}async _refreshList(){let e=await navigator.mediaDevices.enumerateDevices();for(var t=[],i=new Set,u=0;u<e.length;u++)if("audioinput"===e[u].kind){var o=e[u].groupId;if(o){if(i.has(o))continue;i.add(o)}t.push({i:t.length,label:e[u].label||"Device",device:e[u]})}this.devices=t,this._waitForInit&&this._waitForInit()}select(e){if(this.selected===e)return;let t=this.selected;this.selected=e,this.stopStream();let i=this;i.output.Node.disableCables(!0),this.startStream((function(e){if(!e)return this.selected=t;i.output.Node.disableCables(!1)}))}async startStream(e){var t=this.devices[this.selected].device;if(null!==this.stream)return e(!0);if(0!==this.devices.length)try{this.stream=await navigator.mediaDevices.getUserMedia({audio:t}),this.node.output.Node=ScarletsMedia.audioContext.createMediaStreamSource(this.stream),this._refreshList(),e(!0)}catch(t){throw e(!1),t}else this._waitForInit=function(){this.startStream(e)}}stopStream(){null!==this.stream&&(this.stream.getTracks().forEach((e=>e.stop())),this.stream=null)}}),O.registerNode("Multimedia/Audio/Output/Destination",((g=class extends O.Node{constructor(e){super(e),this.setInterface("BPIC/Multimedia/Audio/Output/Destination").title="Destination"}}).input={In:O.Port.ArrayOf(AudioNode)},g)),O.registerInterface("BPIC/Multimedia/Audio/Output/Destination",S.IFace.Destination=class extends O.Interface{init(){var e=ScarletsMedia.audioContext.destination;let t=this;t.on("cable.connect",S.EventSlot,(function({port:i,cable:u}){i===t.input.In&&u.value.connect(e)})),t.on("cable.disconnect",S.EventSlot,(function({port:i,cable:u}){i===t.input.In&&u.value.disconnect(e)}))}hotReloaded(){this.init()}}),O.Sketch.registerInterface("BPIC/Multimedia/Audio/Output/Destination",{template:null},S.IFace.Destination)}("undefined"!=typeof globalThis?globalThis:"undefined"!=typeof window?window:this,"undefined"!=typeof module?module:{exports:this});
//# sourceMappingURL=nodes-multimedia.mjs.map