我想播放铃声提醒而不从文件加载/流式传输它。
我可以在信号中嵌入信号或声音吗?我正在使用NAudio
。
我的目的是通过消除IO操作来提高性能。
我不想使用嵌入式资源。
只有我要在代码中生成振铃警报。
最佳答案
使用NAudio,您可以选择以下选项:
System.Media.SoundPlayer
就足够了)。 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/