我想播放铃声提醒而不从文件加载/流式传输它。

我可以在信号中嵌入信号或声音吗?我正在使用NAudio

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

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

最佳答案

使用NAudio,您可以选择以下选项:

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

  • 产生信号

    第一种情况的示例来自MSDN上的Charles Petzold文章(但也可以看看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/

    10-12 17:12