Не работает "одновременный" запуск звуков C#
Мне нужно написать программу-эмулятор синтезатор, но во время написания кода я сколько не пыталлся что-то менять, хоть с нейронкой хоть без, оно не работает, а именно то что звуки на клавишах воспроизводятся либо "по очереди" либо прерывают друг-друга.
Результатом должно быть то что если я вопроивозводил звук одной, то он не прывался, когда нажму на вторую (проще говоря как на пианино). При надобности отправлю весь код, это не такая секретная разработка
private async void MainForm_KeyDown(object sender, KeyEventArgs e)
{
if (!_sounds.TryGetValue(e.KeyCode, out byte[] soundData))
return;
try
{
await Task.Run(() => WaveGenerator.PlayNote(e.KeyCode, soundData))
.ConfigureAwait(false); // Избегаем лишних возвратов в UI-поток
}
catch (ObjectDisposedException ex)
{
Debug.WriteLine($"Ошибка воспроизведения (объект уничтожен): {ex.Message}");
}
catch (Exception ex)
{
Debug.WriteLine($"Критическая ошибка воспроизведения: {ex.Message}");
}
}
/////////////
public static void PlayNote(Keys key, byte[] wavData)
{
// Останавливаем предыдущий звук этой клавиши, если он есть
if (_activePlayers.TryRemove(key, out var oldPlayer))
{
oldPlayer.Stop();
oldPlayer.Dispose();
}
// Запускаем новый звук в отдельном потоке
Task.Run(() =>
{
try
{
using (var stream = new MemoryStream(wavData))
using (var player = new SoundPlayer(stream))
{
// Не блокируем словарь, т.к. SoundPlayer не поддерживает нормальное управление
player.PlaySync(); // Блокирует только текущий Task
}
}
catch { /* Логирование ошибок */ }
});
}
Ну ты ж сам пишешь await, правильно? Вот он и ждет.
Запускай потоки и не жди их окончания.
Но я не уверен, что это сработает. Проигрывание нот - это не просто генерирование какой-то частоты. Там куча всяких гармоник, а проигрывание нескольких нот одновременно создает гармоники высших порядков. Аккорд - это вам не цицки-пецки. Поэтому эффекты у тебя могут быть самые странные, вплоть до всякого там треска, что связано с самой природой дискретизации всего и вся в цифровых устройствах.
penes