Archive for 9月, 2017

プログラムの「詰め」というのは、とにかく手間と時間が掛かる。大体、中心となる部分を作るのの10倍以上の時間が掛かるのではないだろうか。プログラムを使い物にするにはどうしても必要な作業のだが、退屈だし疲れるので、余り好きではない。それでも、なかなかうまく行かなかったことを打開するような、ちょっとしたアイデアがひらめくことがあって、それが本当にうまく行った時は楽しい。だから、いじりだすとなかなか止められない。仕事と違って、納期も予算もないのが困るw

一方、世の中には、すごいアイデアを思い付いたら、素早く目を引くデモ的な物(ポップ音楽だったら、サビとかデモ版)を作って、有名になったりお金をせしめたりしたら手放して(どこかに売って)、トンズラする(あるいは、別の物を作り出す)、スマートな人が結構居るようだが、無責任で嫌いだ。確かに、いいアイデアを出せるのはすごいと思うが、「最初にちょろっと書くのは誰だって楽しいんだよ!」とか「もう少し面倒見ろよ」と言いたくなる。

という訳で、日々続けているGPMDP (Google Play Music Desktop Player)の改良(もはや改造と言った方がいいだろう)は大分いい感じになってきた。まだ詰め切れていない点や不具合や抜本的な改良案もあるのだが、おおよそ7.5割くらいの出来になって、普通に(これには「変わったことはしてはいけない」という意味もあるw)音楽を聴けるレベルになった。具体的には、GMBだけで聴いている時と使い勝手での違和感がほとんどなくなった。例えば、GMBのリモコンで操作できるので本当に便利だ。実際に、昨夜からは、(実装・修正するだけじゃなくて)GPMの曲を聴くのに使っている。

問題だったユースケース(GPMDPをどういうふうにGMBと統合・機能分担して使うか)も、作業しているうちに大分詰められた。基本的には、GPMDPは曲の検索に使い、GPMDPの再生ボタンを押したら、実際の再生や再生の操作はGMBで行おうと思っている。まだ完全にシームレスになったとは言えないが、なかなかうまく統合できたと思う。

今週はさまざまな改良や修正をしたのだが、主にGPMDPとGMB (gmusicbrowser)との連携動作(例: 曲の追加や変更の同期)に関するものなので、見た目では、先週と比べて目立った違いは余りない。大きな違いは、(実際に曲を再生している)GMBで次の曲に移ったことがGPMDPにも伝わって、曲情報やジャケット画像が更新されることだ。以下にデモ動画を置くので、興味のある方はご覧頂きたい。

画面左半分はGMBの、右半分はGPMDPのウインドウである。GMBで再生中の曲が次に変わると、少ししてから(その次の曲の取得と処理の時間: これは如何ともし難い)GMBにその次の曲が追加され(画面左下、5曲目)、GPMDPの曲情報やジャケット画像(画面右中央)が更新される。

下の動画は、力技でやっているうえに、まだバグがあって、(いつ何が起こるか分からず、)ドキドキする機能なのだが、GMB(画面左下)でリスト中の前の曲をダブルクリックして移動した場合でも、GPMDP(画面右中央)も戻るようになっている(戻るのが遅いのは愛嬌w)。もちろん、取得されている範囲で、先の曲に進むこともできる。

リストの最後(7曲目)に2曲目の曲が追加されるのはバグである。難しい。。。

冷静に考えれば、再生中の曲のGPMDPへの同期なんて、音楽を聴くには不要な機能で、本当に飾りなのだが、「おもしろそうで、不可能でないならやってみたい」という、技術者の無駄なこだわりがあって実装したw

(10/1 6:38 わずかに修正)

 

PS. プレーヤーにGMBを使ったのは正解だった。最初は単純な再生だけを考えていたので、alsaplayerなどの軽いものにしようかと思っていたのだが、機能的に不十分な点があったので、最初からGMBで試した。また、GMBはコマンドラインにPerlのプログラムを指定して実行できるという、夢(麻薬)のような機能があり、それでGMBの内部データにアクセスできるので、かなり役に立っている。もう開発は停まっているようだが、セキュリティホールになるので、公開版に入れ続けるのは難しいかも知れない。

