Git Product home page Git Product logo

titalyver2's People

Contributors

juna-idler avatar

Stargazers

 avatar  avatar  avatar

Watchers

 avatar

Forkers

mchubby

titalyver2's Issues

iTunes

問題というかただのメモというか日記

なんか星があったので辿ってみたら、いまさらiTunesの操作方法が分かった。
昔も少し探してみたんだけど、見つからないままモチベがなくなったんだよね。
まあiTunesの何がダメってFlacにすら対応してないってのがね。
(そもそも当時のロスレス保存にはWavPackをつかってたんで論外だけど)
そして時が流れて今はサブスクでストリーミングでファイルすらない時代か。

というわけで、行折り返しの実装のめんどくささから逃れるために、適当に組んで割と簡単にできたけど、
シークバーでシークしたときに飛んでくる都合のいいコールバックがない?またポーリング案件か!
あとOnPlayerPlayingTrackChangedEventが死んでるの完全放置ってどうなん?

行の背景色フェード

カラオケ表示が重いのは半分諦めるとして、
行同期でも行の移行時に文字と背景の色をフェードしているので瞬間的には結構重くなる。

正直文字色フェードはそこまで効果的でないので軽量化のためにはカットしてもいい気がするのだが、
背景色フェードは残しておきたい。
しかしアクティブ背景色描画だけを分離しようとすると結構構造を考え直さないといけないので、これも長い目で見る。

歌詞読み込みプラグイン

Lyrics Search Listにplugin:を追加して、特定のインターフェイスを持つDLLで歌詞を検索できるようにする。
絞り込めないときは複数個の歌詞を返して#22 なんてこともできそう。

他の方法としてはexe:で.exeファイルを指定して標準出力をもらうとか。

とりあえず次に必要な機能

音楽プレイヤーとの連携機能(いまだfoobar2000のプラグインぐらいしかしらんけど)
ということでfoobar2000のプラグインとファイルマッピングによるプロセス間通信(前のがあるけどウィンドウメッセージを併用してるのでこいつも作り直す)

歌詞探索の別スレッド化

プラグイン探索の追加で時間が掛かった場合UIが停止するのを回避する。

まあ歌詞を表示するしか能のないアプリなので、読み込み中に止まってても実はたいして問題ないけど、
プラグインが内部で無限ループやデッドロックした時とかの対応としても必要か。

タイミング調整

一つ必要な機能が抜けていた。
指定した時間だけずらす機能。
残った左下を使うときか。

位置とサイズ

Window位置制限を実装したので、いい加減「前回起動時の位置とサイズを保存」をやるか。
最初にやっとけ案件だが、最初はとにかくまともに動かすことだけに必死だったからなぁ。

オートスクロール停止

オートスクロールをWPFのアニメーションで処理しているが、
どうもマルチスレッド処理に失敗して止まることがある。

具体的には、設定の空白関係の値を変更したとき表示を補正するためスクロール値を変更しているときにオートスクロールと被ると発生しやすいっぽい。

受信データ表示

めちゃくちゃ今更だが、プレイヤーから受け取ったメタデータを表示する機能があればデバッグするときにも便利なのに全く思いつかなかった事実。
受け取ったJSONをインデント表示するだけで終わるし。
というのをSpotifyMessenger(送信側)を見て思った。
2021-09-26

KaraokeLine

行同期を実装しろ。

ついでにGetGlyphOutlineでマルチコードポイントなUnicodeのグリフの取り方がさっぱりわからんので、
やっぱりFomattedTextで実装したほうがいいんじゃないか説。
一文字のWidthIncludingTrailingWhitespaceがAdvanceWidthsと同じならいいんだけど。

折り返し

一行の幅が足りない時折り返して表示する。

細かくないから書き忘れていた。
ただし大分めんどくさい(禁則処理とか)のでまあぼちぼち。

Bug: LyricsSearcher.Search() called with invalid path when file being played has a # sign

Description

再生されている曲のパスに「#」記号が含まれている場合は、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)

Steps to reproduce

  1. Create a folder fulfilling the conditions, for example "C:\EXTRACT\new #dir"
  2. Put a media file inside, e.g. "C:\EXTRACT\new #dir\hello.mp3". The file must have valid metadata.
  3. Play in foobar2000 with installed messenger

string lp = string.IsNullOrEmpty(data.FilePath) ? "" : new Uri(data.FilePath).LocalPath;
string text = LyricsSearcher.Search(lp, data.MetaData);

Expected outcome

The first parameter to Search should be C:\EXTRACT\new #dir\hello.mp3 for correct processing.

Observed situation

lp is C:\EXTRACT\new (with a trailing space)

プロセス間通信の見直し

今のところEventWaitHandleを起点にしてるけど、正直ベストマッチという感じはしてない。
かといって代替策があるわけでもないんだが、NamedPipeで上手い事いかないかなー?

あとMusicBeeのプラグインを触ったことで、foobar2000をベースにしてたイベントメッセージも見直したいところ。

歌詞データベース

こういうのやってるとやっぱり歌詞のデータベースを考えたくなる。
とはいえサーバ代もJASRAC代も払う余裕は無いのだが。

