2015-12-17

内蔵歌詞まとめ

音楽ファイル内蔵歌詞について、開発していく中で分かったことについて簡単に触れておきます。
多くの音楽ファイルは、ファイルの中に歌詞を内蔵することができます。内蔵歌詞は大抵の場合、非同期歌詞(つまり、ただのテキスト)となっていますが、同期歌詞を内蔵する場合もあります。歌詞データは音楽ファイルの中にタグ(タグフィールド)として埋め込まれています。
ところで、一口にタグと言っても様々なフォーマットが存在します。これは、音楽ファイル固有の場合もありますし、異なる音楽ファイル間で共通して用いられる場合もあります。タグのフォーマットとファイル形式の対応を以下に示します。

  • ID3:MP3標準のタグフォーマット。ID3v1とID3v2があるが、通常はID3v2を使用する。
    対応形式: MP3(.mp3), AAC(.aac)
  • Lyrics3: MP3のタグフォーマット。ID3と互換性は無い。v1とv2がある。"Shiang-shiang's Lyrics Displayer"というWinamp の歌詞表示プラグインが埋め込むタグが元となっている…らしい。
    対応形式: MP3(.mp3)
  • Vorbis Comment: Vorbis音楽ファイル標準のタグフォーマット。
    対応形式: Ogg Vorbis(.ogg), Flac(.flac)
  • iTunes MP4: AppleのソフトウェアがM4Aファイルに付加するタグフォーマット。
    対応形式: AAC(.m4a)
  • ASF (Windows Media): Windows Media形式で使用されるタグフォーマット。
    対応形式: ASF(.asf), WMA(.wma)
  • APE tag: Monkey's Audio音楽ファイルで使用されるタグフォーマット。様々な音楽ファイルに内蔵されている場合がある。
    対応形式: Monkey's Audio(.ape/.mac), MP3(.mp3), WavPack(.wv)
  • RIFF: 共通コンテナフォーマット。この構造を持つファイル形式は、.wavや.aviなどがある。本来は様々なデータを入れる汎用フォーマットだが、音楽ファイルはWAVE形式が一般的。
    対応形式: Wave(.wav)(PCM音源の他、MP3等が格納される場合もある)

これらのタグフォーマットは、各タグフィールド毎に識別子(ID, フィールド名)を持っています。この識別子はタグフォーマット毎にバラバラです。フォーマット間の識別子の対応付けについては、音楽情報データベースの大手であるMusicBrainz.orgTag Mappingを参考にするのが良いと思います。これが正式というわけではないですが、特にこだわりが無い限りはこれに従うのが無難です。各種アプリケーションやライブラリも、これを基準にして作られている可能性があります。それ以外には、Mp3tagのTag field mappingsなども参考になるでしょう。
これらを踏まえた上で、各タグフォーマットについて内蔵歌詞の識別子を以下に示します。

  • ID3v2: USLT(非同期, ID3v2.2はULT), SYLT(同期, ID3v2.2はSLT)
    [ID3v1は無し]
  • Lyrics3v2: LYR (同期)
    [Lyrics3v1は識別子無し]
  • Vorbis Comment: LYRICS (非同期)
  • iTunes MP4: ©lyr (非同期)
  • ASF: WM/Lyrics (非同期)
  • APE tag: Lyrics (非同期)
  • RIFF: ILYC (非同期)
    [公式のものではなく、主に日本のユーザ間で用いられていた模様]

これらに加え、アプリケーションが独自に識別子を与えて、タグフィールドを定義する場合があります。これらは、形式問わず様々な音楽ファイルに内蔵される可能性があります。とりあえず認識しているアプリケーション及び識別子には、以下のような物があります。(間違っているかもしれませんが…。)


現在、私が把握している音楽ファイル内蔵歌詞のタグフィールド(つまり、Medolyで表示可能な内蔵歌詞)については、以上になります。とりあえず、これだけ対応しておけば読めないものはほとんど無いだろう、と思っているのですが、アプリケーションが独自に付与するタグについては把握できないので、それについては個別に対応していくしかありません。

もしここに書かれていない内蔵歌詞がありましたら、ご連絡ください。Medolyは"Media Player for Lyrics"を掲げているので、対応可能な範囲は全て対応したいと思っています。
余談ですが、Medolyでは全ての音楽ファイルについて上記の識別子(非同期のみ)の存在をチェックします。そのため、Vorbis CommentにUSLTタグが含まれたり、多少イレギュラーなパターンも対応できるはずです。これは、作りが雑な音楽フォーマット変換ツールが、変換前のタグの識別子をそのまま残してしまうような状況を想定しているためです。

2015-12-14

Medoly 2周年

MedolyのVer.1.0.0を最初にリリースしたのが2013/12/08なので、Medolyをリリースしておおよそ2年ほど経過しました。

現在のバージョンは2.5.1、内部バージョンは75(つまり、74回バージョンアップしてる)。

現在の端末ベースのインストール数は600超ぐらい。ユーザ数ベースの総インストール数は2500ぐらい。

インストール端末数推移
 
総インストール数推移

驚くほど安定した増加推移で、あまり面白味はないです。
 
作りたい機能はまだ色々ありますが、現在は少し開発時間を減らしてるので、ペースは落ちます

目下の大きな目標としては、内部的に使用しているMediaPlayerオブジェクトをffmpegに置換えたいです。ただ、やっぱりちょっと面倒なので一体いつになることやら…という感じで。

これからもぼちぼち開発を続けていきたいと思いますので、今後ともお使いいただければ幸いです。

2015-11-23

MP3のタグと文字コードについてあれこれ

Medoly開発において気になったので、ちょっとだけMP3のタグの話。


MP3は汎用性は高いですが、そのタグの仕様が大変に厄介です。MP3が登場して20年ぐらい経ってると思いますが、未だに安定せず、頻繁に問題事を持ち込んでくれます。
 
まず、MP3のタグはID3タグと呼ばれる標準の規格が存在し、ID3.org において規格が管理されています。
ID3には大きく分けて、ID3v1と、ID3v2が存在します。細かく分けると、 ID3v1はID3v1と、ID3v1.1があり、ID3v2にはID3v2.2, ID3v2.3, ID3v2.4があります。ID3v1とID3v2は共存できますが、ID3v1は、今となっては使い物にならないので忘れましょう。
問題は ID3v2です。ID3v2.2, ID3v2.3, ID3v2.4は互いに互換性はありません。とりあえず一番新しいバージョンを使えばいいと思われそうですが、そうは問屋が卸しません。ID3v2.4はハードウェアやソフトウェアが対応していない事も多々あり、Windows Media PlayerやiTunesといった主要なソフトウェアは、少し前まで対応していませんでした。ID3v2.4は、文字コードにUTF-8が使えるようになったり、年だけでなく年月日が入力できるようになったりしてるといったいくつか変更はありますが、v2.3とそんなに大差はないです。現在、最も普及しているのはv2.3なので、それにしておくのが無難です。
 
そして、更に問題となるのが文字コード。 ID3v2タグには、文字コードを設定することができます。…が、文字コードとして設定できるのは、「ISO-8859-1」と「UTF-16」だけです。(v2.4はあまり使わないので、UTF-8が設定できることは忘れましょう。設定してもいいですが、多分読めないプレイヤー多数です。Medolyは読めるはずです。)

日本語を扱う上で、文字コードに「ISO-8859-1」を設定した上で、Shift_JISを入力する場面が多々あります。私から言いたい事は『金輪際そんなタグは入力しないでください』ということです。ISO-8859-1はあくまでも英語等のアルファベット文字を使う言語圏で使われる文字コードです。日本語はサポートされていません。「ISO-8859-1」と設定されているのに日本語が読めるのは、ISO-8859-1と設定した上で、Shift_JISの文字を入力しているからです。何故そのような事が慣例化しているかと言えば、MP3の黎明期、ID3v2のサポートが少なかったり、Unicodeのサポートが満足に行われていなかった時代があり、日本においては日本語の表示はこちらの方が安定していたためです。
ところが、MP3の仕様上はあくまでもISO-8859-1です。海外のソフトウェアでは日本語を読み込むことはまずできませんし、多言語が混在していた場合、それが日本語なのか、あるいは別言語なのか判別する手段がありません。
そのため今現代においては、全ての言語をサポートするUTF-16で入力した方が、確実に文字を読み込むことができます。MP3にはタグの文字コードがUTF-16と判別させる方法が存在するため、読み間違いが起こりません。


