Audio generation software or .NET library

2019-04-09 19:05发布

问题:

I need to be able to play certain tones in a c# application. I don't care if it generates them on the fly or if it plays them from a file, but I just need SOME way to generate tones that have not only variable volume and frequency, but variable timbre. It would be especially helpful if whatever I used to generate these tones would have many timbre pre-sets, and it would be even more awesome if these timbres didn't all sound midi-ish (meaning some of them sounded like the might have been recordings of actual instruments).

Any suggestions?

回答1:

You might like to take a look at my question Creating sine or square wave in C#

Using NAudio in particular was a great choice



回答2:

This article helped me with something similar: http://social.msdn.microsoft.com/Forums/vstudio/en-US/18fe83f0-5658-4bcf-bafc-2e02e187eb80/beep-beep

The part in particular is the Beep Class:

public class Beep
{
  public static void BeepBeep(int Amplitude, int Frequency, int Duration)
  {
    double A = ((Amplitude * (System.Math.Pow(2, 15))) / 1000) - 1;
    double DeltaFT = 2 * Math.PI * Frequency / 44100.0;

    int Samples = 441 * Duration / 10;
    int Bytes = Samples * 4;
    int[] Hdr = {0X46464952, 36 + Bytes, 0X45564157, 0X20746D66, 16, 0X20001, 44100, 176400, 0X100004, 0X61746164, Bytes};
    using (MemoryStream MS = new MemoryStream(44 + Bytes))
    {
      using (BinaryWriter BW = new BinaryWriter(MS))
      {
        for (int I = 0; I < Hdr.Length; I++)
        {
          BW.Write(Hdr[I]);
        }
        for (int T = 0; T < Samples; T++)
        {
          short Sample = System.Convert.ToInt16(A * Math.Sin(DeltaFT * T));
          BW.Write(Sample);
          BW.Write(Sample);
        }
        BW.Flush();
        MS.Seek(0, SeekOrigin.Begin);
        using (SoundPlayer SP = new SoundPlayer(MS))
        {
          SP.PlaySync();
        }
      }
    }
  }
}

It can be used as follows

Beep.BeepBeep(100, 1000, 1000); /* 10% volume */


回答3:

There's a popular article on CodeProject along these lines: http://www.codeproject.com/KB/audio-video/CS_ToneGenerator.aspx

You might also check out this thread: http://episteme.arstechnica.com/eve/forums/a/tpc/f/6330927813/m/197000149731



回答4:

In order for your generated tones not to sound 'midi-ish', you'll have to use real-life samples and play them back. Try to find some good real instrument sample bank, like http://www.sampleswap.org/filebrowser-new.php?d=INSTRUMENTS+single+samples%2F

Then, when you want to compose melody from them, just alternate playback frequency relative to the original sample frequency.

Please drop me a line if you find this answer usefull.