Воспроизведение синтезированных звуков в режиме реального времени в C # - PullRequest
0 голосов
/ 06 марта 2012

Я пытаюсь написать мини-программу для синтезатора.По сути, каждые 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 выборок могут содержать немного слишком мало или слишком много выборок за фактическое время.Меня это не беспокоит, так как я могу настроить количество выборок в соответствии с фактическим временем между последующим срабатыванием таймера.

1 Ответ

1 голос
/ 07 марта 2012

Вместо создания звука по таймеру большинство программ синтеза звука работают с двумя буферами - одна заполняется, а другая воспроизводится.NAudio позволяет вам сделать это, реализовав функцию Read в производном классе ISampleProvider или IWaveProvider.Этот метод будет вызываться всякий раз, когда звуковая карта хочет больше звука для воспроизведения.Вы можете настроить размер буфера на 200 мс, если хотите.

...