{ "source": "JSON", "data": "BLOCK", "version": "0.0.1", "type": "adsr", "language": "javascript", "extension": "webaudio", "help": "ADSR", "label": "ADSR", "color": "50:150:250:150", "group": "Sound", "codes": { "function": "\nEnvelope = function(context, a, d, s, r, g) {\nthis.node = context.createGain()\nthis.context = context;\nthis.node.gain.value = 0;\nthis.a = a / 1000.0;\nthis.d = d / 1000.0;\nthis.s = s / 1000.0;\nthis.r = r / 1000.0;\nthis.g = g;\n}\n\nEnvelope.prototype.play = function(e) {\nvar time = this.context.currentTime;\n// Zero\nthis.node.gain.linearRampToValueAtTime(0, time);\n// Attack time\ntime += this.a;\nthis.node.gain.linearRampToValueAtTime(1, time);\n// Decay time\ntime += this.d;\nthis.node.gain.linearRampToValueAtTime(0.5, time);\n// Sustain time (do nothing)\ntime += this.s;\n// Release time\ntime += this.r;\nthis.node.gain.linearRampToValueAtTime(0, time);\n}\n\nEnvelope.prototype.seta = function(a) {\n this.a = parseFloat(a)/1000.0;\n}\n\nEnvelope.prototype.setd = function(d) {\n this.d = parseFloat(d)/1000.0;\n}\n\nEnvelope.prototype.sets = function(s) {\n this.s = parseFloat(s)/1000.0;\n}\n\nEnvelope.prototype.setr = function(r) {\n this.r = parseFloat(r)/1000.0;\n}\n\nEnvelope.prototype.setg = function(g) {\n this.g = parseFloat(g);\n}\n", "declaration": "\n// block_$id$ = $label$\n\nvar block_$id$_obj = new Envelope(context, $prop[a]$, $prop[d]$, $prop[s]$, $prop[r]$, $prop[g]$);\nvar $port[input]$ = block_$id$_obj.node;\nvar $port[output]$ = block_$id$_obj.node;\n\nvar $port[a]$ = function(value){\n block_$id$_obj.seta(value);\n};\n\nvar $port[d]$ = function(value){\n block_$id$_obj.setd(value);\n};\n\nvar $port[s]$ = function(value){\n block_$id$_obj.sets(value);\n};\n\nvar $port[r]$ = function(value){\n block_$id$_obj.setr(value);\n};\n\nvar $port[g]$ = function(value){\n block_$id$_obj.setg(value);\n};\n\nvar $port[play]$ = function(value){\n if (value != 0) {\n block_$id$_obj.play();\n }\n};\n" }, "properties": [ { "name": "a", "label": "Attack", "type": "Float", "lower": 0, "upper": 10000, "step": 1, "value": 200 }, { "name": "d", "label": "Decay", "type": "Float", "lower": 0, "upper": 10000, "step": 1, "value": 20 }, { "name": "s", "label": "Sustain", "type": "Float", "lower": 0, "upper": 10000, "step": 1, "value": 100 }, { "name": "r", "label": "Release", "type": "Float", "lower": 0, "upper": 10000, "step": 1, "value": 50 }, { "name": "g", "label": "Gain", "type": "Float", "lower": 0, "upper": 10000, "step": 1, "value": 0.8 } ], "ports": [ { "type": "mosaicode_lib_javascript_webaudio.extensions.ports.sound", "label": "Input", "conn_type": "Input", "name": "input" }, { "type": "mosaicode_lib_javascript_webaudio.extensions.ports.float", "label": "Attack", "conn_type": "Input", "name": "a" }, { "type": "mosaicode_lib_javascript_webaudio.extensions.ports.float", "label": "Decay", "conn_type": "Input", "name": "d" }, { "type": "mosaicode_lib_javascript_webaudio.extensions.ports.float", "label": "Sustain", "conn_type": "Input", "name": "s" }, { "type": "mosaicode_lib_javascript_webaudio.extensions.ports.float", "label": "Release", "conn_type": "Input", "name": "r" }, { "type": "mosaicode_lib_javascript_webaudio.extensions.ports.float", "label": "Gain", "conn_type": "Input", "name": "g" }, { "type": "mosaicode_lib_javascript_webaudio.extensions.ports.float", "conn_type": "Input", "label": "Event Play", "name": "play" }, { "type": "mosaicode_lib_javascript_webaudio.extensions.ports.sound", "label": "Output", "conn_type": "Output", "name": "output" } ] }