2017-02-04 49 views
0

我正在Redux中構建一個步序列器來幫助我學習。我需要的是一些通用時鐘,它可以作爲「打勾」來提供音樂時間。 所以我計劃使用Tone.js庫,它建立在Web Audio API之上。 有以下function在Redux中通過回調調度操作

Tone.Transport.scheduleRepeat(function(time){ 
//do something with the time 
}, "8n"); 

您提供被調用每次運輸到達一定位置的回調函數。 我天真的做法是讓回調調度一個動作,在我的商店中增加滴答計數。 這不起作用,因爲動作必須是普通對象。 有什麼可能讓這個工作?

我還在努力讓的終極版的基本原理,所以我不能確定的是,正確的理解,但我能以某種方式 捕捉回調使用中間件就讓它通過當實際調用呢?

這是正確的方向嗎?我可以研究哪些圖書館,例子或概念,以瞭解如何做到這一點?

這是否是正確的方向,還是應該以不同的方式處理?如果是這樣,怎麼樣?

或者你也許有什麼想法在Redux應用程序中爲不同組件提供全局時序的最佳方法是什麼?

回答

1

非常有趣的問題,這是一個寵物項目,我一直想解決但尚未寫入單一的LOC。 :)

對於計時部分,您可以使用中間件,或者甚至使用啓動scheduler本身的中間件,並且對每個時間片(可能以時間作爲有效負載)分派動作。

然而棘手的部分是應用程序的整體設計。對Tone.js進行了一些研究後,我很清楚,您必須將視頻中的音頻部分分開。這意味着你的Redux狀態應該只關心表示你的步進音序器(我正在將可視化的東西看作是一個通道列表(通道/樂器),並且你的音頻邏輯應該放在它之外)

我會保留一個數組每一行本身都是一系列「步驟」,用於定義它們是否「活躍」,這也只是UI相關的。點擊一個步驟激活它,應該通過動作創建者修改你的狀態,並且設置任何你以後需要使用Tone.js.

當你回放你的歌曲,你需要調度時鐘滴答滴答,以提前當前活動的「步驟」,所以你可以在用戶界面中突出顯示它

這裏有一個令人垂涎的Codepen模擬羅蘭TR-808搶的想法:在同步回覆音頻和UI

http://codepen.io/pixelass/details/adyLPR

下面是對Tone.js維基的相關章節:

https://github.com/Tonejs/Tone.js/wiki/Performance#syncing-visuals

對不起,我不能幫你進一步,也許你超前了我,已經有一些你可以分享的工作代碼。

1

基本上cwilso正確回答。如果您希望爲音樂播放時間安排JS功能,則不應使用回調。

如果您想要基於此計時實現Tone.js功能,請避免Redux並直接在回調函數或Tone.Transport.schedule函數內調用這些Tone.js函數。

如果您正在構建音序器,我建議根據您想要的長度循環播放Tone.Transport,並安排音符在時間軸上的某些點(如果這是您正在尋找的)。查看文檔中的loopStart和loopEnd以獲取幫助(http://tonejs.github.io/docs/#Transport)。

如果此功能是必需的目視參考,這可能是爲什麼你想有一個終極版的回調,我可以提供你會怎麼做,下面的例子:

function incrementTick() { 
    return { type: 'INCREMENT_TICK' } 
} 

// inside your component once the increment function has been connected 
Tone.Transport.scheduleRepeat((time) => { 
    this.props.incrementTick() 
}, "8n"); 

希望這有助於。

0

我正在處理音頻相關的應用程序,並遇到了管理web音頻API部分以及redux的問題。

我解決這個問題的方式只是將音頻狀態的表示存儲在redux存儲中(普通的JS對象;你將存儲在數據庫中並用於初始化應用程序)。此存儲的信息用於呈現UI。

我有一個服務「引擎」類,它監聽商店中的所有更改,這是創建和存儲所有網絡音頻內容的地方。它基本上包含來自redux存儲庫的reducer的副本,但將更改應用於Web音頻節點。

比如我派遣一個動作:

{type:"set-gain", payload:{trackid:3, value:0.7} } 

了Redux商店將只需要更新一個普通的JS跟蹤對象,以新的增益值,發動機會發現相關的增益節點(或附加創建等)並在其上設置值。

在你的情況下,你會調度一個動作來設置時間,在redux存儲中保存爲普通的JS對象,在你使用web音頻調度的引擎部分進行設置。