Alasse
Alasse

Reputation: 361

Windows Store App Metronome

I am developing Windows Store Application. I need to implement a metronome. This metronome should have bpm settings. User should be able to increase/decrease it.

Here is my code so far:

namespace App1
{

    public sealed partial class MainPage : Page
    {
        public class TickArgs : EventArgs
        {
            public DateTime Time { get; set; }
        }


        public class Metronome
        {
            public event TickHandler Tick = (m, e) => { };
            public delegate void TickHandler(Metronome m, TickArgs e);
            public void Start()
            {
                while (true)
                {
                    System.Threading.Tasks.Task.Delay(3000);
                    Tick(this, new TickArgs { Time = DateTime.Now });
                }
            }
        }

        public class Listener
        {
            public void Subscribe(Metronome m, TextBlock tb, MediaElement mmx) 
            {
                m.Tick += (mm, e) => mmx.Play();
            }
        }


        public MainPage()
        {
            this.InitializeComponent();
        }


        protected override void OnNavigatedTo(NavigationEventArgs e)
        {
        }

        private void Button_Click(object sender, RoutedEventArgs e)
        {
            Metronome m = new Metronome();
            Listener l = new Listener();
            l.Subscribe(m, tbcheck, mediaElement1);
            m.Start();
        }
    }
}

How can i modify this code to have BPM settings?

My regards

Upvotes: 0

Views: 823

Answers (1)

sa_ddam213
sa_ddam213

Reputation: 43636

Instead of uisng Task.Delay it may be easier to just use a Timer

An you can just pass the BBM into the Start method and set the interval based on that

    public class Metronome
    {
        private DispatcherTimer _timer;
        public event TickHandler Tick;
        public delegate void TickHandler(Metronome m, TickArgs e);

        public Metronome()
        {
            _timer = new DispatcherTimer();
            _timer.Tick += Timer_Tick;
        }

        private void Timer_Tick(object sender, EventArgs e)
        {
            if (Tick != null)
            {
                Tick(this, new TickArgs { Time = DateTime.Now });
            }
        }

        public void Start(int bbm)
        {
            _timer.Stop();
            _timer.Interval = TimeSpan.FromSeconds(60 / bbm);
            _timer.Start();
        }
    }


    private void Button_Click(object sender, RoutedEventArgs e)
    {
        Metronome m = new Metronome();
        Listener l = new Listener();
        l.Subscribe(m, tbcheck, mediaElement1);
        m.Start(8); // 8bbm
    }

Upvotes: 1

Related Questions