…が、事がそう単純にはいかない点もあります。ID3v2のタグの規格上、このタグの文字コードは「タグ毎に」設定することが出来てしまいます。すなわち、タイトルがISO-8859-1、アーティスト名がUTF-16となっているMP3が存在する可能性がある、という事です。例えば、作りが雑なタグ編集ソフトの場合、タグを編集した際にそのタグだけに勝手に文字コードを設定してしまうという場合もあるでしょう。

ところで、MedolyではShift_JISで入力された文字も判別できていますが、これは文字コード判別ライブラリを使って強制的に文字コードを判別させているためで す。文字コードの判別処理というは、通常かなり力業な処理が行われており、特定の文字コードにしか登場しないコードパターンの出現で判別したり、といった 事を行います。すなわち、文字数が少なければ判定を誤る可能性が高い、ということです。タイトルだけ、アルバム名だけ、といった文字数程度では判別が失敗する可能性が高いです。ちなみにMedolyでは現状、タイトル、アーティスト名、アルバム名の文字を繋げて文字コードを判別させています。

つまり、UTF-16とISO-8859-1で入力された多言語がタグに混在したMP3は、正直こちらではお手上げ状態です。Meodlyでは、現状そのようなMP3は想定していません。最初に取得したタグに応じて残り全部の文字コードを決定しています(この処理は少し変更するかもしれませんが)。何せ文字コードの自動判定がアテにならないため、それがShift_JISなのか、はたまた中国語なのか韓国語なのか、こちらで判別する手段がないためです。
ちなみに、Medolyでは本当に何も判定できない場合は、最終的に端末使用言語に応じて文字コードを分岐させています。日本語ならShift_JISになります。

そんな感じで長々と書いてみましたが、MP3のタグの読み込み(特に文字化け)については、こちらで対応できる事に限界があります。Medolyは恐らく英語圏のソフトよりは、文字が読み取られる可能性が高いですが、それでも完璧というわけにはいきません。
文字コードについていくつかご質問やご意見を頂く場合がありますが、個人的には「質問を投げるぐらいなら、さっさと自分でタグをID3v2.3、UTF-16に直してしまった方が遙かに早い」と思ってます。M4A等の別の音楽形式使うのも有りです。

最後に言いたい事まとめ。
『MP3のタグはさっさと全部ID3v2.3のUTF-16に直すこと。話はそれから。』
『MP3タグの文字コードはタグ個別に設定できる。使用するタグ編集ソフトが吐き出す文字コードをきちんと確認。英語圏のソフトはISO-8859-1のタグとか平気で吐き出す場合がある。』
『MP3のタグ仕様は本当にクソ』


2015-11-06

車を買いました

唐突ですが、最近車を買いました。1ヶ月ぐらい前の話です。というか、携帯を変えたのとほぼ同時期です。車の維持費の代わりに、携帯の回線費用を抑えたとも言います。
購入動機は、すぐ移動できる足が欲しかったのと、色々試したいことがあったためです。


もちろん、車内の音楽再生にはMedolyを使用しているのですが、その際以下のような使い方をしています。





ダッシュボードの上にクレードルを貼り付けて、その上に携帯を置く感じになってます。クレードルは少し緩衝材を挟んで、車体が揺れても携帯が落ちないようにしています。
この配置により、歌詞を見たり、再生キューから曲を選択するといった簡単な操作をスムーズに行うことができたりします。

そんな環境のため、以降の更新ではこの環境を想定した変更が行われるかもしれません。具体的には、

・クレードル設置時のアクション設定
・全画面表示状態での操作改善
・Bluetoothとの連携強化

等です。ちなみに、最近の更新でBluetoothのレイテンシ設定を追加したり、ボタンの長押しリピートを追加したのは、この環境のためです。

こうした利用について、もっとこうした方が良い等のアイデアを頂けると嬉しいです。

携帯を変えました

1ヶ月以上前の話ですが、メインで使用している携帯電話を変更しました。

[変更前]
回線キャリア:au
端末:XPeria SOL22 (Android 4.2)

[変更後]
回線キャリア:iijmio
端末:Xperia Z3 Compact (Android 5.0)

この変更の目的は、回線料金の削減他、Android の新バージョン利用を目的としていました。
最近、Android 5.0絡みの変更が多かったのは、この変更によるものです。
私の使い方では、あまり通信量が多くならないため、MVNOの回線で十分でした。回線料金が1/4以下になり、個人的には十分満足です。

あと、Android 4.2ではBluetooth のAVRCPプロファイルが1.2までしか対応していませんでした。この場合、Bluetooth接続先に再生中の曲情報を送付することができません。Android 5.0では、AVRCPが1.3まで対応しています。この辺りの機能を利用したかったため、携帯を変更したという経緯もあったりします。


Medoly Ver. 2.4.0

2015-10-23 Ver. 2.4.0
- 同期歌詞の長押しによるシーク機能追加
- 出力デバイスのレイテンシ設定追加
- 出力デバイスのスピーカー/ヘッドセット廃止
- ボタンの長押しリピート追加


同期歌詞の長押しによるシーク機能追加


これはユーザ様からの要望です。
同期歌詞を表示している時に、表示タブ上で歌詞を長押しすると、歌詞のテキストが再生される時間に曲をシークするようにしました。
これは同期歌詞のみで、非同期歌詞は非対象です。何故ならば、非同期歌詞は厳密な歌詞位置を取得することができないためです。

なお、歌詞以外の位置を長押しすると、従来同様に長押しアクションが実行されます(設定画面で切り替え)。設定で無効化することもできます。


出力デバイスのレイテンシ設定追加


以前追加した「出力デバイス」ダイアログに、レイテンシの設定を追加しました。レイテンシとは、Android内部で再生処理が行われてから、実際に音声がスピーカーやイヤホンから出力されるまでの遅延のことです。



この値を設定すると、同期歌詞の表示タイミングが調整されます(今のところは、同期歌詞だけです)。出力先を切り替えると自動的に適用されます。


これは、Bluetoothの出力先を切り替えた際に 歌詞のタイミングがズレてしまうのが以前から気になっていたため、今回追加してみました。なお、これに伴い従来設定画面に存在していた固定オフセット値(表示誤差)の設定は廃止しています。

レイテンシには、共通レイテンシと各出力デバイス固有のレイテンシを設定できます。実際のレイテンシは、双方の合計値になります。レイテンシの値は、デバイスやAndroidのバージョンによって異なります。Androidは総じて、iPhoneと比べてこの値が大きいです。

参考: スマホやタブレットの「オーディオレイテンシー」性能ランキングと自分でも可能な測定方法 - GIGAZINE

最近のNEXUSだと50ms以下になるようですが、遅い機種だと数百msにもなります。この値はユーザ自身で調整いただくしかありません。また、プログラム上の遅延もあるため、どこかに参考値として書かれている機種別レイテンシの値をそのまま設定しても、歌詞のタイミングが綺麗に調整されないかもしれません。

また、上記の値はスピーカー等から出力される場合の話で、Bluetooth出力の場合は更に遅延が発生します。また、同じBluetooth接続でも、コーデックの違いにより遅延が異なるようです。一応、参考値を画面上に記述していますが、あくまでも目安と考えてください。実際はこれよりも大きな値になる場合が多いようです。


出力デバイスのスピーカー/ヘッドセット廃止


以前のバージョンには、上記の出力デバイスダイアログに、スピーカー出力固定と、イヤホン出力固定の設定がありましたが、これらを廃止しました。理由はAndroid 5.0以降で使えないからです。また、これらを選択した状態は、音楽を流す上で不自然な状態であり、あまり推奨される状態ではなかったため、思い切って廃止してしまいました。
ご利用頂いていた方には申し訳ありません。


ボタンの長押しリピート追加


表示タブ上のボタンを長押しした際、ボタンのタップがリピートされるようにしました。ちょっとした機能改善です。

2015-11-05

Medoly Ver. 2.3.5

2015-10-17 Ver. 2.3.5
- Android 5.0以降におけるSDカード書き込み対応
- 歌詞取得プラグイン対応
- 歌詞フォルダ検索機能追加
- 再生予約解除機能追加
- シャッフル再生時、再生キュー完了で再シャッフルする機能追加
- ロック画面に画像を表示しないオプション追加
- その他細かい修正



Android 5.0以降におけるSDカード書き込み対応


