2016-11-30 8 views
2

Я играю с некоторыми C#, и я кодировал приложение для фортепиано.Перемещение списка C#

Всякий раз, когда пользователь нажимает на пианино, я сохраняю местоположение звука (.wav) в списке ... следующий код - в методе button1_MouseDown.

if (e.Button == MouseButtons.Left) 
    { 
     SoundPlayer sp = new SoundPlayer(); 
     string musName = Convert.ToString(mk.pitch); 
     string loc = @"D:\OneDrive\Year 2 Semester 1\OOP\Notes-Sound files\Notes-Sound files\mapped\" + musName + ".wav"; 
     sp.SoundLocation = loc; 
     sp.Play(); 
     music.Add(loc); 
    } 

Теперь я хочу пройти цикл, чтобы играть все нажатые клавиши за один раз. Я делаю это следующим образом (когда пользователь нажимает на кнопку воспроизведения)

int k = 0; 
for (k = 1; k < music.Count; k++) 
{ 
    SoundPlayer sp = new SoundPlayer(); 
    sp.SoundLocation = music[k]; 
    sp.Play(); 
} 

Дело в том, что всякий раз, когда нажать кнопку воспроизведения только последняя нота нажата является played.However, когда я отладки, так или иначе, все ноты воспроизводятся. Есть идеи?

+0

Привет, Я думаю, что вы должны ждать, что каждая нота играется перед игрой следующего –

+0

Я также предполагаю, йо won't необходимости инициализировать новый игрок в каждой итерации, но вне цикла. – HimBromBeere

ответ

5

Согласно MSDN, это описание метода Play:

Воспроизведение файла .wav, используя новую нить, и загружает файл .wav первый, если она не была загружена.

Поэтому, когда вы вызываете Play, это работает асинхронно и ваш цикл продолжает выполняться воспроизведение следующего файла WAV, прежде чем текущий один завершен. Когда вы отлаживаете, вы, вероятно, ждёте, прежде чем продолжить цикл.

Вместо этого попробуйте использовать PlaySync для воспроизведения звука синхронно

PS. Кроме того, вы можете рассмотреть возможность использования экземпляров SoundPlayer в списке вместо имени файла, чтобы избежать создания новых экземпляров каждый раз, когда вы играете в файл WAV:

List<SoundPlayer> music = new List<SoundPlayer>(); 
//... 

//In your first loop, you would add the SoundPlayer object 
music.Add(sp); 

//.. 
//Then when you're playing back: 
for (int k = 0; k < music.Count; k++) 
{ 
    music[k].PlaySync(); 
} 

Обратите внимание, что индекс в цикле for должен начинаться 0, а также

+0

Это должен быть принятый ответ! +1 – nik0lias

+0

@KMoussa Где я могу разместить 'var music = new Список ();' – Axel

+0

@AxelAzzopardi вместо списка 'music'/массива' strings', который вы сейчас объявляете – KMoussa

0

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

Используйте PlaySync, который воспроизводит звуки синхронно, и если вам почему-то нужно пройти по экрану List<> и сказать, сделайте проверку каждого элемента перед игрой (ну, по крайней мере, если вы вывели SoundPlayer в другой класс, чтобы на самом деле есть вещи, чтобы проверить), вы можете использовать чек для вызова PlaySync.

SoundPlayer sp = new SoundPlayer(); 

foreach(var note in music) 
{ 
    sp.SoundLocation = note; 
    bool everythingIsFine = false; 

    // Logic for everythingIsFine; 

    if(everythingIsFine){ 
     sp.PlaySync(); 
    } 
} 

 Смежные вопросы

  • Нет связанных вопросов^_^