Tech:android:hack:audio

出典: Tariki

目次

音遊び

ここの前半は、好きな音声ファイルを着メロ(笑)・アラーム・ノーティファイ音に使う、という話である。後半はHTC magicの音響についての考察なのでここに載せるのもいかがかと思ったが、まあ携帯端末なんてどれも同じようなしょぼ音だし、こういうことを実験してみたのもはじめてである。だから機種ジェネリックな話のここに書く。

androidで好きな音を使用する

だいたい私は(いきなりけんか腰)『着メロ』なるものが嫌いだ。電子音 (※ YMOと中田ヤスタカの音楽を除く) はきくだけでもかなりいらつく。まあ着信音とかアラームとかは、聴く者をいらいらさせる、イコール注意を向けさせるのが目的なのでよしとしよう。だが『メロ』って何だ。生活の中に異質なアイコンを持ち込むから着信音とかアラームとかになるのに、好きな楽曲の一部を丸々使ってどうする(笑)。しかも一昔前のラジカセかついだやんきーじゃあるまいし、公共の場で大音量で音楽鳴らしますか? ポケットの中で大音量で鳴っていて慌てて止める奴とかをみると、脳がメロなんじゃないかと思う。

さておき。androidで好きな (MP3/WAV/OGG/G3Pなどが使えるようです) ファイルを着信音とかアラームとかノーティファイ音にするには、基本的にSDカードに音をコピって、メニューで設定するだけです。あったりまえですコンピュータだもの (みつを)。まあこのへんは、Windows Mobile機とかSymbianとか、androidの類似品のFreeBSDのアレとかも同じ。

ところがこの指定はうまくいくときといかないときがある。いかなかった↓のはなしは、ROMをSense UI (1.5)改のSuperMagic系 (Trojian Final)に入れ替えたときのはなし。

音DBの不調

HTCアプリであるworld clockからアラームの設定を選ぶと『予期せぬエラー』とやらでコアを吐いて(吐かないけど)止まるようになった。これについては上書きアップデートしたせいかもしれないのでディストリビューションが原因とはいえないが、参考および記録のため。アラームなんてなくても死なないいが、これを追求したおかげでいろいろなシステム設定がどこにしまわれているか分かりました↓。

  • After updating to TrojanFinal, alarm time setting terminates "unexpected"ly. This may because of updateding without wipe.

adb logcatでみると

I/ActivityManager(   64): Starting activity: Intent { comp={com.htc.android.worldclock/com.htc.android.worldclock.SetAlarm} (has extras) }
D/dalvikvm(  643): GC freed 3778 objects / 251160 bytes in 146ms
E/MediaPlayerService(   38): Couldn't open fd for content://media/internal/audio/media/64
E/MediaPlayer(  643): Unable to to create media player
D/dalvikvm(  643): GC freed 1019 objects / 80184 bytes in 121ms
E/RingtoneManager(  643): Failed to open ringtone content://media/internal/audio/media/64
E/RingtoneManager(  643): unable to find a usable ringtone
W/dalvikvm(  643): threadid=19: thread exiting with uncaught exception (group=0x40013140)
E/AndroidRuntime(  643): Uncaught handler: thread SetAlarm exiting due to uncaught exception
E/AndroidRuntime(  643): java.lang.NullPointerException

つまりアラーム音ファイル content://media/internal/audio/media/64 なるものがないとおっしゃる。ファイルのパスではなくURLなんですね (どういう利点があるか知らんがよりリソースを抽象化しているみたいでかっこいい(笑))。

まずアラーム音のディレクトリを見てみた。HTC製サウンドは /system/media/audio/ 以下にある(アラーム音はこれ以下のalarms/ ディレクトリ)。TrojanFinalではHTC製サウンドがないので (今まで使っていたアラームBeepsとかも)、これを旧ROMのnandroidから移転する。

  • TrojanFinal lacs HTC sounds, so first extract and move them from old nandroid backups to /system/media/audio/alarms.
