我想播放响铃警报而不从文件加载/流式传输。
我可以在代码中嵌入它的信号或音调吗?我正在使用 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/