2011-07-21 42 views
2

給定一個頻率和幅度的數組(長度變化),我是否可以按樣本生成單個音頻緩衝區,其中包括所有音調陣列?如果不是,在單個音頻單元中生成多個音調的最佳方式是什麼?讓每個音符產生它自己的緩衝區,然後將這些緩衝區加到輸出緩衝區中?這不是一次完成所有事情嗎?爲音頻單元(iOS)同時生成多個正弦波到採樣緩衝區中

工作在一個iOS應用程序,從觸摸產生筆記,考慮使用STK,但不想發送筆記關閉消息,寧可只爲我在數組中保存的筆記產生正弦音調。每個音符實際上需要產生兩個正弦曲線,具有不同的頻率和振幅。一個音符可能與另一個音符播放的頻率相同,因此在該頻率下的音符消息可能會導致問題。最終,我想爲音頻單元外的每個音符管理振幅(adsr)信封。我也希望響應時間儘可能快,所以我願意做一些額外的工作/學習,以儘可能保持音頻內容的低水平。

我一直在使用正弦波單音發生器的例子。試圖基本上加倍這些中的一個,是這樣的:

緩衝區[幀] =(SIN(theta1)+ SIN(theta2))/ 2

由頻率1 /頻率2過採樣速率遞增theta1/theta2,(I意識到這不是最有效的調用sin()),但會產生混疊效果。我還沒有找到一個具有多個頻率或數據源的例子,而不是從文件中讀取音頻。

任何建議/示例?我原來每張音符都會產生自己的音頻單元,但是這給我帶來了從觸摸到音符聽起來太多的延遲(並且似乎也是低效的)。我比一般的數字音頻更新於這種編程水平,所以如果我錯過了某些明顯的東西,請保持溫柔。

回答

2

是的,你當然可以,你可以在你的渲染回調中做任何你喜歡的事情。當你設置這個回調時,你可以傳入一個指向對象的指針。

該對象可能包含每個音的開關狀態。實際上該對象可能包含負責填充緩衝區的方法。 (只要確保對象是非原子的,如果它是屬性 - 否則由於鎖定問題會導致人爲因素)

您究竟想要達到什麼目的?你真的需要生成嗎?

如果是的話,你運行超載remoteIO音頻單元的渲染回調的風險,這將給你的毛刺和文物

你可能會擺脫它在模擬器上,然後將其移動到一個設備並找到那神祕它不工作了,因爲你是在少50倍的處理器上運行,以及一個回調不能完成在下單前到達

話說回來,你可以有很多

我已經脫身一個可以同時播放任何數量的個人色調的12音調播放器

我所做的每個音都有一個環形緩衝區(我使用相當複雜的波形,所以這需要很多時間,實際上我實際上是在應用程序第一次運行時計算出來的,然後從文件中加載它),併爲每個環保持一個讀頭和一個啓用標誌。

然後我在渲染回調中添加了所有東西,即使所有12個玩家都在一起玩,這在設備上也可以很好地處理。我知道文檔告訴你不要這樣做,它建議只使用這個回調來填充另一個緩衝區,但是你可以逃脫很多,並且它是一個PITA來編寫某種緩衝系統來計算在不同的線程上。

相關問題