(RA Recoverly Flashにて)
mount -a
mkdir /tmp/t; cd /tmp/t ←てきとーなディレクトリを作って移動
/sbin/unyaffs /sdcard/nandroid/.../system.img ←/sbin/unyaffsはRA Recovery Flashにあります
cp ./system/media/audio/alarms/* /system/media/audio/alarms
(reboot)

まだこれでもダメであった。どうやらアプリが上記URLで実ファイルにアクセスする対応関係のデータベースがあるらしい。adb shellで覗いてみる。

  • I took a look the sqlite3 DB which the Apps utilize to make correspondance between URL (say "ontent://media/internal/audio/media/64") and the file object (say "/system/media/audio/alarms/Beeps.mp3").
(adb shellにて)
sqlite3 /data/data/com.android.providers.media/databases/internal.db
select * from audio_meta;
...

ところでディレクトリ /data/data/com.android.providers.settings/databases/ の各種sqliteファイルが、『どこにしまってあるんだろう』と思うようなシステム関連設定らしい。

sqlite3 /data/data/com.android.providers.settings/databases/settings.db
sqlite> select * from system;
...
148|/system/media/audio/alarms/Beeps.mp3|Beeps.mp3|25916|audio/mpeg|1259174294|1259174104|Beeps��|4148|3||2|0|2009|0|0|1|0|0|

各フィールド名は省略(PostgreSQLみたいに表示されないんだもん)したが、同様の事件があったら .schema コマンドとかでみてくれたまへ。

Beeps.mp3のエントリはあるが、key (1フィールド目の"_id") が旧ROMの64から148になっている。とりあえずは上記を64にしたエントリを偽造する。

  • The key (_id) for the file "Beeps.mp3" is changed from 64 to 148. For patching, I inserted the same entry but the _id is 64.
(continue)
insert into audio_meta (_id, _data, _display_name, _size, mime_type,
 date_added, date_modified,
 title, title_key, duration, artist_id, album_id, track, year,
 is_ringtone, is_music, is_alarm, is_notification, is_podcast) 
 values (64, '/system/media/audio/alarms/Beeps.mp3', 'Beeps.mp3', 25916, 'audio/mpeg', 
 1259174294, 1259174294,
 'Beeps', , 4148,3, 2, 0, 2009,
 0, 0, 1, 0, 0);

とりあえず直りましたとさ。

上記DBに正式にアクセスするためのAPIは眺めてみていないが、まあ実体がある場所とフォーマットとかが分かっているので今回はよしと。

ちなみに、/system/media/audio/alarms/ にあるサウンドは上記のようにDB (internal.db) が狂っているので (手で直した1エントリ以外は) 表示されないが、いちおう /sdcard/media/audio/alarms/ には、私のお気に入りサウンドとかHTC alarm音のバックアップはあるのだ。internal.dbが狂っていてると「一個もアラーム音がない」といって、SDカード(externalXXX.db)からは検索せずに死ぬ、というのは、ちょっとバグくさい。

なおHTCアラーム音は聴いて眺める分には楽しいが、実用になるのはBeepsくらいだほんとに (これ妙に耳障りで起きちゃうんだよなー)。SuperMagic/Trojanのひとつの特徴は壁紙・アイコンとか音などが凝っていることだが、Trojan作者とその仲間たちが作った(?)100を超えるringtone・alarm・notifyを聴いても、どれもあまり実用的とはいえない(失礼ながら)。まあandroid (WindowsMobileとかもそうだが) は、自分でお気に入りのサウンドを編集ソフトで加工してMP3にすればアラーム・ring・notify・カメラのシャッター音など何にでも使えるので、『着メロ』とかに命燃やしちゃうひとにはたまらんでしょーな(笑)。

それにしてもシステムがUNIXとかsqliteとかオープンなものでできているって、ほんとーに素晴らしいですねー(水野晴男調で読むこと)。

音DBはなんのためにあるのか

上記のDB修理を行なったあとは、SDカード内の音をアラーム等に使うのもなぜか快調である。本体フラッシュ内のROM付属の音は、100近くも着信音・アラーム・ノーティファイが詰まっているTrojan Finalのすべての音が『設定』アプリのメニューで表示されているようにはみえない(つまり修理したエントリ以外のDBはまだ壊れているようだ)が、少なくともSDカードで私が持ち込んだ音は表示されるようになった。

SDカードには通常、androidを音楽プレーヤとして使用するためのオーディオファイルも詰まっているはずである。それらがすべて着信音リストに表示されたらうっとうしい (いや脳メロのひとは嬉しいのかもしれないけど)。だからSDカードの場合、ディレクトリ /sdcard/media/audio/{ringtones,alarms,notifications}/というディレクトリにそれぞれ収めることになっている。着信音・アラーム・ノーティファイに使えるのはこのディレクトリの音だけである。らしい。

らしいのだが、これ以外に収めた音も表示される(笑)。いや音楽ではないのだが、HTCサウンド(クリスタルサウンドというらしい)はROMによって付属しているものが違うので、他のバージョンで使うためにバックアップをSDカードに取ったりしていたのだが、どうやら .../{ringtones,alarms,notifications}/ という名前のサブディレクトリならばすべて、『設定』で表示されてしまうようなのだ。どういう名前の条件のとき表示されるかはきちんと確かめてはいないが、ともかく気に入って実用にしている『Beeps』なんて本体に1つ、バックアップがSDカード中に合計3つあったりするものだから、『設定』リストに同じものが4つくらい表示されてしまう。

なお本体内にサウンドファイルを移動してしまう場合はディレクトリ /system/media/audio/{ringtones,alarms,notifications}/ ということになっているが、前節で述べたような手順でinternal.db3を再構築しないと持ち込んだ音は『設定』リストに表示されないと思う。

そしてSDカードの音を検索するタイミングも謎である。上記ディレクトリの音は、なんらかのタイミングで検索され、データベースexternalXXX.db3に登録されるようなのだ。これが起動のときか、アラームアプリや音楽プレーヤを起動したときか、SDカードを挿したときなのかよくわからない。

そもそもSDカードに入れた音は、アラームくらいならともかく、着信音やノーティファイには不向きであると思う。うっかりSDカードをアンマウント(PCにマウント)しているときに電話が掛かってきたら音が鳴らない(私は電話として使っていないのでどうなるのかわからない)し、SDカードを挿したときに鳴るはずのノーティファイはSDカードがまだマウントされていないので鳴らない(爆笑)。

まあ上でさんざ毒づいていますが、一昨日はブレードランナーのファイナルカットをBDで買い直した記念に、2019年的サウンドをちょっと拾ってみました。いくつか作ってみたのだが、HTC magicの音響の関係で、使い物になったのははじめの2つくらい。

携帯端末の周波数特性

上記の音を編集してHTC magic流し込んでみて、なんかおかしいと思った。例えば『呼び出し音』は雨のシーンで、編集しているPCでHi-Fiのヘッドホンでは、ややノイジーな感じを残したいから背景の雨の音は弱くしてあるものの残している。ところが (実際magicでなくても携帯端末で聴いてみるとわかると思うが)、雨の音がうるさいのだ。

当たり前だ。これはスピーカが小さいからである。共鳴するボディも小さい。こんな装置のための音の編集というのははじめてだったので失敗してしまった。ではf特はどうなっているのだろうか。

手元に測定器なんてものはなかったので、とりあえずsin波のスィープ音のWAVファイルを作って、再生して録音してエンベロープを測ってみた。

specifications
  • frequency range: 20-20480Hz (10oct.)
  • object: HTC magic internal speaker (recorder set at approx. 5cm distance)
  • reference:
    • D/A: ONKYO WAVIO
    • amplifier: ONKYO A-933
    • speaker: ONKYO D-302E (recorder set at approx. 20cm distance)
  • recorder: R-09HR (internal microphone) WAV, 16bit, 48000Hz

録音機の特性を補正するため、リファレンス機のステレオでも再生してみた (この特性がフラットならば割り算すればmagicのf特が出るはずである) が、結構リファレンス機も特性がでこぼこしているような感じがするので(笑)、結果はそのまま掲載した。なお縦軸は絶対音圧ではなく、最大の音圧を1 (0dB) に取った相対値である。

frequency responce of HTC magic internal speaker (dotted)/reference audio system (solid)

いくらでこぼこしている(ようだ)とはいえ、さすがにオーディオはオーディオである。30Hz~10KHzくらいまでで-10dBをやや割り込む程度である。この外は録音機のマイクの特性ということもあり得るし、考えてみたら12KHz以上の落ち込みは2wayのスピーカのツィータの軸上から外れたところで録ったからフェアではないかもしれない。

ところがmagicのほうは、低音がまったく出ていない。というか500Hzくらいまで使い物にならないので、ひとの話し声すらスピーカから出したらよく聞こえないということになる。ピークは10KHzくらいに来ている(笑)。

なるほどHTCは『クリスタル』と銘打って、高音成分が多く含まれている効果的に聴こえるサウンドを編集したわけだ。これは参考にさせてもらおう。

ところでmagicで使う場合、10KHz以上 (いちおう出力がある) もおかしいので要注意だ。耳で聴いていると変なアンチエイリアスが聴こえる (スィープが綺麗に上がっていくのではなく妙な音程のビートみたいなものがきこえる)。サンプリング周波数が低くてフィルタリングを端折っているせいだと思う。

こういうのは携帯端末に限らず、安物のCDプレーヤなど (昔MDを使っていたときもややあった) にもみられる。きょうびの子どもたちは生まれてから大人になるまで、ほんもののオーディオ機器で音楽を聴いたことがなく、こういった機器だけで聴いているひとがいるという。耳(脳の問題だ)がきちんとした音を聴き取れなくなっていると思うと恐ろしい。

この手の携帯端末は、ヘッドホンで聴くとそれほど悪い特性であるとも思えず、バッテリが電流を取れるので(前に使っていた携帯端末のGenio eなどとても良かった)音そのものは太いのであるが、要するに高音は腐っている可能性がある。上記は内蔵おまけスピーカでのはなしであるが、いずれヘッドホンなどでも低音域はともかく、高音域は同じように『ありもしない音』が再生される可能性があるということだ。

同様のネタで余談になるが、『老人にはきこえない』モスキートサウンドというのがちょっと前に話題になった。これを生成して耳をテストするなるフリーソフトまで登場したが、そのとき再生してみたPCでは8KHz以上が聴こえない(笑)。老化したかと思ったら (私は両耳とも14KHzまでは聴こえる)、そもそも再生したPCが10KHz以上をカットしてほとんど出していなかった (機器を安く上げたためか高い周波数のアンチエイリアスを避けたのか)、というオチであった。

うちには測定できる機器 (PCMレコーダ) があるから笑い話で済んだが、にちゃんねるのニュース速板などでは「聴こえないどうしよう」などと青ざめている中年が多数いた(この板は平均年齢が高く、30~40代と思われる)。

いずれ携帯端末は『雑踏の中で』『BGMとして』『簡易に』音楽をきくための機器なので音質など追求しても仕方ないが、真剣にmagicの音は、いやiPodは、などと議論しているひとがいるので、念のため(笑)。