回答
以我的經驗.wav file format(Wikipedia entry列出了其他文件給出的文件格式;使用無論你發現最好)是最簡單的廣泛使用的。編寫未壓縮的PCM非常容易。
對於像正弦波和鋸齒這樣的東西,我會將任務分成採樣和文件製作。所以,你可能有一個接口,如:
public interface IWave
{
double Sample(double time);
}
其中Sample
會給出一個時間大於0(但可能大於1),並應在-1和1之間返回一個值(你可以使用委託)然後編寫一個文件生成器,根據採樣持續時間(例如「100000波」)和採樣頻率(例如50000 Hz)創建一個wav文件。
然後,這只是適當實施IWave
的一種情況 - 例如,一個簡單的正弦波返回sin(time/(2 * pi))
,或者鋸齒波返回(time % 1.0) * 2 - 1
。對於獎勵娛樂,您可以編寫組合功能來加速或減慢波形,放大波形,組合其他波形等。當然,文件生成器不需要知道的任何。它只需要採取一個單個IWave
並對其採樣適當的次數,適當地將[-1,1]範圍縮放到[0,255]。
只是爲了詳細說明Jon已經說過的 - 你所做的只是創建一個8位(即字節[1024])或16位緩衝區並填充它(即對於方波它是[255 255 255 255 0 0 0 0 255 255 255 255 0 0 0 0])。
查看this question的示例代碼,瞭解如何在C#中生成正弦波。將其擴展到正方形或鋸齒波將非常簡單。通過混合簡單的波形,可以生成更復雜的波形。
您還可以使用NAudioWaveFileWriter
類,如果您需要將生成的數據寫入到一個WAV文件。
有基於吉爾Khouzam的博客文章Playing back Wave files in Silverlight和皮特·布朗的Creating Sound using MediaStreamSource in Silverlight 3 Beta一個查爾斯Petzold的文章Simple Electronic Music Sequencer for Silverlight。 Mike Hodnick有一篇基於Petzold文章Digital Audio Synthesis on Windows Phone 7的有用博客文章。
在主窗口麥克的XAML引入了一個媒體元素
<MediaElement x:Name="media"/>
,然後使用SetSource
方法來設置媒體元素源到波他構建
this.media.SetSource(new TonesSource());
this.media.Play();
麥克的ToneSource
子類他的BaseSource
又是MediaStreamSource
的小類,並且覆蓋了其幾種方法:OpenMediaAsync
,GetSampleAsync
,SeekAsync
,CloseMedia
,GetDiagnosticAsync
和SwitchMediaStreamAsync
。關於他們更多的在the MSDN documentation; Mike的代碼本身並不長,但涉及位移和寫入內存流,值得在the source provided in Mike's blog post中查看。
邁克的ToneSource
類則提供了立體聲採樣
protected override StereoSample GetSample()
{
short left = 0;
short right = 0;
foreach (var oscillator in this.leftOscillators)
left += oscillator.GetNextSample();
foreach (var oscillator in this.rightOscillators)
right += oscillator.GetNextSample();
return new StereoSample() { Left = left, Right = right };
}
用他Oscillator
類
public short GetNextSample()
{
ushort wholePhaseAngle = (ushort)(phaseAngle >> 16);
short amplitude = 0;
amplitude = (short)(short.MaxValue * Math.Sin(2 * Math.PI * wholePhaseAngle/ushort.MaxValue));
amplitude = (short)((amplitude * multiplier) >> 16);
phaseAngle += phaseAngleIncrement;
return amplitude;
}
的NoiseSource
麥克還提供了比他ToneSource
protected override StereoSample GetSample()
{
return new StereoSample()
{
Left = (short)random.Next(short.MinValue, short.MaxValue),
Right = (short)random.Next(short.MinValue, short.MaxValue)
};
}
更簡單
- 1. C#簡單的組合框輸出
- 2. 簡單的C#輸出
- 3. C#實時生成聲波
- 4. 在Unix上輸出自制合成聲音的簡單方法是什麼?
- 5. C#簡單異常輸出
- 6. 如何在純Javascript中創建簡單的輸入和輸出
- 7. Corona Lua波形聲音合成
- 8. 如何生成簡單的合同類
- 9. 簡單的C++ API聲音
- 10. 如何在wp7中簡單地發出聲音或嘟嘟聲?
- 11. 在C中實現簡單的高通和低通濾波器
- 12. 簡單的C程序生成空白輸出 - 無錯誤
- 13. 如何將心跳轉換成聲波
- 14. 如何解釋這個簡單的C代碼的輸出?
- 15. C和C++中的簡單回聲客戶端服務器
- 16. 很簡單OSX的bash腳本:回聲沒有給出輸出
- 17. 如何從javascript中的輸入聲音生成負面的音頻波?
- 18. 如果在PHP表單和表單輸出中聲明
- 19. 簡單C++ for循環意外輸出
- 20. 斐波那契錯誤的輸出? (C)
- 21. 簡單的斐波那契數列在Python中不輸出正確的答案
- 22. 輸出濾波
- 23. 聲音合成用C#
- 24. 輸出JSON的簡單Webservice
- 25. 簡單的循環輸出
- 26. 如何合成聲音?
- 27. 如何在Android中輕鬆生成合成和絃聲音?
- 28. 聲音添加劑合成 - 任何諧波振幅
- 29. javascript生成方波聲音
- 30. 如何在datagridview輸出中的列之間添加簡單的文本? C#