Archive for the ‘日記’ Category

GPMDPの改良。音量の正規化の改良について考えていたら、確か、以下のようなことだったと思うが、GPMDPでなく、外部プレーヤーで再生た方がいいのではないかということになった。

  • GPMDPの構造上避けられない、曲の開始と同時に一時停止しても先頭が一瞬再生されることがある問題は、外部プレーヤーを使わないと避けられない。
  • 再生ゲインの計算のために曲のファイルをキャッシュしているのだから、そのファイルをVLCやgmusicbrowser (GMB)などの外部のプレーヤーで再生することができる。
  • 再生ゲイン対応のプレーヤーなら、音量(ボリューム)の設定やファイルにを再生ゲインを乗算しなくても、再生ゲインタグに設定するだけで、音量が正規化されるのも良さそう。
  • GPMDPは使い勝手がいいとは言えないし、リモコンを2個にしたり、2つのプレーヤーの切り替えもしたくないので、操作性を改善する点でもGMBで再生したい。

いずれにしても、昨夜までに構想が練り上がった気がしたし、基本的なところは容易にできそうだったので、今朝、GPMの曲をGPMDPでなく外部プレーヤーで再生できるようにしようとする作業を初めてしまった。そして、確かに、再生できるようにすること自体は簡単だった。14時前には、GMBで再生できるようになった。

GPMの曲をGMBで再生

図の左上はGMBのミニプレーヤーで、右はGPMDPのウインドウである。GPMDPが再生しているように見えるGPMの曲は、実際にはGMBで再生されている。その証拠に、双方で同じ曲・アルバムになっているし、僕はこのアルバムは持っていないし、GPMDPの再生時間は0だが、GPMは0ではない。

が、やっぱり難航し、この時間になっても終わっていない。残っている難しいことは、以下である。

  • 次に再生する曲を途切れないようにGMBに送り続ける(今は、最初の1曲の再生が終わったら停まってしまう)。また、ギャップレス再生のためには、再生中の曲が終わる前に送る必要がある。
  • GMBとGPMDPの連携 (例: GMBの再生が終わったことを検出して、次の曲を再生開始する)
  • GMBとGPMDPの操作の統合 (例:GPMDPで一時停止したら、GMBを一時停止させる)。GMBに統一すればいいのだが、曲の検索など、どうしてもGPMDPでしかできないことがある。まだ、ユースケースの検討が充分でないので、方針が固まっていないせいもある。

でも、今日のところは、目論見どおりGMBで再生できたので、良しとする。

(気が向いたら、詳細を追記します。)

(9/24 21:35追記) どうにかこうにか、次に再生する曲をGMBに送り続けられるようになった。GMBも自分で作ったGPMDPの追加プログラムも、想定外の動きをしたりして、なかなか大変だった(おもしろかったけどw)。

GPMの次の曲を自動でGMBに追加

図の左はGMBのウインドウで、右はGPMDPのウインドウである。GPMDPのプレイリストの、現在再生中の次の曲がGMBに自動的に追加され、連続再生できるようになった。

動き出したばかりで、まだまだ荒削りで、さまざまな不具合はあるが、とりあえずは音楽が聴ける状態になったので、一段落だ。それに、(GMBの)リモコンで一時停止などの操作ができるのは、すごく便利だ。

不具合の例:

再生していると、再生中の次の曲以降も勝手にGMBに追加される。まあ、悪いことではないが、想定外の動作なので複雑な心境だ。あと、それに伴ってGPMDPの下部のプレーヤー部分は、まだ再生していない曲になってしまう。しかも、それは上側のキューの再生中(と思っている)曲とも違うのが解せない。

  • 再生中の曲: "Here comes the Sun"
  • GPMDPが再生中(と思っている)曲: "Let it be"(上部)、「二人静」(下部)

細かいことが多いので、先は長そうだw

PS. 今日からか、URLに"?hl=en"を付けても無視するようになったようで、日本語で表示されるようになってしまった。やっぱり、ネットサービスはvolatileだなあ。

  •   0
  •   1

その後、音量の正規化が不完全な感じだったので、興味もあって、試行錯誤していた。

前回書いた、ffmpegのloudnormフィルタも試してみた。最新のffmpegをインストールしたら使えるようになった。が、使ってみると、普通の曲の正規化に20秒以上も掛かるので、使うのは諦めた。また、1回で処理しているせいか、包絡線が微妙に変化(曲の始まりの頃に、なだらかに小さくなる)することがあった。確かに、本当に1回で正規化処理するなら、最大値なんて分からないから、そういうこともありそうだと思った。それでは、ちゃんと処理するとしたら、2回の処理が要り、全部で40秒以上も掛かるから、更に使い物にならない。まあ、あれは、ちゃんとした制作のような時に使うものなのだろう。

他のプログラムを探したのだが、なかなかいいものがなかった。ひとつ、ffmpeg-normalizeというのが高速で良かったのだが、曲によっては相性が悪くて結果が駄目だったり、処理できなかった(最大値が0dBを超えると言ってエラーになる)ので、却下した。

