{"modules":{"0.3304762484903":{"definition":"//\n// set object\n//\n// Neil Gershenfeld\n// (c) Massachusetts Institute of Technology 2016\n//\n// This work may be reproduced, modified, distributed, performed, and\n// displayed for any purpose, but must acknowledge the mods\n// project. Copyright is retained and must be preserved. The work is\n// provided as is; no warranty is provided, and users accept all\n// liability.\n//\n// closure\n//\n(function(){\n//\n// module globals\n//\nvar mod = {}\n//\n// name\n//\nvar name = 'set function'\n//\n// initialization\n//\nvar init = function() {\n add_outputs(7,2)\n var s = 0\n var v = 0\n mod.labels[s].nodeValue = 'on'\n mod.texts[s][v].nodeValue = 'arguments'\n mod.inputs[s][v].value = 'x,y,w,h,m'\n v += 1\n mod.texts[s][v].nodeValue = 'function'\n mod.inputs[s][v].value = '\\\nvar r = m;\\\nvar g = m;\\\nvar b = m;\\\nvar a = m;\\\nreturn [r,g,b,a]'\n s += 1\n var v = 0\n mod.labels[s].nodeValue = 'off'\n mod.texts[s][v].nodeValue = 'arguments'\n mod.inputs[s][v].value = 'x,y,w,h,m'\n v += 1\n mod.texts[s][v].nodeValue = 'function'\n mod.inputs[s][v].value = '\\\nvar r = 0;\\\nvar g = 0;\\\nvar b = 0;\\\nvar a = m;\\\nreturn [r,g,b,a]'\n s += 1\n var v = 0\n mod.labels[s].nodeValue = 'red'\n mod.texts[s][v].nodeValue = 'arguments'\n mod.inputs[s][v].value = 'x,y,w,h,m'\n v += 1\n mod.texts[s][v].nodeValue = 'function'\n mod.inputs[s][v].value = '\\\nvar r = m;\\\nvar g = 0;\\\nvar b = 0;\\\nvar a = m;\\\nreturn [r,g,b,a]'\n s += 1\n var v = 0\n mod.labels[s].nodeValue = 'green'\n mod.texts[s][v].nodeValue = 'arguments'\n mod.inputs[s][v].value = 'x,y,w,h,m'\n v += 1\n mod.texts[s][v].nodeValue = 'function'\n mod.inputs[s][v].value = '\\\nvar r = 0;\\\nvar g = m;\\\nvar b = 0;\\\nvar a = m;\\\nreturn [r,g,b,a]'\n s += 1\n var v = 0\n mod.labels[s].nodeValue = 'blue'\n mod.texts[s][v].nodeValue = 'arguments'\n mod.inputs[s][v].value = 'x,y,w,h,m'\n v += 1\n mod.texts[s][v].nodeValue = 'function'\n mod.inputs[s][v].value = '\\\nvar r = 0;\\\nvar g = 0;\\\nvar b = m;\\\nvar a = m;\\\nreturn [r,g,b,a]'\n s += 1\n var v = 0\n mod.labels[s].nodeValue = 'horizontal ramp'\n mod.texts[s][v].nodeValue = 'arguments'\n mod.inputs[s][v].value = 'x,y,w,h,m'\n v += 1\n mod.texts[s][v].nodeValue = 'function'\n mod.inputs[s][v].value = '\\\nvar r = m*x/w;\\\nvar g = m*x/w;\\\nvar b = m*x/w;\\\nvar a = m;\\\nreturn [r,g,b,a]'\n s += 1\n v = 0\n mod.labels[s].nodeValue = 'vertical ramp'\n mod.texts[s][v].nodeValue = 'arguments'\n mod.inputs[s][v].value = 'x,y,w,h,m'\n v += 1\n mod.texts[s][v].nodeValue = 'function'\n mod.inputs[s][v].value = '\\\nvar r = m*y/h;\\\nvar g = m*y/h;\\\nvar b = m*y/h;\\\nvar a = m;\\\nreturn [r,g,b,a]'\n }\n//\n// inputs\n//\nvar inputs = {}\n//\n// outputs\n//\nvar outputs = {\n settings:{type:'object',\n event:function(){\n mods.output(mod,'settings',mod.output)\n }\n }\n }\n//\n// interface\n//\nvar interface = function(div){\n mod.div = div\n }\n//\n// local functions\n//\nfunction add_outputs(settings,variables) {\n mod.labels = []\n mod.spans = []\n mod.texts = []\n mod.inputs = []\n for (var s = 0; s < settings; ++s) {\n var texts = []\n var inputs = []\n var btn = document.createElement('button')\n btn.style.padding = mods.ui.padding\n btn.style.margin = 1\n var span = document.createElement('span')\n var text = document.createTextNode('')\n mod.labels.push(text)\n span.appendChild(text)\n mod.spans.push(span)\n btn.appendChild(span)\n var f = function(s) { // nest function to pass s to event listener\n btn.addEventListener('click',function() {\n mod.output = {}\n for (var v = 0; v < mod.texts[s].length; ++v)\n mod.output[mod.texts[s][v].nodeValue] = mod.inputs[s][v].value\n outputs.settings.event()\n for (var i = 0; i < mod.spans.length; ++i)\n mod.spans[i].style.fontWeight = 'normal'\n mod.spans[s].style.fontWeight = 'bold'\n })\n }(s)\n mod.div.appendChild(btn)\n mod.div.appendChild(document.createElement('br'))\n for (var v = 0; v < variables; ++v) {\n var text = document.createTextNode('')\n texts.push(text)\n mod.div.appendChild(text)\n mod.div.appendChild(document.createTextNode(': '))\n input = document.createElement('input')\n input.type = 'text'\n input.size = 10\n inputs.push(input)\n mod.div.appendChild(input)\n mod.div.appendChild(document.createElement('br'))\n }\n mod.texts.push(texts)\n mod.inputs.push(inputs)\n }\n }\n//\n// return values\n//\nreturn ({\n mod:mod,\n name:name,\n init:init,\n inputs:inputs,\n outputs:outputs,\n interface:interface\n })\n}())\n","top":"82","left":"148","inputs":{},"outputs":{}},"0.8284109150996789":{"definition":"//\n// image function\n//\n// Neil Gershenfeld\n// (c) Massachusetts Institute of Technology 2015,6\n//\n// This work may be reproduced, modified, distributed, performed, and\n// displayed for any purpose, but must acknowledge the mods\n// project. Copyright is retained and must be preserved. The work is\n// provided as is; no warranty is provided, and users accept all\n// liability.\n//\n// closure\n//\n(function(){\n//\n// module globals\n//\nvar mod = {}\n//\n// name\n//\nvar name = 'image function'\n//\n// initialization\n//\nvar init = function() {\n mod.width.value = 1000\n mod.height.value = 1000\n mod.win = null\n }\n//\n// inputs\n//\nvar inputs = {\n function:{type:'object',\n event:function(evt){\n mod.input = evt.detail\n /*\n mod.input.arguments = 'x,y,w,h,m'\n mod.input.function = '\\\n var r = m*x/w;\\\n var g = m*y/h;\\\n var b = m*x/w+y/h;\\\n var a = m;\\\n return [r,g,b,a]'\n */\n var ctx = mod.img.getContext(\"2d\")\n ctx.canvas.width = parseInt(mod.width.value)\n ctx.canvas.height = parseInt(mod.height.value)\n image_function()\n }}}\n//\n// outputs\n//\nvar outputs = {\n image:{type:'RGBA',\n event:function(){\n var ctx = mod.img.getContext(\"2d\")\n var img = ctx.getImageData(0,0,mod.img.width,mod.img.height)\n mods.output(mod,'image',img)}}}\n//\n// interface\n//\nvar interface = function(div){\n mod.div = div\n //\n // on-screen drawing canvas\n //\n var canvas = document.createElement('canvas')\n canvas.width = mods.ui.canvas\n canvas.height = mods.ui.canvas\n canvas.style.backgroundColor = 'rgb(255,255,255)'\n div.appendChild(canvas)\n mod.canvas = canvas\n div.appendChild(document.createElement('br'))\n //\n // off-screen image canvas\n //\n var canvas = document.createElement('canvas')\n mod.img = canvas\n //\n // width\n //\n div.appendChild(document.createTextNode('width: '))\n var input = document.createElement('input')\n input.type = 'text'\n input.size = 6\n div.appendChild(input)\n mod.width = input\n div.appendChild(document.createElement('br'))\n //\n // height\n //\n div.appendChild(document.createTextNode('height: '))\n var input = document.createElement('input')\n input.type = 'text'\n input.size = 6\n div.appendChild(input)\n mod.height = input\n div.appendChild(document.createElement('br'))\n //\n // view button\n //\n var btn = document.createElement('button')\n btn.style.padding = mods.ui.padding\n btn.style.margin = 1\n btn.appendChild(document.createTextNode('view'))\n btn.addEventListener('click',function(){\n mod.win = window.open('')\n mod.win.document.body.style.overflow = 'hidden'\n mod.win.document.body.style.border = 0\n mod.win.document.body.style.padding = 0\n mod.win.document.body.style.margin = 0\n mod.win.addEventListener('unload',function() {\n mod.win = null\n })\n var canvas = document.createElement('canvas')\n canvas.width = mod.img.width\n canvas.height = mod.img.height\n canvas.setAttribute('id',mod.div.id+'canvas')\n mod.win.document.body.appendChild(canvas)\n var ctx = canvas.getContext(\"2d\")\n ctx.drawImage(mod.img,0,0)\n })\n div.appendChild(btn)\n }\n//\n// local functions\n//\n// image_function\n//\nfunction image_function() {\n var blob = new Blob(['('+worker.toString()+'())'])\n var url = window.URL.createObjectURL(blob)\n var webworker = new Worker(url)\n webworker.addEventListener('message',function(evt) {\n window.URL.revokeObjectURL(url)\n var h = mod.img.height\n var w = mod.img.width\n var buf = new Uint8ClampedArray(evt.data.buffer)\n var imgdata = new ImageData(buf,w,h)\n var ctx = mod.img.getContext(\"2d\")\n ctx.putImageData(imgdata,0,0)\n if (w > h) {\n var x0 = 0\n var y0 = mod.canvas.height*.5*(1-h/w)\n var wd = mod.canvas.width\n var hd = mod.canvas.width*h/w\n }\n else {\n var x0 = mod.canvas.width*.5*(1-w/h)\n var y0 = 0\n var wd = mod.canvas.height*w/h\n var hd = mod.canvas.height\n }\n var ctx = mod.canvas.getContext(\"2d\")\n ctx.clearRect(0,0,mod.canvas.width,mod.canvas.height)\n ctx.drawImage(mod.img,x0,y0,wd,hd)\n if (mod.win != null) {\n var canvas = mod.win.document.getElementById(mod.div.id+'canvas')\n canvas.width = mod.img.width\n canvas.height = mod.img.height\n var ctx = canvas.getContext(\"2d\")\n ctx.clearRect(0,0,mod.img.width,mod.img.height)\n ctx.drawImage(mod.img,0,0)\n }\n webworker.terminate()\n outputs.image.event()\n })\n var ctx = mod.canvas.getContext(\"2d\")\n ctx.clearRect(0,0,mod.canvas.width,mod.canvas.height)\n var ctx = mod.img.getContext(\"2d\")\n ctx.clearRect(0,0,mod.img.width,mod.img.height)\n var img = ctx.getImageData(0,0,mod.img.width,mod.img.height)\n webworker.postMessage({\n height:img.height,width:img.width,\n args:mod.input.arguments,func:mod.input.function,\n buffer:img.data.buffer},\n [img.data.buffer])\n }\n//\n// worker\n//\nfunction worker() {\n self.addEventListener('message',function(evt) {\n var h = evt.data.height\n var w = evt.data.width\n var m = 255\n var f = new Function(evt.data.args,evt.data.func)\n var buf = new Uint8ClampedArray(evt.data.buffer)\n var r,g,b,a,i\n for (var row = 0; row < h; ++row) {\n for (var col = 0; col < w; ++col) {\n buf[(h-1-row)*w*4+col*4+0] = f(col,row,w,h,m)[0]\n buf[(h-1-row)*w*4+col*4+1] = f(col,row,w,h,m)[1]\n buf[(h-1-row)*w*4+col*4+2] = f(col,row,w,h,m)[2]\n buf[(h-1-row)*w*4+col*4+3] = f(col,row,w,h,m)[3]\n }\n }\n self.postMessage({buffer:buf.buffer},[buf.buffer])\n })\n }\n//\n// return values\n//\nreturn ({\n mod:mod,\n name:name,\n init:init,\n inputs:inputs,\n outputs:outputs,\n interface:interface\n })\n}())\n","top":"78","left":"919","inputs":{},"outputs":{}},"0.560070371517285":{"definition":"//\n// UDP server module\n//\n// Neil Gershenfeld\n// (c) Massachusetts Institute of Technology 2016\n//\n// This work may be reproduced, modified, distributed, performed, and\n// displayed for any purpose, but must acknowledge the mods\n// project. Copyright is retained and must be preserved. The work is\n// provided as is; no warranty is provided, and users accept all\n// liability.\n//\n// closure\n//\n(function(){\n//\n// module globals\n//\nvar mod = {}\n//\n// name\n//\nvar name = 'WebSocket UDP'\n//\n// initialization\n//\nvar init = function() {\n mod.address.value = '127.0.0.1'\n mod.port.value = '1234'\n mod.localport.value = '2345'\n mod.remotehost.value = '127.0.0.1'\n mod.remoteport.value = '3456'\n mod.socket = null\n socket_open()\n }\n//\n// inputs\n//\nvar inputs = {\n transmit:{type:'string',\n event:function(evt){\n send_string(evt.detail)\n }}}\n//\n// outputs\n//\nvar outputs = {\n receive:{type:'string',\n event:function(str){\n mods.output(mod,'receive',str)}}}\n//\n\n//\n// interface\n//\nvar interface = function(div){\n mod.div = div\n //\n // server\n //\n div.appendChild(document.createTextNode('udpserver:'))\n div.appendChild(document.createElement('br'))\n //\n // open/close\n //\n var btn = document.createElement('button')\n btn.style.margin = 1\n btn.appendChild(document.createTextNode('open'))\n btn.addEventListener('click',function() {\n socket_open()\n })\n div.appendChild(btn)\n var btn = document.createElement('button')\n btn.style.margin = 1\n btn.appendChild(document.createTextNode('close'))\n btn.addEventListener('click',function() {\n socket_close()\n })\n div.appendChild(btn)\n div.appendChild(document.createElement('br'))\n //\n // address\n //\n div.appendChild(document.createTextNode('address: '))\n input = document.createElement('input')\n input.type = 'text'\n input.size = 10\n div.appendChild(input)\n mod.address = input\n div.appendChild(document.createElement('br'))\n //\n // port\n //\n div.appendChild(document.createTextNode('\\u00a0\\u00a0\\u00a0\\u00a0\\u00a0port: '))\n input = document.createElement('input')\n input.type = 'text'\n input.size = 10\n div.appendChild(input)\n mod.port = input\n div.appendChild(document.createElement('br'))\n //\n // status\n //\n div.appendChild(document.createTextNode('\\u00a0\\u00a0status: '))\n input = document.createElement('input')\n input.type = 'text'\n input.size = 10\n div.appendChild(input)\n mod.status = input\n div.appendChild(document.createElement('br'))\n //\n // local\n //\n div.appendChild(document.createTextNode('local UDP:'))\n div.appendChild(document.createElement('br'))\n //\n // host\n //\n div.appendChild(document.createTextNode('\\u00a0\\u00a0\\u00a0\\u00a0\\u00a0host: '))\n var input = document.createElement('input')\n input.type = 'text'\n input.size = 10\n div.appendChild(input)\n mod.localhost = input\n div.appendChild(document.createElement('br'))\n //\n // port\n //\n div.appendChild(document.createTextNode('\\u00a0\\u00a0\\u00a0\\u00a0\\u00a0port: '))\n var input = document.createElement('input')\n input.type = 'text'\n input.size = 10\n div.appendChild(input)\n mod.localport = input\n div.appendChild(document.createElement('br'))\n //\n // remote\n //\n div.appendChild(document.createTextNode('remote UDP:'))\n div.appendChild(document.createElement('br'))\n //\n // host\n //\n div.appendChild(document.createTextNode('\\u00a0\\u00a0\\u00a0\\u00a0\\u00a0host: '))\n var input = document.createElement('input')\n input.type = 'text'\n input.size = 10\n div.appendChild(input)\n mod.remotehost = input\n div.appendChild(document.createElement('br'))\n //\n // port\n //\n div.appendChild(document.createTextNode('\\u00a0\\u00a0\\u00a0\\u00a0\\u00a0port: '))\n var input = document.createElement('input')\n input.type = 'text'\n input.size = 10\n div.appendChild(input)\n mod.remoteport = input\n }\n//\n// local functions\n//\nfunction socket_open() {\n var url = \"ws://\"+mod.address.value+':'+mod.port.value\n mod.socket = new WebSocket(url)\n mod.socket.onopen = function(event) {\n mod.status.value = \"socket opened\"\n open_local()\n }\n mod.socket.onerror = function(event) {\n mod.status.value = \"can not open\"\n mod.socket = null\n }\n mod.socket.onmessage = function(event) {\n var msg = JSON.parse(event.data)\n if (msg.type == 'status')\n mod.status.value = msg.status\n else if (msg.type == 'listening') {\n mod.status.value = msg.status\n mod.localhost.value = msg.addresses\n }\n else if (msg.type == 'message') {\n outputs.receive.event(msg.message)\n mod.status.value = 'receive '+JSON.stringify(msg.info)\n }\n }\n }\nfunction socket_close() {\n mod.socket.close()\n mod.status.value = \"socket closed\"\n mod.socket = null\n }\nfunction socket_send(msg) {\n if (mod.socket != null) {\n mod.status.value = \"send\"\n mod.socket.send(msg)\n }\n else {\n mod.status.value = \"can't send, not open\"\n }\n }\nfunction open_local() {\n if (mod.socket == null) {\n mod.status.value = \"socket not open\"\n }\n else {\n var msg = {}\n msg.type = 'open local'\n msg.port = parseInt(mod.localport.value)\n mod.socket.send(JSON.stringify(msg))\n }\n }\nfunction send_string(str) {\n if (mod.socket == null) {\n mod.status.value = \"socket not open\"\n }\n else {\n var msg = {}\n msg.type = 'send string'\n msg.host = mod.remotehost.value\n msg.port = parseInt(mod.remoteport.value)\n msg.string = str\n mod.socket.send(JSON.stringify(msg))\n mod.status.value = 'transmit'\n }\n }\n//\n// return values\n//\nreturn ({\n mod:mod,\n name:name,\n init:init,\n inputs:inputs,\n outputs:outputs,\n interface:interface\n })\n}())\n","top":"540","left":"594","inputs":{},"outputs":{}},"0.8112944303863756":{"definition":"//\n// object string\n//\n// Neil Gershenfeld\n// (c) Massachusetts Institute of Technology 2016\n//\n// This work may be reproduced, modified, distributed, performed, and\n// displayed for any purpose, but must acknowledge the mods\n// project. Copyright is retained and must be preserved. The work is\n// provided as is; no warranty is provided, and users accept all\n// liability.\n//\n// closure\n//\n(function(){\n//\n// module globals\n//\nvar mod = {}\n//\n// name\n//\nvar name = 'object string'\n//\n// initialization\n//\nvar init = function() {\n }\n//\n// inputs\n//\nvar inputs = {\n object:{type:'Object',\n event:function(evt){\n outputs.object.event(evt.detail)\n outputs.string.event(JSON.stringify(evt.detail))\n }},\n string:{type:'JSON',\n event:function(evt){\n outputs.object.event(JSON.parse(evt.detail))\n outputs.string.event(evt.detail)\n }}}\n//\n// outputs\n//\nvar outputs = {\n object:{type:'Object',\n event:function(obj){\n mods.output(mod,'object',obj)\n }},\n string:{type:'JSON',\n event:function(str){\n mods.output(mod,'string',str)\n }}}\n//\n// interface\n//\nvar interface = function(div){\n mod.div = div\n }\n//\n// local functions\n//\n// return values\n//\nreturn ({\n mod:mod,\n name:name,\n init:init,\n inputs:inputs,\n outputs:outputs,\n interface:interface\n })\n}())\n","top":"276","left":"534","inputs":{},"outputs":{}},"0.13448478686200804":{"definition":"//\n// image function\n//\n// Neil Gershenfeld\n// (c) Massachusetts Institute of Technology 2015,6\n//\n// This work may be reproduced, modified, distributed, performed, and\n// displayed for any purpose, but must acknowledge the mods\n// project. Copyright is retained and must be preserved. The work is\n// provided as is; no warranty is provided, and users accept all\n// liability.\n//\n// closure\n//\n(function(){\n//\n// module globals\n//\nvar mod = {}\n//\n// name\n//\nvar name = 'image function'\n//\n// initialization\n//\nvar init = function() {\n mod.width.value = 1000\n mod.height.value = 1000\n mod.win = null\n }\n//\n// inputs\n//\nvar inputs = {\n function:{type:'object',\n event:function(evt){\n mod.input = evt.detail\n /*\n mod.input.arguments = 'x,y,w,h,m'\n mod.input.function = '\\\n var r = m*x/w;\\\n var g = m*y/h;\\\n var b = m*x/w+y/h;\\\n var a = m;\\\n return [r,g,b,a]'\n */\n var ctx = mod.img.getContext(\"2d\")\n ctx.canvas.width = parseInt(mod.width.value)\n ctx.canvas.height = parseInt(mod.height.value)\n image_function()\n }}}\n//\n// outputs\n//\nvar outputs = {\n image:{type:'RGBA',\n event:function(){\n var ctx = mod.img.getContext(\"2d\")\n var img = ctx.getImageData(0,0,mod.img.width,mod.img.height)\n mods.output(mod,'image',img)}}}\n//\n// interface\n//\nvar interface = function(div){\n mod.div = div\n //\n // on-screen drawing canvas\n //\n var canvas = document.createElement('canvas')\n canvas.width = mods.ui.canvas\n canvas.height = mods.ui.canvas\n canvas.style.backgroundColor = 'rgb(255,255,255)'\n div.appendChild(canvas)\n mod.canvas = canvas\n div.appendChild(document.createElement('br'))\n //\n // off-screen image canvas\n //\n var canvas = document.createElement('canvas')\n mod.img = canvas\n //\n // width\n //\n div.appendChild(document.createTextNode('width: '))\n var input = document.createElement('input')\n input.type = 'text'\n input.size = 6\n div.appendChild(input)\n mod.width = input\n div.appendChild(document.createElement('br'))\n //\n // height\n //\n div.appendChild(document.createTextNode('height: '))\n var input = document.createElement('input')\n input.type = 'text'\n input.size = 6\n div.appendChild(input)\n mod.height = input\n div.appendChild(document.createElement('br'))\n //\n // view button\n //\n var btn = document.createElement('button')\n btn.style.padding = mods.ui.padding\n btn.style.margin = 1\n btn.appendChild(document.createTextNode('view'))\n btn.addEventListener('click',function(){\n mod.win = window.open('')\n mod.win.document.body.style.overflow = 'hidden'\n mod.win.document.body.style.border = 0\n mod.win.document.body.style.padding = 0\n mod.win.document.body.style.margin = 0\n mod.win.addEventListener('unload',function() {\n mod.win = null\n })\n var canvas = document.createElement('canvas')\n canvas.width = mod.img.width\n canvas.height = mod.img.height\n canvas.setAttribute('id',mod.div.id+'canvas')\n mod.win.document.body.appendChild(canvas)\n var ctx = canvas.getContext(\"2d\")\n ctx.drawImage(mod.img,0,0)\n })\n div.appendChild(btn)\n }\n//\n// local functions\n//\n// image_function\n//\nfunction image_function() {\n var blob = new Blob(['('+worker.toString()+'())'])\n var url = window.URL.createObjectURL(blob)\n var webworker = new Worker(url)\n webworker.addEventListener('message',function(evt) {\n window.URL.revokeObjectURL(url)\n var h = mod.img.height\n var w = mod.img.width\n var buf = new Uint8ClampedArray(evt.data.buffer)\n var imgdata = new ImageData(buf,w,h)\n var ctx = mod.img.getContext(\"2d\")\n ctx.putImageData(imgdata,0,0)\n if (w > h) {\n var x0 = 0\n var y0 = mod.canvas.height*.5*(1-h/w)\n var wd = mod.canvas.width\n var hd = mod.canvas.width*h/w\n }\n else {\n var x0 = mod.canvas.width*.5*(1-w/h)\n var y0 = 0\n var wd = mod.canvas.height*w/h\n var hd = mod.canvas.height\n }\n var ctx = mod.canvas.getContext(\"2d\")\n ctx.clearRect(0,0,mod.canvas.width,mod.canvas.height)\n ctx.drawImage(mod.img,x0,y0,wd,hd)\n if (mod.win != null) {\n var canvas = mod.win.document.getElementById(mod.div.id+'canvas')\n canvas.width = mod.img.width\n canvas.height = mod.img.height\n var ctx = canvas.getContext(\"2d\")\n ctx.clearRect(0,0,mod.img.width,mod.img.height)\n ctx.drawImage(mod.img,0,0)\n }\n webworker.terminate()\n outputs.image.event()\n })\n var ctx = mod.canvas.getContext(\"2d\")\n ctx.clearRect(0,0,mod.canvas.width,mod.canvas.height)\n var ctx = mod.img.getContext(\"2d\")\n ctx.clearRect(0,0,mod.img.width,mod.img.height)\n var img = ctx.getImageData(0,0,mod.img.width,mod.img.height)\n webworker.postMessage({\n height:img.height,width:img.width,\n args:mod.input.arguments,func:mod.input.function,\n buffer:img.data.buffer},\n [img.data.buffer])\n }\n//\n// worker\n//\nfunction worker() {\n self.addEventListener('message',function(evt) {\n var h = evt.data.height\n var w = evt.data.width\n var m = 255\n var f = new Function(evt.data.args,evt.data.func)\n var buf = new Uint8ClampedArray(evt.data.buffer)\n var r,g,b,a,i\n for (var row = 0; row < h; ++row) {\n for (var col = 0; col < w; ++col) {\n buf[(h-1-row)*w*4+col*4+0] = f(col,row,w,h,m)[0]\n buf[(h-1-row)*w*4+col*4+1] = f(col,row,w,h,m)[1]\n buf[(h-1-row)*w*4+col*4+2] = f(col,row,w,h,m)[2]\n buf[(h-1-row)*w*4+col*4+3] = f(col,row,w,h,m)[3]\n }\n }\n self.postMessage({buffer:buf.buffer},[buf.buffer])\n })\n }\n//\n// return values\n//\nreturn ({\n mod:mod,\n name:name,\n init:init,\n inputs:inputs,\n outputs:outputs,\n interface:interface\n })\n}())\n","top":"543","left":"1233","inputs":{},"outputs":{}},"0.9116987849269527":{"definition":"//\n// object string\n//\n// Neil Gershenfeld\n// (c) Massachusetts Institute of Technology 2016\n//\n// This work may be reproduced, modified, distributed, performed, and\n// displayed for any purpose, but must acknowledge the mods\n// project. Copyright is retained and must be preserved. The work is\n// provided as is; no warranty is provided, and users accept all\n// liability.\n//\n// closure\n//\n(function(){\n//\n// module globals\n//\nvar mod = {}\n//\n// name\n//\nvar name = 'object string'\n//\n// initialization\n//\nvar init = function() {\n }\n//\n// inputs\n//\nvar inputs = {\n object:{type:'Object',\n event:function(evt){\n outputs.object.event(evt.detail)\n outputs.string.event(JSON.stringify(evt.detail))\n }},\n string:{type:'JSON',\n event:function(evt){\n outputs.object.event(JSON.parse(evt.detail))\n outputs.string.event(evt.detail)\n }}}\n//\n// outputs\n//\nvar outputs = {\n object:{type:'Object',\n event:function(obj){\n mods.output(mod,'object',obj)\n }},\n string:{type:'JSON',\n event:function(str){\n mods.output(mod,'string',str)\n }}}\n//\n// interface\n//\nvar interface = function(div){\n mod.div = div\n }\n//\n// local functions\n//\n// return values\n//\nreturn ({\n mod:mod,\n name:name,\n init:init,\n inputs:inputs,\n outputs:outputs,\n interface:interface\n })\n}())\n","top":"764","left":"910","inputs":{},"outputs":{}}},"links":["{\"source\":\"{\\\"id\\\":\\\"0.3304762484903\\\",\\\"type\\\":\\\"outputs\\\",\\\"name\\\":\\\"settings\\\"}\",\"dest\":\"{\\\"id\\\":\\\"0.8284109150996789\\\",\\\"type\\\":\\\"inputs\\\",\\\"name\\\":\\\"function\\\"}\"}","{\"source\":\"{\\\"id\\\":\\\"0.3304762484903\\\",\\\"type\\\":\\\"outputs\\\",\\\"name\\\":\\\"settings\\\"}\",\"dest\":\"{\\\"id\\\":\\\"0.8112944303863756\\\",\\\"type\\\":\\\"inputs\\\",\\\"name\\\":\\\"object\\\"}\"}","{\"source\":\"{\\\"id\\\":\\\"0.8112944303863756\\\",\\\"type\\\":\\\"outputs\\\",\\\"name\\\":\\\"string\\\"}\",\"dest\":\"{\\\"id\\\":\\\"0.560070371517285\\\",\\\"type\\\":\\\"inputs\\\",\\\"name\\\":\\\"transmit\\\"}\"}","{\"source\":\"{\\\"id\\\":\\\"0.560070371517285\\\",\\\"type\\\":\\\"outputs\\\",\\\"name\\\":\\\"receive\\\"}\",\"dest\":\"{\\\"id\\\":\\\"0.9116987849269527\\\",\\\"type\\\":\\\"inputs\\\",\\\"name\\\":\\\"string\\\"}\"}","{\"source\":\"{\\\"id\\\":\\\"0.9116987849269527\\\",\\\"type\\\":\\\"outputs\\\",\\\"name\\\":\\\"object\\\"}\",\"dest\":\"{\\\"id\\\":\\\"0.13448478686200804\\\",\\\"type\\\":\\\"inputs\\\",\\\"name\\\":\\\"function\\\"}\"}"]}