Skip to content
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

ソング:再生中に左上のテンポ入力欄でテンポ変更できない #2593

Closed
sigprogramming opened this issue Mar 5, 2025 · 7 comments · Fixed by #2603
Closed
Labels

Comments

@sigprogramming
Copy link
Contributor

sigprogramming commented Mar 5, 2025

不具合の内容

再生中に左上のテンポ入力欄でテンポを変更することができません。

現象・ログ

再生を開始した後、テンポを(ルーラー右クリックではなく左上の入力欄で)入力or上下ボタンで変更しようとしても変更されない
(レンダリング中だとタイミングによっては変更できます)

再現手順

再生を開始した後、レンダリング完了を待ってから、左上のテンポ入力欄でテンポを変更する操作を行う(入力or上下ボタン)

期待動作

再生中でも左上のテンポ入力欄でテンポを変更できる

VOICEVOXのバージョン

現在のmainブランチで確認しました

その他

@sigprogramming sigprogramming changed the title ソング:再生中にテンポが変更できない ソング:再生中にテンポ変更できない Mar 5, 2025
@sigprogramming sigprogramming changed the title ソング:再生中にテンポ変更できない ソング:再生中に左上のテンポ入力欄でテンポ変更できない Mar 5, 2025
@Hiroshiba
Copy link
Member

ほんとだ・・・disabledになってるわけでもないのに、変更しようとしてもinput要素に反映されないですね・・・。なんでだ・・・

@sigprogramming
Copy link
Contributor Author

調べてみました、playheadTicksが変わるたびにbpmInputBufferにbpmの値を設定しているのが原因だと思います。

watch(
[tempos, playheadTicks],
() => {
const currentTempo = tempos.value.findLast(
(tempo) => tempo.position <= playheadTicks.value,
);
if (!currentTempo) {
throw new UnreachableError("assert: at least one tempo exists");
}
bpmInputBuffer.value = currentTempo.bpm;
},
{ immediate: true },
);

bpmInputBuffer.value = currentTempo.bpm;をコメントアウトすると、再生中でもテンポの変更ができるようになりました。

曲中のテンポ変更のタイミングでbpmInputBuffer.value = currentTempo.bpm;を行うようにするか、
テンポ表示とテンポ入力でHTML要素を分ける(歌詞入力と同じ形)と、
再生位置のテンポ表示と再生中のテンポ変更が可能になると思います。

@Hiroshiba
Copy link
Member

Hiroshiba commented Mar 8, 2025

なーーーーーるほどです!!!!!

ちょっと試してみた感じ、そもそもinputBufferがなくせそうでした!
(本当はPreviewableValueを導入しようとしていましたが、不要なことに気づきました)

エディタの挙動はこっちで試せるはず。

挙動的に問題なさそうかちょっと気になってます。
たぶんこんな感じの挙動

  • 再生中じゃないときは普通に編集できる
  • 再生中にinputの上下ボタンを押しても普通に編集できる
  • 再生中にinputの文字変更もできる
  • 再生中にbpm区間が変わってbpmの値が変わった場合、入力中の値は消えて再生バー位置のbpmの値が入る

@sigprogramming
Copy link
Contributor Author

@Hiroshiba
PRありがとうございます!

再生中にbpm区間が変わってbpmの値が変わった場合、入力中の値は消えて再生バー位置のbpmの値が入る

#2603 だと、bpm区間が変わっても入力中の値は消えず、入力を確定すると再生バー位置のbpmが変更される、という挙動になっていました!(この挙動でも良いと思います)

その他の挙動は問題なさそうでした!

@Hiroshiba
Copy link
Member

あれ、ほんとですね!!
フォーカスが当たっているだけであれば値が勝手に変わりそうだけど、入力した場合は置き換わらないかもでした!!

一旦変更が少ないのでこの形でプルリクエスト作ってみようと思います!

この挙動でも良いと思います

やっぱ入力開始した位置のBPM が変えられた方が良いですかね?
少なくとも実装難度はそこそこ上がるはずですが、できなくはなさそうです。
一旦勝手に変わっちゃう挙動で実装しますが、もし別の挙動が良さそうだったら新しくissue作ってもいいかもなーと思い。

@sigprogramming
Copy link
Contributor Author

sigprogramming commented Mar 9, 2025

「入力を開始した位置のBPMが変更される」と「入力を確定した位置のBPMが変更される」ですが、
どちらも一長一短かなと思います。

  • 入力を開始した位置のBPMが変更される & BPM区間が変わっても入力中の値が消えない
    • 再生位置=変更したいBPM区間のときに入力を開始することが多いと思うので、その点では良さそう
    • 入力中にBPM区間が変わった場合に「入力を開始した位置」と「入力を確定した位置」どちらのBPMが変更されるのか分からない(予測可能なUIではなく、実際に試さないと分からない)
    • 再生中はオートスクロールが有効なので、入力中に変更対象のBPM区間が画面外に行く場合がある
  • 入力を確定した位置のBPMが変更される & BPM区間が変わったら入力中の値が消える
    • 再生位置のBPM区間が変更されるということが分かりやすい
    • 入力中にBPM区間が変わると入力中の値が消えてしまう
      • 入力確定の直前にBPM区間が変わって入力内容が消え、BPMは変更されず、ユーザーはそのことに気づかない、というのも起こるかも
    • Cubaseはこの仕様でした

「入力を確定した位置のBPMが変更される」形にする場合は、BPM区間が変わったら入力中の値が消えるようにすると、再生位置のBPM区間が変更されるということが分かる(予測可能な)UIになると思います。
(一旦 #2603 の形で実装で良いと思います)

一長一短なので、どちらの仕様でも良いと思います、エディター全体で仕様を合わせるのが大事かなと思います。

@Hiroshiba
Copy link
Member

「入力を確定した位置のBPMが変更される」形にする場合は、BPM区間が変わったら入力中の値が消えるようにすると、再生位置のBPM区間が変更されるということが分かる(予測可能な)UIになると思います。

たしかにです。
もしかしたらHTML要素の仕様で実現がとても難しい、ということはありえそう。
その場合はごちゃごちゃにするより、まあこういうものだと割り切っても良いかも・・・・。

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
Projects
None yet
2 participants