juna-idler / titalyver2 Goto Github PK
View Code? Open in Web Editor NEWlrcファイル、いわゆるタイムタグ付き歌詞ファイルを音楽に合わせて表示します
License: MIT License
lrcファイル、いわゆるタイムタグ付き歌詞ファイルを音楽に合わせて表示します
License: MIT License
問題というかただのメモというか日記
なんか星があったので辿ってみたら、いまさらiTunesの操作方法が分かった。
昔も少し探してみたんだけど、見つからないままモチベがなくなったんだよね。
まあiTunesの何がダメってFlacにすら対応してないってのがね。
(そもそも当時のロスレス保存にはWavPackをつかってたんで論外だけど)
そして時が流れて今はサブスクでストリーミングでファイルすらない時代か。
というわけで、行折り返しの実装のめんどくささから逃れるために、適当に組んで割と簡単にできたけど、
シークバーでシークしたときに飛んでくる都合のいいコールバックがない?またポーリング案件か!
あとOnPlayerPlayingTrackChangedEventが死んでるの完全放置ってどうなん?
カラオケ表示が重いのは半分諦めるとして、
行同期でも行の移行時に文字と背景の色をフェードしているので瞬間的には結構重くなる。
正直文字色フェードはそこまで効果的でないので軽量化のためにはカットしてもいい気がするのだが、
背景色フェードは残しておきたい。
しかしアクティブ背景色描画だけを分離しようとすると結構構造を考え直さないといけないので、これも長い目で見る。
Lyrics Search Listにplugin:
を追加して、特定のインターフェイスを持つDLLで歌詞を検索できるようにする。
絞り込めないときは複数個の歌詞を返して#22 なんてこともできそう。
他の方法としてはexe:
で.exeファイルを指定して標準出力をもらうとか。
音楽プレイヤーとの連携機能(いまだfoobar2000のプラグインぐらいしかしらんけど)
ということでfoobar2000のプラグインとファイルマッピングによるプロセス間通信(前のがあるけどウィンドウメッセージを併用してるのでこいつも作り直す)
プラグイン探索の追加で時間が掛かった場合UIが停止するのを回避する。
まあ歌詞を表示するしか能のないアプリなので、読み込み中に止まってても実はたいして問題ないけど、
プラグインが内部で無限ループやデッドロックした時とかの対応としても必要か。
一つ必要な機能が抜けていた。
指定した時間だけずらす機能。
残った左下を使うときか。
Window位置制限を実装したので、いい加減「前回起動時の位置とサイズを保存」をやるか。
最初にやっとけ案件だが、最初はとにかくまともに動かすことだけに必死だったからなぁ。
オートスクロールをWPFのアニメーションで処理しているが、
どうもマルチスレッド処理に失敗して止まることがある。
具体的には、設定の空白関係の値を変更したとき表示を補正するためスクロール値を変更しているときにオートスクロールと被ると発生しやすいっぽい。
めちゃくちゃ今更だが、プレイヤーから受け取ったメタデータを表示する機能があればデバッグするときにも便利なのに全く思いつかなかった事実。
受け取ったJSONをインデント表示するだけで終わるし。
というのをSpotifyMessenger(送信側)を見て思った。
行同期を実装しろ。
ついでにGetGlyphOutlineでマルチコードポイントなUnicodeのグリフの取り方がさっぱりわからんので、
やっぱりFomattedTextで実装したほうがいいんじゃないか説。
一文字のWidthIncludingTrailingWhitespaceがAdvanceWidthsと同じならいいんだけど。
一行の幅が足りない時折り返して表示する。
細かくないから書き忘れていた。
ただし大分めんどくさい(禁則処理とか)のでまあぼちぼち。
再生されている曲のパスに「#」記号が含まれている場合は、new Uri(data.FilePath).LocalPath
は無効になります。
When the path of the song being played contains a "#" sign, GetLyrics() gives an incorrect result because new Uri(data.FilePath)
truncates the path early.
(Note: only visible if relying on one of "%directoryname%" "%filename%", "%filename_ext%", "%path%" in the lyrics search path)
Titalyver2/Titalyver2/MainWindow.xaml.cs
Lines 118 to 119 in f511e26
The first parameter to Search should be C:\EXTRACT\new #dir\hello.mp3
for correct processing.
lp
is C:\EXTRACT\new
(with a trailing space)
今のところEventWaitHandleを起点にしてるけど、正直ベストマッチという感じはしてない。
かといって代替策があるわけでもないんだが、NamedPipeで上手い事いかないかなー?
あとMusicBeeのプラグインを触ったことで、foobar2000をベースにしてたイベントメッセージも見直したいところ。
こういうのやってるとやっぱり歌詞のデータベースを考えたくなる。
とはいえサーバ代もJASRAC代も払う余裕は無いのだが。
というわけでMongoDB AtlasとNapkinでなんとなく体験。
とりあえず思い付きで組んだ構造はこんなの
{
"_id":{"$oid":"61388571230336f3e3f53c38"},
"Title":"運命のEngagement",
"Artist":"鈴木このみ",
"Album":"17 SEVENTEEN",
"Comment":"オンラインシミュレーションRPG「エンゲージナイツ~新約英雄大戦~」テーマソング",
"sync":"karaoke",
"url":"https://juna.hatenablog.jp/entry/2021/09/07/122651",
"picker":"<pre>(.+)</pre>",
"replacers":["<[^>]+>\u0000"]
}
JASRACにお金を払いたくないのなら、歌詞を持たなければいいじゃない。
どこか合法なページにある歌詞を正規表現だけで頑張ってスクレイピングする。
あともう一つの案としては、
タイムタグ情報 DataBaseと同じように抽象化した時間情報だけを保持して、対応する歌詞を合法なページのURLから以下略
なんなら両方まとめるのもアリか。
基本部分は大体できた感じなので、
気が付いた細かい部分も書き残していく。
設定画面
メイン画面
サイズ変更が右下グリップだけでいいのかな。
移動制限と同時に実装。ボタンのせいで結局右下以外斜めサイズ変更使えないけど。
画面上最大化が入ると戻せない
最大化出来るようにすればいい
ドラッグ移動時に移動制限があったほうがやっぱ便利かな。
マルチディスプレイを考えるとめっちゃめんどそう
とりあえずメインのディスプレイだけで実装してみた
なんか変な歌詞が表示されたときにソースを判別できるように。
超その場しのぎでいいなら、とりあえず右クリックメニューにでも追加するか。
設定画面をやるといいながら、なんとなくMusicBeeのプラグインに手を出してしまい半日、ようやく動くところまできた。
何が一番面倒だって、.NET Framework4 でJSONどうしよう?っていう割としょうもない部分。
System.Text.Jsonは使えない(いやインストールすれば使えるけどめちゃくちゃDLLが付属する)
Newtonsoft.JsonもDLLがデカい。あと今回の用途には微妙に合ってない。
結局DataContractJsonSerializerを使えば数行でなんとかなった(それでもFramework4.5が必要だったけど)
というわけで同期しない歌詞も早めに表示できるようにしたい。
オートスクロールをWPFのアニメーションの実験として実装して、そこそこうまくいっていたんだが、
特定の用法でいろいろ粗が出てきたので、自前で時間から位置を計算する方式に変えたいかな。
KaraokeLineの設定項目を整理しておきたかった。
必要なのも足りてないし。
他何かあるかな?
プラグインで(ネット経由から)歌詞を持ってくることを考えると、やっぱりこれも欲しいところ。
実装はどうとでもなるとして、設定をどうするか。
基本的な機能は出来たので、そろそろいい加減各種設定画面に手を付けるか。
(CloseしてないIssues残してるけど)個人で思いつくことは大体やれた気がする。ので、
明確にやり残しているカラオケの折り返しの実装と、あとは全体的な描画の高速化がやるべきことではあるのだが、
モチベーションはあんまり高くない。
次、歌詞ファイル入力処理
音声ファイルの情報からパスを任意に構築できるようにして
それのリストを上から順に試す。まあ前と一緒。
プラグインを指定できるようにしてもっと複雑な処理を出来るように出来ればいいなと妄想するのも前と一緒。
現在はSettings > Lyrics > Serch List(aが抜けてるやん)で、有効なテキストが見つかった時点で歌詞として読み込んでいるが、
全部試したうえで全ての有効なテキストを確保しておき、複数ある場合は画面上の簡単な操作で切り替え出来るようにする。
#23 を考えた場合、常に全部試すのはちょっと問題があるか。
有効なテキストが一つ以上確保されている場合に途中でも探索を打ち切るコマンド、とかあればいいのかな?
一行表示コントロールを作ってからはひたすらMainWindowに書き殴っているんだが、
ほかの機能も追加しようとするならば、まとめて分離したいところ。
こういう時はカスタムコントロールじゃなくて、ユーザーコントロールを使えばいいのか?
手動でパラメータを設定した特定の探索コマンドを実行できるようにする。
タイトルやアーティスト名に付加情報が付いていてプラグインの検索がうまくいかないときなどに。
A declarative, efficient, and flexible JavaScript library for building user interfaces.
🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
An Open Source Machine Learning Framework for Everyone
The Web framework for perfectionists with deadlines.
A PHP framework for web artisans
Bring data to life with SVG, Canvas and HTML. 📊📈🎉
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
Some thing interesting about web. New door for the world.
A server is a program made to process requests and deliver data to clients.
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
Some thing interesting about visualization, use data art
Some thing interesting about game, make everyone happy.
We are working to build community through open source technology. NB: members must have two-factor auth.
Open source projects and samples from Microsoft.
Google ❤️ Open Source for everyone.
Alibaba Open Source for everyone
Data-Driven Documents codes.
China tencent open source team.