2

ファイルからロード/ストリーミングせずにリングアラートを再生したいのですが。

信号やトーンをコードに埋め込むことはできますか?私はを使用してNAudioいます。

私の目的は、IOアクションを削除してパフォーマンスを向上させることです。

埋め込みリソースを使用したくありません。コードでリングアラートを生成したいだけです。

4

3 に答える 3

4

NAudio には、次のオプションがあります。

  • (メモリ内の) ストリームからファイルを再生するには。他の回答にこれのコードがありますが、実際にはこのタスクに NAudio は必要ありませんSystem.Media.SoundPlayer
  • 再生される信号を生成するため (どこかに保存する必要はありません)。
  • サウンド コマンドの文字列を再生する (古き良き時代playBASIC で行ったように)。

信号を生成する

最初のケースの例は、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();

MIDI を再生

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);
}

文字列から音符を再生する必要がある場合は、それを解析する必要があります。コードは長すぎてここに投稿できませんが、リンクですべてを見つけることができます。

于 2012-11-20T09:11:41.780 に答える
2

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);
   }
}
于 2012-11-19T14:05:38.190 に答える
1

リソースに追加することで、あらゆる種類のファイルをプロジェクトに埋め込むことができます。

Visual Studio では、[リソース] --> [リソースの追加] --> [既存のファイルの追加] でそれを行うことができます。

私の場合、リソース ファイルに mySound という名前を付けました。

SoundPlayer次に、リソースをパラメーターとして受け取る を追加して、ファイルを開くことができます。

例えば

    SoundPlayer mysoundplayer = new SoundPlayer(MyAssemblyName.Properties.Resources.mySound);
    mysoundplayer.Play();
于 2012-11-19T13:48:10.427 に答える