PS2. かなりハードルが高いのだが、将来的には、GPMDPじゃなくて、ブラウザのGPMのページから直接GMBと連携できないかと思っている。GPMDPが必要なのではなく、GPMのページ内の要素にアクセスするために使っているだけなので、ブラウザのアドオンか何かでできるのではないだろうか。

同時に、可能な限り機能を外部に出して、JavaScriptの部分を減らして開発効率を向上させ、GPMのページ構成になるべく依存しないようにもしたい。

とは言え、本当にやりたいのは音楽を聴くことなので、苦労してそこまでやることもないかとも思っている。

(10/1 17:44追記) と書きつつも、(だるくてドライブを止めたため、)暇だったので、ちょっとだけ試してみた。一番最初に気になった、GPMのページ中の再生ボタンを押したらGMBに曲を送れるようにする時に必要な、ボタンのイベントハンドラを変更できるかを試した。

最初は、安直に、ローカルのHTMLでiframeでGPMのトップページを読み込んで、JavaScriptで書き換えればできるだろうと思ったのだが、駄目だった。それから、いくつかのライブラリやAJAXやjQueryまで試したが、駄目だった。

どうも、セキュリティ上の制限のようで、ローカルのファイルからGPMのサイトを呼び出すのが駄目なようだ(おそらく、元がローカルファイルじゃなくても、サイトをまたがるようなことが駄目なのだろう)。それを回避したかったのだが、できなかった。この制限は「同一生成元ポリシー」というものらしく、かなり昔からあるようだ。

それで、一旦、ローカルのHTMLを使うのは諦めて、(GPMDPを改造して使う前提で、)GPMのページ中の再生ボタンのイベントハンドラを変更できるかを試した。JavaScriptには疎いので、それすらも苦労したが、できた。getElementById()で再生ボタンの要素を探して、onclickメンバにハンドラを設定すれば良い。以下のようにすると、GPMの再生ボタンを押すと関数click_func()が呼ばれる。

var elem= document.getElementById("buttonContent");
elem.onclick= click_func;

function click_func() {...}

onclick(onClick)は属性ではないとのことで、setAttribute()で設定しても呼ばれないことに気付かず、苦労した。あと、ボタンの本来のハンドラが依然として有効(どうやっているのか不明)なのがちょっと気に入らないが、まあ、細かいことだ。

(10/2 7:08追記) その後、GPMの再生につながるボタンは山ほどあるので、それらを全部書き換えるのは現実的でないことに気付いた。それらの呼び先を修正するのも困難なので、やっぱり、低レベルなところはGPMDP(実際には、その下位のライブラリ)に依存するのがよさそうだ・・・

  •   0
  •   1

先日の朝のコンビニでの話。

隣に居た車は、薄汚れた感じのしょぼい軽だった。ドライバーは、ハンズフリーのイヤフォンで、ニヤニヤ笑いながら電話をしていた。

が、エンジンを掛けたら、やけに低音の迫力がある音だった(要はうるさかった)。きっと、マフラーを改造しているのだろうと思った。

が! その車が出る時にちらっと見たら、ポルシェだった。全然オーラがなかったので、軽と思い込んでいたのだ。そういう車(それなら逆に好感が持てるが)なのか、軽薄そうなドライバー(出る時もニヤニヤ)の問題だったのか。

 

PS. 似たような話がもう一つあった。朝、どうしても汚れた白いカローラにしか見えないセルシオをたまに見る。「なんだかなあ」である。 (9/30 6:52)

  •   0
  •   0

半年くらい前から、LinuxでのテキストエディタにはAtomを使っていたのだが、全然良くないことに気付いた。僕の使い方(変なプラグインを入れたせい?)が悪いのか、頻繁に遅くなる。開いているファイルが多いと、ひどい時には数分間固まるし、そうでなくても、文字を打ち込むだけでも遅いから、GPMDBの改良作業の足かせとなって、大変イライラしていた。更に、それ以外に、山ほどプラグインを入れないと普通のエディタのようには使えない(まだ普通のに劣ることがある)など、基本的な機能が劣っている。

それで、前に使っていたjEditに戻ろうかとも思ったのだが、日本語のインライン入力ができないので(いろいろやればできるとは読んだが、面倒なのでしない)却下し、いろいろ試した結果、Kateにすることにした。忘れていたのだが、インストール済みだった。

