-
Notifications
You must be signed in to change notification settings - Fork 310
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
マルチトラック:再生・書き出しに対応 #2163
マルチトラック:再生・書き出しに対応 #2163
Conversation
src/store/singing.ts
Outdated
export const singingStorePlugin: StorePlugin = (store) => { | ||
watch( | ||
() => store.state.tracks, | ||
async (tracks) => { | ||
if (!audioContext || !globalChannelStrip) { | ||
return; | ||
} | ||
const shouldPlays = shouldPlayTracks(tracks); | ||
for (const [trackId, track] of tracks) { | ||
if (!trackChannelStrips.has(trackId)) { | ||
const channelStrip = new ChannelStrip(audioContext); | ||
trackChannelStrips.set(trackId, channelStrip); | ||
channelStrip.output.connect(globalChannelStrip.input); | ||
|
||
trackChannelStrips.set(trackId, channelStrip); | ||
} | ||
|
||
const channelStrip = getOrThrow(trackChannelStrips, trackId); | ||
channelStrip.volume = track.gain; | ||
channelStrip.pan = track.pan; | ||
channelStrip.mute = !getOrThrow(shouldPlays, trackId); | ||
} | ||
}, | ||
{ deep: true, immediate: true }, | ||
); | ||
|
||
watch( | ||
() => store.state.selectedTrackId, | ||
async (selectedTrackId) => { | ||
if (!audioContext || !globalChannelStrip || !previewSynth) { | ||
return; | ||
} | ||
const channelStrip = getOrThrow(trackChannelStrips, selectedTrackId); | ||
previewSynth.output.disconnect(); | ||
previewSynth.output.connect(channelStrip.input); | ||
}, | ||
{ immediate: true }, | ||
); | ||
}; |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
singing.tsでプラグインを作るようにしました(良い方法が思い浮かばなかった)。
うーん...
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
プラグインにする実装良いと思いました!!
singingだけならsingEditorとかでも良いのですが、他のStoreのstateもということを考えるとこの実装が良さそう。
ドキュメントの付け足しとかのコメントが主です!
## 内容 いつものアレです。 ## 関連 Issue - ref: #2163 ## スクリーンショット・動画など (なし) ## その他 (なし)
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
LGTM!!!
僕的には OK です!!
あとは @sigprogramming さんのapproveがあれば良さそう!!
どちらかにしか存在しないtrackIdがある場合はエラーを投げる
この方針良いですね!!!
const shouldPlays = shouldPlayTracks(tracks); | ||
for (const [trackId, track] of tracks) { | ||
const channelStrip = new ChannelStrip(offlineAudioContext); | ||
channelStrip.volume = track.gain; | ||
channelStrip.pan = track.pan; | ||
channelStrip.mute = !getOrThrow(shouldPlays, trackId); |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
(このプルリクエストには関係ないけど)
shouldPlayTracks、MapじゃなくてshouldPlayなトラックIDリストを返すようにすればこの辺のgetOrThrow
なくせるかも
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
LGTM!!
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
マージします!!
trackChannelStrips
、offlineの方はレンダーのたびに作られていて、RENDER関数側ではキャッシュされる形になってますね。
なんか統一できそう感ありますね!
関数切り出しに関しては僕もコメントしようかちょっと迷ってました。
でもどれを関数切り出しするべきで、どれは内部関数で良くて、ってのを考え始めるとよくわかんなくなってきたのでコメントできてませんでした。
なので @sigprogramming さんのコメント助かりました 🙇
たぶんですが、RENDERとofflineRender周りだけ別に切り出しちゃうのが分け方として綺麗かもです。
Vuex Storeが巨大すぎて、関数切り出しをしたらメインのコードと関数のコードが離れすぎてしまうのが厄介な考慮点に感じたので。。
何かリファクタリングの参考になれば!
内容
再生と書き出しに対応します。
関連 Issue
スクリーンショット・動画など
(なし)
その他