Android 5.0以降でSDカード書き込みに対応させました。「設定」→「その他」→「外部ストレージの空き込み」を実行し、表示されるフォルダから対象のSDカード(外部ストレージ)のルートフォルダを選択してください。
Androidは、4.4以降では従来と同様にSDカード等の外部ストレージに書き込むことができなくなりました(読込は可能)。少し混乱があるようですが、ここで言うSDカードとは、携帯に後から追加する本当のSDカードのことで、最初から内蔵されているストレージのことではありません(フォルダ名がsdcardとなっているかどうかは無関係です)。内蔵ストレージは従来と同様に書き込みが可能です。
Android 4.4以降では、SDカードへの書き込みは、Googleが用意した特定の機能を使用するようになりました。SDカードの書き込みを行う場合、以下のような画面を表示させる必要があります。これは、ユーザに「この場所に書き込みますよ」と確認させるための共通画面で、これによりプログラムがバックグラウンドで勝手に書き込みを行うことができなくなります。これは、セキュリティ上の安全性を考慮した仕様変更のようです。



ここで問題になるのは、プログラムからSDカードに勝手に書き込みを行う処理を作成したい場合です。上記画面を選択した後、書き込み先を示すURIが取得できるため、これを保持しておくことで、プログラム上から同じ場所に何度も書き込むことはできます。
ところが、「指定フォルダ以下に自由に書き込みを行いたい」場合は少し話が変わります。 フォルダを示すURIを取得し、そのURIを基準にしてサブフォルダを検索する処理を作成する必要があります。ところが、このフォルダを選択する処理はAndroid 4.4には存在しません。Android 4.4はファイルの選択のみです。そのため、Android 4.4ではプログラムからSDカードへの書き込みが著しく制限されます。Android 5.0からはフォルダ選択が可能となり、そのフォルダ以下への書き込み操作ができるようになりました。SDカードへの書き込みが必要なファイラ等のアプリの多くで、最初にこの画面でSDカードを指定させているのは、そういう理由によるものです。
今回の変更ではこの機能を使用し、Android 5.0以降でもSDカードへの書き込みが行えるようにしました。SDカードの書き込みが必要となるのは、以下の3つの処理です。

・ M3Uプレイリストファイル出力処理
・歌詞取得プラグインの書き込み処理 (新規追加)
・設定のエクスポート処理


このうち、設定のエクスポートは単純にファイルを出力する画面を呼び出しているだけなので、Android 4.4でも可能です。ついでに言えば、Google Driveがインストールされていると、Google Driveへの書き込みもできるようになります(そういう仕様です)。以前から、Google Driveを介して複数の端末で設定を共有する機能が欲しいと思っていたのですが、思いがけず実現できてしまった形です。

残る2つについてですが、 この2点については、メディアファイルとの相対パスが必要になるため、単純にファイル書き込みを行うだけというわけにはいきませんでした。そこでSDカードを利用する場合は、最初にユーザにSDカードのルートディレクトリのURIを画面から指定してもらいます。指定されたパスがSDカードのルートディレクトリであると認識できた場合、アプリはそのURIを保持します。その上で、書き込み時はURIからパスを辿って書き込ませる、という手法を採ってます。ちょっと無理矢理な処理ですが、これぐらいしか思いつきませんでした。

余談ですが、画面から指定されたURIが「SDカードのルートディレクトリである」と判別する確実な手法が無いため、指定されたディレクトリ内にあるファイルの内容と更新日時を比較して判定しています。そのため、SDカードのルートディレクトリと同じファイル構成・同じファイル日時のファイルを用意したディレクトリを用意し、そこを指定してもルートディレクトリと誤認します。ご勘弁ください…。
ちなみに、先頭に「.」(ドット)を含む隠しフォルダへの書き込みはできない可能性があるので、使わないでください…。原因がよく分かってないのですが、新しい方式がそれをサブフォルダとしてうまく認識してくれません。現在のところ問題として認識はしていますが、解決できるかどうか不明。

長々と解説してみましたが、この辺は本当に苦労しました。この苦労でよく分かったのは、「Androidでストレージ扱うの、超めんどくせぇ」です。


歌詞取得プラグイン対応


従来、Twitterに自動的にツイートしたりするプラグインはありましたが、新たに歌詞取得プラグインというものをこさえてみました。これは、現在選択されているメディアに対する歌詞を余所から取得するというものです。(プラグインの詳細は別のエントリにて)

取得した歌詞は画面上に表示されますが、ファイルとして書き込むことも出来ます。書き込み先は、 メディアファイルと同一フォルダと、今回新たに追加した歌詞検索フォルダの2カ所です。メディアファイルへのタグ書き込みは今のところ考えていません。ファイル名はメディアファイルと同一名称で固定です…今のところは。書き込みタイプは、ファイルが存在しない場合のみ新規保存、または常に上書きの2種類があります。
イベント動作で、メディアが選択された時に自動的に読み込みに行くような動きも可能です。ただし、以下の2つの条件を満たす必要があります。

・Medoly側で歌詞が読み込まれていない、または歌詞が強制的に読み込まれる設定になっている
・プラグイン側がイベントに対応し、自動読み込みが行われる設定になっている。

歌詞のあるボーカルではなく、インストを主体にして聞く人も多いかと思うので、基本的に勝手には読みにいかない事が標準動作となることが望ましいと考えています。

2つ以上のプラグインが存在した場合の動作も設定できるようにしていますが、プラグインがまだ2つも無いので 意味がありません。

ちなみに、歌詞取得という事は、アルバムアートの取得もあるのかという話になりますが、まぁ、機能的にはほぼ同じなので作れます。機能的には大体埋まってますので、そのうち作ります。作ってないのは、単純に時間の問題です。というか、このプラグイン開発に時間割きすぎて飽きてしまったので、少しインターバル挟みます。疲れた。


歌詞フォルダ検索機能追加


こちらはユーザ様からの要望となります。従来、外部ファイルの歌詞を読み込むのは、メディアファイルと同一フォルダにある歌詞のみでしたが、今回、設定画面からフォルダを指定することで、そのサブフォルダにある歌詞ファイルを検索するようになりました。

この機能では、タグの内容から歌詞ファイルを探しに行くことができます。設定画面で検索対象のタグにチェックを入れると、チェックされたタグの値が全て含まれるファイル名のファイルを探しに行きます。なお、メディアファイルのファイル名は標準で検索対象に含まれます。そのため「01.mp3」等と単純なファイル名の場合、歌詞が誤爆する可能性が高まります。

ちなみに、歌詞は必ず全てのフォルダを探しに行き、対象となるファイルをリストアップしてから対象を決定します。これは歌詞の誤爆の可能性を下げるためです。単純に最初に発見したファイルを選択してしまうと、例えば、「サンプル歌.txt」と「サンプル歌 (アレンジバージョン).txt」という2つのファイルがあった場合、本来欲しいのは「サンプル歌.txt」なのに、「サンプル歌 (アレンジバージョン).txt」が選択されてしまう可能性があります。より目的のファイル名に近いファイルを選択する必要があると考えられるため、このような動作となっています。

注意点としては、対象フォルダにある全サブフォルダを探しに行くため、 ファイルが大量にあったり、深い階層があるフォルダを検索すると毎回歌詞の検索に時間がかかる可能性があります。こればっかりは仕方ないと思うので、運用でカバーしていただけると助かります。

ちなみに、歌詞の優先度は、メディアファイルと同一フォルダにある歌詞 → 内蔵歌詞 → 歌詞検索フォルダの歌詞 となっています。この優先度の根拠は、メディアファイルと同一フォルダにある歌詞は、表示させたい意思が一番強い歌詞であると考えられるため最優先、検索フォルダは誤爆の可能性が高いため、優先度を低くしてあります。ちなみに、今回の変更で各歌詞を読み込まない設定を追加しています。

そんな感じで、とりあえず思いつく限り誤爆を避ける実装をしてみましたが、イマイチ自信がありません。
私自身はこの機能をあまり利用していないため、この機能を使用している方は、この歌詞検索ルーチンについて、何か意見を頂けると助かります。「こんな風に間違った歌詞が表示された」といった、実際のファイル名を提示してくれると嬉しいです。

余談ですが、この機能を作成している途中で、「歌詞検索フォルダを作ろう」→「
歌詞検索プラグインで取得した歌詞を保存できるようにしよう」→「SDカードに書き込みできるようにしよう」という感じで、各機能を連鎖的に作るハメになったので、作るまでに異様に時間がかかっています。


再生予約解除機能追加


再生キューを長押ししたメニューから、次に再生する曲を予約することができますが、同じ曲で再度長押しすると、予約を解除できるメニューが表示されるようにしました。予約を取りやめたい場合に使用してください。


シャッフル再生時、再生キュー完了で再シャッフルする機能追加

これはユーザ様からの要望です。
シャッフル再生の際、再生キューは固定された再生順を保持します。これは、再生キューを更新したり、再生順を切り替えるまでずっと保持していたのですが、再生キューの内容が全部再生完了した時点で、再シャッフルしてほしいという要望がありましたので、そのように実装しました。
一応、従来の動作もできるように再生順を保持する設定項目も追加しています。

ロック画面に画像を表示しないオプション追加


音楽再生時、ロック画面からの操作コントローラは欲しいけど、画像はあまり人に見られたくないという人も多いと思いますので、画像だけ表示しない設定を追加しました。
特にLollipopは、ロック画面にアルバムアートを表示させると、画像が画面全体に引き伸ばされて表示され、かなり目立ちますので、こういう設定は結構需要があるかな…と。

その他細かい修正


その他、多数の変更やバグ修正が加えられています。
目立ったところでは、最近のバージョンのAndroidだと、同一プレイリストが保存できなくなってたりしてるようなので、その辺の挙動を少し変更したりとか。

携帯のメールには返信できない場合があります

最近、携帯のメールアドレスからメールを何件か頂いていますが、返信してもエラーが返ってきます。恐らく、PCからのメールを拒否する設定にしているか、強力な迷惑メールフィルタリングを設定しているものと思われます。

私は、所謂日本の三大携帯キャリアは利用していないため、携帯向けのキャリアメールアドレス(docomo.ne.jp, ezweb.ne.jp, softbank.ne.jp, など)は持っていません。そのため、返信で拒否された場合、こちらから返信する手段がありません。

お心当たりのある方は、適当なフリーのやつで構わないので、PCのメールから返信できるメールアドレスから連絡いただけると助かります。Google Playのコメントに書いていただくのが一番いいです。このブログのコメント欄でもいいです。とにかく、何でもいいからキャリアメール以外の方法で連絡していただけると助かります。



最近のキャリアメールは、PCからのメールを受け付けない(特定のドメインからしか受け付けない)ような設定が、契約直後の標準状態やメールフィルタリングに含まれているようです。なお、docomoはメール不達エラーが返ってくるのでまだマシですが、auやsoftbankに至ってはそれすら戻ってこないという話なので、届いたかどうかがまったく分かりません。
この特定のキャリアからしか受け付けないような設定を推奨している携帯キャリアのやり方には、個人的に大きな憤りを感じます。
メールは相手に届くことが前提です。ユーザ自身が意識せずにいるとにメールが届かない設定が適用されるのは論外ですし、ユーザ自身にメールが届いたかどうを調べさせたり、届かない原因を調べさせたりするようなサービスは、非常に品質が悪いと言わざるを得ません。日本のインフラを担う通信キャリアが、こんなツールとしての信頼性を損なうような所業をするのは、全く納得できません。市場を牛耳る企業としての奢りを強く感じます。
何故か多くの人は「キャリアメールは信用できる」と思い込んでいますが、信用できるのはあくまでも送信元の身元が保証できるという意味であって、届く・届かないの通信品質に対する信用は全く別問題です。そして、その点においてキャリアメールは「全く信用できない」、「信用するべきではない」と断言していいと思います。ちなみに、キャリアメールからも迷惑メールはよく飛んでくるので、身元が保証されていても、それがユーザの健全性に結びついているかどうかは別の話のようです。
いずれにせよ、メールの設定やフィルタリングの特性を把握している人以外は、確実に届かせる必要のある重要な連絡にキャリアメールは不向きであると思います。



そんなこんなで最後になりますが、私に対してメールを送る場合、出来ればキャリアメールで送ってこないようお願いします。

2015-09-25

Medoly Ver. 2.3.0, 2.3.1

2015-08-26 Ver. 2.3.0
- 検索結果を非同期で表示するように変更
- タップ処理のバグ修正


検索結果を非同期で表示するように変更


検索画面を非同期で表示させるようにしたため、DBの読込み中でもタブの切り替えや画面の切り替えといった操作ができるようになりました。
先日、自分の携帯端末に入ってる曲の数が1万曲を越えました。それぐらいの曲数があると、検索画面で多数の曲を一覧表示させると、しばらく画面が固まったような状態になっていました。そのため、検索画面の処理を大幅に見直して、非同期で表示させて一覧が表示されるまでの操作も受け付けるようにすることで、画面が固まる状態を回避できるようにしました。
ちなみに、一覧の読込み中は「Loading...」という文字が表示されますが、検索結果が100件以下の場合は(一々出るのが鬱陶しいので)表示しないような処理が入ってます。100件という数字は適当です。速度的にはもっと大きくても良かった気もしますが、何となく切りが良かったので。もっとこう、表示速度を測定して自動チューニングとか出来れば良いのですが、そこまでしなくても良いかなぁ…と。


タップ処理のバグ修正


各種画面のタップ処理、特にダブルタップの処理に共通した処理に、自分の勘違いがあったため、全体的に見直してます。表面上は特に変化が無いです。APIの使い方が間違ってて、余計な処理が行われていたので、コードを正しい処理に書き直しています。




2015-09-05 Ver. 2.3.1
- SYLT読み込み処理修正
- メイン画面からフォルダ指定で開けない問題修正
- 区間ループが発生しない問題修正
- 区間ループが上限を超えて設定できる問題修正
- 検索画面のスワイプ処理修正


SYLT読み込み処理修正


これはユーザ様からの要望です。一部の曲でSYLT歌詞の読込が出来ないという報告がありました。調べて見ると、これはSYLTの問題ではなく、MP3タグのバージョン取得が上手く動作していないことが問題でした。従来は、タグ取得ライブラリが取得したタグのインスタンスを判別して、自動的にバージョンを振り分けていたのですが、これがMP3のID3 v2.4の場合にうまく動作せず、v2.3と判別してしまう場合があり、その結果タグが取得できなくなるということがわかりました。
これに対し、ライブラリが返してくるバージョン番号を見てバージョンを判別させるように処理を変更しました。

メイン画面からフォルダ指定で開けない問題修正


検索結果の非同期表示処理において、一部修正が漏れがあり、フォルダ指定でフォルダの検索結果が開けない問題が発生していたため、その修正を行いました。


区間ループが発生しない問題修正


区間ループ(ABループ)の処理で、一度ループが発生した後にループが再度発生しないことがある問題を修正しました。これについては、Googleが用意しているAPIの仕様を上手く把握できていないため、正しい実装ができていませんでした。正直なところ、今でもあまり把握できてません…。


区間ループが上限を超えて設定できる問題修正


区間ループでA地点、B地点の指定が上限・下限をオーバーして指定できてしまう問題があったため、修正しました。


検索画面のスワイプ処理修正


検索画面のスワイプ処理を一部見直しました。タップ処理周りの見直しです。動作的にはあまり変化はありません。スワイプの反応が微妙に変わったぐらいです。


Medoly Ver. 2.2.5

2015-08-17 Ver. 2.2.5
- 出力デバイス選択ダイアログ追加  (アクションバーメニューより)
- デバイス選択ダイアログ追加に伴う権限追加
- 同期歌詞が頻繁に先頭までスクロールしてしまう問題修正
- オフセット値が2重に加算されていた問題修正



出力デバイス選択ダイアログ追加  (アクションバーメニューより)


アクションバーのメニューボタンを押した時に出るメニュー項目に、「出力デバイス」という項目を追加しています。これは、音声の出力先デバイスを選択するための機能です。
音声の出力先として選べるのは、標準状態で「通常」「スピーカー」「ヘッドセット」の3種類です。「通常」は何も選択されてない状態で、端末の設定に従います。「スピーカー」「ヘッドセット」は、ヘッドセットの接続状態に関わらずそれぞれ出力先を切り替えます。…が、これを選択して出力した場合、普通の再生とは異なる状態ため、再生音量が小さくなったりします。そんなわけで、機能として実装はしてみましたが、用が無ければ使わない方が良いような気がします(多分)。また、これらは端末によっては切り替えられません。理由は知りませんが、切換そのものが無効になります。通話機能を持たないタブレット端末で無効となる可能性があるようです。 現状、NVIDIAのShield Tabletで切り替えられない事を確認しています。
それよりもこの機能の真骨頂は、Bluetoothデバイスの切換です。メニュー上にBluetoothのA2DP接続が行われたデバイスが一覧表示されるため、切り替えたいデバイスを選択すると、選択したデバイスからの再生に切り替わります。複数のBluetoothデバイスを持っていて、頻繁に切換を行う際に使用することを想定しています。ちなみに、ここで切り替えた設定は端末の全ての音声出力に影響しますのでご注意ください。
この機能自体はメディアプレイヤーとはほぼ独立しているため、単独のアプリでも良かったかもしれませんが、プレイヤーから呼び出せた方が私にとって便利なのでプレイヤーに組み込んでみました。

 
出力デバイスダイアログ



デバイス選択ダイアログ追加に伴う権限追加


上記の出力デバイス選択機能の追加に伴い、以下の権限が追加されています。
  • MODIFY_AUDIO_SETTINGS (音声設定変更)
  • BLUETOOTH_ADMIN (Bluetooth管理)


同期歌詞が頻繁に先頭までスクロールしてしまう問題修正



同期歌詞を再生すると、スクロール位置がすぐに先頭に戻ってしまう問題が発生していたため、修正しました。これは、Ver. 2.2.2の「メイン画面のサイズ変更時に座標がずれる問題修正」で発生したものです。


オフセット値が2重に加算されていた問題修正


いつの間にやら、歌詞のオフセット値が2重に加算されている問題が発生していたため、修正しました。調べて見ると、歌詞の表示誤差設定を追加した時から発生していたので、大分長いこと放置していたようです…。
これは、単純にオフセットの加算処理を間違ってただけです。 現状、歌詞の表示方正をするための4種類ぐらいのパラメータを組み合わせてるので、色々ゴチャゴチャになってます。

2015-09-24

Medoly Ver. 2.2.2

2015-07-04 Ver. 2.2.2
- プラグインダイアログのレイアウト修正
- メイン画面のサイズ変更時に座標がずれる問題修正
- 外部通知の設定ON/OFFが反転していた問題修正
- 歌詞読込みエラー修正

プラグインダイアログのレイアウト修正

メイン画面のアクションバー左上のメニューから開くプラグインダイアログの画面レイアウトを変更しました。従来は、アプリの起動やアプリ情報のボタンが上側にありましたが、それを下側に移動させています。理由は、プラグインの各種実行ボタンの方が利用頻度が高いと思われるため、そちらを上側に持って来たかったためです。


メイン画面のサイズ変更時に座標がずれる問題修正

メイン画面において、表示タブ上のダブルタップによる画面最大化や、ピンチアウトによる画面の拡大の際、座標がずれる問題が問題がありました。これは、ViewPagerでタブを実装した時から存在し、ずっと悩んでいたのですが、ようやく原因が分かりました。
画面を拡大した際に周囲の枠を取り払うのですが、内部的にはその枠の分だけ、内部のViewPagerの座標を補正してやる必要があります。ところが、ViewPagerは座標の取り方が「最初にどのページを表示させたか」で変わってきます。例えば、再生キューのタブを最初に表示させると、再生キュータブの左端が0、表示タブの左端が(画面横幅サイズ+ タブの隙間)、プロパティタブの左端が(画面横幅サイズ + タブの隙間)x2のような座標になります。ところが、最初に表示したタブが表示タブの場合、表示タブの左端が0となり、再生キュータブの左端はマイナスになります。この座標のズレが、サイズ変更の補正のズレとなっていました。
表示タブが最初に表示されるのは、ウィジェットからアルバムアートをタップして起動した時です。それ以外は通常再生キュータブから開始されるため、座標ズレの原因の特定が困難になっていました。
ちなみに、通常タブの切り替えはタブのインデックスで行うので座標はずれないのですが、現在選択されている他部と同一のタブインデックスを指定しても、座標の補正は行われないため、手動で座標の補正を行っています。


外部通知の設定ON/OFFが反転していた問題修正

設定のON/OFFの意味が逆転しており、初期状態で外部に再生状態の通知が行われるようになっていました…。単純にデバッグ不足です。


歌詞読込みエラー修正

歌詞読み込み時にエラーが発生する場合があったため、その修正です。


2015-07-17

Medolyの現在のインストール数が500越えた

先日、Medolyのインストール数が500を越えました。


カウント


インストール数推移

このインストール数というのは、端末数ベースのインストール数となります。一人の人間が複数の端末を持っていて、それぞれにインストールした場合はそれぞれの台数分カウントされます。また、アンインストールした場合はカウントが減少します。どうやら、インストールしたまま端末が未使用になった場合もカウントから減少していくようです。
ちなみに、ユーザ数ベースのインストール数も見る事ができますが、そちらは433となっていました。
ユーザ数ベースの総インストール回数は 1884。端末数ベースの総インストール回数は見られないので知りません。



ちなみに、公開時からのインストール数のグラフは以下のような感じになります。
 

公開時からのインストール数推移

グラフが跳ね上がるような特異点も無く面白味のないグラフですが、割と綺麗な右肩上がりをしているので、使ってみた上で一定の割合の方が継続して使っていただいているのではないかと推察します。
音楽プレイヤーという、多数のアプリがひしめくごくごくありふれたカテゴリーに真っ向から挑んで、これだけのユーザ数を獲得できたのは、個人的には結構嬉しく感じてます。その一方で、500台の端末にインストールされているというのはなかなか緊張感があります。

まぁ、だからといって自分のペースを変えるつもりもなく、これからも適当に開発していきますので、 今後ともMedolyをご愛用いただけると幸いです。



余談ですが、ユーザも増えたし、Medolyの機能も大分増えてしまったので、いい加減ドキュメントの整備とかしたいのですが、満足に時間がとれず申し訳ない…。個人でやるには流石に限界がありますので…。

2015-07-07

Medolyで今後やりたいこと

Medolyについて、今ぼんやり考えてること。大雑把に分けて3種類

情報取得系
  • アルバムアートの自動取得プラグイン作成
  • 歌詞の自動取得プラグイン作成
  • 複数アルバムアートの切換対応
  • 複数歌詞の切換対応
  • タグの複数要素対応

再生系
  • FFmpeg への切換
  • ストリーミング対応 
  • 区間ループのギャップレス化
  • 検索プラグイン作成

     
その他諸々
  • キーボード操作
  • 音声出力先切換機能
  • 独自メディアデータベース
  • プラグインの実装とかソースとか色々放出

情報取得系は、要は表示できる情報を増やす方向。特に、アルバムアート取得、歌詞取得については実装も大体考えているし、それを想定してプラグインの実装もしているので、あとは作るだけ。問題はデータの取得先だけど、まぁそこはそれ。

再生系は、再生出来るメディアを増やす方向。大きな所ではFFmpegへの切換。現在、Android標準で提供されているメディアプレイヤーでは、出来る事が限られてくるので、FFmpeg使って色々出来ないかなぁ、と考えている。ストリーミングや区間ループのギャップレス化も、現状のメディアプレイヤーでは難しいので、最低でもその辺をクリアしたいところ。検索プラグインの作成というのは、現状では自端末のメディアしか見えないけれど、ネットワークアクセスまでできるようにしたいなぁ、という感じ。それもプラグインで追加できる形で。それを実現する上でも、まず現状のメディアプレイヤーを止めないといけないのだけれど。

あとは、その他色々機能の追加をしたい。
ついでに暇があれば、何か色々公開したいです。

 …などと考えてるアイデアはたくさんあるのだけど、作業がさっぱり追いつかない。片手間で作るには作業量が多すぎるので、追々作っていきます。

なお、逆に作る予定が無いのは、イコライザとかの音をチューニングする系の機能。私自身が音を変える事に対してさっぱり価値を見出していないので、要望とか特になければ多分いつまで経っても作らない。作るならこういう感じ、という構想ぐらいはあるけれど。いずれにせよ、多分今作ってもFFmpegに切り替えたら作り直しだと思うので、当面は作らない。

大体今考えているのはそんなところです。
これからしばらくあまり時間がとれなくなるので、少し更新頻度が落ちると思います。

2015-07-05

Medoly Ver.2.2.0, 2.2.1

2015-06-28 Ver. 2.2.0
- 自然順ソート追加
- 再生予約アイコンを色替え
- イベントの自動実行チェックを外してもイベントが実行される問題修正
- 拡大・縮小時の座標ズレ修正
- 歌詞の文字コード判定処理修正

2015-07-04 Ver. 2.2.1
- プレイリストがDB保存されない不具合修正
- 曲開始時に歌詞が先頭に戻らない問題修正
- 細かいバグ修正



2015-06-28 Ver. 2.2.0


- 自然順ソート追加


ユーザ様の要望により、ソートに自然順ソートを追加しました。ソート設定ダイアログより、ソートを行う際に選択できます。
自然順ソートとは、より人間の感覚に近いソートのことです。 例えば、
1, 2, 10, 20
といった数字の並びがあった場合、従来の通常ソートでは
1, 10, 2, 20
といった並びになります。これは、単純に1文字の文字から順番に比較してソートしているためです。これを、数字の大小を考慮して、
 1, 2, 10, 20
といった並びにするのが、今回追加した自然順ソートです。
ちなみに、英数字については全角・半角は無視するようになっています。残念ながら今のところ漢数字の並びには対応してません。(欲しい人とかいれば実装するかもしれません。)

- 再生予約アイコンを色替え


前バージョンで追加した再生予約ソートですが、再生予約時に次の曲を示すアイコンの色を青色に変えるようにしました。再生予約されたものなのか、単純に再生順に基づいたものなのかを判別できるようにするためです。
個人的にこの辺を少し使い分けたかったもので…。

- イベントの自動実行チェックを外してもイベントが実行される問題修正


Ver. 2.1.0でプラグインの仕様を変更した際、プラグインのダイアログから「イベントアクション自動実行」のチェックを外しても、イベントが実行されてしまうようになっていたので、その修正です。
すいません、単純に確認不足です。

- 拡大・縮小時の座標ズレ修正


メイン画面をピンチイン/ピンチアウトやダブルタップで拡大・縮小した場合、表示座標がずれる場合があったため、その修正です。
…修正できたと思っているのですが、もしかしたら直ってないかもしれません。


- 歌詞の文字コード判定処理修正


歌詞の文字コード処理を一部見直して、MP3タグの文字コード判定処理と同様に行うようにしました。文字コードが正しく判定されない場合、端末の言語設定に応じて、最終的に出力される文字コードは異なってきます。ちなみに、UTF-16やUTF-8であれば特に気にしなくて良いです。
歌詞の文字コードは、UTF-8辺りを積極的に推奨します。


 

2015-07-04 Ver. 2.2.1


- プレイリストがDB保存されない不具合修正


自然順ソートを追加した際、内部的な処理を色々変更しているのですが、その際にプレイリスト保存時に楽曲IDが正しく保存されない不具合が起こってしまいました。そのため、既存のプレイリストに上書き保存した際に、プレイリストの内容が消えてしまうという問題が発生していました。
これは、プレイリストをDB保存した際に発生するもので、ファイル保存した場合は発生しません。

プレイリストが消えてしまった方は、ご迷惑をお掛けして申し訳ありません。


- 曲開始時に歌詞が先頭に戻らない問題修正


歌詞の同期をOFFにした状態で曲を切り替えると、次に表示される歌詞が先頭に戻らない不具合が発生してしていたため、その修正です。


- 細かいバグ修正


検索画面のフォルダに自然順ソートが効いていなかかった問題等、色々な修正を行いました。

Medoly Ver. 2.1.5

2015-06-20 Ver. 2.1.5
- ウィジェット設定追加
- ウィジェットレイアウト3追加
- ウィジェットのレイアウト・スタイルを調整
- 次曲の再生予約機能追加(再生キューの項目長押しメニューより)
- 現在曲・次曲を示すアイコン追加
- 歌詞余白のタッチスクロールが動作しない問題修正
- 再生シーケンス処理修正


- ウィジェット設定追加

- ウィジェットのレイアウト・スタイルを調整


これはユーザ様からの要望です。ウィジェットの色や透明度等を細かく調整する設定を追加しました。ただ、単純にそれらの設定を追加するだけだと、表示上の不都合が生じる(透明になると、レイアウトが重なってる部分が透けて見えるため、具合が悪い)ので、レイアウトを全面的に見直ししています。割と大作業だったのですが、表面上は座標が少し変わっただけで、変化は無いと思います。

- ウィジェットレイアウト3追加


ウィジェット調整のおまけで、レイアウトを一つ追加しています。今までのレイアウトは全部、ウィジェットのサイズに合わせて画像領域が拡大・縮小されることが前提のレイアウトでしたが、今回のは文字領域を拡大・縮小することを前提としたものです。

ちなみに、レイアウト的にはあと一つ、文字領域が左側、画像領域が右側に来て、文字領域が拡大されるパターンが考えられますが、利用する人がいるのかどうか知らないのでとりあえずこのままで。


- 次曲の再生予約機能追加(再生キューの項目長押しメニューより)


これはユーザ様からの要望です。
次に再生する曲の再生予約を入れられる機能を追加しました。再生キューのメディアを長押ししたメニューより「次の再生予約」を選択することで、次に再生する曲を設定できます。これは再生済の状態等は全て無視して、最優先されます。現在再生中の曲も選択できます。
現在の再生順の途中で、一時的に再生を割り込ませたい場合等に利用することを想定しています。予約したメディアの再生完了後は、再生順に従った予約メディアの次のメディアが再生されます。


- 現在曲・次曲を示すアイコン追加


再生予約機能の追加に伴い、再生キュー項目の再生中メディアと、次に再生する メディアにアイコンを追加しています。これは、ユーザが現在の状態を目視で確認できるようにするためです。
個人的には、何気なく追加したこのアイコンの存在が、再生順を把握する上で思いの外便利で結構気に入ってたりします。
 

- 歌詞余白のタッチスクロールが動作しない問題修正


表示タブの歌詞は、余白部分(歌詞が表示されていない部分)でもタップスクロールできるようになっていますが、これが無効になっていたため、修正しました。
ダブルタップの拡大・縮小を追加した際、タップ処理が少しおかしくなっていたためです。

複数のタップ処理が同居する部分の処理は本当に難しい…。

- 再生シーケンス処理修正


再生順を切り替えた際、末尾の再生の順序が狂ってしまう問題を修正しました。再生順の順序付け処理が上手く動作していなかったためです。

ちなみに、この問題は長く潜在していたのですが、今回、現在曲・次曲を示すアイコンを追加したことですぐに発覚しました。これが個人的に、この追加したアイコンが気に入った理由の一つだったりします。

Medoly Ver. 2.1.0, 2.1.1

バージョン変更内容の詳細について。


2015-06-14 Ver. 2.1.0
- MP3の文字コード判定処理修正 (プロパティ情報にタグ情報追加)
- 表示タブのダブルタップで画面最大化する機能追加 (オプション選択可能)
- プラグインの仕様修正 (手動実行機能追加)
- 再生完了イベント追加
- 外部通知のオプション化
- 共有ファイル受取り後に元アプリに戻るオプション追加
- 共有ファイルが登録されない問題修正
- 停止時のシークで歌詞が追従しない問題修正
- 歌詞の座標がずれる問題修正

2015-06-15 Ver. 2.1.1
- 画面の拡大・縮小が正しく行われない問題修正
- メッセージ一部修正


- MP3の文字コード判定処理修正 (プロパティ情報にタグ情報追加)


これはユーザ様からの要望です。MP3のタグ情報を読み取る際、タグがUnicodeではなくISO8859-1として入力されていた場合、タグの文字コード判定に失敗して、プロパティ等の表示されるタグ情報が文字化けを起こしていたのですが、それを修正しました。なお、この修正は検索画面の検索結果には適用されません。
文字判定には自動文字コード識別ライブラリを用いているため、判定に失敗する可能性があります。その場合、端末の言語からデフォルトの文字コードを適用するようにしています。日本語ならShift_JISです。
個人的な要望を言えば、Unicodeを使っていないタグは早々にUnicodeに置き換えるようにしていただきたいところです。昔であれば、Unicodeに対応していないソフトウェアも多々存在してたため、MP3タグにUnicode以外を用いる選択肢も有用でしたが、今となっては百害あって一利無しです。今時Unicode対応してないソフトウェアやハードウェアは手抜き以外の何者でもなく(むしろ手を抜いたらUnicode対応のみになると思うのですが)、使えない代物と断定して問題ないと思います。(過去の更新が止まったソフトウェアは除きます。)
ちなみに、MP3以外は文字コードが固定なのでこの問題は起きない…はずです。

