| 
							- /*
 -   ==============================================================================
 - 
 -    This file is part of the JUCE library.
 -    Copyright (c) 2016 - ROLI Ltd.
 - 
 -    Permission is granted to use this software under the terms of the ISC license
 -    http://www.isc.org/downloads/software-support-policy/isc-license/
 - 
 -    Permission to use, copy, modify, and/or distribute this software for any
 -    purpose with or without fee is hereby granted, provided that the above
 -    copyright notice and this permission notice appear in all copies.
 - 
 -    THE SOFTWARE IS PROVIDED "AS IS" AND ISC DISCLAIMS ALL WARRANTIES WITH REGARD
 -    TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND
 -    FITNESS. IN NO EVENT SHALL ISC BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT,
 -    OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF
 -    USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
 -    TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE
 -    OF THIS SOFTWARE.
 - 
 -    -----------------------------------------------------------------------------
 - 
 -    To release a closed-source product which uses other parts of JUCE not
 -    licensed under the ISC terms, commercial licenses are available: visit
 -    www.juce.com for more information.
 - 
 -   ==============================================================================
 - */
 - 
 - /**
 - */
 - struct DrumPadGridProgram  : public LEDGrid::Program
 - {
 -     DrumPadGridProgram (LEDGrid&);
 - 
 -     //==============================================================================
 -     /** These let the program dim pads which aren't having gestures performed on them. */
 - 
 -     void startTouch (float startX, float startY);
 -     void endTouch   (float startX, float startY);
 - 
 -     /** Creates trail effects similar to the onscreen pad trails. */
 -     void sendTouch (float x, float y, float z, LEDColour);
 - 
 -     //==============================================================================
 -     /** Call this to match animations to the project tempo.
 - 
 -         @param padIdx           The pad to update. 16 animated pads are supported, so 0 - 15.
 -         @param loopTimeSecs     The length of time for the pad's animation to loop in seconds. 0 will stop the animation.
 -         @param currentProgress  The starting progress of the animation. 0.0 - 1.0.
 -     */
 -     void setPadAnimationState (uint32 padIdx, double loopTimeSecs, double currentProgress);
 - 
 -     /** If the app needs to close down or suspend, use these to pause & dim animations. */
 -     void suspendAnimations();
 -     void resumeAnimations();
 - 
 -     //==============================================================================
 -     /** Set how each pad in the grid looks. */
 -     struct GridFill
 -     {
 -         enum FillType : uint8
 -         {
 -             gradient            = 0,
 -             filled              = 1,
 -             hollow              = 2,
 -             hollowPlus          = 3,
 - 
 -             // Animated pads
 -             dotPulsing          = 4,
 -             dotBlinking         = 5,
 -             pizzaFilled         = 6,
 -             pizzaHollow         = 7,
 -         };
 - 
 -         LEDColour colour;
 -         FillType fillType;
 -     };
 - 
 -     void setGridFills (int numColumns, int numRows,
 -                        const juce::Array<GridFill>&);
 - 
 -     /** Set up a new pad layout, with a slide animation from the old to the new. */
 -     enum SlideDirection : uint8
 -     {
 -         up     = 0,
 -         down   = 1,
 -         left   = 2,
 -         right  = 3,
 - 
 -         none   = 255
 -     };
 - 
 -     void triggerSlideTransition (int newNumColumns, int newNumRows,
 -                                  const juce::Array<GridFill>& newFills, SlideDirection);
 - 
 - private:
 -     //==============================================================================
 -     /** Shared data heap is laid out as below. There is room for two sets of
 -         pad layouts, colours and fill types to allow animation between two states. */
 - 
 -     static constexpr uint32 numColumns0_byte      = 0;    // 1 byte
 -     static constexpr uint32 numRows0_byte         = 1;    // 1 byte (ignored for the moment: always square pads to save cycles)
 -     static constexpr uint32 colours0_byte         = 2;    // 2 byte x 25  (5:6:5 bits for rgb)
 -     static constexpr uint32 fillTypes0_byte       = 52;   // 1 byte x 25
 - 
 -     static constexpr uint32 numColumns1_byte      = 78;   // 1 byte
 -     static constexpr uint32 numRows1_byte         = 79;   // 1 byte
 -     static constexpr uint32 colours1_byte         = 80;   // 2 byte x 25  (5:6:5 bits for rgb)
 -     static constexpr uint32 fillTypes1_byte       = 130;  // 1 byte x 25
 - 
 -     static constexpr uint32 visiblePads_byte      = 155;  // 1 byte       (i.e. which set of colours/fills to use, 0 or 1)
 -     static constexpr uint32 slideDirection_byte   = 156;  // 1 byte
 -     static constexpr uint32 touchedPads_byte      = 158;  // 1 byte x 4   (Zero means empty slot, so stores padIdx + 1)
 -     static constexpr uint32 animationTimers_byte  = 162;  // 4 byte x 16  (16:16 bits counter:increment)
 -     static constexpr uint32 heatMap_byte          = 226;  // 4 byte x 225
 -     static constexpr uint32 heatDecayMap_byte     = 1126; // 1 byte x 225
 - 
 -     static constexpr uint32 maxNumPads        = 25;
 -     static constexpr uint32 colourSizeBytes   = 2;
 -     static constexpr uint32 heatMapSize       = 15 * 15 * 4;
 -     static constexpr uint32 heatMapDecaySize  = 15 * 15;
 -     static constexpr uint32 totalDataSize     = heatDecayMap_byte + heatMapDecaySize;
 - 
 -     int getPadIndex (float posX, float posY) const;
 -     void setGridFills (int numColumns, int numRows, const juce::Array<GridFill>& fills, uint32 byteOffset);
 - 
 -     juce::String getLittleFootProgram() override;
 -     uint32 getHeapSize() override;
 - };
 
 
  |