diff --git a/extras/BLOCKS/doxygen/Doxyfile b/extras/BLOCKS/doxygen/Doxyfile deleted file mode 100644 index 93bc4264a6..0000000000 --- a/extras/BLOCKS/doxygen/Doxyfile +++ /dev/null @@ -1,34 +0,0 @@ -PROJECT_NAME = "The BLOCKS SDK" - -LAYOUT_FILE = DoxygenLayout.xml - -INPUT = build pages - -EXAMPLE_PATH = ../standalone_sdk/examples ../../../examples/BLOCKS ../../../modules - -IMAGE_PATH = images - -HTML_HEADER = header.html - -HTML_FOOTER = footer.html - -HTML_EXTRA_STYLESHEET = stylesheet.css - -DISABLE_INDEX = YES - -GENERATE_TREEVIEW = YES - -ALIASES += "tags{1}=" - -ALIASES += "s_break=
" -ALIASES += "s_file{1}=\1" -ALIASES += "s_code{1}=\1" -ALIASES += "s_projcode{1}=\1" -ALIASES += "s_item{1}=\1" - -ALIASES += "jucelink{1}=\1" -ALIASES += "jucegithub{1}=\1" -ALIASES += "blocksgithub{1}=\1" -ALIASES += "blockscode{1}=\1" -ALIASES += "littlefootgithub{1}=\1" -ALIASES += "jucetutorials{1}=\1" diff --git a/extras/BLOCKS/doxygen/DoxygenLayout.xml b/extras/BLOCKS/doxygen/DoxygenLayout.xml deleted file mode 100644 index 7813064718..0000000000 --- a/extras/BLOCKS/doxygen/DoxygenLayout.xml +++ /dev/null @@ -1,89 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/extras/BLOCKS/doxygen/Makefile b/extras/BLOCKS/doxygen/Makefile deleted file mode 100644 index 23d16228a0..0000000000 --- a/extras/BLOCKS/doxygen/Makefile +++ /dev/null @@ -1,24 +0,0 @@ -SHELL := /bin/bash - -INCLUDED_MODULES := juce_audio_basics,juce_audio_devices,juce_blocks_basics,juce_core,juce_events - -SOURCE_FILES := $(shell find ../../../modules -type f -name "juce_*.h" -or -name "juce_*.dox"| sed 's/ /\\ /g') -EXAMPLE_DIRS := ../standalone_sdk/examples ../../../examples/BLOCKS -EXAMPLE_SOURCE_FILES := $(foreach DIR,$(EXAMPLE_DIRS),$(shell find $(DIR) -type f -name "*.h" -or -name "*.cpp" | sed 's/ /\\ /g')) -DOCUMENTATION_FILES := $(shell find pages -type f -name "*.dox" | sed 's/ /\\ /g') -IMAGES := $(shell find images -type f | sed 's/ /\\ /g') - -.PHONEY: clean - -doc/index.html: build/Doxyfile DoxygenLayout.xml footer.html header.html stylesheet.css $(DOCUMENTATION_FILES) $(EXAMPLE_SOURCE_FILES) $(IMAGES) - doxygen $< - -build/Doxyfile: ../../../doxygen/Doxyfile Doxyfile build/juce_modules.dox - cat ../../../doxygen/Doxyfile Doxyfile > $@ - -build/juce_modules.dox: ../../../doxygen/process_source_files.py $(SOURCE_FILES) - rm -rf build - python $< ../../../modules build --subdirs=$(INCLUDED_MODULES) - -clean: - rm -rf build doc diff --git a/extras/BLOCKS/doxygen/footer.html b/extras/BLOCKS/doxygen/footer.html deleted file mode 100644 index a39221c23d..0000000000 --- a/extras/BLOCKS/doxygen/footer.html +++ /dev/null @@ -1,4 +0,0 @@ - -
- - diff --git a/extras/BLOCKS/doxygen/header.html b/extras/BLOCKS/doxygen/header.html deleted file mode 100644 index 0ea4e919d4..0000000000 --- a/extras/BLOCKS/doxygen/header.html +++ /dev/null @@ -1,67 +0,0 @@ - - - - - - - - -$projectname: $title -$title - - - - - - - - - - - - -$mathjax - -$extrastylesheet - - -
- - -
- - - - - - - - - - - - - - - - - - - - - -
-
$projectname -  $projectnumber -
-
$projectbrief
-
-
$projectbrief
-
$searchbox
-
- - diff --git a/extras/BLOCKS/doxygen/images/BlocksDrawing_canvas.JPG b/extras/BLOCKS/doxygen/images/BlocksDrawing_canvas.JPG deleted file mode 100644 index 7487c7c110..0000000000 Binary files a/extras/BLOCKS/doxygen/images/BlocksDrawing_canvas.JPG and /dev/null differ diff --git a/extras/BLOCKS/doxygen/images/BlocksDrawing_palette.JPG b/extras/BLOCKS/doxygen/images/BlocksDrawing_palette.JPG deleted file mode 100644 index fcfe7510fa..0000000000 Binary files a/extras/BLOCKS/doxygen/images/BlocksDrawing_palette.JPG and /dev/null differ diff --git a/extras/BLOCKS/doxygen/images/BlocksMonitor.png b/extras/BLOCKS/doxygen/images/BlocksMonitor.png deleted file mode 100644 index e34ea30e96..0000000000 Binary files a/extras/BLOCKS/doxygen/images/BlocksMonitor.png and /dev/null differ diff --git a/extras/BLOCKS/doxygen/images/BlocksSynth_grid.JPG b/extras/BLOCKS/doxygen/images/BlocksSynth_grid.JPG deleted file mode 100644 index a7626f258c..0000000000 Binary files a/extras/BLOCKS/doxygen/images/BlocksSynth_grid.JPG and /dev/null differ diff --git a/extras/BLOCKS/doxygen/images/BlocksSynth_waveshape.gif b/extras/BLOCKS/doxygen/images/BlocksSynth_waveshape.gif deleted file mode 100644 index e472685ccd..0000000000 Binary files a/extras/BLOCKS/doxygen/images/BlocksSynth_waveshape.gif and /dev/null differ diff --git a/extras/BLOCKS/doxygen/images/blocks_code_interface.png b/extras/BLOCKS/doxygen/images/blocks_code_interface.png deleted file mode 100644 index 2fc75ba016..0000000000 Binary files a/extras/BLOCKS/doxygen/images/blocks_code_interface.png and /dev/null differ diff --git a/extras/BLOCKS/doxygen/images/blocks_code_tabs.png b/extras/BLOCKS/doxygen/images/blocks_code_tabs.png deleted file mode 100644 index b41e487ae5..0000000000 Binary files a/extras/BLOCKS/doxygen/images/blocks_code_tabs.png and /dev/null differ diff --git a/extras/BLOCKS/doxygen/pages/juce_connecting_blocks.dox b/extras/BLOCKS/doxygen/pages/juce_connecting_blocks.dox deleted file mode 100644 index 8ca14d5e20..0000000000 --- a/extras/BLOCKS/doxygen/pages/juce_connecting_blocks.dox +++ /dev/null @@ -1,34 +0,0 @@ -/** -@page connecting_blocks Connecting BLOCKS - -Lightpads can be conected to a computer either via USB or Bluetooth, and Control Blocks can be connected via Bluetooth or by snapping to an already connected Lightpad. -Both devices communicate with your computer using System Exclusive (SysEx) MIDI messages. - -@section usb USB - -To connect a Lightpad to your computer over USB, you need to insert a USB-C cable into the top of the device and connect it to a USB port on your computer. -When powered on by pressing the power button on the bottom edge, you will be able to send and receive data from the block over the USB connection. - -@section bluetooth Bluetooth - -The power button also functions as a toggle for the Bluetooth connection - when the blue light on the button is illuminated, the device is able to connect via Bluetooth and send and receive MIDI data. -Pressing this button will turn the light off and disable the Bluetooth functionality. -Currently MIDI over Bluetooth is only supported on macOS. - -@subsection mac_bluetooth macOS - -To connect a BLOCKS device via Bluetooth on macOS, follow these steps: - -- Open the "Audio Midi Setup" application (found in Applications/Utilities) -- Click on the menu item: Window -> Show MIDI Studio -- Double-click on the "Bluetooth" icon in the MIDI Studio window -- Click the "Connect" button next to the block you want to connect to -- Your device should show up in the MIDI Studio window with a Bluetooth icon and can now send and receive MIDI data over Bluetooth - -@section connecting_blocks_to_each_other Connecting BLOCKS together - -Lightpad and Control Blocks can be connected together in any number of combinations via their DNA edge connectors, sharing a common connection to your computer. -To do this, simply snap your devices together and the magnetic connectors will handle the rest. - -Learn how to discover BLOCKS in your applications in the @ref discovering_blocks section. -*/ diff --git a/extras/BLOCKS/doxygen/pages/juce_controlling_control_buttons.dox b/extras/BLOCKS/doxygen/pages/juce_controlling_control_buttons.dox deleted file mode 100644 index 5c7e6886b9..0000000000 --- a/extras/BLOCKS/doxygen/pages/juce_controlling_control_buttons.dox +++ /dev/null @@ -1,53 +0,0 @@ -/** -@page controlling_control_buttons Controlling control buttons - -In addition to sending button pressed and button released events, ControlButton objects can allow your application code to change the colour of the LED behind the corresponding physical button on a BLOCKS device. - -An array of pointers to the available %ControlButton objects can be obtained from the Block::getButtons() method of a Block --- see the @ref discovering_blocks section for details of how to obtain a %Block object. -Once you have a %ControlButton, the functions involving the LED are ControlButton::hasLight() and ControlButton::setLightColour(), which are descriptively named. -A code snippet showing how to turn all the available buttons of a %Block red is shown below. - -@code{.cpp} -class BlockButtonExample -{ - void setAllButtonsRed (Block& block) - { - for (auto button : block.getButtons()) - if (button->hasLight()) - button->setLightColour (LEDColour (0xffff0000)); - } -}; -@endcode - -@section controlling_control_buttons_example_usage Example usage - -To add this functionality to the BlockFinder example project, add the above function to the BlockFinder class implementation. Then in the @s_projcode{topologyChanged()} callback, check if the connected %Block is a Control %Block and call the above function as shown below: - -@code{.cpp} -void topologyChanged() override -{ - //... - for (auto& block : currentTopology.blocks) - { - //... - if (block->getType() == Block::liveBlock || block->getType() == Block::loopBlock - || block->getType() == Block::developerControlBlock || block->getType() == Block::touchBlock) - { - setAllButtonsRed (*block); - } - } -} -@endcode - -If you run the application now and connect a Control %Block, you should see the control buttons turn red. - -Learn more about other Block methods from the following pages: - -@ref getting_touch_events - -@ref getting_control_button_events - -@ref controlling_led_grids - -@ref controlling_led_strips -*/ diff --git a/extras/BLOCKS/doxygen/pages/juce_controlling_led_grids.dox b/extras/BLOCKS/doxygen/pages/juce_controlling_led_grids.dox deleted file mode 100644 index 2134e3f66b..0000000000 --- a/extras/BLOCKS/doxygen/pages/juce_controlling_led_grids.dox +++ /dev/null @@ -1,70 +0,0 @@ -/** -@page controlling_led_grids Controlling LED grids - -@section controlling_led_grids_basic_usage Basic usage - -An LED grid on a BLOCKS device can be controlled via an LEDGrid object, which can be obtained from the Block::getLEDGrid() function of a Block --- see the @ref discovering_blocks section for details of how to obtain a %Block object. - -Using a LED grid requires a Block::Program to operate the LEDs. -This program specifies some code to run on the device, and can also provide methods to be called from your application which can communicate with the code running on the device via a block of shared memory. -The code which runs on the device must be specified using @ref the_littlefoot_language, which is described in the corresponding section. -However, for a very wide range of applications, the BitmapLEDProgram provided with the BLOCKS SDK is sufficient and you will not need to create your own. -Using a %BitmapLEDProgram to change the colour of LEDs is demonstated below. - -@code{.cpp} -class BlockProgramExample -{ -public: - // This should be called when doing the initial configuration of your application. - void setBitmapLEDProgram (Block& block) - { - block.setProgram (new BitmapLEDProgram (block)); - } - - // Once a BitmapLEDProgram is loaded we can use its setLED() method to change the - // colour of LEDs on the corresponding device. - void setLED (Block& block, int x, int y, LEDColour c) - { - if (auto program = dynamic_cast (block.getProgram())) - program->setLED (x, y, c); - } -}; -@endcode - -@section controlling_led_grids_example_usage Example usage - -To add this functionality to the BlockFinder example project, add the above functions to the BlockFinder class implementation. Then in the @s_projcode{topologyChanged()} callback, check if the connected %Block is a Lightpad and call the above functions as shown below: - -@code{.cpp} -void topologyChanged() override -{ - //... - for (auto& block : currentTopology.blocks) - { - //... - if (block->getType() == Block::lightPadBlock) - { - setBitmapLEDProgram (*block); - setLED (*block, 7, 7, LEDColour (0xff00ff00)); - } - } -} -@endcode - -If you run the application now and connect a Lightpad, you should see a single green dot displayed in the centre of the surface. - -@section controlling_led_grids_advanced_usage Advanced Usage - -Using a custom %Block::Program allows more precise control over the operation of the LEDs. -The code which will actually execute on the device, returned by your overriden Block::Program::getLittleFootProgram() function, must be specified in the LittleFoot language. - -Learn more about other Block methods from the following pages: - -@ref getting_touch_events - -@ref getting_control_button_events - -@ref controlling_led_strips - -@ref controlling_control_buttons -*/ diff --git a/extras/BLOCKS/doxygen/pages/juce_controlling_led_strips.dox b/extras/BLOCKS/doxygen/pages/juce_controlling_led_strips.dox deleted file mode 100644 index f45e9a2b50..0000000000 --- a/extras/BLOCKS/doxygen/pages/juce_controlling_led_strips.dox +++ /dev/null @@ -1,54 +0,0 @@ -/** -@page controlling_led_strips Controlling LED strips - -Control Blocks have a strip of LEDs which can be controlled via an LEDRow object. - -A pointer to an %LEDRow object can be obtained from the Block::getLEDRow() method of a Block --- see the @ref discovering_blocks section for details of how to obtain a %Block object. -Once you have an %LEDRow there are a few functions that you can use to interact with the strip of LEDs on a device. -A code snippet showing how to turn the whole strip of LEDs on a %Block yellow is shown below. - -@code{.cpp} -class BlockLEDExample -{ -public: - void setWholeLEDRowYellow (Block& block) - { - if (auto ledRow = block.getLEDRow()) - for (int i = 0; i < ledRow->getNumLEDs(); ++i) - ledRow->setLEDColour (i, LEDColour (0xffffff00)); - } -}; -@endcode - -@section controlling_led_strips_example_usage Example usage - -To add this functionality to the BlockFinder example project, add the above function to the BlockFinder class implementation. Then in the @s_projcode{topologyChanged()} callback, check if the connected %Block is a Control %Block and call the above function as shown below: - -@code{.cpp} -void topologyChanged() override -{ - //... - for (auto& block : currentTopology.blocks) - { - //... - if (block->getType() == Block::liveBlock || block->getType() == Block::loopBlock - || block->getType() == Block::developerControlBlock || block->getType() == Block::touchBlock) - { - setWholeLEDRowYellow (*block); - } - } -} -@endcode - -If you run the application now and connect a Control %Block, you should see the LEDs in the strip turn yellow. - -Learn more about other Block methods from the following pages: - -@ref getting_touch_events - -@ref getting_control_button_events - -@ref controlling_led_grids - -@ref controlling_control_buttons -*/ diff --git a/extras/BLOCKS/doxygen/pages/juce_discovering_blocks.dox b/extras/BLOCKS/doxygen/pages/juce_discovering_blocks.dox deleted file mode 100644 index 7b6c9aaf07..0000000000 --- a/extras/BLOCKS/doxygen/pages/juce_discovering_blocks.dox +++ /dev/null @@ -1,60 +0,0 @@ -/** -@page discovering_blocks Discovering BLOCKS - -Any BLOCKS application would be pretty limited without the ability to discover the BLOCKS that are connected to your computer. -This page gives an overview of the classes and methods available to aid BLOCKS discovery and provides sample code for getting notifications of any connections or disconnections. - -@section the_block_topology_object The BlockTopology object - -Groups of connected Lightpad and Control Blocks are described by a BlockTopology. - -A %BlockTopology contains an array of references to Block objects, which provide access to Lightpad and Control %Block functionality, and an array of BlockDeviceConnection objects, which describe the connections between devices. -Once you have a %BlockTopology you have all the information required to visualise and interact with your Lightpads and Control Blocks. -For more information about using %Block objects see @ref the_block_object section. - -For Lightpads and Control Blocks, a %BlockTopology can be obtained from a PhysicalTopologySource. - -@section the_physical_topology_source_object The PhysicalTopologySource object - -The current topology is provided by a %PhysicalTopologySource. -When instantiated, a %PhysicalTopologySource monitors for any connections from your computer to any Lightpad and Control Blocks and the PhysicalTopologySource::getCurrentTopology() method returns the current %BlockTopology. - -In an environment where Lightpad and Control Blocks can be connected and disconnected dynamically it is convenient to register your code for @s_projcode{topologyChanged()} callbacks from a %PhysicalTopologySource. -Then, when the current %BlockTopology changes, your application is able to react to the new configuration. -You can do this by inheriting from the TopologySource::Listener class and registering as a listener to a %PhysicalTopologySource object. -When you inherit from %TopologySource::Listener you must override the pure virtual method TopologySource::Listener::topologyChanged(), which is then called by a %PhysicalTopologySource on topology changes when you register as a listener. - -A simple example is shown below. - -BlockFinder.h: -@include BlockFinder/BlockFinder.h - -BlockFinder.cpp: -@include BlockFinder/BlockFinder.cpp - -When instantiated this class simply monitors for changes to the connected Lightpad and Control Blocks and prints some information about them to @s_code{stdout}. -Once you have the current %BlockTopology object you have access to the available %Block objects and can start to interact with them. -A more complex application would probably do much more in the @s_projcode{topologyChanged()} method---see the @ref example_applications page. - -You can find this simple example in the @s_file{examples/BlockFinder/} directory of the BLOCKS-SDK and the following sections will build on top of this project. If you need help with downloading and installing the BLOCKS-SDK, please refer to @ref the_standalone_blocks_sdk section. - -@section the_block_object The Block object - -A Block object is the main entry point for communicating between your application and any Lightpad and Control Blocks that are connected to your computer. - -All the different %Block types are subclasses of %Block so they provide the same interface (see the Block class documentation). -About half of the %Block public member functions return information about the physical device it represents. -In the example code above you can see that we use some of these methods to query each %Block about its current status. -The more interesting %Block methods return pointers to objects you can use to control and receive events from individual BLOCKS. -More detail about these methods can be obtained from the following pages: - -@ref getting_touch_events - -@ref getting_control_button_events - -@ref controlling_led_grids - -@ref controlling_led_strips - -@ref controlling_control_buttons -*/ diff --git a/extras/BLOCKS/doxygen/pages/juce_downloading_the_sdk.dox b/extras/BLOCKS/doxygen/pages/juce_downloading_the_sdk.dox deleted file mode 100644 index 999acb87c8..0000000000 --- a/extras/BLOCKS/doxygen/pages/juce_downloading_the_sdk.dox +++ /dev/null @@ -1,23 +0,0 @@ -/** -@page downloading_the_sdk Downloading the SDK - -@section writing_littlefoot_scripts Writing scripts using the LittleFoot language - -If your goal is to develop simple scripts that can be loaded onto the BLOCKS hardware and run independently from a host application, you should read about @ref the_littlefoot_language. To get started quickly, you can download the BLOCKS CODE IDE @blockscode{here} and write all your LittleFoot code in there. BLOCKS CODE is designed to work seemlessly with BLOCKS hardware and allow you to compile and upload LittleFoot scripts to BLOCKS instantly. -More details are provided in @ref the_littlefoot_language and @ref example_scripts sections. - -@section integrating_blocks_sdk Integrating BLOCKS SDK into existing applications - -You can also download the standalone BLOCKS SDK from GitHub @blocksgithub{here}. -This is a stripped down version of what JUCE provides, including only the features required for the SDK. -Using this version of the SDK is much more complicated but may be more suitable for integrating BLOCKS into an existing application. -More details are provided in @ref the_standalone_blocks_sdk and @ref example_integrations sections. - -@section building_blocks_applications Building BLOCKS applications using JUCE - -The BLOCKS SDK is distributed as part of the @jucelink{JUCE framework}, which can be obtained from GitHub @jucegithub{here}. -The JUCE repository also contains the code for the @ref example_applications, which require the JUCE framework to compile. -Whilst you don't need to know anything about JUCE to build the examples using the supplied Visual Studio/Xcode/Makefile projects, it will probably be worthwhile reading some JUCE tutorials, which can be found @jucetutorials{here}. - -Learn how to connect BLOCKS in the @ref connecting_blocks section or start discovering BLOCKS in your applications by jumping to the @ref discovering_blocks section. -*/ diff --git a/extras/BLOCKS/doxygen/pages/juce_example_applications.dox b/extras/BLOCKS/doxygen/pages/juce_example_applications.dox deleted file mode 100644 index 18d080b57a..0000000000 --- a/extras/BLOCKS/doxygen/pages/juce_example_applications.dox +++ /dev/null @@ -1,27 +0,0 @@ -/** -@page example_applications Example JUCE Applications - -@section downloading_the_example_code Downloading the example code - -These example applications demonstrate the functionality of the BLOCKS SDK. - -The example applications are all distributed as part of the @jucelink{JUCE framework}, which can be obtained from GitHub @jucegithub{here}. -You will find the examples in the @s_file{JUCE/examples/BLOCKS/} directory. -First, you need to generate a Projucer project from the corresponding PIP file of each example project. If you don't know how to do this, please refer to the JUCE tutorials @jucetutorials{here}. This will create projects for Visual Studio, Xcode and Makefile in the @s_file{Builds} subdirectory of each example directory, and these should open, compile and run without any trouble in the respective IDEs. - -@section example_applications_overview Overview - -@subpage example_blocks_monitor - -BlocksMonitor is a simple JUCE application that shows currently connected Lightpad and Control %Block devices and visualises touches and button presses. -It also displays some basic information about the Blocks. - -@subpage example_blocks_drawing - -BlocksDrawing is a JUCE application that allows you to use your Lightpad as a drawing surface. -You can choose from a palette of 9 base colours and paint them on the 15x15 LED grid, blending between colours using touch pressure. - -@subpage example_blocks_synth - -BlocksSynth is a JUCE application that turns your Lightpad into a simple monophonic synthesiser capable of playing 4 different waveshapes - sine, square, sawtooth and triangle. -*/ diff --git a/extras/BLOCKS/doxygen/pages/juce_example_bitmap_led_program.dox b/extras/BLOCKS/doxygen/pages/juce_example_bitmap_led_program.dox deleted file mode 100644 index 7c701647b7..0000000000 --- a/extras/BLOCKS/doxygen/pages/juce_example_bitmap_led_program.dox +++ /dev/null @@ -1,19 +0,0 @@ -/** -@page example_bitmap_led_program The %BitmapLEDProgram class - -@section littlefoot_example A LittleFoot example - -The %BitmapLEDProgram class is a simple example of a LittleFoot program. - -@s_file{%juce_blocks_basics/visualisers/juce_BitmapLEDProgram.h} -@include juce_blocks_basics/visualisers/juce_BitmapLEDProgram.h - -@s_file{juce_blocks_basics/visualisers/juce_BitmapLEDProgram.cpp} -@include juce_blocks_basics/visualisers/juce_BitmapLEDProgram.cpp - -The repaint() method of the LittleFoot program is called at approximately 25 Hz, and each time it simply inspects the heap (the shared area of memory used to communicate between your application code and your LittleFoot program) and sets the LEDs based on the heap's content. -To update the heap, and hence the LEDs, your application code calls BitmapLEDProgram::setLED(). - -A more advanced example can be found in the source code of the DrumPadGridProgram class or in the @ref example_blocks_synth example. - -*/ diff --git a/extras/BLOCKS/doxygen/pages/juce_example_block_finder.dox b/extras/BLOCKS/doxygen/pages/juce_example_block_finder.dox deleted file mode 100644 index 2c5b9103b9..0000000000 --- a/extras/BLOCKS/doxygen/pages/juce_example_block_finder.dox +++ /dev/null @@ -1,29 +0,0 @@ -/** -@page example_block_finder BlockFinder - -In order to compile and run this application you need to first download and compile the BLOCKS-SDK, which can be obtained from GitHub @blocksgithub{here}. If you need help with this step, please refer to @ref the_standalone_blocks_sdk section. - -@section standalone_example An example application - -The source code for this example can be found in the @blocksgithub{BLOCKS-SDK repository} at @s_file{examples/BlockFinder/}, with the parts that are specific to different operating systems in the corresponding subdirectories. - -The main functionality of the application is contained within the following class: - -@s_file{BlockFinder/BlockFinder.h}: -@include BlockFinder/BlockFinder.h - -@s_file{BlockFinder/BlockFinder.cpp}: -@include BlockFinder/BlockFinder.cpp - -All this class does is create a PhysicalTopologySource and register for TopologySource::Listener::topologyChanged() callbacks --- for more information about how this works you should see the @ref discovering_blocks section. -When the topology changes we print some information about the available BLOCKS. - -The @s_projcode{main} function of the macOS application is the easiest to understand. - -@s_file{BlockFinder/MacOS/main.mm}: -@include BlockFinder/MacOS/main.mm - -Here we simply perform some JUCE initialisation, instantiate a BlockFinder class, then run the event loop. -Whilst in the event loop, the @s_projcode{finder} object receives TopologySource::Listener::topologyChanged() callbacks and we see output printed to @s_code{stdout} when BLOCKS are connected or disconnected. - -*/ diff --git a/extras/BLOCKS/doxygen/pages/juce_example_blocks_drawing.dox b/extras/BLOCKS/doxygen/pages/juce_example_blocks_drawing.dox deleted file mode 100644 index 8aaa4b032f..0000000000 --- a/extras/BLOCKS/doxygen/pages/juce_example_blocks_drawing.dox +++ /dev/null @@ -1,252 +0,0 @@ -/** -@page example_blocks_drawing BlocksDrawing - -In order to compile and run this application you need to first download the @jucelink{JUCE framework}, which can be obtained from GitHub @jucegithub{here}. - -@section blocks_drawing_introduction Introduction - -BlocksDrawing is a JUCE application that allows you to use your Lightpad as a drawing surface. You can choose from a palette of 9 base colours and paint them on the 15x15 LED grid, blending between colours using touch pressure. - -Generate a Projucer project from the PIP file located in the @s_file{JUCE/examples/BLOCKS/} folder, then navigate to the @s_file{BlocksDrawingDemo/Builds/} directory and open the code project in your IDE of choice. Run the application and connect your Lightpad (if you do not know how to do this, see @ref connecting_blocks) - it should now display a 3x3 grid of colours to choose from. Touch a colour to set it as the current brush colour and then press the mode button to switch to canvas mode where you will be presented with a blank touch surface. Touch anywhere on the LED grid to start painting and use the pressure of your touch to control how bright the colour is. Try painting over an already painted LED to increase its brightness and blend between different colours by doing this with a different brush colour. To clear the canvas and start over, double-click the mode button. - -The concept of a BLOCKS topology and the methods for receiving callbacks from a Block object are covered in the @ref example_blocks_monitor example and this tutorial will cover the methods in the API for displaying grids and setting LEDs on the Lightpad. - -@section blocks_drawing_led_grid The LEDGrid Object - -Lightpads have a 15x15 LED grid which can be accessed and controlled through the LEDGrid object, a pointer to which is returned by the Block::getLEDGrid() method @s_item{[1]} (for more details on how the %LEDGrid object operates, see @ref controlling_led_grids). - -@code{.cpp} - void topologyChanged() override - { - //... - auto blocks = topologySource.getCurrentTopology().blocks; - - for (auto b : blocks) - { - if (b->getType() == Block::Type::lightPadBlock) - { - activeBlock = b; - - //... - if (auto grid = activeBlock->getLEDGrid()) // [1] - { - //... - setLEDProgram (*activeBlock); // [2] - } - //... - } - } - } -@endcode - -In the @s_projcode{topologyChanged()} method of @s_projcode{BlocksDrawingDemo} this %LEDGrid pointer is passed to the @s_projcode{setLEDProgram()} method @s_item{[2]}, which sets the Block::Program to either a DrumPadGridProgram @s_item{[3]} or a BitmapLEDProgram @s_item{[4]}, depending on the selected mode. - -@code{.cpp} - void setLEDProgram (Block& block) - { - if (currentMode == canvas) - { - block.setProgram (new BitmapLEDProgram (block)); // [4] - //... - } - else if (currentMode == colourPalette) - { - block.setProgram (new DrumPadGridProgram (block)); // [3] - //... - } - } -@endcode - -@section blocks_drawing_colour_palette Colour Palette - -In the colour palette mode the Lightpad displays a 3x3 grid of colours, constructed using the %DrumPadGridProgram class. A %DrumPadGridProgram pointer is retrieved by calling the @s_projcode{getPaletteProgram()} helper function of @s_projcode{BlocksDrawingDemo} and in the @s_projcode{BlocksDrawingDemo::setLEDProgram()} method the %Block::Program is set to point to a new %DrumPadGridProgram object and is passed the %Block object of the Lightpad in its constructor. - -@code{.cpp} - DrumPadGridProgram* getPaletteProgram() - { - if (activeBlock != nullptr) - return dynamic_cast (activeBlock->getProgram()); - - return nullptr; - } -@endcode - -After the program has been initialised, it is passed to the LEDGrid to display using the Block::setProgram() method and the layout of the grid is set up using the DrumPadGridProgram::setGridFills() method. This function takes 3 arguments: the number of rows, number of columns and an array of DrumPadGridProgram::GridFill objects containing a @s_projcode{GridFill} for each pad that controls its colour and fill type. - -@code{.cpp} - void setLEDProgram (Block& block) - { - //... - else if (currentMode == colourPalette) - { - //... - if (auto* program = getPaletteProgram()) - program->setGridFills (layout.numColumns, layout.numRows, layout.gridFillArray); - } - } -@endcode - -The @s_projcode{ColourGrid} struct contains all of this information and handles the construction of the @s_projcode{GridFill} array in the @s_projcode{ColourGrid::constructGridFillArray()} method. - -@code{.cpp} - void constructGridFillArray() - { - gridFillArray.clear(); - - auto counter = 0; - - for (auto i = 0; i < numColumns; ++i) - { - for (auto j = 0; j < numRows; ++j) - { - DrumPadGridProgram::GridFill fill; - Colour colourToUse = colourArray.getUnchecked (counter); - - fill.colour = colourToUse.withBrightness (colourToUse == currentColour ? 1.0f : 0.1f); - - if (colourToUse == Colours::black) - fill.fillType = DrumPadGridProgram::GridFill::FillType::hollow; - else - fill.fillType = DrumPadGridProgram::GridFill::FillType::filled; - - gridFillArray.add (fill); - - if (++counter == colourArray.size()) - counter = 0; - } - } - } -@endcode - -An instance of this object called @s_projcode{layout} is declared as a member variable of @s_projcode{BlocksDrawingDemo} to easily change how the grid looks. - -@code{.cpp} -ColourGrid layout { 3, 3 }; -@endcode - -The @s_projcode{ColourGrid::setActiveColourForTouch()} method is called in the @s_projcode{BlocksDrawingDemo::touchChanged()} callback and is used to determine which brush colour has been selected based on a Touch coordinate from the Lightpad. - -@code{.cpp} - bool setActiveColourForTouch (int x, int y) - { - auto colourHasChanged = false; - - auto xindex = x / 5; - auto yindex = y / 5; - - auto newColour = colourArray.getUnchecked ((yindex * 3) + xindex); - if (currentColour != newColour) - { - currentColour = newColour; - constructGridFillArray(); - colourHasChanged = true; - } - - return colourHasChanged; - } -@endcode - -When the application is run, the colour palette mode would look like this: - -@image html BlocksDrawing_palette.JPG "Colour palette mode" - -@section blocks_drawing_canvas Canvas - -In canvas mode, the %Block program is set to an instance of %BitmapLEDProgram and uses the BitmapLEDProgram::setLED() method to set individual LEDs on the Lightpad to a particular colour. The @s_projcode{ActiveLED} struct declared in the private section of @s_projcode{BlocksDrawingDemo} is used to keep track of which LEDs are on and their colour and brightness. @s_projcode{BlocksDrawingDemo} contains an %Array of these objects called @s_projcode{activeLeds}. - -@code{.cpp} - struct ActiveLED - { - uint32 x, y; - Colour colour; - float brightness; - //... - }; - - Array activeLeds; -@endcode - -In the @s_projcode{BlocksDrawingDemo::setLEDProgram()} method the program is set up and passed to the %LEDGrid object the same way as in the colour palette mode but the @s_projcode{BlocksDrawingDemo::redrawLEDs()} method is also called which iterates over the @s_projcode{activeLeds} array and sets the appropriate LEDs on the Lightpad so the LED states persist between mode switches. - -@code{.cpp} - void redrawLEDs() - { - if (auto* canvasProgram = getCanvasProgram()) - { - for (auto led : activeLeds) - { - canvasProgram->setLED (led.x, led.y, led.colour.withBrightness (led.brightness)); - lightpadComponent.setLEDColour (led.x, led.y, led.colour.withBrightness (led.brightness)); - } - } - } -@endcode - -When a Touch is received in the @s_projcode{BlocksDrawingDemo::touchChanged()} callback the @s_projcode{BlocksDrawingDemo::drawLEDs()} method is called with 4 arguments: x and y coordinates, touch pressure and brush colour. This method iterates over the @s_projcode{activeLed} array and checks to see if there is an active LED at the given coordinate. If it is blank, an @s_projcode{ActiveLED} object is created and added to the array with the given coordinates and colour using touch pressure for brightness. If there is already an active LED at the coordinate, the colour of that LED will be blended with the current brush colour, the proportion of which is determined by the touch pressure. - -@code{.cpp} - void drawLED (uint32 x0, uint32 y0, float z, Colour drawColour) - { - if (auto* canvasProgram = getCanvasProgram()) - { - auto index = getLEDAt (x0, y0); - - if (drawColour == Colours::black) - { - if (index >= 0) - { - canvasProgram->setLED (x0, y0, Colours::black); - lightpadComponent.setLEDColour (x0, y0, Colours::black); - activeLeds.remove (index); - } - - return; - } - - if (index < 0) - { - ActiveLED led; - led.x = x0; - led.y = y0; - led.colour = drawColour; - led.brightness = z; - - activeLeds.add (led); - canvasProgram->setLED (led.x, led.y, led.colour.withBrightness (led.brightness)); - - lightpadComponent.setLEDColour (led.x, led.y, led.colour.withBrightness (led.brightness)); - - return; - } - - auto currentLed = activeLeds.getReference (index); - - if (currentLed.colour == drawColour) - currentLed.brightness = jmin (currentLed.brightness + z, 1.0f); - else - currentLed.colour = currentLed.colour.interpolatedWith (drawColour, z); - - if (canvasProgram != nullptr) - canvasProgram->setLED (currentLed.x, currentLed.y, currentLed.colour.withBrightness (currentLed.brightness)); - - lightpadComponent.setLEDColour (currentLed.x, currentLed.y, currentLed.colour.withBrightness (currentLed.brightness)); - - activeLeds.set (index, currentLed); - } - } -@endcode - -When the application is run, the canvas mode would look like this: - -@image html BlocksDrawing_canvas.JPG "Unleash your inner Picasso!" - -@section blocks_drawing_summary Summary - -This tutorial and the accompanying code project have introduced the %LEDGrid object and shown how to use the %Block::Program object to display basic grids and set individual LEDs on the Lightpad. - -@section blocks_drawing_see_also See also - -- @ref example_blocks_monitor -- @ref example_blocks_synth - -*/ diff --git a/extras/BLOCKS/doxygen/pages/juce_example_blocks_monitor.dox b/extras/BLOCKS/doxygen/pages/juce_example_blocks_monitor.dox deleted file mode 100644 index fe5a928519..0000000000 --- a/extras/BLOCKS/doxygen/pages/juce_example_blocks_monitor.dox +++ /dev/null @@ -1,328 +0,0 @@ -/** -@page example_blocks_monitor BlocksMonitor - -In order to compile and run this application you need to first download the @jucelink{JUCE framework}, which can be obtained from GitHub @jucegithub{here}. - -@section blocks_monitor_introduction Introduction - -BlocksMonitor is a simple JUCE application that shows currently connected Lightpad and Control %Block devices and visualises touches and button presses. It also displays some basic information about the Blocks. - -Generate a Projucer project from the PIP file located in the @s_file{JUCE/examples/BLOCKS/} folder, then navigate to the @s_file{BlocksMonitorDemo/Builds/} directory and open the code project in your IDE of choice. Run the application and connect your Blocks (if you do not know how to do this, see @ref connecting_blocks). Any devices that you have connected should now show up in the application window and this display will be updated as you add and remove Blocks. Lightpads are represented as a black square and will display the current touches as coloured circles, the size of which depend on the touch pressure, and Control Blocks are shown as rectangles containing the LED row and clickable buttons on the hardware. If you hover the mouse cursor over a %Block, a tooltip will appear displaying the name, UID, serial number and current battery level. - -@image html BlocksMonitor.png "The BlocksMonitor application with a Lightpad and 3 Control Blocks connected" - -@section blocks_monitor_topology Topology - -One of the fundamental concepts of the BLOCKS API is topology - a topology is a set of physically connected Blocks and the connections between them. Knowing when the topology has changed and accessing a data structure containing the current topology is the basis of any Blocks application. - -To access the current topology, @s_projcode{BlocksMonitorDemo} inherits from the TopologySource::Listener base class @s_item{[1]} and implements the TopologySource::Listener::topologyChanged() method @s_item{[2]}, a callback which is used to inform listeners when any physical devices have been added or removed. - -@code{.cpp} -class BlocksMonitorDemo : public Component, - public TopologySource::Listener, // [1] - private Timer -{ -public: -//... - void topologyChanged() override // [2] - { - //... -@endcode - -In order to receive these callbacks, @s_projcode{BlocksMonitorDemo} contains an instance of the PhysicalTopologySource class @s_item{[3]} and registers itself as a listener to this object in its constructor @s_item{[4]}. - -@code{.cpp} - BlocksMonitorDemo() - { - //... - topologySource.addListener (this); // [4] - //... - } - -private: - //... - PhysicalTopologySource topologySource; // [3] - OwnedArray blockComponents; - BlockComponent* masterBlockComponent = nullptr; -//... -@endcode - -When the @s_projcode{topologyChanged()} method is called, this object can be used to access the updated topology through the PhysicalTopologySource::getCurrentTopology() method @s_item{[5]} which returns a BlockTopology struct containing an array of currently connected Block objects and an array of BlockDeviceConnection structs representing the connections between them. - -@code{.cpp} - void topologyChanged() override - { - //... - auto topology = topologySource.getCurrentTopology(); // [5] - //... - } -@endcode - -@section blocks_monitor_block_object The Block Object - -The array of %Block objects contained in the %BlockTopology struct can be used to access individual %Block objects @s_item{[1]} and determine their type using the Block::getType() method @s_item{[2]}. - -@code{.cpp} -for (auto& block : topology.blocks) // [1] -{ - if (auto* blockComponent = createBlockComponent (block)) - { - //... - } -} -@endcode - -The application uses this information to construct an on-screen representation of the currently connected Blocks by creating either a @s_projcode{LightpadComponent} object @s_item{[3]} or a @s_projcode{ControlBlockComponent} object @s_item{[4]} for each %Block in the current topology. - -@code{.cpp} - BlockComponent* createBlockComponent (Block::Ptr newBlock) - { - auto type = newBlock->getType(); // [2] - - if (type == Block::lightPadBlock) - return new LightpadComponent (newBlock); // [3] - - if (type == Block::loopBlock || type == Block::liveBlock - || type == Block::touchBlock || type == Block::developerControlBlock) - return new ControlBlockComponent (newBlock); // [4] - - jassertfalse; - return nullptr; - } -@endcode - -Both of these classes derive from @s_projcode{BlockComponent}, a relatively simple base class that contains some virtual functions for painting the %Block on screen and handling callbacks from the touch surface and/or buttons on the %Block. - -@code{.cpp} -class BlockComponent : public Component, - //... -{ -public: - //... - virtual void paint (Graphics&) override = 0; - virtual void handleButtonPressed (ControlButton::ButtonFunction, uint32) {} - virtual void handleButtonReleased (ControlButton::ButtonFunction, uint32) {} - virtual void handleTouchChange (TouchSurface::Touch) {} - virtual void handleBatteryLevelUpdate (float) {} - //... -@endcode - -In its constructor, @s_projcode{BlockComponent} takes a pointer to the %Block object that it represents and adds itself as a listener to the touch surface (if it is a Lightpad) and buttons using the Block::getTouchSurface() and Block::getButtons() methods, respectively. - -@code{.cpp} - BlockComponent (Block::Ptr blockToUse) - : block (blockToUse) - { - //... - if (auto touchSurface = block->getTouchSurface()) - touchSurface->addListener (this); - - for (auto button : block->getButtons()) - button->addListener (this); - //... - } -@endcode - -It inherits from the TouchSurface::Listener and ControlButton::Listener classes and overrides the TouchSurface::Listener::touchChanged(), ControlButton::Listener::buttonPressed() and ControlButton::Listener::buttonReleased() methods to call its own virtual methods, which are implemented by the @s_projcode{LightpadComponent} and @s_projcode{ControlBlockComponent} classes to update the on-screen components. - -@code{.cpp} -class BlockComponent : public Component, - public SettableTooltipClient, - private TouchSurface::Listener, - private ControlButton::Listener, - private Timer -{ -private: - //... - void touchChanged (TouchSurface&, const TouchSurface::Touch& t) override { handleTouchChange (t); } - void buttonPressed (ControlButton& b, Block::Timestamp t) override { handleButtonPressed (b.getType(), t); } - void buttonReleased (ControlButton& b, Block::Timestamp t) override { handleButtonReleased (b.getType(), t); } - //... -@endcode - -To visualise touches on the Lightpad, @s_projcode{LightpadComponent} contains an instance of the TouchList class called @s_projcode{touches} and calls the TouchList::updateTouch() method whenever it receives a touch surface listener callback in the @s_projcode{LightpadComponent::handleTouchChange()} method. - -@code{.cpp} -class LightpadComponent : public BlockComponent -{ -public: - //... - void handleTouchChange (TouchSurface::Touch touch) override { touches.updateTouch (touch); } - -private: - //... - TouchList touches; - //... -@endcode - -The @s_projcode{LightpadBlock::paint()} method then iterates over the current TouchSurface::Touch objects in the %TouchList and visualises them on the component at 25Hz. - -@code{.cpp} - void paint (Graphics& g) override - { - //... - for (auto touch : touches) - { - //... - } - } -@endcode - -The @s_projcode{ControlBlockComponent} class represents a generic Control %Block with 15 LEDs, 8 circular buttons and 1 rounded rectangular button. When a button is pressed on the physical Control %Block, the @s_projcode{BlockComponent::handleButtonPressed()} function is called and this class uses the ControlButton::ButtonFunction variable to determine which button was pressed and should be activated on the on-screen component. - -@code{.cpp} - void handleButtonPressed (ControlButton::ButtonFunction function, uint32) override - { - displayButtonInteraction (controlButtonFunctionToIndex (function), true); - } -@endcode - -The same process is repeated for when the button is released. - -@code{.cpp} - void handleButtonReleased (ControlButton::ButtonFunction function, uint32) override - { - displayButtonInteraction (controlButtonFunctionToIndex (function), false); - } -@endcode - -This class also overrides the @s_projcode{BlockComponent::handleBatteryLevelUpdate()} method to update which LEDs should be on based on the battery level, which is accessed in the @s_projcode{BlockComponent} base class using the Block::getBatteryLevel() and Block::isBatteryCharging() methods. - -@code{.cpp} - void handleBatteryLevelUpdate (float batteryLevel) override - { - auto numLedsOn = static_cast (numLeds * batteryLevel); - - if (numLedsOn != previousNumLedsOn) - for (auto i = 0; i < numLeds; ++i) - leds.getUnchecked (i)->setOnState (i < numLedsOn); - - previousNumLedsOn = numLedsOn; - repaint(); - } -@endcode - -These callback methods are a simple and powerful way to get user input from the Blocks and use this data to drive some process in your application. In this example, the input is simply mirrored on the screen but it could be used to control any number of things such as audio synthesis (see the @ref example_blocks_synth example) and graphics (see the @ref example_blocks_drawing example). - -@section blocks_monitor_connections Blocks Connections - -The %BlockTopology struct returned by the @s_projcode{%PhysicalTopologySource::getCurrentTopology()} method also contains an array of BlockDeviceConnection objects representing all the current DNA port connections between Blocks in the topology. A single %BlockDeviceConnection struct describes a physical connection between two ports on two Blocks and contains a Block::UID and Block::ConnectionPort object for each of the two devices. - -This information is used to calculate the position and rotation of each connected %Block and update the corresponding @s_projcode{topLeft} and @s_projcode{rotation} member variables of its @s_projcode{BlockComponent} so that the correct topology is displayed on the screen. The @s_projcode{topLeft} variable is a Point that describes the position of the top left of the @s_projcode{BlockComponent} in terms of logical device units relative to the top left of the master %Block at Point (0, 0). - -@code{.cpp} - int rotation = 0; - Point topLeft = { 0.0f, 0.0f }; -@endcode - -Initially, all @s_projcode{BlockComponent} instances have the @s_projcode{topLeft} position (0, 0) and the @s_projcode{BlocksMonitorDemo::positionBlocks()} method iterates first over all of the Blocks connected to the master %Block and then any remaining Blocks and calculates the correct @s_projcode{topLeft} %Point and @s_projcode{rotation} for each using the array of %BlockDeviceConnection objects. - -@code{.cpp} - void positionBlocks (BlockTopology topology) - { - //... - Array masterBlockConnections; - for (auto connection : topology.connections) - if (connection.device1 == masterBlockComponent->block->uid || connection.device2 == masterBlockComponent->block->uid) - masterBlockConnections.add (connection); - - while (maxDelta > 0.001f && --maxLoops) - { - //... - for (auto connection : masterBlockConnections) - { - //... - for (auto otherBlockComponent : blockComponents) - { - //... - } - } - } - - Array unpositionedBlocks; - for (auto blockComponent : blockComponents) - if (blockComponent != masterBlockComponent && ! blocksConnectedToMaster.contains (blockComponent)) - unpositionedBlocks.add (blockComponent); - - if (unpositionedBlocks.size() > 0) - { - //... - while (maxDelta > 0.001f && --maxLoops) - { - //... - for (auto blockComponent : unpositionedBlocks) - { - Array blockConnections; - for (auto connection : topology.connections) - if (connection.device1 == blockComponent->block->uid || connection.device2 == blockComponent->block->uid) - blockConnections.add (connection); - - for (auto connection : blockConnections) - { - //... - for (auto otherBlockComponent : blockComponents) - { - //... - } - } - } - } - } - } -@endcode - -Then, in the @s_projcode{BlocksMonitorDemo::resized()} method these attributes are used to correctly position the components. - -@code{.cpp} - void resized() override - { - //... - if (numBlockComponents == 0) - { - //... - return; - } - - //... - if (isInitialResized) - { - //... - for (auto blockComponent : blockComponents) - { - auto topLeft = blockComponent->topLeft; - auto rotation = blockComponent->rotation; - //... - } - - //... - masterBlockComponent->centreWithSize (...); - //... - } - else - { - masterBlockComponent->setSize (...); - } - - for (auto blockComponent : blockComponents) - { - if (blockComponent == masterBlockComponent) - continue; - - blockComponent->setBounds (...); - - if (blockComponent->rotation != 0) - blockComponent->setTransform (AffineTransform::rotation (...)); - } - } -@endcode - -@section blocks_monitor_summary Summary - -This tutorial and the accompanying code has introduced the %BlockTopology and %Block objects, and demonstrated how to receive callbacks from connected Blocks when the touch surface or buttons are pressed, allowing you to use this input in your own applications. - -@section blocks_monitor_see_also See also - -- @ref example_blocks_drawing -- @ref example_blocks_synth - -*/ diff --git a/extras/BLOCKS/doxygen/pages/juce_example_blocks_synth.dox b/extras/BLOCKS/doxygen/pages/juce_example_blocks_synth.dox deleted file mode 100644 index 9e57011e45..0000000000 --- a/extras/BLOCKS/doxygen/pages/juce_example_blocks_synth.dox +++ /dev/null @@ -1,239 +0,0 @@ -/** -@page example_blocks_synth BlocksSynth - -In order to compile and run this application you need to first download the @jucelink{JUCE framework}, which can be obtained from GitHub @jucegithub{here}. - -@section blocks_synth_introduction Introduction - -BlocksSynth is a JUCE application that turns your Lightpad into a simple monophonic synthesiser capable of playing 4 different waveshapes - sine, square, sawtooth and triangle. - -Generate a Projucer project from the PIP file located in the @s_file{JUCE/examples/BLOCKS/} folder, then navigate to the @s_file{BlocksSynthDemo/Builds/} directory and open the code project in your IDE of choice. Run the application and connect your Lightpad (if you do not know how to do this, see @ref connecting_blocks) - it should now display a simple 5x5 grid where each pad plays a note in the chromatic scale using a sine wave starting from the bottom-left (C3). It is possible to play any of the 25 notes but for ease of use tonics (the root note of the scale) are highlighted in white and notes in the C-major scale are highlighted in green. When a note has been played it is possible to change the amplitude using touch pressure and to pitch bend between adjacent notes by sliding left and right. Pressing the mode button on the Lightpad will change to the waveshape selection screen where the currently selected waveshape is rendered on the LEDs and you can switch between the 4 different waveshapes by touching anywhere on the %Block surface. - -The concept of a BLOCKS topology and the methods for receiving callbacks from the Block object are covered in the @ref example_blocks_monitor example and the basic methods for displaying grids and setting LEDs on the %Block are covered in the @ref example_blocks_drawing example. This example will cover how to render custom programs on the LEDGrid using the Littlefoot language and how to do some simple audio synthesis using data from the Lightpad. - -@section blocks_synth_note_grid Note Grid - -In the synthesiser mode the Lightpad displays a 5x5 grid constructed using the DrumPadGridProgram class. The @s_projcode{SynthGrid} struct handles the setup and layout of this grid and sets the colours of the pads to white for tonics, green for notes in the C major scale and black for notes that are not in the C major scale. - -@code{.cpp} - void constructGridFillArray() - { - gridFillArray.clear(); - - for (auto i = 0; i < numRows; ++i) - { - for (auto j = 0; j < numColumns; ++j) - { - DrumPadGridProgram::GridFill fill; - - auto padNum = (i * 5) + j; - - fill.colour = notes.contains (padNum) ? baseGridColour - : tonics.contains (padNum) ? Colours::white - : Colours::black; - fill.fillType = DrumPadGridProgram::GridFill::FillType::gradient; - gridFillArray.add (fill); - } - } - } -@endcode - -The @s_projcode{SynthGrid::getNoteNumberForPad()} method is called in the @s_projcode{BlocksSynthDemo::touchChanged()} callback and returns the corresponding MIDI note number for a Touch coordinate on the Lightpad. This note number is then passed to the @s_projcode{Audio} class to be played on the synthesiser. - -@code{.cpp} - int getNoteNumberForPad (int x, int y) const - { - auto xIndex = x / 3; - auto yIndex = y / 3; - - return 60 + ((4 - yIndex) * 5) + xIndex; - } -@endcode - -When the application is run, the synthesiser note grid would look like this: - -@image html BlocksSynth_grid.JPG "Synthesiser note grid" - -@section blocks_synth_waveshape_display Waveshape Display - -In the waveshape selection mode the Block::Program is set to an instance of the WaveshapeProgram class @s_item{[1]}. This class inherits from %Block::Program so that it can be loaded onto the %LEDGrid and its LittleFoot program can be executed on the Lightpad. - -@code{.cpp} - void setLEDProgram (Block& block) - { - if (currentMode == waveformSelectionMode) - { - block.setProgram (new WaveshapeProgram (block)); // [1] - - if (auto* waveshapeProgram = getWaveshapeProgram()) - { - //... - } - } - //... - } -@endcode - -The class itself is relatively simple and contains a method to set which waveshape should be displayed @s_item{[2]}, a method to load the coordinates for each of the four waveshapes into the heap @s_item{[3]} and one pure virtual method overridden from %Block::Program, the Block::Program::getLittleFootProgram() method @s_item{[4]}. The heap is the area of shared memory that is used by the program to communicate with the host computer and the size of this memory is set using the @s_projcode{\#heapsize: XXX} directive where XXX is the number of bytes required @s_item{[5]}. - -@code{.cpp} -class WaveshapeProgram : public Block::Program -{ -public: - WaveshapeProgram (Block& b) : Program (b) {} - - void setWaveshapeType (uint8 type) {...} // [2] - void generateWaveshapes() {...} // [3] - - String getLittleFootProgram() override // [4] - { - return R"littlefoot( - - #heapsize: 256 // [5] - - //... - - )littlefoot"; - } - //... -@endcode - -The string literal returned by the @s_projcode{getLittleFootProgram()} function needs to be preceeded by the "R" prefix and enclosed between "littlefoot" delimiters in order to prevent the characters to be escaped in the program. - -In the private section of @s_projcode{WaveshapeProgram} the structure of the shared data heap is laid out with variables containing the offsets for each section and the total size (in bytes) that is required can be determined by adding the last set of bytes required to the last offset, which in this case is 136 + 45 = 181. The heap contains space for a variable that determines which waveshape type to display and the Y coordinates for 1.5 cycles of each of the four waveshapes. - -@code{.cpp} - static constexpr uint32 waveshapeType = 0; // 1 byte - static constexpr uint32 sineWaveOffset = 1; // 1 byte * 45 - static constexpr uint32 squareWaveOffset = 46; // 1 byte * 45 - static constexpr uint32 sawWaveOffset = 91; // 1 byte * 45 - static constexpr uint32 triangleWaveOffset = 136; // 1 byte * 45 -@endcode - -The @s_projcode{WaveshapeProgram::getLittleFootProgram()} method returns the LittleFoot program that will be executed on the BLOCKS device. The @s_projcode{repaint()} method of this program is called at approximately 25Hz and is used to draw the moving waveshape on the LEDs of the Lightpad. - -@code{.cpp} - void repaint() - { - fillRect (0xff000000, 0, 0, 15, 15); // [6] - - int type = getHeapByte (0); - - int offset = 1 + (type * 45) + yOffset; // [7] - - for (int x = 0; x < 15; ++x) - { - int y = getHeapByte (offset + x); - - if (y == 255) - { - for (int i = 0; i < 15; ++i) - drawLEDCircle (x, i); - } - else if (x % 2 == 0) - { - drawLEDCircle (x, y); // [8] - } - } - - if (++yOffset == 30) // [9] - yOffset = 0; - } -@endcode - -Each time this method is called, it clears the LEDs by setting them all to black @s_item{[6]} then calculates the heap offset based on the waveshape type that has been set @s_item{[7]} and uses a @s_code{for()} loop to iterate over the 15 LEDs on the X-axis and draw an LED 'circle' using the @s_projcode{drawLEDCircle()} method at the corresponding Y coordinate for the selected waveshape @s_item{[8]}. The read position of the heap is offset using the @s_projcode{yOffset} variable which is incremented each @s_projcode{repaint()} call and wraps back around when the end of the heap section for the selected waveshape is reached to draw a 'moving' waveshape @s_item{[9]}. - -@image html BlocksSynth_waveshape.gif "A sine wave dispayed in the waveshape selection mode" - -@section blocks_synth_audio Audio - -The @s_projcode{Audio} class handles the audio synthesis for this application and overrides the AudioIODeviceCallback::audioDeviceIOCallback() method to call the Synthesiser::renderNextBlock() method of a Synthesiser object. - -@code{.cpp} - void audioDeviceIOCallback (const float** /*inputChannelData*/, int /*numInputChannels*/, - float** outputChannelData, int numOutputChannels, int numSamples) override - { - AudioBuffer sampleBuffer (outputChannelData, numOutputChannels, numSamples); - sampleBuffer.clear(); - - synthesiser.renderNextBlock (sampleBuffer, MidiBuffer(), 0, numSamples); - } -@endcode - -This object is initialised to be capable of rendering sine, square, sawtooth and triangle waves on separate MIDI channels in the constructor of @s_projcode{Audio}, and @s_projcode{Audio} contains methods for sending note on, note off, channel pressure and pitch wheel messages to the Synthesiser. - -@code{.cpp} - Audio() - { - //... - synthesiser.clearVoices(); - synthesiser.clearSounds(); - - synthesiser.addVoice (new SineVoice()); - synthesiser.addVoice (new SquareVoice()); - synthesiser.addVoice (new SawVoice()); - synthesiser.addVoice (new TriangleVoice()); - - synthesiser.addSound (new SineSound()); - synthesiser.addSound (new SquareSound()); - synthesiser.addSound (new SawSound()); - synthesiser.addSound (new TriangleSound()); - } -@endcode - -When a note is triggered on the Lightpad, the @s_projcode{Audio::noteOn()} method is called with 3 arguments: a MIDI channel corresponding to the waveshape that should be generated, a MIDI note number and an initial velocity. - -@code{.cpp} - void noteOn (int channel, int noteNum, float velocity) - { - synthesiser.noteOn (channel, noteNum, velocity); - } - - void noteOff (int channel, int noteNum, float velocity) - { - synthesiser.noteOff (channel, noteNum, velocity, false); - } - - void allNotesOff() - { - for (auto i = 1; i < 5; ++i) - synthesiser.allNotesOff (i, false); - } -@endcode - -Whilst the note is playing, the amplitude and pitch are modulated by calling the @s_projcode{Audio::pressureChange()} and @s_projcode{Audio::pitchChange()} methods from the @s_projcode{BlocksSynthDemo::touchChanged()} callback. The pressure value of the Touch instance is used to directly control the Synthesiser amplitude and the distance from the initial note trigger on the X-axis of the Lightpad is scaled to +/-1.0 and used to modulate the frequency of the currently playing note. - -@code{.cpp} - void pressureChange (int channel, float newPressure) - { - synthesiser.handleChannelPressure (channel, static_cast (newPressure * 127)); - } - - void pitchChange (int channel, float pitchChange) - { - synthesiser.handlePitchWheel (channel, static_cast (pitchChange * 127)); - } -@endcode - -The @s_projcode{Oscillator} base class contains the waveshape rendering code which inherits from SynthesiserVoice and has a pure virtual @s_projcode{Oscillator::renderWaveShape()} method that is overridden by subclasses to render the 4 different waveshapes. - -@code{.cpp} -class OscillatorBase : public SynthesiserVoice -{ -public: - //... - virtual bool canPlaySound (SynthesiserSound*) override = 0; - virtual double renderWaveShape (const double currentPhase) = 0; - //... -@endcode - -@section blocks_synth_summary Summary - -This tutorial and the accompanying code project have expanded on the topics covered by previous tutorials, showing you how to display more complex, custom programs on the %LEDGrid using the LittleFoot language and how to control simple audio synthesis parameters using the Lightpad. - -@section blocks_synth_see_also See also - -- @ref example_blocks_monitor -- @ref example_blocks_drawing - -*/ diff --git a/extras/BLOCKS/doxygen/pages/juce_example_colour_pressure_map.dox b/extras/BLOCKS/doxygen/pages/juce_example_colour_pressure_map.dox deleted file mode 100644 index a4870e4909..0000000000 --- a/extras/BLOCKS/doxygen/pages/juce_example_colour_pressure_map.dox +++ /dev/null @@ -1,115 +0,0 @@ -/** -@page example_colour_pressure_map Colour Pressure Map - -@section colour_pressure_map_introduction Introduction - -Learn how to display coloured pressure maps on the Lightpad Block. - -Launch the BLOCKS CODE application and open the script called @s_file{ColourPressureMap.littlefoot}. You can find the script in the Littlefoot-Examples repository, which you can download from GitHub @littlefootgithub{here}. If you don't have the BLOCKS CODE IDE installed on your system, please refer to the section @ref getting_started_with_blocks_code for help. - -@section colour_pressure_map_drawing_pressure_maps Drawing Pressure Maps - -Let's start by drawing white pressure map points onto the screen whenever pressure is applied onto the touch surface of a Lightpad. - -We start by clearing the display in the repaint() function using the clearDisplay() function to reset the state of our LEDs. We than call two handy functions that are defined in the littlefoot language that allow us to draw and fade pressure points automatically. These are respectively the drawPressureMap() and fadePressureMap() functions. - -@code{.cpp} -void repaint() -{ - clearDisplay(); - drawPressureMap(); - fadePressureMap(); -} -@endcode - -However, if we run the script at the moment no pressure points are shown on the screen because we need to tell the program where to draw them by calling the addPressurePoint() function with the colour and coordinates of the point. - -The littlefoot language has several callback functions that are called when a special event happens. In our case we are interested in the start and movement of a touch gesture and therefore we can implement these as follows: - -@code{.cpp} -void touchStart (int index, float x, float y, float z, float vz) -{ - addPressurePoint (0xffffff, x, y, z * 100.0); -} -@endcode - -When the callback functions are called, we add a pressure point to the pressure map by specifying a colour in hexadecimal (in this case white is 0xffffff) and the coordinates of the touch event. - -@code{.cpp} -void touchMove (int index, float x, float y, float z, float vz) -{ - addPressurePoint (0xffffff, x, y, z * 20.0); -} -@endcode - -Notice here that we multiply the depth z by a scaler in order to make the surface of the pressure point bigger and easier to see. - -@section colour_pressure_map_adding_colours Adding Colours - -Now let's try to add different colours to the pressure points depending on the number of fingers on the screen. To make these variables accessible in realtime to the Parameters tab of the IDE, we create some variables in the metadata section of the code. - -@code{.xml} - - - - - - - - - -@endcode - -We also implement a helper function called getPressureColour() that takes an index of the finger from the touch event and returns the desired colour as shown below: - -@code{.cpp} -int getPressureColour (int index) -{ - int col = pressureColour3; - - if (index == 1) - { - col = pressureColour0; - } - else if (index == 2) - { - col = pressureColour1; - } - else if (index == 3) - { - col = pressureColour2; - } - - return col; -} -@endcode - -Finally we need to modify the callbacks to incorporate this helper function instead of hardcoding the colour white. - -@code{.cpp} -void touchStart (int index, float x, float y, float z, float vz) -{ - addPressurePoint (getPressureColour (index), x, y, z * float (scaling)); -} -@endcode - -Notice we also allow the scaling of the pressure point to be controlled by a slider in the Parameters tab in order to change its size in realtime. - -@code{.cpp} -void touchMove (int index, float x, float y, float z, float vz) -{ - addPressurePoint (getPressureColour (index), x, y, z * float (scaling)); -} -@endcode - -@section colour_pressure_map_summary Summary - -In this example, we learnt how to display pressure maps onto the Lightpad and add colours depending on the number of fingers pressed onto the touch surface. - -@section colour_pressure_map_see_also See also - -- @ref example_dynamic_parameters -- @ref example_tic_tac_toe -- @ref example_music_gen - -*/ diff --git a/extras/BLOCKS/doxygen/pages/juce_example_dynamic_parameters.dox b/extras/BLOCKS/doxygen/pages/juce_example_dynamic_parameters.dox deleted file mode 100644 index 9698e6949b..0000000000 --- a/extras/BLOCKS/doxygen/pages/juce_example_dynamic_parameters.dox +++ /dev/null @@ -1,65 +0,0 @@ -/** -@page example_dynamic_parameters Dynamic Parameters - -@section dynamic_parameters_introduction Introduction - -Learn how to use BLOCKS CODE metadata to interact with your BLOCKS using dynamic parameters. - -Launch the BLOCKS CODE application and open the script called @s_file{DynamicParameters.littlefoot}. You can find the script in the Littlefoot-Examples repository, which you can download from GitHub @littlefootgithub{here}. If you don't have the BLOCKS CODE IDE installed on your system, please refer to the section @ref getting_started_with_blocks_code for help. - -@section dynamic_parameters_adding_parameters Adding Parameters - -Let's start by adding parameters to the side panel of BLOCKS CODE that will appear under the Parameters tab. - -These are created using an XML format enclosed between multiline comment blocks and @s_code{\} tags at the top of the file. Variables are created between @s_code{\} tags and they can also be grouped using @s_code{\} tags as follows: - -@code{.xml} - - - - - - - - - - - - - - - - - - -@endcode - -Within the variable declaration, the string given to the "name" attribute becomes the variable name in the subsequent littlefoot code. - -Let's now implement the repaint() function of the littlefoot program. This function is called periodically at approximately 25Hz on the device and is used to control the LEDs on a Lightpad. - -In the following piece of code, we first call the clearDisplay() function which will reset the screen to a blank state so that any LEDs that were turned on in the previous iteration of the repaint() function are turned off. - -@code{.cpp} -void repaint() -{ - clearDisplay(); - - if (draw) - fillRect (makeARGB (int (alpha), red, green, blue), xPos, yPos, width, height); -} -@endcode - -Then we use the fillRect() function to draw a rectangle on the screen using the variables defined before, only if the draw button is checked. The fillRect() function takes as argument the colour retrieved by the makeARGB() helper function and the position and size of the rectangle we wish to draw. - -@section dynamic_parameters_summary Summary - -In this example, we learnt how to add parameters that can be tweaked at runtime to control the behaviour of a program in realtime. - -@section dynamic_parameters_see_also See also - -- @ref example_colour_pressure_map -- @ref example_tic_tac_toe -- @ref example_music_gen - -*/ diff --git a/extras/BLOCKS/doxygen/pages/juce_example_integrations.dox b/extras/BLOCKS/doxygen/pages/juce_example_integrations.dox deleted file mode 100644 index b87b7fcf5f..0000000000 --- a/extras/BLOCKS/doxygen/pages/juce_example_integrations.dox +++ /dev/null @@ -1,18 +0,0 @@ -/** -@page example_integrations Example BLOCKS Integrations - -@section downloading_the_example_integration Downloading the example integration - -These example integrations demonstrate the functionality of the standalone BLOCKS SDK. - -The example integrations are all distributed as part of the standalone BLOCKS SDK, which can be obtained from GitHub @blocksgithub{here}. -You will find the examples in the @s_file{BLOCKS-SDK/examples/} directory. -Each example comes with projects for Visual Studio, Xcode and Makefile in their respective subdirectory, and these should open, compile and run without any trouble in the respective IDEs. - -@section example_integrations_overview Overview - -@subpage example_block_finder - -BlockFinder is a basic JUCE application that shows currently connected Lightpad and Control %Block devices. It also displays some basic information about the Blocks. - -*/ diff --git a/extras/BLOCKS/doxygen/pages/juce_example_music_gen.dox b/extras/BLOCKS/doxygen/pages/juce_example_music_gen.dox deleted file mode 100644 index c389ce14e9..0000000000 --- a/extras/BLOCKS/doxygen/pages/juce_example_music_gen.dox +++ /dev/null @@ -1,411 +0,0 @@ -/** -@page example_music_gen Music Gen - -@section music_gen_introduction Introduction - -Develop a MIDI note music generator with interesting visuals on the Lightpad Block. - -Launch the BLOCKS CODE application and open the script called @s_file{MusicGen.littlefoot}. You can find the script in the Littlefoot-Examples repository, which you can download from GitHub @littlefootgithub{here}. If you don't have the BLOCKS CODE IDE installed on your system, please refer to the section @ref getting_started_with_blocks_code for help. - -@section music_gen_initial_setup Initial Setup - -Let's first start by defining global parameters for our app such as the speed, root note and chord for our music generator like so: - -@code{.xml} - - - - - - - -@endcode - -We also need to define global variables such as colours, bullet direction and coordinates, blob direction and coordinates as well as the last note played and the number of note generators on the screen. - -@code{.cpp} -int green; -int red; -int blue; -int yellow; -int count; - -float bullet1x; -float bullet1y; -//... -int bullet1d; -//... -int blob1x; -int blob1y; -//... -int blob1d; -//... -int lastNote1; -//... -@endcode - -In the initialise() function of our script, we first clear the display and send a MIDI CC message to turn all MIDI notes off thus resetting both the visual and audio states of the app. We also initialise all the variables to default values and set the colours we want to use. - -@code{.cpp} -void initialise() -{ - clearDisplay(); - - sendCC (0, 120, 127); - - blob1x = -99; - //... - - blob1y = -99; - //... - - blob1d = 3; - //... - - bullet1x = -99; - //... - - bullet1y = -99; - //... - - green = 0x2200FF00; - red = 0x22FF0000; - blue = 0x220000FF; - yellow = 0x22FFFF00; - - count = 0; -} -@endcode - -In order to reset the state of the music generator at anytime, we implement the handleButtonDown() callback to initialise the state of the app when the side button of the Lightpad is pressed. - -@code{.cpp} -void handleButtonDown (int index) -{ - initialise(); -} -@endcode - -In the repaint() function we first clear the display and perform 4 sequential operations every time the screen is refreshed: paint blobs, draw bullets, update bullets and detect bullets. These functions are each defined later on. - -@code{.cpp} -void repaint() -{ - clearDisplay(); - - paintBlob (blob1x, blob1y, blob1d); - //... - - drawBullet (bullet1x, bullet1y, blob1d); - //... - - updateBullet1(); - //... - - detectBullet(); -} -@endcode - -@section music_gen_drawing_blobs_bullets Drawing Blobs and Bullets - -Now let's take a look at drawing various elements on the screen. The blobs that start shooting the note bullets are drawn using the following @s_projcode{paintBlob()} function: - -@code{.cpp} -void paintBlob (int x, int y, int type) -{ - if (type == 0) - { - fillRect (green, x, y - 1, 1, 2); - blendRect (green, x - 1, y, 3, 1); - } - else if (type == 1) - { - fillRect (red, x, y, 2, 1); - blendRect (red, x, y - 1, 1, 3); - } - else if (type == 2) - { - fillRect (blue, x, y, 1, 2); - blendRect (blue, x - 1, y, 3, 1); - } - else if (type == 3) - { - fillRect (yellow, x - 1, y, 2, 1); - blendRect (yellow, x, y - 1, 1, 3); - } -} -@endcode - -Depending on the direction of the blob we decide to draw the shapes using different colours and we use the blendRect() function to blend the pixel of the overlapping coordinate. Similarly, we draw the bullets with the @s_projcode{drawBullet()} function depending on the direction of the corresponding blob. - -@code{.cpp} -void drawBullet (float x, float y, int d) -{ - fillPixel (0xFF222222, int (x), int (y)); - - if (d == 0) - { - fillPixel (0xFFFFFF, int (x), int (y - 1)); - } - else if (d == 1) - { - fillPixel (0xFFFFFF, int (x + 1), int (y)); - } - else if (d == 2) - { - fillPixel (0xFFFFFF, int (x), int (y + 1)); - } - else - { - fillPixel (0xFFFFFF, int (x - 1), int (y)); - } -} -@endcode - -@section music_gen_handling_touch_events Handling Touch Events - -Up until now, the script would not draw anything on the screen as touch events are not handled yet and default coordinates are set to be out of bounds with the screen coordinates. Let's implement the @s_projcode{touchStart()} callback to process touch events. - -@code{.cpp} -void touchStart (int touchIndex, float x, float y, float z, float vz) -{ - int intX = int (x * 7); - int intY = int (y * 7); - - int touch = touchBlob (intX, intY); - - if (touch >= 1) - { - changeBlob (touch); - } - else if (count < 5) - { - if (z < 0.05) - { - assignBlob (intX, intY, count, 0); - } - else if (z < 0.2) - { - assignBlob (intX, intY, count, 1); - } - else if (z < 0.5) - { - assignBlob (intX, intY, count, 2); - } - else - { - assignBlob (intX, intY, count, 3); - } - - ++count; - } -} -@endcode - -In the above function, we first convert the device coordinates into LED grid coordinates by multiplying both x and y variables by 7. Device coordinates are defined using the number of DNA connectors on the side of the device so for example in the case of a Lightpad %Block, the device has a size of 2x2 and therefore the device coordinates will range from 0.0 to 2.0 on each x and y dimensions. Multiplying this range by 7 gives us the LED grid coordinates ranging from 0 to 14 inclusive. - -Now using these grid coordinates, we use the @s_projcode{touchBlob()} helper function defined below to check whether the touch event was performed on a previously drawn blob and return its index. If no previous blobs were touched, we return 0 to indicate the creation of a new one. - -@code{.cpp} -int touchBlob (int x, int y) -{ - int touch = 0; - - if (x >= (blob1x - 1) && x <= (blob1x + 1) && y >= (blob1y - 1) && y <= (blob1y + 1)) - { - touch = 1; - } - //... - - return touch; -} -@endcode - -The @s_projcode{changeBlob()} function is called in the touchStart() callback when an existing blob is touched and updates the index for its direction to update the orientation. - -@code{.cpp} -void changeBlob (int blob) -{ - if (blob == 1) - { - if (blob1d < 3) - { - ++blob1d; - } - else - { - blob1d = 0; - } - } - //... -} -@endcode - -If the creation of a new blob was requested from the touchStart() callback, depending on the pressure of the touch event we spawn a different type of blob at the specified coordinate and call the corresponding function to spawn a bullet. - -@code{.cpp} -void assignBlob (int x, int y, int index, int type) -{ - if (index == 0) - { - blob1x = x; - blob1y = y; - blob1d = type; - spawnBullet1(); - } - //... -} -@endcode - -To spawn a bullet we simply assign the coordinates and direction of the blob to the bullet which overwrites the default values and makes the bullet appear within the screen coordinates. - -@code{.cpp} -void spawnBullet1() -{ - bullet1x = blob1x; - bullet1y = blob1y; - bullet1d = blob1d; -} -//... -@endcode - -The position of the bullet is updated from the repaint() function by incrementing or decrementing the corresponding x or y coordinate by the speed variable defined as an IDE parameter which consequently moves the bullet on the screen. - -@code{.cpp} -void updateBullet1() -{ - if (blob1d == 0) - { - bullet1y -= speed; - } - else if (blob1d == 1) - { - bullet1x += speed; - } - else if (blob1d == 2) - { - bullet1y += speed; - } - else if (blob1d == 3) - { - bullet1x -= speed; - } -} -//... -@endcode - -@section music_gen_generating_midi_messages Generating MIDI Messages - -Now that all the visuals are implemented we have to generate some MIDI messages to trigger sounds from the host. The @s_projcode{detectBullet()} function is called periodically in the repaint() function and performs some basic collision detection. - -@code{.cpp} -void detectBullet() -{ - if (bullet1x > 15) - { - spawnBullet1(); - midiNote (0, 0); - } - else if (bullet1x < 0 && bullet1x > -90) - { - spawnBullet1(); - midiNote (0, 1); - } - else if (bullet1y > 15) - { - spawnBullet1(); - midiNote (0, 2); - } - else if (bullet1y < 0 && bullet1y > -90) - { - spawnBullet1(); - midiNote (0, 3); - } - //... -} -@endcode - -Here we check if any of the bullets have crossed the screen boundaries and spawn a new bullet when the old bullet becomes off-screen. Notice here we make sure the default value of -99 defined in the initialise() function does not trigger the spawning of a bullet. We also generate a MIDI note by calling the helper function @s_projcode{midiNote()} defined hereafter: - -@code{.cpp} -void midiNote(int note1, int note2) -{ - note2 *= 12; - int note = rootNote; - - if (note1 == 0) - { - note += note2; - note1 (note); - } - else if (note1 == 1) - { - if (chord == 0) - { - note += 4; - } - else - { - note += 3; - } - note += note2; - note2 (note); - } - else if (note1 == 2) - { - note += 7; - note += note2; - note3 (note); - } - else if (note1 == 3) - { - if (chord == 0) - { - note += 11; - } - else - { - note += 10; - } - note += note2; - note4 (note); - } - else if (note1 == 4) - { - note += 14; - note += note2; - note5 (note); - } -} -@endcode - -In order to play a harmonious set of MIDI notes, the above function generates specific notes that form the chord with a root note and major/minor quality as defined in the parameters. It follows a simple set of rules as follows: - -- The index of the blob defines the note in the scale in ascending order: tonic, major or minor third, fifth, major or minor seventh, ninth. -- The direction of the blob defines the octave of the note in ascending order: east, west, south, north. -- If the chord parameter is set to major, the major third and major seventh are selected forming a major seventh chord. -- If the chord parameter is set to minor, the minor third and minor seventh are selected forming a minor seventh chord. - -The selected note is then passed to the following helper function in order to stop the previously ringing note and start a new one using respectively the sendNoteOff() and sendNoteOn() functions with the channel number, the note number and the note velocity as arguments. - -@code{.cpp} -void note1 (int note) -{ - sendNoteOff (0, lastNote1, 80); - sendNoteOn (0, note, 80); - lastNote1 = note; -} -//... -@endcode - -@section music_gen_summary Summary - -In this example, we learnt how to create a music generator app that sends MIDI messages to a host. - -@section music_gen_see_also See also - -- @ref example_dynamic_parameters -- @ref example_colour_pressure_map -- @ref example_tic_tac_toe - -*/ diff --git a/extras/BLOCKS/doxygen/pages/juce_example_scripts.dox b/extras/BLOCKS/doxygen/pages/juce_example_scripts.dox deleted file mode 100644 index ea8ac5bb41..0000000000 --- a/extras/BLOCKS/doxygen/pages/juce_example_scripts.dox +++ /dev/null @@ -1,34 +0,0 @@ -/** -@page example_scripts Example LittleFoot Scripts - -@section downloading_the_example_script Downloading the example script - -These example scripts demonstrate the functionality of the LittleFoot language. - -The example scripts are self-contained and do not rely on the standalone BLOCKS SDK or the JUCE library. -You will find the examples in the Littlefoot-Examples repository, which you can download from GitHub @littlefootgithub{here}. -Each example comes with a @s_file{.littlefoot} file that can be loaded into the BLOCKS CODE IDE and uploaded onto BLOCKS. - -@section example_scripts_overview Overview - -@subpage example_bitmap_led_program - -The %BitmapLEDProgram class contains a simple LittleFoot program that sets the LEDs of a Lightpad from the heap's content. - -@subpage example_dynamic_parameters - -Learn how to use BLOCKS CODE metadata to interact with your BLOCKS using dynamic parameters. - -@subpage example_colour_pressure_map - -Learn how to display coloured pressure maps on the Lightpad %Block. - -@subpage example_tic_tac_toe - -Implement the classic game of Tic Tac Toe on the Lightpad %Block. - -@subpage example_music_gen - -Develop a MIDI note music generator with interesting visuals on the Lightpad %Block. - -*/ diff --git a/extras/BLOCKS/doxygen/pages/juce_example_tic_tac_toe.dox b/extras/BLOCKS/doxygen/pages/juce_example_tic_tac_toe.dox deleted file mode 100644 index 4f91f45a37..0000000000 --- a/extras/BLOCKS/doxygen/pages/juce_example_tic_tac_toe.dox +++ /dev/null @@ -1,284 +0,0 @@ -/** -@page example_tic_tac_toe Tic Tac Toe - -@section tic_tac_toe_introduction Introduction - -Implement the classic game of Tic Tac Toe on the Lightpad Block. - -Launch the BLOCKS CODE application and open the script called @s_file{TicTacToe.littlefoot}. You can find the script in the Littlefoot-Examples repository, which you can download from GitHub @littlefootgithub{here}. If you don't have the BLOCKS CODE IDE installed on your system, please refer to the section @ref getting_started_with_blocks_code for help. - -@section tic_tac_toe_drawing_grid Drawing the Grid - -Let's start by defining global variables to save the current state of the game. To define global variables in LittleFoot simply place your variables outside any function declaration and at the top of the file for convenience. We first have 9 variables for the state of each cell in the grid, a @s_projcode{currentTurn} variable for the current player's turn and a @s_projcode{winner} variable to determine which player is the winner. - -@code{.cpp} -int tl, t, tr; -int ml, m, mr; -int bl, b, br; - -int currentTurn; - -int winner; -@endcode - -The initialise() function in the littlefoot language is useful to initialise variables and the state of your script as the function is called once when the program is loaded onto the device. Here we set all the cells to 0, a number chosen to define the blank state of a cell, the current turn to player 1 and the winner to 0, again a number chosen to define the ongoing state of the game. - -@code{.cpp} -void initialise() -{ - tl = 0; - t = 0; - tr = 0; - ml = 0; - m = 0; - mr = 0; - bl = 0; - b = 0; - br = 0; - - currentTurn = 1; - winner = 0; -} -@endcode - -In the repaint() function, we first clear the display as usual and check if a winner has been selected. If not, this means the game is still ongoing and we proceed to draw a grid and signs if there are any. Otherwise we draw the winner screen. - -@code{.cpp} -void repaint() -{ - clearDisplay(); - - if (winner == 0) - { - drawGrid(); - drawSigns(); - } - else - { - drawWinner(); - } -} -@endcode - -In order to draw the default grid, we have created a helper function called drawGrid() which is called in the previously defined repaint() function. We first define a variable to the colour white and proceed to draw a rectangle if the cell is still unoccupied. - -@code{.cpp} -void drawGrid() -{ - int white = makeARGB (255, 200, 200, 200); - - if (tl == 0) drawRect (white, 0, 0, 5, 5); - if (t == 0) drawRect (white, 5, 0, 5, 5); - if (tr == 0) drawRect (white, 10, 0, 5, 5); - if (ml == 0) drawRect (white, 0, 5, 5, 5); - if (m == 0) drawRect (white, 5, 5, 5, 5); - if (mr == 0) drawRect (white, 10, 5, 5, 5); - if (bl == 0) drawRect (white, 0, 10, 5, 5); - if (b == 0) drawRect (white, 5, 10, 5, 5); - if (br == 0) drawRect (white, 10, 10, 5, 5); -} -@endcode - -This is performed on each cell using the helper function drawRect() defined below which takes as argument a colour, the coordinates and the size of the rectangle. - -@code{.cpp} -void drawRect (int colour, int x, int y, int w, int h) -{ - fillRect (colour, x, y, 1, h); - fillRect (colour, x, y, w, 1); - - fillRect (colour, x + w - 1, y, 1, h); - fillRect (colour, x, y + h - 1, w, 1); -} -@endcode - -Notice here we use the built-in fillRect() function with either a width or height of 1 to draw lines for the four sides of the rectangle because we don't want the rectangle to be filled. - -@section tic_tac_toe_drawing_signs Drawing the Signs - -Now let's see how we can draw the player signs if any of the cells are occupied. The drawSigns() function called in the repaint() loop checks every cell using the evaluate() helper function defined after. It passes the cell variables along with the coordinates in case we need to draw the signs. - -@code{.cpp} -void drawSigns() -{ - evaluate (tl, 0, 0); - evaluate (t , 5, 0); - evaluate (tr, 10, 0); - - evaluate (ml, 0, 5); - evaluate (m, 5, 5); - evaluate (mr, 10, 5); - - evaluate (bl, 0, 10); - evaluate (b, 5, 10); - evaluate (br, 10, 10); -} -@endcode - -The evaluate() function below checks if the cell variable has been switched to a player index of 1 or 2 in which case we need to draw the corresponding player sign. If the cell variable is still set to 0 this means that the cell is still blank and we keep the white default square. - -@code{.cpp} -void evaluate (int value, int x, int y) -{ - if (value == 1) - drawX (x, y); - else if (value == 2) - drawO (x, y); -} -@endcode - -To draw player 1's "X" sign, we first define the player colour and draw each point in the two diagonals as follows: - -@code{.cpp} -void drawX (int x, int y) -{ - int xColour = makeARGB (255, 0, 255, 0); - - fillRect (xColour, x, y, 1, 1); - fillRect (xColour, x + 1, y + 1, 1, 1); - fillRect (xColour, x + 2, y + 2, 1, 1); - fillRect (xColour, x + 3, y + 3, 1, 1); - fillRect (xColour, x + 4, y + 4, 1, 1); - - fillRect (xColour, x + 4, y, 1, 1); - fillRect (xColour, x + 3, y + 1, 1, 1); - fillRect (xColour, x + 2, y + 2, 1, 1); - fillRect (xColour, x + 1, y + 3, 1, 1); - fillRect (xColour, x, y + 4, 1, 1); -} -@endcode - -To draw player 2's "O" sign, we first define the player colour and draw the four sides like so: - -@code{.cpp} -void drawO (int x, int y) -{ - int oColour = makeARGB (255, 0, 0, 255); - - fillRect (oColour, x, y, 5, 1); - fillRect (oColour, x, y + 4, 5, 1); - fillRect (oColour, x, y, 1, 5); - fillRect (oColour, x + 4, y, 1, 5); -} -@endcode - -@section tic_tac_toe_handling_touch_events Handling Touch Events - -In its current implementation state, our script won't receive any touch events and therefore the game will stay in the blank state with a white grid showing. Let's implement the touchStart() callback to receive player moves. - -@code{.cpp} -void touchStart (int index, float x, float y, float z, float vz) -{ - int xPos = int (x * 7); - int yPos = int (y * 7); - - int index = getIndex (xPos, yPos); - - if (setValueForIndex (index, currentTurn)) - { - currentTurn = currentTurn == 1 ? 2 : 1; - } - - if (xHasWon()) winner = 1; - else if (oHasWon()) winner = 2; -} -@endcode - -In the above function, we first convert the device coordinates into LED grid coordinates by multiplying both x and y variables by 7. Device coordinates are defined using the number of DNA connectors on the side of the device so for example in the case of a Lightpad %Block, the device has a size of 2x2 and therefore the device coordinates will range from 0.0 to 2.0 on each x and y dimensions. Multiplying this range by 7 gives us the LED grid coordinates ranging from 0 to 14 inclusive. - -Now using these grid coordinates, we use the @s_projcode{getIndex()} helper function defined below to retrieve the cell index ranging from 0 to 8 from our 3x3 game grid. - -@code{.cpp} -int getIndex (int x, int y) -{ - int xInd = x / 5; - int yInd = y / 5; - - return yInd * 3 + xInd; -} -@endcode - -When the index is retrieved we attempt to set a cell variable value only if the touched cell is unoccupied. If a value has been successfully set for the current player, the function returns true and the @s_projcode{currentTurn} variable is switched to the other player. - -@code{.cpp} -bool setValueForIndex (int index, int value) -{ - if (index == 0) { tl = tl == 0 ? value : tl; return true; } - if (index == 1) { t = t == 0 ? value : t ; return true; } - if (index == 2) { tr = tr == 0 ? value : tr; return true; } - if (index == 3) { ml = ml == 0 ? value : ml; return true; } - if (index == 4) { m = m == 0 ? value : m ; return true; } - if (index == 5) { mr = mr == 0 ? value : mr; return true; } - if (index == 6) { bl = bl == 0 ? value : bl; return true; } - if (index == 7) { b = b == 0 ? value : b ; return true; } - if (index == 8) { br = br == 0 ? value : br; return true; } - - return false; -} -@endcode - -@section tic_tac_toe_determining_winner Determining a Winner - -We were able to implement the basic gameplay but we don't have a mechanism to select a winner yet. As a last step to the touchStart() callback, we check if a winner has been selected by calling respectively the @s_projcode{xHasWon()} and @s_projcode{oHasWon()} helper functions defined as follows: - -@code{.cpp} -bool xHasWon() { return hasWon (1); } -bool oHasWon() { return hasWon (2); } -@endcode - -These in turn call the @s_projcode{hasWon()} function with the player number which checks all 8 possible combination of winning lines (3 horizontal, 3 vertical and 2 diagonal). - -@code{.cpp} -bool hasWon (int player) -{ - return (tl == player && t == player && tr == player) - || (ml == player && m == player && mr == player) - || (bl == player && b == player && br == player) - - || (tl == player && ml == player && bl == player) - || (t == player && m == player && b == player) - || (tr == player && mr == player && br == player) - - || (tl == player && m == player && br == player) - || (tr == player && m == player && bl == player); -} -@endcode - -If a winner is selected the repaint() function will call the @s_projcode{drawWinner()} function defined below and fill the screen with the appropriate winner's colour: - -@code{.cpp} -void drawWinner() -{ - if (winner == 1) - { - int xColour = makeARGB (255, 0, 255, 0); - fillRect (xColour, 0, 0, 15, 15); - } - else if (winner == 2) - { - int oColour = makeARGB (255, 0, 0, 255); - fillRect (oColour, 0, 0, 15, 15); - } -} -@endcode - -As a final step we can implement a simple way to reset the game back to the beginning by calling the initialise() function ourselves when the side button of the device is pressed. This is achieved by implementing the handleButtonDown() callback function like this: - -@code{.cpp} -void handleButtonDown (int index) -{ - initialise(); -} -@endcode - -@section tic_tac_toe_summary Summary - -In this example, we learnt how to recreate the classic game of Tic Tac Toe on the Lightpad %Block. - -@section tic_tac_toe_see_also See also - -- @ref example_dynamic_parameters -- @ref example_colour_pressure_map -- @ref example_music_gen - -*/ diff --git a/extras/BLOCKS/doxygen/pages/juce_getting_control_button_events.dox b/extras/BLOCKS/doxygen/pages/juce_getting_control_button_events.dox deleted file mode 100644 index 0413d6a0c6..0000000000 --- a/extras/BLOCKS/doxygen/pages/juce_getting_control_button_events.dox +++ /dev/null @@ -1,91 +0,0 @@ -/** -@page getting_control_button_events Getting control button events - -Control button events are communicated from Lightpad and Control Blocks to your application via ControlButton objects. - -You can obtain an array of %ControlButton pointers associated with a specific Lightpad or Control %Block from its corresponding Block object using the Block::getButtons() method --- see the @ref discovering_blocks page for an example of how to obtain %Block objects. -Each pointer to a %ControlButton will be valid for the lifetime of the %Block object. - -Once you have a %ControlButton you must register as a ControlButton::Listener to receive button pressed and button released callbacks. -The process for doing this is to have one of your application's classes inherit from %ControlButton::Listener and override the pure virtual methods ControlButton::Listener::buttonPressed() and ControlButton::Listener::buttonReleased(). -Then, when you register your derived class as a listener to a particular %ControlButton, your overriden methods will be called when the corresponding button is pressed and released. - -Registering a class derived from %ControlButton::Listener with multiple %ControlButton objects is done as follows: - -@code{.cpp} -class ControlButtonListenerExample : public ControlButton::Listener -{ -public: - ControlButtonListenerExample (Block& block) - { - for (auto button : block.getButtons()) - button->addListener (this); - } - - void buttonPressed (ControlButton& sourceControlButton, Block::Timestamp timestamp) override - { - // Do something when the sourceControlButton is pressed! - } - - void buttonReleased (ControlButton& sourceControlButton, Block::Timestamp timestamp) override - { - // Do something when the sourceControlButton is released! - } -}; -@endcode - -When your overriden @s_projcode{buttonPressed()} or @s_projcode{buttonReleased()} methods are called you have access to two parameters: a reference to the %ControlButton that generated this event and timestamp for the event. - -@section getting_control_button_events_example_usage Example usage - -To add this functionality to the BlockFinder example project, add %ControlButton::Listener as a base class to the BlockFinder class and override the @s_projcode{buttonPressed()} and @s_projcode{buttonReleased()} functions as follows: - -@code{.cpp} -class BlockFinder : private TopologySource::Listener, - private ControlButton::Listener -{ -//... -private: - //... - void buttonPressed (ControlButton& sourceControlButton, Block::Timestamp timestamp) override - { - Logger::writeToLog ("Button Pressed!"); - } - - void buttonReleased (ControlButton& sourceControlButton, Block::Timestamp timestamp) override - { - Logger::writeToLog ("Button Released!"); - } - //... -}; -@endcode - -Then in the @s_projcode{topologyChanged()} callback, add the BlockFinder class as a listener to all the buttons on connected Blocks in the current topology to receive button pressed and button released callbacks as shown below: - -@code{.cpp} -void topologyChanged() override -{ - //... - for (auto& block : currentTopology.blocks) - { - //... - for (auto button : block->getButtons()) - button->addListener (this); - } -} -@endcode - -If you run the application now and connect a Lightpad or Control %Block, you should see text in the logger whenever buttons are pressed or released. - -You can also find multiple examples of control button listeners in the @ref example_applications pages. - -Learn more about other Block methods from the following pages: - -@ref getting_touch_events - -@ref controlling_led_grids - -@ref controlling_led_strips - -@ref controlling_control_buttons -*/ diff --git a/extras/BLOCKS/doxygen/pages/juce_getting_started_with_blocks_code.dox b/extras/BLOCKS/doxygen/pages/juce_getting_started_with_blocks_code.dox deleted file mode 100644 index 864047d5f4..0000000000 --- a/extras/BLOCKS/doxygen/pages/juce_getting_started_with_blocks_code.dox +++ /dev/null @@ -1,40 +0,0 @@ -/** -@page getting_started_with_blocks_code Getting started with BLOCKS CODE - -@section downloading_blocks_code Downloading BLOCKS CODE - -In order to facilitate the development of simple BLOCKS applications using the LittleFoot language, BLOCKS CODE IDE was created to provide a self-contained solution that compiles and uploads your code automatically onto BLOCKS devices. - -BLOCK CODE is available for macOS and Windows and you can download the IDE @blockscode{here}. - -@section ide_interface The IDE interface - -After having installed the software, launch the application and you should see a main window pop up, similar to the one shown here: - -@image html blocks_code_interface.png "The BLOCKS CODE interface" - -BLOCKS CODE presents a simple interface with a code editor that highlights the syntax of the LittleFoot language and provides a side panel to browse properties relating to the project. It is divided into four tabs as follows: - -@image html blocks_code_tabs.png "Side panel tabs" - -@subsection ide_interface_project The Project tab - -The Project tab lists all the LittleFoot programs that are currently open and by clicking on any of them, you can instantly upload the code to the device (if there is a device connected). This also selects the code that can be edited in the code editor and displays any unsaved file with a red file icon. - -@subsection ide_interface_targets The Targets tab - -The Targets tab lists all the connected BLOCKS devices to the computer, whether it be via USB or Bluetooth. For every device connected, you have the option to rename the device name, choose it as a target or interact with it. When a program is opened, it is automatically uploaded to all the BLOCKS designated as targets and multiple devices can be selected as targets. However, only one device can be selected to be interacted with and this allows you to change the parameters displayed in the next tab. - -@subsection ide_interface_parameters The Parameters tab - -The Parameters tab displays all the available parameters for the selected %Block in the Targets tab that can be interacted with. This includes parameters created via the \ tag or any configuration flag enabled at runtime. These parameters can be tweaked at runtime in order to dynamically control variables in the program uploaded onto the %Block. - -@subsection ide_interface_logging The Logging tab - -The Logging tab displays values that are logged using the @s_projcode{log()} function in the LittleFoot program. If multiple %Block devices are logging values at the same time, the logs are prefixed by the four-character device ID. - -@section blocks_code_language The LittleFoot language - -For a brief introduction to the LittleFoot language, please refer to @ref the_littlefoot_language page or jump straight into the @ref example_scripts to get coding. - -*/ diff --git a/extras/BLOCKS/doxygen/pages/juce_getting_touch_events.dox b/extras/BLOCKS/doxygen/pages/juce_getting_touch_events.dox deleted file mode 100644 index 551b4aefcc..0000000000 --- a/extras/BLOCKS/doxygen/pages/juce_getting_touch_events.dox +++ /dev/null @@ -1,82 +0,0 @@ -/** -@page getting_touch_events Getting touch events - -Touch events are communicated from BLOCKS devices to your application code via TouchSurface objects. - -You can obtain a pointer to the %TouchSurface associated with a specific BLOCKS device from its corresponding Block object using the Block::getTouchSurface() method --- see the @ref discovering_blocks page for an example of how to obtain %Block objects. -For devices without a touch surface (such as the Control %Block) this method will return @s_code{nullptr}, but if the device is capable of sending touch events then the pointer to the %TouchSurface will be valid for the lifetime of the %Block object. - -Once you have a %TouchSurface you must register as a TouchSurface::Listener to get touch events. -The process for doing this is to have one of your application's classes inherit from %TouchSurface::Listener and override the pure virtual method TouchSurface::Listener::touchChanged(). -Then, when you register your derived class as a listener to a particular %TouchSurface, your overriden method will be called when the corresponding device is touched. - -A safe way of registering a class derived from %TouchSurface::Listener with a %TouchSurface is as follows. - -@code{.cpp} -class TouchSurfaceListenerExample : public TouchSurface::Listener -{ -public: - TouchSurfaceListenerExample (Block& block) - { - if (auto touchSurface = block.getTouchSurface()) - touchSurface->addListener (this); - } - - void touchChanged (TouchSurface& sourceTouchSurface, const TouchSurface::Touch& touchEvent) override - { - // Do something with touchEvent here! - } -}; -@endcode - -When your overriden @s_projcode{touchChanged()} method is called you have access to two parameters: a reference to the %TouchSurface that generated this event and a reference to a TouchSurface::Touch. -The %TouchSurface::Touch class contains member variables describing the position, pressure, velocity, timestamp and more. - -@section getting_touch_events_example_usage Example usage - -To add this functionality to the BlockFinder example project, add %TouchSurface::Listener as a base class to the BlockFinder class and override the @s_projcode{touchChanged()} function as follows: - -@code{.cpp} -class BlockFinder : private TopologySource::Listener, - private TouchSurface::Listener -{ -//... -private: - //... - void touchChanged (TouchSurface& sourceTouchSurface, const TouchSurface::Touch& touchEvent) override - { - Logger::writeToLog ("Touch Changed!"); - } - //... -}; -@endcode - -Then in the @s_projcode{topologyChanged()} callback, add the BlockFinder class as a listener to the connected Blocks in the current topology to receive touch change callbacks as shown below: - -@code{.cpp} -void topologyChanged() override -{ - //... - for (auto& block : currentTopology.blocks) - { - //... - if (auto touchSurface = block->getTouchSurface()) - touchSurface->addListener (this); - } -} -@endcode - -If you run the application now and connect a Lightpad, you should see text in the logger whenever the surface is touched. - -You can also find multiple examples of using TouchSurfaces in the @ref example_applications pages. - -Learn more about other Block methods from the following pages: - -@ref getting_control_button_events - -@ref controlling_led_grids - -@ref controlling_led_strips - -@ref controlling_control_buttons -*/ diff --git a/extras/BLOCKS/doxygen/pages/juce_main.dox b/extras/BLOCKS/doxygen/pages/juce_main.dox deleted file mode 100644 index 56f89b5874..0000000000 --- a/extras/BLOCKS/doxygen/pages/juce_main.dox +++ /dev/null @@ -1,85 +0,0 @@ -/** -@mainpage Documentation - -Welcome to the BLOCKS SDK documentation. -@s_break - -Here you will find all the information required to start creating BLOCKS applications. -A brief summary of the main sections is below. - -@s_break -@subpage downloading_the_sdk - -This section describes how to get started writing LittleFoot scripts and how to obtain the SDK source code, either via the @jucegithub{JUCE framework} or @ref the_standalone_blocks_sdk. - -@s_break -@subpage connecting_blocks - -Lightpad and Control Blocks communicate with a computer over USB-C or Bluetooth, and communicate with each other via magnetic connections on their sides. -This section contains instructions for configuring your setup so that all the components can communicate with each other. - -@s_break -@subpage discovering_blocks - -Once you have connected your device to your computer you need to be able to discover it from your application. -This section outlines the procedure for Lightpad and Control %Block discovery and provides some simple example code which monitors for new connections. - -@s_break -@subpage getting_touch_events - -This section explains how to capture touch events from a compatible device and, building on the @ref discovering_blocks section, displays some example code. - -@s_break -@subpage getting_control_button_events - -Lightpad and Control Blocks have control buttons, either a mode button on their side or labelled buttons on top, and this section shows you how to obtain button pressed and button released events. - -@s_break -@subpage controlling_led_grids - -This section explains how to control the LED grid on a Lightpad. - -@s_break -@subpage controlling_led_strips - -Control Blocks have a strip of lights running along one side and this section provides instructions for controlling the individual LEDs. - -@s_break -@subpage controlling_control_buttons - -As well as providing button pressed and button released events, control buttons also have LEDs. -This section explains how to change the colour of different buttons. - -@s_break -@subpage getting_started_with_blocks_code - -Learn how to use the BLOCKS CODE IDE to develop LittleFoot programs that run on BLOCKS devices. - -@s_break -@subpage the_littlefoot_language - -Advanced SDK users can specify specialised programs to run on Lightpad Blocks. -These programs must be written in the LittleFoot language, which is described -in this section. - -@s_break -@subpage the_standalone_blocks_sdk - -The easiest way to get started using the SDK is via the @jucegithub{JUCE framework}, but if you want to integrate BLOCKS functionality into your existing application then it may be more convenient to use @ref the_standalone_blocks_sdk. -This section gives an overview of building and using the BLOCKS SDK as a library. - -@s_break -@subpage example_scripts - -This section provides examples of LittleFoot scripts that can be loaded onto the BLOCKS hardware. - -@s_break -@subpage example_integrations - -This section gives an example of how to integrate BLOCKS features into an existing application. - -@s_break -@subpage example_applications - -This section contains examples of BLOCKS applications that make use of the full potential of the JUCE library. -*/ diff --git a/extras/BLOCKS/doxygen/pages/juce_the_littlefoot_language.dox b/extras/BLOCKS/doxygen/pages/juce_the_littlefoot_language.dox deleted file mode 100644 index cc6a883d0e..0000000000 --- a/extras/BLOCKS/doxygen/pages/juce_the_littlefoot_language.dox +++ /dev/null @@ -1,11 +0,0 @@ -/** -@page the_littlefoot_language The LittleFoot Language - -@section littlefoot_description A description of the LittleFoot language - -A description of the LittleFoot language is contained in the SDK source code at @s_file{juce_blocks_basics/littlefoot/LittleFoot Language README.txt}: -@includedoc "LittleFoot Language README.txt" - -You can find example scripts written using the LittleFoot language in the @ref example_scripts section and a more comprehensive list of @ref LittleFootFunctions in the JUCE library documentation. - -*/ diff --git a/extras/BLOCKS/doxygen/pages/juce_the_standalone_blocks_sdk.dox b/extras/BLOCKS/doxygen/pages/juce_the_standalone_blocks_sdk.dox deleted file mode 100644 index f8ed3cb9c6..0000000000 --- a/extras/BLOCKS/doxygen/pages/juce_the_standalone_blocks_sdk.dox +++ /dev/null @@ -1,47 +0,0 @@ -/** -@page the_standalone_blocks_sdk The standalone BLOCKS SDK - -The easiest way to get started developing BLOCKS applications is to use the @jucegithub{JUCE framework}, but if you would prefer not to use JUCE directly the standalone BLOCKS SDK can be obtained from the @blocksgithub{BLOCKS-SDK repository}. - -The most straightforward way to use the SDK is to compile the SDK source code into a static library. -Then, in your BLOCKS application code, you can use the header files in the SDK to give you access to the BLOCKS classes and functions. -Finally, when you want to compile your application, you must link against the static library to get all the BLOCKS functionality. - -@section standalone_building_library Building the SDK library - -The source code for the BLOCKS SDK library is contained within the @s_file{SDK} directory of the BLOCKS-SDK repository. -Here you will find header files that you can include in your own projects and the @s_file{Build} subdirectory contains an Xcode project, a Visual Studio project and a Linux Makefile for compiling the SDK source code into a static library. -Use the appropriate choice for your platform, select either the "Debug" or "Release" configuration, and build the project. - -For macOS this will produce @s_file{libBLOCKS-SDK.a} in either the @s_file{SDK/Build/MacOS/Debug/} or @s_file{SDK/Build/MacOS/Release/} directory, for Linux this will produce @s_file{libBLOCKS-SDK.a} in either the @s_file{SDK/Build/Linux/Debug/} or @s_file{SDK/Build/Linux/Release/} directory, and for Windows this will produce @s_file{BLOCKS-SDK.lib} in either the @s_file{SDK\\Build\\Windows\\x64\\Debug} or @s_file{SDK\\Build\\Windows\\x64\\Release} folder. - -@section standalone_using_header Using the SDK header file - -To use BLOCKS classes and functions in your application you must include the @s_file{BlocksHeader.h} file in your source code. -You also need to tell the compiler to look in the @s_file{SDK} directory for additional header files, which you can configure inside your Xcode or Visual Studio project. -If you are using the command line to compile your application then you can see an example of how to do this in @s_file{examples/BlockFinder/Linux/Makefile} or @s_file{examples/BlockFinder/MacOS/Makefile}. - -@section standalone_linking Linking against the SDK library - -You must also tell your compiler where to find the SDK static library before your BLOCKS application will compile, and include all of the dependencies for your platform, which are listed in the @ref standalone_dependencies section. -Again, this is configured in your Xcode or Visual Studio project, but if you are using the command line you can see an example of how to do this in @s_file{examples/BlockFinder/Linux/Makefile} or @s_file{examples/BlockFinder/MacOS/Makefile}. - -You can find example code of how to integrate the BLOCKS SDK into existing applications in the @ref example_integrations section. - -@section standalone_dependencies Standalone SDK dependencies - -- A C++11 compatible compiler - -@subsection standalone_libraries_macos macOS frameworks - -- Accelerate -- AudioToolbox -- CoreAudio -- CoreMIDI - -@subsection standalone_libraries_linux Linux packages - -- x11 -- alsa -- libcurl -*/ diff --git a/extras/BLOCKS/doxygen/stylesheet.css b/extras/BLOCKS/doxygen/stylesheet.css deleted file mode 100644 index 6db5b17696..0000000000 --- a/extras/BLOCKS/doxygen/stylesheet.css +++ /dev/null @@ -1,2184 +0,0 @@ -@font-face { - font-family: Contax Pro; - src: url("data:application/x-font-woff;charset=utf-8;base64,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") format("woff"); - font-weight: 400; - font-style: normal -} -@font-face { - font-family: Contax Pro; - src: url("data:application/x-font-woff;charset=utf-8;base64,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") format("woff"); - font-weight: 700; - font-style: normal -} -p { - letter-spacing: .3 -} -.center, -.center-text { - text-align: center -} -h1, -h2, -h3, -h4 { - font-weight: 400; - letter-spacing: .3 -} -.heading--bold { - font-weight: 900; - font-smoothing: antialiased -} -hr { - border-top: 2px solid #fbfbfb; - margin: 20px 0 -} -.link-list { - padding-left: 0 -} -.link-list>li { - text-decoration: none; - list-style: none; - margin: 20px 0 -} -.link-list>li a { - color: #397fba -} -.headed-list { - list-style: none; - position: relative; - padding-left: 0 -} -.headed-list li { - position: relative; - margin: 0 -} -.headed-list li+li { - margin-top: 2em -} -.headed-list h5 { - font-size: 15px; - font-weight: 700; - margin: 0 -} -.headed-list p { - margin: 0 -} -.pretty { - list-style: none; - padding-left: 1em -} -.pretty li { - position: relative -} -.pretty li:before { - content: ''; - position: absolute; - display: block; - width: .3em; - height: .3em; - border-radius: 50%; - left: -1em; - background: #d1d3d3; - top: .6em -} -.pretty-ol { - padding-left: 1em -} -.pretty-ol li { - padding-left: .5em -} -.inline-link, -p a { - text-decoration: underline; - color: #4665a2 -} -a:focus, -button:active, -button:focus { - outline: none -} -.svg-icon { - vertical-align: bottom -} -.small-print>* { - font-size: 12px -} -.small-print h2, -.small-print h3, -.small-print h4, -.small-print h5 { - font-size: 14px -} -.sm { - position: relative; - z-index: 9999 -} -.sm, -.sm li, -.sm ul { - display: block; - list-style: none; - margin: 0; - padding: 0; - line-height: normal; - direction: ltr; - text-align: left; - -webkit-tap-highlight-color: transparent -} -.sm-rtl, -.sm-rtl li, -.sm-rtl ul { - direction: rtl; - text-align: right -} -.sm>li>h1, -.sm>li>h2, -.sm>li>h3, -.sm>li>h4, -.sm>li>h5, -.sm>li>h6 { - margin: 0; - padding: 0 -} -.sm ul { - display: none -} -.sm a, -.sm li { - position: relative -} -.sm a { - display: block -} -.sm a.disabled { - cursor: not-allowed -} -.sm:after { - display: block; - height: 0; - font: 0/0 serif; - clear: both; - visibility: hidden; - overflow: hidden -} -.sm, -.sm *, -.sm:after, -.sm:before { - box-sizing: border-box -} -.sm-dox { - background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAAkCAIAAADHFsdbAAAAcElEQVR4Ae3dTQ6DIBRF4ce70NS4uA51YOLAtFYw0B+gxn06dAddRMGykHO/5K6Ctv3LdaX4fJJ4+RXuvcA+/xkXMbsPJhugbcQ4B9xT2dF43EzAVfscExGa3rIQxGkORZaK5U9zhKKSGYFueODS6h/TSxpOsn4UagAAAABJRU5ErkJggg==) -} -.sm-dox a, -.sm-dox a:active, -.sm-dox a:focus, -.sm-dox a:hover { - padding: 0 12px; - padding-right: 43px; - font-family: Lucida Grande, Geneva, Helvetica, Arial, sans-serif; - font-size: 13px; - font-weight: 700; - line-height: 36px; - text-decoration: none; - text-shadow: 0 1px 1px hsla(0, 0%, 100%, .9); - color: #283a5d; - outline: 0 -} -.sm-dox a:hover { - background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAAkCAIAAADHFsdbAAAAVUlEQVR4Ae2dSwqAMBBDJ2+kKIqIW8W94CXceP8j2amt5wgJ+Z3B9vOmH1emZSMNM3QJSRkgHDMrkLz4ReN+XA9EHr0fOa/b4OiSd023v/b/fX9Z9V/qQQI0WZ7jfQAAAABJRU5ErkJggg==); - background-repeat: repeat-x; - color: #fff; - text-shadow: 0 1px 1px #000 -} -.sm-dox a.current { - color: #d23600 -} -.sm-dox a.disabled { - color: #bbb -} -.sm-dox a span.sub-arrow { - position: absolute; - top: 50%; - margin-top: -14px; - left: auto; - right: 3px; - width: 28px; - height: 28px; - overflow: hidden; - font: 700 12px/28px monospace!important; - text-align: center; - text-shadow: none; - background: hsla(0, 0%, 100%, .5); - border-radius: 5px -} -.sm-dox a.highlighted span.sub-arrow:before { - display: block; - content: '-' -} -.sm-dox>li:first-child>:not(ul) a, -.sm-dox>li:first-child>a { - border-radius: 5px 5px 0 0 -} -.sm-dox>li:last-child>:not(ul) a, -.sm-dox>li:last-child>a, -.sm-dox>li:last-child>ul, -.sm-dox>li:last-child>ul>li:last-child>:not(ul) a, -.sm-dox>li:last-child>ul>li:last-child>a, -.sm-dox>li:last-child>ul>li:last-child>ul, -.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>:not(ul) a, -.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>a, -.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul, -.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>:not(ul) a, -.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>a, -.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>ul, -.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>:not(ul) a, -.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>a, -.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>ul { - border-radius: 0 0 5px 5px -} -.sm-dox>li:last-child>:not(ul) a.highlighted, -.sm-dox>li:last-child>a.highlighted, -.sm-dox>li:last-child>ul>li:last-child>:not(ul) a.highlighted, -.sm-dox>li:last-child>ul>li:last-child>a.highlighted, -.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>:not(ul) a.highlighted, -.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>a.highlighted, -.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>:not(ul) a.highlighted, -.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>a.highlighted, -.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>:not(ul) a.highlighted, -.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>a.highlighted { - border-radius: 0 -} -.sm-dox ul { - background: hsla(0, 0%, 64%, .1) -} -.sm-dox ul a, -.sm-dox ul a:active, -.sm-dox ul a:focus, -.sm-dox ul a:hover { - font-size: 12px; - border-left: 8px solid transparent; - line-height: 36px; - text-shadow: none; - background-color: #fff; - background-image: none -} -.sm-dox ul a:hover { - background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAAkCAIAAADHFsdbAAAAVUlEQVR4Ae2dSwqAMBBDJ2+kKIqIW8W94CXceP8j2amt5wgJ+Z3B9vOmH1emZSMNM3QJSRkgHDMrkLz4ReN+XA9EHr0fOa/b4OiSd023v/b/fX9Z9V/qQQI0WZ7jfQAAAABJRU5ErkJggg==); - background-repeat: repeat-x; - color: #fff; - text-shadow: 0 1px 1px #000 -} -.sm-dox ul ul a, -.sm-dox ul ul a:active, -.sm-dox ul ul a:focus, -.sm-dox ul ul a:hover { - border-left: 16px solid transparent -} -.sm-dox ul ul ul a, -.sm-dox ul ul ul a:active, -.sm-dox ul ul ul a:focus, -.sm-dox ul ul ul a:hover { - border-left: 24px solid transparent -} -.sm-dox ul ul ul ul a, -.sm-dox ul ul ul ul a:active, -.sm-dox ul ul ul ul a:focus, -.sm-dox ul ul ul ul a:hover { - border-left: 32px solid transparent -} -.sm-dox ul ul ul ul ul a, -.sm-dox ul ul ul ul ul a:active, -.sm-dox ul ul ul ul ul a:focus, -.sm-dox ul ul ul ul ul a:hover { - border-left: 40px solid transparent -} -@mediamin-width768px { - .sm-dox ul { - position: absolute; - width: 12em - } - .sm-dox li { - float: left - } - .sm-dox.sm-rtl li { - float: right - } - .sm-dox.sm-rtl ul li, - .sm-dox.sm-vertical li, - .sm-dox ul li { - float: none - } - .sm-dox a { - white-space: nowrap - } - .sm-dox.sm-vertical a, - .sm-dox ul a { - white-space: normal - } - .sm-dox .sm-nowrap>li>:not(ul) a, - .sm-dox .sm-nowrap>li>a { - white-space: nowrap - } - .sm-dox { - padding: 0 10px; - background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAAkCAIAAADHFsdbAAAAcElEQVR4Ae3dTQ6DIBRF4ce70NS4uA51YOLAtFYw0B+gxn06dAddRMGykHO/5K6Ctv3LdaX4fJJ4+RXuvcA+/xkXMbsPJhugbcQ4B9xT2dF43EzAVfscExGa3rIQxGkORZaK5U9zhKKSGYFueODS6h/TSxpOsn4UagAAAABJRU5ErkJggg==); - line-height: 36px - } - .sm-dox a span.sub-arrow { - top: 50%; - margin-top: -2px; - right: 12px; - width: 0; - height: 0; - border-width: 4px; - border-style: solid dashed dashed; - border-color: #283a5d transparent transparent; - background: transparent; - border-radius: 0 - } - .sm-dox a, - .sm-dox a.highlighted, - .sm-dox a:active, - .sm-dox a:focus, - .sm-dox a:hover { - padding: 0 12px; - background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAAkCAIAAADHFsdbAAAAf0lEQVR4Ae3dgQmCQABA0aM/URIUhaQimqIlpkmRl4pmljZbG7RIw+RRgzzeGuL1/pBdnmRyIM1/knM/GohPPdHx8XcnzEaHjiDt8PYtfnLDjVuc6Iqt7BqsbYMZ1qyDGt2v0L2K1UYpWbolC6dgbhfMLDkRQqCZkqkh0Yxc/QU8xSP87u6VHwAAAABJRU5ErkJggg==); - background-repeat: no-repeat; - background-position: 100%; - border-radius: 0!important - } - .sm-dox a:hover { - background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAAkCAIAAADHFsdbAAAAVUlEQVR4Ae2dSwqAMBBDJ2+kKIqIW8W94CXceP8j2amt5wgJ+Z3B9vOmH1emZSMNM3QJSRkgHDMrkLz4ReN+XA9EHr0fOa/b4OiSd023v/b/fX9Z9V/qQQI0WZ7jfQAAAABJRU5ErkJggg==); - background-repeat: repeat-x; - color: #fff; - text-shadow: 0 1px 1px #000 - } - .sm-dox a:hover span.sub-arrow { - border-color: #fff transparent transparent - } - .sm-dox a.has-submenu { - padding-right: 24px - } - .sm-dox li { - border-top: 0 - } - .sm-dox>li>ul:after, - .sm-dox>li>ul:before { - content: ''; - position: absolute; - top: -18px; - left: 30px; - width: 0; - height: 0; - overflow: hidden; - border-width: 9px; - border-style: dashed dashed solid; - border-color: transparent transparent #bbb - } - .sm-dox>li>ul:after { - top: -16px; - left: 31px; - border-width: 8px; - border-color: transparent transparent #fff - } - .sm-dox ul { - border: 1px solid #bbb; - padding: 5px 0; - background: #fff; - border-radius: 5px!important; - box-shadow: 0 5px 9px rgba(0, 0, 0, .2) - } - .sm-dox ul a span.sub-arrow { - right: 8px; - top: 50%; - margin-top: -5px; - border-width: 5px; - border-color: transparent transparent transparent #555; - border-style: dashed dashed dashed solid - } - .sm-dox ul a, - .sm-dox ul a.highlighted, - .sm-dox ul a:active, - .sm-dox ul a:focus, - .sm-dox ul a:hover { - border: 0!important; - color: #555; - background-image: none - } - .sm-dox ul a:hover { - background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAAkCAIAAADHFsdbAAAAVUlEQVR4Ae2dSwqAMBBDJ2+kKIqIW8W94CXceP8j2amt5wgJ+Z3B9vOmH1emZSMNM3QJSRkgHDMrkLz4ReN+XA9EHr0fOa/b4OiSd023v/b/fX9Z9V/qQQI0WZ7jfQAAAABJRU5ErkJggg==); - background-repeat: repeat-x; - color: #fff; - text-shadow: 0 1px 1px #000 - } - .sm-dox ul a:hover span.sub-arrow { - border-color: transparent transparent transparent #fff - } - .sm-dox span.scroll-down, - .sm-dox span.scroll-up { - position: absolute; - display: none; - visibility: hidden; - overflow: hidden; - background: #fff; - height: 36px - } - .sm-dox span.scroll-down:hover, - .sm-dox span.scroll-up:hover { - background: #eee - } - .sm-dox span.scroll-up:hover span.scroll-down-arrow, - .sm-dox span.scroll-up:hover span.scroll-up-arrow { - border-color: transparent transparent #d23600 - } - .sm-dox span.scroll-down:hover span.scroll-down-arrow { - border-color: #d23600 transparent transparent - } - .sm-dox span.scroll-down-arrow, - .sm-dox span.scroll-up-arrow { - position: absolute; - top: 0; - left: 50%; - margin-left: -6px; - width: 0; - height: 0; - overflow: hidden; - border-width: 6px; - border-style: dashed dashed solid; - border-color: transparent transparent #555 - } - .sm-dox span.scroll-down-arrow { - top: 8px; - border-style: solid dashed dashed; - border-color: #555 transparent transparent - } - .sm-dox.sm-rtl a.has-submenu { - padding-right: 12px; - padding-left: 24px - } - .sm-dox.sm-rtl a span.sub-arrow { - right: auto; - left: 12px - } - .sm-dox.sm-rtl.sm-vertical a.has-submenu { - padding: 10px 20px - } - .sm-dox.sm-rtl.sm-vertical a span.sub-arrow { - right: auto; - left: 8px; - border-style: dashed solid dashed dashed; - border-color: transparent #555 transparent transparent - } - .sm-dox.sm-rtl>li>ul:before { - left: auto; - right: 30px - } - .sm-dox.sm-rtl>li>ul:after { - left: auto; - right: 31px - } - .sm-dox.sm-rtl ul a.has-submenu { - padding: 10px 20px!important - } - .sm-dox.sm-rtl ul a span.sub-arrow { - right: auto; - left: 8px; - border-style: dashed solid dashed dashed; - border-color: transparent #555 transparent transparent - } - .sm-dox.sm-vertical { - padding: 10px 0; - border-radius: 5px - } - .sm-dox.sm-vertical a { - padding: 10px 20px - } - .sm-dox.sm-vertical a.highlighted, - .sm-dox.sm-vertical a:active, - .sm-dox.sm-vertical a:focus, - .sm-dox.sm-vertical a:hover { - background: #fff - } - .sm-dox.sm-vertical a.disabled { - background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAAkCAIAAADHFsdbAAAAcElEQVR4Ae3dTQ6DIBRF4ce70NS4uA51YOLAtFYw0B+gxn06dAddRMGykHO/5K6Ctv3LdaX4fJJ4+RXuvcA+/xkXMbsPJhugbcQ4B9xT2dF43EzAVfscExGa3rIQxGkORZaK5U9zhKKSGYFueODS6h/TSxpOsn4UagAAAABJRU5ErkJggg==) - } - .sm-dox.sm-vertical a span.sub-arrow { - right: 8px; - top: 50%; - margin-top: -5px; - border-width: 5px; - border-style: dashed dashed dashed solid; - border-color: transparent transparent transparent #555 - } - .sm-dox.sm-vertical>li>ul:after, - .sm-dox.sm-vertical>li>ul:before { - display: none - } - .sm-dox.sm-vertical ul a { - padding: 10px 20px - } - .sm-dox.sm-vertical ul a.highlighted, - .sm-dox.sm-vertical ul a:active, - .sm-dox.sm-vertical ul a:focus, - .sm-dox.sm-vertical ul a:hover { - background: #eee - } - .sm-dox.sm-vertical ul a.disabled { - background: #fff - } -} -#nav-tree .children_ul { - margin: 0; - padding: 4px -} -#nav-tree ul { - list-style: none outside none; - margin: 0; - padding: 0 -} -#nav-tree li { - white-space: nowrap; - margin: 0; - padding: 0 -} -#nav-tree .plus { - margin: 0 -} -#nav-tree img { - margin: 0; - padding: 0; - border: 0; - vertical-align: middle -} -#nav-tree a { - text-decoration: none; - padding: 0; - margin: 0; - outline: none -} -#nav-tree .label { - margin: 0; - padding: 0; - font: 16px "Contax Pro", Lucida Grande, Geneva, Helvetica, Arial, sans-serif; - line-height: 160% -} -#nav-tree .label a { - padding: 2px -} -#nav-tree .children_ul, -#nav-tree .item { - margin: 0; - padding: 0 -} -#nav-tree { - font-size: 14px -} -#doc-content, -#nav-tree { - padding: 0; - overflow: auto -} -#doc-content { - display: block; - margin: 0; - -webkit-overflow-scrolling: touch -} -#side-nav { - padding: 0 6px 0 0; - margin: 0; - position: absolute; - left: 0; - width: 320px -} -#side-nav, -.ui-resizable .ui-resizable-handle { - display: block; -} -.ui-resizable-e { - cursor: ew-resize; - height: 100%; - right: 0; - top: 0; - width: 6px -} -.ui-resizable-handle { - display: none; - font-size: .1px; - position: absolute; - z-index: 1 -} -#nav-tree-contents { - margin: 6px 0 0 -} -#nav-tree { - -webkit-overflow-scrolling: touch -} -#nav-sync { - position: absolute; - top: 5px; - right: 24px; - z-index: 0; - display: none; -} -#nav-sync img { - opacity: .3 -} -#nav-sync img:hover { - opacity: .9 -} -@media print { - #nav-tree { - display: none - } - div.ui-resizable-handle { - display: none; - position: relative - } -} -#FSearchBox { - float: left -} -#MSearchBox { - white-space: nowrap; - float: none; - margin-top: 0; - right: 0; - width: 170px; - height: 24px; - z-index: 102; - display: none; - position: absolute -} -#MSearchSelect { - display: block; - position: absolute; - width: 20px; - height: 19px -} -.left #MSearchSelect { - left: 4px -} -.right #MSearchSelect { - right: 5px -} -#MSearchField { - border: none; - width: 111px; - margin-left: 20px; - outline: none; - -webkit-border-radius: 0 -} -#FSearchBox #MSearchField { - margin-left: 15px -} -#MSearchClose { - display: none; - position: absolute; - top: 4px; - background: none; - border: none; - margin: 0 4px 0 0; - padding: 0; - outline: none -} -.left #MSearchClose { - left: 6px -} -.right #MSearchClose { - right: 2px -} -.MSearchBoxActive #MSearchField { - color: #000 -} -#MSearchSelectWindow { - display: none; - position: absolute; - left: 0; - top: 0; - background-color: #f9fafc; - z-index: 10001; - padding-top: 4px; - padding-bottom: 4px; - -moz-border-radius: 4px; - -webkit-border-top-left-radius: 4px; - -webkit-border-top-right-radius: 4px; - -webkit-border-bottom-left-radius: 4px; - -webkit-border-bottom-right-radius: 4px; - -webkit-box-shadow: 5px 5px 5px rgba(0, 0, 0, .15) -} -.SelectItem { - font: 8pt Arial, Verdana, sans-serif; - padding-left: 2px; - padding-right: 12px; - border: 0 -} -span.SelectionMark { - margin-right: 4px; - font-family: monospace; - outline-style: none; - text-decoration: none -} -a.SelectItem { - display: block; - padding-left: 6px; - padding-right: 12px -} -a.SelectItem, -a.SelectItem:active, -a.SelectItem:focus { - outline-style: none; - color: #000; - text-decoration: none -} -a.SelectItem:hover { - color: #fff; - outline-style: none; - text-decoration: none; - cursor: pointer; - display: block -} -iframe#MSearchResults { - width: 60ex; - height: 15em -} -#MSearchResultsWindow { - display: none; - position: absolute; - left: 0; - top: 0; - border: 1px solid #000; - z-index: 10000 -} -#SRIndex { - clear: both; - padding-bottom: 15px -} -.SREntry { - font: 400 10px/16px "Contax Pro", sans-serif; - font-size: 14pt; - padding-left: 1ex -} -.SRPage .SREntry { - font-size: 10pt; - padding: 1px 5px -} -body.SRPage { - margin: 5px 2px -} -.SRChildren { - padding-left: 3ex; - padding-bottom: .5em -} -.SRPage .SRChildren { - display: none -} -.SRSymbol { - font-weight: 700 -} -.SRSymbol, -a.SRScope { - color: #425e97; - font-family: Arial, Verdana, sans-serif; - text-decoration: none; - outline: none -} -a.SRScope { - display: block -} -a.SRScope:active, -a.SRScope:focus, -a.SRSymbol:active, -a.SRSymbol:focus { - text-decoration: underline -} -span.SRScope { - padding-left: 4px -} -.SRPage .SRStatus { - padding: 2px 5px; - font-size: 8pt; - font-style: italic -} -.SRResult { - display: none -} -DIV.searchresults { - margin-left: 10px; - margin-right: 10px -} -.searchresult { - background-color: #f0f3f8 -} -.pages b { - color: #fff; - padding: 5px 5px 3px; - background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAAkCAIAAADHFsdbAAAAVUlEQVR4Ae2dSwqAMBBDJ2+kKIqIW8W94CXceP8j2amt5wgJ+Z3B9vOmH1emZSMNM3QJSRkgHDMrkLz4ReN+XA9EHr0fOa/b4OiSd023v/b/fX9Z9V/qQQI0WZ7jfQAAAABJRU5ErkJggg==); - background-repeat: repeat-x; - text-shadow: 0 1px 1px #000 -} -.pages { - line-height: 17px; - margin-left: 4px; - text-decoration: none -} -.hl { - font-weight: 700 -} -#searchresults { - margin-bottom: 20px -} -.searchpages { - margin-top: 10px -} -body, -div, -dl, -p, -table { - font: 400 16px/24px "Contax Pro", sans-serif; -} -h1.groupheader { - font-size: 150% -} -.title { - font: 400 16px/32px "Contax Pro", sans-serif; - font-weight: 700; - font-size: 32px; - margin: 10px 2px -} -h2.groupheader { - font-size: 150%; - font-weight: 400; - margin-top: 1.75em; - padding-top: 8px; - padding-bottom: 4px; - width: 100% -} -h3.groupheader { - font-size: 100% -} -h1, -h2, -h3, -h4, -h5, -h6 { - -webkit-transition: text-shadow .5s linear; - transition: text-shadow .5s linear; - margin-right: 15px -} -h1.glow, -h2.glow, -h3.glow, -h4.glow, -h5.glow, -h6.glow { - text-shadow: 0 0 15px cyan -} -dt { - font-weight: 700 -} -div.multicol { - -moz-column-gap: 1em; - -webkit-column-gap: 1em; - -moz-column-count: 3; - -webkit-column-count: 3 -} -p.startdd, -p.startli { - margin-top: 2px -} -p.starttd { - margin-top: 0 -} -p.endli { - margin-bottom: 0 -} -p.enddd { - margin-bottom: 4px -} -p.endtd { - margin-bottom: 2px -} -caption { - font-weight: 700 -} -span.legend { - font-size: 70%; - text-align: center -} -h3.version { - font-size: 90%; - text-align: center -} -div.navtab, -div.qindex { - background-color: #ebeff6; - border: 1px solid #a3b4d7; - text-align: center -} -div.navpath, -div.qindex { - width: 100%; - line-height: 140% -} -div.navtab { - margin-right: 15px -} -.contents a:visited { - color: #121c2f -} -a:hover { - text-decoration: underline -} -a.qindex, -a.qindexHL { - font-weight: 700 -} -a.qindexHL { - background-color: #9cafd4; - color: #fff; - border: 1px double #869dca -} -.contents a.qindexHL:visited { - color: #fff -} -a.el { - font-weight: 700 -} -a.code, -a.code:visited, -a.codeRef, -a.codeRef:visited, -a.line, -a.line:visited, -a.lineRef, -a.lineRef:visited { - color: #121c2f -} -dl.el { - margin-left: -1cm -} -pre.fragment { - padding: 4px 6px; - overflow: auto; - word-wrap: break-word; - font-size: 9pt; - line-height: 125%; - font-family: monospace, fixed; - font-size: 105% -} -div.fragment, -pre.fragment { - border: 1px solid #c4cfe5; - background-color: #fbfcfd; - margin: 4px 8px 4px 2px -} -div.fragment { - padding: 0 -} -div.line { - font-family: monospace, fixed; - font-size: 13px; - min-height: 13px; - line-height: 1; - text-wrap: unrestricted; - white-space: -moz-pre-wrap; - white-space: -pre-wrap; - white-space: -o-pre-wrap; - white-space: pre-wrap; - word-wrap: break-word; - text-indent: -53px; - padding-left: 53px; - padding-bottom: 0; - margin: 0; - -webkit-transition-property: background-color, box-shadow; - -webkit-transition-duration: .5s; - -moz-transition-property: background-color, box-shadow; - -moz-transition-duration: .5s; - -ms-transition-property: background-color, box-shadow; - -ms-transition-duration: .5s; - -o-transition-property: background-color, box-shadow; - -o-transition-duration: .5s; - transition-property: background-color, box-shadow; - transition-duration: .5s -} -div.line:after { - white-space: pre -} -div.line.glow { - background-color: cyan; - box-shadow: 0 0 10px cyan -} -span.lineno { - padding-right: 4px; - text-align: right; - border-right: 2px solid #0f0; - background-color: #e8e8e8; - white-space: pre -} -span.lineno a { - background-color: #d8d8d8 -} -span.lineno a:hover { - background-color: #c8c8c8 -} -.lineno { - -webkit-touch-callout: none; - -webkit-user-select: none; - -moz-user-select: none; - -ms-user-select: none; - user-select: none -} -div.ah, -span.ah { - background-color: #000; - font-weight: 700; - color: #fff; - margin-bottom: 3px; - margin-top: 3px; - padding: .2em; - border: thin solid #333; - border-radius: .5em; - -webkit-border-radius: .5em; - -moz-border-radius: .5em; - box-shadow: 2px 2px 3px #999; - -webkit-box-shadow: 2px 2px 3px #999; - -moz-box-shadow: rgba(0, 0, 0, .15) 2px 2px 2px; - background-image: -webkit-gradient(linear, left top, left bottom, from(#eee), to(#000), color-stop(.3, #444)); - background-image: -moz-linear-gradient(center top, #eee 0, #444 40%, #000 110%) -} -div.classindex ul { - list-style: none; - padding-left: 0 -} -div.classindex span.ai { - display: inline-block -} -div.groupHeader { - margin-left: 16px; - margin-top: 12px; - font-weight: 700 -} -div.groupText { - margin-left: 16px; - font-style: italic -} -body { - background-color: #fff; - color: #000; - margin: 0 -} -div.contents { - margin-top: 10px; - margin-left: 12px; - margin-right: 8px -} -td.indexkey { - font-weight: 700; - white-space: nowrap; - vertical-align: top -} -td.indexkey, -td.indexvalue { - background-color: #ebeff6; - border: 1px solid #c4cfe5; - margin: 2px 0; - padding: 2px 10px -} -tr.memlist { - background-color: #eef1f7 -} -p.formulaDsp { - text-align: center -} -img.formulaInl { - vertical-align: middle -} -div.center { - text-align: center; - margin-top: 0; - margin-bottom: 0; - padding: 0 -} -div.center img { - border: 0 -} -address.footer { - text-align: right; - padding-right: 12px -} -img.footer { - border: 0; - vertical-align: middle -} -span.keyword { - color: green -} -span.keywordtype { - color: #604020 -} -span.keywordflow { - color: #e08000 -} -span.comment { - color: maroon -} -span.preprocessor { - color: #806020 -} -span.stringliteral { - color: #002080 -} -span.charliteral { - color: teal -} -span.vhdldigit { - color: #f0f -} -span.vhdlchar { - color: #000 -} -span.vhdlkeyword { - color: #700070 -} -span.vhdllogic { - color: red -} -blockquote { - background-color: #f7f8fb; - border-left: 2px solid #9cafd4; - margin: 0 24px 0 4px; - padding: 0 12px 0 16px -} -td.tiny { - font-size: 75% -} -.dirtab { - padding: 4px; - border-collapse: collapse; - border: 1px solid #a3b4d7 -} -th.dirtab { - background: #ebeff6; - font-weight: 700 -} -hr { - height: 0; - border: none -} -hr.footer { - height: 1px -} -table.memberdecls { - border-spacing: 0; - padding: 0 -} -.fieldtable tr, -.memberdecls td { - -webkit-transition-property: background-color, box-shadow; - -webkit-transition-duration: .5s; - -moz-transition-property: background-color, box-shadow; - -moz-transition-duration: .5s; - -ms-transition-property: background-color, box-shadow; - -ms-transition-duration: .5s; - -o-transition-property: background-color, box-shadow; - -o-transition-duration: .5s; - transition-property: background-color, box-shadow; - transition-duration: .5s -} -.fieldtable tr.glow, -.memberdecls td.glow { - background-color: cyan; - box-shadow: 0 0 15px cyan -} -.mdescLeft, -.mdescRight, -.memItemLeft, -.memItemRight, -.memTemplItemLeft, -.memTemplItemRight, -.memTemplParams { - border: none; - margin: 4px; - padding: 1px 0 0 8px -} -.mdescLeft, -.mdescRight { - padding: 0 8px 4px; - color: #555 -} -.memSeparator { - border-bottom: 1px solid #dee4f0; - line-height: 1px; - margin: 0; - padding: 0 -} -.memItemLeft, -.memTemplItemLeft { - white-space: nowrap -} -.memItemRight { - width: 100% -} -.memTemplParams { - color: #4665a2; - white-space: nowrap; - font-size: 80% -} -.memtitle { - padding: 8px; - border-top: 1px solid #a8b8d9; - border-left: 1px solid #a8b8d9; - border-right: 1px solid #a8b8d9; - border-top-right-radius: 4px; - border-top-left-radius: 4px; - margin-bottom: -1px; - background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAA4CAIAAACzAgW7AAAAYElEQVR4Ae3dSw6AIAxF0Za3WweG+IFC0W1r4sTCSBwYl3By07wugo7zguqOpBtSNlogVkkFsRJFkII1arOEbBTzmptpSZis3urnSjCM0RHRL477m5kdEXX48fPevzZzA0gYIN0BAPV5AAAAAElFTkSuQmCC); - background-repeat: repeat-x; - background-color: #e2e8f2; - line-height: 1.25; - font-weight: 300; - float: left -} -.permalink { - font-size: 65%; - display: inline-block; - vertical-align: middle -} -.memtemplate { - font-size: 80%; - color: #4665a2; - font-weight: 400; - margin-left: 9px -} -.memnav { - background-color: #ebeff6; - border: 1px solid #a3b4d7; - text-align: center; - margin: 2px; - margin-right: 15px; - padding: 2px -} -.memitem, -.mempage { - width: 100% -} -.memitem { - padding: 0; - margin-bottom: 10px; - margin-right: 5px; - -webkit-transition: box-shadow .5s linear; - transition: box-shadow .5s linear; - display: table!important -} -.memitem.glow { - box-shadow: 0 0 15px cyan -} -.memname { - font-weight: 400; - margin-left: 6px -} -.memname td { - vertical-align: bottom -} -.memproto, -dl.reflist dt { - border-top: 1px solid #a8b8d9; - border-left: 1px solid #a8b8d9; - border-right: 1px solid #a8b8d9; - padding: 6px 0; - color: #253555; - font-weight: 700; - text-shadow: 0 1px 1px hsla(0, 0%, 100%, .9); - background-color: #dfe5f1; - box-shadow: 5px 5px 5px rgba(0, 0, 0, .15); - border-top-right-radius: 4px; - -moz-box-shadow: rgba(0, 0, 0, .15) 5px 5px 5px; - -moz-border-radius-topright: 4px; - -webkit-box-shadow: 5px 5px 5px rgba(0, 0, 0, .15); - -webkit-border-top-right-radius: 4px -} -.overload { - font-family: courier new, courier, monospace; - font-size: 65% -} -.memdoc, -dl.reflist dd { - border-bottom: 1px solid #a8b8d9; - border-left: 1px solid #a8b8d9; - border-right: 1px solid #a8b8d9; - padding: 6px 10px 2px; - background-color: #fbfcfd; - border-top-width: 0; - background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAAGCAYAAAACEPQxAAAAJklEQVR4Ae3dMQ0AAAgDwU9IF2aE4V8NLT5+uOVNIGnLTejAgwcHD1MAvfyCPAUAAAAASUVORK5CYII=); - background-repeat: repeat-x; - background-color: #fff; - border-bottom-left-radius: 4px; - border-bottom-right-radius: 4px; - box-shadow: 5px 5px 5px rgba(0, 0, 0, .15); - -moz-border-radius-bottomleft: 4px; - -moz-border-radius-bottomright: 4px; - -moz-box-shadow: rgba(0, 0, 0, .15) 5px 5px 5px; - -webkit-border-bottom-left-radius: 4px; - -webkit-border-bottom-right-radius: 4px; - -webkit-box-shadow: 5px 5px 5px rgba(0, 0, 0, .15) -} -dl.reflist dt { - padding: 5px -} -dl.reflist dd { - margin: 0 0 10px; - padding: 5px -} -.paramkey { - text-align: right -} -.paramname, -.paramtype { - white-space: nowrap -} -.paramname { - color: #602020 -} -.paramname em { - font-style: normal -} -.paramname code { - line-height: 14px -} -.exception, -.params, -.retval, -.tparams { - margin-left: 0; - padding-left: 0 -} -.params .paramname, -.retval .paramname { - font-weight: 700; - vertical-align: top -} -.params .paramtype { - font-style: italic; - vertical-align: top -} -.params .paramdir { - font-family: courier new, courier, monospace; - vertical-align: top -} -table.mlabels { - border-spacing: 0 -} -td.mlabels-left { - width: 100%; - padding: 0 -} -td.mlabels-right { - vertical-align: bottom; - padding: 0; - white-space: nowrap -} -span.mlabels { - margin-left: 8px -} -span.mlabel { - background-color: #728dc1; - border-top: 1px solid #5373b4; - border-left: 1px solid #5373b4; - border-right: 1px solid #c4cfe5; - border-bottom: 1px solid #c4cfe5; - text-shadow: none; - color: #fff; - margin-right: 4px; - padding: 2px 3px; - border-radius: 3px; - font-size: 7pt; - white-space: nowrap; - vertical-align: middle -} -div.directory { - margin: 10px 0; - border-top: 1px solid #9cafd4; - border-bottom: 1px solid #9cafd4; - width: 100% -} -.directory table { - border-collapse: collapse -} -.directory td { - margin: 0; - padding: 0; - vertical-align: top -} -.directory td.entry { - white-space: nowrap; - padding-right: 6px; - padding-top: 3px -} -.directory td.entry a { - outline: none -} -.directory td.entry a img { - border: none -} -.directory td.desc { - width: 100%; - padding-left: 6px; - padding-right: 6px; - padding-top: 3px; - border-left: 1px solid rgba(0, 0, 0, .05) -} -.directory tr.even { - padding-left: 6px; - background-color: #f7f8fb -} -.directory img { - vertical-align: -30% -} -.directory .levels { - white-space: nowrap; - width: 100%; - text-align: right; - font-size: 9pt -} -.directory .levels span { - cursor: pointer; - padding-left: 2px; - padding-right: 2px; - color: #3d578c -} -.arrow { - color: #9cafd4; - -webkit-user-select: none; - -moz-user-select: none; - -ms-user-select: none; - user-select: none; - cursor: pointer; - font-size: 80%; - height: 22px -} -.arrow, -.icon { - display: inline-block; - width: 16px -} -.icon { - font-family: Arial, Helvetica; - font-weight: 700; - font-size: 12px; - height: 14px; - background-color: #728dc1; - color: #fff; - text-align: center; - border-radius: 4px; - margin-left: 2px; - margin-right: 2px -} -.icona { - width: 24px; - height: 22px; - display: inline-block -} -.iconfopen { - background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAWCAYAAADafVyIAAACHElEQVR4Ae1dP2/TUBD/OWmaNGmwHTuNEGlpk7aJWooAiZGBiQ/AwDdgYujU2ayd2PkOLEjsVSf0JBaQKoFUtV2CVKFEHlDaxDZ3z32JHTuhQzsgYb/Tnd+f+93v7p68akEQAMCtSQYAblP+fYA5AEiT044bfD/twfcDDD1fysaKga2GpQHAdWUqADuvWUXkc1nk5kKin7/+xJejc9kVAb0avdmMhgzJqxebqcBZx3EAICFHx78cdsyHudHYrpoLsIyC1Ea5AH1xHqViDl33Ag837bcAMCnaZJu+//At6Lp9UGbko9ZZezSZ0cJAffrm9PEy2/zUlxbx+uVOjEmCwceDY+fBuiWjrFWKsEmzbRtjsfQFmOW81Mad/Mg+6bh4/nQ5xiS1Bv0LT+ZWRSr1VbTMgucUI57XiJXv+3IdQGwkAPhQ/3JIAGFhGccbpQmym2RarnLokeNxAEmEBABvvBz4VFyOLHSqahAyCB1GQXgfB3YtBkyfGXDXjB1wClTESS8KXKVzZhftvTsMalZpVIPo+qRvXmNwxfy8+xv7u89iXZTCgKKkPA+GYf7VnLKT39MDmHmTow6nOY86jO75K8CPsx6A8eAsRQueZrM26U4AiI3ERaNLVX3cXhI7G7bYblqidd8UrVVTNJcN0azrYu2eTrYu2mum2GpUxPa6JR61quIJnWmvVsTK3fKnmQzI+RsAuCn5/0cDgJnyB7pKCEBUoHiUAAAAAElFTkSuQmCC) -} -.iconfclosed, -.iconfopen { - width: 24px; - height: 18px; - margin-bottom: 4px; - background-position: 0 -4px; - background-repeat: repeat-y; - vertical-align: top; - display: inline-block -} -.iconfclosed { - background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAWCAYAAADafVyIAAACL0lEQVR4Ae1dTU/UQBh+2vp12JBscF32A78jm8VdUFmQRUOIXDn5A7x50d9g1sT/4IH/wMl48+IBokMgJhA9cdDEEI0HowGXdlrnnXa2M22BkNiDh3aeTPtO533e933enb1aQRAAQG6wASBP5E5wCgCSePP+S7Dx8RuAeNxqlLA4c9ECgJMgk4Ccj18bHrxbwu3mp+9EAAAngpUUeXllK/i8+ws3IwJyTp9s7/wIayoMvjDQrF9kq18o4PHDlrHg9Ho9APF49Xan92ipiXq5gJrYUC0V5PPkjZLMqnX9vCQfu1xE40oRY5dCNK8O493WLhY6o8+PLdHP330ZtYpMRe26/iAjl/vhuh/AE89nTjsAkEKKgDbv/fHkrJyF9kCS0OXxcCYbmWg+cDkApJCZAUVFzqyozsqRIqB1pZ1uB4AkUiI/e7kWPJgeheuFJVBOdOIkiRTftrH64StePOkaIqcyoI2qRHGUcbRcrKvSmQRhlgCMkalB/4APItS1oJnqn+hQo30BGCNF4Hoce/suOGkg7nCz6ihBRHdEpgdFBDzqrGNFphYkDUhkysQWDJSNLjrZDEeOLQMAYIxMgv2+J6KJxDykQxxJqr072cdUWmSxaX07Puj034J61ztL16c4dBYADKSOCnEclBY6dXb/dpXdm6yy2XZF4m57hE23RlhnvMxmWhXWnaiwuYkqmxPfzN+psfmpOptqlllx6NzrIzMQ589TAPhX+P//0XIn+AvU+Rz5ggypoQAAAABJRU5ErkJggg==) -} -.icondoc { - width: 24px; - height: 18px; - margin-bottom: 4px; - background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAWCAYAAADafVyIAAACsUlEQVR4Ae2dTU9TWxiFn55z+mE/LVhaKFAVRBI0gh8gQQZXYnVgYgwJNzd35EhGxhlDy9SBf8L/4C9gdm+EARGIQVAD8nGLUKBAC6373QUT6Dk4MAzu4KQru6fdedde71rvOVNXuVwGODMYAGeJMyewAE7iw6dsubhfYq9woO/l+8ZWgdzWHqGAB5/XIqzWhliAZF3QBeAEM5PJABzDxMx/mXiNn6DfTeCcWxc851NQa3Zjl2jIJ4WZmF7FbRmZaNg3CmAH2xaZpgvDqMDlcuFxmwQVkZy+IRZkYWVLn/7G1Zg6zCqzX9cdk+LogWkaP0kElmUQUCpCATefv+X0HiG53RFncjbLcjZvS2Lrgf7j8PRySZTLVIj8qoyoePP2PZv5oiaJKGUr3/PEa/0Ax2DrwdxiLpO4ENAFV9d3MKWwatF6TpmsfKlXReO1AaJhrzZb9liGQWvT+SovnBWoFomAyY9ZraD/VpJ/p5Z1smrCPjFXCioVBb1/t7APUAVHD456/6gvRWd7DJ/H4mFvisGBVvo6G+i/maQxESQS9FKnElcslgCq4KhAiss1Nr7A1NwaLY0Rvixt6rjOL+bouZYgEvJyNRWlVCpTKFZmBjj2OXWSDdWjB3eb+fNhGwM9zTx70qFVjA73cq8ryeVkRM9GJOgBsIWjAum/YHr+u8769k6RtdyuHjBRM6N+X17L8+KvTj2IAHZwVOCxTJ2eVH2I7mtxhtJtPB+8ztM/Wmi/WKPvX/7dpVspgwlgB2fqw2EbG1/UKuTUMmAnPZD1tEb/MkXiwVD6Cve7m2w9kDiLVwB2sCWQVEhxyb88IqTvRw++xnhIeyPG1qth1ErV3gOHF5dti4Sg5/EIS3P/4PFWigDYobC3TeLSHV6NDANUwZYg3Ztypd+9Bvht/P9fmT8AqlfEsPcjdQ8AAAAASUVORK5CYII=); - background-position: 0 -4px; - background-repeat: repeat-y; - vertical-align: top; - display: inline-block -} -table.directory { - font: 400 14px "Contax Pro", sans-serif -} -div.dynheader { - margin-top: 8px; - -webkit-touch-callout: none; - -webkit-user-select: none; - -moz-user-select: none; - -ms-user-select: none; - user-select: none -} -address { - font-style: normal; - color: #2a3d61 -} -table.doxtable caption { - caption-side: top -} -table.doxtable { - border-collapse: collapse; - margin-top: 4px; - margin-bottom: 4px -} -table.doxtable td, -table.doxtable th { - border: 1px solid #2d4068; - padding: 3px 7px 2px -} -table.doxtable th { - background-color: #374f7f; - color: #fff; - font-size: 110%; - padding-bottom: 4px; - padding-top: 5px -} -table.fieldtable { - margin-bottom: 10px; - border: 1px solid #a8b8d9; - border-spacing: 0; - border-radius: 4px; - box-shadow: 2px 2px 2px rgba(0, 0, 0, .15) -} -.fieldtable td, -.fieldtable th { - padding: 3px 7px 2px -} -.fieldtable td.fieldname, -.fieldtable td.fieldtype { - white-space: nowrap; - border-right: 1px solid #a8b8d9; - border-bottom: 1px solid #a8b8d9; - vertical-align: top -} -.fieldtable td.fieldname { - padding-top: 3px -} -.fieldtable td.fielddoc { - border-bottom: 1px solid #a8b8d9 -} -.fieldtable td.fielddoc p:first-child { - margin-top: 0 -} -.fieldtable td.fielddoc p:last-child { - margin-bottom: 2px -} -.fieldtable tr:last-child td { - border-bottom: none -} -.fieldtable th { - background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAA4CAIAAACzAgW7AAAAYElEQVR4Ae3dSw6AIAxF0Za3WweG+IFC0W1r4sTCSBwYl3By07wugo7zguqOpBtSNlogVkkFsRJFkII1arOEbBTzmptpSZis3urnSjCM0RHRL477m5kdEXX48fPevzZzA0gYIN0BAPV5AAAAAElFTkSuQmCC); - background-repeat: repeat-x; - background-color: #e2e8f2; - font-size: 90%; - color: #253555; - padding-bottom: 4px; - padding-top: 5px; - text-align: left; - font-weight: 400; - -moz-border-radius-topleft: 4px; - -moz-border-radius-topright: 4px; - -webkit-border-top-left-radius: 4px; - -webkit-border-top-right-radius: 4px; - border-top-left-radius: 4px; - border-top-right-radius: 4px; - border-bottom: 1px solid #a8b8d9 -} -.tabsearch { - top: 0; - left: 10px; - height: 36px; - background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAAkCAIAAADHFsdbAAAAcElEQVR4Ae3dTQ6DIBRF4ce70NS4uA51YOLAtFYw0B+gxn06dAddRMGykHO/5K6Ctv3LdaX4fJJ4+RXuvcA+/xkXMbsPJhugbcQ4B9xT2dF43EzAVfscExGa3rIQxGkORZaK5U9zhKKSGYFueODS6h/TSxpOsn4UagAAAABJRU5ErkJggg==); - z-index: 101; - overflow: hidden; - font-size: 13px -} -.navpath ul { - font-size: 11px; - background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAAkCAIAAADHFsdbAAAAcElEQVR4Ae3dTQ6DIBRF4ce70NS4uA51YOLAtFYw0B+gxn06dAddRMGykHO/5K6Ctv3LdaX4fJJ4+RXuvcA+/xkXMbsPJhugbcQ4B9xT2dF43EzAVfscExGa3rIQxGkORZaK5U9zhKKSGYFueODS6h/TSxpOsn4UagAAAABJRU5ErkJggg==); - background-repeat: repeat-x; - background-position: 0 -5px; - height: 30px; - line-height: 30px; - color: #8aa0cc; - border: 1px solid #c2cde4; - overflow: hidden; - margin: 0; - padding: 0 -} -.navpath li { - list-style-type: none; - float: left; - padding-left: 10px; - padding-right: 15px; - background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAgAAAAeCAYAAAARgF8NAAACa0lEQVR4Ae2dy2sTURTGz525ycykSSaTpg9tmiYxNTYqbsSFlAbcuJBSLDQLK0i1KFUbrWKUqhQxgoqIj0oXLrooRbdtEd+P+mjrSm1LUydDmyiC6OTRhaQIEu8MJuTW/guH73LO5fzuvZwzZ/Yoevf90iZfORDzfZLVnwBAiW3adSBgEgzYaGDx99SvCQCghPoGJrfxHB7x19l+k72X3PKHAs7d0Q9NNLgliTOypz/K6mgpgP/5gR+ZXMRZaT5KYgpAZ/vfad6IEPqy0WtnGQYFp+PqXBHova0DmkWdVeaddis/RYDuInDm1ttCXINZJhbw2PMkdk0r6pIORG68KX3y/jqnWG/iDYMzitqvAyevvy4FgmbBMOx1ijnyTP1qgGYfNrglqwEzR2aU1CPUc20cACgdLBf5w2sqypKzSqoFha+8AgBKAsuib+QWhpS8FXVffgkAsHJdJSUHbRZuHHVdeg4AsHI1W83GsKva8pUBAFhltZKGSfk8yOjQxWcAQEnU2t7gteszgjovPAUASsccktBRKQnxuYV0G9rf9wQAKE37XDYz6UNnbCH9Au07/7g02Wji8T33WusyOa13kt3StLcUiFY7ykwYM4NqJjept7q992EhSYYBKevrJC32xxbT+gCzmxuLN3RJVr5W4PHU/GJmqDgPociDQjzvq7VpbW7/nMgUh4QNbN+j+R0Ch9tEC5cjyQg1k60nxjQ/7Kyy+E0CHpITmZsUsLtnrIJ8NcXnErW9R05k0xTQcnz0lMMmhOwiNysnsx0AQAk1h0finhqRxxiF4smsXjv145CWLjMI0nIi/V9Ss7/CQLJvSb7lJAAAAABJRU5ErkJggg==); - background-repeat: no-repeat; - background-position: 100%; - color: #364d7c -} -.navpath li.navelem a { - height: 32px; - display: block; - outline: none; - color: #283a5d; - font-family: Lucida Grande, Geneva, Helvetica, Arial, sans-serif; - text-shadow: 0 1px 1px hsla(0, 0%, 100%, .9); - text-decoration: none -} -.navpath li.navelem a:hover { - color: #6884bd -} -.navpath li.footer { - list-style-type: none; - float: right; - padding-left: 10px; - padding-right: 15px; - background-image: none; - background-repeat: no-repeat; - background-position: 100%; - color: #364d7c; - font-size: 8pt -} -div.summary { - float: right; - font-size: 8pt; - padding-right: 5px; - width: 50%; - text-align: right -} -div.summary a, -table.classindex { - white-space: nowrap -} -table.classindex { - margin: 10px; - margin-left: 3%; - margin-right: 3%; - width: 94%; - border: 0; - border-spacing: 0; - padding: 0 -} -div.ingroups { - font-size: 8pt; - width: 50%; - text-align: left -} -div.ingroups a { - white-space: nowrap -} -div.header { - background-color: #f9fafc; - margin: 0; - border-bottom: 1px solid #c4cfe5 -} -div.headertitle { - padding: 5px 5px 5px 10px -} -dl { - padding: 0 0 0 10px -} -dl.section { - margin-left: 0; - padding-left: 0 -} -dl.note { - border-color: #d0c000 -} -dl.attention, -dl.note, -dl.warning { - margin-left: -7px; - padding-left: 3px; - border-left: 4px solid -} -dl.attention, -dl.warning { - border-color: red -} -dl.invariant, -dl.post, -dl.pre { - border-color: #00d000 -} -dl.deprecated, -dl.invariant, -dl.post, -dl.pre { - margin-left: -7px; - padding-left: 3px; - border-left: 4px solid -} -dl.deprecated { - border-color: #505050 -} -dl.todo { - border-color: #00c0e0 -} -dl.test, -dl.todo { - margin-left: -7px; - padding-left: 3px; - border-left: 4px solid -} -dl.test { - border-color: #3030e0 -} -dl.bug { - margin-left: -7px; - padding-left: 3px; - border-left: 4px solid; - border-color: #c08050 -} -dl.section dd { - margin-bottom: 6px -} -#projectlogo { - text-align: center; - vertical-align: bottom; - border-collapse: separate -} -#projectlogo img { - border: 0 none -} -#projectalign { - vertical-align: middle -} -#projectname { - font: 300% Tahoma, Arial, sans-serif; - margin: 0; - padding: 2px 0 -} -#projectbrief { - font: 120% Tahoma, Arial, sans-serif; - margin: 0; - padding: 0 -} -#projectnumber { - font: 50% Tahoma, Arial, sans-serif; - margin: 0; - padding: 0 -} -#titlearea { - padding: 0; - margin: 0; - width: 100%; - border-bottom: 1px solid #dcd9d9 -} -.diagraph, -.dotgraph, -.image, -.mscgraph { - text-align: center -} -.caption { - font-weight: 700 -} -div.zoom { - border: 1px solid #90a5ce -} -dl.citelist { - margin-bottom: 50px -} -dl.citelist dt { - color: #334975; - float: left; - font-weight: 700; - margin-right: 10px; - padding: 5px -} -dl.citelist dd { - margin: 2px 0; - padding: 5px 0 -} -div.toc { - padding: 14px 25px; - background-color: #f4f6fa; - border: 1px solid #d8dfee; - border-radius: 7px 7px 7px 7px; - float: right; - height: auto; - margin: 0 8px 10px 10px; - width: 200px -} -div.toc li { - background: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAcAAAAICAYAAAA1BOUGAAAAWklEQVR4Ae2dyw2AIBBEn1CWMfFsG55twAtysQFqsi5lDOiGRFvYyb7Zz9QAvLWm47TeAXzpf5mjNoBWmusztAfFBz9Mcycofaw+KwqeS/Mc96W/YxFoYBeCC17XGwSD3o1uAAAAAElFTkSuQmCC) no-repeat scroll 0 5px transparent; - font: 10px/1.2 Verdana, DejaVu Sans, Geneva, sans-serif; - margin-top: 5px; - padding-left: 10px; - padding-top: 2px -} -div.toc h3 { - font: 700 12px/1.2 Arial, FreeSans, sans-serif; - color: #4665a2; - border-bottom: 0 none; - margin: 0 -} -div.toc ul { - list-style: none outside none; - border: medium none; - padding: 0 -} -div.toc li.level1 { - margin-left: 0 -} -div.toc li.level2 { - margin-left: 15px -} -div.toc li.level3 { - margin-left: 30px -} -div.toc li.level4 { - margin-left: 45px -} -.inherit_header { - font-weight: 700; - color: gray; - cursor: pointer; - -webkit-touch-callout: none; - -webkit-user-select: none; - -moz-user-select: none; - -ms-user-select: none; - user-select: none -} -.inherit_header td { - padding: 6px 0 2px 5px -} -.inherit { - display: none -} -tr.heading h2 { - margin-top: 12px; - margin-bottom: 4px -} -#powerTip, -.ttc { - position: absolute; - display: none -} -#powerTip { - cursor: default; - white-space: nowrap; - background-color: #fff; - border: 1px solid gray; - border-radius: 4px 4px 4px 4px; - box-shadow: 1px 1px 7px gray; - font-size: smaller; - max-width: 80%; - opacity: .9; - padding: 1ex 1em 1em; - z-index: 2147483647 -} -#powerTip div.ttdoc { - color: grey; - font-style: italic -} -#powerTip div.ttname, -#powerTip div.ttname a { - font-weight: 700 -} -#powerTip div.ttdeci { - color: #006318 -} -#powerTip div { - margin: 0; - padding: 0; - font: 12px/16px "Contax Pro", sans-serif -} -#powerTip:after, -#powerTip:before { - content: ""; - position: absolute; - margin: 0 -} -#powerTip.e:after, -#powerTip.e:before, -#powerTip.n:after, -#powerTip.n:before, -#powerTip.ne:after, -#powerTip.ne:before, -#powerTip.nw:after, -#powerTip.nw:before, -#powerTip.s:after, -#powerTip.s:before, -#powerTip.se:after, -#powerTip.se:before, -#powerTip.sw:after, -#powerTip.sw:before, -#powerTip.w:after, -#powerTip.w:before { - border: solid transparent; - content: " "; - height: 0; - width: 0; - position: absolute -} -#powerTip.e:after, -#powerTip.n:after, -#powerTip.ne:after, -#powerTip.nw:after, -#powerTip.s:after, -#powerTip.se:after, -#powerTip.sw:after, -#powerTip.w:after { - border-color: hsla(0, 0%, 100%, 0) -} -#powerTip.e:before, -#powerTip.n:before, -#powerTip.ne:before, -#powerTip.nw:before, -#powerTip.s:before, -#powerTip.se:before, -#powerTip.sw:before, -#powerTip.w:before { - border-color: hsla(0, 0%, 50%, 0) -} -#powerTip.n:after, -#powerTip.n:before, -#powerTip.ne:after, -#powerTip.ne:before, -#powerTip.nw:after, -#powerTip.nw:before { - top: 100% -} -#powerTip.n:after, -#powerTip.ne:after, -#powerTip.nw:after { - border-top-color: #fff; - border-width: 10px; - margin: 0 -10px -} -#powerTip.n:before { - border-top-color: gray; - border-width: 11px; - margin: 0 -11px -} -#powerTip.n:after, -#powerTip.n:before { - left: 50% -} -#powerTip.nw:after, -#powerTip.nw:before { - right: 14px -} -#powerTip.ne:after, -#powerTip.ne:before { - left: 14px -} -#powerTip.s:after, -#powerTip.s:before, -#powerTip.se:after, -#powerTip.se:before, -#powerTip.sw:after, -#powerTip.sw:before { - bottom: 100% -} -#powerTip.s:after, -#powerTip.se:after, -#powerTip.sw:after { - border-bottom-color: #fff; - border-width: 10px; - margin: 0 -10px -} -#powerTip.s:before, -#powerTip.se:before, -#powerTip.sw:before { - border-bottom-color: gray; - border-width: 11px; - margin: 0 -11px -} -#powerTip.s:after, -#powerTip.s:before { - left: 50% -} -#powerTip.sw:after, -#powerTip.sw:before { - right: 14px -} -#powerTip.se:after, -#powerTip.se:before { - left: 14px -} -#powerTip.e:after, -#powerTip.e:before { - left: 100% -} -#powerTip.e:after { - border-left-color: #fff; - border-width: 10px; - top: 50%; - margin-top: -10px -} -#powerTip.e:before { - border-left-color: gray; - border-width: 11px; - top: 50%; - margin-top: -11px -} -#powerTip.w:after, -#powerTip.w:before { - right: 100% -} -#powerTip.w:after { - border-right-color: #fff; - border-width: 10px; - top: 50%; - margin-top: -10px -} -#powerTip.w:before { - border-right-color: gray; - border-width: 11px; - top: 50%; - margin-top: -11px -} -@media print { - #nav-path, - #side-nav, - #top { - display: none - } - body { - overflow: visible - } - h1, - h2, - h3, - h4, - h5, - h6 { - page-break-after: avoid - } - .summary { - display: none - } - .memitem { - page-break-inside: avoid - } - #doc-content { - margin-left: 0!important; - height: auto!important; - width: auto!important; - overflow: inherit; - display: inline - } -} -body, -input { - font-family: Open Sans, Helvetica, sans-serif; - color: #323d47; - background: #fbfbfb -} -a { - color: #4665a2 -} -#projectname, -.title, -h1, -h2 { - font-family: Contax Pro, HelveticaNeue, Helvetica Neue, HelveticaNeueRoman, HelveticaNeue-Roman, Helvetica Neue Roman, Helvetica, Tahoma, Geneva, Arial, sans-serif; - font-weight: 900; -} -#projectname, -.title { - font-size: 32px -} -h1 { - font-size: 24px; -} -h2 { - font-size: 20px; -} -hr { - border-top: 1px solid #f59cad -} -#projectname { - padding-left: 20px -} -#MSearchField { - padding: 0 0 0 .5em; - font-size: 1em -} -#MSearchSelectWindow { - border: 1px solid #f59cad -} -a.SelectItem:hover { - background: #fbfbfb; - color: #000 -} -#MSearchResultsWindow { - background: #fbfbfb; - border-radius: 3px -} -#nav-tree { - padding-left: 20px -} -#nav-tree .selected { - font-weight: 700 -} -.arrow { - color: #d1d3d3 -} -.item:hover>a>.arrow { - color: #aaaeae -} -.ui-resizable-e { - border-style: solid; - border-width: 0 1px; - border-color: #dcd9d9 -} -.ui-resizable-e:before { - content: ''; - display: block; - position: absolute; - top: 50%; - margin-top: -8px; - width: 3px; - height: 3px; - border-style: double; - border-width: 6px 0; - border-color: #fbfbfb; - margin-left: 2px -} -div.header { - background: #fbfbfb; - border: 0 -} -h2.groupheader { - color: #000; - border-bottom: 1px solid #f59cad -} -.memSeparator { - border-bottom: 1px solid #f8ccd4 -} -/*# sourceMappingURL=doxygen.css.map*/ - -div.image img[src="BlocksMonitor.png"] { - width: 750px; -} -div.image img[src="BlocksDrawing_palette.JPG"] { - width: 320px; -} -div.image img[src="BlocksDrawing_canvas.JPG"] { - width: 320px; -} -div.image img[src="BlocksSynth_grid.JPG"] { - width: 320px; -} -div.image img[src="BlocksSynth_waveshape.gif"] { - width: 320px; -} -div.image img[src="blocks_code_interface.png"] { - width: 750px; -} -div.image img[src="blocks_code_tabs.png"] { - width: 320px; -}