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

Add: BPM・拍子変更機能を追加 #2303

Open
wants to merge 99 commits into
base: main
Choose a base branch
from

Conversation

sevenc-nanashi
Copy link
Member

@sevenc-nanashi sevenc-nanashi commented Oct 18, 2024

内容

タイトル通りです。

関連 Issue

close #1919

スクリーンショット・動画など

image

その他

現時点でもダイアログの挙動自体はStorybookから確認出来ます。

() => lastTimeSignature.value.measureNumber === currentMeasure.value,
);

const contextMenuHeader = computed(() => `${currentMeasure.value}小節目`);
Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

ここは #2306 の形式で出そうかな~って思ってます。

@sevenc-nanashi sevenc-nanashi marked this pull request as ready for review October 19, 2024 16:16
@sevenc-nanashi sevenc-nanashi requested a review from a team as a code owner October 19, 2024 16:16
@sevenc-nanashi sevenc-nanashi requested review from Hiroshiba and removed request for a team October 19, 2024 16:16
Comment on lines 10 to 22
<QSelect
v-model="timeSignatureChange.beats"
:options="beatsOptions"
mapOptions
emitValue
dense
userInputs
optionsDense
transitionShow="none"
transitionHide="none"
class="value-input"
aria-label="拍子の分子"
/>
Copy link
Contributor

@sigprogramming sigprogramming Nov 19, 2024

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

分子のQSelectですが、ドロップダウンが下ではなく上に表示されて選択しづらくなってるかも。
type="number"QInputにするのが良さそうに思いました。

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

確かにちょっと気になるなと思いました!

QInputにすれば上下矢印ボタンが出てくるのでコンパクトでいいかもですね!
あるいは高さをちょっと制限してあげると大体の UI で下に出てくれるかも。
popupContentStyleとかpopupContentClassheight: を指定してあげると高さ制限できそうでした!

Copy link
Contributor

@romot-co romot-co left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@sevenc-nanashi
こちら実装ありがとうございます!グリッドのあたりなどすごい&storybook便利です…!
動作についてざっと確認しましたが問題なかったです。
(テンポ変更できてとても楽しい)

LGTMです!

ちょっと変更するならの参考意見

エンベロープとかやらない・レーン分けたりしない前提で
いちおうUI面で少ない変更でできそうな案として:

  • メニュー上の選択は拍子もしくはテンポの片方だがモーダルでは同時編集できる
  • 削除に迷う(両方OFFで削除に見えない)

のがありそうなので

ルーラークリック時のメニューにおいて:

  • 新規追加:「テンポ・拍子の追加」で1つにまとめる / モーダル内ではデフォルト両方ON
  • 編集:「テンポ・拍子の編集」として1つにまとめる
  • 削除: クリックで該当部のテンポ・拍子を削除

というのはどうでしょうか。

むろん現状でも問題ないと思います!


表示の調整

ルーラー全体として考えないといけないかな?なので
表示面の細かい調整は
ループ実装のときにあわせてできれば@sevenc-nanacさんと協力して修正できればと思っています…!


たぶん変更しなきゃいけない点として:

ピッチをテンポ・拍子変更にあわせて描画変えなきゃなのはありますが
こちらは別途がよさそうかなと個人的には!
スクリーンショット 2024-11-20 2 05 31

@Hiroshiba
Copy link
Member

@romot-co さんのちょっと変更意見なるほどです!
これってつまりテンポ・拍子が一緒になっているときは一緒に編集・削除を可能にして、新規挿入する場合も一緒に突っ込まれる・・・みたいな感じでしょうか 👀

ちょっと素人的意見なので微妙なこと言ってるかもなのですが、テンポと拍子って大体の場合片方だけいじりたいことの方が多いのかな~と思っていて、だとしたら興味あるものだけを表示して操作可能にした方がわかりやすいかも・・・・?と個人的に思いました!

ただ 削除に迷う(両方OFFで削除に見えない) はなるほどでした。確かにそうかも。
メニューでの表示を「拍子を削除」「テンポを削除」「削除」にするとかもありかも。(さすがに並びすぎて微妙かも・・・)

