// Copyright (c) 2014-16 Walter Bender // // This program is free software; you can redistribute it and/or // modify it under the terms of the The GNU Affero General Public // License as published by the Free Software Foundation; either // version 3 of the License, or (at your option) any later version. // // You should have received a copy of the GNU Affero General Public // License along with this library; if not, write to the Free Software // Foundation, 51 Franklin Street, Suite 500 Boston, MA 02110-1335 USA // Definition of basic blocks common to all branches // Some names changed between the Python verison and the // JS version so look up name in the conversion dictionary. var NAMEDICT = { 'fullscreen': 'vspace', 'fillscreen2': 'fillscreen', 'comment': 'print', 'sandwichclampcollapsed': 'clamp', 'ifelse': 'ifthenelse', 'xcor': 'x', 'ycor': 'y', 'seth': 'setheading', 'remainder2': 'mod', 'plus2': 'plus', 'product2': 'multiply', 'division2': 'divide', 'minus2': 'minus', 'stack': 'do', 'hat': 'action', 'stopstack': 'break', 'clean': 'clear', 'setxy2': 'setxy', 'greater2': 'greater', 'less2': 'less', 'equal2': 'equal', 'random2': 'random', 'setvalue': 'setshade', 'setchroma': 'setgrey', 'setgray': 'setgrey', 'gray': 'grey', 'chroma': 'grey', 'value': 'shade', 'hue': 'color', 'startfill': 'beginfill', 'stopfill': 'endfill', 'string': 'text', 'shell': 'turtleshell' }; // Define blocks here. Note: The blocks are placed on the palettes // from bottom to top, i.e., the block at the top of a palette will be // the last block added to a palette. function initBasicProtoBlocks(palettes, blocks) { blocks.palettes = palettes; // TURTLE PALETTE var headingBlock = new ProtoBlock('heading'); headingBlock.palette = palettes.dict['turtle']; blocks.protoBlockDict['heading'] = headingBlock; headingBlock.staticLabels.push(_('heading')); headingBlock.adjustWidthToLabel(); headingBlock.parameterBlock(); var xBlock = new ProtoBlock('x'); xBlock.palette = palettes.dict['turtle']; blocks.protoBlockDict['x'] = xBlock; xBlock.staticLabels.push(_('x')); xBlock.adjustWidthToLabel(); xBlock.parameterBlock(); var yBlock = new ProtoBlock('y'); yBlock.palette = palettes.dict['turtle']; blocks.protoBlockDict['y'] = yBlock; yBlock.staticLabels.push(_('y')); yBlock.adjustWidthToLabel(); yBlock.parameterBlock(); var clearBlock = new ProtoBlock('clear'); clearBlock.palette = palettes.dict['turtle']; blocks.protoBlockDict['clear'] = clearBlock; clearBlock.staticLabels.push(_('clear')); clearBlock.adjustWidthToLabel(); clearBlock.zeroArgBlock(); var controlPoint2Block = new ProtoBlock('controlpoint2'); controlPoint2Block.palette = palettes.dict['turtle']; blocks.protoBlockDict['controlpoint2'] = controlPoint2Block; controlPoint2Block.staticLabels.push(_('control point 2'), _('x'), _('y')); controlPoint2Block.adjustWidthToLabel(); controlPoint2Block.twoArgBlock(); controlPoint2Block.defaults.push(200); controlPoint2Block.defaults.push(100); controlPoint2Block.dockTypes[1] = 'numberin'; controlPoint2Block.dockTypes[2] = 'numberin'; var controlPoint1Block = new ProtoBlock('controlpoint1'); controlPoint1Block.palette = palettes.dict['turtle']; blocks.protoBlockDict['controlpoint1'] = controlPoint1Block; controlPoint1Block.staticLabels.push(_('control point 1'), _('x'), _('y')); controlPoint1Block.adjustWidthToLabel(); controlPoint1Block.twoArgBlock(); controlPoint1Block.defaults.push(0); controlPoint1Block.defaults.push(100); controlPoint1Block.dockTypes[1] = 'numberin'; controlPoint1Block.dockTypes[2] = 'numberin'; var bezierBlock = new ProtoBlock('bezier'); bezierBlock.palette = palettes.dict['turtle']; blocks.protoBlockDict['bezier'] = bezierBlock; bezierBlock.staticLabels.push(_('bezier'), _('x'), _('y')); bezierBlock.adjustWidthToLabel(); bezierBlock.twoArgBlock(); bezierBlock.defaults.push(200); bezierBlock.defaults.push(0); bezierBlock.dockTypes[1] = 'numberin'; bezierBlock.dockTypes[2] = 'numberin'; var arcBlock = new ProtoBlock('arc'); arcBlock.palette = palettes.dict['turtle']; blocks.protoBlockDict['arc'] = arcBlock; arcBlock.staticLabels.push(_('arc'), _('angle'), _('radius')); arcBlock.adjustWidthToLabel(); arcBlock.twoArgBlock(); arcBlock.defaults.push(90); arcBlock.defaults.push(100); arcBlock.dockTypes[1] = 'numberin'; var setheadingBlock = new ProtoBlock('setheading'); setheadingBlock.palette = palettes.dict['turtle']; blocks.protoBlockDict['setheading'] = setheadingBlock; setheadingBlock.staticLabels.push(_('set heading')); setheadingBlock.adjustWidthToLabel(); setheadingBlock.oneArgBlock(); setheadingBlock.defaults.push(0); var setxyBlock = new ProtoBlock('setxy'); setxyBlock.palette = palettes.dict['turtle']; blocks.protoBlockDict['setxy'] = setxyBlock; setxyBlock.staticLabels.push(_('set xy'), _('x'), _('y')); setxyBlock.adjustWidthToLabel(); setxyBlock.twoArgBlock(); setxyBlock.defaults.push(0); setxyBlock.defaults.push(0); setxyBlock.dockTypes[1] = 'numberin'; var rightBlock = new ProtoBlock('right'); rightBlock.palette = palettes.dict['turtle']; blocks.protoBlockDict['right'] = rightBlock; rightBlock.staticLabels.push(_('right')); rightBlock.adjustWidthToLabel(); rightBlock.oneArgBlock(); rightBlock.defaults.push(90); var leftBlock = new ProtoBlock('left'); leftBlock.palette = palettes.dict['turtle']; blocks.protoBlockDict['left'] = leftBlock; leftBlock.staticLabels.push(_('left')); leftBlock.adjustWidthToLabel(); leftBlock.oneArgBlock(); leftBlock.defaults.push(90); var backBlock = new ProtoBlock('back'); backBlock.palette = palettes.dict['turtle']; blocks.protoBlockDict['back'] = backBlock; backBlock.staticLabels.push(_('back')); backBlock.adjustWidthToLabel(); backBlock.oneArgBlock(); backBlock.defaults.push(100); var forwardBlock = new ProtoBlock('forward'); forwardBlock.palette = palettes.dict['turtle']; blocks.protoBlockDict['forward'] = forwardBlock; forwardBlock.staticLabels.push(_('forward')); forwardBlock.adjustWidthToLabel(); forwardBlock.oneArgBlock(); forwardBlock.defaults.push(100); // PEN PALETTE var beginFillBlock = new ProtoBlock('beginfill'); beginFillBlock.palette = palettes.dict['pen']; blocks.protoBlockDict['beginfill'] = beginFillBlock; beginFillBlock.hidden = true; beginFillBlock.staticLabels.push(_('begin fill')); beginFillBlock.adjustWidthToLabel(); beginFillBlock.zeroArgBlock(); var endFillBlock = new ProtoBlock('endfill'); endFillBlock.palette = palettes.dict['pen']; blocks.protoBlockDict['endfill'] = endFillBlock; endFillBlock.hidden = true; endFillBlock.staticLabels.push(_('end fill')); endFillBlock.adjustWidthToLabel(); endFillBlock.zeroArgBlock(); var fillscreenBlock = new ProtoBlock('fillscreen'); fillscreenBlock.palette = palettes.dict['pen']; blocks.protoBlockDict['fillscreen'] = fillscreenBlock; fillscreenBlock.hidden = true; fillscreenBlock.staticLabels.push(_('background')); fillscreenBlock.adjustWidthToLabel(); fillscreenBlock.threeArgBlock(); var colorBlock = new ProtoBlock('color'); colorBlock.palette = palettes.dict['pen']; blocks.protoBlockDict['color'] = colorBlock; colorBlock.staticLabels.push(_('color')); colorBlock.adjustWidthToLabel(); colorBlock.parameterBlock(); var shadeBlock = new ProtoBlock('shade'); shadeBlock.palette = palettes.dict['pen']; blocks.protoBlockDict['shade'] = shadeBlock; shadeBlock.staticLabels.push(_('shade')); shadeBlock.adjustWidthToLabel(); shadeBlock.parameterBlock(); var chromaBlock = new ProtoBlock('grey'); chromaBlock.palette = palettes.dict['pen']; blocks.protoBlockDict['grey'] = chromaBlock; chromaBlock.staticLabels.push(_('grey')); chromaBlock.adjustWidthToLabel(); chromaBlock.parameterBlock(); var pensizeBlock = new ProtoBlock('pensize'); pensizeBlock.palette = palettes.dict['pen']; blocks.protoBlockDict['pensize'] = pensizeBlock; pensizeBlock.staticLabels.push(_('pen size')); pensizeBlock.adjustWidthToLabel(); pensizeBlock.parameterBlock(); var setfontBlock = new ProtoBlock('setfont'); setfontBlock.palette = palettes.dict['pen']; blocks.protoBlockDict['setfont'] = setfontBlock; setfontBlock.staticLabels.push(_('set font')); setfontBlock.adjustWidthToLabel(); setfontBlock.oneArgBlock(); setfontBlock.defaults.push(DEFAULTFONT); setfontBlock.dockTypes[1] = 'textin'; var backgroundBlock = new ProtoBlock('background'); backgroundBlock.palette = palettes.dict['pen']; blocks.protoBlockDict['background'] = backgroundBlock; backgroundBlock.staticLabels.push(_('background')); backgroundBlock.adjustWidthToLabel(); backgroundBlock.zeroArgBlock(); var hollowBlock = new ProtoBlock('hollowline'); hollowBlock.palette = palettes.dict['pen']; blocks.protoBlockDict['hollowline'] = hollowBlock; hollowBlock.staticLabels.push(_('hollow line')); hollowBlock.adjustWidthToLabel(); hollowBlock.flowClampZeroArgBlock(); var fillBlock = new ProtoBlock('fill'); fillBlock.palette = palettes.dict['pen']; blocks.protoBlockDict['fill'] = fillBlock; fillBlock.staticLabels.push(_('fill')); fillBlock.adjustWidthToLabel(); fillBlock.flowClampZeroArgBlock(); var penupBlock = new ProtoBlock('penup'); penupBlock.palette = palettes.dict['pen']; blocks.protoBlockDict['penup'] = penupBlock; penupBlock.staticLabels.push(_('pen up')); penupBlock.adjustWidthToLabel(); penupBlock.zeroArgBlock(); var pendownBlock = new ProtoBlock('pendown'); pendownBlock.palette = palettes.dict['pen']; blocks.protoBlockDict['pendown'] = pendownBlock; pendownBlock.staticLabels.push(_('pen down')); pendownBlock.adjustWidthToLabel(); pendownBlock.zeroArgBlock(); var setpensizeBlock = new ProtoBlock('setpensize'); setpensizeBlock.palette = palettes.dict['pen']; blocks.protoBlockDict['setpensize'] = setpensizeBlock; setpensizeBlock.staticLabels.push(_('set pen size')); setpensizeBlock.adjustWidthToLabel(); setpensizeBlock.oneArgBlock(); setpensizeBlock.defaults.push(5); var settranslucencyBlock = new ProtoBlock('settranslucency'); settranslucencyBlock.palette = palettes.dict['pen']; blocks.protoBlockDict['settranslucency'] = settranslucencyBlock; settranslucencyBlock.staticLabels.push(_('set translucency')); settranslucencyBlock.adjustWidthToLabel(); settranslucencyBlock.oneArgBlock(); settranslucencyBlock.defaults.push(50); var sethueBlock = new ProtoBlock('sethue'); sethueBlock.palette = palettes.dict['pen']; blocks.protoBlockDict['sethue'] = sethueBlock; sethueBlock.staticLabels.push(_('set hue')); sethueBlock.adjustWidthToLabel(); sethueBlock.oneArgBlock(); sethueBlock.defaults.push(0); var setshadeBlock = new ProtoBlock('setshade'); setshadeBlock.palette = palettes.dict['pen']; blocks.protoBlockDict['setshade'] = setshadeBlock; setshadeBlock.staticLabels.push(_('set shade')); setshadeBlock.adjustWidthToLabel(); setshadeBlock.oneArgBlock(); setshadeBlock.defaults.push(50); var setchromaBlock = new ProtoBlock('setgrey'); setchromaBlock.palette = palettes.dict['pen']; blocks.protoBlockDict['setgrey'] = setchromaBlock; setchromaBlock.staticLabels.push(_('set grey')); setchromaBlock.adjustWidthToLabel(); setchromaBlock.oneArgBlock(); setchromaBlock.defaults.push(100); var setcolorBlock = new ProtoBlock('setcolor'); setcolorBlock.palette = palettes.dict['pen']; blocks.protoBlockDict['setcolor'] = setcolorBlock; setcolorBlock.staticLabels.push(_('set color')); setcolorBlock.adjustWidthToLabel(); setcolorBlock.oneArgBlock(); setcolorBlock.defaults.push(0); // NUMBERS PALETTE var intBlock = new ProtoBlock('int'); intBlock.palette = palettes.dict['number']; blocks.protoBlockDict['int'] = intBlock; intBlock.staticLabels.push(_('int')); intBlock.adjustWidthToLabel(); intBlock.oneArgMathBlock(); intBlock.defaults.push(100) var greaterBlock = new ProtoBlock('greater'); greaterBlock.palette = palettes.dict['boolean']; blocks.protoBlockDict['greater'] = greaterBlock; greaterBlock.fontsize = 14; greaterBlock.staticLabels.push('>'); greaterBlock.extraWidth = 20; greaterBlock.booleanTwoArgBlock(); var lessBlock = new ProtoBlock('less'); lessBlock.palette = palettes.dict['boolean']; blocks.protoBlockDict['less'] = lessBlock; lessBlock.fontsize = 14; lessBlock.staticLabels.push('<'); lessBlock.extraWidth = 20; lessBlock.booleanTwoArgBlock(); var equalBlock = new ProtoBlock('equal'); equalBlock.palette = palettes.dict['boolean']; blocks.protoBlockDict['equal'] = equalBlock; equalBlock.fontsize = 14; equalBlock.staticLabels.push('='); equalBlock.extraWidth = 20; equalBlock.booleanTwoArgBlock(); equalBlock.dockTypes[0] = 'booleanout'; equalBlock.dockTypes[1] = 'anyin'; equalBlock.dockTypes[2] = 'anyin'; var andBlock = new ProtoBlock('and'); andBlock.palette = palettes.dict['boolean']; blocks.protoBlockDict['and'] = andBlock; andBlock.extraWidth = 10; andBlock.staticLabels.push(_('and')); andBlock.booleanTwoBooleanArgBlock(); var orBlock = new ProtoBlock('or'); orBlock.palette = palettes.dict['boolean']; blocks.protoBlockDict['or'] = orBlock; orBlock.extraWidth = 10; orBlock.staticLabels.push(_('or')); orBlock.booleanTwoBooleanArgBlock(); var notBlock = new ProtoBlock('not'); notBlock.palette = palettes.dict['boolean']; blocks.protoBlockDict['not'] = notBlock; notBlock.extraWidth = 30; notBlock.staticLabels.push(_('not')); notBlock.booleanOneBooleanArgBlock(); var modBlock = new ProtoBlock('mod'); modBlock.palette = palettes.dict['number']; blocks.protoBlockDict['mod'] = modBlock; modBlock.staticLabels.push(_('mod')); modBlock.adjustWidthToLabel(); modBlock.twoArgMathBlock(); modBlock.defaults.push(100, 10) var sqrtBlock = new ProtoBlock('sqrt'); sqrtBlock.palette = palettes.dict['number']; blocks.protoBlockDict['sqrt'] = sqrtBlock; sqrtBlock.staticLabels.push(_('sqrt')); sqrtBlock.adjustWidthToLabel(); sqrtBlock.oneArgMathBlock(); sqrtBlock.defaults.push(100) var divideBlock = new ProtoBlock('divide'); divideBlock.palette = palettes.dict['number']; blocks.protoBlockDict['divide'] = divideBlock; divideBlock.fontsize = 14; divideBlock.staticLabels.push('/'); divideBlock.twoArgMathBlock(); divideBlock.defaults.push(100, 10) var powerBlock = new ProtoBlock('power'); powerBlock.palette = palettes.dict['number']; blocks.protoBlockDict['power'] = powerBlock; powerBlock.fontsize = 14; powerBlock.staticLabels.push('^'); powerBlock.twoArgMathBlock(); powerBlock.defaults.push(2,4) var multiplyBlock = new ProtoBlock('multiply'); multiplyBlock.palette = palettes.dict['number']; blocks.protoBlockDict['multiply'] = multiplyBlock; multiplyBlock.fontsize = 14; multiplyBlock.staticLabels.push('×'); multiplyBlock.twoArgMathBlock(); multiplyBlock.defaults.push(10, 10) var negBlock = new ProtoBlock('neg'); negBlock.palette = palettes.dict['number']; blocks.protoBlockDict['neg'] = negBlock; negBlock.fontsize = 14; negBlock.staticLabels.push('–'); negBlock.oneArgMathBlock(); var minusBlock = new ProtoBlock('minus'); minusBlock.palette = palettes.dict['number']; blocks.protoBlockDict['minus'] = minusBlock; minusBlock.fontsize = 14; minusBlock.staticLabels.push('–'); minusBlock.twoArgMathBlock(); minusBlock.defaults.push(100, 50) var plusBlock = new ProtoBlock('plus'); plusBlock.palette = palettes.dict['number']; blocks.protoBlockDict['plus'] = plusBlock; plusBlock.fontsize = 14; plusBlock.staticLabels.push('+'); plusBlock.twoArgMathBlock(); plusBlock.dockTypes[0] = 'anyout'; plusBlock.dockTypes[1] = 'anyin'; plusBlock.dockTypes[2] = 'anyin'; plusBlock.defaults.push(100, 100) var oneOfBlock = new ProtoBlock('oneOf'); oneOfBlock.palette = palettes.dict['number']; blocks.protoBlockDict['oneOf'] = oneOfBlock; oneOfBlock.staticLabels.push(_('one of'), _('this'), _('that')); oneOfBlock.adjustWidthToLabel(); oneOfBlock.twoArgMathBlock(); oneOfBlock.dockTypes[0] = 'anyout'; oneOfBlock.dockTypes[1] = 'anyin'; oneOfBlock.dockTypes[2] = 'anyin'; oneOfBlock.defaults.push(-90, 90); var randomBlock = new ProtoBlock('random'); randomBlock.palette = palettes.dict['number']; blocks.protoBlockDict['random'] = randomBlock; randomBlock.staticLabels.push(_('random'), _('min'), _('max')); randomBlock.adjustWidthToLabel(); randomBlock.twoArgMathBlock(); randomBlock.defaults.push(0, 100); var numberBlock = new ProtoBlock('number'); numberBlock.palette = palettes.dict['number']; blocks.protoBlockDict['number'] = numberBlock; numberBlock.valueBlock(); // BLOCKS PALETTE var incrementOneBlock = new ProtoBlock('incrementOne'); incrementOneBlock.palette = palettes.dict['boxes']; blocks.protoBlockDict['incrementOne'] = incrementOneBlock; incrementOneBlock.staticLabels.push(_('add 1 to')); incrementOneBlock.adjustWidthToLabel(); incrementOneBlock.oneArgBlock(); var incrementBlock = new ProtoBlock('increment'); incrementBlock.palette = palettes.dict['boxes']; blocks.protoBlockDict['increment'] = incrementBlock; incrementBlock.staticLabels.push(_('add'), _('to'), _('value')); incrementBlock.adjustWidthToLabel(); incrementBlock.twoArgBlock(); incrementBlock.dockTypes[1] = 'anyin'; incrementBlock.dockTypes[2] = 'anyin'; var boxBlock = new ProtoBlock('box'); boxBlock.palette = palettes.dict['boxes']; blocks.protoBlockDict['box'] = boxBlock; boxBlock.staticLabels.push(_('box')); boxBlock.extraWidth = 10; boxBlock.adjustWidthToLabel(); boxBlock.oneArgMathBlock(); boxBlock.defaults.push(_('box')); boxBlock.dockTypes[0] = 'anyout'; // Show the value in the box as if it were a parameter. boxBlock.parameter = true; boxBlock.dockTypes[1] = 'anyin'; var storeinBlock = new ProtoBlock('storein'); storeinBlock.palette = palettes.dict['boxes']; blocks.protoBlockDict['storein'] = storeinBlock; storeinBlock.staticLabels.push(_('store in'), _('name'), _('value')); storeinBlock.adjustWidthToLabel(); storeinBlock.twoArgBlock(); storeinBlock.defaults.push(_('box')); storeinBlock.defaults.push(100); storeinBlock.dockTypes[1] = 'anyin'; storeinBlock.dockTypes[2] = 'anyin'; var namedBoxBlock = new ProtoBlock('namedbox'); namedBoxBlock.palette = palettes.dict['boxes']; blocks.protoBlockDict['namedbox'] = namedBoxBlock; namedBoxBlock.staticLabels.push(_('box')); namedBoxBlock.extraWidth = 10; namedBoxBlock.adjustWidthToLabel(); namedBoxBlock.parameterBlock(); namedBoxBlock.dockTypes[0] = 'anyout'; // ACTION PALETTE var doBlock = new ProtoBlock('do'); doBlock.palette = palettes.dict['action']; blocks.protoBlockDict['do'] = doBlock; doBlock.staticLabels.push(_('do')); doBlock.adjustWidthToLabel(); doBlock.oneArgBlock(); doBlock.defaults.push(_('action')); doBlock.dockTypes[1] = 'anyin'; var returnBlock = new ProtoBlock('return'); returnBlock.palette = palettes.dict['action']; blocks.protoBlockDict['return'] = returnBlock; returnBlock.staticLabels.push(_('return')); returnBlock.extraWidth = 10; returnBlock.adjustWidthToLabel(); returnBlock.oneArgBlock(); returnBlock.defaults.push(100); returnBlock.dockTypes[1] = 'anyin'; var returnToUrlBlock = new ProtoBlock('returnToUrl'); returnToUrlBlock.palette = palettes.dict['action']; blocks.protoBlockDict['returnToUrl'] = returnToUrlBlock; returnToUrlBlock.staticLabels.push(_('return to URL')); returnToUrlBlock.extraWidth = 10; returnToUrlBlock.adjustWidthToLabel(); returnToUrlBlock.oneArgBlock(); returnToUrlBlock.defaults.push(_('100')); returnToUrlBlock.dockTypes[1] = 'anyin'; var calcBlock = new ProtoBlock('calc'); calcBlock.palette = palettes.dict['action']; blocks.protoBlockDict['calc'] = calcBlock; calcBlock.staticLabels.push(_('calculate')); calcBlock.adjustWidthToLabel(); calcBlock.oneArgMathBlock(); calcBlock.defaults.push(_('action')); calcBlock.dockTypes[0] = 'anyout'; calcBlock.dockTypes[1] = 'anyin'; var namedCalcBlock = new ProtoBlock('namedcalc'); namedCalcBlock.palette = palettes.dict['action']; blocks.protoBlockDict['namedcalc'] = namedCalcBlock; namedCalcBlock.staticLabels.push(_('action')); namedCalcBlock.extraWidth = 10; namedCalcBlock.adjustWidthToLabel(); namedCalcBlock.parameterBlock(); var namedDoArgBlock = new ProtoBlock('nameddoArg'); namedDoArgBlock.palette = palettes.dict['action']; blocks.protoBlockDict['nameddoArg'] = namedDoArgBlock; namedDoArgBlock.staticLabels.push(_('do')); namedDoArgBlock.adjustWidthToLabel(); namedDoArgBlock.argClampBlock(); namedDoArgBlock.dockTypes[1] = 'anyin'; var namedCalcArgBlock = new ProtoBlock('namedcalcArg'); namedCalcArgBlock.palette = palettes.dict['action']; blocks.protoBlockDict['namedcalcArg'] = namedCalcArgBlock; namedCalcArgBlock.staticLabels.push(_('calculate')); namedCalcArgBlock.adjustWidthToLabel(); namedCalcArgBlock.argClampMathBlock(); namedCalcArgBlock.dockTypes[0] = 'anyout'; namedCalcArgBlock.dockTypes[1] = 'anyin'; var doArgBlock = new ProtoBlock('doArg'); doArgBlock.palette = palettes.dict['action']; blocks.protoBlockDict['doArg'] = doArgBlock; doArgBlock.staticLabels.push(_('do')); doArgBlock.adjustWidthToLabel(); doArgBlock.argClampOneArgBlock(); doArgBlock.defaults.push(_('action')); doArgBlock.dockTypes[1] = 'anyin'; doArgBlock.dockTypes[2] = 'anyin'; var calcArgBlock = new ProtoBlock('calcArg'); calcArgBlock.palette = palettes.dict['action']; blocks.protoBlockDict['calcArg'] = calcArgBlock; calcArgBlock.staticLabels.push(_('calculate')); calcArgBlock.adjustWidthToLabel(); calcArgBlock.argClampOneArgMathBlock(); calcArgBlock.defaults.push(_('action')); calcArgBlock.dockTypes[0] = 'anyout'; calcArgBlock.dockTypes[1] = 'anyin'; calcArgBlock.dockTypes[2] = 'anyin'; var argBlock = new ProtoBlock('arg'); argBlock.palette = palettes.dict['action']; blocks.protoBlockDict['arg'] = argBlock; argBlock.staticLabels.push('arg'); argBlock.adjustWidthToLabel(); argBlock.oneArgMathBlock(); argBlock.defaults.push(1); argBlock.dockTypes[0] = 'anyout'; argBlock.dockTypes[1] = 'numberin'; var namedArgBlock = new ProtoBlock('namedarg'); namedArgBlock.palette = palettes.dict['action']; blocks.protoBlockDict['namedarg'] = namedArgBlock; namedArgBlock.staticLabels.push('arg ' + 1); namedArgBlock.adjustWidthToLabel(); namedArgBlock.parameterBlock(); var listenBlock = new ProtoBlock('listen'); listenBlock.palette = palettes.dict['action']; blocks.protoBlockDict['listen'] = listenBlock; listenBlock.staticLabels.push(_('on'), _('event'), _('do')); listenBlock.adjustWidthToLabel(); listenBlock.twoArgBlock(); listenBlock.defaults.push(_('event')); listenBlock.defaults.push(_('action')); listenBlock.dockTypes[1] = 'textin'; listenBlock.dockTypes[2] = 'textin'; var dispatchBlock = new ProtoBlock('dispatch'); dispatchBlock.palette = palettes.dict['action']; blocks.protoBlockDict['dispatch'] = dispatchBlock; dispatchBlock.staticLabels.push(_('broadcast')); dispatchBlock.adjustWidthToLabel(); dispatchBlock.oneArgBlock(); dispatchBlock.defaults.push(_('event')); dispatchBlock.dockTypes[1] = 'textin'; var startBlock = new ProtoBlock('start'); startBlock.palette = palettes.dict['action']; blocks.protoBlockDict['start'] = startBlock; startBlock.staticLabels.push(_('start')); startBlock.extraWidth = 10; startBlock.adjustWidthToLabel(); startBlock.stackClampZeroArgBlock(); var actionBlock = new ProtoBlock('action'); actionBlock.palette = palettes.dict['action']; blocks.protoBlockDict['action'] = actionBlock; actionBlock.staticLabels.push(_('action')); actionBlock.extraWidth = 25; actionBlock.adjustWidthToLabel(); actionBlock.stackClampOneArgBlock(); actionBlock.defaults.push(_('action')); var namedDoBlock = new ProtoBlock('nameddo'); namedDoBlock.palette = palettes.dict['action']; blocks.protoBlockDict['nameddo'] = namedDoBlock; namedDoBlock.hidden = true; namedDoBlock.staticLabels.push(_('action')); namedDoBlock.extraWidth = 10; namedDoBlock.adjustWidthToLabel(); namedDoBlock.zeroArgBlock(); // HEAP PALETTE var loadHeapFromApp = new ProtoBlock('loadHeapFromApp'); loadHeapFromApp.palette = palettes.dict['heap']; blocks.protoBlockDict['loadHeapFromApp'] = loadHeapFromApp; loadHeapFromApp.staticLabels.push(_('load heap from App')); loadHeapFromApp.adjustWidthToLabel(); loadHeapFromApp.twoArgBlock(); loadHeapFromApp.dockTypes[1] = 'textin'; loadHeapFromApp.dockTypes[2] = 'textin'; loadHeapFromApp.defaults.push('appName') loadHeapFromApp.defaults.push('localhost'); var saveHeapToApp = new ProtoBlock('saveHeapToApp'); saveHeapToApp.palette = palettes.dict['heap']; blocks.protoBlockDict['saveHeapToApp'] = saveHeapToApp; saveHeapToApp.staticLabels.push(_('save heap to App')); saveHeapToApp.adjustWidthToLabel(); saveHeapToApp.twoArgBlock(); saveHeapToApp.dockTypes[1] = 'textin'; saveHeapToApp.dockTypes[2] = 'textin'; saveHeapToApp.defaults.push('appName') saveHeapToApp.defaults.push('localhost'); var setHeapEntry = new ProtoBlock('setHeapEntry'); setHeapEntry.palette = palettes.dict['heap']; blocks.protoBlockDict['setHeapEntry'] = setHeapEntry; setHeapEntry.staticLabels.push(_('set heap'), _('index'), _('value')); setHeapEntry.adjustWidthToLabel(); setHeapEntry.twoArgBlock(); setHeapEntry.dockTypes[1] = 'numberin'; setHeapEntry.dockTypes[2] = 'anyin'; setHeapEntry.defaults.push(1); setHeapEntry.defaults.push(100); var showHeap = new ProtoBlock('showHeap'); showHeap.palette = palettes.dict['heap']; blocks.protoBlockDict['showHeap'] = showHeap; showHeap.staticLabels.push(_('show heap')); showHeap.adjustWidthToLabel(); showHeap.zeroArgBlock(); var heapLength = new ProtoBlock('heapLength'); heapLength.palette = palettes.dict['heap']; blocks.protoBlockDict['heapLength'] = heapLength; heapLength.staticLabels.push(_('heap length')); heapLength.adjustWidthToLabel(); heapLength.parameterBlock(); heapLength.dockTypes[0] = 'numberout'; var heapEmpty = new ProtoBlock('heapEmpty'); heapEmpty.palette = palettes.dict['heap']; blocks.protoBlockDict['heapEmpty'] = heapEmpty; heapEmpty.staticLabels.push(_('heap empty?')); heapEmpty.adjustWidthToLabel(); heapEmpty.booleanZeroArgBlock(); var emptyHeap = new ProtoBlock('emptyHeap'); emptyHeap.palette = palettes.dict['heap']; blocks.protoBlockDict['emptyHeap'] = emptyHeap; emptyHeap.staticLabels.push(_('empty heap')); emptyHeap.adjustWidthToLabel(); emptyHeap.zeroArgBlock(); var saveHeap = new ProtoBlock('saveHeap'); saveHeap.palette = palettes.dict['heap']; blocks.protoBlockDict['saveHeap'] = saveHeap; saveHeap.staticLabels.push(_('save heap')); saveHeap.adjustWidthToLabel(); saveHeap.oneArgBlock(); saveHeap.defaults.push('heap.json'); saveHeap.dockTypes[1] = 'textin'; var loadHeap = new ProtoBlock('loadHeap'); loadHeap.palette = palettes.dict['heap']; blocks.protoBlockDict['loadHeap'] = loadHeap; loadHeap.staticLabels.push(_('load heap')); loadHeap.adjustWidthToLabel(); loadHeap.oneArgBlock(); loadHeap.dockTypes[1] = 'filein'; loadHeap.defaults = [[null, null]]; var indexHeap = new ProtoBlock('indexHeap'); indexHeap.palette = palettes.dict['heap']; blocks.protoBlockDict['indexHeap'] = indexHeap; indexHeap.staticLabels.push(_('index heap')); indexHeap.adjustWidthToLabel(); indexHeap.oneArgMathBlock(); indexHeap.dockTypes[1] = 'numberin'; indexHeap.defaults.push(1); var pushBlk = new ProtoBlock('push'); pushBlk.palette = palettes.dict['heap']; blocks.protoBlockDict['push'] = pushBlk; pushBlk.staticLabels.push(_('push')); pushBlk.adjustWidthToLabel(); pushBlk.oneArgBlock(); pushBlk.dockTypes[1] = 'anyin'; var popBlk = new ProtoBlock('pop'); popBlk.palette = palettes.dict['heap']; blocks.protoBlockDict['pop'] = popBlk; popBlk.staticLabels.push(_('pop')); popBlk.adjustWidthToLabel(); popBlk.parameterBlock(); // MEDIA PALETTE var speakBlock = new ProtoBlock('speak'); speakBlock.palette = palettes.dict['media']; blocks.protoBlockDict['speak'] = speakBlock; speakBlock.staticLabels.push(_('speak')); speakBlock.adjustWidthToLabel(); speakBlock.oneArgBlock(); speakBlock.defaults.push('hello'); speakBlock.dockTypes[1] = 'textin'; var cameraBlock = new ProtoBlock('camera'); cameraBlock.palette = palettes.dict['media']; cameraBlock.image = 'images/camera.svg' blocks.protoBlockDict['camera'] = cameraBlock; cameraBlock.mediaBlock(); var videoBlock = new ProtoBlock('video'); videoBlock.palette = palettes.dict['media']; videoBlock.image = 'images/video.svg' blocks.protoBlockDict['video'] = videoBlock; videoBlock.mediaBlock(); var loadFile = new ProtoBlock('loadFile'); loadFile.palette = palettes.dict['media']; blocks.protoBlockDict['loadFile'] = loadFile; loadFile.staticLabels.push(''); loadFile.parameterBlock(); loadFile.dockTypes[0] = 'fileout'; var stopVideoCamBlock = new ProtoBlock('stopvideocam'); stopVideoCamBlock.palette = palettes.dict['media']; blocks.protoBlockDict['stopvideocam'] = stopVideoCamBlock; stopVideoCamBlock.staticLabels.push(_('stop media')); stopVideoCamBlock.adjustWidthToLabel(); stopVideoCamBlock.zeroArgBlock(); var toneBlock = new ProtoBlock('tone2'); toneBlock.palette = palettes.dict['media']; blocks.protoBlockDict['tone2'] = toneBlock; toneBlock.staticLabels.push(_('tone'), _('frequency'), _('duration (ms)')); toneBlock.adjustWidthToLabel(); toneBlock.defaults.push(440, 200); toneBlock.twoArgBlock(); toneBlock.dockTypes[1] = 'numberin'; toneBlock.dockTypes[2] = 'numberin'; var toFrequencyBlock = new ProtoBlock('tofrequency'); toFrequencyBlock.palette = palettes.dict['media']; blocks.protoBlockDict['tofrequency'] = toFrequencyBlock; toFrequencyBlock.staticLabels.push(_('note to frequency'), _('name'), _('octave')); toFrequencyBlock.adjustWidthToLabel(); toFrequencyBlock.defaults.push('A'); toFrequencyBlock.defaults.push('4'); toFrequencyBlock.twoArgMathBlock(); toFrequencyBlock.dockTypes[1] = 'anyin'; toFrequencyBlock.dockTypes[2] = 'numberin'; var shellBlock = new ProtoBlock('turtleshell'); shellBlock.palette = palettes.dict['media']; blocks.protoBlockDict['turtleshell'] = shellBlock; shellBlock.staticLabels.push(_('shell'), _('size'), _('image')); shellBlock.adjustWidthToLabel(); shellBlock.twoArgBlock(); shellBlock.defaults.push(55); shellBlock.defaults.push(null); shellBlock.dockTypes[1] = 'numberin'; shellBlock.dockTypes[2] = 'mediain'; var showBlock = new ProtoBlock('show'); showBlock.palette = palettes.dict['media']; blocks.protoBlockDict['show'] = showBlock; showBlock.staticLabels.push(_('show'), _('size'), _('obj')); showBlock.adjustWidthToLabel(); showBlock.twoArgBlock(); showBlock.defaults.push(24); showBlock.defaults.push(_('text')); showBlock.dockTypes[1] = 'numberin'; showBlock.dockTypes[2] = 'anyin'; var mediaBlock = new ProtoBlock('media'); mediaBlock.palette = palettes.dict['media']; mediaBlock.image = 'images/load-media.svg' blocks.protoBlockDict['media'] = mediaBlock; mediaBlock.mediaBlock(); mediaBlock.dockTypes[0] = 'mediaout'; var textBlock = new ProtoBlock('text'); textBlock.palette = palettes.dict['media']; blocks.protoBlockDict['text'] = textBlock; textBlock.valueBlock(); textBlock.dockTypes[0] = 'textout'; // FLOW PALETTE var hiddenNoFlowBlock = new ProtoBlock('hiddennoflow'); hiddenNoFlowBlock.palette = palettes.dict['flow']; blocks.protoBlockDict['hiddennoflow'] = hiddenNoFlowBlock; hiddenNoFlowBlock.hiddenNoFlow = true; hiddenNoFlowBlock.hiddenBlockNoFlow(); hiddenNoFlowBlock.hidden = true; var hiddenBlock = new ProtoBlock('hidden'); hiddenBlock.palette = palettes.dict['flow']; blocks.protoBlockDict['hidden'] = hiddenBlock; hiddenBlock.hidden = true; hiddenBlock.hiddenBlockFlow(); var clampBlock = new ProtoBlock('clamp'); clampBlock.palette = palettes.dict['flow']; blocks.protoBlockDict['clamp'] = clampBlock; clampBlock.hidden = true; clampBlock.flowClampBlock(); var breakBlock = new ProtoBlock('break'); breakBlock.palette = palettes.dict['flow']; blocks.protoBlockDict['break'] = breakBlock; breakBlock.staticLabels.push(_('stop')); breakBlock.adjustWidthToLabel(); breakBlock.basicBlockNoFlow(); var waitForBlock = new ProtoBlock('waitFor'); waitForBlock.palette = palettes.dict['flow']; blocks.protoBlockDict['waitFor'] = waitForBlock; waitForBlock.staticLabels.push(_('wait for')); waitForBlock.adjustWidthToLabel(); waitForBlock.oneBooleanArgBlock(); var untilBlock = new ProtoBlock('until'); untilBlock.palette = palettes.dict['flow']; blocks.protoBlockDict['until'] = untilBlock; untilBlock.staticLabels.push(_('until'), _('do')); untilBlock.adjustWidthToLabel(); untilBlock.flowClampBooleanArgBlock(); var whileBlock = new ProtoBlock('while'); whileBlock.palette = palettes.dict['flow']; blocks.protoBlockDict['while'] = whileBlock; whileBlock.staticLabels.push(_('while'), _('do')); whileBlock.adjustWidthToLabel(); whileBlock.flowClampBooleanArgBlock(); var ifthenelseBlock = new ProtoBlock('ifthenelse'); ifthenelseBlock.palette = palettes.dict['flow']; blocks.protoBlockDict['ifthenelse'] = ifthenelseBlock; ifthenelseBlock.staticLabels.push(_('if'), _('then'), _('else')); ifthenelseBlock.adjustWidthToLabel(); ifthenelseBlock.doubleFlowClampBooleanArgBlock(); var ifBlock = new ProtoBlock('if'); ifBlock.palette = palettes.dict['flow']; blocks.protoBlockDict['if'] = ifBlock; ifBlock.staticLabels.push(_('if'), _('then')); ifBlock.adjustWidthToLabel(); ifBlock.flowClampBooleanArgBlock(); var foreverBlock = new ProtoBlock('forever'); foreverBlock.palette = palettes.dict['flow']; blocks.protoBlockDict['forever'] = foreverBlock; foreverBlock.staticLabels.push(_('forever')); foreverBlock.adjustWidthToLabel(); foreverBlock.flowClampZeroArgBlock(); var repeatBlock = new ProtoBlock('repeat'); repeatBlock.palette = palettes.dict['flow']; blocks.protoBlockDict['repeat'] = repeatBlock; repeatBlock.staticLabels.push(_('repeat')); repeatBlock.adjustWidthToLabel(); repeatBlock.flowClampOneArgBlock(); repeatBlock.defaults.push(4); // EXTRAS PALETTE // NOP blocks (used as placeholders when loaded blocks not found) var nopValueBlock = new ProtoBlock('nopValueBlock'); blocks.protoBlockDict['nopValueBlock'] = nopValueBlock; nopValueBlock.hidden = true; nopValueBlock.palette = palettes.dict['extras']; nopValueBlock.staticLabels.push(_('unknown')); nopValueBlock.adjustWidthToLabel(); nopValueBlock.valueBlock(); nopValueBlock.dockTypes[0] = 'anyout'; /* var nopOneArgMathBlock = new ProtoBlock('nopOneArgMathBlock'); blocks.protoBlockDict['nopOneArgMathBlock'] = nopOneArgMathBlock; nopOneArgMathBlock.hidden = true; nopOneArgMathBlock.palette = palettes.dict['extras']; nopOneArgMathBlock.oneArgMathBlock(); nopOneArgMathBlock.staticLabels.push(_('unknown')); nopOneArgMathBlock.dockTypes[0] = 'anyout'; nopOneArgMathBlock.dockTypes[1] = 'anyin'; var nopTwoArgMathBlock = new ProtoBlock('nopTwoArgMathBlock'); blocks.protoBlockDict['nopTwoArgMathBlock'] = nopTwoArgMathBlock; nopTwoArgMathBlock.twoArgMathBlock(); nopTwoArgMathBlock.hidden = true; nopTwoArgMathBlock.palette = palettes.dict['extras']; nopTwoArgMathBlock.staticLabels.push(_('unknown')); nopTwoArgMathBlock.dockTypes[0] = 'anyout'; nopTwoArgMathBlock.dockTypes[1] = 'anyin'; nopTwoArgMathBlock.dockTypes[2] = 'anyin'; */ var nopZeroArgBlock = new ProtoBlock('nopZeroArgBlock'); blocks.protoBlockDict['nopZeroArgBlock'] = nopZeroArgBlock; nopZeroArgBlock.hidden = true; nopZeroArgBlock.palette = palettes.dict['extras']; nopZeroArgBlock.staticLabels.push(_('unknown')); nopZeroArgBlock.adjustWidthToLabel(); nopZeroArgBlock.zeroArgBlock(); var nopOneArgBlock = new ProtoBlock('nopOneArgBlock'); blocks.protoBlockDict['nopOneArgBlock'] = nopOneArgBlock; nopOneArgBlock.hidden = true; nopOneArgBlock.palette = palettes.dict['extras']; nopOneArgBlock.staticLabels.push(_('unknown')); nopOneArgBlock.adjustWidthToLabel(); nopOneArgBlock.oneArgBlock(); nopOneArgBlock.dockTypes[1] = 'anyin'; var nopTwoArgBlock = new ProtoBlock('nopTwoArgBlock'); blocks.protoBlockDict['nopTwoArgBlock'] = nopTwoArgBlock; nopTwoArgBlock.hidden = true; nopTwoArgBlock.palette = palettes.dict['extras']; nopTwoArgBlock.staticLabels.push(_('unknown')); nopTwoArgBlock.adjustWidthToLabel(); nopTwoArgBlock.twoArgBlock(); nopTwoArgBlock.dockTypes[1] = 'anyin'; nopTwoArgBlock.dockTypes[2] = 'anyin'; var nopThreeArgBlock = new ProtoBlock('nopThreeArgBlock'); blocks.protoBlockDict['nopThreeArgBlock'] = nopThreeArgBlock; nopThreeArgBlock.hidden = true; nopThreeArgBlock.palette = palettes.dict['extras']; nopThreeArgBlock.staticLabels.push(_('unknown')); nopThreeArgBlock.adjustWidthToLabel(); nopThreeArgBlock.threeArgBlock(); nopThreeArgBlock.dockTypes[1] = 'anyin'; nopThreeArgBlock.dockTypes[2] = 'anyin'; nopThreeArgBlock.dockTypes[3] = 'anyin'; var audioBlock = new ProtoBlock('playback'); audioBlock.palette = palettes.dict['extras']; blocks.protoBlockDict['playback'] = audioBlock; audioBlock.defaults.push(null); audioBlock.staticLabels.push(_('play back')); audioBlock.adjustWidthToLabel(); audioBlock.oneArgBlock(); audioBlock.dockTypes[1] = 'mediain'; var audioStopBlock = new ProtoBlock('stopplayback'); audioStopBlock.palette = palettes.dict['extras']; blocks.protoBlockDict['stopplayback'] = audioStopBlock; audioStopBlock.staticLabels.push(_('stop play')); audioStopBlock.adjustWidthToLabel(); audioStopBlock.zeroArgBlock(); var svgBlock = new ProtoBlock('savesvg'); svgBlock.palette = palettes.dict['extras']; blocks.protoBlockDict['savesvg'] = svgBlock; svgBlock.staticLabels.push(_('save svg')); svgBlock.adjustWidthToLabel(); svgBlock.oneArgBlock(); svgBlock.defaults.push(_('title') + '.svg'); svgBlock.dockTypes[1] = 'textin'; var publishBlock = new ProtoBlock('publish'); publishBlock.palette = palettes.dict['extras']; blocks.protoBlockDict['publish'] = publishBlock; publishBlock.staticLabels.push(_('publish to Facebook')); publishBlock.adjustWidthToLabel(); publishBlock.oneArgBlock(); publishBlock.defaults.push(_('title')); publishBlock.dockTypes[1] = 'textin'; publishBlock.hidden = true; var getyTurtleBlock = new ProtoBlock('yturtle'); getyTurtleBlock.palette = palettes.dict['extras']; blocks.protoBlockDict['yturtle'] = getyTurtleBlock; getyTurtleBlock.staticLabels.push(_('turtle y')); getyTurtleBlock.adjustWidthToLabel(); getyTurtleBlock.oneArgMathBlock(); getyTurtleBlock.dockTypes[1] = 'anyin'; getyTurtleBlock.defaults.push('0'); var getxTurtleBlock = new ProtoBlock('xturtle'); getxTurtleBlock.palette = palettes.dict['extras']; blocks.protoBlockDict['xturtle'] = getxTurtleBlock; getxTurtleBlock.staticLabels.push(_('turtle x')); getxTurtleBlock.adjustWidthToLabel(); getxTurtleBlock.oneArgMathBlock(); getxTurtleBlock.dockTypes[1] = 'anyin'; getxTurtleBlock.defaults.push('0'); var startTurtleBlock = new ProtoBlock('startTurtle'); startTurtleBlock.palette = palettes.dict['extras']; blocks.protoBlockDict['startTurtle'] = startTurtleBlock; startTurtleBlock.staticLabels.push(_('start turtle')); startTurtleBlock.adjustWidthToLabel(); startTurtleBlock.oneArgBlock(); startTurtleBlock.dockTypes[1] = 'anyin'; startTurtleBlock.defaults.push('0'); var stopTurtleBlock = new ProtoBlock('stopTurtle'); stopTurtleBlock.palette = palettes.dict['extras']; blocks.protoBlockDict['stopTurtle'] = stopTurtleBlock; stopTurtleBlock.staticLabels.push(_('stop turtle')); stopTurtleBlock.adjustWidthToLabel(); stopTurtleBlock.oneArgBlock(); stopTurtleBlock.dockTypes[1] = 'anyin'; stopTurtleBlock.defaults.push('0'); var noBackgroundBlock = new ProtoBlock('nobackground'); blocks.protoBlockDict['nobackground'] = noBackgroundBlock; noBackgroundBlock.palette = palettes.dict['extras']; noBackgroundBlock.staticLabels.push(_('no background')); noBackgroundBlock.adjustWidthToLabel(); noBackgroundBlock.zeroArgBlock(); var showBlocks = new ProtoBlock('showblocks'); showBlocks.palette = palettes.dict['extras']; blocks.protoBlockDict['showblocks'] = showBlocks; showBlocks.staticLabels.push(_('show blocks')); showBlocks.adjustWidthToLabel(); showBlocks.zeroArgBlock(); var hideBlocks = new ProtoBlock('hideblocks'); hideBlocks.palette = palettes.dict['extras']; blocks.protoBlockDict['hideblocks'] = hideBlocks; hideBlocks.staticLabels.push(_('hide blocks')); hideBlocks.adjustWidthToLabel(); hideBlocks.zeroArgBlock(); var openProjectBlock = new ProtoBlock('openProject'); openProjectBlock.palette = palettes.dict['extras']; blocks.protoBlockDict['openProject'] = openProjectBlock; openProjectBlock.staticLabels.push(_('open project')); openProjectBlock.adjustWidthToLabel(); openProjectBlock.oneArgBlock(); openProjectBlock.defaults.push('url'); openProjectBlock.dockTypes[1] = 'textin'; var vspaceBlock = new ProtoBlock('vspace'); vspaceBlock.palette = palettes.dict['extras']; blocks.protoBlockDict['vspace'] = vspaceBlock; vspaceBlock.staticLabels.push('↓'); vspaceBlock.extraWidth = -10; vspaceBlock.zeroArgBlock(); var hspaceBlock = new ProtoBlock('hspace'); hspaceBlock.palette = palettes.dict['extras']; blocks.protoBlockDict['hspace'] = hspaceBlock; hspaceBlock.oneArgMathBlock(); hspaceBlock.staticLabels.push('←'); hspaceBlock.dockTypes[0] = 'anyout'; hspaceBlock.dockTypes[1] = 'anyin'; var waitBlock = new ProtoBlock('wait'); waitBlock.palette = palettes.dict['extras']; blocks.protoBlockDict['wait'] = waitBlock; waitBlock.staticLabels.push(_('wait')); waitBlock.adjustWidthToLabel(); waitBlock.oneArgBlock(); waitBlock.defaults.push(1); var printBlock = new ProtoBlock('print'); printBlock.palette = palettes.dict['extras']; blocks.protoBlockDict['print'] = printBlock; printBlock.staticLabels.push(_('print')); printBlock.adjustWidthToLabel(); printBlock.oneArgBlock(); printBlock.dockTypes[1] = 'anyin'; var turtleNameBlock = new ProtoBlock('turtlename'); turtleNameBlock.palette = palettes.dict['extras']; blocks.protoBlockDict['turtlename'] = turtleNameBlock; turtleNameBlock.staticLabels.push(_('turtle name')); turtleNameBlock.adjustWidthToLabel(); turtleNameBlock.parameterBlock(); turtleNameBlock.dockTypes[0] = 'textout'; var setTurtleName = new ProtoBlock('setturtlename'); setTurtleName.palette = palettes.dict['extras']; blocks.protoBlockDict['setturtlename'] = setTurtleName; setTurtleName.staticLabels.push(_('turtle name')); setTurtleName.staticLabels.push(_('source')); setTurtleName.staticLabels.push(_('target')); setTurtleName.adjustWidthToLabel(); setTurtleName.twoArgBlock(); setTurtleName.dockTypes[1] = 'anyin'; setTurtleName.dockTypes[2] = 'anyin'; setTurtleName.defaults.push('0'); setTurtleName.defaults.push('Yertle'); var statusBlock = new ProtoBlock('status'); statusBlock.palette = palettes.dict['extras']; blocks.protoBlockDict['status'] = statusBlock; statusBlock.staticLabels.push(_('status')); statusBlock.adjustWidthToLabel(); statusBlock.stackClampZeroArgBlock(); // SENSORS PALETTE var loudnessBlock = new ProtoBlock('loudness'); loudnessBlock.palette = palettes.dict['sensors']; blocks.protoBlockDict['loudness'] = loudnessBlock; loudnessBlock.staticLabels.push(_('loudness')); loudnessBlock.adjustWidthToLabel(); loudnessBlock.parameterBlock(); // Turtle-specific click event var myClickBlock = new ProtoBlock('myclick'); myClickBlock.palette = palettes.dict['sensors']; blocks.protoBlockDict['myclick'] = myClickBlock; myClickBlock.staticLabels.push(_('click')); myClickBlock.adjustWidthToLabel(); myClickBlock.parameterBlock(); myClickBlock.dockTypes[0] = 'textout'; var getBlue = new ProtoBlock('getblue'); getBlue.palette = palettes.dict['sensors']; blocks.protoBlockDict['getblue'] = getBlue; getBlue.staticLabels.push(_('blue')); getBlue.adjustWidthToLabel(); getBlue.parameterBlock(); var getGreen = new ProtoBlock('getgreen'); getGreen.palette = palettes.dict['sensors']; blocks.protoBlockDict['getgreen'] = getGreen; getGreen.staticLabels.push(_('green')); getGreen.adjustWidthToLabel(); getGreen.parameterBlock(); var getRed = new ProtoBlock('getred'); getRed.palette = palettes.dict['sensors']; blocks.protoBlockDict['getred'] = getRed; getRed.staticLabels.push(_('red')); getRed.adjustWidthToLabel(); getRed.parameterBlock(); var getColorPixel = new ProtoBlock('getcolorpixel'); getColorPixel.palette = palettes.dict['sensors']; blocks.protoBlockDict['getcolorpixel'] = getColorPixel; getColorPixel.staticLabels.push(_('pixel color')); getColorPixel.adjustWidthToLabel(); getColorPixel.parameterBlock(); var timeBlock = new ProtoBlock('time'); timeBlock.palette = palettes.dict['sensors']; blocks.protoBlockDict['time'] = timeBlock; timeBlock.staticLabels.push(_('time')); timeBlock.adjustWidthToLabel(); timeBlock.parameterBlock(); var mousexBlock = new ProtoBlock('mousex'); mousexBlock.palette = palettes.dict['sensors']; blocks.protoBlockDict['mousex'] = mousexBlock; mousexBlock.staticLabels.push(_('mouse x')); mousexBlock.extraWidth = 15; mousexBlock.adjustWidthToLabel(); mousexBlock.parameterBlock(); var mouseyBlock = new ProtoBlock('mousey'); mouseyBlock.palette = palettes.dict['sensors']; blocks.protoBlockDict['mousey'] = mouseyBlock; mouseyBlock.staticLabels.push(_('mouse y')); mouseyBlock.extraWidth = 15; mouseyBlock.adjustWidthToLabel(); mouseyBlock.parameterBlock(); var mousebuttonBlock = new ProtoBlock('mousebutton'); mousebuttonBlock.palette = palettes.dict['sensors']; blocks.protoBlockDict['mousebutton'] = mousebuttonBlock; mousebuttonBlock.staticLabels.push(_('mouse button')); mousebuttonBlock.adjustWidthToLabel(); mousebuttonBlock.booleanZeroArgBlock(); var toASCIIBlock = new ProtoBlock('toascii'); toASCIIBlock.palette = palettes.dict['sensors']; blocks.protoBlockDict['toascii'] = toASCIIBlock; toASCIIBlock.staticLabels.push(_('to ASCII')); toASCIIBlock.defaults.push(65); toASCIIBlock.oneArgMathBlock(); var keyboardBlock = new ProtoBlock('keyboard'); keyboardBlock.palette = palettes.dict['sensors']; blocks.protoBlockDict['keyboard'] = keyboardBlock; keyboardBlock.staticLabels.push(_('keyboard')); keyboardBlock.adjustWidthToLabel(); keyboardBlock.parameterBlock(); // REMOVED UNTIL WE PLUG THE SECURITY HOLE /* var evalBlock = new ProtoBlock('eval'); evalBlock.palette = palettes.dict['number']; blocks.protoBlockDict['eval'] = evalBlock; evalBlock.staticLabels.push(_('eval')); evalBlock.staticLabels.push('f(x)'); evalBlock.staticLabels.push('x'); evalBlock.adjustWidthToLabel(); evalBlock.twoArgMathBlock(); evalBlock.dockTypes[1] = 'textin'; evalBlock.defaults.push('x'); evalBlock.defaults.push(100); */ // Music Blocks that we ignore var transposition = new ProtoBlock('transpositionfactor'); transposition.palette = palettes.dict['extras']; blocks.protoBlockDict['transpositionfactor'] = transposition; transposition.staticLabels.push(_('transposition')); transposition.adjustWidthToLabel(); transposition.parameterBlock(); transposition.hidden = true; var consonantStepDownBlock = new ProtoBlock('consonantstepsizedown'); consonantStepDownBlock.palette = palettes.dict['extras']; blocks.protoBlockDict['consonantstepsizedown'] = consonantStepDownBlock; //.TRANS: step down one note in current mode consonantStepDownBlock.staticLabels.push(_('consonant step down')); consonantStepDownBlock.adjustWidthToLabel(); consonantStepDownBlock.parameterBlock(); consonantStepDownBlock.hidden = true; var consonantStepUpBlock = new ProtoBlock('consonantstepsizeup'); consonantStepUpBlock.palette = palettes.dict['extras']; blocks.protoBlockDict['consonantstepsizeup'] = consonantStepUpBlock; //.TRANS: step up one note in current mode consonantStepUpBlock.staticLabels.push(_('consonant step up')); consonantStepUpBlock.adjustWidthToLabel(); consonantStepUpBlock.parameterBlock(); consonantStepUpBlock.hidden = true; var turtlePitchBlock = new ProtoBlock('turtlepitch'); turtlePitchBlock.palette = palettes.dict['extras']; blocks.protoBlockDict['turtlepitch'] = turtlePitchBlock; //.TRANS: convert current note for this turtle to piano key (1-88) turtlePitchBlock.staticLabels.push(_('mouse pitch number')); turtlePitchBlock.oneArgMathBlock(); turtlePitchBlock.adjustWidthToLabel(); turtlePitchBlock.dockTypes[1] = 'anyin'; turtlePitchBlock.hidden = true; var setPitchNumberOffsetBlock = new ProtoBlock('setpitchnumberoffset'); setPitchNumberOffsetBlock.palette = palettes.dict['extras']; blocks.protoBlockDict['setpitchnumberoffset'] = setPitchNumberOffsetBlock; setPitchNumberOffsetBlock.staticLabels.push(_('set pitch number offset'), _('name'), _('octave')); setPitchNumberOffsetBlock.adjustWidthToLabel(); setPitchNumberOffsetBlock.twoArgBlock(); setPitchNumberOffsetBlock.defaults.push('4'); setPitchNumberOffsetBlock.dockTypes[1] = 'notein'; setPitchNumberOffsetBlock.dockTypes[2] = 'anyin'; setPitchNumberOffsetBlock.hidden = true; var numberToPitchBlock = new ProtoBlock('number2pitch'); numberToPitchBlock.palette = palettes.dict['extras']; blocks.protoBlockDict['number2pitch'] = numberToPitchBlock; //.TRANS: convert piano key number (1-88) to pitch numberToPitchBlock.staticLabels.push(_('number to pitch')); numberToPitchBlock.oneArgMathBlock(); numberToPitchBlock.adjustWidthToLabel(); numberToPitchBlock.defaults.push(48); numberToPitchBlock.hidden = true; var numberToOctaveBlock = new ProtoBlock('number2octave'); numberToOctaveBlock.palette = palettes.dict['extras']; blocks.protoBlockDict['number2octave'] = numberToOctaveBlock; //.TRANS: convert piano key number (1-88) to octave numberToOctaveBlock.staticLabels.push(_('number to octave')); numberToOctaveBlock.oneArgMathBlock(); numberToOctaveBlock.adjustWidthToLabel(); numberToOctaveBlock.hidden = true; numberToOctaveBlock.defaults.push(48); // Value blocks var modenameBlock = new ProtoBlock('modename'); modenameBlock.palette = palettes.dict['extras']; blocks.protoBlockDict['modename'] = modenameBlock; modenameBlock.valueBlock(); modenameBlock.dockTypes[0] = 'textout'; modenameBlock.hidden = true; var notenameBlock = new ProtoBlock('notename'); notenameBlock.palette = palettes.dict['extras']; blocks.protoBlockDict['notename'] = notenameBlock; notenameBlock.valueBlock(); notenameBlock.dockTypes[0] = 'noteout'; notenameBlock.hidden = true; var solfegeBlock = new ProtoBlock('solfege'); solfegeBlock.palette = palettes.dict['extras']; blocks.protoBlockDict['solfege'] = solfegeBlock; solfegeBlock.valueBlock(); solfegeBlock.dockTypes[0] = 'solfegeout'; solfegeBlock.hidden = true; var eastindiansolfegeBlock = new ProtoBlock('eastindiansolfege'); eastindiansolfegeBlock.palette = palettes.dict['extras']; blocks.protoBlockDict['eastindiansolfege'] = eastindiansolfegeBlock; eastindiansolfegeBlock.valueBlock(); eastindiansolfegeBlock.dockTypes[0] = 'solfegeout'; eastindiansolfegeBlock.hidden = true; // Transposition blocks var invertBlock = new ProtoBlock('invert1'); invertBlock.palette = palettes.dict['extras']; blocks.protoBlockDict['invert1'] = invertBlock; invertBlock.staticLabels.push(_('invert'), _('name'), _('octave'), _('even') + '/' + _('odd')); invertBlock.adjustWidthToLabel(); invertBlock.flowClampThreeArgBlock(); invertBlock.adjustWidthToLabel(); invertBlock.defaults.push('sol'); invertBlock.defaults.push(4); invertBlock.defaults.push(_('even')); invertBlock.dockTypes[1] = 'solfegein'; invertBlock.dockTypes[2] = 'anyin'; invertBlock.dockTypes[3] = 'anyin'; invertBlock.hidden = true; var transpositionBlock = new ProtoBlock('settransposition'); transpositionBlock.palette = palettes.dict['extras']; blocks.protoBlockDict['settransposition'] = transpositionBlock; transpositionBlock.staticLabels.push(_('adjust transposition')); transpositionBlock.adjustWidthToLabel(); transpositionBlock.defaults.push('1'); transpositionBlock.flowClampOneArgBlock(); transpositionBlock.hidden = true; var octaveBlock = new ProtoBlock('octave'); octaveBlock.palette = palettes.dict['extras']; blocks.protoBlockDict['octave'] = octaveBlock; octaveBlock.staticLabels.push(_('octave')); octaveBlock.adjustWidthToLabel(); octaveBlock.zeroArgBlock(); octaveBlock.hidden = true; var flatBlock = new ProtoBlock('flat'); flatBlock.palette = palettes.dict['extras']; blocks.protoBlockDict['flat'] = flatBlock; flatBlock.staticLabels.push(_('flat')); flatBlock.adjustWidthToLabel(); flatBlock.flowClampZeroArgBlock(); flatBlock.hidden = true; var sharpBlock = new ProtoBlock('sharp'); sharpBlock.palette = palettes.dict['extras']; blocks.protoBlockDict['sharp'] = sharpBlock; sharpBlock.staticLabels.push(_('sharp')); sharpBlock.adjustWidthToLabel(); sharpBlock.flowClampZeroArgBlock(); sharpBlock.hidden = true; var hertzBlock = new ProtoBlock('hertz'); hertzBlock.palette = palettes.dict['extras']; blocks.protoBlockDict['hertz'] = hertzBlock; hertzBlock.staticLabels.push(_('hertz')); hertzBlock.adjustWidthToLabel(); hertzBlock.oneArgBlock(); hertzBlock.defaults.push(392); hertzBlock.hidden = true; var pitchNumberBlock = new ProtoBlock('pitchnumber'); pitchNumberBlock.palette = palettes.dict['extras']; blocks.protoBlockDict['pitchnumber'] = pitchNumberBlock; pitchNumberBlock.staticLabels.push(_('pitch number')); pitchNumberBlock.adjustWidthToLabel(); pitchNumberBlock.oneArgBlock(); pitchNumberBlock.defaults.push(7); pitchNumberBlock.dockTypes[1] = 'numberin'; pitchNumberBlock.hidden = true; var scaleDegree = new ProtoBlock('scaledegree'); scaleDegree.palette = palettes.dict['extras']; blocks.protoBlockDict['scaledegree'] = scaleDegree; scaleDegree.staticLabels.push(_('scale degree'), _('number'), _('octave')); scaleDegree.adjustWidthToLabel(); scaleDegree.defaults.push(5); // G in C Major scaleDegree.defaults.push(4); scaleDegree.twoArgBlock(); scaleDegree.dockTypes[1] = 'numberin'; scaleDegree.dockTypes[2] = 'anyin'; scaleDegree.hidden = true; var pitchStepBlock = new ProtoBlock('steppitch'); pitchStepBlock.palette = palettes.dict['extras']; blocks.protoBlockDict['steppitch'] = pitchStepBlock; //.TRANS: step some number of notes in current mode pitchStepBlock.staticLabels.push(_('step pitch')); pitchStepBlock.oneArgBlock(); pitchStepBlock.adjustWidthToLabel(); pitchStepBlock.dockTypes[1] = 'anyin'; pitchStepBlock.defaults.push(1); pitchStepBlock.hidden = true; var pitch = new ProtoBlock('pitch'); pitch.palette = palettes.dict['extras']; blocks.protoBlockDict['pitch'] = pitch; pitch.staticLabels.push(_('pitch'), _('name'), _('octave')); pitch.adjustWidthToLabel(); pitch.defaults.push('sol'); pitch.defaults.push(4); pitch.twoArgBlock(); pitch.dockTypes[1] = 'solfegein'; pitch.dockTypes[2] = 'anyin'; pitch.hidden = true; var sixtyfourthNoteBlock = new ProtoBlock('sixtyfourthNote'); sixtyfourthNoteBlock.palette = palettes.dict['extras']; blocks.protoBlockDict['sixtyfourthNote'] = sixtyfourthNoteBlock; sixtyfourthNoteBlock.staticLabels.push(_('1/64 note') + ' 𝅘𝅥𝅱'); sixtyfourthNoteBlock.adjustWidthToLabel(); sixtyfourthNoteBlock.zeroArgBlock(); sixtyfourthNoteBlock.hidden = true; var thirtysecondNoteBlock = new ProtoBlock('thirtysecondNote'); thirtysecondNoteBlock.palette = palettes.dict['extras']; blocks.protoBlockDict['thirtysecondNote'] = thirtysecondNoteBlock; thirtysecondNoteBlock.staticLabels.push(_('1/32 note') + ' 𝅘𝅥𝅰'); thirtysecondNoteBlock.adjustWidthToLabel(); thirtysecondNoteBlock.zeroArgBlock(); thirtysecondNoteBlock.hidden = true; var sixteenthNoteBlock = new ProtoBlock('sixteenthNote'); sixteenthNoteBlock.palette = palettes.dict['extras']; blocks.protoBlockDict['sixteenthNote'] = sixteenthNoteBlock; sixteenthNoteBlock.staticLabels.push(_('1/16 note') + ' 𝅘𝅥𝅯'); sixteenthNoteBlock.adjustWidthToLabel(); sixteenthNoteBlock.zeroArgBlock(); sixteenthNoteBlock.hidden = true; var eighthNoteBlock = new ProtoBlock('eighthNote'); eighthNoteBlock.palette = palettes.dict['extras']; blocks.protoBlockDict['eighthNote'] = eighthNoteBlock; eighthNoteBlock.staticLabels.push(_('eighth note') + ' ♪'); eighthNoteBlock.adjustWidthToLabel(); eighthNoteBlock.zeroArgBlock(); eighthNoteBlock.hidden = true; var quarterNoteBlock = new ProtoBlock('quarterNote'); quarterNoteBlock.palette = palettes.dict['extras']; blocks.protoBlockDict['quarterNote'] = quarterNoteBlock; quarterNoteBlock.staticLabels.push(_('quarter note') + ' ♩'); quarterNoteBlock.adjustWidthToLabel(); quarterNoteBlock.zeroArgBlock(); quarterNoteBlock.hidden = true; var halfNoteBlock = new ProtoBlock('halfNote'); halfNoteBlock.palette = palettes.dict['extras']; blocks.protoBlockDict['halfNote'] = halfNoteBlock; halfNoteBlock.staticLabels.push(_('half note') + ' 𝅗𝅥'); halfNoteBlock.adjustWidthToLabel(); halfNoteBlock.zeroArgBlock(); halfNoteBlock.hidden = true; var wholeNoteBlock = new ProtoBlock('wholeNote'); wholeNoteBlock.palette = palettes.dict['extras']; blocks.protoBlockDict['wholeNote'] = wholeNoteBlock; wholeNoteBlock.staticLabels.push(_('whole note') + ' 𝅝'); wholeNoteBlock.adjustWidthToLabel(); wholeNoteBlock.zeroArgBlock(); wholeNoteBlock.hidden = true; var tuplet4Block = new ProtoBlock('tuplet4'); tuplet4Block.palette = palettes.dict['extras']; blocks.protoBlockDict['tuplet4'] = tuplet4Block; tuplet4Block.staticLabels.push(_('tuplet'), _('note value')); tuplet4Block.extraWidth = 20; tuplet4Block.adjustWidthToLabel(); tuplet4Block.flowClampOneArgBlock(); tuplet4Block.defaults.push(1 / 4); tuplet4Block.hidden = true; var simpleTupletBlock = new ProtoBlock('stuplet'); simpleTupletBlock.palette = palettes.dict['extras']; blocks.protoBlockDict['stuplet'] = simpleTupletBlock; simpleTupletBlock.staticLabels.push(_('simple tuplet'), _('number of notes'), _('note value')); simpleTupletBlock.adjustWidthToLabel(); simpleTupletBlock.twoArgBlock(); simpleTupletBlock.defaults.push(3); simpleTupletBlock.defaults.push(1 / 2); simpleTupletBlock.hidden = true; var rhythm2 = new ProtoBlock('rhythm2'); rhythm2.palette = palettes.dict['extras']; blocks.protoBlockDict['rhythm2'] = rhythm2; rhythm2.staticLabels.push(_('rhythm'), _('number of notes'), _('note value')); rhythm2.extraWidth = 10; rhythm2.adjustWidthToLabel(); rhythm2.defaults.push(3); rhythm2.defaults.push(4); rhythm2.twoArgBlock(); rhythm2.dockTypes[1] = 'anyin'; rhythm2.dockTypes[2] = 'anyin'; rhythm2.hidden = true; var modewidgetBlock = new ProtoBlock('modewidget'); modewidgetBlock.palette = palettes.dict['extras']; blocks.protoBlockDict['modewidget'] = modewidgetBlock; modewidgetBlock.staticLabels.push(_('custom mode')); modewidgetBlock.adjustWidthToLabel(); modewidgetBlock.stackClampZeroArgBlock(); modewidgetBlock.hidden = true; var tempoBlock = new ProtoBlock('tempo'); tempoBlock.palette = palettes.dict['extras']; blocks.protoBlockDict['tempo'] = tempoBlock; tempoBlock.staticLabels.push(_('tempo')); tempoBlock.adjustWidthToLabel(); tempoBlock.stackClampZeroArgBlock(); tempoBlock.hidden = true; var pitchDrumMatrixBlock = new ProtoBlock('pitchdrummatrix'); pitchDrumMatrixBlock.palette = palettes.dict['extras']; blocks.protoBlockDict['pitchdrummatrix'] = pitchDrumMatrixBlock; pitchDrumMatrixBlock.staticLabels.push(_('pitch-drum matrix')); pitchDrumMatrixBlock.adjustWidthToLabel(); pitchDrumMatrixBlock.stackClampZeroArgBlock(); pitchDrumMatrixBlock.hidden = true; var pitchsliderBlock = new ProtoBlock('pitchslider'); pitchsliderBlock.palette = palettes.dict['extras']; blocks.protoBlockDict['pitchslider'] = pitchsliderBlock; //.TRANS: widget to generate pitches using a slider pitchsliderBlock.staticLabels.push(_('pitchslider')); pitchsliderBlock.adjustWidthToLabel(); pitchsliderBlock.stackClampZeroArgBlock(); pitchsliderBlock.hidden = true; var pitchstaircaseBlock = new ProtoBlock('pitchstaircase'); pitchstaircaseBlock.palette = palettes.dict['extras']; blocks.protoBlockDict['pitchstaircase'] = pitchstaircaseBlock; pitchstaircaseBlock.staticLabels.push(_('pitch staircase')); pitchstaircaseBlock.adjustWidthToLabel(); pitchstaircaseBlock.stackClampZeroArgBlock(); pitchstaircaseBlock.hidden = true; var rhythmrulerBlock = new ProtoBlock('rhythmruler'); rhythmrulerBlock.palette = palettes.dict['extras']; blocks.protoBlockDict['rhythmruler'] = rhythmrulerBlock; //.TRANS: widget for subdividing a measure into distinct rhythmic elements rhythmrulerBlock.staticLabels.push(_('rhythm ruler')); rhythmrulerBlock.adjustWidthToLabel(); rhythmrulerBlock.stackClampOneArgBlock(); rhythmrulerBlock.defaults.push(1); rhythmrulerBlock.hidden = true; var matrixBlock = new ProtoBlock('matrix'); matrixBlock.palette = palettes.dict['extras']; blocks.protoBlockDict['matrix'] = matrixBlock; matrixBlock.staticLabels.push(_('pitch-time matrix')); matrixBlock.adjustWidthToLabel(); matrixBlock.stackClampZeroArgBlock(); matrixBlock.hidden = true; var noteCounter = new ProtoBlock('notecounter'); noteCounter.palette = palettes.dict['extras']; blocks.protoBlockDict['notecounter'] = noteCounter; noteCounter.staticLabels.push(_('note counter')); noteCounter.argFlowClampBlock(); noteCounter.adjustWidthToLabel(); noteCounter.hidden = true; var turtleNoteBlock2 = new ProtoBlock('turtlenote2'); turtleNoteBlock2.palette = palettes.dict['extras']; blocks.protoBlockDict['turtlenote2'] = turtleNoteBlock2; turtleNoteBlock2.staticLabels.push(_('mouse note value')); turtleNoteBlock2.oneArgMathBlock(); turtleNoteBlock2.adjustWidthToLabel(); turtleNoteBlock2.dockTypes[1] = 'anyin'; turtleNoteBlock2.hidden = true; var duplicateFactor = new ProtoBlock('duplicatefactor'); duplicateFactor.palette = palettes.dict['extras']; blocks.protoBlockDict['duplicatefactor'] = duplicateFactor; duplicateFactor.staticLabels.push(_('duplicate factor')); duplicateFactor.adjustWidthToLabel(); duplicateFactor.parameterBlock(); duplicateFactor.hidden = true; var skipFactor = new ProtoBlock('skipfactor'); skipFactor.palette = palettes.dict['extras']; blocks.protoBlockDict['skipfactor'] = skipFactor; skipFactor.staticLabels.push(_('skip factor')); skipFactor.adjustWidthToLabel(); skipFactor.parameterBlock(); skipFactor.hidden = true; var elapsedNotes = new ProtoBlock('elapsednotes'); elapsedNotes.palette = palettes.dict['extras']; blocks.protoBlockDict['elapsednotes'] = elapsedNotes; //.TRANS: number of whole notes that have been played elapsedNotes.staticLabels.push(_('notes played')); elapsedNotes.adjustWidthToLabel(); elapsedNotes.parameterBlock(); elapsedNotes.hidden = true; var beatfactor = new ProtoBlock('beatfactor'); beatfactor.palette = palettes.dict['extras']; blocks.protoBlockDict['beatfactor'] = beatfactor; //.TRANS: number of beats per minute beatfactor.staticLabels.push(_('beat factor')); beatfactor.adjustWidthToLabel(); beatfactor.parameterBlock(); beatfactor.hidden = true; var bpmBlock = new ProtoBlock('bpmfactor'); bpmBlock.palette = palettes.dict['extras']; blocks.protoBlockDict['bpmfactor'] = bpmBlock; bpmBlock.staticLabels.push(_('beats per minute')); bpmBlock.adjustWidthToLabel(); bpmBlock.parameterBlock(); bpmBlock.hidden = true; var driftBlock = new ProtoBlock('drift'); driftBlock.palette = palettes.dict['extras']; blocks.protoBlockDict['drift'] = driftBlock; driftBlock.staticLabels.push(_('free time')); driftBlock.adjustWidthToLabel(); driftBlock.flowClampZeroArgBlock(); driftBlock.hidden = true; var osctimeBlock = new ProtoBlock('osctime'); osctimeBlock.palette = palettes.dict['extras']; blocks.protoBlockDict['osctime'] = osctimeBlock; //.TRANS: oscillator time (in micro seconds) osctimeBlock.staticLabels.push(_('osctime')); osctimeBlock.adjustWidthToLabel(); osctimeBlock.flowClampOneArgBlock(); osctimeBlock.defaults.push(200); osctimeBlock.hidden = true; var newswingBlock = new ProtoBlock('newswing2'); newswingBlock.palette = palettes.dict['extras']; blocks.protoBlockDict['newswing2'] = newswingBlock; newswingBlock.staticLabels.push(_('swing'), _('swing value'), _('note value')); newswingBlock.extraWidth = 20; newswingBlock.adjustWidthToLabel(); newswingBlock.flowClampTwoArgBlock(); newswingBlock.defaults.push(1 / 24); newswingBlock.defaults.push(1 / 8); newswingBlock.hidden = true; var setbpmBlock = new ProtoBlock('setbpm'); setbpmBlock.palette = palettes.dict['extras']; blocks.protoBlockDict['setbpm'] = setbpmBlock; setbpmBlock.staticLabels.push(_('beats per minute')); setbpmBlock.adjustWidthToLabel(); setbpmBlock.flowClampOneArgBlock(); setbpmBlock.defaults.push(90); setbpmBlock.hidden = true; var backwardBlock = new ProtoBlock('backward'); backwardBlock.palette = palettes.dict['extras']; blocks.protoBlockDict['backward'] = backwardBlock; backwardBlock.staticLabels.push(_('backward')); backwardBlock.adjustWidthToLabel(); backwardBlock.flowClampZeroArgBlock(); backwardBlock.hidden = true; var skipNotesBlock = new ProtoBlock('skipnotes'); skipNotesBlock.palette = palettes.dict['extras']; blocks.protoBlockDict['skipnotes'] = skipNotesBlock; skipNotesBlock.staticLabels.push(_('skip notes')); skipNotesBlock.adjustWidthToLabel(); skipNotesBlock.flowClampOneArgBlock(); skipNotesBlock.defaults.push(2); skipNotesBlock.hidden = true; var duplicateNotesBlock = new ProtoBlock('duplicatenotes'); duplicateNotesBlock.palette = palettes.dict['extras']; blocks.protoBlockDict['duplicatenotes'] = duplicateNotesBlock; duplicateNotesBlock.staticLabels.push(_('duplicate notes')); duplicateNotesBlock.adjustWidthToLabel(); duplicateNotesBlock.flowClampOneArgBlock(); duplicateNotesBlock.defaults.push(2); duplicateNotesBlock.hidden = true; var beatFactorBlock = new ProtoBlock('multiplybeatfactor'); beatFactorBlock.palette = palettes.dict['extras']; blocks.protoBlockDict['multiplybeatfactor'] = beatFactorBlock; //.TRANS: speed up note duration by some factor, e.g. convert 1/4 to 1/8 notes by using a factor of 2 beatFactorBlock.staticLabels.push(_('multiply beat value')); beatFactorBlock.adjustWidthToLabel(); beatFactorBlock.flowClampOneArgBlock(); beatFactorBlock.defaults.push(2); beatFactorBlock.hidden = true; var beatFactorBlock2 = new ProtoBlock('dividebeatfactor'); beatFactorBlock2.palette = palettes.dict['extras']; blocks.protoBlockDict['dividebeatfactor'] = beatFactorBlock2; //.TRANS: slow down note duration by some factor, e.g. convert 1/8 to 1/4 notes by using a factor of 2 beatFactorBlock2.staticLabels.push(_('divide beat value')); beatFactorBlock2.adjustWidthToLabel(); beatFactorBlock2.flowClampOneArgBlock(); beatFactorBlock2.defaults.push(2); beatFactorBlock2.hidden = true; var tieBlock = new ProtoBlock('tie'); tieBlock.palette = palettes.dict['extras']; blocks.protoBlockDict['tie'] = tieBlock; //.TRANS: tie notes together into one longer note tieBlock.staticLabels.push(_('tie')); tieBlock.adjustWidthToLabel(); tieBlock.flowClampZeroArgBlock(); tieBlock.hidden = true; var rhythmicdotBlock = new ProtoBlock('rhythmicdot'); rhythmicdotBlock.palette = palettes.dict['extras']; blocks.protoBlockDict['rhythmicdot'] = rhythmicdotBlock; rhythmicdotBlock.staticLabels.push(_('dot')); rhythmicdotBlock.adjustWidthToLabel(); rhythmicdotBlock.flowClampZeroArgBlock(); rhythmicdotBlock.hidden = true; var rest2Block = new ProtoBlock('rest2'); rest2Block.palette = palettes.dict['extras']; blocks.protoBlockDict['rest2'] = rest2Block; rest2Block.staticLabels.push(_('silence')); rest2Block.adjustWidthToLabel(); rest2Block.zeroArgBlock(); rest2Block.hidden = true; var newnoteBlock = new ProtoBlock('newnote'); newnoteBlock.palette = palettes.dict['extras']; blocks.protoBlockDict['newnote'] = newnoteBlock; newnoteBlock.staticLabels.push(_('note value')); newnoteBlock.adjustWidthToLabel(); newnoteBlock.flowClampOneArgBlock(); newnoteBlock.defaults.push(1 / 4); newnoteBlock.hidden = true; var setkey2Block = new ProtoBlock('setkey2'); setkey2Block.palette = palettes.dict['extras']; blocks.protoBlockDict['setkey2'] = setkey2Block; setkey2Block.staticLabels.push(_('set key'), _('key'), _('mode')); setkey2Block.adjustWidthToLabel(); setkey2Block.twoArgBlock(); setkey2Block.dockTypes[1] = 'anyin'; setkey2Block.dockTypes[2] = 'anyin'; setkey2Block.hidden = true; var keyBlock = new ProtoBlock('key'); keyBlock.palette = palettes.dict['extras']; blocks.protoBlockDict['key'] = keyBlock; keyBlock.staticLabels.push(_('key')); keyBlock.adjustWidthToLabel(); keyBlock.parameterBlock(); keyBlock.hidden = true; var meter = new ProtoBlock('meter'); meter.palette = palettes.dict['extras']; blocks.protoBlockDict['meter'] = meter; meter.hidden = true; meter.staticLabels.push(_('meter'), _('numerator'), _('denominator')); meter.adjustWidthToLabel(); meter.defaults.push(3); meter.defaults.push(4); meter.twoArgMathBlock(); meter.dockTypes[1] = 'number'; meter.dockTypes[2] = 'number'; meter.hidden = true; var setMasterBPMBlock = new ProtoBlock('setmasterbpm'); setMasterBPMBlock.palette = palettes.dict['extras']; blocks.protoBlockDict['setmasterbpm'] = setMasterBPMBlock; setMasterBPMBlock.staticLabels.push(_('master beats per minute')); setMasterBPMBlock.adjustWidthToLabel(); setMasterBPMBlock.oneArgBlock(); setMasterBPMBlock.defaults.push(90); setMasterBPMBlock.hidden = true; var voicenameBlock = new ProtoBlock('voicename'); voicenameBlock.palette = palettes.dict['extras']; blocks.protoBlockDict['voicename'] = voicenameBlock; voicenameBlock.valueBlock(); voicenameBlock.dockTypes[0] = 'textout'; voicenameBlock.hidden = true; var vibratoBlock = new ProtoBlock('vibrato'); vibratoBlock.palette = palettes.dict['extras']; blocks.protoBlockDict['vibrato'] = vibratoBlock; vibratoBlock.staticLabels.push(_('vibrato'), _('intensity'), _('rate')); vibratoBlock.adjustWidthToLabel(); vibratoBlock.flowClampTwoArgBlock(); vibratoBlock.defaults.push(10); vibratoBlock.defaults.push(1 / 16); vibratoBlock.hidden = true; var voiceBlock = new ProtoBlock('setvoice'); voiceBlock.palette = palettes.dict['extras']; blocks.protoBlockDict['setvoice'] = voiceBlock; voiceBlock.staticLabels.push(_('set synth')); voiceBlock.adjustWidthToLabel(); voiceBlock.flowClampOneArgBlock(); voiceBlock.dockTypes[1] = 'textin'; voiceBlock.defaults.push(_('violin')); voiceBlock.hidden = true; var articulationBlock = new ProtoBlock('articulation'); articulationBlock.palette = palettes.dict['extras']; blocks.protoBlockDict['articulation'] = articulationBlock; articulationBlock.staticLabels.push(_('set relative volume')); articulationBlock.adjustWidthToLabel(); articulationBlock.flowClampOneArgBlock(); articulationBlock.defaults.push(25); articulationBlock.hidden = true; var noteVolumeBlock2 = new ProtoBlock('setnotevolume2'); noteVolumeBlock2.palette = palettes.dict['extras']; blocks.protoBlockDict['setnotevolume2'] = noteVolumeBlock2; noteVolumeBlock2.staticLabels.push(_('set volume')); noteVolumeBlock2.adjustWidthToLabel(); noteVolumeBlock2.flowClampOneArgBlock(); noteVolumeBlock2.defaults.push(50); noteVolumeBlock2.hidden = true; var crescendoBlock = new ProtoBlock('crescendo'); crescendoBlock.palette = palettes.dict['extras']; blocks.protoBlockDict['crescendo'] = crescendoBlock; crescendoBlock.staticLabels.push(_('crescendo')+" +/-"); crescendoBlock.adjustWidthToLabel(); crescendoBlock.flowClampOneArgBlock(); crescendoBlock.defaults.push(5); crescendoBlock.hidden = true; var newslurBlock = new ProtoBlock('newslur'); newslurBlock.palette = palettes.dict['extras']; blocks.protoBlockDict['newslur'] = newslurBlock; newslurBlock.staticLabels.push(_('slur')); newslurBlock.adjustWidthToLabel(); newslurBlock.flowClampOneArgBlock(); newslurBlock.defaults.push(1 / 16); newslurBlock.hidden = true; var newstaccatoBlock = new ProtoBlock('newstaccato'); newstaccatoBlock.palette = palettes.dict['extras']; blocks.protoBlockDict['newstaccato'] = newstaccatoBlock; newstaccatoBlock.staticLabels.push(_('staccato')); newstaccatoBlock.adjustWidthToLabel(); newstaccatoBlock.flowClampOneArgBlock(); newstaccatoBlock.defaults.push(1 / 32); newstaccatoBlock.hidden = true; var diminishedxBlock = new ProtoBlock('diminishedx'); diminishedxBlock.palette = palettes.dict['extras']; blocks.protoBlockDict['diminishedx'] = diminishedxBlock; diminishedxBlock.staticLabels.push(_('diminished'), _('interval'), _('octave') + '+/-'); diminishedxBlock.extraWidth = 20; diminishedxBlock.adjustWidthToLabel(); diminishedxBlock.flowClampTwoArgBlock(); diminishedxBlock.dockTypes[2] = 'anyin'; diminishedxBlock.defaults.push(5); diminishedxBlock.defaults.push(0); diminishedxBlock.hidden = true; var augmentedxBlock = new ProtoBlock('augmentedx'); augmentedxBlock.palette = palettes.dict['extras']; blocks.protoBlockDict['augmentedx'] = augmentedxBlock; augmentedxBlock.staticLabels.push(_('augmented'), _('interval'), _('octave') + '+/-'); augmentedxBlock.extraWidth = 20; augmentedxBlock.adjustWidthToLabel(); augmentedxBlock.flowClampTwoArgBlock(); augmentedxBlock.dockTypes[2] = 'anyin'; augmentedxBlock.defaults.push(5); augmentedxBlock.defaults.push(0); augmentedxBlock.hidden = true; var perfectxBlock = new ProtoBlock('perfectx'); perfectxBlock.palette = palettes.dict['extras']; blocks.protoBlockDict['perfectx'] = perfectxBlock; perfectxBlock.staticLabels.push(_('perfect'), _('interval'), _('octave') + '+/-'); perfectxBlock.extraWidth = 20; perfectxBlock.adjustWidthToLabel(); perfectxBlock.flowClampTwoArgBlock(); perfectxBlock.dockTypes[2] = 'anyin'; perfectxBlock.defaults.push(5); perfectxBlock.defaults.push(0); perfectxBlock.hidden = true; var minorxBlock = new ProtoBlock('minorx'); minorxBlock.palette = palettes.dict['extras']; blocks.protoBlockDict['minorx'] = minorxBlock; minorxBlock.staticLabels.push(_('minor'), _('interval'), _('octave') + '+/-'); minorxBlock.extraWidth = 20; minorxBlock.adjustWidthToLabel(); minorxBlock.flowClampTwoArgBlock(); minorxBlock.dockTypes[2] = 'anyin'; minorxBlock.defaults.push(3); minorxBlock.defaults.push(0); minorxBlock.hidden = true; var majorxBlock = new ProtoBlock('majorx'); majorxBlock.palette = palettes.dict['extras']; blocks.protoBlockDict['majorx'] = majorxBlock; majorxBlock.staticLabels.push(_('major'), _('interval'), _('octave') + '+/-'); majorxBlock.extraWidth = 20; majorxBlock.adjustWidthToLabel(); majorxBlock.flowClampTwoArgBlock(); majorxBlock.dockTypes[2] = 'anyin'; majorxBlock.defaults.push(3); majorxBlock.defaults.push(0); majorxBlock.hidden = true; var intervalBlock = new ProtoBlock('interval'); intervalBlock.palette = palettes.dict['extras']; blocks.protoBlockDict['interval'] = intervalBlock; //.TRANS: calculate a relative step between notes based on the current mode intervalBlock.staticLabels.push(_('relative interval')); intervalBlock.adjustWidthToLabel(); intervalBlock.flowClampOneArgBlock(); intervalBlock.defaults.push(5); intervalBlock.hidden = true; var drumnameBlock = new ProtoBlock('drumname'); drumnameBlock.palette = palettes.dict['extras']; blocks.protoBlockDict['drumname'] = drumnameBlock; drumnameBlock.valueBlock(); drumnameBlock.dockTypes[0] = 'textout'; drumnameBlock.hidden = true; var setdrumBlock = new ProtoBlock('setdrum'); setdrumBlock.palette = palettes.dict['extras']; blocks.protoBlockDict['setdrum'] = setdrumBlock; //.TRANS: set the current drum sound for playback setdrumBlock.staticLabels.push(_('set drum')); setdrumBlock.adjustWidthToLabel(); setdrumBlock.flowClampOneArgBlock(); setdrumBlock.dockTypes[1] = 'anyin'; setdrumBlock.hidden = true; var playdrumBlock = new ProtoBlock('playdrum'); playdrumBlock.palette = palettes.dict['extras']; blocks.protoBlockDict['playdrum'] = playdrumBlock; playdrumBlock.staticLabels.push(_('drum')); playdrumBlock.adjustWidthToLabel(); playdrumBlock.oneArgBlock(); playdrumBlock.dockTypes[1] = 'anyin'; playdrumBlock.hidden = true; var lilypondBlock = new ProtoBlock('savelilypond'); lilypondBlock.palette = palettes.dict['extras']; blocks.protoBlockDict['savelilypond'] = lilypondBlock; lilypondBlock.staticLabels.push(_('save as lilypond')); lilypondBlock.adjustWidthToLabel(); lilypondBlock.oneArgBlock(); lilypondBlock.defaults.push(_('title') + '.ly'); lilypondBlock.dockTypes[1] = 'textin'; lilypondBlock.hidden = true; var notevolumeFactor = new ProtoBlock('notevolumefactor'); notevolumeFactor.palette = palettes.dict['extras']; blocks.protoBlockDict['notevolumefactor'] = notevolumeFactor; //.TRANS: the volume at which notes are played notevolumeFactor.staticLabels.push(_('note volume')); notevolumeFactor.adjustWidthToLabel(); notevolumeFactor.parameterBlock(); // Push protoblocks onto their palettes. for (var protoblock in blocks.protoBlockDict) { if (blocks.protoBlockDict[protoblock].palette != null) { blocks.protoBlockDict[protoblock].palette.add(blocks.protoBlockDict[protoblock]); } } // Populate the lists of block types. blocks.findBlockTypes(); }