が、KateでなくjEditにした時の記事を読んだら、Kateは「ハングした」とか書いてあったので、やっぱりjEditに戻ろうと思う。ありがたい、これも消していなかったので残っていた。今度は日本語のインライン入力の設定をしてみようか。

  •   0
  •   0

先日はユジャ・ワンに感心したので、今日の昼は彼女と同じ国のラン・ラン(Lang Lang)のモーツァルト ピアノ協奏曲 第24番 (2014)を聴いてみた。

イントロのオケ(指揮: アーノンクール、ウィーンフィル: ジャケットにはそのように書いてあるが、オケについては別の情報もあった)がすごく良かった。

ピアノも、意外に繊細で良かった。「意外」というのは、先入観があったということだ。何かがわずかに足りない気はするが、レベルは高い。すごく乗れて、「普通にいい」。ただ、それはオケが良過ぎたからかも知れない。

カデンツァはちょっと良くなかった。そして、段々、ピアノが、どことなく説明的な気がして来た。そのためか、滑らかさが少し不足している印象を受けた。

昼休みに聴き終わらなかったので、帰宅してから残りの第3楽章を聴いた。残念なのは、ここに来て、オケがわざとらしくなってしまったことだ。。。

この曲の後で、ラフマニノフのピアノ協奏曲 第2番 (2005)を聴いた。イントロはすごく遅かった。オケ(指揮: ゲルギエフ)は良かったが、ピアノは、やっぱり説明的だった気がする。決して悪くはないのだが・・・

そして、第3楽章の頭は、特に説明的で興ざめだった。だから、最終的には、僕には彼はユジャ・ワンよりは良くない印象だ。

それから、同じアルバムの「パガニーニ狂詩曲」を聴いた。この曲は余り好きでないから聞き流したので、特に書くことはない。

ただ、GPMDPからGMBに曲を渡す処理の実用性が確認できた(正確には、そのためにこの曲を掛けた)。今朝、先日見つかった、曲が勝手に次々とGMBに追加される問題を修正し、当初の想定どおり、再生中の曲の次の1曲だけが追加されるようにした。一方、この曲はそれぞれの長さが短い(数秒の曲もある)ので、処理が遅いと、次の曲の開始に間に合わない可能性があるので、ちょっと冷や冷やしなから聴いたのだが、ほとんど問題なかった。1-2曲、頭の音量が小さく、間に合わなかったかなというのがあった程度だ。ただ、問題が起こるとすれば曲間の長さで、音量は関係ないはずなので、マスタリングの問題だったのかも知れない。

ところで、上に書いた、「説明的」という言葉は、聴きながらふと頭に浮かんだので使ったのだが、自分でも何を指すのか分からない。さっき聴きながら考えたら、くどいとか、わざとらしいとか、その結果、滑らかさに欠けているということなのかも知れない。

こういう表現は、オーディオマニアの「アーティストの息遣いが聞こえる」のようなのに似ているが、そっちほどは眉唾でない気がする。というのは、こっちは感じたままを(伝わるかどうかは別として)文字に変換して書いているのだが、向こうは、聞こえるはずのない音が聞こえたと思い込んで(そうしないと、立つ瀬がないので)書いているのだから。でも、やっぱり同じこと??w

ラン(名字はこれで正しいのか? なんかおかしい感じだ)は前の会社に居た中国の人に似ている。顔はもちろん、若いし、本人に会ったことなどないが、性格がすごく明るそうで、その点でも似てそうだ。

 

PS. ラン・ランの名前から、「留園行って幸せ食べよ」のCMを思い出した。ここの読者の方にはお馴染みとは思うが、今の若い人たちに言っても、きっと「なにそれ??」状態であろう。このお店は、今もやっているようだ。

店の名前は「龍園」だと思ったのだが、検索したら違っていた。この字は留年を連想させるのでw、イマイチの印象だ。おどろくべきことに、リンリン・ランランのアルバムがGPMにあった。もちろん聴かない。でも、中に「恋のパッコンNo.1」とかいう妙な題の歌があって、ちょっと聴きたくなった。何がパッコンなのか?w

  •   0
  •   0

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だなあ。 ← URLの書き方を間違えていたようだったので、撤回する。 (9/25 20:26)

(9/25 22:56 わずかに修正、余談を追加)

  •   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
  •   2

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