/// <summary>
 /// Creates the objects that represent the grid buttons
 /// </summary>
 void CreateGridButtons()
 {
     for (var y = 0; y < 8; y++)
     {
         for (var x = 0; x < 8; x++)
         {
             Grid[x, y] = new LaunchpadMk2Button(0, x, y, Colors.Black, outPort);
         }
     }
 }
        public LaunchpadMk2(string name, MidiInPort inPort = null, IMidiOutPort outPort = null)
        {
            Name         = name;
            this.inPort  = inPort;
            this.outPort = outPort;
            gridButtons  = new List <LaunchpadMk2Button>();
            resetCount   = 0;
            sideButtons  = new List <LaunchpadMk2Button>();
            topButtons   = new List <LaunchpadMk2TopButton>();
            Grid         = new LaunchpadMk2Button[8, 8];
            GridBuffer   = new Color[8, 8];

            BuildButtons();

            // Process resets triggered from launchpad
            resetTimer = new Timer((state) => {
                // If the user is pressing the 4 corner grid buttons
                if (Grid[0, 0].State == LaunchpadButtonState.Pressed &&
                    Grid[0, 7].State == LaunchpadButtonState.Pressed &&
                    Grid[7, 7].State == LaunchpadButtonState.Pressed &&
                    Grid[7, 0].State == LaunchpadButtonState.Pressed)
                {
                    Debug.WriteLine("Reset in " + (10 - resetCount).ToString() + " seconds.");

                    // Increase the reset count
                    resetCount++;

                    // If the user has held the buttons for 10 seconds
                    if (resetCount > 10)
                    {
                        Debug.WriteLine("Launchpad was reset.");

                        // Reset the count
                        resetCount = 0;

                        // Notify anyone interested in the event
                        whenReset.OnNext(Unit.Default);
                    }
                }
                else // If the user is not pressing the 4 corner buttons
                {
                    // Reset the count
                    resetCount = 0;
                }
            }, null, 0, 1000);

            // Flag as simulated mode if no connection provided
            IsSimulated = inPort == null || outPort == null;

            if (!IsSimulated)
            {
                // Process messages from device
                inPort.MessageReceived += InPort_MessageReceived;
            }
        }
        /// <summary>
        /// Binds the Launchpad Ui control to the values of a LaunchpadMk2 model
        /// </summary>
        void UpdateButtons()
        {
            // Bind to all the top buttons
            if (LaunchpadMk2?.TopButtons != null)
            {
                Top104 = LaunchpadMk2.TopButtons[0];
                Top105 = LaunchpadMk2.TopButtons[1];
                Top106 = LaunchpadMk2.TopButtons[2];
                Top107 = LaunchpadMk2.TopButtons[3];
                Top108 = LaunchpadMk2.TopButtons[4];
                Top109 = LaunchpadMk2.TopButtons[5];
                Top110 = LaunchpadMk2.TopButtons[6];
                Top111 = LaunchpadMk2.TopButtons[7];
            }

            // Bind to the grid buttons
            if (LaunchpadMk2?.Grid != null)
            {
                Grid00 = LaunchpadMk2.Grid[0, 0];
                Grid10 = LaunchpadMk2.Grid[1, 0];
                Grid20 = LaunchpadMk2.Grid[2, 0];
                Grid30 = LaunchpadMk2.Grid[3, 0];
                Grid40 = LaunchpadMk2.Grid[4, 0];
                Grid50 = LaunchpadMk2.Grid[5, 0];
                Grid60 = LaunchpadMk2.Grid[6, 0];
                Grid70 = LaunchpadMk2.Grid[7, 0];
                Grid01 = LaunchpadMk2.Grid[0, 1];
                Grid11 = LaunchpadMk2.Grid[1, 1];
                Grid21 = LaunchpadMk2.Grid[2, 1];
                Grid31 = LaunchpadMk2.Grid[3, 1];
                Grid41 = LaunchpadMk2.Grid[4, 1];
                Grid51 = LaunchpadMk2.Grid[5, 1];
                Grid61 = LaunchpadMk2.Grid[6, 1];
                Grid71 = LaunchpadMk2.Grid[7, 1];
                Grid02 = LaunchpadMk2.Grid[0, 2];
                Grid12 = LaunchpadMk2.Grid[1, 2];
                Grid22 = LaunchpadMk2.Grid[2, 2];
                Grid32 = LaunchpadMk2.Grid[3, 2];
                Grid42 = LaunchpadMk2.Grid[4, 2];
                Grid52 = LaunchpadMk2.Grid[5, 2];
                Grid62 = LaunchpadMk2.Grid[6, 2];
                Grid72 = LaunchpadMk2.Grid[7, 2];
                Grid03 = LaunchpadMk2.Grid[0, 3];
                Grid13 = LaunchpadMk2.Grid[1, 3];
                Grid23 = LaunchpadMk2.Grid[2, 3];
                Grid33 = LaunchpadMk2.Grid[3, 3];
                Grid43 = LaunchpadMk2.Grid[4, 3];
                Grid53 = LaunchpadMk2.Grid[5, 3];
                Grid63 = LaunchpadMk2.Grid[6, 3];
                Grid73 = LaunchpadMk2.Grid[7, 3];
                Grid04 = LaunchpadMk2.Grid[0, 4];
                Grid14 = LaunchpadMk2.Grid[1, 4];
                Grid24 = LaunchpadMk2.Grid[2, 4];
                Grid34 = LaunchpadMk2.Grid[3, 4];
                Grid44 = LaunchpadMk2.Grid[4, 4];
                Grid54 = LaunchpadMk2.Grid[5, 4];
                Grid64 = LaunchpadMk2.Grid[6, 4];
                Grid74 = LaunchpadMk2.Grid[7, 4];
                Grid05 = LaunchpadMk2.Grid[0, 5];
                Grid15 = LaunchpadMk2.Grid[1, 5];
                Grid25 = LaunchpadMk2.Grid[2, 5];
                Grid35 = LaunchpadMk2.Grid[3, 5];
                Grid45 = LaunchpadMk2.Grid[4, 5];
                Grid55 = LaunchpadMk2.Grid[5, 5];
                Grid65 = LaunchpadMk2.Grid[6, 5];
                Grid75 = LaunchpadMk2.Grid[7, 5];
                Grid06 = LaunchpadMk2.Grid[0, 6];
                Grid16 = LaunchpadMk2.Grid[1, 6];
                Grid26 = LaunchpadMk2.Grid[2, 6];
                Grid36 = LaunchpadMk2.Grid[3, 6];
                Grid46 = LaunchpadMk2.Grid[4, 6];
                Grid56 = LaunchpadMk2.Grid[5, 6];
                Grid66 = LaunchpadMk2.Grid[6, 6];
                Grid76 = LaunchpadMk2.Grid[7, 6];
                Grid07 = LaunchpadMk2.Grid[0, 7];
                Grid17 = LaunchpadMk2.Grid[1, 7];
                Grid27 = LaunchpadMk2.Grid[2, 7];
                Grid37 = LaunchpadMk2.Grid[3, 7];
                Grid47 = LaunchpadMk2.Grid[4, 7];
                Grid57 = LaunchpadMk2.Grid[5, 7];
                Grid67 = LaunchpadMk2.Grid[6, 7];
                Grid77 = LaunchpadMk2.Grid[7, 7];
            }

            // Bind to all the side buttons
            if (LaunchpadMk2?.SideButtons != null)
            {
                Side70 = LaunchpadMk2.SideButtons[0];
                Side71 = LaunchpadMk2.SideButtons[1];
                Side72 = LaunchpadMk2.SideButtons[2];
                Side73 = LaunchpadMk2.SideButtons[3];
                Side74 = LaunchpadMk2.SideButtons[4];
                Side75 = LaunchpadMk2.SideButtons[5];
                Side76 = LaunchpadMk2.SideButtons[6];
                Side77 = LaunchpadMk2.SideButtons[7];
            }

            Bindings.Update();
        }