そうこうしているうちに、ちょっと思い付いた。前回採用した、RMSの最大値(長さは0.75秒にした)と正規化したい音量(例: -16dB)との差で音量を設定するのだ。ここでは、その差を擬似再生ゲインと呼ぶ。

擬似再生ゲイン(dB)= 正規化したい音量(dB) - 曲のRMSの最大値(dB)

理論的にはおかしいことだらけなのだが、聴いてみると今までで一番いい感じだった。例の、"Heartbeat city"さえも良かった。おかしいというのは、RMSの最大値は短時間の実効値の最大値なのに、それと全体的な平均値に相当する、正規化したい音量の差を使うことだ。どうしてかは分からないが、うまい具合に前者が後者に近くなるのかも知れない。

更に、音量の設定方法も変更した。今までは、GPMのwebの音量(スライダー)のスケールが直線(目盛りと音量が比例)であることを想定して設定値を計算していたが、そうでなく、対数であると想定して、上記の擬似再生ゲイン(dB)を適当にスケーリング(例: ×1.75)した値で音量を設定するのだ。具体的には、以下の式にした。

音量設定値(%)= k * 擬似再生ゲイン(dB) + 音量の基準値(%)

パラメタは、loudnormの結果と比べて調整した値を、聴きながら更に調整して、今は以下に設定している。

k= 1.75, 正規化したい音量= -12dB, 音量の基準値= 70%

これで、随分、曲ごとの音量差が解消したように感じる。音量の基準値が小さいせいか、全体的に音量が他のアプリより小さ目なのだが、これを大きくすると、曲の音量が小さい場合に充分な補正ができなくなる可能性があるので、増さないことにした。

 

PS. 再生ゲイン処理前の一時停止がうまくなくて一瞬音が出る問題も、対処方法を考えた。簡単に書くと、外部のプレーヤーを使うのだ。試したら書くことにする。

  •   0
  •   0

昼休みに、ラフマニノフのピアノ協奏曲 第3番が聴きたくなったので、GPMで探した。なかなか目新しい人が見つからないので、気分を変えて(+怖いもの見たさで)、ユジャ・ワンにしてみた。先日、見た目での判断は良くないと書いたせいもある。

正直言って、全く期待していなかった。というのは、派手な外見以外に、以前YouTubeで彼女のラフマニノフのピアノ協奏曲 第2番のライブ(屋外だった記憶がある。これかも知れないが、水色の衣装だった覚えがある)を観て、ひどいと思ったからだ。

でも、その予想はいい方向に外れた。完全に。このアルバム(2013)での演奏は全然違っていた。音だけで、男性的(スポーティとか「肉食系」とかいう言葉を思い付いた。聴いたあとで検索したら、偶然、「アスリート」とか、同様な表現をしているページがあった)な演奏で好感が持てて、なかなか乗れた。どうやら、あのライブビデオが悪かったようだ。演奏風景を見たせいもあったのかも知れない(冒頭の弾き方(見た目)は好きになれなかった)。

第2楽章は、時々、音が抜けている箇所があるように聴こえた。おそらくそうではないと思うが。あと、第3楽章に行く前に余計な音の強調があった。そこら辺は好きになれなかった。でも、すごく乗れるから、かなり好きになった。終わる頃には乗りまくって、演奏後に続く拍手を聴いて余韻に浸っていたかったほどだ。が、あと少しというところで休みが終わりそうになったので、止めた。

それから、細かいが、オケの弦が少し変わった音の箇所があった。

かなり出来がいいので、てっきりスタジオ録音だと思っていたのだが、ジャケットを見ると、ライブだった。実際、最後に拍手があった。Discogsの情報では2013年のカラカスでのライブだそうだ。あとで調べたら、カラカスはものすごく危険な街らしい。そんなところで、良くコンサートをやったものだ。まあ、そういうところにだってホールはあるだろうし、やっぱり、音楽が好きな人は沢山居て、危険な毎日を送りつつも、コンサートを楽しみにしているのかも知れない。

さっきは同じ作曲者のパガニーニ狂詩曲(2011)を聴き、今は同じアルバムの同じ作曲者のピアノ協奏曲 第2番を聴いている。「パガニーニ」は、まあ普通ではあるが、悪くなかった。この曲は、僕には退屈な印象(細切れなので、乗りが分断されるのが嫌なのかも)なので余り聴かないのだが、ちゃんと聴き通せた。

第2番もいい。イントロのピアノに重さがあっていい。普通にいい。「普通に」は良くないように思えるが、好きな曲について僕がそう思うのは、安心して聴けるとか、途中で止める気にならないとかいうことで、いい演奏なのだ。ただ、ものすごくいい訳でもない。と言っても、平凡とか個性がない訳ではない。そこの区別は難しい。それにしても、例のYouTubeのライブとは偉い違いだ。もう一度観たら(聴いたら)、印象が変わるだろうか?

という訳で、やっぱり、見た目での判断は良くないようだ。

