diff --git a/js/js-export/__tests__/ast2blocklist.test.js b/js/js-export/__tests__/ast2blocklist.test.js index 2b578d9455..4eec94048f 100644 --- a/js/js-export/__tests__/ast2blocklist.test.js +++ b/js/js-export/__tests__/ast2blocklist.test.js @@ -1563,4 +1563,37 @@ describe("AST2BlockList Class", () => { let blockList = AST2BlockList.toBlockList(AST, config); expect(blockList).toEqual(expectedBlockList); }); + + test("should generate heap blocks from JS", () => { + const code = ` + new Mouse(async mouse => { + await mouse.print(mouse.HEAP); + await mouse.print(mouse.HEAPLENGTH); + await mouse.print(mouse.HEAPEMPTY); + await mouse.emptyHeap(); + await mouse.reverseHeap(); + await mouse.push(9); + await mouse.setHeapEntry(2, 5); + return mouse.ENDMOUSE; + }); + MusicBlocks.run();`; + + const AST = acorn.parse(code, { ecmaVersion: 2020 }); + let blockList = AST2BlockList.toBlockList(AST, config); + const blockNames = blockList.map(block => + Array.isArray(block[1]) ? block[1][0] : block[1] + ); + + expect(blockNames).toEqual( + expect.arrayContaining([ + "heap", + "heapLength", + "heapEmpty", + "emptyHeap", + "reverseHeap", + "push", + "setHeapEntry" + ]) + ); + }); }); diff --git a/js/js-export/__tests__/export.test.js b/js/js-export/__tests__/export.test.js index 98b6a9fb97..5918b12242 100644 --- a/js/js-export/__tests__/export.test.js +++ b/js/js-export/__tests__/export.test.js @@ -47,6 +47,7 @@ const globalActivity = { logo: { prepSynths: jest.fn(), firstNoteTime: null, + turtleHeaps: {}, stage: { removeEventListener: jest.fn() } @@ -138,6 +139,7 @@ describe("MusicBlocks Class", () => { doWait: jest.fn(), container: { x: 10, y: 20 } }); + globalActivity.turtles.getIndexOfTurtle.mockReturnValue(0); mouse = new Mouse(jest.fn()); mouse.run = jest.fn(); musicBlocks = new MusicBlocks(mouse); @@ -236,6 +238,47 @@ describe("MusicBlocks Class", () => { expect(musicBlocks.GREY).toBe(75); }); + describe("Heap helpers", () => { + test("should get HEAP as JSON string", () => { + globalActivity.logo.turtleHeaps[musicBlocks.turIndex] = [1, 2, 3]; + expect(musicBlocks.HEAP).toBe(JSON.stringify([1, 2, 3])); + }); + + test("should get HEAPLENGTH", () => { + globalActivity.logo.turtleHeaps[musicBlocks.turIndex] = [1, 2, 3, 4]; + expect(musicBlocks.HEAPLENGTH).toBe(4); + }); + + test("should get HEAPEMPTY when heap is missing", () => { + delete globalActivity.logo.turtleHeaps[musicBlocks.turIndex]; + expect(musicBlocks.HEAPEMPTY).toBe(true); + }); + + test("should emptyHeap", () => { + globalActivity.logo.turtleHeaps[musicBlocks.turIndex] = [1, 2]; + musicBlocks.emptyHeap(); + expect(globalActivity.logo.turtleHeaps[musicBlocks.turIndex]).toEqual([]); + }); + + test("should reverseHeap", () => { + globalActivity.logo.turtleHeaps[musicBlocks.turIndex] = [1, 2, 3]; + musicBlocks.reverseHeap(); + expect(globalActivity.logo.turtleHeaps[musicBlocks.turIndex]).toEqual([3, 2, 1]); + }); + + test("should setHeapEntry", () => { + globalActivity.logo.turtleHeaps[musicBlocks.turIndex] = []; + musicBlocks.setHeapEntry(2, 5); + expect(globalActivity.logo.turtleHeaps[musicBlocks.turIndex]).toEqual([0, 5]); + }); + + test("should push to heap", () => { + globalActivity.logo.turtleHeaps[musicBlocks.turIndex] = [1]; + musicBlocks.push(2); + expect(globalActivity.logo.turtleHeaps[musicBlocks.turIndex]).toEqual([1, 2]); + }); + }); + test("should get NOTEVALUE", () => { Singer.RhythmActions.getNoteValue.mockReturnValue(1); expect(musicBlocks.NOTEVALUE).toBe(1); diff --git a/js/js-export/__tests__/interface.test.js b/js/js-export/__tests__/interface.test.js index 525133febd..a7d6911a07 100644 --- a/js/js-export/__tests__/interface.test.js +++ b/js/js-export/__tests__/interface.test.js @@ -46,6 +46,10 @@ describe("JSInterface", () => { expect(JSInterface.isGetter("mynotevalue")).toBe(true); }); + it("should return true for heap getters", () => { + expect(JSInterface.isGetter("heapLength")).toBe(true); + }); + it("should return false for a block that is not a getter", () => { expect(JSInterface.isGetter("pickup")).toBe(false); }); @@ -56,6 +60,14 @@ describe("JSInterface", () => { expect(JSInterface.isMethod("newnote")).toBe(true); }); + it("should return true for heap methods", () => { + expect(JSInterface.isMethod("emptyHeap")).toBe(true); + }); + + it("should return true for heap push method", () => { + expect(JSInterface.isMethod("push")).toBe(true); + }); + it("should return false for a block that is not a method", () => { expect(JSInterface.isMethod("pickup")).toBe(false); }); @@ -86,6 +98,10 @@ describe("JSInterface", () => { expect(JSInterface.getGetterName("mynotevalue")).toBe("NOTEVALUE"); }); + it("should return the correct heap getter name when available", () => { + expect(JSInterface.getGetterName("heapLength")).toBe("HEAPLENGTH"); + }); + it("should return null when no getter exists for the given block", () => { expect(JSInterface.getGetterName("pickup")).toBeNull(); }); @@ -96,6 +112,14 @@ describe("JSInterface", () => { expect(JSInterface.getMethodName("newnote")).toBe("playNote"); }); + it("should return the correct heap method name when available", () => { + expect(JSInterface.getMethodName("emptyHeap")).toBe("emptyHeap"); + }); + + it("should return the correct heap push method name when available", () => { + expect(JSInterface.getMethodName("push")).toBe("push"); + }); + it("should return null when no method exists for the given block", () => { expect(JSInterface.getMethodName("pickup")).toBeNull(); }); diff --git a/js/js-export/ast2blocks.json b/js/js-export/ast2blocks.json index e48a76df70..fd6d271bba 100644 --- a/js/js-export/ast2blocks.json +++ b/js/js-export/ast2blocks.json @@ -241,14 +241,17 @@ "name_map": { "MODELENGTH": "modelength", "SCALARCHANGEINPITCH": "deltapitch2", - "CHANGEINPITCH": "deltapitch", - "CURRENTKEY": "currentkey", - "CURRENTMODE": "currentmode", - "X": "x", - "Y": "y", - "GREY": "grey", - "SHADE": "shade", - "PENSIZE": "pensize", + "CHANGEINPITCH": "deltapitch", + "CURRENTKEY": "currentkey", + "CURRENTMODE": "currentmode", + "X": "x", + "Y": "y", + "HEAP": "heap", + "HEAPLENGTH": "heapLength", + "HEAPEMPTY": "heapEmpty", + "GREY": "grey", + "SHADE": "shade", + "PENSIZE": "pensize", "COLOR": "color", "BEATCOUNT": "nopValueBlock", "MEASURECOUNT": "nopValueBlock", @@ -3699,6 +3702,221 @@ "next_sibling" ] }, + { + "name": "emptyHeap", + "comment": "Empty heap block", + "ast": { + "identifiers": [ + { + "property": "type", + "value": "ExpressionStatement" + }, + { + "property": "expression.type", + "value": "AwaitExpression" + }, + { + "property": "expression.argument.type", + "value": "CallExpression" + }, + { + "property": "expression.argument.callee.type", + "value": "MemberExpression" + }, + { + "property": "expression.argument.callee.property.name", + "value": "emptyHeap" + } + ] + }, + "blocklist_connections": [ + "parent_or_previous_sibling", + "next_sibling" + ] + }, + { + "name": "reverseHeap", + "comment": "Reverse heap block", + "ast": { + "identifiers": [ + { + "property": "type", + "value": "ExpressionStatement" + }, + { + "property": "expression.type", + "value": "AwaitExpression" + }, + { + "property": "expression.argument.type", + "value": "CallExpression" + }, + { + "property": "expression.argument.callee.type", + "value": "MemberExpression" + }, + { + "property": "expression.argument.callee.property.name", + "value": "reverseHeap" + } + ] + }, + "blocklist_connections": [ + "parent_or_previous_sibling", + "next_sibling" + ] + }, + { + "name": "push", + "comment": "Push heap block", + "arguments": [ + { + "type": "ValueExpression" + } + ], + "ast": { + "identifiers": [ + { + "property": "type", + "value": "ExpressionStatement" + }, + { + "property": "expression.type", + "value": "AwaitExpression" + }, + { + "property": "expression.argument.type", + "value": "CallExpression" + }, + { + "property": "expression.argument.callee.type", + "value": "MemberExpression" + }, + { + "property": "expression.argument.callee.property.name", + "value": "push" + }, + { + "property": "expression.argument.arguments", + "size": 1 + } + ], + "argument_properties": [ + "expression.argument.arguments[0]" + ] + }, + "blocklist_connections": [ + "parent_or_previous_sibling", + "argument", + "next_sibling" + ] + }, + { + "name": "setHeapEntry", + "comment": "Set heap entry block", + "arguments": [ + { + "type": "NumberExpression" + }, + { + "type": "NumberExpression" + } + ], + "ast": { + "identifiers": [ + { + "property": "type", + "value": "ExpressionStatement" + }, + { + "property": "expression.type", + "value": "AwaitExpression" + }, + { + "property": "expression.argument.type", + "value": "CallExpression" + }, + { + "property": "expression.argument.callee.type", + "value": "MemberExpression" + }, + { + "property": "expression.argument.callee.property.name", + "value": "setHeapEntry" + }, + { + "property": "expression.argument.arguments", + "size": 2 + } + ], + "argument_properties": [ + "expression.argument.arguments[0]", + "expression.argument.arguments[1]" + ] + }, + "blocklist_connections": [ + "parent_or_previous_sibling", + "argument", + "argument", + "next_sibling" + ], + "default_vspaces": { + "body": 2 + } + }, + { + "name": "setHeapEntry", + "comment": "Set heap entry block (alias)", + "arguments": [ + { + "type": "NumberExpression" + }, + { + "type": "NumberExpression" + } + ], + "ast": { + "identifiers": [ + { + "property": "type", + "value": "ExpressionStatement" + }, + { + "property": "expression.type", + "value": "AwaitExpression" + }, + { + "property": "expression.argument.type", + "value": "CallExpression" + }, + { + "property": "expression.argument.callee.type", + "value": "MemberExpression" + }, + { + "property": "expression.argument.callee.property.name", + "value": "setHeap" + }, + { + "property": "expression.argument.arguments", + "size": 2 + } + ], + "argument_properties": [ + "expression.argument.arguments[0]", + "expression.argument.arguments[1]" + ] + }, + "blocklist_connections": [ + "parent_or_previous_sibling", + "argument", + "argument", + "next_sibling" + ], + "default_vspaces": { + "body": 2 + } + }, { "name": "debugger", "comment": "Debugger block", @@ -3774,4 +3992,4 @@ } } ] -} \ No newline at end of file +} diff --git a/js/js-export/ast2blocks.min.json b/js/js-export/ast2blocks.min.json index 1f25517fac..50affbd2cf 100644 --- a/js/js-export/ast2blocks.min.json +++ b/js/js-export/ast2blocks.min.json @@ -1 +1 @@ -{"default_connections":["parent_or_previous_sibling","argument","first_child","next_sibling"],"argument_blocks":[{"comment":"Variable name like 'box1' in the Boxes palette or action name like 'action' in the Action palette","ast":{"identifiers":[{"property":"type","value":"Identifier"}],"identifier_property":"name"}},{"comment":"Number expression like '1 / 4' in the Number palette or boolean expressions like 'box1 >= 0' in the Boolean palette","ast":{"identifiers":[{"property":"type","value":"BinaryExpression"}],"name_property":"operator","argument_properties":["left","right"]},"name_map":{"+":"plus","-":"minus","*":"multiply","/":"divide","%":"mod","==":"equal","!=":"not_equal_to","<":"less",">":"greater","<=":"less_than_or_equal_to",">=":"greater_than_or_equal_to","|":"or","&":"and","^":"xor"}},{"comment":"Unary expressions such as ! in boolean palette or - in number palette","ast":{"identifiers":[{"property":"type","value":"UnaryExpression"}],"name_property":"operator","argument_properties":["argument"]},"name_map":{"-":"neg","!":"not"}},{"comment":"Literals such as numbers or booleans or strings","ast":{"identifiers":[{"property":"type","value":"Literal"}],"value_property":"value"}},{"comment":"Dictionary get function for 2 arguments","ast":{"identifiers":[{"property":"type","value":"AwaitExpression"},{"property":"argument.type","value":"CallExpression"},{"property":"argument.callee.type","value":"MemberExpression"},{"property":"argument.callee.property.name","value":"getValue"},{"property":"argument.arguments","size":2}],"name_property":"argument.callee.property.name","argument_properties":["argument.arguments[1]","argument.arguments[0]"]},"name_map":{"getValue":"getDict"}},{"comment":"Dictionary get function for 1 argument","ast":{"identifiers":[{"property":"type","value":"AwaitExpression"},{"property":"argument.type","value":"CallExpression"},{"property":"argument.callee.type","value":"MemberExpression"},{"property":"argument.callee.property.name","value":"getValue"},{"property":"argument.arguments","size":1}],"name_property":"argument.callee.property.name","argument_properties":["argument.arguments[0]"]},"name_map":{"getValue":"getDict2"}},{"comment":"Skip, this is for children","ast":{"identifiers":[{"property":"type","value":"ArrowFunctionExpression"}]}},{"comment":"Math operators such as absolute value or square","ast":{"identifiers":[{"property":"type","value":"CallExpression"},{"property":"callee.type","value":"MemberExpression"},{"property":"callee.object.type","value":"Identifier"},{"property":"callee.object.name","value":"Math"}],"name_property":"callee.property.name","arguments_property":"arguments"},"name_map":{"abs":"abs","floor":"int","pow":"power","sqrt":"sqrt"}},{"comment":"Math utility operators such as distance or random","ast":{"identifiers":[{"property":"type","value":"CallExpression"},{"property":"callee.type","value":"MemberExpression"},{"property":"callee.object.type","value":"Identifier"},{"property":"callee.object.name","value":"MathUtility"}],"name_property":"callee.property.name","arguments_property":"arguments"},"name_map":{"doCalculateDistance":"distance","doOneOf":"oneOf","doRandom":"random"}},{"comment":"Singular argument mouse blocks","ast":{"identifiers":[{"property":"type","value":"MemberExpression"},{"property":"object.name","value":"mouse"}],"name_property":"property.name","argument_properties":[]},"name_map":{"MODELENGTH":"modelength","SCALARCHANGEINPITCH":"deltapitch2","CHANGEINPITCH":"deltapitch","CURRENTKEY":"currentkey","CURRENTMODE":"currentmode","X":"x","Y":"y","GREY":"grey","SHADE":"shade","PENSIZE":"pensize","COLOR":"color","BEATCOUNT":"nopValueBlock","MEASURECOUNT":"nopValueBlock","BPM":"nopValueBlock","BEATFACTOR":"beatfactor","NOTEVALUE":"notevalue"}},{"comment":"Get synth volume value","ast":{"identifiers":[{"property":"type","value":"CallExpression"},{"property":"callee.name","value":"getSynthVolume"}],"name_property":"callee.name","argument_properties":["arguments[0]"]},"name_map":{"getSynthVolume":"synthvolumefactor"}},{"comment":"Number to pitch/octave conversion","ast":{"identifiers":[{"property":"type","value":"CallExpression"}],"name_property":"callee.name","argument_properties":["arguments[0]"]},"name_map":{"numToOctave":"number2octave","numToPitch":"number2pitch"}}],"body_blocks":[{"comment":"run is ignored","ast":{"identifiers":[{"property":"type","value":"ExpressionStatement"},{"property":"expression.type","value":"CallExpression"},{"property":"expression.callee.type","value":"MemberExpression"},{"property":"expression.callee.object.name","value":"MusicBlocks"},{"property":"expression.callee.property.name","value":"run"}]}},{"name":"storein2","comment":"Variable assignment in the Boxes palette like 'var box1 = 2 * 5;'","arguments":[{"type":"ValueExpression"}],"ast":{"identifiers":[{"property":"type","value":"VariableDeclaration"},{"property":"declarations[0].init.type","value":"Literal"},{"property":"declarations[0].init.type","value":"BinaryExpression"},{"property":"declarations[0].init.type","value":"UnaryExpression"},{"property":"declarations[0].init.type","value":"CallExpression"}],"name_property":"declarations[0].id.name","argument_properties":["declarations[0].init"]},"blocklist_connections":["parent_or_previous_sibling","argument","next_sibling"]},{"name":"decrementOne","comment":"Decrement by one block in the Boxes palette 'box1 = box1 - 1;'","arguments":[{"type":"namedbox"}],"ast":{"identifiers":[{"property":"type","value":"ExpressionStatement"},{"property":"expression.type","value":"AssignmentExpression"},{"property":"expression.right.type","value":"BinaryExpression"},{"property":"expression.right.operator","value":"-"},{"property":"expression.right.right.value","value":1}],"argument_properties":["expression.left"]},"blocklist_connections":["parent_or_previous_sibling","argument","next_sibling"]},{"name":"increment","comment":"Increment block in the Boxes palette 'box1 = box1 + 3;'","arguments":[{"type":"namedbox"},{"type":"NumberExpression"}],"ast":{"identifiers":[{"property":"type","value":"ExpressionStatement"},{"property":"expression.type","value":"AssignmentExpression"},{"property":"expression.right.type","value":"BinaryExpression"},{"property":"expression.right.operator","value":"+"}],"argument_properties":["expression.left","expression.right.right"]},"blocklist_connections":["parent_or_previous_sibling","argument","argument","next_sibling"],"default_vspaces":{"body":2}},{"name":"settimbre","comment":"Set instrument block","arguments":[{"type":"voicename"}],"ast":{"identifiers":[{"property":"type","value":"ExpressionStatement"},{"property":"expression.type","value":"AwaitExpression"},{"property":"expression.argument.type","value":"CallExpression"},{"property":"expression.argument.callee.type","value":"MemberExpression"},{"property":"expression.argument.callee.property.name","value":"setInstrument"}],"argument_properties":["expression.argument.arguments[0]"],"children_properties":["expression.argument.arguments[1].body.body"]},"default_vspaces":{"argument":1}},{"name":"tie","comment":"Tie block in the Rhythm palette","ast":{"identifiers":[{"property":"type","value":"ExpressionStatement"},{"property":"expression.type","value":"AwaitExpression"},{"property":"expression.argument.type","value":"CallExpression"},{"property":"expression.argument.callee.type","value":"MemberExpression"},{"property":"expression.argument.callee.property.name","value":"tie"}],"children_properties":["expression.argument.arguments[0].body.body"]},"blocklist_connections":["parent_or_previous_sibling","first_child","next_sibling"],"default_vspaces":{"argument":0}},{"name":"newswing2","comment":"Swing block in the Rhythm palette","arguments":[{"type":"NumberExpression"},{"type":"NumberExpression"}],"ast":{"identifiers":[{"property":"type","value":"ExpressionStatement"},{"property":"expression.type","value":"AwaitExpression"},{"property":"expression.argument.type","value":"CallExpression"},{"property":"expression.argument.callee.type","value":"MemberExpression"},{"property":"expression.argument.callee.property.name","value":"swing"}],"argument_properties":["expression.argument.arguments[0]","expression.argument.arguments[1]"],"children_properties":["expression.argument.arguments[2].body.body"]},"blocklist_connections":["parent_or_previous_sibling","argument","argument","first_child","next_sibling"],"default_vspaces":{"argument":2}},{"name":"pitch","comment":"Pitch block","arguments":[{"type":"note_or_solfege"},{"type":"NumberExpression"}],"ast":{"identifiers":[{"property":"type","value":"ExpressionStatement"},{"property":"expression.type","value":"AwaitExpression"},{"property":"expression.argument.type","value":"CallExpression"},{"property":"expression.argument.callee.type","value":"MemberExpression"},{"property":"expression.argument.callee.property.name","value":"playPitch"}],"argument_properties":["expression.argument.arguments[0]","expression.argument.arguments[1]"]},"blocklist_connections":["parent_or_previous_sibling","argument","argument","next_sibling"],"default_vspaces":{"body":2}},{"name":"hertz","comment":"Hertz block","arguments":[{"type":"NumberExpression"}],"ast":{"identifiers":[{"property":"type","value":"ExpressionStatement"},{"property":"expression.type","value":"AwaitExpression"},{"property":"expression.argument.type","value":"CallExpression"},{"property":"expression.argument.callee.type","value":"MemberExpression"},{"property":"expression.argument.callee.property.name","value":"playHertz"}],"argument_properties":["expression.argument.arguments[0]"]},"blocklist_connections":["parent_or_previous_sibling","argument","next_sibling"]},{"name":"rest2","comment":"Rest block","ast":{"identifiers":[{"property":"type","value":"ExpressionStatement"},{"property":"expression.type","value":"AwaitExpression"},{"property":"expression.argument.type","value":"CallExpression"},{"property":"expression.argument.callee.type","value":"MemberExpression"},{"property":"expression.argument.callee.property.name","value":"playRest"}]},"blocklist_connections":["parent_or_previous_sibling","next_sibling"]},{"name":"nameddo","comment":"Action palette, async block","ast":{"identifiers":[{"property":"type","value":"ExpressionStatement"},{"property":"expression.type","value":"AwaitExpression"},{"property":"expression.argument.type","value":"CallExpression"},{"property":"expression.argument.callee.type","value":"Identifier"}],"name_property":"expression.argument.callee.name"},"blocklist_connections":["parent_or_previous_sibling","next_sibling"]},{"name":"start","comment":"Start block in the Flow palette","ast":{"identifiers":[{"property":"type","value":"ExpressionStatement"},{"property":"expression.type","value":"NewExpression"}],"children_properties":["expression.arguments[0].body.body"]},"blocklist_connections":["parent_or_previous_sibling","first_child","next_sibling"],"default_vspaces":{"argument":1}},{"name":"action","comment":"Action block in the Action palette","arguments":[{"type":"text"}],"ast":{"identifiers":[{"property":"type","value":"VariableDeclaration"},{"property":"declarations[0].init.type","value":"ArrowFunctionExpression"}],"argument_properties":["declarations[0].id"],"children_properties":["declarations[0].init.body.body"]},"default_vspaces":{"argument":1}},{"name":"repeat","comment":"Repeat block in the Flow palette","arguments":[{"type":"NumberExpression"}],"ast":{"identifiers":[{"property":"type","value":"ForStatement"}],"argument_properties":["test.right"],"children_properties":["body.body"]},"default_vspaces":{"argument":1}},{"name":"forever","comment":"Forever block in the Flow palette","ast":{"identifiers":[{"property":"type","value":"WhileStatement"},{"property":"test.raw","value":"1000"}],"children_properties":["body.body"]},"blocklist_connections":["parent_or_previous_sibling","first_child","next_sibling"],"default_vspaces":{"argument":1}},{"name":"while","comment":"While block in the Flow palette","arguments":[{"type":"BooleanExpression"}],"ast":{"identifiers":[{"property":"type","value":"WhileStatement"}],"argument_properties":["test"],"children_properties":["body.body"]},"default_vspaces":{"argument":2}},{"name":"until","comment":"Do While block in the Flow palette","arguments":[{"type":"BooleanExpression"}],"ast":{"identifiers":[{"property":"type","value":"DoWhileStatement"}],"argument_properties":["test"],"children_properties":["body.body"]},"default_vspaces":{"argument":2}},{"name":"switch","comment":"Switch block in the Flow palette","arguments":[{"type":"NumberExpression"}],"ast":{"identifiers":[{"property":"type","value":"SwitchStatement"}],"argument_properties":["discriminant"],"children_properties":["cases"]},"default_vspaces":{"argument":1}},{"name":"defaultcase","comment":"Default case block in the Flow palette","ast":{"identifiers":[{"property":"type","value":"SwitchCase"},{"property":"test","has_value":false}],"children_properties":["consequent"]},"blocklist_connections":["parent_or_previous_sibling","first_child","next_sibling"],"default_vspaces":{"argument":1}},{"name":"case","comment":"Case block in the Flow palette","arguments":[{"type":"NumberExpression"}],"ast":{"identifiers":[{"property":"type","value":"SwitchCase"},{"property":"test.type","value":"Literal"}],"argument_properties":["test"],"children_properties":["consequent"]},"default_vspaces":{"argument":1}},{"name":"break","comment":"Break block in the Flow palette","ast":{"identifiers":[{"property":"type","value":"BreakStatement"}]},"blocklist_connections":["parent_or_previous_sibling","next_sibling"]},{"name":"if","comment":"Basic if block in the Flow palette","arguments":[{"type":"BooleanExpression"}],"ast":{"identifiers":[{"property":"type","value":"IfStatement"},{"property":"alternate","has_value":false}],"argument_properties":["test"],"children_properties":["consequent.body"]},"default_vspaces":{"argument":2}},{"name":"ifthenelse","comment":"If-then-else block in the Flow palette","arguments":[{"type":"BooleanExpression"}],"ast":{"identifiers":[{"property":"type","value":"IfStatement"},{"property":"alternate","has_value":true}],"argument_properties":["test"],"children_properties":["consequent.body","alternate.body"]},"blocklist_connections":["parent_or_previous_sibling","argument","first_child","second_child","next_sibling"],"default_vspaces":{"argument":2}},{"name":"setDict","comment":"Set value block for dictionary, with specific dictionary","arguments":[{"type":"text"},{"type":"text"},{"type":"NumberExpression"}],"ast":{"identifiers":[{"property":"type","value":"ExpressionStatement"},{"property":"expression.type","value":"AwaitExpression"},{"property":"expression.argument.type","value":"CallExpression"},{"property":"expression.argument.callee.type","value":"MemberExpression"},{"property":"expression.argument.callee.property.name","value":"setValue"},{"property":"expression.argument.arguments","size":3}],"argument_properties":["expression.argument.arguments[2]","expression.argument.arguments[0]","expression.argument.arguments[1]"]},"blocklist_connections":["parent_or_previous_sibling","argument","argument","argument","next_sibling"],"default_vspaces":{"body":3}},{"name":"setDict2","comment":"Dictionary blocks, the set functions","arguments":[{"type":"text"},{"type":"NumberExpression"}],"ast":{"identifiers":[{"property":"type","value":"ExpressionStatement"},{"property":"expression.type","value":"AwaitExpression"},{"property":"expression.argument.type","value":"CallExpression"},{"property":"expression.argument.callee.type","value":"MemberExpression"},{"property":"expression.argument.callee.property.name","value":"setValue"},{"property":"expression.argument.arguments","size":2}],"argument_properties":["expression.argument.arguments[0]","expression.argument.arguments[1]"]},"blocklist_connections":["parent_or_previous_sibling","argument","argument","next_sibling"],"default_vspaces":{"body":2}},{"name":"meter","comment":"Set meter block from the meter palette","arguments":[{"type":"NumberExpression"},{"type":"NumberExpression"}],"ast":{"identifiers":[{"property":"type","value":"ExpressionStatement"},{"property":"expression.type","value":"AwaitExpression"},{"property":"expression.argument.type","value":"CallExpression"},{"property":"expression.argument.callee.type","value":"MemberExpression"},{"property":"expression.argument.callee.property.name","value":"setMeter"}],"argument_properties":["expression.argument.arguments[0]","expression.argument.arguments[1]"]},"blocklist_connections":["parent_or_previous_sibling","argument","argument","next_sibling"],"default_vspaces":{"body":2}},{"name":"pickup","comment":"PICKUP block from the meter palette","arguments":[{"type":"NumberExpression"}],"ast":{"identifiers":[{"property":"type","value":"ExpressionStatement"},{"property":"expression.type","value":"AssignmentExpression"},{"property":"expression.operator","value":"="},{"property":"expression.left.type","value":"MemberExpression"},{"property":"expression.left.property.name","value":"PICKUP"}],"argument_properties":["expression.right"]},"blocklist_connections":["parent_or_previous_sibling","argument","next_sibling"]},{"name":"setbpm3","comment":"Set BPM block from the meter palette","arguments":[{"type":"NumberExpression"},{"type":"NumberExpression"}],"ast":{"identifiers":[{"property":"type","value":"ExpressionStatement"},{"property":"expression.type","value":"AwaitExpression"},{"property":"expression.argument.type","value":"CallExpression"},{"property":"expression.argument.callee.type","value":"MemberExpression"},{"property":"expression.argument.callee.property.name","value":"setBPM"}],"argument_properties":["expression.argument.arguments[0]","expression.argument.arguments[1]"]},"blocklist_connections":["parent_or_previous_sibling","argument","argument","next_sibling"],"default_vspaces":{"body":2}},{"name":"setmasterbpm2","comment":"Set master BPM block from the meter palette","arguments":[{"type":"NumberExpression"},{"type":"NumberExpression"}],"ast":{"identifiers":[{"property":"type","value":"ExpressionStatement"},{"property":"expression.type","value":"AwaitExpression"},{"property":"expression.argument.type","value":"CallExpression"},{"property":"expression.argument.callee.type","value":"MemberExpression"},{"property":"expression.argument.callee.property.name","value":"setMasterBPM"}],"argument_properties":["expression.argument.arguments[0]","expression.argument.arguments[1]"]},"blocklist_connections":["parent_or_previous_sibling","argument","argument","next_sibling"],"default_vspaces":{"body":2}},{"name":"everybeatdo","comment":"On every note do block from the meter palette","arguments":[{"type":"text"}],"ast":{"identifiers":[{"property":"type","value":"ExpressionStatement"},{"property":"expression.type","value":"AwaitExpression"},{"property":"expression.argument.type","value":"CallExpression"},{"property":"expression.argument.callee.type","value":"MemberExpression"},{"property":"expression.argument.callee.property.name","value":"onEveryNoteDo"}],"argument_properties":["expression.argument.arguments[0]"]},"blocklist_connections":["parent_or_previous_sibling","argument","next_sibling"]},{"name":"everybeatdonew","comment":"On every beat do block from the meter palette","arguments":[{"type":"text"}],"ast":{"identifiers":[{"property":"type","value":"ExpressionStatement"},{"property":"expression.type","value":"AwaitExpression"},{"property":"expression.argument.type","value":"CallExpression"},{"property":"expression.argument.callee.type","value":"MemberExpression"},{"property":"expression.argument.callee.property.name","value":"onEveryBeatDo"}],"argument_properties":["expression.argument.arguments[0]"]},"blocklist_connections":["parent_or_previous_sibling","argument","next_sibling"]},{"name":"onbeatdo","comment":"On strong beat do block from the meter palette","arguments":[{"type":"NumberExpression"},{"type":"text"}],"ast":{"identifiers":[{"property":"type","value":"ExpressionStatement"},{"property":"expression.type","value":"AwaitExpression"},{"property":"expression.argument.type","value":"CallExpression"},{"property":"expression.argument.callee.type","value":"MemberExpression"},{"property":"expression.argument.callee.property.name","value":"onStrongBeatDo"}],"argument_properties":["expression.argument.arguments[0]","expression.argument.arguments[1]"]},"blocklist_connections":["parent_or_previous_sibling","argument","argument","next_sibling"],"default_vspaces":{"body":2}},{"name":"offbeatdo","comment":"On weak beat do block from the meter palette","arguments":[{"type":"text"}],"ast":{"identifiers":[{"property":"type","value":"ExpressionStatement"},{"property":"expression.type","value":"AwaitExpression"},{"property":"expression.argument.type","value":"CallExpression"},{"property":"expression.argument.callee.type","value":"MemberExpression"},{"property":"expression.argument.callee.property.name","value":"onWeakBeatDo"}],"argument_properties":["expression.argument.arguments[0]"]},"blocklist_connections":["parent_or_previous_sibling","argument","next_sibling"]},{"name":"drift","comment":"No clock block from the meter palette","ast":{"identifiers":[{"property":"type","value":"ExpressionStatement"},{"property":"expression.type","value":"AwaitExpression"},{"property":"expression.argument.type","value":"CallExpression"},{"property":"expression.argument.callee.type","value":"MemberExpression"},{"property":"expression.argument.callee.property.name","value":"setNoClock"}],"children_properties":["expression.argument.arguments[0].body.body"]},"blocklist_connections":["parent_or_previous_sibling","first_child","next_sibling"],"default_vspaces":{"argument":1}},{"name":"steppitch","comment":"Step pitch block","arguments":[{"type":"NumberExpression"}],"ast":{"identifiers":[{"property":"type","value":"ExpressionStatement"},{"property":"expression.type","value":"AwaitExpression"},{"property":"expression.argument.type","value":"CallExpression"},{"property":"expression.argument.callee.type","value":"MemberExpression"},{"property":"expression.argument.callee.property.name","value":"stepPitch"}],"argument_properties":["expression.argument.arguments[0]"]},"blocklist_connections":["parent_or_previous_sibling","argument","next_sibling"]},{"name":"nthmodalpitch","comment":"Play nth modal pitch block","arguments":[{"type":"NumberExpression"},{"type":"NumberExpression"}],"ast":{"identifiers":[{"property":"type","value":"ExpressionStatement"},{"property":"expression.type","value":"AwaitExpression"},{"property":"expression.argument.type","value":"CallExpression"},{"property":"expression.argument.callee.type","value":"MemberExpression"},{"property":"expression.argument.callee.property.name","value":"playNthModalPitch"}],"argument_properties":["expression.argument.arguments[0]","expression.argument.arguments[1]"]},"blocklist_connections":["parent_or_previous_sibling","argument","argument","next_sibling"],"default_vspaces":{"body":2}},{"name":"pitchnumber","comment":"Play pitch number block","arguments":[{"type":"NumberExpression"}],"ast":{"identifiers":[{"property":"type","value":"ExpressionStatement"},{"property":"expression.type","value":"AwaitExpression"},{"property":"expression.argument.type","value":"CallExpression"},{"property":"expression.argument.callee.type","value":"MemberExpression"},{"property":"expression.argument.callee.property.name","value":"playPitchNumber"}],"argument_properties":["expression.argument.arguments[0]"]},"blocklist_connections":["parent_or_previous_sibling","argument","next_sibling"]},{"name":"accidental","comment":"Set accidental block","arguments":[{"type":"text"}],"ast":{"identifiers":[{"property":"type","value":"ExpressionStatement"},{"property":"expression.type","value":"AwaitExpression"},{"property":"expression.argument.type","value":"CallExpression"},{"property":"expression.argument.callee.type","value":"MemberExpression"},{"property":"expression.argument.callee.property.name","value":"setAccidental"}],"argument_properties":["expression.argument.arguments[0]"],"children_properties":["expression.argument.arguments[1].body.body"]},"default_vspaces":{"argument":1}},{"name":"setscalartransposition","comment":"Set scalar transposition block","arguments":[{"type":"modelength"}],"ast":{"identifiers":[{"property":"type","value":"ExpressionStatement"},{"property":"expression.type","value":"AwaitExpression"},{"property":"expression.argument.type","value":"CallExpression"},{"property":"expression.argument.callee.type","value":"MemberExpression"},{"property":"expression.argument.callee.property.name","value":"setScalarTranspose"}],"argument_properties":["expression.argument.arguments[0]"],"children_properties":["expression.argument.arguments[1].body.body"]},"default_vspaces":{"argument":1}},{"name":"register","comment":"Set register block","arguments":[{"type":"NumberExpression"}],"ast":{"identifiers":[{"property":"type","value":"ExpressionStatement"},{"property":"expression.type","value":"AwaitExpression"},{"property":"expression.argument.type","value":"CallExpression"},{"property":"expression.argument.callee.type","value":"MemberExpression"},{"property":"expression.argument.callee.property.name","value":"setRegister"}],"argument_properties":["expression.argument.arguments[0]"]},"blocklist_connections":["parent_or_previous_sibling","argument","next_sibling"]},{"name":"invert1","comment":"Invert block","arguments":[{"type":"note_or_solfege"},{"type":"NumberExpression"},{"type":"text"}],"ast":{"identifiers":[{"property":"type","value":"ExpressionStatement"},{"property":"expression.type","value":"AwaitExpression"},{"property":"expression.argument.type","value":"CallExpression"},{"property":"expression.argument.callee.type","value":"MemberExpression"},{"property":"expression.argument.callee.property.name","value":"invert"}],"argument_properties":["expression.argument.arguments[0]","expression.argument.arguments[1]","expression.argument.arguments[2]"],"children_properties":["expression.argument.arguments[3].body.body"]},"blocklist_connections":["parent_or_previous_sibling","argument","argument","argument","first_child","next_sibling"],"default_vspaces":{"argument":3}},{"name":"setpitchnumberoffset","comment":"Set pitch number offset block","arguments":[{"type":"note_or_solfege"},{"type":"NumberExpression"}],"ast":{"identifiers":[{"property":"type","value":"ExpressionStatement"},{"property":"expression.type","value":"AwaitExpression"},{"property":"expression.argument.type","value":"CallExpression"},{"property":"expression.argument.callee.type","value":"MemberExpression"},{"property":"expression.argument.callee.property.name","value":"setPitchNumberOffset"}],"argument_properties":["expression.argument.arguments[0]","expression.argument.arguments[1]"]},"blocklist_connections":["parent_or_previous_sibling","argument","argument","next_sibling"],"default_vspaces":{"body":2}},{"name":"setkey2","comment":"Set key block","arguments":[{"type":"notename"},{"type":"modename"}],"ast":{"identifiers":[{"property":"type","value":"ExpressionStatement"},{"property":"expression.type","value":"AwaitExpression"},{"property":"expression.argument.type","value":"CallExpression"},{"property":"expression.argument.callee.type","value":"MemberExpression"},{"property":"expression.argument.callee.property.name","value":"setKey"}],"argument_properties":["expression.argument.arguments[0]","expression.argument.arguments[1]"]},"blocklist_connections":["parent_or_previous_sibling","argument","argument","next_sibling"],"default_vspaces":{"body":2}},{"name":"semitoneinterval","comment":"Set semitone interval block","arguments":[{"type":"intervalname"}],"ast":{"identifiers":[{"property":"type","value":"ExpressionStatement"},{"property":"expression.type","value":"AwaitExpression"},{"property":"expression.argument.type","value":"CallExpression"},{"property":"expression.argument.callee.type","value":"MemberExpression"},{"property":"expression.argument.callee.property.name","value":"setSemitoneInterval"}],"argument_properties":["expression.argument.arguments[0]"],"children_properties":["expression.argument.arguments[1].body.body"]},"default_vspaces":{"argument":1}},{"name":"settemperament","comment":"Set temperament block","arguments":[{"type":"temperamentname"},{"type":"notename"},{"type":"NumberExpression"}],"ast":{"identifiers":[{"property":"type","value":"ExpressionStatement"},{"property":"expression.type","value":"AwaitExpression"},{"property":"expression.argument.type","value":"CallExpression"},{"property":"expression.argument.callee.type","value":"MemberExpression"},{"property":"expression.argument.callee.property.name","value":"setTemperament"}],"argument_properties":["expression.argument.arguments[0]","expression.argument.arguments[1]","expression.argument.arguments[2]"]},"blocklist_connections":["parent_or_previous_sibling","argument","argument","argument","next_sibling"],"default_vspaces":{"body":3}},{"name":"vibrato","comment":"Vibrato effect block","arguments":[{"type":"NumberExpression"},{"type":"NumberExpression"}],"ast":{"identifiers":[{"property":"type","value":"ExpressionStatement"},{"property":"expression.type","value":"AwaitExpression"},{"property":"expression.argument.type","value":"CallExpression"},{"property":"expression.argument.callee.type","value":"MemberExpression"},{"property":"expression.argument.callee.property.name","value":"doVibrato"}],"argument_properties":["expression.argument.arguments[0]","expression.argument.arguments[1]"],"children_properties":["expression.argument.arguments[2].body.body"]},"blocklist_connections":["parent_or_previous_sibling","argument","argument","first_child","next_sibling"],"default_vspaces":{"argument":2}},{"name":"chorus","comment":"Chorus effect block","arguments":[{"type":"NumberExpression"},{"type":"NumberExpression"},{"type":"NumberExpression"}],"ast":{"identifiers":[{"property":"type","value":"ExpressionStatement"},{"property":"expression.type","value":"AwaitExpression"},{"property":"expression.argument.type","value":"CallExpression"},{"property":"expression.argument.callee.type","value":"MemberExpression"},{"property":"expression.argument.callee.property.name","value":"doChorus"}],"argument_properties":["expression.argument.arguments[0]","expression.argument.arguments[1]","expression.argument.arguments[2]"],"children_properties":["expression.argument.arguments[3].body.body"]},"blocklist_connections":["parent_or_previous_sibling","argument","argument","argument","first_child","next_sibling"],"default_vspaces":{"argument":3}},{"name":"phaser","comment":"Phaser effect block","arguments":[{"type":"NumberExpression"},{"type":"NumberExpression"},{"type":"NumberExpression"}],"ast":{"identifiers":[{"property":"type","value":"ExpressionStatement"},{"property":"expression.type","value":"AwaitExpression"},{"property":"expression.argument.type","value":"CallExpression"},{"property":"expression.argument.callee.type","value":"MemberExpression"},{"property":"expression.argument.callee.property.name","value":"doPhaser"}],"argument_properties":["expression.argument.arguments[0]","expression.argument.arguments[1]","expression.argument.arguments[2]"],"children_properties":["expression.argument.arguments[3].body.body"]},"blocklist_connections":["parent_or_previous_sibling","argument","argument","argument","first_child","next_sibling"],"default_vspaces":{"argument":3}},{"name":"tremolo","comment":"Tremolo effect block","arguments":[{"type":"NumberExpression"},{"type":"NumberExpression"}],"ast":{"identifiers":[{"property":"type","value":"ExpressionStatement"},{"property":"expression.type","value":"AwaitExpression"},{"property":"expression.argument.type","value":"CallExpression"},{"property":"expression.argument.callee.type","value":"MemberExpression"},{"property":"expression.argument.callee.property.name","value":"doTremolo"}],"argument_properties":["expression.argument.arguments[0]","expression.argument.arguments[1]"],"children_properties":["expression.argument.arguments[2].body.body"]},"blocklist_connections":["parent_or_previous_sibling","argument","argument","first_child","next_sibling"],"default_vspaces":{"argument":2}},{"name":"neighbor2","comment":"Neighbor tone block","arguments":[{"type":"NumberExpression"},{"type":"NumberExpression"}],"ast":{"identifiers":[{"property":"type","value":"ExpressionStatement"},{"property":"expression.type","value":"AwaitExpression"},{"property":"expression.argument.type","value":"CallExpression"},{"property":"expression.argument.callee.type","value":"MemberExpression"},{"property":"expression.argument.callee.property.name","value":"doNeighbor"}],"argument_properties":["expression.argument.arguments[0]","expression.argument.arguments[1]"],"children_properties":["expression.argument.arguments[2].body.body"]},"blocklist_connections":["parent_or_previous_sibling","argument","argument","first_child","next_sibling"],"default_vspaces":{"argument":2}},{"name":"setsynthvolume","comment":"Set synth volume block","arguments":[{"type":"voicename"},{"type":"NumberExpression"}],"ast":{"identifiers":[{"property":"type","value":"ExpressionStatement"},{"property":"expression.type","value":"AwaitExpression"},{"property":"expression.argument.type","value":"CallExpression"},{"property":"expression.argument.callee.type","value":"MemberExpression"},{"property":"expression.argument.callee.property.name","value":"setSynthVolume"}],"argument_properties":["expression.argument.arguments[0]","expression.argument.arguments[1]"]},"blocklist_connections":["parent_or_previous_sibling","argument","argument","next_sibling"],"default_vspaces":{"body":2}},{"name":"setnotevolume","comment":"Set master volume block","arguments":[{"type":"NumberExpression"}],"ast":{"identifiers":[{"property":"type","value":"ExpressionStatement"},{"property":"expression.type","value":"AssignmentExpression"},{"property":"expression.operator","value":"="},{"property":"expression.left.type","value":"MemberExpression"},{"property":"expression.left.property.name","value":"MASTERVOLUME"}],"argument_properties":["expression.right"]},"blocklist_connections":["parent_or_previous_sibling","argument","next_sibling"]},{"name":"setpanning","comment":"Set panning block","arguments":[{"type":"NumberExpression"}],"ast":{"identifiers":[{"property":"type","value":"ExpressionStatement"},{"property":"expression.type","value":"AssignmentExpression"},{"property":"expression.operator","value":"="},{"property":"expression.left.type","value":"MemberExpression"},{"property":"expression.left.property.name","value":"PANNING"}],"argument_properties":["expression.right"]},"blocklist_connections":["parent_or_previous_sibling","argument","next_sibling"]},{"name":"playdrum","comment":"Play drum block","arguments":[{"type":"drumname"}],"ast":{"identifiers":[{"property":"type","value":"ExpressionStatement"},{"property":"expression.type","value":"AwaitExpression"},{"property":"expression.argument.type","value":"CallExpression"},{"property":"expression.argument.callee.type","value":"MemberExpression"},{"property":"expression.argument.callee.property.name","value":"playDrum"}],"argument_properties":["expression.argument.arguments[0]"]},"blocklist_connections":["parent_or_previous_sibling","argument","next_sibling"]},{"name":"setdrum","comment":"Set drum block","arguments":[{"type":"effectsname"}],"ast":{"identifiers":[{"property":"type","value":"ExpressionStatement"},{"property":"expression.type","value":"AwaitExpression"},{"property":"expression.argument.type","value":"CallExpression"},{"property":"expression.argument.callee.type","value":"MemberExpression"},{"property":"expression.argument.callee.property.name","value":"setDrum"}],"argument_properties":["expression.argument.arguments[0]"],"children_properties":["expression.argument.arguments[1].body.body"]},"default_vspaces":{"argument":1}},{"name":"mapdrum","comment":"Map pitch to drum block","arguments":[{"type":"drumname"}],"ast":{"identifiers":[{"property":"type","value":"ExpressionStatement"},{"property":"expression.type","value":"AwaitExpression"},{"property":"expression.argument.type","value":"CallExpression"},{"property":"expression.argument.callee.type","value":"MemberExpression"},{"property":"expression.argument.callee.property.name","value":"mapPitchToDrum"}],"argument_properties":["expression.argument.arguments[0]"],"children_properties":["expression.argument.arguments[1].body.body"]},"default_vspaces":{"argument":1}},{"name":"playdrum","comment":"Play drum block","arguments":[{"type":"drumname"}],"ast":{"identifiers":[{"property":"type","value":"ExpressionStatement"},{"property":"expression.type","value":"AwaitExpression"},{"property":"expression.argument.type","value":"CallExpression"},{"property":"expression.argument.callee.type","value":"MemberExpression"},{"property":"expression.argument.callee.property.name","value":"playDrum"}],"argument_properties":["expression.argument.arguments[0]"]},"blocklist_connections":["parent_or_previous_sibling","argument","next_sibling"]},{"name":"setdrum","comment":"Set drum block","arguments":[{"type":"effectsname"}],"ast":{"identifiers":[{"property":"type","value":"ExpressionStatement"},{"property":"expression.type","value":"AwaitExpression"},{"property":"expression.argument.type","value":"CallExpression"},{"property":"expression.argument.callee.type","value":"MemberExpression"},{"property":"expression.argument.callee.property.name","value":"setDrum"}],"argument_properties":["expression.argument.arguments[0]"],"children_properties":["expression.argument.arguments[1].body.body"]},"default_vspaces":{"argument":1}},{"name":"mapdrum","comment":"Map pitch to drum block","arguments":[{"type":"drumname"}],"ast":{"identifiers":[{"property":"type","value":"ExpressionStatement"},{"property":"expression.type","value":"AwaitExpression"},{"property":"expression.argument.type","value":"CallExpression"},{"property":"expression.argument.callee.type","value":"MemberExpression"},{"property":"expression.argument.callee.property.name","value":"mapPitchToDrum"}],"argument_properties":["expression.argument.arguments[0]"],"children_properties":["expression.argument.arguments[1].body.body"]},"default_vspaces":{"argument":1}},{"name":"forward","comment":"Forward block","arguments":[{"type":"NumberExpression"}],"ast":{"identifiers":[{"property":"type","value":"ExpressionStatement"},{"property":"expression.type","value":"AwaitExpression"},{"property":"expression.argument.type","value":"CallExpression"},{"property":"expression.argument.callee.type","value":"MemberExpression"},{"property":"expression.argument.callee.property.name","value":"goForward"}],"argument_properties":["expression.argument.arguments[0]"]},"blocklist_connections":["parent_or_previous_sibling","argument","next_sibling"]},{"name":"back","comment":"Backward block","arguments":[{"type":"NumberExpression"}],"ast":{"identifiers":[{"property":"type","value":"ExpressionStatement"},{"property":"expression.type","value":"AwaitExpression"},{"property":"expression.argument.type","value":"CallExpression"},{"property":"expression.argument.callee.type","value":"MemberExpression"},{"property":"expression.argument.callee.property.name","value":"goBackward"}],"argument_properties":["expression.argument.arguments[0]"]},"blocklist_connections":["parent_or_previous_sibling","argument","next_sibling"]},{"name":"left","comment":"Turn left block","arguments":[{"type":"NumberExpression"}],"ast":{"identifiers":[{"property":"type","value":"ExpressionStatement"},{"property":"expression.type","value":"AwaitExpression"},{"property":"expression.argument.type","value":"CallExpression"},{"property":"expression.argument.callee.type","value":"MemberExpression"},{"property":"expression.argument.callee.property.name","value":"turnLeft"}],"argument_properties":["expression.argument.arguments[0]"]},"blocklist_connections":["parent_or_previous_sibling","argument","next_sibling"]},{"name":"right","comment":"Turn right block","arguments":[{"type":"NumberExpression"}],"ast":{"identifiers":[{"property":"type","value":"ExpressionStatement"},{"property":"expression.type","value":"AwaitExpression"},{"property":"expression.argument.type","value":"CallExpression"},{"property":"expression.argument.callee.type","value":"MemberExpression"},{"property":"expression.argument.callee.property.name","value":"turnRight"}],"argument_properties":["expression.argument.arguments[0]"]},"blocklist_connections":["parent_or_previous_sibling","argument","next_sibling"]},{"name":"setxy","comment":"Set position block","arguments":[{"type":"NumberExpression"},{"type":"NumberExpression"}],"ast":{"identifiers":[{"property":"type","value":"ExpressionStatement"},{"property":"expression.type","value":"AwaitExpression"},{"property":"expression.argument.type","value":"CallExpression"},{"property":"expression.argument.callee.type","value":"MemberExpression"},{"property":"expression.argument.callee.property.name","value":"setXY"}],"argument_properties":["expression.argument.arguments[0]","expression.argument.arguments[1]"]},"blocklist_connections":["parent_or_previous_sibling","argument","argument","next_sibling"],"default_vspaces":{"body":2}},{"name":"setheading","comment":"Set heading block","arguments":[{"type":"NumberExpression"}],"ast":{"identifiers":[{"property":"type","value":"ExpressionStatement"},{"property":"expression.type","value":"AwaitExpression"},{"property":"expression.argument.type","value":"CallExpression"},{"property":"expression.argument.callee.type","value":"MemberExpression"},{"property":"expression.argument.callee.property.name","value":"setHeading"}],"argument_properties":["expression.argument.arguments[0]"]},"blocklist_connections":["parent_or_previous_sibling","argument","next_sibling"]},{"name":"arc","comment":"Draw arc block","arguments":[{"type":"NumberExpression"},{"type":"NumberExpression"}],"ast":{"identifiers":[{"property":"type","value":"ExpressionStatement"},{"property":"expression.type","value":"AwaitExpression"},{"property":"expression.argument.type","value":"CallExpression"},{"property":"expression.argument.callee.type","value":"MemberExpression"},{"property":"expression.argument.callee.property.name","value":"drawArc"}],"argument_properties":["expression.argument.arguments[0]","expression.argument.arguments[1]"]},"blocklist_connections":["parent_or_previous_sibling","argument","argument","next_sibling"],"default_vspaces":{"body":2}},{"name":"controlpoint1","comment":"Set bezier control point 1 block","arguments":[{"type":"NumberExpression"},{"type":"NumberExpression"}],"ast":{"identifiers":[{"property":"type","value":"ExpressionStatement"},{"property":"expression.type","value":"AwaitExpression"},{"property":"expression.argument.type","value":"CallExpression"},{"property":"expression.argument.callee.type","value":"MemberExpression"},{"property":"expression.argument.callee.property.name","value":"setBezierControlPoint1"}],"argument_properties":["expression.argument.arguments[0]","expression.argument.arguments[1]"]},"blocklist_connections":["parent_or_previous_sibling","argument","argument","next_sibling"],"default_vspaces":{"body":2}},{"name":"controlpoint2","comment":"Set bezier control point 2 block","arguments":[{"type":"NumberExpression"},{"type":"NumberExpression"}],"ast":{"identifiers":[{"property":"type","value":"ExpressionStatement"},{"property":"expression.type","value":"AwaitExpression"},{"property":"expression.argument.type","value":"CallExpression"},{"property":"expression.argument.callee.type","value":"MemberExpression"},{"property":"expression.argument.callee.property.name","value":"setBezierControlPoint2"}],"argument_properties":["expression.argument.arguments[0]","expression.argument.arguments[1]"]},"blocklist_connections":["parent_or_previous_sibling","argument","argument","next_sibling"],"default_vspaces":{"body":2}},{"name":"bezier","comment":"Draw bezier block","arguments":[{"type":"NumberExpression"},{"type":"NumberExpression"}],"ast":{"identifiers":[{"property":"type","value":"ExpressionStatement"},{"property":"expression.type","value":"AwaitExpression"},{"property":"expression.argument.type","value":"CallExpression"},{"property":"expression.argument.callee.type","value":"MemberExpression"},{"property":"expression.argument.callee.property.name","value":"drawBezier"}],"argument_properties":["expression.argument.arguments[0]","expression.argument.arguments[1]"]},"blocklist_connections":["parent_or_previous_sibling","argument","argument","next_sibling"],"default_vspaces":{"body":2}},{"name":"clear","comment":"Clear block","ast":{"identifiers":[{"property":"type","value":"ExpressionStatement"},{"property":"expression.type","value":"AwaitExpression"},{"property":"expression.argument.type","value":"CallExpression"},{"property":"expression.argument.callee.type","value":"MemberExpression"},{"property":"expression.argument.callee.property.name","value":"clear"}]},"blocklist_connections":["parent_or_previous_sibling","next_sibling"]},{"name":"scrollxy","comment":"Scroll XY block","arguments":[{"type":"x"},{"type":"y"}],"ast":{"identifiers":[{"property":"type","value":"ExpressionStatement"},{"property":"expression.type","value":"AwaitExpression"},{"property":"expression.argument.type","value":"CallExpression"},{"property":"expression.argument.callee.type","value":"MemberExpression"},{"property":"expression.argument.callee.property.name","value":"scrollXY"}],"argument_properties":["expression.argument.arguments[0]","expression.argument.arguments[1]"]},"blocklist_connections":["parent_or_previous_sibling","argument","argument","next_sibling"],"default_vspaces":{"body":2}},{"name":"setcolor","comment":"Set color block","arguments":[{"type":"NumberExpression"}],"ast":{"identifiers":[{"property":"type","value":"ExpressionStatement"},{"property":"expression.type","value":"AwaitExpression"},{"property":"expression.argument.type","value":"CallExpression"},{"property":"expression.argument.callee.type","value":"MemberExpression"},{"property":"expression.argument.callee.property.name","value":"setColor"}],"argument_properties":["expression.argument.arguments[0]"]},"blocklist_connections":["parent_or_previous_sibling","argument","next_sibling"]},{"name":"setgrey","comment":"Set grey block","arguments":[{"type":"grey"}],"ast":{"identifiers":[{"property":"type","value":"ExpressionStatement"},{"property":"expression.type","value":"AwaitExpression"},{"property":"expression.argument.type","value":"CallExpression"},{"property":"expression.argument.callee.type","value":"MemberExpression"},{"property":"expression.argument.callee.property.name","value":"setGrey"}],"argument_properties":["expression.argument.arguments[0]"]},"blocklist_connections":["parent_or_previous_sibling","argument","next_sibling"]},{"name":"setshade","comment":"Set shade block","arguments":[{"type":"shade"}],"ast":{"identifiers":[{"property":"type","value":"ExpressionStatement"},{"property":"expression.type","value":"AwaitExpression"},{"property":"expression.argument.type","value":"CallExpression"},{"property":"expression.argument.callee.type","value":"MemberExpression"},{"property":"expression.argument.callee.property.name","value":"setShade"}],"argument_properties":["expression.argument.arguments[0]"]},"blocklist_connections":["parent_or_previous_sibling","argument","next_sibling"]},{"name":"sethue","comment":"Set hue block","arguments":[{"type":"color"}],"ast":{"identifiers":[{"property":"type","value":"ExpressionStatement"},{"property":"expression.type","value":"AwaitExpression"},{"property":"expression.argument.type","value":"CallExpression"},{"property":"expression.argument.callee.type","value":"MemberExpression"},{"property":"expression.argument.callee.property.name","value":"setHue"}],"argument_properties":["expression.argument.arguments[0]"]},"blocklist_connections":["parent_or_previous_sibling","argument","next_sibling"]},{"name":"settranslucency","comment":"Set translucency block","arguments":[{"type":"NumberExpression"}],"ast":{"identifiers":[{"property":"type","value":"ExpressionStatement"},{"property":"expression.type","value":"AwaitExpression"},{"property":"expression.argument.type","value":"CallExpression"},{"property":"expression.argument.callee.type","value":"MemberExpression"},{"property":"expression.argument.callee.property.name","value":"setTranslucency"}],"argument_properties":["expression.argument.arguments[0]"]},"blocklist_connections":["parent_or_previous_sibling","argument","next_sibling"]},{"name":"setpensize","comment":"Set pen size block","arguments":[{"type":"pensize"}],"ast":{"identifiers":[{"property":"type","value":"ExpressionStatement"},{"property":"expression.type","value":"AwaitExpression"},{"property":"expression.argument.type","value":"CallExpression"},{"property":"expression.argument.callee.type","value":"MemberExpression"},{"property":"expression.argument.callee.property.name","value":"setPensize"}],"argument_properties":["expression.argument.arguments[0]"]},"blocklist_connections":["parent_or_previous_sibling","argument","next_sibling"]},{"name":"penup","comment":"Pen up block","ast":{"identifiers":[{"property":"type","value":"ExpressionStatement"},{"property":"expression.type","value":"AwaitExpression"},{"property":"expression.argument.type","value":"CallExpression"},{"property":"expression.argument.callee.type","value":"MemberExpression"},{"property":"expression.argument.callee.property.name","value":"penUp"}]},"blocklist_connections":["parent_or_previous_sibling","next_sibling"]},{"name":"pendown","comment":"Pen down block","ast":{"identifiers":[{"property":"type","value":"ExpressionStatement"},{"property":"expression.type","value":"AwaitExpression"},{"property":"expression.argument.type","value":"CallExpression"},{"property":"expression.argument.callee.type","value":"MemberExpression"},{"property":"expression.argument.callee.property.name","value":"penDown"}]},"blocklist_connections":["parent_or_previous_sibling","next_sibling"]},{"name":"background","comment":"Fill background block","ast":{"identifiers":[{"property":"type","value":"ExpressionStatement"},{"property":"expression.type","value":"AwaitExpression"},{"property":"expression.argument.type","value":"CallExpression"},{"property":"expression.argument.callee.type","value":"MemberExpression"},{"property":"expression.argument.callee.property.name","value":"fillBackground"}]},"blocklist_connections":["parent_or_previous_sibling","next_sibling"]},{"name":"setfont","comment":"Set font block","arguments":[{"type":"text"}],"ast":{"identifiers":[{"property":"type","value":"ExpressionStatement"},{"property":"expression.type","value":"AwaitExpression"},{"property":"expression.argument.type","value":"CallExpression"},{"property":"expression.argument.callee.type","value":"MemberExpression"},{"property":"expression.argument.callee.property.name","value":"setFont"}],"argument_properties":["expression.argument.arguments[0]"]},"blocklist_connections":["parent_or_previous_sibling","argument","next_sibling"]},{"name":"debugger","comment":"Debugger block","ast":{"identifiers":[{"property":"type","value":"DebuggerStatement"}]},"blocklist_connections":["parent_or_previous_sibling","next_sibling"]},{"name_map":{"playNote":"newnote","dot":"rhythmicdot2","multiplyNoteValue":"multiplybeatfactor","playNoteMillis":"osctime","doCrescendo":"crescendo","doDecrescendo":"decrescendo","setSemitoneTranspose":"settransposition","setScalarInterval":"interval","doDistortion":"dis","doHarmonic":"harmonic2","setStaccato":"newstaccato","setSlur":"newslur","setRelativeVolume":"articulation"},"comment":"Flow blocks with one number argument","arguments":[{"type":"NumberExpression"}],"ast":{"identifiers":[{"property":"type","value":"ExpressionStatement"},{"property":"expression.type","value":"AwaitExpression"},{"property":"expression.argument.type","value":"CallExpression"},{"property":"expression.argument.callee.type","value":"MemberExpression"}],"argument_properties":["expression.argument.arguments[0]"],"children_properties":["expression.argument.arguments[1].body.body"]},"default_vspaces":{"argument":1}}]} \ No newline at end of file +{"default_connections":["parent_or_previous_sibling","argument","first_child","next_sibling"],"argument_blocks":[{"comment":"Variable name like 'box1' in the Boxes palette or action name like 'action' in the Action palette","ast":{"identifiers":[{"property":"type","value":"Identifier"}],"identifier_property":"name"}},{"comment":"Number expression like '1 / 4' in the Number palette or boolean expressions like 'box1 >= 0' in the Boolean palette","ast":{"identifiers":[{"property":"type","value":"BinaryExpression"}],"name_property":"operator","argument_properties":["left","right"]},"name_map":{"+":"plus","-":"minus","*":"multiply","/":"divide","%":"mod","==":"equal","!=":"not_equal_to","<":"less",">":"greater","<=":"less_than_or_equal_to",">=":"greater_than_or_equal_to","|":"or","&":"and","^":"xor"}},{"comment":"Unary expressions such as ! in boolean palette or - in number palette","ast":{"identifiers":[{"property":"type","value":"UnaryExpression"}],"name_property":"operator","argument_properties":["argument"]},"name_map":{"-":"neg","!":"not"}},{"comment":"Literals such as numbers or booleans or strings","ast":{"identifiers":[{"property":"type","value":"Literal"}],"value_property":"value"}},{"comment":"Dictionary get function for 2 arguments","ast":{"identifiers":[{"property":"type","value":"AwaitExpression"},{"property":"argument.type","value":"CallExpression"},{"property":"argument.callee.type","value":"MemberExpression"},{"property":"argument.callee.property.name","value":"getValue"},{"property":"argument.arguments","size":2}],"name_property":"argument.callee.property.name","argument_properties":["argument.arguments[1]","argument.arguments[0]"]},"name_map":{"getValue":"getDict"}},{"comment":"Dictionary get function for 1 argument","ast":{"identifiers":[{"property":"type","value":"AwaitExpression"},{"property":"argument.type","value":"CallExpression"},{"property":"argument.callee.type","value":"MemberExpression"},{"property":"argument.callee.property.name","value":"getValue"},{"property":"argument.arguments","size":1}],"name_property":"argument.callee.property.name","argument_properties":["argument.arguments[0]"]},"name_map":{"getValue":"getDict2"}},{"comment":"Skip, this is for children","ast":{"identifiers":[{"property":"type","value":"ArrowFunctionExpression"}]}},{"comment":"Math operators such as absolute value or square","ast":{"identifiers":[{"property":"type","value":"CallExpression"},{"property":"callee.type","value":"MemberExpression"},{"property":"callee.object.type","value":"Identifier"},{"property":"callee.object.name","value":"Math"}],"name_property":"callee.property.name","arguments_property":"arguments"},"name_map":{"abs":"abs","floor":"int","pow":"power","sqrt":"sqrt"}},{"comment":"Math utility operators such as distance or random","ast":{"identifiers":[{"property":"type","value":"CallExpression"},{"property":"callee.type","value":"MemberExpression"},{"property":"callee.object.type","value":"Identifier"},{"property":"callee.object.name","value":"MathUtility"}],"name_property":"callee.property.name","arguments_property":"arguments"},"name_map":{"doCalculateDistance":"distance","doOneOf":"oneOf","doRandom":"random"}},{"comment":"Singular argument mouse blocks","ast":{"identifiers":[{"property":"type","value":"MemberExpression"},{"property":"object.name","value":"mouse"}],"name_property":"property.name","argument_properties":[]},"name_map":{"MODELENGTH":"modelength","SCALARCHANGEINPITCH":"deltapitch2","CHANGEINPITCH":"deltapitch","CURRENTKEY":"currentkey","CURRENTMODE":"currentmode","X":"x","Y":"y","HEAP":"heap","HEAPLENGTH":"heapLength","HEAPEMPTY":"heapEmpty","GREY":"grey","SHADE":"shade","PENSIZE":"pensize","COLOR":"color","BEATCOUNT":"nopValueBlock","MEASURECOUNT":"nopValueBlock","BPM":"nopValueBlock","WHOLENOTESPLAYED":"elapsednotes","BEATFACTOR":"beatfactor","NOTEVALUE":"notevalue"}},{"comment":"Get synth volume value","ast":{"identifiers":[{"property":"type","value":"CallExpression"},{"property":"callee.name","value":"getSynthVolume"}],"name_property":"callee.name","argument_properties":["arguments[0]"]},"name_map":{"getSynthVolume":"synthvolumefactor"}},{"comment":"Number to pitch/octave conversion","ast":{"identifiers":[{"property":"type","value":"CallExpression"}],"name_property":"callee.name","argument_properties":["arguments[0]"]},"name_map":{"numToOctave":"number2octave","numToPitch":"number2pitch"}}],"body_blocks":[{"comment":"run is ignored","ast":{"identifiers":[{"property":"type","value":"ExpressionStatement"},{"property":"expression.type","value":"CallExpression"},{"property":"expression.callee.type","value":"MemberExpression"},{"property":"expression.callee.object.name","value":"MusicBlocks"},{"property":"expression.callee.property.name","value":"run"}]}},{"name":"storein2","comment":"Variable assignment in the Boxes palette like 'var box1 = 2 * 5;'","arguments":[{"type":"ValueExpression"}],"ast":{"identifiers":[{"property":"type","value":"VariableDeclaration"},{"property":"declarations[0].init.type","value":"Literal"},{"property":"declarations[0].init.type","value":"BinaryExpression"},{"property":"declarations[0].init.type","value":"UnaryExpression"},{"property":"declarations[0].init.type","value":"CallExpression"}],"name_property":"declarations[0].id.name","argument_properties":["declarations[0].init"]},"blocklist_connections":["parent_or_previous_sibling","argument","next_sibling"]},{"name":"decrementOne","comment":"Decrement by one block in the Boxes palette 'box1 = box1 - 1;'","arguments":[{"type":"namedbox"}],"ast":{"identifiers":[{"property":"type","value":"ExpressionStatement"},{"property":"expression.type","value":"AssignmentExpression"},{"property":"expression.right.type","value":"BinaryExpression"},{"property":"expression.right.operator","value":"-"},{"property":"expression.right.right.value","value":1}],"argument_properties":["expression.left"]},"blocklist_connections":["parent_or_previous_sibling","argument","next_sibling"]},{"name":"increment","comment":"Increment block in the Boxes palette 'box1 = box1 + 3;'","arguments":[{"type":"namedbox"},{"type":"NumberExpression"}],"ast":{"identifiers":[{"property":"type","value":"ExpressionStatement"},{"property":"expression.type","value":"AssignmentExpression"},{"property":"expression.right.type","value":"BinaryExpression"},{"property":"expression.right.operator","value":"+"}],"argument_properties":["expression.left","expression.right.right"]},"blocklist_connections":["parent_or_previous_sibling","argument","argument","next_sibling"],"default_vspaces":{"body":2}},{"name":"settimbre","comment":"Set instrument block","arguments":[{"type":"voicename"}],"ast":{"identifiers":[{"property":"type","value":"ExpressionStatement"},{"property":"expression.type","value":"AwaitExpression"},{"property":"expression.argument.type","value":"CallExpression"},{"property":"expression.argument.callee.type","value":"MemberExpression"},{"property":"expression.argument.callee.property.name","value":"setInstrument"}],"argument_properties":["expression.argument.arguments[0]"],"children_properties":["expression.argument.arguments[1].body.body"]},"default_vspaces":{"argument":1}},{"name":"tie","comment":"Tie block in the Rhythm palette","ast":{"identifiers":[{"property":"type","value":"ExpressionStatement"},{"property":"expression.type","value":"AwaitExpression"},{"property":"expression.argument.type","value":"CallExpression"},{"property":"expression.argument.callee.type","value":"MemberExpression"},{"property":"expression.argument.callee.property.name","value":"tie"}],"children_properties":["expression.argument.arguments[0].body.body"]},"blocklist_connections":["parent_or_previous_sibling","first_child","next_sibling"],"default_vspaces":{"argument":0}},{"name":"newswing2","comment":"Swing block in the Rhythm palette","arguments":[{"type":"NumberExpression"},{"type":"NumberExpression"}],"ast":{"identifiers":[{"property":"type","value":"ExpressionStatement"},{"property":"expression.type","value":"AwaitExpression"},{"property":"expression.argument.type","value":"CallExpression"},{"property":"expression.argument.callee.type","value":"MemberExpression"},{"property":"expression.argument.callee.property.name","value":"swing"}],"argument_properties":["expression.argument.arguments[0]","expression.argument.arguments[1]"],"children_properties":["expression.argument.arguments[2].body.body"]},"blocklist_connections":["parent_or_previous_sibling","argument","argument","first_child","next_sibling"],"default_vspaces":{"argument":2}},{"name":"pitch","comment":"Pitch block","arguments":[{"type":"note_or_solfege"},{"type":"NumberExpression"}],"ast":{"identifiers":[{"property":"type","value":"ExpressionStatement"},{"property":"expression.type","value":"AwaitExpression"},{"property":"expression.argument.type","value":"CallExpression"},{"property":"expression.argument.callee.type","value":"MemberExpression"},{"property":"expression.argument.callee.property.name","value":"playPitch"}],"argument_properties":["expression.argument.arguments[0]","expression.argument.arguments[1]"]},"blocklist_connections":["parent_or_previous_sibling","argument","argument","next_sibling"],"default_vspaces":{"body":2}},{"name":"hertz","comment":"Hertz block","arguments":[{"type":"NumberExpression"}],"ast":{"identifiers":[{"property":"type","value":"ExpressionStatement"},{"property":"expression.type","value":"AwaitExpression"},{"property":"expression.argument.type","value":"CallExpression"},{"property":"expression.argument.callee.type","value":"MemberExpression"},{"property":"expression.argument.callee.property.name","value":"playHertz"}],"argument_properties":["expression.argument.arguments[0]"]},"blocklist_connections":["parent_or_previous_sibling","argument","next_sibling"]},{"name":"rest2","comment":"Rest block","ast":{"identifiers":[{"property":"type","value":"ExpressionStatement"},{"property":"expression.type","value":"AwaitExpression"},{"property":"expression.argument.type","value":"CallExpression"},{"property":"expression.argument.callee.type","value":"MemberExpression"},{"property":"expression.argument.callee.property.name","value":"playRest"}]},"blocklist_connections":["parent_or_previous_sibling","next_sibling"]},{"name":"nameddo","comment":"Action palette, async block","ast":{"identifiers":[{"property":"type","value":"ExpressionStatement"},{"property":"expression.type","value":"AwaitExpression"},{"property":"expression.argument.type","value":"CallExpression"},{"property":"expression.argument.callee.type","value":"Identifier"}],"name_property":"expression.argument.callee.name"},"blocklist_connections":["parent_or_previous_sibling","next_sibling"]},{"name":"start","comment":"Start block in the Flow palette","ast":{"identifiers":[{"property":"type","value":"ExpressionStatement"},{"property":"expression.type","value":"NewExpression"}],"children_properties":["expression.arguments[0].body.body"]},"blocklist_connections":["parent_or_previous_sibling","first_child","next_sibling"],"default_vspaces":{"argument":1}},{"name":"action","comment":"Action block in the Action palette","arguments":[{"type":"text"}],"ast":{"identifiers":[{"property":"type","value":"VariableDeclaration"},{"property":"declarations[0].init.type","value":"ArrowFunctionExpression"}],"argument_properties":["declarations[0].id"],"children_properties":["declarations[0].init.body.body"]},"default_vspaces":{"argument":1}},{"name":"repeat","comment":"Repeat block in the Flow palette","arguments":[{"type":"NumberExpression"}],"ast":{"identifiers":[{"property":"type","value":"ForStatement"}],"argument_properties":["test.right"],"children_properties":["body.body"]},"default_vspaces":{"argument":1}},{"name":"forever","comment":"Forever block in the Flow palette","ast":{"identifiers":[{"property":"type","value":"WhileStatement"},{"property":"test.raw","value":"1000"}],"children_properties":["body.body"]},"blocklist_connections":["parent_or_previous_sibling","first_child","next_sibling"],"default_vspaces":{"argument":1}},{"name":"while","comment":"While block in the Flow palette","arguments":[{"type":"BooleanExpression"}],"ast":{"identifiers":[{"property":"type","value":"WhileStatement"}],"argument_properties":["test"],"children_properties":["body.body"]},"default_vspaces":{"argument":2}},{"name":"until","comment":"Do While block in the Flow palette","arguments":[{"type":"BooleanExpression"}],"ast":{"identifiers":[{"property":"type","value":"DoWhileStatement"}],"argument_properties":["test"],"children_properties":["body.body"]},"default_vspaces":{"argument":2}},{"name":"switch","comment":"Switch block in the Flow palette","arguments":[{"type":"NumberExpression"}],"ast":{"identifiers":[{"property":"type","value":"SwitchStatement"}],"argument_properties":["discriminant"],"children_properties":["cases"]},"default_vspaces":{"argument":1}},{"name":"defaultcase","comment":"Default case block in the Flow palette","ast":{"identifiers":[{"property":"type","value":"SwitchCase"},{"property":"test","has_value":false}],"children_properties":["consequent"]},"blocklist_connections":["parent_or_previous_sibling","first_child","next_sibling"],"default_vspaces":{"argument":1}},{"name":"case","comment":"Case block in the Flow palette","arguments":[{"type":"NumberExpression"}],"ast":{"identifiers":[{"property":"type","value":"SwitchCase"},{"property":"test.type","value":"Literal"}],"argument_properties":["test"],"children_properties":["consequent"]},"default_vspaces":{"argument":1}},{"name":"break","comment":"Break block in the Flow palette","ast":{"identifiers":[{"property":"type","value":"BreakStatement"}]},"blocklist_connections":["parent_or_previous_sibling","next_sibling"]},{"name":"if","comment":"Basic if block in the Flow palette","arguments":[{"type":"BooleanExpression"}],"ast":{"identifiers":[{"property":"type","value":"IfStatement"},{"property":"alternate","has_value":false}],"argument_properties":["test"],"children_properties":["consequent.body"]},"default_vspaces":{"argument":2}},{"name":"ifthenelse","comment":"If-then-else block in the Flow palette","arguments":[{"type":"BooleanExpression"}],"ast":{"identifiers":[{"property":"type","value":"IfStatement"},{"property":"alternate","has_value":true}],"argument_properties":["test"],"children_properties":["consequent.body","alternate.body"]},"blocklist_connections":["parent_or_previous_sibling","argument","first_child","second_child","next_sibling"],"default_vspaces":{"argument":2}},{"name":"setDict","comment":"Set value block for dictionary, with specific dictionary","arguments":[{"type":"text"},{"type":"text"},{"type":"NumberExpression"}],"ast":{"identifiers":[{"property":"type","value":"ExpressionStatement"},{"property":"expression.type","value":"AwaitExpression"},{"property":"expression.argument.type","value":"CallExpression"},{"property":"expression.argument.callee.type","value":"MemberExpression"},{"property":"expression.argument.callee.property.name","value":"setValue"},{"property":"expression.argument.arguments","size":3}],"argument_properties":["expression.argument.arguments[2]","expression.argument.arguments[0]","expression.argument.arguments[1]"]},"blocklist_connections":["parent_or_previous_sibling","argument","argument","argument","next_sibling"],"default_vspaces":{"body":3}},{"name":"setDict2","comment":"Dictionary blocks, the set functions","arguments":[{"type":"text"},{"type":"NumberExpression"}],"ast":{"identifiers":[{"property":"type","value":"ExpressionStatement"},{"property":"expression.type","value":"AwaitExpression"},{"property":"expression.argument.type","value":"CallExpression"},{"property":"expression.argument.callee.type","value":"MemberExpression"},{"property":"expression.argument.callee.property.name","value":"setValue"},{"property":"expression.argument.arguments","size":2}],"argument_properties":["expression.argument.arguments[0]","expression.argument.arguments[1]"]},"blocklist_connections":["parent_or_previous_sibling","argument","argument","next_sibling"],"default_vspaces":{"body":2}},{"name":"meter","comment":"Set meter block from the meter palette","arguments":[{"type":"NumberExpression"},{"type":"NumberExpression"}],"ast":{"identifiers":[{"property":"type","value":"ExpressionStatement"},{"property":"expression.type","value":"AwaitExpression"},{"property":"expression.argument.type","value":"CallExpression"},{"property":"expression.argument.callee.type","value":"MemberExpression"},{"property":"expression.argument.callee.property.name","value":"setMeter"}],"argument_properties":["expression.argument.arguments[0]","expression.argument.arguments[1]"]},"blocklist_connections":["parent_or_previous_sibling","argument","argument","next_sibling"],"default_vspaces":{"body":2}},{"name":"pickup","comment":"PICKUP block from the meter palette","arguments":[{"type":"NumberExpression"}],"ast":{"identifiers":[{"property":"type","value":"ExpressionStatement"},{"property":"expression.type","value":"AssignmentExpression"},{"property":"expression.operator","value":"="},{"property":"expression.left.type","value":"MemberExpression"},{"property":"expression.left.property.name","value":"PICKUP"}],"argument_properties":["expression.right"]},"blocklist_connections":["parent_or_previous_sibling","argument","next_sibling"]},{"name":"setbpm3","comment":"Set BPM block from the meter palette","arguments":[{"type":"NumberExpression"},{"type":"NumberExpression"}],"ast":{"identifiers":[{"property":"type","value":"ExpressionStatement"},{"property":"expression.type","value":"AwaitExpression"},{"property":"expression.argument.type","value":"CallExpression"},{"property":"expression.argument.callee.type","value":"MemberExpression"},{"property":"expression.argument.callee.property.name","value":"setBPM"}],"argument_properties":["expression.argument.arguments[0]","expression.argument.arguments[1]"]},"blocklist_connections":["parent_or_previous_sibling","argument","argument","next_sibling"],"default_vspaces":{"body":2}},{"name":"setmasterbpm2","comment":"Set master BPM block from the meter palette","arguments":[{"type":"NumberExpression"},{"type":"NumberExpression"}],"ast":{"identifiers":[{"property":"type","value":"ExpressionStatement"},{"property":"expression.type","value":"AwaitExpression"},{"property":"expression.argument.type","value":"CallExpression"},{"property":"expression.argument.callee.type","value":"MemberExpression"},{"property":"expression.argument.callee.property.name","value":"setMasterBPM"}],"argument_properties":["expression.argument.arguments[0]","expression.argument.arguments[1]"]},"blocklist_connections":["parent_or_previous_sibling","argument","argument","next_sibling"],"default_vspaces":{"body":2}},{"name":"everybeatdo","comment":"On every note do block from the meter palette","arguments":[{"type":"text"}],"ast":{"identifiers":[{"property":"type","value":"ExpressionStatement"},{"property":"expression.type","value":"AwaitExpression"},{"property":"expression.argument.type","value":"CallExpression"},{"property":"expression.argument.callee.type","value":"MemberExpression"},{"property":"expression.argument.callee.property.name","value":"onEveryNoteDo"}],"argument_properties":["expression.argument.arguments[0]"]},"blocklist_connections":["parent_or_previous_sibling","argument","next_sibling"]},{"name":"everybeatdonew","comment":"On every beat do block from the meter palette","arguments":[{"type":"text"}],"ast":{"identifiers":[{"property":"type","value":"ExpressionStatement"},{"property":"expression.type","value":"AwaitExpression"},{"property":"expression.argument.type","value":"CallExpression"},{"property":"expression.argument.callee.type","value":"MemberExpression"},{"property":"expression.argument.callee.property.name","value":"onEveryBeatDo"}],"argument_properties":["expression.argument.arguments[0]"]},"blocklist_connections":["parent_or_previous_sibling","argument","next_sibling"]},{"name":"onbeatdo","comment":"On strong beat do block from the meter palette","arguments":[{"type":"NumberExpression"},{"type":"text"}],"ast":{"identifiers":[{"property":"type","value":"ExpressionStatement"},{"property":"expression.type","value":"AwaitExpression"},{"property":"expression.argument.type","value":"CallExpression"},{"property":"expression.argument.callee.type","value":"MemberExpression"},{"property":"expression.argument.callee.property.name","value":"onStrongBeatDo"}],"argument_properties":["expression.argument.arguments[0]","expression.argument.arguments[1]"]},"blocklist_connections":["parent_or_previous_sibling","argument","argument","next_sibling"],"default_vspaces":{"body":2}},{"name":"offbeatdo","comment":"On weak beat do block from the meter palette","arguments":[{"type":"text"}],"ast":{"identifiers":[{"property":"type","value":"ExpressionStatement"},{"property":"expression.type","value":"AwaitExpression"},{"property":"expression.argument.type","value":"CallExpression"},{"property":"expression.argument.callee.type","value":"MemberExpression"},{"property":"expression.argument.callee.property.name","value":"onWeakBeatDo"}],"argument_properties":["expression.argument.arguments[0]"]},"blocklist_connections":["parent_or_previous_sibling","argument","next_sibling"]},{"name":"drift","comment":"No clock block from the meter palette","ast":{"identifiers":[{"property":"type","value":"ExpressionStatement"},{"property":"expression.type","value":"AwaitExpression"},{"property":"expression.argument.type","value":"CallExpression"},{"property":"expression.argument.callee.type","value":"MemberExpression"},{"property":"expression.argument.callee.property.name","value":"setNoClock"}],"children_properties":["expression.argument.arguments[0].body.body"]},"blocklist_connections":["parent_or_previous_sibling","first_child","next_sibling"],"default_vspaces":{"argument":1}},{"name":"steppitch","comment":"Step pitch block","arguments":[{"type":"NumberExpression"}],"ast":{"identifiers":[{"property":"type","value":"ExpressionStatement"},{"property":"expression.type","value":"AwaitExpression"},{"property":"expression.argument.type","value":"CallExpression"},{"property":"expression.argument.callee.type","value":"MemberExpression"},{"property":"expression.argument.callee.property.name","value":"stepPitch"}],"argument_properties":["expression.argument.arguments[0]"]},"blocklist_connections":["parent_or_previous_sibling","argument","next_sibling"]},{"name":"nthmodalpitch","comment":"Play nth modal pitch block","arguments":[{"type":"NumberExpression"},{"type":"NumberExpression"}],"ast":{"identifiers":[{"property":"type","value":"ExpressionStatement"},{"property":"expression.type","value":"AwaitExpression"},{"property":"expression.argument.type","value":"CallExpression"},{"property":"expression.argument.callee.type","value":"MemberExpression"},{"property":"expression.argument.callee.property.name","value":"playNthModalPitch"}],"argument_properties":["expression.argument.arguments[0]","expression.argument.arguments[1]"]},"blocklist_connections":["parent_or_previous_sibling","argument","argument","next_sibling"],"default_vspaces":{"body":2}},{"name":"pitchnumber","comment":"Play pitch number block","arguments":[{"type":"NumberExpression"}],"ast":{"identifiers":[{"property":"type","value":"ExpressionStatement"},{"property":"expression.type","value":"AwaitExpression"},{"property":"expression.argument.type","value":"CallExpression"},{"property":"expression.argument.callee.type","value":"MemberExpression"},{"property":"expression.argument.callee.property.name","value":"playPitchNumber"}],"argument_properties":["expression.argument.arguments[0]"]},"blocklist_connections":["parent_or_previous_sibling","argument","next_sibling"]},{"name":"accidental","comment":"Set accidental block","arguments":[{"type":"text"}],"ast":{"identifiers":[{"property":"type","value":"ExpressionStatement"},{"property":"expression.type","value":"AwaitExpression"},{"property":"expression.argument.type","value":"CallExpression"},{"property":"expression.argument.callee.type","value":"MemberExpression"},{"property":"expression.argument.callee.property.name","value":"setAccidental"}],"argument_properties":["expression.argument.arguments[0]"],"children_properties":["expression.argument.arguments[1].body.body"]},"default_vspaces":{"argument":1}},{"name":"setscalartransposition","comment":"Set scalar transposition block","arguments":[{"type":"modelength"}],"ast":{"identifiers":[{"property":"type","value":"ExpressionStatement"},{"property":"expression.type","value":"AwaitExpression"},{"property":"expression.argument.type","value":"CallExpression"},{"property":"expression.argument.callee.type","value":"MemberExpression"},{"property":"expression.argument.callee.property.name","value":"setScalarTranspose"}],"argument_properties":["expression.argument.arguments[0]"],"children_properties":["expression.argument.arguments[1].body.body"]},"default_vspaces":{"argument":1}},{"name":"register","comment":"Set register block","arguments":[{"type":"NumberExpression"}],"ast":{"identifiers":[{"property":"type","value":"ExpressionStatement"},{"property":"expression.type","value":"AwaitExpression"},{"property":"expression.argument.type","value":"CallExpression"},{"property":"expression.argument.callee.type","value":"MemberExpression"},{"property":"expression.argument.callee.property.name","value":"setRegister"}],"argument_properties":["expression.argument.arguments[0]"]},"blocklist_connections":["parent_or_previous_sibling","argument","next_sibling"]},{"name":"invert1","comment":"Invert block","arguments":[{"type":"note_or_solfege"},{"type":"NumberExpression"},{"type":"text"}],"ast":{"identifiers":[{"property":"type","value":"ExpressionStatement"},{"property":"expression.type","value":"AwaitExpression"},{"property":"expression.argument.type","value":"CallExpression"},{"property":"expression.argument.callee.type","value":"MemberExpression"},{"property":"expression.argument.callee.property.name","value":"invert"}],"argument_properties":["expression.argument.arguments[0]","expression.argument.arguments[1]","expression.argument.arguments[2]"],"children_properties":["expression.argument.arguments[3].body.body"]},"blocklist_connections":["parent_or_previous_sibling","argument","argument","argument","first_child","next_sibling"],"default_vspaces":{"argument":3}},{"name":"setpitchnumberoffset","comment":"Set pitch number offset block","arguments":[{"type":"note_or_solfege"},{"type":"NumberExpression"}],"ast":{"identifiers":[{"property":"type","value":"ExpressionStatement"},{"property":"expression.type","value":"AwaitExpression"},{"property":"expression.argument.type","value":"CallExpression"},{"property":"expression.argument.callee.type","value":"MemberExpression"},{"property":"expression.argument.callee.property.name","value":"setPitchNumberOffset"}],"argument_properties":["expression.argument.arguments[0]","expression.argument.arguments[1]"]},"blocklist_connections":["parent_or_previous_sibling","argument","argument","next_sibling"],"default_vspaces":{"body":2}},{"name":"setkey2","comment":"Set key block","arguments":[{"type":"notename"},{"type":"modename"}],"ast":{"identifiers":[{"property":"type","value":"ExpressionStatement"},{"property":"expression.type","value":"AwaitExpression"},{"property":"expression.argument.type","value":"CallExpression"},{"property":"expression.argument.callee.type","value":"MemberExpression"},{"property":"expression.argument.callee.property.name","value":"setKey"}],"argument_properties":["expression.argument.arguments[0]","expression.argument.arguments[1]"]},"blocklist_connections":["parent_or_previous_sibling","argument","argument","next_sibling"],"default_vspaces":{"body":2}},{"name":"semitoneinterval","comment":"Set semitone interval block","arguments":[{"type":"intervalname"}],"ast":{"identifiers":[{"property":"type","value":"ExpressionStatement"},{"property":"expression.type","value":"AwaitExpression"},{"property":"expression.argument.type","value":"CallExpression"},{"property":"expression.argument.callee.type","value":"MemberExpression"},{"property":"expression.argument.callee.property.name","value":"setSemitoneInterval"}],"argument_properties":["expression.argument.arguments[0]"],"children_properties":["expression.argument.arguments[1].body.body"]},"default_vspaces":{"argument":1}},{"name":"settemperament","comment":"Set temperament block","arguments":[{"type":"temperamentname"},{"type":"notename"},{"type":"NumberExpression"}],"ast":{"identifiers":[{"property":"type","value":"ExpressionStatement"},{"property":"expression.type","value":"AwaitExpression"},{"property":"expression.argument.type","value":"CallExpression"},{"property":"expression.argument.callee.type","value":"MemberExpression"},{"property":"expression.argument.callee.property.name","value":"setTemperament"}],"argument_properties":["expression.argument.arguments[0]","expression.argument.arguments[1]","expression.argument.arguments[2]"]},"blocklist_connections":["parent_or_previous_sibling","argument","argument","argument","next_sibling"],"default_vspaces":{"body":3}},{"name":"vibrato","comment":"Vibrato effect block","arguments":[{"type":"NumberExpression"},{"type":"NumberExpression"}],"ast":{"identifiers":[{"property":"type","value":"ExpressionStatement"},{"property":"expression.type","value":"AwaitExpression"},{"property":"expression.argument.type","value":"CallExpression"},{"property":"expression.argument.callee.type","value":"MemberExpression"},{"property":"expression.argument.callee.property.name","value":"doVibrato"}],"argument_properties":["expression.argument.arguments[0]","expression.argument.arguments[1]"],"children_properties":["expression.argument.arguments[2].body.body"]},"blocklist_connections":["parent_or_previous_sibling","argument","argument","first_child","next_sibling"],"default_vspaces":{"argument":2}},{"name":"chorus","comment":"Chorus effect block","arguments":[{"type":"NumberExpression"},{"type":"NumberExpression"},{"type":"NumberExpression"}],"ast":{"identifiers":[{"property":"type","value":"ExpressionStatement"},{"property":"expression.type","value":"AwaitExpression"},{"property":"expression.argument.type","value":"CallExpression"},{"property":"expression.argument.callee.type","value":"MemberExpression"},{"property":"expression.argument.callee.property.name","value":"doChorus"}],"argument_properties":["expression.argument.arguments[0]","expression.argument.arguments[1]","expression.argument.arguments[2]"],"children_properties":["expression.argument.arguments[3].body.body"]},"blocklist_connections":["parent_or_previous_sibling","argument","argument","argument","first_child","next_sibling"],"default_vspaces":{"argument":3}},{"name":"phaser","comment":"Phaser effect block","arguments":[{"type":"NumberExpression"},{"type":"NumberExpression"},{"type":"NumberExpression"}],"ast":{"identifiers":[{"property":"type","value":"ExpressionStatement"},{"property":"expression.type","value":"AwaitExpression"},{"property":"expression.argument.type","value":"CallExpression"},{"property":"expression.argument.callee.type","value":"MemberExpression"},{"property":"expression.argument.callee.property.name","value":"doPhaser"}],"argument_properties":["expression.argument.arguments[0]","expression.argument.arguments[1]","expression.argument.arguments[2]"],"children_properties":["expression.argument.arguments[3].body.body"]},"blocklist_connections":["parent_or_previous_sibling","argument","argument","argument","first_child","next_sibling"],"default_vspaces":{"argument":3}},{"name":"tremolo","comment":"Tremolo effect block","arguments":[{"type":"NumberExpression"},{"type":"NumberExpression"}],"ast":{"identifiers":[{"property":"type","value":"ExpressionStatement"},{"property":"expression.type","value":"AwaitExpression"},{"property":"expression.argument.type","value":"CallExpression"},{"property":"expression.argument.callee.type","value":"MemberExpression"},{"property":"expression.argument.callee.property.name","value":"doTremolo"}],"argument_properties":["expression.argument.arguments[0]","expression.argument.arguments[1]"],"children_properties":["expression.argument.arguments[2].body.body"]},"blocklist_connections":["parent_or_previous_sibling","argument","argument","first_child","next_sibling"],"default_vspaces":{"argument":2}},{"name":"neighbor2","comment":"Neighbor tone block","arguments":[{"type":"NumberExpression"},{"type":"NumberExpression"}],"ast":{"identifiers":[{"property":"type","value":"ExpressionStatement"},{"property":"expression.type","value":"AwaitExpression"},{"property":"expression.argument.type","value":"CallExpression"},{"property":"expression.argument.callee.type","value":"MemberExpression"},{"property":"expression.argument.callee.property.name","value":"doNeighbor"}],"argument_properties":["expression.argument.arguments[0]","expression.argument.arguments[1]"],"children_properties":["expression.argument.arguments[2].body.body"]},"blocklist_connections":["parent_or_previous_sibling","argument","argument","first_child","next_sibling"],"default_vspaces":{"argument":2}},{"name":"setsynthvolume","comment":"Set synth volume block","arguments":[{"type":"voicename"},{"type":"NumberExpression"}],"ast":{"identifiers":[{"property":"type","value":"ExpressionStatement"},{"property":"expression.type","value":"AwaitExpression"},{"property":"expression.argument.type","value":"CallExpression"},{"property":"expression.argument.callee.type","value":"MemberExpression"},{"property":"expression.argument.callee.property.name","value":"setSynthVolume"}],"argument_properties":["expression.argument.arguments[0]","expression.argument.arguments[1]"]},"blocklist_connections":["parent_or_previous_sibling","argument","argument","next_sibling"],"default_vspaces":{"body":2}},{"name":"setnotevolume","comment":"Set master volume block","arguments":[{"type":"NumberExpression"}],"ast":{"identifiers":[{"property":"type","value":"ExpressionStatement"},{"property":"expression.type","value":"AssignmentExpression"},{"property":"expression.operator","value":"="},{"property":"expression.left.type","value":"MemberExpression"},{"property":"expression.left.property.name","value":"MASTERVOLUME"}],"argument_properties":["expression.right"]},"blocklist_connections":["parent_or_previous_sibling","argument","next_sibling"]},{"name":"setpanning","comment":"Set panning block","arguments":[{"type":"NumberExpression"}],"ast":{"identifiers":[{"property":"type","value":"ExpressionStatement"},{"property":"expression.type","value":"AssignmentExpression"},{"property":"expression.operator","value":"="},{"property":"expression.left.type","value":"MemberExpression"},{"property":"expression.left.property.name","value":"PANNING"}],"argument_properties":["expression.right"]},"blocklist_connections":["parent_or_previous_sibling","argument","next_sibling"]},{"name":"playdrum","comment":"Play drum block","arguments":[{"type":"drumname"}],"ast":{"identifiers":[{"property":"type","value":"ExpressionStatement"},{"property":"expression.type","value":"AwaitExpression"},{"property":"expression.argument.type","value":"CallExpression"},{"property":"expression.argument.callee.type","value":"MemberExpression"},{"property":"expression.argument.callee.property.name","value":"playDrum"}],"argument_properties":["expression.argument.arguments[0]"]},"blocklist_connections":["parent_or_previous_sibling","argument","next_sibling"]},{"name":"setdrum","comment":"Set drum block","arguments":[{"type":"effectsname"}],"ast":{"identifiers":[{"property":"type","value":"ExpressionStatement"},{"property":"expression.type","value":"AwaitExpression"},{"property":"expression.argument.type","value":"CallExpression"},{"property":"expression.argument.callee.type","value":"MemberExpression"},{"property":"expression.argument.callee.property.name","value":"setDrum"}],"argument_properties":["expression.argument.arguments[0]"],"children_properties":["expression.argument.arguments[1].body.body"]},"default_vspaces":{"argument":1}},{"name":"mapdrum","comment":"Map pitch to drum block","arguments":[{"type":"drumname"}],"ast":{"identifiers":[{"property":"type","value":"ExpressionStatement"},{"property":"expression.type","value":"AwaitExpression"},{"property":"expression.argument.type","value":"CallExpression"},{"property":"expression.argument.callee.type","value":"MemberExpression"},{"property":"expression.argument.callee.property.name","value":"mapPitchToDrum"}],"argument_properties":["expression.argument.arguments[0]"],"children_properties":["expression.argument.arguments[1].body.body"]},"default_vspaces":{"argument":1}},{"name":"playdrum","comment":"Play drum block","arguments":[{"type":"drumname"}],"ast":{"identifiers":[{"property":"type","value":"ExpressionStatement"},{"property":"expression.type","value":"AwaitExpression"},{"property":"expression.argument.type","value":"CallExpression"},{"property":"expression.argument.callee.type","value":"MemberExpression"},{"property":"expression.argument.callee.property.name","value":"playDrum"}],"argument_properties":["expression.argument.arguments[0]"]},"blocklist_connections":["parent_or_previous_sibling","argument","next_sibling"]},{"name":"setdrum","comment":"Set drum block","arguments":[{"type":"effectsname"}],"ast":{"identifiers":[{"property":"type","value":"ExpressionStatement"},{"property":"expression.type","value":"AwaitExpression"},{"property":"expression.argument.type","value":"CallExpression"},{"property":"expression.argument.callee.type","value":"MemberExpression"},{"property":"expression.argument.callee.property.name","value":"setDrum"}],"argument_properties":["expression.argument.arguments[0]"],"children_properties":["expression.argument.arguments[1].body.body"]},"default_vspaces":{"argument":1}},{"name":"mapdrum","comment":"Map pitch to drum block","arguments":[{"type":"drumname"}],"ast":{"identifiers":[{"property":"type","value":"ExpressionStatement"},{"property":"expression.type","value":"AwaitExpression"},{"property":"expression.argument.type","value":"CallExpression"},{"property":"expression.argument.callee.type","value":"MemberExpression"},{"property":"expression.argument.callee.property.name","value":"mapPitchToDrum"}],"argument_properties":["expression.argument.arguments[0]"],"children_properties":["expression.argument.arguments[1].body.body"]},"default_vspaces":{"argument":1}},{"name":"forward","comment":"Forward block","arguments":[{"type":"NumberExpression"}],"ast":{"identifiers":[{"property":"type","value":"ExpressionStatement"},{"property":"expression.type","value":"AwaitExpression"},{"property":"expression.argument.type","value":"CallExpression"},{"property":"expression.argument.callee.type","value":"MemberExpression"},{"property":"expression.argument.callee.property.name","value":"goForward"}],"argument_properties":["expression.argument.arguments[0]"]},"blocklist_connections":["parent_or_previous_sibling","argument","next_sibling"]},{"name":"back","comment":"Backward block","arguments":[{"type":"NumberExpression"}],"ast":{"identifiers":[{"property":"type","value":"ExpressionStatement"},{"property":"expression.type","value":"AwaitExpression"},{"property":"expression.argument.type","value":"CallExpression"},{"property":"expression.argument.callee.type","value":"MemberExpression"},{"property":"expression.argument.callee.property.name","value":"goBackward"}],"argument_properties":["expression.argument.arguments[0]"]},"blocklist_connections":["parent_or_previous_sibling","argument","next_sibling"]},{"name":"left","comment":"Turn left block","arguments":[{"type":"NumberExpression"}],"ast":{"identifiers":[{"property":"type","value":"ExpressionStatement"},{"property":"expression.type","value":"AwaitExpression"},{"property":"expression.argument.type","value":"CallExpression"},{"property":"expression.argument.callee.type","value":"MemberExpression"},{"property":"expression.argument.callee.property.name","value":"turnLeft"}],"argument_properties":["expression.argument.arguments[0]"]},"blocklist_connections":["parent_or_previous_sibling","argument","next_sibling"]},{"name":"right","comment":"Turn right block","arguments":[{"type":"NumberExpression"}],"ast":{"identifiers":[{"property":"type","value":"ExpressionStatement"},{"property":"expression.type","value":"AwaitExpression"},{"property":"expression.argument.type","value":"CallExpression"},{"property":"expression.argument.callee.type","value":"MemberExpression"},{"property":"expression.argument.callee.property.name","value":"turnRight"}],"argument_properties":["expression.argument.arguments[0]"]},"blocklist_connections":["parent_or_previous_sibling","argument","next_sibling"]},{"name":"setxy","comment":"Set position block","arguments":[{"type":"NumberExpression"},{"type":"NumberExpression"}],"ast":{"identifiers":[{"property":"type","value":"ExpressionStatement"},{"property":"expression.type","value":"AwaitExpression"},{"property":"expression.argument.type","value":"CallExpression"},{"property":"expression.argument.callee.type","value":"MemberExpression"},{"property":"expression.argument.callee.property.name","value":"setXY"}],"argument_properties":["expression.argument.arguments[0]","expression.argument.arguments[1]"]},"blocklist_connections":["parent_or_previous_sibling","argument","argument","next_sibling"],"default_vspaces":{"body":2}},{"name":"setheading","comment":"Set heading block","arguments":[{"type":"NumberExpression"}],"ast":{"identifiers":[{"property":"type","value":"ExpressionStatement"},{"property":"expression.type","value":"AwaitExpression"},{"property":"expression.argument.type","value":"CallExpression"},{"property":"expression.argument.callee.type","value":"MemberExpression"},{"property":"expression.argument.callee.property.name","value":"setHeading"}],"argument_properties":["expression.argument.arguments[0]"]},"blocklist_connections":["parent_or_previous_sibling","argument","next_sibling"]},{"name":"arc","comment":"Draw arc block","arguments":[{"type":"NumberExpression"},{"type":"NumberExpression"}],"ast":{"identifiers":[{"property":"type","value":"ExpressionStatement"},{"property":"expression.type","value":"AwaitExpression"},{"property":"expression.argument.type","value":"CallExpression"},{"property":"expression.argument.callee.type","value":"MemberExpression"},{"property":"expression.argument.callee.property.name","value":"drawArc"}],"argument_properties":["expression.argument.arguments[0]","expression.argument.arguments[1]"]},"blocklist_connections":["parent_or_previous_sibling","argument","argument","next_sibling"],"default_vspaces":{"body":2}},{"name":"controlpoint1","comment":"Set bezier control point 1 block","arguments":[{"type":"NumberExpression"},{"type":"NumberExpression"}],"ast":{"identifiers":[{"property":"type","value":"ExpressionStatement"},{"property":"expression.type","value":"AwaitExpression"},{"property":"expression.argument.type","value":"CallExpression"},{"property":"expression.argument.callee.type","value":"MemberExpression"},{"property":"expression.argument.callee.property.name","value":"setBezierControlPoint1"}],"argument_properties":["expression.argument.arguments[0]","expression.argument.arguments[1]"]},"blocklist_connections":["parent_or_previous_sibling","argument","argument","next_sibling"],"default_vspaces":{"body":2}},{"name":"controlpoint2","comment":"Set bezier control point 2 block","arguments":[{"type":"NumberExpression"},{"type":"NumberExpression"}],"ast":{"identifiers":[{"property":"type","value":"ExpressionStatement"},{"property":"expression.type","value":"AwaitExpression"},{"property":"expression.argument.type","value":"CallExpression"},{"property":"expression.argument.callee.type","value":"MemberExpression"},{"property":"expression.argument.callee.property.name","value":"setBezierControlPoint2"}],"argument_properties":["expression.argument.arguments[0]","expression.argument.arguments[1]"]},"blocklist_connections":["parent_or_previous_sibling","argument","argument","next_sibling"],"default_vspaces":{"body":2}},{"name":"bezier","comment":"Draw bezier block","arguments":[{"type":"NumberExpression"},{"type":"NumberExpression"}],"ast":{"identifiers":[{"property":"type","value":"ExpressionStatement"},{"property":"expression.type","value":"AwaitExpression"},{"property":"expression.argument.type","value":"CallExpression"},{"property":"expression.argument.callee.type","value":"MemberExpression"},{"property":"expression.argument.callee.property.name","value":"drawBezier"}],"argument_properties":["expression.argument.arguments[0]","expression.argument.arguments[1]"]},"blocklist_connections":["parent_or_previous_sibling","argument","argument","next_sibling"],"default_vspaces":{"body":2}},{"name":"clear","comment":"Clear block","ast":{"identifiers":[{"property":"type","value":"ExpressionStatement"},{"property":"expression.type","value":"AwaitExpression"},{"property":"expression.argument.type","value":"CallExpression"},{"property":"expression.argument.callee.type","value":"MemberExpression"},{"property":"expression.argument.callee.property.name","value":"clear"}]},"blocklist_connections":["parent_or_previous_sibling","next_sibling"]},{"name":"scrollxy","comment":"Scroll XY block","arguments":[{"type":"x"},{"type":"y"}],"ast":{"identifiers":[{"property":"type","value":"ExpressionStatement"},{"property":"expression.type","value":"AwaitExpression"},{"property":"expression.argument.type","value":"CallExpression"},{"property":"expression.argument.callee.type","value":"MemberExpression"},{"property":"expression.argument.callee.property.name","value":"scrollXY"}],"argument_properties":["expression.argument.arguments[0]","expression.argument.arguments[1]"]},"blocklist_connections":["parent_or_previous_sibling","argument","argument","next_sibling"],"default_vspaces":{"body":2}},{"name":"setcolor","comment":"Set color block","arguments":[{"type":"NumberExpression"}],"ast":{"identifiers":[{"property":"type","value":"ExpressionStatement"},{"property":"expression.type","value":"AwaitExpression"},{"property":"expression.argument.type","value":"CallExpression"},{"property":"expression.argument.callee.type","value":"MemberExpression"},{"property":"expression.argument.callee.property.name","value":"setColor"}],"argument_properties":["expression.argument.arguments[0]"]},"blocklist_connections":["parent_or_previous_sibling","argument","next_sibling"]},{"name":"setgrey","comment":"Set grey block","arguments":[{"type":"grey"}],"ast":{"identifiers":[{"property":"type","value":"ExpressionStatement"},{"property":"expression.type","value":"AwaitExpression"},{"property":"expression.argument.type","value":"CallExpression"},{"property":"expression.argument.callee.type","value":"MemberExpression"},{"property":"expression.argument.callee.property.name","value":"setGrey"}],"argument_properties":["expression.argument.arguments[0]"]},"blocklist_connections":["parent_or_previous_sibling","argument","next_sibling"]},{"name":"setshade","comment":"Set shade block","arguments":[{"type":"shade"}],"ast":{"identifiers":[{"property":"type","value":"ExpressionStatement"},{"property":"expression.type","value":"AwaitExpression"},{"property":"expression.argument.type","value":"CallExpression"},{"property":"expression.argument.callee.type","value":"MemberExpression"},{"property":"expression.argument.callee.property.name","value":"setShade"}],"argument_properties":["expression.argument.arguments[0]"]},"blocklist_connections":["parent_or_previous_sibling","argument","next_sibling"]},{"name":"sethue","comment":"Set hue block","arguments":[{"type":"color"}],"ast":{"identifiers":[{"property":"type","value":"ExpressionStatement"},{"property":"expression.type","value":"AwaitExpression"},{"property":"expression.argument.type","value":"CallExpression"},{"property":"expression.argument.callee.type","value":"MemberExpression"},{"property":"expression.argument.callee.property.name","value":"setHue"}],"argument_properties":["expression.argument.arguments[0]"]},"blocklist_connections":["parent_or_previous_sibling","argument","next_sibling"]},{"name":"settranslucency","comment":"Set translucency block","arguments":[{"type":"NumberExpression"}],"ast":{"identifiers":[{"property":"type","value":"ExpressionStatement"},{"property":"expression.type","value":"AwaitExpression"},{"property":"expression.argument.type","value":"CallExpression"},{"property":"expression.argument.callee.type","value":"MemberExpression"},{"property":"expression.argument.callee.property.name","value":"setTranslucency"}],"argument_properties":["expression.argument.arguments[0]"]},"blocklist_connections":["parent_or_previous_sibling","argument","next_sibling"]},{"name":"setpensize","comment":"Set pen size block","arguments":[{"type":"pensize"}],"ast":{"identifiers":[{"property":"type","value":"ExpressionStatement"},{"property":"expression.type","value":"AwaitExpression"},{"property":"expression.argument.type","value":"CallExpression"},{"property":"expression.argument.callee.type","value":"MemberExpression"},{"property":"expression.argument.callee.property.name","value":"setPensize"}],"argument_properties":["expression.argument.arguments[0]"]},"blocklist_connections":["parent_or_previous_sibling","argument","next_sibling"]},{"name":"penup","comment":"Pen up block","ast":{"identifiers":[{"property":"type","value":"ExpressionStatement"},{"property":"expression.type","value":"AwaitExpression"},{"property":"expression.argument.type","value":"CallExpression"},{"property":"expression.argument.callee.type","value":"MemberExpression"},{"property":"expression.argument.callee.property.name","value":"penUp"}]},"blocklist_connections":["parent_or_previous_sibling","next_sibling"]},{"name":"pendown","comment":"Pen down block","ast":{"identifiers":[{"property":"type","value":"ExpressionStatement"},{"property":"expression.type","value":"AwaitExpression"},{"property":"expression.argument.type","value":"CallExpression"},{"property":"expression.argument.callee.type","value":"MemberExpression"},{"property":"expression.argument.callee.property.name","value":"penDown"}]},"blocklist_connections":["parent_or_previous_sibling","next_sibling"]},{"name":"background","comment":"Fill background block","ast":{"identifiers":[{"property":"type","value":"ExpressionStatement"},{"property":"expression.type","value":"AwaitExpression"},{"property":"expression.argument.type","value":"CallExpression"},{"property":"expression.argument.callee.type","value":"MemberExpression"},{"property":"expression.argument.callee.property.name","value":"fillBackground"}]},"blocklist_connections":["parent_or_previous_sibling","next_sibling"]},{"name":"setfont","comment":"Set font block","arguments":[{"type":"text"}],"ast":{"identifiers":[{"property":"type","value":"ExpressionStatement"},{"property":"expression.type","value":"AwaitExpression"},{"property":"expression.argument.type","value":"CallExpression"},{"property":"expression.argument.callee.type","value":"MemberExpression"},{"property":"expression.argument.callee.property.name","value":"setFont"}],"argument_properties":["expression.argument.arguments[0]"]},"blocklist_connections":["parent_or_previous_sibling","argument","next_sibling"]},{"name":"print","comment":"print block","arguments":[{"type":"ValueExpression"}],"ast":{"identifiers":[{"property":"type","value":"ExpressionStatement"},{"property":"expression.type","value":"AwaitExpression"},{"property":"expression.argument.type","value":"CallExpression"},{"property":"expression.argument.callee.type","value":"MemberExpression"},{"property":"expression.argument.callee.property.name","value":"print"}],"argument_properties":["expression.argument.arguments[0]"]},"blocklist_connections":["parent_or_previous_sibling","argument","next_sibling"]},{"name":"emptyHeap","comment":"Empty heap block","ast":{"identifiers":[{"property":"type","value":"ExpressionStatement"},{"property":"expression.type","value":"AwaitExpression"},{"property":"expression.argument.type","value":"CallExpression"},{"property":"expression.argument.callee.type","value":"MemberExpression"},{"property":"expression.argument.callee.property.name","value":"emptyHeap"}]},"blocklist_connections":["parent_or_previous_sibling","next_sibling"]},{"name":"reverseHeap","comment":"Reverse heap block","ast":{"identifiers":[{"property":"type","value":"ExpressionStatement"},{"property":"expression.type","value":"AwaitExpression"},{"property":"expression.argument.type","value":"CallExpression"},{"property":"expression.argument.callee.type","value":"MemberExpression"},{"property":"expression.argument.callee.property.name","value":"reverseHeap"}]},"blocklist_connections":["parent_or_previous_sibling","next_sibling"]},{"name":"push","comment":"Push heap block","arguments":[{"type":"ValueExpression"}],"ast":{"identifiers":[{"property":"type","value":"ExpressionStatement"},{"property":"expression.type","value":"AwaitExpression"},{"property":"expression.argument.type","value":"CallExpression"},{"property":"expression.argument.callee.type","value":"MemberExpression"},{"property":"expression.argument.callee.property.name","value":"push"},{"property":"expression.argument.arguments","size":1}],"argument_properties":["expression.argument.arguments[0]"]},"blocklist_connections":["parent_or_previous_sibling","argument","next_sibling"]},{"name":"setHeapEntry","comment":"Set heap entry block","arguments":[{"type":"NumberExpression"},{"type":"NumberExpression"}],"ast":{"identifiers":[{"property":"type","value":"ExpressionStatement"},{"property":"expression.type","value":"AwaitExpression"},{"property":"expression.argument.type","value":"CallExpression"},{"property":"expression.argument.callee.type","value":"MemberExpression"},{"property":"expression.argument.callee.property.name","value":"setHeapEntry"},{"property":"expression.argument.arguments","size":2}],"argument_properties":["expression.argument.arguments[0]","expression.argument.arguments[1]"]},"blocklist_connections":["parent_or_previous_sibling","argument","argument","next_sibling"],"default_vspaces":{"body":2}},{"name":"setHeapEntry","comment":"Set heap entry block (alias)","arguments":[{"type":"NumberExpression"},{"type":"NumberExpression"}],"ast":{"identifiers":[{"property":"type","value":"ExpressionStatement"},{"property":"expression.type","value":"AwaitExpression"},{"property":"expression.argument.type","value":"CallExpression"},{"property":"expression.argument.callee.type","value":"MemberExpression"},{"property":"expression.argument.callee.property.name","value":"setHeap"},{"property":"expression.argument.arguments","size":2}],"argument_properties":["expression.argument.arguments[0]","expression.argument.arguments[1]"]},"blocklist_connections":["parent_or_previous_sibling","argument","argument","next_sibling"],"default_vspaces":{"body":2}},{"name":"debugger","comment":"Debugger block","arguments":[{"type":"BooleanExpression"}],"ast":{"identifiers":[{"property":"type","value":"DebuggerStatement"}]},"blocklist_connections":["parent_or_previous_sibling","argument","next_sibling"]},{"name_map":{"playNote":"newnote","dot":"rhythmicdot2","multiplyNoteValue":"multiplybeatfactor","playNoteMillis":"osctime","doCrescendo":"crescendo","doDecrescendo":"decrescendo","setSemitoneTranspose":"settransposition","setScalarInterval":"interval","doDistortion":"dis","doHarmonic":"harmonic2","setStaccato":"newstaccato","setSlur":"newslur","setRelativeVolume":"articulation"},"comment":"Flow blocks with one number argument","arguments":[{"type":"NumberExpression"}],"ast":{"identifiers":[{"property":"type","value":"ExpressionStatement"},{"property":"expression.type","value":"AwaitExpression"},{"property":"expression.argument.type","value":"CallExpression"},{"property":"expression.argument.callee.type","value":"MemberExpression"}],"argument_properties":["expression.argument.arguments[0]"],"children_properties":["expression.argument.arguments[1].body.body"]},"default_vspaces":{"argument":1}}]} \ No newline at end of file diff --git a/js/js-export/export.js b/js/js-export/export.js index 46f98c4d51..9a7ffcedcd 100644 --- a/js/js-export/export.js +++ b/js/js-export/export.js @@ -316,6 +316,16 @@ class MusicBlocks { } } + _ensureHeap() { + if (!globalActivity.logo.turtleHeaps) { + globalActivity.logo.turtleHeaps = {}; + } + if (!(this.turIndex in globalActivity.logo.turtleHeaps)) { + globalActivity.logo.turtleHeaps[this.turIndex] = []; + } + return globalActivity.logo.turtleHeaps[this.turIndex]; + } + // ========= Getters/Setters =================================================================== // ============================== GRAPHICS ================================ @@ -332,6 +342,72 @@ class MusicBlocks { return this.turtle.orientation; } + // =============================== HEAP =================================== + + get HEAP() { + return JSON.stringify(this._ensureHeap()); + } + + get HEAPLENGTH() { + return this._ensureHeap().length; + } + + get HEAPEMPTY() { + return this._ensureHeap().length === 0; + } + + emptyHeap() { + this._ensureHeap(); + globalActivity.logo.turtleHeaps[this.turIndex] = []; + } + + reverseHeap() { + const heap = this._ensureHeap(); + globalActivity.logo.turtleHeaps[this.turIndex] = heap.reverse(); + } + + setHeapEntry(index, value) { + if (index === null || index === undefined || value === null || value === undefined) { + JSEditor.logConsole("Missing heap index or value.", "maroon"); + return; + } + + if (typeof index !== "number" || typeof value !== "number") { + JSEditor.logConsole("Heap index and value must be numbers.", "maroon"); + return; + } + + let idx = Math.floor(index); + if (idx < 1) { + JSEditor.logConsole("Index must be > 0.", "maroon"); + idx = 1; + } + + if (idx > 1000) { + JSEditor.logConsole("Maximum heap size is 1000.", "maroon"); + idx = 1000; + } + + const heap = this._ensureHeap(); + while (heap.length < idx) { + heap.push(0); + } + heap[idx - 1] = value; + } + + setHeap(index, value) { + this.setHeapEntry(index, value); + } + + push(value) { + if (value === null || value === undefined) { + JSEditor.logConsole("Missing heap value.", "maroon"); + return; + } + const heap = this._ensureHeap(); + heap.push(value); + } + // ================================ PEN =================================== get PENSIZE() { diff --git a/js/js-export/interface.js b/js/js-export/interface.js index 14989cc677..e963dcbeb1 100644 --- a/js/js-export/interface.js +++ b/js/js-export/interface.js @@ -119,6 +119,10 @@ class JSInterface { x: "X", y: "Y", heading: "HEADING", + // Heap blocks + heap: "HEAP", + heapLength: "HEAPLENGTH", + heapEmpty: "HEAPEMPTY", // Pen blocks pensize: "PENSIZE", color: "COLOR", @@ -192,6 +196,11 @@ class JSInterface { setdrum: "setDrum", mapdrum: "mapPitchToDrum", playnoise: "playNoise", + // Heap blocks + emptyHeap: "emptyHeap", + reverseHeap: "reverseHeap", + setHeapEntry: "setHeapEntry", + push: "push", // Number blocks random: "MathUtility.doRandom", oneOf: "MathUtility.doOneOf",