2017-12-15 20 views
-1

コード表示を変更する方法があるかどうかは、hereです。基本的にビープ音を並べて一度に再生することができます。複数の正弦波から.wavを作成して一度に再生する

私はグローバルなMemoryStreamとBinaryWriterを使ってみようとしましたが、サイズのためにすべての時間を計算しましたが、一度に1回のビープ音よりも遅く、動作していませんでした。

その後、私はバイト配列にMemoryStreamを書き込もうとしましたが、それはストリーム/ライター用のグローバルを作るのと同じでした。

MemoryStreamで複数のビープ音を一度に再生するコードを編集するにはどうすればよいですか?ここで

+0

私はそのコードのintサンプルは 'A [i]は* Math.Sin(DeltaFT [I] *の組み合わせ/合計されるべきだと思いますT)) 'i = 0 ....(ビープ音のカウント数-1)。たぶん、すべてのA [i]の合計がそのコードのAになりますが、私は音楽理論には弱いです。 –

+0

「ビープ音の配列」の意味を詳しく解説できますか?曲を演奏しようとしていますか(MIDIファイルからWAVファイルへ変換するなど)または、複数の波形を組み合わせて1つの音符を作成しようとしていますか(ギター・プルック・シミュレータなど)? – NetMage

+0

@DaveS私はそれを試して、それがどうなるか見てみましょう。 – JDoe

答えて

0

がビープ音から曲を作成するための修正である:

void Main() { 
    var beeps = new[] { 
     new Song.Beep(500, 1000, 200), 
     new Song.Beep(1000, 1000, 300), 
     new Song.Beep(300, 2000, 150), 
     new Song.Beep(500, 500, 200), 
    }; 

    var song = new Song(beeps); 
    song.PlaySong(); 
} 

public class Song { 
    public struct Beep { 
     readonly public int Amplitude; 
     readonly public int Frequency; 
     readonly public int Duration; 

     public Beep(int a, int f, int d) { 
      Amplitude = a; 
      Frequency = f; 
      Duration = d; 
     } 
    } 

    MemoryStream MS; 

    public Song(IEnumerable<Beep> beeps) { 
     int Bytes = beeps.Sum(b => 4 * (441 * b.Duration/10)); 

     int[] Hdr = { 0X46464952, 36 + Bytes, 0X45564157, 0X20746D66, 16, 0X20001, 44100, 176400, 0X100004, 0X61746164, Bytes }; 

     MS = new MemoryStream(44 + Bytes); 
     using (var BW = new BinaryWriter(MS, Encoding.UTF8, true)) { 
      for (int I = 0; I < Hdr.Length; ++I) 
       BW.Write(Hdr[I]); 

      foreach (var beep in beeps) { 
       double A = ((beep.Amplitude * (System.Math.Pow(2, 15)))/1000) - 1; 
       double DeltaFT = 2 * Math.PI * beep.Frequency/44100.0; 

       int Samples = 441 * beep.Duration/10; 
       for (int T = 0; T < Samples; ++T) { 
        short Sample = System.Convert.ToInt16(A * Math.Sin(DeltaFT * T)); 
        BW.Write(Sample); // left channel 
        BW.Write(Sample); // right channel 
       } 
      } 
     } 
    } 

    public void PlaySong() { 
     MS.Seek(0, SeekOrigin.Begin); 
     using (var SP = new SoundPlayer(MS)) { 
      SP.PlaySync(); 
     } 
    } 
} 
+0

おかげでNetMage、これは私の問題を解決するために働いた!真ん中に静的なビットがいくつあるのか分かりますか?大したことではない、私はちょうど興味があった。 – JDoe

+0

私は自分の答えを変えて、複数回再生できる曲のオブジェクトを作成しました。私の推測では、波形が0で終了するように、サンプルレートに丸められていることを確実にするためにコードが苦労しないため、サンプルが合致する不連続点があることが予想されます。あなた(私)はそれを見るためにサンプルをグラフ化することができます。 – NetMage

+0

ウェーブファイルを書き込んで、オーディオエディタで見ることができるように変更しました。ビープ音を均等に壊さないうちに、静的なものではありません。あなたは私のサンプルビープ音で静止していると聞いていますか? – NetMage

関連する問題