PS. ただし、彼女のトルコ行進曲(K. 331の第3楽章)は駄目だ。全然駄目だ。これにはがっかりした。(20:46)

  •   0
  •   0

昼に、かにみそさんのコメントを読んで、突然思い付いた言葉。タモリも言いそうだw

僕は、とにかく、いかに苦労しないか(例: 日常生活を楽にする、つまらないことを避ける)への努力は惜しまない。昔からそうだ。

だいたい、日本には「苦しんで成し遂げたことは(成し遂げなくても)尊い」のような風潮があるけど、全くおかしい。前にも書いたけど、同じことをするのなら、できるだけ楽にした方がいいに決まっている。第一にエコだろう。それに、散々苦労して、最終的にできなかったら無駄じゃないか。もちろん、自分の経験にはなるけど、全体としては無駄だ。

なんてことを、例えばお偉いさんに言ったら、どういう顔するのかね。おもしろそうだw

  •   0
  •   1

Google Play Music (GPM)の非公式アプリ、Google Play Music Desktop Player (GPMDP)。僕はそれを自分好みに改良(改造)しているのだが、ちょっとした問題が直らずに悩んでいた。

その問題とは、音量の正規化をするために、再生ゲインの計算処理の前に再生を一時停止するのが時々間に合わず、曲の頭が一瞬(長い時は数秒)再生されてしまうのだ。まあ、一瞬なので、聞かなかったことにすればいいのだが、なぜ起こるのか気になるし、音楽なので、余計な音はない方がいい。

それで、その遅れの原因を考えた。最初は、JavaScriptのスケジューリング(いろいろな処理を細かい時間で区切って実行すること)が今一つで、処理の切り替え間隔が長くなることがあるのではないかと想像していた。しかし、自分のプログラムで各処理の終了時刻を表示するようにしてみたら、かなり正確だった。例えば、100ms待つ処理は、ちゃんと100ms前後(誤差は数ms)待っていた。だから、JavaScriptの問題ではないことが分かった。

それで、GPMDPがGPMにアクセスするのに使っている、gmusic.jsというライブラリを読んでみた。最初は意味が分からなかったのだが、何度か読んだら、昨夜だったか、突然分かった。

GPMDPもgmusic.jsも、GPM (Google)にアクセスなんてしていないし、音楽だって再生していないのだ。アクセスしているのも再生しているのも、ブラウザ(GPMDPの場合はElectronで動くChromium)で動く(Google純正の)webページなのだ。そして、gmusic.jsは、それに「ちょっかい」出しているだけなのだ。例えば、再生中の曲名は、webに表示するためのHTMLから取っているし、音量は同じくHTMLの部品、スライダーに値を設定しているだけだ。要は、体のいいスクレイピングだ。

