c# - 没有文件怎么玩?

标签 c# .net audio naudio

我想播放响铃警报而不从文件加载/流式传输。

我可以在代码中嵌入它的信号或音调吗?我正在使用 NAudio

我的目的是通过删除 IO 操作来提高性能。

我不想使用嵌入式资源。 只有我想在代码中生成响铃警报。

最佳答案

使用 NAudio,您可以通过以下选项来实现此目的:

  • 播放流中的文件(在内存中)。您在其他答案中对此有代码,实际上您甚至不需要 NAudio 来完成此任务,因为 System.Media.SoundPlayer 就足够了。
  • 生成将要播放的信号(无需将其保存在某处)。
  • 播放一串声音命令(就像我们在美好时光中使用 BASIC play 所做的那样)。

生成信号

第一个案例的示例来自 Charles Petzold MSDN 上的文章(但也请查看 NAudio documentation):

class SineWaveOscillator : WaveProvider16 {
  double phaseAngle;

  public SineWaveOscillator(int sampleRate): 
    base(sampleRate, 1) {
  }

  public double Frequency { set; get; }
  public short Amplitude { set; get; }

  public override int Read(short[] buffer, int offset, 
    int sampleCount) {

    for (int index = 0; index < sampleCount; index++) {
      buffer[offset + index] = 
        (short)(Amplitude * Math.Sin(phaseAngle));
      phaseAngle += 
        2 * Math.PI * Frequency / WaveFormat.SampleRate;

      if (phaseAngle > 2 * Math.PI)
        phaseAngle -= 2 * Math.PI;
    }
    return sampleCount;
  }
}

然后播放音调的代码很简单:

SineWaveOscillator osc = new SineWaveOscillator(44100);
osc.Frequency = 440;
osc.Amplitude = 8192;

WaveOut waveOut = new WaveOut();
waveOut.Init(osc);
waveOut.Play();

播放 MIDI

对于第二种情况(播放一串 MIDI 命令),请再次查看另一个 Charles Petzold article 。他的 MidiStringPlayer 类提供了您需要的一切(但您可能需要删除 WPF 代码才能在您想要的地方使用它)。使用 NAudio 播放 MIDI 的基本代码是:

using (MidiOut midiOut = new MidiOut(0))
{
    midiOut.Send(MidiMessage.StartNote(60, 127, 0).RawData);
    Thread.Sleep(1000);
    midiOut.Send(MidiMessage.StopNote(60, 0, 0).RawData);
    Thread.Sleep(1000);
}

如果您确实需要从字符串中播放音符,那么您必须解析它,代码太长,无法在此处发布,但在链接中您会找到所有内容。

关于c# - 没有文件怎么玩?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13454709/

相关文章:

c# - Windows Phone 7 - 列表框按钮的功能

c# - 延长 asp.net session 结束日期?

c# - async void 的替换

php - iOS,WAV音频不播放

delphi - 如何在delphi中比较.wav标本?

c# - CustomValidator ServerValidate 方法不触发

c# - 临时存储一个 Delegate 以供以后调用

c# - Xamarin Forms - 将光标更改为等待光标

.net - 如何优雅地关闭另一个应用程序?

javascript - HTML麦克风可视化器