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

project-s: MIDIファイルとMusicXMLファイルをインポートする機能を追加 #1018

Merged

Conversation

sigprogramming
Copy link
Contributor

内容

MIDIファイルとMusicXMLファイルをインポートする機能を追加します。

MusicXMLを扱えるライブラリで導入しやすそうなものが見つからなかったので、ひとまずパース処理を実装しました。
簡単な楽譜で動作を確認していますが、読み込めない楽譜もあるかもしれません…
また、showImportFileDialogで、ファイルの種類を指定できるように変更しています。

レビューよろしくお願いいたします。

関連 Issue

ref VOICEVOX/voicevox_project#15
ref #981

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.

LGTM!!

xmlの読み込み周り大変だったと思います、お疲れ様でした&ありがとうございます!!

src/store/singing.ts Outdated Show resolved Hide resolved
@sigprogramming
Copy link
Contributor Author

レビューありがとうございます!
関数名を修正しました!

また、MIDIインポートでテンポ・拍子の位置が変換できていなかったのと、
MusicXMLインポートで読めていなかった要素を読むように修正しました!

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.

@sigprogramming @Hiroshiba
こちらレビュー遅くなり大変失礼いたしました…!
MIDI/MusicXML読み込みが問題なくできること確認いたしました!!(MusicXMLすごいです)

1点メモのみ追記いたしましたが、当面問題なさそうと考えております!

src/store/singing.ts Outdated Show resolved Hide resolved
@romot-co
Copy link
Contributor

romot-co commented Nov 19, 2022

@sigprogramming
LGTM!!ありがとうございます!!!
あわせて簡単な和音でのMIDI/MusicXMLもつくってみて確認いたしまして、そちらでも問題なさそうでした!

(こちらレビュー遅くなり大変失礼いたしました…!)

@sigprogramming
Copy link
Contributor Author

sigprogramming commented Nov 19, 2022

@romot-co
楽譜での確認ありがとうございます!
すみません、トップノート以外のノートと重なりを判定する処理は過剰だったので、その箇所を削除して、トップノートとのみ判定するようにしました…!(ご確認いただいた後で大変申し訳ありません…)
ほぼ同じ結果になることと(楽譜でも確認しました)、一般的な楽譜ではこの形で大丈夫だと思うので、問題なければひとまずこれでマージしたいと思います!

何度もレビューいただいて申し訳ないです…!ありがとうございました!

@sigprogramming sigprogramming merged commit 7a45861 into VOICEVOX:project-s Nov 19, 2022
@sigprogramming sigprogramming deleted the feature/import_score_data branch November 20, 2022 01:10
const tempos = midi.header.tempos
.map((tempo) => ({
position: convertToPosBasedOnRes(tempo.ticks),
tempo: round(tempo.bpm, 2),
Copy link
Member

Choose a reason for hiding this comment

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

@sigprogramming
昔のプルリクなのにすみません、ちょっとここの質問が!
こちらでbpmをroundしている意図はなんでしょう 👀

というのも、曲が長い場合ずれそうだな~と思ったためです。
もし表示がずれる感じであれば、たぶん致命具合は 表示がずれる < タイミングがずれる なのでround外したほうが良いのかなと思ったり、という感じです!

(文脈)
#2104 (comment)

Copy link
Contributor Author

@sigprogramming sigprogramming Jun 8, 2024

Choose a reason for hiding this comment

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

roundはSMF(スタンダードMIDIファイル)作成時のテンポ情報の誤差を無くす目的で行っています!

SMFでは、メタイベントのセットテンポイベントがテンポ情報を持っています。
このテンポ情報はBPMではなく「4分音符あたりのマイクロ秒」の形になっていて、SMF作成時、

$$(60 \times 10 ^ 6) \div \text{bpm}$$

が割り切れない場合に小数点以下が切り捨てられ、誤差が発生します。
例えば、BPM299のとき

$$\lfloor (60 \times 10 ^ 6) \div 299 \rfloor = 200668$$ $$(60 \times 10 ^ 6) \div 200668 = 299.00133...$$

となり、約0.0013の誤差が発生します。(BPM300以下ではこれが最大の誤差です)

BPMは300以下であることがほとんどなのと、少数第3位まで設定することはほとんどないと思うので、少数第3位で四捨五入(round(tempo.bpm, 2))してSMF作成時の誤差を無くしています。

Copy link
Member

Choose a reason for hiding this comment

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

なーーーーるほどです!!!! 非常によくわかりました、ありがとうございます!!!

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.

3 participants