それから、曲の再生時間だってプログレスバーの値(HTMLに書いてある)を読んでいるだけだ。下図の灰色の部分は、GPMの曲の再生時間のプログレスバーの記述である。字が細かいが、 value="2917" や aria-valuenow="2917" は現在の再生位置(ms単位 →  約3秒)を、 aria-valuemax="350000" は曲の長さ(→ 約5'50" : Amazonでは5'52"となっているから、概ね正しい)を示している。

GPMの曲の再生時間のプログレスバーのHTML

問題の曲の切り替わりの判定も、同様にweb中の曲名の記述を監視していて、変わったかを判定しているのだから、そりゃあ、遅れるだろう。逆に遅れないのが不思議だ。プログラムを作っていて不思議に思っていたのだが、曲の切り替わりイベントが来たのに、現在の再生時間が0秒付近でなく前の曲の終わり付近のことがあるのは、そのせいだったのだ。というのは、曲名の更新と再生時間の更新は同時にはできないので、必ず時間差があるのだ。

だから、曲の切り替わりイベントで即座に一時停止したって全く無駄なことで、ブラウザの都合でいくらでも遅れる。だから曲の頭が一瞬出てしまうのだ。

この仕組みを考えついた人には感心するが、全く安直で汚い実装だ。将来性もない。Googleがwebをちょっと変えるだけで、全然動かなくなる。

結局、そもそもの問題は解決不可能になった。一時停止しないで済む方法を考えるしかない。GPMの同時再生制限のために、それは無理と思っていたのだが、今朝、その方法を思い付いた。

再生ゲインを計算するために曲を取得しているが、ゲインを計算するだけでなく、それを実際に正規化して、別のプレーヤー(例: VLC)で再生するのだ。それなら、音量の正規化だって、擬似的な再生ゲインで音量を変える(= 乗算する)だけの簡易なものでなく、ちゃんとした方式(例: LUFSを使う)でできるから一石二鳥だ。

その場合、GPMDPは、例えば、シーケンサーとでもいうのか、再生せずにいつも曲の先頭で停止していて、再生する曲情報を順々に僕のプログラムに提供するだけにするのだ。それなら結構簡単に動きそうな気がする(細かいことを詰めるのは、かなり面倒だが)。更に、全然詳しくないが、HTML5の音楽プレーヤーをGPMのwebに はめ込むなんてのができたら、(技術的に)おもしろそうだ。

そこまでするんだったらGPMDP(= GPMのweb)を使うのを止めようと言いたいのだが、GPMの曲の検索やリコメンドやラジオにアクセスするには必要なので、なかなか切れない。でも、いつかは、完全ではないにしろ、GMBと統合し(組み込み)たいという野望はある。

なんてことを考えて楽しくなったのだが、そもそも音量の正規化はラジオのために作っているのに、近頃は、僕好みのラジオを聴き尽くした感があることにも気付いてしまって、本当にやる意味あるのかと、早くもやる気を失っている。Googleよ、ラジオを更新してくれ!

 

PS. 以前も書いたが、結局、GPMDPは大したことはしていない。単に(webでなく)独立したアプリの体裁にしているだけで、庇を借りているだけのくせに母屋を持っている顔をしているようなものだ。だけど、プログラムの量はそれなりにあって、バグもある。更に、上述のような問題があるうえに将来性もない。悪いことづくめなのに、みんな喜んで使っているのは情けない。いつか突然動かなくなって慌てるのではないか。純正アプリがないから仕方ないのだけど、GPMの音楽を聴くだけならwebだって何も問題ないと思うのだが・・・

  •   0
  •   0

暇つぶしにニュースを見ていたたら、「なぜ「タモリの生き方」は憧れの的なのか」(リンク先は特に興味を持ったページ)という記事が目に止まった。正直言って、僕はタモリが嫌いだ。彼が「笑っていいとも」に出た頃から鬱陶しくなった。なんか見るのが面倒なのだ。あんな、当たり前の話を淡々としているのの何がおもしろいのか。

最初の頃(ハナモゲラ語とかイグアナの頃)は何も考えずに笑えたのに、「笑っていいとも」からは妙に常識人とか衒学者のようになって、堕落した感じがして、幻滅した。それは今までずっとそうだ。だから、今が本当の彼なのだろう。

が。前にも書いたけど、どういう訳か、(近頃の)僕の生き方が彼にちょっと近い感じで興味があるので、記事を読んでみた。すると、やっぱり近いものがあった。

やったことはすぐ忘れる。それが大事

って、見覚えありませんか?w その他のことも、まあ、賛成できる。でも、「意味を探すな」については、僕は「意味を考える(実際には、自分なりに想像や空想(しかも深い)をでっちあげる)から世界はおもしろいこともある」と思うし、重苦しい中にも楽しめることはあると思う。ただ、その後の、

「これでいいのだ」と現実を受け入れて、明日から何をすべきかを考えたい。

には賛成だ。なかなか、いつもはできないが。あと、緊張なんてしたくない。そんなの疲れるだけだ。いつも気楽がいいから、緊張する機会は避ける。

まあ、僕には、タモリのエッセンスは「忘れる」だ。

そして、一番重要なのは、そんな記事を読んで「ほう、じゃあ、見習ってみよう」なんて思う人は、百年経っても楽しく生きられないということだ。自分の生きやすいように生きなかったら、(そのために努力しなかったら ― しなくてもいいが)楽しい訳がない。

(本当のオチ: だから、これを読んでも真に受ける必要はないですw)

  •   1
  •   0

風邪ひいて調子悪いし、台風(今はまだ普通の雨)で外に出るのも億劫だしで、全くのプログラミング日和なのでw、昨日に引き続き、GPMDPの改良に余念がない。いや、余念があるから捗っているのかも知れない。僕の場合、別にプログラムをいじったりしたくはないのだが、音楽を気持よく聴きたくて、いろいろ考えるとできそうだから、仕方なくやっているのだ。

それはともかく、ついにGoogle Play Music (GPM)のプレーヤーGPMDPで音量の正規化ができた。我ながら大変強引な方法だし、いろいろ制限はあるが、とにかくできた。

方法は、基本的には昨日書いたとおりであるが、実際に作ってみると、細かいことがいろいろあったので、その辺りを書いてみる。

見つかった問題点

  1. 曲を再生中に再生ゲインを計算するために曲を取得すると、GPMは同時に1つの機器からしか再生できないので、次の曲の開始時にエラーになって、再生が停まってしまう。
  2. そのエラーダイアログの実装が汚く(まあ、元々がwebなのだから汚いというのは言い過ぎだが)、ブラウザ内のダイアログもどき(昔のワープロのようなもの)なので、xdotoolのようなツールで自動的に閉じるのが難しい。
  3. 曲の再生ゲインの計算が難しい。単純な最大値では聴感に合わない。実効値(どのくらい大きく聴こえるか ≒ 波形がどのくらい太くて黒いか)を求める必要が要る。
  4. GPMDPの音量のステップが段階的なので、細かい再生ゲインが反映されない。
  5. クラシックなどを聴く時のために、音量の正規化機能をon/offできるようにする必要がある。

実際に書き出すと少ないが、結構苦労した。

問題の解決

  1. GPMの同時再生エラーとエラーダイアログの問題
    • エラーダイアログが出たことを検出することすら難しいし、検出して自動で閉じるようにしても、音楽の再生中に勝手にマウスが動くのは鬱陶しい。
    • JavaScriptの機能で、ページ中にあるダイアログを探して、閉じようとしたのだが、なぜか、ダイアログもボタンも見つからず、どうにもならないので、一旦、後回しにした。
    • その後、手を抜きたかったので、曲の再生中でなく、曲間で一時停止して処理するようにしたので、最終的には、問題は起こらなくなった。それでも、処理はすぐに終わる(2秒未満: 下で訂正)ので、気になることは滅多にない。そもそも、正規化はラジオでしか使わないので、曲が間隔なしでつながることはないから、多少曲間が伸びても問題はない。(9/18 14:35 訂正: 実際に測定したら4秒前後だったが、ラジオのせいか、気にならないのは確かである。)
  2. 曲の再生ゲインの計算
    • 最初は最大値を使ったのだが、聴いてみると余り効果がなかった。
    • 値を調べると、多くの場合、最大値は100%近いので、ほとんどの曲で、正規化されていなかった。
    • 平均値を試したが、余りいい結果にならなかった。どういう訳か、平均値は小さいのに大きく聴こえる曲(The Cars "Heartbeat city": どういうことなのだろう??)があったからだ。
    • 処理に使っているffmpegにはloudnormという正規化する機能があるのだが、今のOSに入っている版には入っていないので諦めた。また、曲を正規化してもGPMDPでは再生できないので、余り便利でない。
    • 最終的には、ffmpegのastatsという機能で短時間の実効値(RMS)の最大値を取得することにした。理論的に正しいのか分からないが、聴いた感じでは良さそうだ。実効値を求める期間(時間)の設定が難しいのだが、昔のポップスを聴く限りでは1.75秒がいいようだ(ちなみに、この値は「異邦人」(1979)でチューニングした)。
  3. GPMDPの音量のステップが段階的
    • 今は音量を2.5%ステップにしているので、確かに細かい違いは反映されないが、聴いた感じでは分からない(細かい音量設定よりも、演奏の性質による違いが大きい)ので、今は保留している。
  4.  音量の正規化機能のon/off
    • 設定項目を追加すれば可能だが、いちいち開くのが面倒なので、再生メニュー(曲の右に出るもの)に追加することにした。
    • 追加はできたのだが、「ラベルの翻訳がない」という表示になってしまい、なかなか解決できなかった。
    • プログラム中のHTMLを良く見たら、<span>の属性(is="translation-key")で翻訳したラベルを使う指示をしているようだったので、それを止めるようにした(そんなものすごい機能があるとは、恐ろしい。脆弱性になるような気がするが、考え過ぎか)。
    • また、メニューでon/offするので、メニューのラベルが現在の状態を反映するように、設定変更時にラベルを書き換える(例: Onの場合は「無効にする」、offの場合は「有効にする」と表示する)ようにした(下図参照)。本来は、モードを示すアイコンなどを追加するといいのだが、それも面倒なので、このようにした。

再生メニューに音量正規化機能のトグルを追加

という訳で、随分苦労した気がするのだが、書いたらあっけないものだ。。。 実際には、Googleの検索と、そこから見つかった有用なページを書いてくれた方々に随分お世話になった。もし昔だったら、たった数日で、全く使ったことのない環境やプログラムをこんなにいじることはできなかっただろう。

それから、書く必要すらないことだが、もしWindowsを使っていたら、全く無理だったし、やる気も起こらなかっただろう。あれを使っていたら、どんなに普通のことでもなぜか大変になるから、ソフトウェアの正常な発展には大変な障害だとつくづく思う。

音量正規化の効果はおそらくあると思う(GPMDPの音量はちゃんと変化している: スライダーを表示させたままで見ていると、曲間でスライダーが自動的に動くのがおもしろい)のだが、気のせいかも知れない。上記のように完全ではないので、時々、小さく感じたり、大きく感じたりすることはある。ただ、以前は頻繁に音量を変えていたが、これができてからはほとんど変えていないので、やっぱり、効果はあると思う。

以下に、実装メモを書く。

  • 処理の流れ
    1. 曲が変わったイベントを待つ。 → 再生しようとしている曲情報が来る。
    2. 再生キュー(再生する曲一覧)を取得する。
    3. キューから曲のIDを取得(曲名、アーティスト名で検索)する。上記の曲情報には入っていないため。
    4. 計算済みの最大値が保存されていたら、使う。 → 9へ
    5. gmusicapiの機能を使い、IDよりstream URLを取得する。
    6. wgetにstream URLを指定して、曲を取得する。ただし、もしキャッシュにデータが残っていたら、再利用する。
    7. ffmpegのastatsフィルタでRMS(1.75s)の最大値を求める。
    8. 再利用できるように、いくつかの最大値を保存しておく。
    9. 最大値より、正規化するための音量値(%)を計算し、GPMDPに設定する。
    10. キャッシュ中の古いデータを消す。
    11. 1に戻る。
  • 制限事項
    • 再生ゲインはトラックモードのみ対応 (本質的に、アルバムモードには向かない。気長な人なら別)
    • 当初は、再生中にバックグラウンドで次の曲の処理をする予定だったのだが、暫定的に作ったものが結構うまく動いて、それ以上は面倒だったので、再生前にこれから再生する曲の処理をすることにした。
      • 上にも書いたが、処理は短時間(クラシックのような長い曲を除き、概ね24秒以内)に終わるので、曲間が長く感じることはない。
      • これならシャフルにも対応できるので、却って良かったのかも知れない。
    • 計算した再生ゲインの情報は保存しないので、過去に計算した値が再利用できない。(TODO)
    • GPM自体やwebページの仕様に大きく依存しているので、それらが変わったら、途端に動かなくなる(これはGPMDPも同様)。

 

PS. 前にも書いたが、どういう訳か、僕が聴くGPMのラジオで斉藤由貴の曲が頻繁に掛かる。今日は「悲しみよこんにちは」だ。好きな曲だが、今の彼女はそういう状況なのだろうか? というか、今でも彼女が現役でラジオ番組を持っていたことが驚きだった。

PS2. 本題とは関係ないが、GPMのおかげで分かったことを書く。

Winkの曲だとばかり思っていた「ふりむかないで」は、実はザ・ピーナッツの曲だった! そんな昔の曲にしては、全然違和感がなかったのがすごい。「ほう」と思った。(21:21)

PS3. この作業中に気付いたことがある。アプリをビルドして起動するのが意外に遅いのだ。もちろん何分も掛かる訳ではないのだが、一瞬ではないので、何度も繰り返すと結構イライラする。たかが(と言っては悪いが)JavaScriptなのに、ものすごく大量のモジュールが集まっているからなのだろう。そして、僕のPCが遅く感じたのは、これが初めての気がする。さすがに古くなったのかも知れない。(22:39)

(22:29 音量のスライダーが自動で動く動画を追加; 23:20 若干加筆・修正; 9/19 7:09: 実装メモ中の処理時間の訂正漏れ(4秒が正しい)を修正)

  •   0
  •   0

Google Play Music (以下GPM。実際にはアプリ(GPMDP)またはweb)には、いくつかの不満(改良したい点)があるのだが、いろいろな手段を組み合わせることで、全部ではないが、大分良くなった。以下に、概要を書く。

要改良点

  • 音量の正規化(再生ゲイン)対応 (特にラジオで、曲ごとに音量が大きく変わって不便なので、トラックモードだけでもいい)
  • 音量調整のステップを細かくしたい。今の半分程度に。
  • GPMDP
    • 「この曲が終わったら一時停止する」機能が動かない。
    • 英語での表示
    • マウスジェスチャ対応
    • ミニプレーヤーの改良 (情報量が少ない。使い勝手が悪い)
    • gmusicbrowser(GMB)との統合 (プレーヤーを1個にしたい)
  • リモコンで操作したい。

改良できた点

  • GPMDP
    • 「この曲が終わったら一時停止する」機能が動かない。
      • バグだったようだ。その機能のプログラム(src/renderer/windows/GPMWebView/interface/
        pauseAfter.js)を修正して、正常に動くようになった。
      • 基本的は、以下の修正をした。
        • Emitter.on('pauseAfter:show', ...)の(toast): pauseAfterに設定する値をPAUSE_AFTERからPAUSE_NEXTに変更した。
        • GPM.on('change:track', ...): 再生開始前は停める処理をしないようにした。
        • Emitter.on('pauseAfter:show', ...)のwindow.showToast: 停める設定後に表示されているダイアログ(?)で設定を解除すると、以後うまく動かなくなるので、解除する文字列(リンク)を表示しないようにし、解除はメニューで行うようにした。
      • PAUSE_AFTERは何に使うのか謎だし、手抜きなダイアログの処理には不満があるが、充分実用的だ。
    • 英語での表示 (暫定対応)
      • 以前書いたように、GPMのページのURLに"?hl=en"を追加した。
      • GPMDPの言語設定から自動で指定できるようにしたいが、そうしてもそれほど便利になる訳ではないので、やるなら、動的に変えられるようにしたい。
    • マウスジェスチャ対応
      • Linux用ジェスチャプログラムEasystrokeを使った。
      • これで、GPMDPでもブラウザと同様に、マウスジェスチャでページを移動(戻る・進む)することができるようになった。
      • 更に、Chromeでもジェスチャが使えるようになった(なぜか、右クリックが不便になるアドオンよりもずっといい)。
    • 音量調整のステップを細かく (9/16 11:48追記)
      • GPMDPが読んでいるGPMのページをVivaldiの開発者ツールで調べたところ、ページ内に音量調整用のスライダーの要素(id="material-vslider")があり、そこでステップが5に指定されており(下の例を参照)、その値を変更すれば、そのステップで動くことが分かった。
        • <paper-slider id="material-vslider" ... step="5" ...>
      • GPMDPの起動時にスライダーの要素を検索し、ステップを変更するようにした(下の例を参照)。
        • 要素の検索: slider= document.getElementById("material-vslider");
        • ステップの変更: slider.setAttribute("step", 新ステップ);
      • 新しいステップは2.5にした(整数でなくてもいいようだ)。
      • この方法は、GPMのページの作りが変わってしまったら駄目になってしまうが、その時はまた対応しよう。
      • また、この機能の有効/無効切り替えを、簡易に設定に追加した。

残りの実現に向けて

  • [済] 音量の正規化(再生ゲイン)対応
    • 基本的に難しいが、以下のような処理が可能かと思っている。この方式だとトラックのゲインにしか対応できないが、ラジオには充分である。
      1. 今の曲を再生中に次の曲のデータを取得して、再生ゲイン(≒最大の音量)を計算する。
      2. 計算した再生ゲインで再生音量を変える。(再生部を改造できない場合は、LinuxのGPMDPの再生音量を変える)。
    • 9/17に対応できた。(9/17 19:06)
  • [済] 音量調整のステップを細かく
    • GPMDPのソースを見て試行錯誤したところ、GPM(のweb部品?)では5%の倍数の音量しか受け付けないようだった。
    • それで、GPMDP自体の音量(LinuxのGPMDPの音量)を変えることを検討している。
    • この場合、新たな音量調整用のUIを追加する必要があるのが、面倒。
      • 元の音量調整機能を使い、GPMDP自体は5%ステップだが、LinuxのGPMDPの音量をうまく増減する(例:GPMDPで5%上げたらLinuxでは2.5%減らし、全体としては2.5%の増加とする)ことで、ステップが細かくできる気もする。が、表示と実際が乖離しそうな気もする。
    • 上記のように、簡易に対応した。(9/16 11:48)
  •  ミニプレーヤーの改良
    • 以下をやりたいが、ミニプレーヤーはGPMの部品のようなので、できるかは不明。
      • 曲名などを常に表示したい。ただし、再生制御は不要。(GMB同様にする)
      • キューを開けるようにしたい。あるいは、簡単に本体を開けるようにしたい。
      • 閉じて再度開くと位置が下がるのを直す。
  • リモコンでの操作
    • GPMDPでは、各種API(JSON, Web socket)やMPRISを使うことを考えている。
    • GMBもリモコンを使うので、切り替えを煩雑にせずに(可能なら切り替えなしで)併用できるようにしたい。そのため、実際に使うパターン(ユースケース)の検討が要りそうだ。
  •  GMBとの統合
    • 以下を検討しているが、必要(メリット)があるのか、良く考えたい。全体的なユースケースの検討が要りそうだ。
      1. ダミーの曲ファイルに曲やプレイリストのIDを入れておく。
      2. そこからGPMの曲の再生URLを取得して、GMB (→ GStreamer)で再生する。
    • GMBからGPMDPを制御できるようにするだけでも、いいかも知れない。

GPMDPはソースが公開されていて変更が可能なので、web版と比べて優位になった。

「この曲が終わったら停める」機能が動かない問題は、単純な間違いなのか、もっと奥深い問題があるのかは分からないが、とりあえず、うまく動いている。「こうやって直した」とGPMDPのフォーラムに投稿するといいと思うが、以前、別のフォーラムに投稿して情報を出したのに結局無視されたことが何度もあるし、この問題も以前に指摘されたのだが、なぜか"closed"(解決済み)になっているので、今は投稿する気が起こらない(もし欲しい方がいらっしゃったら、ここで公開します。ただし、その場合、公開するのは変更したソースコードだけですので、使うには開発環境(npm)が要ります)。

 

余談

GPMDPの言語はJavaScript(Node.js)なのだが、昔はブラウザで動くおまけみたいな言語だと思っていたのに、いつの間にあんなに発達したのかと驚く。最初から、あんなにまともなオブジェクト指向だったのだろうか? しかも、画面表示と関係のない処理すらやっているのは不思議だ(PHPも同様だが)。まるで、小さいガキだった親戚を久し振りに見たら、立派な大人になっていたかのようだ。

JavaScriptも馴染みがないが、Pythonより10倍くらい使いやすい気がする。

 

PS. GPMでいろいろな曲を聴いていると、結構、マスタリングが駄目な曲がある。例えば、途中で途切れてしまったり、曲間に「ザッ」という雑音が出るものがある。あと、ダイジェスト版のように短縮された曲もあった。膨大な曲数なので、たまに壊れていたり、おかしかったりするのだろう。まあ、買う前に分かるので、ありがたい。でも、それを指摘する簡単な手段がないのは、どうかと思う。まあ、Googleらしいが。

 

(9/16 11:48 音量調整のステップを小さくできたので、追記; 9/17 17:39 昨日の追記の日付が間違っていたので修正)

  •   0
  •   0

先日、新しいスイフトスポーツが発表された。意外なことに、某掲示板では好意的なコメントが多い。ようやくみんな気付いたのだろうか。悪い気分ではないが、僕は、今度のは、「ちょっと」だ。

悪くはないが、すごく良くもなくて(今の僕のを初めて見た時の、グッと来る感じはなかった)、今すぐに乗り換えたい気にはならない。なんでだろう? まずは、ホイールがかっこ悪いし、メーター周りがごちゃついているし、ハンドルも美しくないし、車内が赤ばかりで鬱陶しい。

それに、ついに3ナンバーになってしまった。(以前は誤解していたのだが)排気量が大きくないので税金は高くならないようだが、なんか堕落した感じだ。たった数cm(たしか3cm程度)、タイヤの間隔(トレッド)を広げて、本当に何かの効果があるのかな? 実際には、ヨーロッパ向けと同じ車体を使いたかっただけではないか。

車体のデザインも、前の方がいいと思う。でもまあ、良くある、馬鹿みたいに大きな羽根とかボコボコしたボディなどで加飾されているスポーツ車(特に、群馬のS社や技術馬鹿指向のH社)よりは百倍いいw

とは言え、トルク重視のエンジンなど、メカについては期待できそうだ(ただ、エンジンは、今度のK型は分からないが、前のM型は気持よく回って好きだ)。そして、値段も随分頑張っている(前のより10万円くらいしか高くなってない)のは好感が持てるし、「良くそんな隙間に収まる値段を見つけたものだ」と感心する。だから、来月のオイル交換の時にディーラーにあったら、試乗させてもらうつもりだ。

ただ、今の気分としては、「普通のスイフトで満足できれば、それでいいじゃん」と思っている。別にパワー(速さ)なんて要らないし、かっこいい(つもりの)車体も不要だ。シンプルな車体で、気持よく走れればいいのだ。だから、普通のスイフトが気持ち良くて6MTがあれば、候補になり得る。本気だ。

今調べたら、普通のは5MTだ。でも、それだっていいような気もして来たから、不思議なものだ。グレードはRSじゃなくてXLがいい。あとは、あの派手な色さえあれば完璧なのだが・・・

更に調べたら、5MTの5速のギア比は6MTの6速と同等なので、僕が欲している、高速道路でのエンジン回転を抑える効果は見込めそうだ。あとは、走りの気持ちよさだ。前のモデルのCVTは最低だったが、MTではどうだろうか? 別に、乗り換える気は全然ないのだがw

PS. 題は本文と関係ありません。単なる思い付きですw が、今思い付いたこじつけですが、「すごくて人気ある(けど、手間の掛かりそうな)サーバルより、普通の家猫で充分可愛いじゃん」ってところでしょうか。

PS2. 昨日、カタログが届いた。そうしたら、普通のスイフトのカタログも欲しくなった。主に、(webには余り載っていない)うたい文句を読みたいのだ(そんなの読んでも、実体は何も変わらないのだが・・・)。それから、アクセサリーカタログを見たら、普通のスイフト(XLやRSなど)にはオプションでスペアタイアが載ることに気付いて、「やっぱり次はそっちかな」と思った。

スペアタイヤのない不安感が、ものすごく嫌なのだ。修理キットを使うとタイヤの内側が駄目になるというから、使わずにエアポンプでしのいで修理工場まで行くしかないのは、やっぱり不安だ。そもそも、不器用なので、修理キットもエアポンプもちゃんと使えるか心配ですらあるw

そういう不安があっては、いくら車の性能が良くたって、本当に気持ちいい・楽しい運転はできないと思うのだ。とはいえ、例えば、高速でまともに走れる性能がSportでないと得られないのであれば、選ばざるを得ないだろう。 (9/16 6:20)

新型スイフトスポーツ(2017)のカタログ

  •   0
  •   0

よく、スポーツが得意な人は「脳味噌が筋肉」だと揶揄されるが、それは単なる思い込みとか決め付けで、単に個人の特性(というか、劣性)のようだ。ちょっと前の話だが、有名な(僕は名前しか知らない)ジャズの奏者が、演奏会で子どもに暴力をふるって演奏を止めたそうだが、

なんだい、このクソジジイ

って思った。

音楽家は音楽で人を動かせなくては、(そこまでは無理としても、動かそうとしなくては、)存在価値がないと思う。その場におらず、ビデオも観ていないから、細かいことは分からないが、そもそも、子どもが乗って演奏しているんだから、いくらだってやらせておけばいいと思う。予定より時間が伸びたって、どうせ、何日間も続くなんてことはないから、別にいいじゃないか。何がそんなに嫌だったんだろうと思う。下手だったのだろうか。プロの演奏家なら、一緒になって演奏して、うまく終わりにすることだってできたのではないか。

そして、(上だけならありきたりな考えなので、書くこともなく、以下が書きたかったから投稿するのだが、)昨日、ふと、「戦場のメリークリスマス」(1983)で、俘虜(デビッドボウイ)が軍人(坂本龍一)にキスして蛮行を止めさせた光景を思い出した。キスはないとしても、頭を撫でるとか抱擁するとか思わぬことをすれば、おだやかに終わった気がするのだが、現場を観ていないから、本当に可能かどうかは分からない。でも、殴るのはないだろう。

PS. 書くきっかけはもう一つあった。この記事だった。

  •   0
  •   0