ファイルからロード/ストリーミングせずにリングアラートを再生したいのですが。
信号やトーンをコードに埋め込むことはできますか?私はを使用してNAudio
います。
私の目的は、IOアクションを削除してパフォーマンスを向上させることです。
埋め込みリソースを使用したくありません。コードでリングアラートを生成したいだけです。
NAudio には、次のオプションがあります。
System.Media.SoundPlayer
。play
BASIC で行ったように)。最初のケースの例は、MSDN のCharles Petzoldの記事からのものです (ただし、NAudio のドキュメントも参照してください)。
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();
2 番目のケース (一連の MIDI コマンドを再生する) については、 Charles Petzoldの別の記事を再度参照してください。彼の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);
}
文字列から音符を再生する必要がある場合は、それを解析する必要があります。コードは長すぎてここに投稿できませんが、リンクですべてを見つけることができます。
NAudioソリューションの場合、次のようになります
Test.Properties.Resources.aaa これは mp3 のパスです
using (var ms = new MemoryStream(Test.Properties.Resources.aaa))
using (var rdr = new NAudio.Wave.Mp3FileReader(ms))
using (var wavStream = NAudio.Wave.WaveFormatConversionStream.CreatePcmStream(rdr))
using (var baStream = new NAudio.Wave.BlockAlignReductionStream(wavStream))
using (var waveOut = new NAudio.Wave.WaveOut(NAudio.Wave.WaveCallbackInfo.FunctionCallback())) {
waveOut.Init(baStream);
waveOut.Play();
while (waveOut.PlaybackState == NAudio.Wave.PlaybackState.Playing) {
System.Threading.Thread.Sleep(100);
}
}
リソースに追加することで、あらゆる種類のファイルをプロジェクトに埋め込むことができます。
Visual Studio では、[リソース] --> [リソースの追加] --> [既存のファイルの追加] でそれを行うことができます。
私の場合、リソース ファイルに mySound という名前を付けました。
SoundPlayer
次に、リソースをパラメーターとして受け取る を追加して、ファイルを開くことができます。
例えば
SoundPlayer mysoundplayer = new SoundPlayer(MyAssemblyName.Properties.Resources.mySound);
mysoundplayer.Play();