/// <summary>
        /// Add an effect to the launchpad
        /// </summary>
        /// <param name="effect"></param>
        /// <param name="updateFrequency"></param>
        public void RegisterEffect(ILaunchpadEffect effect, TimeSpan updateFrequency)
        {
            try
            {
                // Register any observables being used
                CompositeDisposable effectDisposables = new CompositeDisposable();

                // If this effect needs the ability to change its frequency
                if (effect.WhenChangeUpdateFrequency != null)
                {
                    // Subscribe to the event to change the frequency and add it to this effects disposables
                    effectDisposables.Add(
                        effect
                        .WhenChangeUpdateFrequency
                        .Subscribe(newFrequency =>
                    {
                        // Change the frequency for this effect
                        OnChangeEffectUpdateFrequency(effect, newFrequency);
                    }));
                }

                // If this effect will notify us it needs to be unregistered
                if (effect.WhenComplete != null)
                {
                    effectDisposables.Add(
                        effect
                        .WhenComplete
                        .Subscribe(_ =>
                    {
                        // Unregister the effect and destroy its disposables
                        UnregisterEffect(effect);
                    }));
                }

                EffectsDisposables.Add(effect, effectDisposables);

                // Create an update timer at the specified frequency
                EffectsTimers.Add(effect, new Timer(state => effect.Update(), null, 0, (int)updateFrequency.TotalMilliseconds));

                // Initiate the effect (provide all buttons and button changed event
                effect.Initiate(this);
            }
            catch (Exception ex)
            {
                Debug.WriteLine(ex);
            }
        }
        public override void UnregisterEffect(ILaunchpadEffect effect)
        {
            try
            {
                EffectsDisposables[effect].Dispose();
                EffectsDisposables.Remove(effect);
            }
            catch { }

            try
            {
                EffectsTimers[effect].Dispose();
                EffectsTimers.Remove(effect);
            }
            catch { }
            effect.Dispose();
        }
        /// <summary>
        /// Removes an effect from the launchpad
        /// </summary>
        /// <param name="effect">The effect to remove.</param>
        public override void UnregisterEffect(ILaunchpadEffect effect)
        {
            try
            {
                // Dispose of the update timer for the effect
                effectsTimers[effect]?.Dispose();

                // Dispose of the OnComplete subscription
                effectsDisposables[effect]?.Dispose();

                // Remove the effect from the launchpad
                Effects.Remove(effect);
            }
            catch (Exception ex)
            {
                Debug.WriteLine(ex);
            }
        }
 public void RegisterEffect(ILaunchpadEffect effect, int updateFrequency)
 {
     RegisterEffect(effect, TimeSpan.FromMilliseconds(updateFrequency));
 }
 void OnChangeEffectUpdateFrequency(ILaunchpadEffect effect, int newFrequency)
 {
     EffectsTimers[effect].Change(0, newFrequency);
 }
 public abstract void UnregisterEffect(ILaunchpadEffect effect);