【发布时间】:2010-11-24 05:07:04
【问题描述】:
我需要能够在 c# 应用程序中播放某些音调。我不在乎它是即时生成它们还是从文件中播放它们,但我只需要某种方法来生成不仅音量和频率可变,而且音色可变的音调。如果我用来生成这些音调的任何东西都有很多音色预设,那将特别有用,如果这些音色听起来不是全部都是 midi-ish 那就更棒了(这意味着其中一些听起来可能是实际乐器的录音)。
有什么建议吗?
【问题讨论】:
我需要能够在 c# 应用程序中播放某些音调。我不在乎它是即时生成它们还是从文件中播放它们,但我只需要某种方法来生成不仅音量和频率可变,而且音色可变的音调。如果我用来生成这些音调的任何东西都有很多音色预设,那将特别有用,如果这些音色听起来不是全部都是 midi-ish 那就更棒了(这意味着其中一些听起来可能是实际乐器的录音)。
有什么建议吗?
【问题讨论】:
你不妨看看我的问题Creating sine or square wave in C#
特别是使用NAudio 是一个不错的选择
【讨论】:
这篇文章帮助我完成了类似的事情: http://social.msdn.microsoft.com/Forums/vstudio/en-US/18fe83f0-5658-4bcf-bafc-2e02e187eb80/beep-beep
特别是 Beep 类:
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();
}
}
}
}
}
可以如下使用
Beep.BeepBeep(100, 1000, 1000); /* 10% volume */
【讨论】:
CodeProject 上有一篇很受欢迎的文章,内容如下: http://www.codeproject.com/KB/audio-video/CS_ToneGenerator.aspx
你也可以看看这个帖子: http://episteme.arstechnica.com/eve/forums/a/tpc/f/6330927813/m/197000149731
【讨论】:
为了让您生成的音调听起来不“midi-ish”,您必须使用真实的样本并回放它们。试着找一些好的真实乐器样本库,比如http://www.sampleswap.org/filebrowser-new.php?d=INSTRUMENTS+single+samples%2F
然后,当您想从它们中创作旋律时,只需相对于原始采样频率交替播放频率即可。
如果您觉得这个答案有用,请给我留言。
【讨论】: