Medoly 1周年

Medolyは2013/12/8にVer.1.0がリリースされたので、昨日で公開から丁度1年経ちました。

Androidで始めて作成したアプリだったので、1年前のリリース時はかなり色々問題がありましたが、この1年で機能追加やら改善やらで大分自分の理想
のアプリに近づいてきたように思います。なお、現在のバージョンは1.7.6。内部的なバージョンコードは50で、1年間で49回バージョンアップさせて
います。

お使い頂いてる方には何となく分かるかと思いますが、とにかく歌詞の表示に注力しています。理由は、そういう機能を重視したアプリがさっぱり見られないからです。無いなら自分で作ってしまおう、というのが開発を始めた動機だったりします。

近年、音楽の販売はどんどんCD販売からネットワーク販売に移行していますが、CDは必ずジャケット等に必ず歌詞がついてました。ところが、音楽配信サービスは多くの場合、歌詞がついてない。それが当たり前になっている。歌詞を見たいなら、広告がベタベタ貼ってあって、コピー&ペーストも出来ない歌詞サイトとやらを利用することになります。

もうアホかとバカかと。なんでそれで満足してんの?自分で買った曲の歌詞ぐらい自由に利用させろ。そもそも、最初から従来の歌詞カードの代用になるデータを寄越せよ。ってのが個人的な本音です。

そういう不満タラタラな状態だったのですが、以前より歌詞データの仕様については色々調べていたこともあり、とりあえずそれを実現可能な形にしてみたのがMedolyです。多分、現状Google Playストアにあるどんな音楽プレイヤーよりも対応してる歌詞の種類は多いと思います。あと、ライブラリ依存ですが文字コード判定もそこそこ高い精度でできていると思うので、英語しか出せないようなアプリが多い中、比較的多くの言語で利用できると思います。要するに、言語・種別問わず多くの歌詞が表示できるのではないかと思います。

そんなこんなで、本アプリはまだまだ色々追加したい機能や改善したい部分が多数あるので、これからものんびり開発を続けていきたいと思います。もしご意見・ご要望等ありましたら、遠慮せずに連絡いただけると嬉しいです。

ちなみに、現状で考えてる追加機能は、

  • プラグインによる機能追加
  • 歌詞の表示レイアウト調整
  • プレイリストのエクスポート

など。もう少し色々ありますが、大きなところはそんな所です。
プラグインは、歌詞やアルバムアートの自動取得等の機能も込みで。その辺はまだまだ先の話ですが。どう実装したものかと手探りなところがありますが、温かい目で見て頂けると幸いです。

そんなこんなで、これからもよろしくお願いします。

Medoly Ver. 1.7.5, 1.7.6

2014-11-02 Ver. 1.7.5
– MP3 内蔵歌詞 Lyrics3 v1, Lyrics3 v2 形式対応
– 以下の外部字幕ファイル対応
 * SRT (SubRip) フォーマット [.srt]
 * STL (Spruce subtitle) フォーマット [.stl]
 * SCC (Scenarist Closed Caption) フォーマット [.scc]
 * SSA/ASS (SubStation Alpha) フォーマット [.ssa/.ass]
 * TTML (Timed Text Markup Language) フォーマット [.xml]
– プロパティ情報のファイルパスをフォルダとファイルに分割
– フォルダの共有を追加

MP3 内蔵歌詞 Lyrics3 v1, Lyrics3 v2 形式対応

MP3は規格的に古い事もあり、長い歴史の中でいくつものタグ種別があります。
歌詞の内蔵方法にもいくつかの種類があり、主に以下のようなものがあります
・ID3v2 USLT
・ID3v2 SYLT
・Lyrics3 (Version1, Version2)

USLTは非同期歌詞を保存するタグです。単純なテキストが格納され、MP3で「内蔵非同期歌詞」と呼ばれるのはこれです。この歌詞タイプの場合、比較的多くのプレイヤーで読み取りができると思います。
SYLTは同期歌詞を保存するタグです。歌詞は単純なテキストではなく、テキストとタイムコードが交互に登場するような形となっています(参考: id3v2.3.0 – ID3.org )。この内容を独自に解析しているので、表示結果が怪しいところがあるかもしれません。Windows Media Playerのバージョンによっては、これが読み取れる場合があるようです。
Lyrics3は、ID3v1、ID3v2とも独立したタグです。名前の通り歌詞が保存されますが、タイトルやアーティスト情報も保存できるようです。Version1とVersion2がありますが、Version1は古い規格なので、Version2さえ使っておけば良いかと思います。歌詞はテキストで作られますが、その内容はLRCファイルと同一のフォーマットとなるようです。というか、LRCファイルがLyrics3の内容を外出ししているのでしょうか(その辺の経緯はイマイチ分かってません)。Medoly内部でも、Lyrics3の内容をLRCファイルの解析処理にそのまま流して処理しています。いくつかの同期歌詞対応ソフトは、この歌詞を利用しています。