というわけでMongoDB AtlasNapkinでなんとなく体験。
とりあえず思い付きで組んだ構造はこんなの

{
"_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から以下略

なんなら両方まとめるのもアリか。

細かい部分

基本部分は大体できた感じなので、
気が付いた細かい部分も書き残していく。

設定画面

  • 右上に閉じるアイコンが欲しい
    WindowStyle=Noneをやめようかとも思ったが、やっぱりやめるのやめて手作りボタンを置いた
  • 左下にSaveがあるならLoadもいる? あと設定ファイルのフォルダ位置
    とりあえず設定フォルダ位置
    むしろ手動でExeフォルダにJSONでシリアライズという手も
  • NumericUpDownのデザインはアレでいいのか?
    とりあえずいいか。
  • 多言語対応とか文字が少ないから練習としていいかも。そういや説明やヘルプが全くなかった
    まあ後でいいや
  • 非同期歌詞や歌詞無しの設定をもうちょっと
  • 色選択が超やっつけテキスト入力だけどカラーピッカーやっぱりいる?
    とりあえずいいか。

メイン画面

  • サイズ変更が右下グリップだけでいいのかな。
    移動制限と同時に実装。ボタンのせいで結局右下以外斜めサイズ変更使えないけど。

  • 画面上最大化が入ると戻せない
    最大化出来るようにすればいい

  • ドラッグ移動時に移動制限があったほうがやっぱ便利かな。
    マルチディスプレイを考えるとめっちゃめんどそう
    とりあえずメインのディスプレイだけで実装してみた

MusicBeeのプラグイン

設定画面をやるといいながら、なんとなくMusicBeeのプラグインに手を出してしまい半日、ようやく動くところまできた。

何が一番面倒だって、.NET Framework4 でJSONどうしよう?っていう割としょうもない部分。
System.Text.Jsonは使えない(いやインストールすれば使えるけどめちゃくちゃDLLが付属する)
Newtonsoft.JsonもDLLがデカい。あと今回の用途には微妙に合ってない。
結局DataContractJsonSerializerを使えば数行でなんとかなった(それでもFramework4.5が必要だったけど)

というわけで同期しない歌詞も早めに表示できるようにしたい。

@rubyの部分付与バグ

@rubyによる部分ルビ振りが既存ルビ部分を検索対象にしない

例えば
@ruby=[宇宙]0,1[そ]
@ruby=[宇宙]1,1[ら]
とした場合、一つ目で「|宇《そ》宙」的な内部状態になり、二つ目の「宇宙」がヒットしなくなり「ら」が付与されない。

スクロールをWPFアニメーションでやらない

オートスクロールをWPFのアニメーションの実験として実装して、そこそこうまくいっていたんだが、
特定の用法でいろいろ粗が出てきたので、自前で時間から位置を計算する方式に変えたいかな。

設定画面の前に

KaraokeLineの設定項目を整理しておきたかった。
必要なのも足りてないし。

  • 背景色
  • パディング
  • テキスト配置
  • 行の高さやルビと本文間の微調整

他何かあるかな?

歌詞ローカル保存機能

プラグインで(ネット経由から)歌詞を持ってくることを考えると、やっぱりこれも欲しいところ。

実装はどうとでもなるとして、設定をどうするか。

設定画面

基本的な機能は出来たので、そろそろいい加減各種設定画面に手を付けるか。

やること

(CloseしてないIssues残してるけど)個人で思いつくことは大体やれた気がする。ので、
明確にやり残しているカラオケの折り返しの実装と、あとは全体的な描画の高速化がやるべきことではあるのだが、
モチベーションはあんまり高くない。

歌詞ファイル入力処理

次、歌詞ファイル入力処理
音声ファイルの情報からパスを任意に構築できるようにして
それのリストを上から順に試す。まあ前と一緒。

プラグインを指定できるようにしてもっと複雑な処理を出来るように出来ればいいなと妄想するのも前と一緒。

複数歌詞切り替え

現在はSettings > Lyrics > Serch List(aが抜けてるやん)で、有効なテキストが見つかった時点で歌詞として読み込んでいるが、
全部試したうえで全ての有効なテキストを確保しておき、複数ある場合は画面上の簡単な操作で切り替え出来るようにする。

#23 を考えた場合、常に全部試すのはちょっと問題があるか。
有効なテキストが一つ以上確保されている場合に途中でも探索を打ち切るコマンド、とかあればいいのかな?

表示全体のコントロール化

一行表示コントロールを作ってからはひたすらMainWindowに書き殴っているんだが、
ほかの機能も追加しようとするならば、まとめて分離したいところ。
こういう時はカスタムコントロールじゃなくて、ユーザーコントロールを使えばいいのか?

なんかバグ

Titalyver 2021_07_18 8_04_38

今調べるのはしんどいので、スクショだけ張っておく。

手動探索機能

手動でパラメータを設定した特定の探索コマンドを実行できるようにする。
タイトルやアーティスト名に付加情報が付いていてプラグインの検索がうまくいかないときなどに。

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.