2011-05-09 61 views
0

我正在創建一個應用程序,用於讀取聲音必須播放時包含聲音「銀行」和偏移量的獨特格式。將某些聲音數據渲染爲一個新的聲音數據?

想象類似的東西..

音庫(在左側和文件名在右邊ID)

0 kick.wav 
1 hit.wav 
2 flute.wav 

而發生偏移:(時間(ms)上左側和上右側的聲音ID)

1000 0 
2000 1 
3000 2 

,應用程序將生成一個新的聲音文件(即WAV,供以後轉換爲其他格式),在第一秒起着球,一個擊中secon d秒,長笛在第三秒。

我完全不知道從哪裏開始。

我通常使用FMOD進行音頻播放,但從未做過這樣的事情。

我在MSVC++ Express Edition環境中使用C++和wxWidgets,並且LGPL庫會很好。

+1

看起來你正在重塑[module file](http://en.wikipedia.org/wiki/Module_file)。 – genpfault 2011-05-09 15:27:10

+0

一個明確的問題可能會有用。 – flownt 2011-05-09 15:42:36

+0

@genpfault:不完全是,我的問題中的例子只是一個更簡單的例子。 @flownt:我真的不知道從哪裏開始,我只是需要某種啓發來渲染音頻(以前從未進行過音頻渲染),所以我想不出更多的問題而不是_how?_ – drowneath 2011-05-09 16:52:03

回答

1

如果我理解正確,您希望通過混合音庫中的wav來生成新的wave文件。你可能不需要一個完善的API,特別是如果你所有的輸入wav都是相同的格式。

只需將每個wav文件加載到緩衝區。對於SampleRate*secondsUntilStartTime採樣,對於ActiveList中的每個緩衝區,將buffer[bufferIdx++]添加到輸出緩衝區中。如果bufferIdx == bufferLen,請從ActiveList中刪除此緩衝區。在StartTime中,添加下一個緩衝區ActiveList,然後重複。

如果FMOD支持輸出到文件而不是聲音硬件,那麼您可以使用流API來做同樣的事情。只需跟蹤StreamCallback中的已過樣本,並在每次到達其起始偏移時開始混合新文件。

+0

請注意,混合時您需要小心溢出。如果可能的話,在音樂庫中留下一些空間。 – AShelly 2011-05-09 17:34:48