Я пытаюсь написать мини-программу для синтезатора.По сути, каждые 200 мс срабатывает таймер.Когда это срабатывает, выборка PCM на 200 мс генерируется петлей (например, пилообразной волной, синусоидальной волной и т. Д.), Количество выборок связано с частотой дискретизации и периодом сканирования.например, каждые 200 мс, 4000 сэмплов готовы в волновом массиве для воспроизведения.У меня вопрос, как мне воспроизвести этот массив, что должен делать метод PlaySound?Вызов PlaySound каждые 200 мс должен воспроизводить последующие сэмплы непрерывно.Я играл с DirectSound и NAudio безрезультатно.
const int SAMPLE_RATE = 20000;
const double SCAN_PERIOD = .2; // S
Timer _ScanTimer = new Timer();
double[] wave = new double[(int)((double)SAMPLE_RATE * SCAN_PERIOD)];
_ScanTimer.Tick += new EventHandler(_ScanTimer_Tick);
private void _ScanTimer_Tick(object sender, EventArgs e) {
int numSamplesPerTick = (int)((double)SAMPLE_RATE * SCAN_PERIOD);
double secondsPerTick = (double)2 / SAMPLE_RATE;
for (int i = 0; i < numSamplesPerTick; i++) {
wave[i] = GetSynthOutput();
_CurrentTime += secondsPerTick;
if (_CurrentTime > double.MaxValue - 1)
_CurrentTime = 0;
}
PlaySound(wave);
}
Я понимаю, что таймер может срабатывать не каждые 200 мс, и что 4000 выборок могут содержать немного слишком мало или слишком много выборок за фактическое время.Меня это не беспокоит, так как я могу настроить количество выборок в соответствии с фактическим временем между последующим срабатыванием таймера.