2011-06-13 26 views
21

我喜歡電子音樂,而且我對它的一切都很敏感。 我在Stack Overflow上發現了許多有用的問題,可以用來播放音頻,濾鏡等。但是我真正好奇的是實際開發的是什麼:數據如何在效果和振盪器之間傳遞?我已經對dsp的數學方面進行了研究,並且我已經瞭解了這個問題的結尾,但我不確定使用什麼緩衝系統等。最終目標是讓一個簡單的對象影響和振盪器傳遞數據彼此之間(也許使用多線程,如果我最終沒有拉出我的頭髮試圖實現它)。這不會是下一個Propellerhead的原因,但我對它是如何工作感興趣,而這更像是一個練習,而不是一個會產生最終產品的東西。從零開始創建一個DSP系統

目前我使用.net和C#,最近我學到了F#(這可能會導致一些有趣的數據處理方式),但如果這些不適合這項工作,我可以學習另一個系統if必要。

問題是:通過程序使用緩衝區獲取大量信號數據的最佳方法是什麼?例如,我會更好使用隊列,數組,鏈接列表等?我應該讓樣本不可變,並且每次向系統應用效果或僅編輯緩衝區中的值時創建一組新的數據?我有一個調度器/線程池風格的對象,組織傳遞數據或應該效果函數之間直接傳遞數據?

謝謝。

編輯:另一個相關的問題是,我將如何使用Windows API播放這個數組?我真的不想使用DirectShow,因爲微軟現在已經差不多了。

編輯2:感謝所有的答案。在查看所有技術後,我將使用XNA 4(我花了一段時間拖網因特網,發現this site解釋瞭如何操作)或NAudio輸出音樂......不確定哪一個還取決於先進程度系統結束了。當C#5.0出來時,我會使用它的異步功能來創建一個效果架構。我幾乎每個人的回答都是平等的,所以現在我有一個難題給誰獎勵...

+1

你能問一個具體的問題嗎? – Amy 2011-06-13 20:18:41

+0

是的,對不起,它有點含糊。 – 2011-06-13 20:50:58

回答

0

開始閱讀thisthis

這會讓你知道你必須做什麼。

然後,學習DirectShow架構 - 學習如何不這樣做,但嘗試創建它的簡化版本。

+0

謝謝我曾經遇到過Csound,我會研究它。另外,我可以在哪裏找到directshow架構的描述?我只是在一個特定的部分:我不知道如何做緩衝,所以我真的想找一個如何做到這一點的描述 – 2011-06-13 21:59:56

7

