Как воспроизвести тональный сигнал до тех пор, пока пользователь держит клавишу?
Ради интереса я написал музыкальную программу (на C#), которая работает с помощью P/Invoking Beep
Функция с соответствующей частотой, когда пользователь нажимает клавишу.
Проблема с этим подходом заключается в том, что Beep
требует, чтобы продолжительность была указана заранее, поэтому все заметки имеют одинаковую длину. Это довольно серьезное ограничение для музыкального инструмента.
Что бы я хотел сделать, начать воспроизведение заметки в событии KeyDown и прекратить ее воспроизведение в событии KeyUp. Предпочтительно таким образом, чтобы можно было играть несколько нот одновременно. Есть ли простой способ сделать это в.NET или Win32?
1 ответ
Звуковой сигнал не является хорошим решением здесь. Создайте файлы коротких сигналов для требуемых частот, а затем воспроизведите их, используя функцию PlaySound с флагом SND_LOOP, как показано ниже:
KeyDown:
PlaySound("wave440.wav", 0, SND_LOOP | SND_FILENAME | SND_ASYNC);
...
KeyUp:
PlaySound(NULL, 0, SND_PURGE);