- 表示タブのダブルタップで画面最大化する機能追加 (オプション選択可能)


表示タブの内容をダブルタップした際に、画面を最大化する処理を追加しました。これは、ユーザ様より「簡単に最大化できるようにしてほしい」という要望があったためです。
なお、これは設定画面より表示スタイルダイアログの表示に操作を変更するか、もしくは無効化できます。ついでに、表示タブの長押しも同様に設定できるようにしました。
なお、この時に行われる最大化ですが、ピンチズームで行う拡大とは別扱いで、最大化状態からダブルタップすると元の状態に戻ります。 また、アプリを完全に終了させてから再起動しても元に戻ります。ただし、最大化状態からピンチ縮小すると、その状態は保存されます(通常のサイズ変更扱いに切り替わります)。

- プラグインの仕様修正 (手動実行機能追加)


プラグインの仕様を変更し、複数のアクションが手動で実行できるようにしました。プラグイン側で任意の手動アクションが定義できるようになっています。
現状2つ公開しているプラグインのうち、「Medoly Twitter Plugin」は、「外部アプリで送信」と「Twitterを開く」の2つのアクション、「Medoly Last.fm Scrobbler Plugin」 は「Love」「UnLove」「Last.fmを開く」の3アクションを実行できます。
これは、イベントで自動的に起こすアクション以外に、任意のタイミングで起こしたいアクションを実装することを目的にしています。

 

- 再生完了イベント追加


プラグインのイベントに、「再生完了」を追加しました。これは色々考えるところがあって追加したので、今のところすぐどうこうというわけではありません。まぁ、そのタイミングでアクションを自動的に起こせるようにしましたよ、ということで。
 

- 外部通知のオプション化


 Ver. 2.0.0より、外部に対してAndroidの標準音楽プレイヤーと同様のメッセージを投げていました。世の中には、このメッセージを受け取って自動的にアクションを実行するアプリも存在します。
ただ、やっぱり勝手に外部にメッセージを投げるのは好ましくないと思い、オプション化することにしました。設定画面より、有効/無効を切り替えられます。

 

- 共有ファイル受取り後に元アプリに戻るオプション追加


設定画面より、共有メディアを受け取った際の再生キュー登録アクションの設定に、「元アプリに戻る」というオプションを追加しました。これを有効にすると、共有メディアを受け取って、メディアを再生キューに登録した後、すぐに元のアプリに戻るという動作を行います。他のアプリから連続して再生キューに登録したい場合にご利用ください。

なお、「そもそも画面を表示させなければ良いのでは?」という疑問もあるかと思いますがAndroidの動作上、一旦アプリの画面を出さないとダメっぽいので、それは出来ませんでした。
どなたか、画面を出さない良いアイデアがあれば教えてください。

 

- 共有ファイルが登録されない問題修正


ユーザ様からの不具合報告です。他のアプリから共有したファイルが再生キューに登録されない場合があるとのこと。原因を調査し、不具合を修正しました。単純に、受け取りの処理がおかしかっただけです。
言い訳ではないのですが、Androidは余所からデータを受け取る処理がちょっとめんどい感じがします…。

 

- 停止時のシークで歌詞が追従しない問題修正


歌詞を停止して いる状態でシークバーを動かしても、歌詞のスクロールがシーク位置に追従していなかったので、その修正です。
歌詞のスクロールについては、同期・非同期のスクロールが別々に書かれており、どのタイミングで歌詞をスクロールさせるかといった処理が非常に込み入っているので、スクロールの処理はよく漏れが発生してしまいます…。この辺はちょっと調整が難しい。

 

- 歌詞の座標がずれる問題修正


歌詞のスクロール座標がずれる問題があったため、その修正です。


Ver. 2.1.1


- 画面の拡大・縮小が正しく行われない問題修正


Ver.2.1.0においてダブルタップで画面を拡大・縮小する処理を追加しましたが、その際にピンチズームによる拡大・縮小の辺りも合わせて処理の修正を行っていますが、拡大・縮小が正しく行われない場合があったため、その修正を行いました。
また、ダブルタップにつていも、ダブルタップしてもすぐに拡大が元に戻ってしま場合があるといった問題があったため、タップ処理全体を見直しています。

 

- メッセージ一部修正


メッセージの文言修正です。全体の表現に合わせて微調整です。この手の修正はよくやります。

2015-05-29

Medoly Last.fm Scrobbler Plugin リリース

Medolyで再生している音楽情報をLast.fmに送信する「Medoly Last.fm Scrobbler Plugin」を公開しました。

Last.fmは日本ではあまり馴染みが無いかもしれませんが、音楽を主体としたSNSです。 自分の再生している音楽の情報をひたすら上げ続けていくという特徴があり、自分の聞いている音楽を主体としてコミュニケーションを行うサービスです。iTunesやWindows Media Playerといった主要なメディアプレイヤーをはじめとし、多くのアプリケーションでLast.fmに再生中の曲を登録する機能やプラグインが提供されています。Androidサービスに登録されている多くのアプリにも実装されています。
SNSとしての利用では無く、自身の音楽再生履歴を残すために利用している人も多いようです。私も最近、それを目的として使い始めました。
 
このアプリの使い方は、Medoly Twitter Plugin同様簡単で、最初に「アカウント認証」ボタンよりユーザ名とパスワードを入力し、ユーザ認証を行ってください(もちろん、アカウントを持っていくことが前提です)。認証が完了すると、Medolyで再生している音楽情報がLast.fmに送信されます。これはメッセージ編集等は無く、ただ必要な情報のみをLast.fmに送信します。ユーザが行うのは、基本的にこのユーザ認証のみです。
入力されたユーザ名はそのままの状態で、パスワードはハッシュ化して保存されますのでご了承ください。

ちなみにこのアプリを作ったのは、複数のプラグインの同時実行テストがしたかったため、という理由が大きかったりします。とりあえず2つのプラグインが同時に動くことは確認できました。

あと、Google Playへの登録名が30文字までなので、表記が 「Medoly Last.fm ScrobblerPlugin」と、スペースが1文字削られています。今後登録する際は、この文字数上限に気を付けた方が良い、という事は今回分かりました(笑)。

Medoly Twitter Plugin リリース

Medolyで再生している音楽情報をTwitterに送信する「Medoly Twitter Plugin」を公開しました。

使い方は簡単で、アプリを起動した後、「Twitter認証」ボタンを押して、指示に従ってTwitterの認証を完了させてください。(もちろん、Twitterアカウントがある事が前提です。)

認証が完了すると、Medolyで再生している情報が自動的にツイートされるようになります。

送信のタイミングは、デフォルトでは「再生中」イベントのタイミングです。「再生中」イベントのタイミングは、Medoly本体側の設定画面から設定できます。デフォルトは曲の再生を開始して30秒後です。曲を停止すると再生時間はリセットされます。再生を再開した場合、そこから30秒後に再びイベントが発生します。とりあえず、「再生開始」のタイミングでも送信できますが、曲を頻繁に切り替えるザッピング再生みたいな事やってると、その都度ツイートされてしまうためあまりお勧めはしません。

メッセージの内容は「メッセージ編集」 ボタンより変更することができます。Medolyのプロパティとして取得できる情報は全てメッセージに入力できますが、加工されていない生データが送信されてますので、使い物にならないデータが多数含まれています。そこら辺は要望があれば何とかしますが、とりあえず放置です。大体、曲のタイトルとアーティストとアルバムの名前があればいいでしょ?っていうぐらい。プラグインのサンプルモデルみたいな 代物なので、実装は割と適当です。

メッセージ編集で、各データには「優先度」が設定できます。「優先度」とは、140文字の文字数を超過した場合に関係します。140文字を超過した場合、優先度の低い順に文字が削られていきます。「省略可」にチェックが入っている場合、文字数を超過した分だけ、途中で省略します。未チェックの場合、文字数に収まらない場合は全て消去されます。例えばID等の、省略すると意味を為さない項目はデフォルトで省略可のチェックが外れています。

例えばTwitterの文字上限が20文字だったとして、優先度が「タイトル, アルバム名, アーティスト名」の順で、フォーマットが「タイトル - アーティスト名 / アルバム名」のようになっていると、「タイトル - アー... / アルバム名」 のように省略されます。アーティストの省略可チェックが外れていると、「タイトル - / アルバム名」のようになります。ちなみに、フォーマット中に直接書かれた文字は省略されません(それだけで140文字を超過しない限りは)。

