/* ============================================================================== 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&); /** 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& 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& fills, uint32 byteOffset); juce::String getLittleFootProgram() override; uint32 getHeapSize() override; };