你看過VST.NET(http://vstnet.codeplex.com/)嗎?這是一個使用C#編寫VST的庫,它有一些例子。你也可以考慮編寫一個VST,以便你的代碼可以在任何主機應用程序中使用(但即使你不需要,查看他們的代碼也是有用的)。

信號數據通常很大,需要大量的處理。不要使用鏈表!我知道的大多數庫只是使用一個數組來放置所有的音頻數據(畢竟這是聲卡的期望)。

從VST.NET樣品:

public override void Process(VstAudioBuffer[] inChannels, VstAudioBuffer[] outChannels) 
    { 
     VstAudioBuffer audioChannel = outChannels[0]; 

     for (int n = 0; n < audioChannel.SampleCount; n++) 
     { 
      audioChannel[n] = Delay.ProcessSample(inChannels[0][n]); 
     } 
    } 

AudioChannel中是左右非託管浮子*緩衝液中的包裝器。

您可能會將您的示例存儲在不可變數組中。然後,當您想要播放它們時,將數據複製到輸出緩衝區中(如果需要,請更改頻率)並在此緩衝區中執行效果。請注意,您可以使用多個輸出緩衝區(或通道)並在最後對它們進行求和。

編輯

我知道兩個低級別的方式來發揮你的陣列:DirectSound的和waveout的從Windows API。 C# Example using DirectSoundC# example with WaveOut。但是,您可能更願意使用外部高級庫,如NAudio。 NAudio對.NET音頻操作非常方便 - 請參閱blog post向音頻卡發送正弦波。你可以看到他們也在使用一個float數組,這是我推薦的(如果你使用字節進行計算,最終會在聲音中產生大量的別名)。

+0

我現在的靈感來寫一個VST!有一件事引起我的警惕,就是浮標用於樣品。我會認爲會使用short或int。 – 2011-06-19 10:38:22

+0

浮球有更好的精度。當你要對樣本進行操作時,你會得到更少的文物。 (我在做圖像處理時注意到了這一點) – Laurent 2011-06-20 13:58:50

+0

浮點數的精度不如整數,但它們的確有更大的範圍。由於人耳對音頻具有對數響應,浮點編碼工作得非常好。另請閱讀* A律*和* mu-law * PCM編碼。 – 2011-06-25 04:56:19

2

關於緩衝和異步/線程/同步問題,我建議你看看新的TPL數據流庫。通過塊原語,併發數據結構,數據流網絡,異步消息處理和TPL的基於任務的抽象(可以與異步/等待C#5功能一起使用),它非常適合這種類型的應用程序。

+0

閱讀了TPL的簡介後,似乎我會瘋狂的不使用TPL!它看起來就像是完美的工作系統......如果它可以在F#中使用,那將會更好 – 2011-06-22 19:25:36

+1

是的,TPL特別適合這個任務,但是也注意到了新的庫,TDF(TPL數據流)與Async CTP(http://go.microsoft.com/fwlink/?LinkId=205053)一起提供。 – 2011-06-23 16:09:29

4

F#在這裏可能是一個不錯的選擇,因爲它非常適合操作函數。函數可能是信號創建和處理的良好構建模塊。

由於Array模塊中的高階函數,F#通常也擅長處理集合,特別是數組。

這些特質使得F#在金融領域受歡迎,並且對信號處理也很有用,我猜想。

Visual F# 2010 for Technical Computing有一個專門用於傅里葉變換的部分,它可能與您想要做的相關。不過,我想有很多關於網絡轉換的免費信息。

最後,要玩樣品,您可以使用XNA。我認爲最新版本的API(4.0)也允許錄製,但我從未使用過。 Xbox有一款名爲ezmuse+ Hamst3r Edition的着名音樂編輯應用程序,它使用XNA,所以它絕對有可能。

+0

是的,我開始在C#上面向C#傾斜,因爲它適合於這類問題。這似乎有點奇怪,雖然微軟最好的音頻產品是在最終爲遊戲設計的系統中。 – 2011-06-22 19:29:48

+0

@Ciemnl:你爲什麼覺得奇怪?遊戲的音軌是大生意。 – 2011-06-24 04:12:28

2

我不知道這是否真的是你想要的,但這是我在大學期間的個人項目之一。直到我自己實現之前,我並沒有真正理解聲音和DSP的工作原理。我試圖儘可能接近發言者,所以我只用libsndfile來處理文件格式錯綜複雜的問題。基本上,我的第一個項目是創建一個大型的雙精度數組,用正弦波填充它,然後使用sf_writef_double()將該數組寫入文件以創建我可以播放的內容,然後查看結果一個波形編輯器。

接下來,我在正弦調用和寫入調用之間添加了另一個函數來添加效果。

這樣你就可以開始使用非常低級別的振盪器和效果,並且可以立即看到結果。此外,這是非常少的代碼來獲得這樣的工作。

就我個人而言,我會從最簡單的解決方案開始,然後慢慢補充。嘗試寫出一個文件並使用音頻播放器播放它,因此您不必處理音頻apis。只需使用單個數組即可啓動並進行就地修改。絕對從單線程開始。隨着項目的增長,您可以開始轉向其他解決方案,如管道而不是陣列,多線程或使用音頻API。

如果你想創建一個你可以發佈的項目,取決於它究竟是什麼,你可能必須轉移到更復雜的庫,比如一些實時音頻處理。但是,通過上述簡單的方法學習的基礎知識在您達到這一點時肯定會有所幫助。

祝你好運!

2

我已經做了相當多的實時DSP,雖然不帶音頻。雖然你的想法(不可變緩衝區)vs(可修改的緩衝區就位)都可以工作,但我更喜歡爲信號路徑中的每個鏈路創建一個永久緩衝區。由於每個輸入樣本都會影響多個輸出樣本,因此大多數效果不適合修改。當您重新採樣階段時,緩衝區爲每個鏈接技術效果特別好。

在這裏,當到達的樣本,第一緩衝器被覆蓋。然後第一個過濾器從其輸入緩衝區(第一個緩衝區)讀取新數據並寫入其輸出(第二個緩衝區)。然後它調用第二階段從第二個緩衝區讀取並寫入第三個緩衝區。

這種模式完全消除了動態分配,允許每個階段保持可變的歷史數量(因爲效果需要一些內存),並且非常靈活,只要能夠重新排列路徑中的過濾器即可。

1

好吧,我會在賞金刺以及隨後:)

我在一個非常類似的情況其實是。我一直在製作電子音樂很長一段時間,但只是在過去幾年中,我纔開始探索實際的音頻處理。

你提到你已經研究了數學。我認爲這很關鍵。我目前正在通過Ken Steiglitz的「數字信號處理入門手冊」 - 應用於數字音頻和計算機音樂中。如果你不瞭解你的複數和相位,那將會非常困難。

我是一個Linux傢伙,所以我開始用C語言編寫LADSPA插件。我認爲從基本層次開始,真正理解發生了什麼是很好的。如果我在Windows上,我會從Steinberg下載VST SDK,並撰寫一個概念插件的快速證明,只是增加了噪音或其他。

選擇VST或LADSPA之類的框架的另一個好處是您可以立即在普通音頻套件中使用您的插件。將第一個自制插件應用於音軌的滿意度是無與倫比的。另外,你將能夠與其他音樂家分享你的插件。

在C#/ F#中可能有這樣做的方法,但如果您打算編寫VST插件,我會推薦C++,以避免任何不必要的開銷。這似乎是行業標準。

在緩衝方面,我一直在使用循環緩衝區(這裏有一篇好文章:http://www.dspguide.com/ch28/2.htm)。一個很好的練習就是實現一個有限響應濾波器(Steiglitz稱之爲前饋濾波器) - 這些依賴於緩衝,並且玩起來很有趣。

我有在Github上回購了一些非常基本的LADSPA插件。除了架構差異之外,它們可能對編寫VST插件的人有用。 https://github.com/andreasjansson/my_ladspa_plugins

的示例代碼另一個很好的來源是CSound的項目。那裏有大量的DSP代碼,該軟件主要面向音樂家。

0

你可以看看BYOND。這是一個在C#中編程音頻/ MIDI樂器和效果的環境。它可以單獨使用,也可以作爲VST使用和效果。

充分披露我BYOND的開發商。

+0

聽起來有趣,但我真的不回答這個問題。 – 2013-11-14 09:28:01