これらは以前からずっと対応しようと思ってましたが、ようやく対応させることができました。これで、大体の内蔵歌詞は読み取れるようになったと思います。読み取り結果に怪しい部分があるかもしれませんが、その際は連絡頂けると幸いです。

なお、これを作っていて分かったのですが、海外のアプリは概ね「文字コード?何それ美味しいの?」レベルの対応しかしていないようです。そんなわけで、Shift_JISで歌詞を保存した場合、まともに表示できるアプリは非常に限られてくると思います。歌詞やタグをMP3に保存する場合は、Unicodeを用いるようにしましょう。Medolyはなにぶん日本人が作ってますので、Shift_JISでも何とかなるかと思いますが。

余談ですが、カラオケタグについて調べてるうちに、ルビの規格について考えてる記述を見つけました。余力があれば、この辺も何とかしてみたいところ。

タイムタグ規格ルビ拡張規格 [翔星 Be ランド| BeOS 特集]

以下の外部字幕ファイル対応

世の中には歌詞ファイル以外に、動画の字幕データを歌詞として用いる文化があるようです。私はほとんど見たこと無いですが。とりあえず「Mediaplayer for lyrics」に名前負けしないよう対応させてみました。対応に当たり、以下のライブラリを利用しています。

JDaren/subtitleConverter · GitHub

一応こういう事をやってる方もいるようです。

春日 – カラオケ字幕制作ソフト プロジェクト日本語トップページ – SourceForge.JP

これも余談ですが、対応させたフォーマットのうち、TTMLフォーマットというXMLファイルがあります。w3cで策定された、由緒正しいフォーマットです。

Timed Text Markup Language 1 (TTML1) (Second Edition)

これは字幕等の時間に合わてテキストを表示させたりするためのものですが、歌詞データにも利用できるようです。今は文字読み取りぐらいしかできませんが、文字修飾等も定義しやすいため、時間があればこの辺を色々弄り回して色々表示できるようにしてみたいところ。

プロパティ情報のファイルパスをフォルダとファイルに分割

プロパティリストで「ファイルパス」となっていた所を、「フォルダパス」と「ファイル名」に分割しました。理由は、そちらの方が利用しやすいからです。
主な利用は、次の項目を参照。

フォルダの共有を追加

上記で追加したフォルダパスについて「共有」アクションを行うことができます。対応するアプリに共有すると、該当のフォルダパスを閲覧することができます。現在対応を確認しているアプリは、「ES ファイルエクスプローラー 」と、「Solid Explorer File Manager 」です。
フォルダを共有する際、MIME Typeに「resource/folder」を設定しています。上記以外にこのMIME Typeに対応したアプリであれば、共有を受け取る事ができるはずです。

