メトロノームアプリについて。

341 views
Skip to first unread message

foobar

unread,
Mar 23, 2014, 3:41:16 PM3/23/14
to android-g...@googlegroups.com

初投稿させていただきます。よろしくお願いします。

現在、一定の間隔で音を鳴らすアプリ(メトロノーム)を作成中です。
Thread.sleep()を用いて、一定間隔で音を鳴らす、というプログラムを書きましたが
実機で試したところズレが発生しました。(ミリ秒のズレです)
よくよく調べてみるとsleep()メソッドには誤差があるとのことでした。
(音を鳴らす、という処理でも微妙な差が生まれてしまうとも推測しています)

次にTimerを用いてscheduleAtFixedRate()メソッドを用いて同様のプログラムを書きましたが
やはりズレが発生してしまいました。

このグループの同様の問題について過去にも投稿(https://groups.google.com/forum/#!topic/android-group-japan/EOL8ZoaoQLc)があったようですが
Javaを用いて解決する糸口は見えていない模様。

正確なビートを刻む、というプログラムはJavaでは書けないのでしょうか…?

此方Androidプログラム初心者です。

どうかご教授願います。

田代透

unread,
Mar 23, 2014, 7:22:58 PM3/23/14
to android-g...@googlegroups.com
Javaではと言うよりマルチタスクなので他の処理を行われていればその分の遅延がアプリレベルで発生するという事はあるのじゃないでしょうか。
Androidの場合は制御用ではなくてヒューマンインターフェイスなのでリアルタイム性はそれほど重視していないと思われますし。

刻みたいビートの音源ファイルを用意してmediaplayerでループ再生させるとかすれば、(mediaplayerが遅れることがなければ)実現できるかと思います。
音源ファイルを多数用意するとか、音源ファイルをビートに合わせて生成するとかすれば良いのではないかと考えます。



2014年3月24日 4:41 foobar <harim...@gmail.com>:

--
このメールは Google グループのグループ「日本Androidの会」に登録しているユーザーに送られています。
このグループから退会し、グループからのメールの配信を停止するには android-group-j...@googlegroups.com にメールを送信してください。
このグループに投稿するには android-g...@googlegroups.com にメールを送信してください。
http://groups.google.com/group/android-group-japan からこのグループにアクセスしてください。
その他のオプションについては https://groups.google.com/d/optout にアクセスしてください。



--
--
Toru Tashiro
toru...@gmail.com

W少年

unread,
Apr 12, 2014, 10:12:29 AM4/12/14
to android-g...@googlegroups.com
メトロノームは鬼門だなぁ。
毎回タイムスタンプを調べてずれを検知すればいいけど
端末が忙しいと楽器の練習には全く役に立たないし
部活で使っているメトロノームを貸してもらった方がいいよ。
一人で弾き続けるのであればタイムスタンプを見て調整すればいいだけだけど
それだと合奏の練習には使えないよ。
タイムウタンプもミリ秒単位だからそのうちずれを体感できればいいですね。
やはり一度はタイムスタンプを調べてつくってみましょう。

2014年3月24日月曜日 4時41分16秒 UTC+9 foobar:

Akihiko Nakagawa

unread,
Apr 12, 2014, 11:16:44 AM4/12/14
to android-g...@googlegroups.com
お世話になります。LapisCactusと申します。

AndroidはRTOSではないため、タイマーで正確な時間待つのは難しいです。
ズレが発生してしまいます。

foobarさんが提示された過去の投稿の途中に、
AudioTrackについての投稿があり、こちらを使用すると、対応できると思います。
いかがでしょうか。

私がメトロノームアプリを作ったときは、AudioTrackを使いました。
手順としては以下のようになります:
1)AudioTrackをインスタンス化し、再生状態にする
2)一定間隔で音を鳴らすパターンデータ(byte配列)を作る
3)作ったデータをAudioTrackに書き込む
 →再生される
4)データを繰り返し再生するために、手順3の書き込みを繰り返し行う
5)終了するときは、AudioTrackのreleaseメソッドを呼ぶ

ざっくりとした説明になってしまったので、
分からないことがあれば、さらに質問していただければと思います。



2014年4月12日 23:12 W少年 <fujisa...@gmail.com>:
Reply all
Reply to author
Forward
0 new messages