-
Notifications
You must be signed in to change notification settings - Fork 309
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
[project-s]再生周りの機能を追加 #1184
[project-s]再生周りの機能を追加 #1184
Conversation
@sigprogramming 取り急ぎScoreについて実装いただいた方法で大丈夫そうに思えます! ほか少しだけ考えてみたのですが、 なにか理由あったかも&より良い方法がないか確認いたします!
|
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!!
すげーーーーーーーーーー!!!!!!!!
サクサク動きますね、感動しました!!
いくつかコメントしていますが、どれもsuggest程度で必須級ではないかなと思います。
ガシガシ実装していって頂ければ・・・!!!
あと、正直言うとAudioRenderer周りは雰囲気眺めただけです・・・!
クラスごととかに役割などをちょっとだけコメントドキュメント残しておくと、将来誰かの役に立つかもと思いました・・・!
あ。scoreに関して、同じく最初からstoreに代入でもいいかなと思いました。
let singChannel: SingChannel = undefined as any as SingChannel; // FIXME: あとで消す |
@Hiroshiba |
@sigprogramming |
@romot-co |
マージします! |
内容
以下の機能を追加します。
また、以下の不具合を修正しています。
もう少し細かくPRすることも考えましたが、動作確認できた方が良いかもと思い、この範囲でPRしています。
(1000行超えました…すみません…)
Web Audio APIをラップするライブラリを利用することも考えましたが、曲中でのテンポ変更や指定した位置からの再生、ループ再生などがうまく実装できなかったので、とりあえず自前でラッパー(レンダラー)を実装しています。
もしライブラリを利用して実装できそうであれば後でライブラリに置き換えられればと思っています。
設計について
基本的にストアのステートを元にレンダラーで再生を行う形で、なるべく「ストア→レンダラー」の一方向になるようにしています。(レンダラーから取得するのは再生位置のみ)
再生位置は頻繁に更新されるので、とりあえずストアには置かず、再生時にgetterを介してポーリングする形にしています。(ポーリングは一箇所で行うようにした方が良いかもなので、後ほど考慮できればと思います)
また、再生位置やノートの位置は、時間(秒)に変換してからレンダラーに渡すようにしています。この形にしたのはレンダラーの処理を簡単にするためですが、ストア側が少し冗長になってるかもしれません…
Scoreについて
(PRとあまり関係ないですが、実装中に少し悩んだので)
現状onMountedでscoreなどのステートの初期化を行っているので、各UIでscoreを取得する際にundefinedでないかチェックする必要があります。
actionではとりあえず関数でチェックして取得する形に変更しています。
scoreのチェックを減らすには、UIがマウントされる前にscoreを初期化するようにして、scoreが存在する前提のUIでは「存在をチェックするgetter」を介して取得するようにするか、任意のタイミングで初期化を行わずに最初からscoreを設定するようにした方が良いかもと思いました。(他に良い方法があればご提案いただけますと幸いです)
関連 Issue
ref #1041
その他