C # Установите длительность и воспроизводите звуки, сохраненные в массиве последовательно - PullRequest
1 голос
/ 27 декабря 2011

У меня есть следующий метод Play для воспроизведения музыкальных нот, хранящихся в массиве:

public void Play(Duration d){


            int duration = 1;

            if (d == Duration.SemiBreve)
            {
                duration = 16;
            }

            else if (d == Duration.DotMin)
            {
                duration = 10;
            }

            else if (d == Duration.minim)
            {
                duration = 8;
            }

            else if (d == Duration.Crotchet)
            {
                duration = 4;
            }

            else if (d == Duration.Quaver)
            {
                duration = 2;
            }

            else if (d == Duration.SemiQuaver)
            {
                duration = 1;
            }

            player = new SoundPlayer();

            player.SoundLocation = "pathToLocation";


            //set timer
            time = new Timer();
            time.Tick += new EventHandler(clockTick);
            time.Interval = duration * 150;
            player.Play();
            time.Start();

        }

Когда я вызываю метод с помощью кнопки:

private void PlayButton_Click(object sender, EventArgs e)

{

        //Loops through the collection and plays each note one after the other
        foreach (MusicNote music in this.staff.Notes)
        {
            music.Play(music.Dur)

        }
    }

Получается только последняя нотаиграл.С PlaySync () все ноты воспроизводятся, но продолжительность не распознается.Я также пытался использовать темы вроде:

foreach (MusicNote music in this.staff.Notes)
            {
                Thread t = new Thread(playMethod=>music.Play(music.Dur));  
                t.Start();
                t.Join();

            }

Но это тоже не работает.Какие-нибудь предложения относительно того, как я могу заставить файлы воспроизводить последовательно, как с PlaySync, но используя их установленную продолжительность?

1 Ответ

3 голосов
/ 27 декабря 2011

Вы нигде не ждете таймера.Таким образом, на практике все ноты воспроизводятся почти одновременно, в результате чего эффективно воспроизводится только последняя.


ОБНОВЛЕНИЕ: использование класса System.Timers.Timer позволяет зарегистрировать обработчик для Elapsedсобытие и проигрывание нот по одному в обработчике события.Таким образом вы избегаете зависания интерфейса.

Другой вариант - проигрывание в фоновом потоке и использование Thread.Sleep для ожидания.Здесь вам нужно будет убедиться, что поток остановлен в соответствии с состоянием пользовательского интерфейса (т. Е. Использование закрывает текущий диалог и т.staff.Notes или сделайте его копию для воспроизведения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...