文字数上限をオーバーさせないための施策なので考えるのが面倒臭いですが、普通は標準の状態をそのまま使っていただければ良いと思います。

ところでこのアプリ、Ver. 1.0.2で一旦別アプリとして公開し直してます。理由は、Googleに公開停止を食らっているためです。理由を問い合わせたところ、アイコンがマズかったらしいです。Twitterのガイドラインに抵触してたと思われるので、アイコンを再加工して、別アプリとして再公開しています。



 
ちなみに、このようなプラグインを開発したということは、Twitter上のどこかに私のTwitterアカウントが存在するわけですが、その存在についてはあまり気にしないでください…。



2015-05-28

Medoly Ver. 2.0.5, 2.0.6

2015-05-23 Ver. 2.0.5
- 再生キュー登録処理を統一化
- 再生キュー登録オプション設定を追加
- Bluetooth AVRCP 1.3 による曲名表示対応 (Android 4.3以降)
- リモートコントロールを初期状態で有効化
- Lollipopのプライベートロック画面に表示されない問題修正
- その他、各種修正
- BROADCAST_STICKY 権限要求追加


2015-05-26 Ver. 2.0.6
- 再生終了後に落ちる問題修正
- プレイリストの削除時にダイアログが閉じない問題修正


Ver. 2.0.5



再生キュー登録処理を統一化


いくつかある再生キュー登録方法について、登録処理の共通化を行いました。(今までバラバラに実装していたものを統合した感じです)。
登録処理は大まかに分類して、

- 検索画面から登録
- プレイリストを開いて登録
- 再生履歴から登録
- 他アプリから渡された共有メディアを登録

が実装されており、これらを統一した処理で登録されるようにしました。
それに伴い、登録処理の際は全てメッセージが表示されるようになっています(設定でOFFに出来ます)。


再生キュー登録オプション設定を追加


再生キュー登録処理の統一化に伴い、設定画面より各登録処理にオプション設定ができるようにしました。オプションとして登録できるのは

- 追加、更新の選択、または確認表示
- 再生キュー登録済みの内容と重複しているメディアの除外
- 追加されるメディアを対象としたソート(再生キュー登録済みのメディアはソートされません)
- 追加されるメディアを再生(複数追加の場合は、追加されたメディアの先頭が再生)
- メイン画面に戻る(検索画面のみ)

となっています。 また、これらのオプション選択ダイアログを表示させることもできます。ちなみにこのオプション選択、ずいぶん前から検索結果の長押しで表示させる事ができていたのですが、存在が中途半端だったので放置していました。今回改めて実装し直した次第です。

また、検索画面からの登録方法を細かく分類すると、

- 検索メニュー
- 検索結果タップ
- 検索結果長押し

の3種類があり、さらにメニューは3つまで登録できます。 初期状態では、「再生キュー追加」、「再生キュー更新」の2種類で、3つめのメニューは非表示にしてあります。必要に応じて変更・増減させてください。







Bluetooth AVRCP 1.3 による曲名表示対応 (Android 4.3以降)


Bluetoothには、リモート操作を行うためのAVRCPというプロファイルが規定されています。また、このAVRCPにはいくつかバージョンがあり、Ver.1.3よりリモート操作側にメディアの情報を送信できるようになっています。Bluetoothのリモコンに曲名が表示されたりするアレです。
Android 4.3より、このAVRCP1.3による曲名表示に標準対応しています。最近、Bluetoothヘッドセットアダプタ Sony SBH50 を購入したので、正式に対応させてみた次第です。
今までもロック画面の表示設定をONにすると表示されていたと思いますが、きちんと検証したという事で。また、Android 5.0のLollipop以降は実装方法が異なるため、そこは新たに作り直しています。現状、Android 4.3以降であれば表示されるはずです。

ちなみに、Android 4.2以前ではAVRCP 1.3に未対応ですが、端末メーカーが独自に実装している場合があります。自分の所持するXperia UL(Android  4.2.2)で色々試してみたところ、Android標準の音楽プレイヤーや、Walkmanアプリ、Rocket Playerといったいくつかのアプリならリモコン側に曲名が表示されるのは確認しましたが、多くのプレイヤーでは非表示のままでした。自分でもこれを表示させる方法を色々調べてみたのですが、結局よく分かりませんでした。上記で実装した方法はAndroid 4.3以降が対象であるため、Xperiaは何らかの独自実装を行っているものと思われます。
Android標準の音楽プレイヤーのソースコードを弄って確認したのは、MediaPlayerのインスタンスが再生を開始すると曲名が表示されるという事です。それ以外の、外部に曲情報を送信しているものと思しき箇所を片っ端から削除してみましたが、表示に対してはまったく影響を与えませんでした。とにかく、再生を開始した時点で何らかの方法で再生している曲の情報を取得しているものと推測しますが、Medolyで再生している曲を取得させる方法が分かりませんでした。Rokect Playerというアプリで表示できているので、特定のアプリ以外では無理というわけではないと思っているのですが…。

どなたか、これについて情報をお持ちの場合は教えていただけると嬉しいです。また、Xperia以外で、Android 4.3以前にAVRCP 1.3に対応している端末で曲名表示させたいという要望があれば受け付けます。ただし、その実装方法が確実に分かっている場合のみですが。

なお、カスタムOSのCyanogenModをご利用頂いている場合、もしかしたらアーティスト情報の場所にアルバムアーティストが表示されるかもしれません。これは、CyanogenModの挙動なのでご了承ください。アルバムアーティストが存在しない場合は、アーティストが表示されるようにしています。


リモートコントロールを初期状態で有効化


今まで、リモートコントロール設定は初期状態でOFFにしていました。何故ならば、自分は「可能な限り相手の端末に影響を与えたくない」という考え方で作っているからです。
ただ、今回上記のBluetoothリモコンへの曲名表示対応を作っていくにあたり、「やっぱ普通の人には分かりにくいし、めんどいよね」という結論に至り、あっさり宗旨替えです。
というわけで、今回からインストールした時点でロック画面のプレイヤーも占有するし、ヘッドセットのボタンも占有するし、Bluetoothリモコンも占有します(ちなみに、これらの占有処理は一体的な物なので、どれか一つだけOFFにするといった動作は、複雑になりそうなのであまりやりたくないです)。邪魔な人のみOFFにしてください。


Lollipopのプライベートロック画面に表示されない問題修正


Android 5 Lollipop は、ロック画面に通知を表示させることができます。というか、Android 4にあったロック画面専用のコントロールが無くなり、通知によって各種コントロールを行います。
Lollipopはマルチユーザによる利用も想定しています。そのため、ロック画面の通知は非表示にしたり、またはプライベートモードで動作させて、通知がある事だけを表示し、内容は非表示にするといった事ができます。
今まで、Medolyの通知はプライベートモードでの動作となっていました(というか、何も設定しないとそうなります)。音楽再生なんてプライベートモードで動作する必要は全く無いので、パブリックモードで動作させ、ロック画面からコントロールが行えるように修正しました。

 

その他、各種修正

メッセージ文言を修正したり、EclipseからAndrodi Studioに乗換えた際に警告されるようになった箇所の修正等です。



BROADCAST_STICKY 権限要求追加


BROADCAST_STICKYとは、他のアプリにメッセージを送信するための権限です。通常のBROADCASTとは異なり、配信が終了してもメモリ上に残ります。これは、外部のアプリケーションに曲名を通知するために追加しています。
Android の標準音楽アプリは 、再生している曲が変更される度に外部に対して曲名が通知されおり、その際に使用されるのがこの通知方法です。今回、それと同じ通知を外部に対して行うようにしています。比較的多数の音楽プレイヤーが、同様のメッセージを外に投げていると思われます。
世の中には、そのメッセージを受け取って動作するアプリも存在しますので、それが利用できるようになります。未使用の方にとって特にメリットはありませんが、今回ちょっと追加させていただきました。




Ver. 2.0.1


再生終了後に落ちる問題修正


ユーザ様からのエラーレポートから発覚しました。
区間ループを行っている場合、シークバー上のループ区間を示すアイコンの座標計算で0の除算が発生し、再生終了時に落ちる場合があることが分かりましたので、その修正です。
 


プレイリストの削除時にダイアログが閉じない問題修正


プレイリスト操作で、プレイリストの削除を行うっても、ダイアログが閉じなくなっていたので、その修正です。Ver. 2.0.5で行った再生キュー登録処理の統一化の際に、処理が漏れてしまいました。