Copy link
Member

@Hiroshiba Hiroshiba left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

📝 const hoveredTempoOrTimeSignatureChange = ref<number | null>(null);辺りまで見ました!

主に UI 回りや、ちょっとした実装周りについてコメントしています。

ちょっと色んな事情を知らずにコメントしてる点もあると思うので、違和感あったりしたら結構気軽に教えていただけると 🙇

}"
@click="onClick"
@contextmenu="onContextMenu"
@mousemove="updateHoveredTempoOrTimeSignatureChange"
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

(ただのコメントです)

tempoOrTimeSignatureChange、もっと縮めたい気持ちありますね!
動画編集でよくある感じだと、keypointとか?
まあ議論大変だしいったんこのでも良さそう!

Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

DAWではAメロ、Bメロ、サビ等の開始位置に目印をつけることができて、目印のことをマーカーと呼びます。
https://www.g200kg.com/jp/docs/dic/marker.html

このマーカーと被るので(後々のことを考えて)、別の名前が良いかもと少し思いました。
(他に良さそうな名前がなければマーカーでも良いと思います)

Copy link
Member

@Hiroshiba Hiroshiba Nov 22, 2024

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

マーカーありだと思います!
まあSigさんの仰るとおり、任意位置につけれる、プログラムにとって意味のないラベルみたいなののイメージはあるかも。
けどたぶんこの名称はこのコンポーネントで閉じる気がするので、意外となんでも良いのかも。

別案として、「転換点」だと「Turning Point」(ターニングポイント)ですが、ちょっとドラマチックすぎる気がしますね・・・。
ということでChangingPointとかChangePointとかどうでしょう!

displayType: "full" | "ellipsis" | "hidden";
};

const hoveredTempoOrTimeSignatureChange = ref<number | null>(null);
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

この名前だと型はTempoOrTimeSignatureChangeが良さそう?

Comment on lines +101 to +106
@click.stop="
onTempoOrTimeSignatureChangeClick(
$event,
tempoOrTimeSignatureChange,
)
"
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

ちょっとUI迷ってるのですが、左クリックと右クリックが同じ動作なの不思議かもとちょっと思いました。
可能なら、左クリックは「編集」開始が良いかも・・・?
ただその場合だと、一括編集UIを用意するか、個別にクリック可能にする必要が出てきそう。。。。

うーん! 一旦コメントまで🙇
(意見聞きたみ!)

Comment on lines 15 to 20
<slot
name="contextMenu"
:header="contextMenuHeader"
:menudata="contextMenudata"
:onContextMenuMounted="(el) => (contextMenu = el)"
/>
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Contextを親から渡してる理由聞きたみ・・・!
(子側にもたせるとかなり簡潔になりそうなので)

Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

ContextMenuが内部でStoreを使ってるからですね。これをしないとStorybookが死にます

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

あーーーなるほどです!!!!!
これ理想的にはContextMenuもPresentationがあって、SequencerRuler/Presentation.vueはそれを参照する形が最高な気がします。

すみません、ここかなり複雑になってしまっているのでリファクタリングお願いしてもいいでしょうか 🙇
このプルリクエストで変更してしまってもいいと思います。最高なのは別プルリクエストになってることですが・・・!
(かなりもう長くなっているので経験上分けた方が色々楽かもではある)

src/store/singing.ts Show resolved Hide resolved
Comment on lines +45 to +54
const screenshots = await fs.readdir(
`${import.meta.dirname}/スクリーンショット.spec.mts-snapshots/`,
);
for (const screenshot of screenshots) {
if (!currentStories.some((story) => screenshot.startsWith(story.id))) {
await fs.unlink(
`${import.meta.dirname}/スクリーンショット.spec.mts-snapshots/${screenshot}`,
);
}
}
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

(ただのコメントです)

不要なの消えるようにしてくださった感じですよね、ありがとうございます!!! 便利!!

もしよければこんな感じでプルリクと完全に分けられるものはサクッと別プルリクエストいただけると結構嬉しかったりします!
まあ割とでかいものにくっついてるとなかなかマージされなかったりするので、くらいの違いですが・・・!

