Поскольку вам необходимо поддерживать полифонию, один из подходов заключается в PInvoke в API-интерфейсе Windows waveOutXXXX для воспроизведения звуков. Вот хороший пример того, как это сделать в C #:
https://www.codeproject.com/KB/audio-video/cswavplay.aspx
В этом примере также есть код для чтения информации, такой как длительность, частота дискретизации, биты на выборку и т. Д.
Если вы выполняете поиск, вы можете обнаружить, что API waveOutXXXX может воспроизводить только один звук за раз. Это было верно в Windows 95/98, но больше не верно.
Кстати, SoundPlayer, пожалуй, самый разочаровывающий класс .NET. Метод .Play () автоматически останавливает воспроизведение любого другого звука, воспроизводимого вашим процессом (это может быть любой другой звук, воспроизводимый любым приложением .NET) перед запуском, поэтому вы не можете использовать полифонию с ним. Худшему стажеру Microsoft потребовалось бы меньше минуты, чтобы добавить метод .DontStopJustPlay () или параметр bool StopFirst в метод .Play (). Возможно, ему понадобилось до обеда, чтобы добавить свойство Duration.
Хотя waveOutXXXX сложнее, чем хотелось бы от хорошо спроектированного современного API (и использование его в .NET создает дополнительные проблемы), его непревзойденное преимущество заключается в том, что он предустановлен на каждом компьютере с Windows начиная с Windows 95, включая устройства Windows Mobile. Любая другая опция (включая MediaPlayer) означает, что кому-то всегда придется что-то устанавливать.