余談ですが RFC2425 によると、フォルダ(ディレクトリ)のMIME Typeは「text/directory」らしいのですが、これを設定しても上記のアプリは受け取ってくれませんでした。Linuxだと「inode/directory」の模様。Androidだと、特定の機能ディレクトリを開くために「vnd.android.cursor.dir/*」というMIME Typeを利用するようですが、ストレージフォルダを開くための使い方がよく分かりません。

上記のように、正しいディレクトリのMIME Typeが特定できなかったため、設定からMIME Typeの変更ができるようにしています。

2014-11-20 Ver. 1.7.6

– プレイリストのダイアログ修正 (一部機種で開けない問題に恐らく対応)
– スリープ復帰時にダイアログのボタンを押すとエラーとなる問題の対応追加
– 再生キューのドラッグ&ドロップ処理修正
– SDカード未認識時のエラー処理修正

プレイリストのダイアログ修正 (一部機種で開けない問題に恐らく対応)

これは、アプリのエラーレポートにあがっていました。
プレイリストを開こうとすると落ちるとのこと。エラー内容を見ると、どうもプレイリストの一覧を開く時にエラーが発生しているような様子なのですが、私の端末では発生しないため、どうも特定の機種で発生する事象のような感じです。調べてみると、同様の事象がヒット。

技なれど波高し 【解決】android ListViewのonTouchにてNullPointerException

要するに、きちんとリストを実装しなさい…と。確かに、ここについては標準のリストをそのまま使っており、特別な実装を何もしていなかった。そんなわけで、ここもきちんと実装を行うように修正。

ただ、この問題についてはこちらで修正されたかどうかの確認ができないため、このエラー報告をあげて頂いた SoftBank 201M (MOTOROLA RAZR M) を利用されている方、 もしエラーが直ったという場合は御一報いただけると幸いです。もし、まだ直っていない場合は再度エラーレポートをあげていただけると助かります。

追記

報告された方から連絡があり、プレイリストはきちんと開けたきちんと読み込めたそうです。
というわけで、リストはAndroidのデフォルトのやり方( android.R.layout.simple_list_item_1 等を使うやり方 )でやると危険なようです。アダプタのgetViewをオーバーライドして、自分で処理を書くようにした方が無難かと思います。

スリープ復帰時にダイアログのボタンを押すとエラーとなる問題の対応追加

これはAndroidの仕様なのですが、ダイアログを開きっぱなしの状態でスリープに入って、復帰した際に、ダイアログ上に保持していた情報が欠落してしまいます。その状態で処理を続けると、NullPointerException等のエラーが発生します。
正攻法としては、そうならないようにダイアログを作るのが筋なのですが、正直物凄く面倒臭いので、「情報が欠落したらその時はメッセージ出すから再操作してくれ」というスタンスで作ってます。その処理に漏れがあったため、エラーが発生していました。

再生キューのドラッグ&ドロップ処理修正

再生キューを「編集モード」にした際、順番を入れ替える事ができますが、ここの描画更新処理がおかしかったので修正しました。単純に、ライブラリの使い方を間違ってました。

SDカード未認識時のエラー処理修正

SDカードがアンマウントされた状態でエラーが発生すると、エラーを繰り返してしまい、物凄い勢いでバッテリーが消費されていくという最悪のバグがあったので、修正しました。…多分。
以前直したはずなのですが、ギャップレス再生対応した際に復活してしまった模様です。

Medoly Ver. 1.7.0, 1.7.1

2014-10-17 Ver. 1.7.0

– 歌詞の表示スタイル設定追加
– 設定画面を画面分割化
– 表示タブのメニュー一部修正
– 表示タブのボタン配置一部修
– 再生・停止ボタン連続押しの挙動変更
– スリープ時にCPUに負荷がかかる問題修正
– 停止時のオフセット調整時に歌詞が追従しない問題修正
– メディアエラー時の処理修正
– 未選択状態の曲送りボタン押下時動作修正
– 設定の文言修正

歌詞の表示スタイル設定追加

歌詞の表示について、以下の項目を設定できるようにしました。これらは設定画面から変更できます。
  • 背景色
  • 歌詞テキストの影色
  • 未再生歌詞のテキスト色
  • 再生済歌詞のテキスト色
  • 再生中歌詞のテキスト色
  • 再生中歌詞の背景色
  • 再生中歌詞のボーダー色
  • アルバムアートの透明度
  • フォント種別(Sans-serif, Serif, Monospace)
  • フォントスタイル(太字、斜体)
  • 表示位置(左寄せ、中央寄せ、右寄せ)
また、スタイルのプリセットを選択することで、初期表示に戻すことができます。
なお、フォント種別、フォントスタイルについては、使用するフォントが対応していない場合は変化しません。特に日本語フォントについては、対応していない場合が多いと思います。というか、太字以外に変化してるのを見たことないです。恐らく、ほとんどの人がそうだと思います。そんなわけで、実質英語歌詞向けの設定になってます。
この設定、本当は各自でプリセットを保存できるようにして、メイン画面のタブメニューからプリセットを一発で切り替えられるような機能を持たせたかったのですが、作るのが大変だったので今のところはこの辺で妥協。そのうち作るんじゃないかと思います。

なお、これに伴い以下のライブラリを追加しています。

attenzione/android-ColorPickerPreference · GitHub

設定画面を画面分割化

歌詞スタイル関連の設定が増えすぎたので、流石に1画面で表示させるのは辛くなってきました。そんなわけで、従来の1画面から種別ごとに画面分割するようにしました。

表示タブのメニュー一部修正

表示タブをタップした時に表示されるメニューのうち、歌詞文字サイズの変更と歌詞同期オフセットの変更について、メニューを修正しています。

表示タブのボタン配置一部修

表示タブをタップした時に表示されるボタンのうち、文字サイズのアイコンの左右を入れ替えてま
す。
今まで、 左側がサイズ拡大、右側がサイズ縮小だったのですが、これが逆転しています。理由は、通常は右側が+方向、左側が-方向に値が増減する方が一般的であると考えられるため、それに倣うようにしました。
表示タブのメニューを修正した際に色々ボタン配置を見直した結果を反映しています。

再生・停止ボタン連続押しの挙動変更

再生・停止ボタン(再生と停止を兼ねる単一のボタン)を押した際、ヘッドセットのボタンと同じ動作をさせていたのですが、これを切り分けるようにしました。理由は、再生・停止ボタンの連続押しで曲送り・曲戻し動作が発生してしまうためです。
ロック画面の再生・停止ボタンで曲送り・曲戻し動作が発生してしまう事象への対策です。

スリープ時にCPUに負荷がかかる問題修正

これは昔から存在していた問題。何も弄ってない夜中に突然CPU使用率が跳ね上がり、ずっとCPUリソースを消費し続けるという問題がありました。これは毎日起こるわけではなく、たまに発生する上に、どのタイミングで起こるか分からない、充電中しか発生せずバッテリー稼働の際は起こらないといった症状があり、原因がよく掴めてませんでした。
これについて完全に把握したわけではないのですが、この事象はアクティビティのonResumeイベントにあった、歌詞更新ループ開始処理をはじめとした各種処理を、onStartイベントに持ってきたところ、(恐らく)発生しなくなりました。
恐らく、意図しないタイミングで歌詞更新のループ処理が走っていたものと思います。また、ループ処理も一部見直して、起動してない場合は確実に停止させるようにしました。
とりあえず、onResumeイベントを使うのは最小限に抑えた方が良さそう、という事は分かりました…。

停止時のオフセット調整時に歌詞が追従しない問題修正

以前の修正で、歌詞の更新処理を見直していたのですが、オフセット調整時に歌詞スクロール位置が反映されなくなっていたので修正しました。

メディアエラー時の処理修正

メディアエラーが発生した際の処理を修正しました。これは、ギャップレス再生を追加したことに伴う修正漏れです。

未選択状態の曲送りボタン押下時動作修正

曲が未選択状態で曲送りボタンを押した場合、本来は先頭の曲が選択されるのですが、ギャップレス再生処理を追加した際にその動作が消えてしまい、メディアが存在しないと判定されていました。

設定の文言修正

設定画面を画面分割化に伴い、メニュー項目や分類を一部変更しています。

ちなみに、表には出てこないので利用者には全く関係無い話ですが、今まで設定項目の見出しや説明文の文字列を設定XMLに直接書いていたのですが、これだと
日本語・英語で同じXMLを2つ用意しないといけないという問題があり、設定項目の食い違いに気付きにくいという問題があったため、文字列は全部別の
XMLに外だしするように変更しました。これが結構な大仕事でしたが、あくまでもユーザーには全く関係無い部分。

2014-10-26 Ver. 1.7.1

– メイン画面に再生キューの合計曲数、合計時間、再生済み曲数、再生済み合計時間の表示を追加

メイン画面に再生キューの合計曲数、合計時間、再生済み曲数、再生済み合計時間の表示を追加

タブの下側に、現在の再生曲No、再生済曲数、再生キュー曲数、再生済合計時間、再生キュー合計時間を表示するようにしました。ふと思いついて、適当に実装してみました。これに伴い、コントロール部分のレイアウトを多少詰めています。

曲数、再生時間の表示

Medoly Ver. 1.6.8

久々に変更内容の詳細でも…。

2014-10-01 Ver. 1.6.8

– 音声フォーカス取得時にエラーとなる場合がある問題修正
– アプリ再開時に歌詞再生位置が先頭に戻される問題修正

音声フォーカス取得時にエラーとなる場合がある問題修正

Ver.1.6.5でオーディオフォーカスの処理を変更しましたが、その際にnullチェックが漏れていたため、NullPointerExceptionが発生してました。
メディアがセットされていない状態でオーディオフォーカスの変更が発生した場合、存在しないメディアプレイヤーオブジェクトにアクセスしようとしていたためです。
 

アプリ再開時に歌詞再生位置が先頭に戻される問題修正

再生を中断した状態からアプリを再開した時に歌詞のスクロール位置が先頭に戻されてしまい、シークバー上は再生途中になっていても歌詞が先頭位置になるという状態が発生していたため、その修正です。

総ダウンロード数が500を越えた

Medolyは現在の所、総ダウンロード数が528、総インストール数が151。

アプリ情報
インストール数

総ダウンロード数

ちなみに、総ダウンロード数が500を越えると、Google Playに表示されるアプリの「インストール」項目が100~500 → 500~1000に切り替わるので、記念してここで書いてみた次第。

Google Play 情報

まぁ、ダウンロード数はさておき、これからものんびり作っていきます。

Medoly Ver. 1.6.5, 1.6.6, 1.6.7

ここ最近の変更について解説

2014-09-22 Ver. 1.6.5

– ギャップレス再生対応 (Android 4.1 以降)
– メイン画面点灯の設定追加(デフォルトで再生時のみ点灯とする)
– オーディオフォーカス処理の設定追加
– 曲戻し時に再生キューを未再生状態とする(設定で切換可)
– 本バージョンより、 android.permission.WAKE_LOCK パーミッションが追加されています

ギャップレス再生対応 (Android 4.1 以降)

このバージョンから、ギャップレス再生に対応しました。ライブ音源収録CD等の、連続した音楽がトラックで分割されている曲について、切れ目無く再生することができます。対応はAndroid 4.1以降となります。ただし、端末によっては対応されていない場合があります。AndroidのMediaPlayer標準のギャップレス再生方式を使用していますので、他のアプリでギャップレス再生できなければ、本アプリでも出来ないと思います、多分。
ギャップレス再生に対応するに当たり、内部の処理をかなり大きく見直しています。今までは、曲の切換をした際にMediaPlayerオブジェクトに対してファイルをセットし直すという処理を行っていました。今回の変更では、現在再生しているMediaPlayerオブジェクトに加え、次の曲をセットしたMediaPlayerオブジェクトの2種類を用意し、曲の切換時にMediaPlayerオブジェクトを入れ替えるという処理を行っています(入れ替えた時に、更に次のMediaPlayerオブジェクトを作成しています)。
これは、ギャップレス再生に対応する上で必要な変更なのですが、この結果として内部の処理を大幅に見直す必要がありました。
そんなわけで、かなり入念に確認をしたつもりなのですが、今回の変更で問題が発生する可能性は高いです。何かあれば、ご報告頂けると幸いです。
テストに使ってた曲

メイン画面点灯の設定追加(デフォルトで再生時のみ点灯とする)

今まで、メイン画面の点灯にチェックを入れると、メイン画面を表示している時は常に画面が点灯する(消灯しない)動作となっていましたが、これを設定画面で「常に点灯」「再生中のみ点灯」「歌詞表示中のみ点灯」「歌詞再生中のみ点灯」という4種類から選択できるようにしました。デフォルトは「再生中のみ点灯」となります。
これは、点灯状態で携帯を放置すると画面が表示されたままバッテリーを大きく消耗してしまうためです。これにより、電池が尽きてしまう状況に何度か遭遇したため、再生中のみ点灯するオプションを追加した次第。

オーディオフォーカス処理の設定追加

設定画面に、オーディオフォーカス(音声フォーカス)についてのオプションを追加しました(これに伴い、一部設定を削除しました)。オーディオフォーカスとは、アプリが音声についての各種操作を受け付けるために必要な設定です。これは、Android上で動作する何れか一つのアプリが持っており、アプリがオーディオフォーカスを取得すると、別のアプリのオーディオフォーカスが外れる、という動作をします。リモコンのボタンや、ロック画面のコントロールを受け付けるのは、オーディオフォーカスを持つアプリとなります。
今回、本アプリがオーディオフォーカスを取得するタイミングと、オーディオフォーカスが外れた場合の動作についての設定を追加しました。
オーディオフォーカスを取得するタイミングは、「取得しない」「アプリ起動時」「再生開始時」「アプリ起動時&再生開始時」の4種類から選択します。デフォルトは「アプリ起動時」です。「取得しない」とすると、オーディオフォーカスを取得しないためリモコン関係の設定は無効になります。「アプリ起動」とすると、アプリを起動した時にオーディオフォーカスを取得しますが、音楽再生中に別のアプリにフォーカスを奪われると、アプリを再起動するまでリモコン操作を受け付けなくなります。
オーディオフォーカスが外れる場合、一時的に外れる場合と、永続的に外れる場合があり、それぞれについての動作を設定できます。動作は、「再生を停止する」「音量を下げる」「何もしない」の3種類から選択します。それぞれ、メッセージを表示することができます。

曲戻し時に再生キューを未再生状態とする(設定で切換可)

本アプリは、曲を再生すると曲が「再生済」状態となります。従来はこの状態から曲戻しをすると、再生済状態のままとなっていました。今回の変更では、曲戻しをすると未再生状態に戻されます。
この理由は、一度「曲戻し」をした後に「曲送り」をすると、再生済みの曲がスキップされるため、「曲戻し」前の曲には戻る事ができなかったためです。聞きたい曲を探して曲送りを連打する→行きすぎたので曲戻しをする→やっぱり行きすぎた先の曲も聞きたい、という事がしょっちゅうあったので、このような動作に変更しました。


本バージョンより、 android.permission.WAKE_LOCK パーミッションが追加されています

今まで、MediaPlayerオブジェクトに setWakeModeでWakeModeを設定していなかったのですが、今回、PowerManager.PARTIAL_WAKE_LOCK を設定するようにしました。この変更に伴い、android.permission.WAKE_LOCKパーミッションが必要となっています。
正直、これの効果はよく分かっていません。ただ、これが無いと音楽再生中にアプリが中断してしまうことがあるようです(私の環境では発生していないのですが)。再生を維持させるための設定のようなのですが、効果を確認する方法がわかりません。まぁ、おまじないみたいなものと考えています。

2014-09-24 Ver. 1.6.6

– リモート操作が復帰しない場合がある問題修正
– 曲切換時に再生キューがスクロールしない問題修正
– 終了時にメディア状態が保存されない問題修正
– 設定文言一部修正

リモート操作が復帰しない場合がある問題修正

音声フォーカスの取得処理がおかしかったバグの修正です。

曲切換時に再生キューがスクロールしない問題修正

曲が切り替わった際に、再生キューの自動スクロールをしてもスクロールが発生しないバグの修正。ギャップレス再生の対応に伴い、処理を入れ忘れました。

終了時にメディア状態が保存されない問題修正

メニューの「終了」から終了させた場合、メディアの再生位置等が保存されない問題があったので修正。これは既存バグ。

設定文言一部修正    

設定画面の文言を一部修正しています。

2014-09-26 Ver. 1.6.7

– 単体再生時の曲送り・曲戻し動作を修正

単体再生時の曲送り・曲戻し動作を修正

単体再生時、曲送りを押した際に次メディアがあっても「メディアがありません」と言われてしまう問題修正。ギャップレス再生対応に伴うバグです。

再生履歴の日付表示について

再生履歴に表示される「x日前」という日付表示について、言い訳っぽい話。

再生履歴の一覧は、日付毎に見出しがつきます。2日前なら「2日前」、1週間以上前なら「x月x日」という日付で表現されます。
ところが、本日再生分と1日前再生分のタイトルは、恐らくAndroidのバージョンによって変わってきます。 どこから変わってくるのかよく分かりませんが、Android 4.4 (CyanogenMod 11)では、「今日」「昨日」と表示され、Android 4.1 (SOL22)、Android 4.0.4 (ISW13HT) の場合は、「0日前」「1日前」と表示されてしまいます。
これは、DateUtilsのgetRelativeTimeSpanStringメソッドの挙動です。「今日」「昨日」と表示されるのが、本来正しい表示かと思います。とりあえず、バージョンや端末によって違ってくるかと思いますが、「0日前」と表示されたところで動作に影響があるわけではないので、この辺の表示はとりあえずこのままの方向で。

SOL22 (Android 4.1)

CyanogenMod11 (Android 4.4)

Medoly Ver. 1.6.0, 1.6.1, 1.6.2

Ver. 1.6.0 変更履歴

2014-08-07 Ver. 1.6.0
– ロック画面コントロール追加 (設定でON/OFF切換)
– 通知バーからコントロール可能に変更
– 再生履歴のディスク番号が正しく表示されない問題修正
– 再生履歴が正しくチェックされない問題修正

ロック画面コントロール追加 (設定でON/OFF切換)

ロック画面へのコントロールを追加しまいた。Android 4.0以降の対応となります。
設定画面でON/OFFできます。ロック画面コントロールのデザインはこちらからは制御できず、端末の機能に依存します。「ロック画面をこうしたい」という場合は、端末メーカーまでご要望をお伝え頂ければ…。

通知バーからコントロール可能に変更

シンプルな通知バーだったものを、コントロール可能な通知バーに変更しました。Android 4.0以降の対応となります。

再生履歴のディスク番号が正しく表示されない問題修正

再生履歴のトラック番号が正しく表示されなかった問題を修正しました。昔からある潜在的な問題でした。

再生履歴が正しくチェックされない問題修正

チェック項目の表示処理が間違っていました。

Ver. 1.6.1 変更履歴

2014-08-07 Ver. 1.6.1
– 通知バーで文字が重なる問題修正

通知バーで文字が重なる問題修正

通知バーのコントロールを作成した際、レイアウトの問題で文字が長いと文字同士が重なる問題があったため、修正しました。

Ver. 1.6.2 変更履歴

2014-08-07 Ver. 1.6.2
– 歌詞のスクロール処理を修正

歌詞のスクロール処理を修正

歌詞が正しくスクロールされない問題を修正しました。

Medoly Ver. 1.5.5, 1.5.6, 1.5.7, 1.5.8

Ver. 1.5.5 変更履歴

2014-08-01 Ver. 1.5.5
– メイン画面拡大機能追加
– ヘッドセットボタンの複数回押しによるメディア切換機能追加
– 歌詞の行末尾にタイムタグがある場合のアクティブ化処理を変更
– 共有されたAndroid DB未登録メディアを再生キュー登録可能に変更
– アルバムアート背景を白に設定できなくなっていた問題修正
– 再生履歴のスクロールで落ちる場合がある問題修正
– 再生履歴にトラック番号表示するよう修正
– サムネイル読込み処理修正
– アプリ起動時に再生キューが現在メディアにスクロールしない問題修正

メイン画面拡大機能追加

表示タブのメニューに「メイン画面の拡大」項目を追加しました。メイン画面下部のコントロール領域と、Androidの通知バーを非表示にします。とにかく表示領域だけを大きく取りたい用途向けです。どのような用途を想定しているかと言うと、歌詞やアルバムアートだけを表示させたり、HDMI等で外部出力した際に、操作部分を隠して表示部分だけを大きくしたい場合等です。
まぁ、思いつきで追加した機能なので、もう少し色々検討するかもしれません。こういう事もできますよ、という実験みたいなものなので。

ヘッドセットボタンの複数回押しによるメディア切換機能追加

今までもヘッドセットのボタンを押すと、再生・停止を切り替えることができましたが、2回押しで次の曲、3回押しで前の曲に切り替える機能を追加しました。
iPhoneのように、「2回押し+押しっぱなし」で早送り、「3回押し+押しっぱなし」で巻き戻し…という機能はありません。ボタンを押しっぱなしにするとAndroid標準の音声検索が起動してしまうため、実装することができませんでした。キーを横取りできるかもしれませんが、そこまで頑張る必要はないかなぁ…と。
この機能を利用するには、設定画面よりONにします。複数回押しを検出させるために、ボタンを押した際の反応を少し遅らせていますので、使わない場合はOFFの方が良いでしょう。

歌詞の行末尾にタイムタグがある場合のアクティブ化処理を変更

歌詞の表示について。細かい話かもしれないけど、こだわる人には多分重要な変更。
タイムタグが設定された同期歌詞において、1行の末尾にタイムタグがある場合。例えば以下のような感じ。

[00:00:00]
[00:10:00]あ[00:11:00]い[00:12:00]う[00:13:00]え[00:14:00]お[00:15:00]
[00:20:00]

この場合、今までは開始10秒で2行目の歌詞がアクティブ状態になり、20秒で3行目がアクティブになるまで、2行目がアクティブ状態となっていました。
今回の変更で、 15秒で2行目が非アクティブ状態となり、3行目がアクティブになる20秒まではアクティブ行が存在しない状態になります。
これにより、ボーカルの切れ目等を表現できるようになります。

 

共有されたAndroid DB未登録メディアを再生キュー登録可能に変更

今までは、Android DBに登録された曲しか再生することができなかったのですが、未登録曲も再生できるようになりました。未登録曲は、他のアプリから本アプリに対して「共有」させることで再生キューに登録され、再生できるようになります。ただし、この曲はプレイリストに登録することはできません。Androidのプレイリスト仕様上不可能です。一応、独自プレイリストも作れるようにしてはあるので、時間がある時にでも実装してみます。

アルバムアート背景を白に設定できなくなっていた問題修正

アルバムアートの背景は白・黒で切り替えられるようになっていますが、白くできなくなっていたので修正しました。ボタンの背景画像を弄った際に誤って修正していました。

再生履歴のスクロールで落ちる場合がある問題修正

再生履歴のリストについての問題です。サムネイルの取得に失敗していました。

再生履歴にトラック番号表示するよう修正

再生履歴のアルバム名にトラック番号を表示するようにしました。

サムネイル読込み処理修正

サムネイル読込み処理を修正しました…が、これは後のバージョンで再度修正されています。

アプリ起動時に再生キューが現在メディアにスクロールしない問題修正

アプリ起動時に、再生キューがスクロールしない問題を修正…したつもりが、あまり修正されていません。調査中です。

Ver. 1.5.6 変更履歴

2014-08-02 Ver. 1.5.6
– サムネイル表示にアニメーション追加
– 再生履歴の表示が遅くなる問題修正
– 余分なスクロール処理を省略するように修正

サムネイル表示にアニメーション追加

サムネイル表示時に、短時間のフェードインアニメーションを追加しています。
サムネイル表示の際に、キャッシュから取得する場合と、アルバムアートから取得する場合があります。この2パターンの取得は当然表示までの時間差があります。スクロールしていった場合、キャッシュ画像は画面に入った段階で表示済みになりますが、画像は一旦サムネイルに落とし込むため、表示に時間がかかります。そのため、表示タイミングに差が生まれて違和感がありました。そのため、一律で短時間のフェードインアニメーションを追加することで差異を少なくして、違和感を緩和させています。
…この違和感は、私だけかもしれません。

再生履歴の表示が遅くなる問題修正

再生履歴ダイアログにリストを表示した場合、サムネイルが1枚読込まれる度に画面全体のレイアウトが再読込され、全ての表示項目にgetViewメソッドが呼ばれ、表示が非常に遅くなっていました。これはリストの高さを固定していないことで発生する事象です。

参考: [Android] ListViewのlayoutをwrap_contentで指定しない | Developers.IO

通常のActivity上で行う分には発生しにくいと思いますが、ダイアログに表示した場合、高さにmatch_parentを指定するだけではダメで、ダイアログに表示するビューの高さを固定しないと割と簡単に発生します。 これの原因を突き止めるのは割と苦労しました…。

余分なスクロール処理を省略するように修正

スクロール処理が複数回発生していたポイントがあるので、それを修正しました。

Ver. 1.5.7 変更履歴

2014-08-03 Ver. 1.5.7
– サムネイルの更新処理を修正
– 再生履歴ダイアログの末尾が見えない問題修正
– シャッフル再生において正しくシャッフルされていなかった問題修正

サムネイルの更新処理を修正

サムネイルの取得・更新処理を修正しました。バグ修正です。

再生履歴ダイアログの末尾が見えない問題修正

Ver.1.5.6でダイアログの高さを固定しましたが、固定した高さがおかしく、最後の行が途中で切れてしまう問題があったので、固定の高さを修正しました。

シャッフル再生において正しくシャッフルされていなかった問題修正

シャッフルの処理が、ずっと処理を間違ってました。再生キューをクリアせず、曲の追加・削除を繰り返すとシャッフルがどんどんズレていくという問題があったため、修正しました。

Ver. 1.5.8 変更履歴

2014-08-03 Ver. 1.5.8

– リストのサムネイル読込み時に落ちる問題修正

リストのサムネイル読込み時に落ちる問題修正

タイトルの通り。バグ修正です。

Medoly ver. 1.5.0

1.5.0という、ちょっと節目っぽいバージョンだったので、この時は結構更新を頑張りました。

変更内容

2014-07-19 Ver. 1.5.0
– 再生履歴機能追加
– タブメニューのデザイン変更
– 再生順メニューのデザイン及び挙動変更
– 通常再生/シャッフル再生切換時の処理を高速化
– タブタップ時の色替え追加
– ハードウェアキーの早送り・巻き戻し対応
– サムネイルの非表示設定追加
– 設定項目一部修正
– 内蔵アルバムアートが共有できなくなっていた問題修正
– キューを削除した場合に落ちる場合がある問題修正
– 歌詞の先頭空白行でスクロールしない問題修正
– ボタン背景やアイコンデザインをいくつか修正
– 内部の処理をいくつか修正


再生履歴機能追加

再生キュータブのメニューから呼び出します。再生済み曲のリストを表示し、再生順と逆順で表示されます。
一瞬でも再生すると追加されます。再生履歴上に存在する曲を再生した場合、過去の履歴は削除され、新たに先頭に追加されます。 
再生履歴の曲を選択し、「開く」ボタンを押すと再生キューに追加します。再生キューに曲が存在する場合は、再生キューの末尾に追加するか、再生キューをクリアして新たに追加するかの確認ダイアログが表示されます。(プレイリストを開く場合と同様)
設定画面で、保存履歴数を0~999で変更を行うことができます。多くすると、リストが開くまで時間がかかるかもしれません。 0にすると、タブメニューの項目自体表示されなくなります。
とりあえず簡易的なもので、それほど高機能なものではありません。

タブメニューのデザイン変更

タブのメニューを丸みを帯びた吹き出しのようなデザインに変更しました。機能的な変更はありません。今まではAndroid標準の「PopupMenu」というクラスを利用していたのですが、これは表示位置やデザインの調整ができないため、メニューが下に表示されてしまう等の問題がありました。これを「PopupWindow」クラスに変更することで、表示位置を調整できるようにすると共に、メニューを自由にデザインできるように修正しました。 (逆に自分で色々作り込まないといけなくなるので、ちょっと面倒でした。)

再生順メニューのデザイン及び挙動変更

再生順メニューも、タブメニュー同様に変更しました。また、ここのメニューはチェックを切り替えてもメニューが閉じません。閉じるには、枠外をタップします。この挙動の変更は、再生順「通常」・再生完了「停止」から、再生順「単体」・再生完了「リピート」に切り替えたいと思う場合、複数のチェック切換が必要になるため、一々ポップアップメニューが閉じられてしまうと作業が繁雑になってしまうためです。

通常再生/シャッフル再生切換時の処理を高速化

本アプリは、曲の再生順を全て自前で制御しています。
そのため、再生順の「通常」と「シャッフル」を切り替えるとDB上の再生キューの再生シーケンス番号を更新する処理が走ります。 この時の処理を変更(無駄な処理を排除)して、更新を高速化しました。
再生キューに多数の曲が登録されていると、流石に処理が一瞬止まってしまうのはご了承ください。(もしかしたら改善策はあるかもしれません。)

タブタップ時の色替え追加

メイン画面のタブをタップした際に、タブをハイライトするようにしました。操作に対する視覚的なフィードバックを与えるという、UIの改善です。

ハードウェアキーの早送り・巻き戻し対応

早送り・巻き戻しのハードウェアキー(リモコンのキー)に対応しました。
…対応してるはずです。「はず」というのは、早送り・巻き戻しのボタンを持ってるリモコンを持ち合わせていないので、テストしていないためです。 早送り・巻き戻しを押した時と同様の処理をしているので、動くはずです。…理論上は。

サムネイルの非表示設定追加

サムネイルを非表示に出来るようにしました。設定画面から変更します。設定を変更すると、再生キュー、検索画面、再生履歴のサムネイルを非表示にします。非表示にすると、スクロールが高速になります。もちろん、サムネイルが表示されなくなるので、曲を探す際の視認性は悪くなります。何はともあれ動作速度が欲しい人向け。

設定項目一部修正

設定項目を一部見直しました。
細かい内容は忘れました…。

内蔵アルバムアートが共有できなくなっていた問題修正

プロパティタブから内蔵アルバムアートを「共有」できるようにしたつもりできたが、出来ていませんでした。バグ修正です。

キューを削除した場合に落ちる場合がある問題修正

バグ修正です。

歌詞の先頭空白行でスクロールしない問題修正

同期歌詞で歌詞の先頭が空白だった場合、初期位置が先頭に来ない問題があったため、修正しました。

ボタン背景やアイコンデザインをいくつか修正

歌詞・アルバムアート表示タブに表示されるボタンの背景の修正です。
このボタンは元々曰く付きで、Androidでデフォルトで用意されている「Holo」というテーマ標準のボタンは、透明度が高すぎて単純に配置しただけでは背景のアルバムアート画像が透けすぎてボタンが見えにくいという難点がありました。これを変更する方法が分からず、ボタンの後ろにもう1枚オブジェクトを重ねて不透明化するという荒技をやっていました。
…が、いい加減何とかしようと思って調べたもののやっぱり分からない…というか、多分設定から変更するような方法は無いと思うので、 ボタン背景画像の差し替えを行いました。
以下のサイトから、Holoと同様のイメージを生成できます。

内部の処理をいくつか修正

細々したバグや挙動の修正です。
何やったかは忘れましたが、変更履歴に書いたので、多分何かやったのでしょう。