とはいえmainブランチと行き来するのちょっと面倒だとは思うので、こんな感じで何かにくっつけてでももちろんかなりありがたいです 🙏

Copy link
Member

@Hiroshiba Hiroshiba Nov 20, 2024

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

かなり迷いどころですが、このコンポーネントはさすがにSingの下にあった方が管理しやすいかも。

見てみた感じ、SongExportもSing側に移しても良さそうかも。
まあマージ後の気がついたタイミングで移して行くとかでも良さそう!

src/components/Sing/SequencerGrid/Presentation.vue Outdated Show resolved Hide resolved
@romot-co
Copy link
Contributor

@Hiroshiba

@romot-co さんのちょっと変更意見なるほどです! これってつまりテンポ・拍子が一緒になっているときは一緒に編集・削除を可能にして、新規挿入する場合も一緒に突っ込まれる・・・みたいな感じでしょうか 👀

ちょっと素人的意見なので微妙なこと言ってるかもなのですが、テンポと拍子って大体の場合片方だけいじりたいことの方が多いのかな~と思っていて、だとしたら興味あるものだけを表示して操作可能にした方がわかりやすいかも・・・・?と個人的に思いました!

一緒につっこむべきというよりは、現状は実質両方編集できる形なのでそれを素直に表したほうがいいかも?ぐらいの意図となります!
削除の件が大きいです


おっしゃるとおりいじりたいものだけいじれればいい形かと思います!

個人的には拍子・テンポ・あとキーなどは別個に扱って、
それぞれレーン自体をわけるのがいいかなーと思っています…!

各要素追加できる・編集できる・削除できる・移動できる…などを考えると
追加したらマーカー「3/4」などが追加され、それを選択して右クリックやダブルクリックで編集・削除、必要あれば移動…といった感じかなーと

どちらかというと、削除わかりづらいかも?が大きかったので、

メニューでの表示を「拍子を削除」「テンポを削除」「削除」にするとかもありかも。(さすがに並びすぎて微妙かも・・・)

このメニューに削除追加する形でよさそうです…!

@sigprogramming
Copy link
Contributor

@romot-co
もしかしたらローカルブランチが最新でないかもです…!
(ピッチ表示が直っているのと、テンポと拍子でダイアログが分かれてます)

@romot-co
Copy link
Contributor

@sigprogramming x
ありがとうございます!
こちら最新の取り込み漏れでした(ごめんなさい…!

Comment on lines +9 to +12
const getTextWidthCacheKey = (text: string, font: FontSpecification) =>
`${text}-${font.fontFamily}-${font.fontWeight}-${font.fontSize}`;

const textWidthCache = new Map<string, number>();
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

ブランド型にするとミスを無くせるかも。
意外と簡単にできたりします。

Suggested change
const getTextWidthCacheKey = (text: string, font: FontSpecification) =>
`${text}-${font.fontFamily}-${font.fontWeight}-${font.fontSize}`;
const textWidthCache = new Map<string, number>();
type CacheKey = string & { __brand: "CacheKey" };
const getTextWidthCacheKey = (text: string, font: FontSpecification) =>
`${text}-${font.fontFamily}-${font.fontWeight}-${font.fontSize}` as CacheKey;
const textWidthCache = new Map<CacheKey, number>();

}"
@click="onClick"
@contextmenu="onContextMenu"
@mousemove="updateHoveredTempoOrTimeSignatureChange"
Copy link
Member

@Hiroshiba Hiroshiba Nov 22, 2024

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

マーカーありだと思います!
まあSigさんの仰るとおり、任意位置につけれる、プログラムにとって意味のないラベルみたいなののイメージはあるかも。
けどたぶんこの名称はこのコンポーネントで閉じる気がするので、意外となんでも良いのかも。

別案として、「転換点」だと「Turning Point」(ターニングポイント)ですが、ちょっとドラマチックすぎる気がしますね・・・。
ということでChangingPointとかChangePointとかどうでしょう!

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

Successfully merging this pull request may close these issues.

ソング:小節追加の挙動を良い感じにする
4 participants