1919 RhythmRuler, FILTERTYPES, instrumentsFilters, DEFAULTFILTERTYPE,
2020 TemperamentWidget, TimbreWidget, ModeWidget, PitchSlider,
2121 MusicKeyboard, PitchStaircase, SampleWidget, _THIS_IS_MUSIC_BLOCKS_,
22- Arpeggio
22+ Arpeggio, LegoWidget
2323 */
2424
2525/*
6060 MusicKeyboard
6161 - js/widgets/pitchstaircase.js
6262 PitchStaircase
63+ - js/widgets/legobricks.js
64+ LegoWidget
6365 */
6466
6567/* exported setupWidgetBlocks */
@@ -1652,6 +1654,91 @@ function setupWidgetBlocks(activity) {
16521654 return [ args [ 0 ] , 1 ] ;
16531655 }
16541656 }
1657+
1658+ /**
1659+ * Represents a block for controlling LEGO brick parameters and visualization.
1660+ * @extends StackClampBlock
1661+ */
1662+ class LegoBricksBlock extends StackClampBlock {
1663+ constructor ( ) {
1664+ super ( "legobricks" ) ;
1665+ this . setPalette ( "widgets" , activity ) ;
1666+ this . parameter = true ;
1667+ this . beginnerBlock ( true ) ;
1668+
1669+ this . setHelpString ( [
1670+ _ ( "The LEGO Bricks block opens a widget for designing virtual LEGO creations." ) ,
1671+ "documentation" ,
1672+ null ,
1673+ "legobricks"
1674+ ] ) ;
1675+
1676+ //.TRANS: LEGO bricks designer
1677+ this . formBlock ( { name : _ ( "LEGO Bricks" ) , canCollapse : true } ) ;
1678+ this . makeMacro ( ( x , y ) => [
1679+ [ 0 , "legobricks" , x , y , [ null , 1 , 18 ] ] ,
1680+ [ 1 , "pitch" , 0 , 0 , [ 0 , 2 , 3 , 4 ] ] ,
1681+ [ 2 , [ "solfege" , { value : "do" } ] , 0 , 0 , [ 1 ] ] ,
1682+ [ 3 , [ "number" , { value : 4 } ] , 0 , 0 , [ 1 ] ] ,
1683+ [ 4 , "pitch" , 0 , 0 , [ 1 , 5 , 6 , 7 ] ] ,
1684+ [ 5 , [ "solfege" , { value : "re" } ] , 0 , 0 , [ 4 ] ] ,
1685+ [ 6 , [ "number" , { value : 4 } ] , 0 , 0 , [ 4 ] ] ,
1686+ [ 7 , "pitch" , 0 , 0 , [ 4 , 8 , 9 , 10 ] ] ,
1687+ [ 8 , [ "solfege" , { value : "mi" } ] , 0 , 0 , [ 7 ] ] ,
1688+ [ 9 , [ "number" , { value : 4 } ] , 0 , 0 , [ 7 ] ] ,
1689+ [ 10 , "pitch" , 0 , 0 , [ 7 , 11 , 12 , 13 ] ] ,
1690+ [ 11 , [ "solfege" , { value : "fa" } ] , 0 , 0 , [ 10 ] ] ,
1691+ [ 12 , [ "number" , { value : 4 } ] , 0 , 0 , [ 10 ] ] ,
1692+ [ 13 , "pitch" , 0 , 0 , [ 10 , 14 , 15 , 16 ] ] ,
1693+ [ 14 , [ "solfege" , { value : "sol" } ] , 0 , 0 , [ 13 ] ] ,
1694+ [ 15 , [ "number" , { value : 4 } ] , 0 , 0 , [ 13 ] ] ,
1695+ [ 16 , "playdrum" , 0 , 0 , [ 13 , 17 , null ] ] ,
1696+ [ 17 , [ "drumname" , { value : "kick drum" } ] , 0 , 0 , [ 16 ] ] ,
1697+ [ 18 , "hiddennoflow" , 0 , 0 , [ 0 , null ] ]
1698+ ] ) ;
1699+ }
1700+
1701+ /**
1702+ * Handles the flow of data for the LEGO bricks block.
1703+ * @param {any[] } args - The arguments passed to the block.
1704+ * @param {object } logo - The logo object.
1705+ * @param {object } turtle - The turtle object.
1706+ * @param {object } blk - The block object.
1707+ * @returns {number[] } - The output values.
1708+ */
1709+ flow ( args , logo , turtle , blk ) {
1710+ logo . inLegoWidget = true ;
1711+
1712+ if ( logo . legoWidget === null ) {
1713+ logo . legoWidget = new LegoWidget ( ) ;
1714+ }
1715+ logo . legoWidget . blockNo = blk ;
1716+
1717+ logo . legoWidget . rowLabels = [ ] ;
1718+ logo . legoWidget . rowArgs = [ ] ;
1719+ logo . legoWidget . clearBlocks ( ) ;
1720+
1721+ const listenerName = "_legobricks_" + turtle ;
1722+ logo . setDispatchBlock ( blk , turtle , listenerName ) ;
1723+
1724+ const __listener = ( ) => {
1725+ if ( logo . legoWidget . rowLabels . length === 0 ) {
1726+ activity . errorMsg (
1727+ _ ( "You must have at least one pitch block in the LEGO bricks widget." ) ,
1728+ blk
1729+ ) ;
1730+ } else {
1731+ logo . legoWidget . blockNo = blk ;
1732+ logo . legoWidget . init ( activity ) ;
1733+ }
1734+ logo . inLegoWidget = false ;
1735+ } ;
1736+
1737+ logo . setTurtleListener ( turtle , listenerName , __listener ) ;
1738+
1739+ if ( args . length === 1 ) return [ args [ 0 ] , 1 ] ;
1740+ }
1741+ }
16551742 // Set up blocks if this is Music Blocks environment
16561743 if ( _THIS_IS_MUSIC_BLOCKS_ ) {
16571744 new EnvelopeBlock ( ) . setup ( activity ) ;
@@ -1667,6 +1754,7 @@ function setupWidgetBlocks(activity) {
16671754 new oscilloscopeWidgetBlock ( ) . setup ( activity ) ;
16681755 new PitchSliderBlock ( ) . setup ( activity ) ;
16691756 new ChromaticBlock ( ) . setup ( activity ) ;
1757+ new LegoBricksBlock ( ) . setup ( activity ) ;
16701758 // new AIMusicBlocks().setup(activity);
16711759 new MusicKeyboard2Block ( ) . setup ( activity ) ;
16721760 new MusicKeyboardBlock ( ) . setup ( activity ) ;
0 commit comments