2013年11月16日土曜日

[Android] ストップウォッチアプリの表示をC言語でスムーズに改造する

The simple stopwatch application for Android
前回のストップウォッチアプリ は、経過時間の表示がカクカクになることがあります。

経過時間の文字列を表示するため Handler#handleMessage メソッドの中で
ByteArrayOutputStram

PrintStream
のインスタンスが1秒間に数十回メモリーのヒープと呼ばれる領域に確保されます。表示後はインスタンスが不要になります。
Javaの仕様により不要になったインスタンスがある程度たまるとヒープから解放する処理が行われます。
(解放されたメモリーは別のインスタンスの確保などに再利用されます)
この処理はGC(ガーベジコレクター、ガーベジコレクション)というものですが、GCの処理は意外と時間がかかるようです。
Android OSのバージョンにもよりますが、GCが完了するまでそれ以外の処理は一時停止されます。

前回のアプリは数秒ごとにGCが発生するため表示がカクカクする原因になっていました。
そこで表示をスムーズにする方法を考えてみました。

C言語ではメモリーの解放処理をプログラムする必要がありますが、GCの対象にはならないので表示をスムーズにできると予想できます。
その結果、経過時間の文字列はJavaではなくAndroid-NDKによるC言語で処理することにしました。

このブログを書いている時点の開発環境は次の通りです。
・Windows8 (64bit)
・Eclipse Juno (32bit)(XP互換モードで起動)
・Android SDK r22.2
・Android NDK r9

以下ソースです。
MainActivity.java (アクティビティ)

※初期化漏れがあったので修正しました。2014年6月16日

jni.cpp


Android.mk


※特別な権限(Permission)は不要なのでマニフェストは省略します。
Target SDK Version が4以上の設定でビルドできます。
Android1.6以降で動作します。
Android-NDKのビルド方法は環境に強く依存するので省略させて頂きます。
SH-03C(実機)とBluestacks(エミュレーター)で動作することを確認しています。

動作保証はできませんが最低限の動作はするようです。
前回に比べてレイアウトを少し変更してます。
アプリ動作中のスクリーン消灯もオフにしています。

GCの頻度を減らしただけですがJavaだけで作ったアプリに比べてかなりスムーズになりました。
今回のC言語のプログラムはスタック変数しか使ってないので解放処理が不要でした。

Javaはメモリーの解放処理が(完全ではないものの)GCにより自動化されているため、プログラムしやすい言語です。
その反面、GCを完全になくすことはできません。
AndroidアプリでGCを減らしたい場合、GCが多発する処理をAndroid-NDKによるC言語でプログラムするのもいい方法だと思います。

関連ブログ
[Android] ストップウォッチアプリを作ってみました
[Android] Javaのstaticクラス(Handler)から非sataticクラス(Activity)のメソッドを呼び出すには(弱参照)
[Android] PrintStream#printfの最適化(SDK r08でのエラーを別の方法で解決する)
[Android] ライブ壁紙の作り方
[Android] 方位センサーを使ってコンパスアプリを作る
[Android] OpenGLでプロ生ちゃんをアニメーションさせる
[Windows8][Android] Can't bind to local 8600 for debugger

以上、参考になれば幸いです。

2013年11月9日土曜日

[Android] ストップウォッチアプリを作ってみました

The simple stopwatch application for Android
ストップウォッチのAndroidアプリを作ってみました。

このブログを書いている時点の開発環境は次の通りです。
・Windows8 (64bit)
・Eclipse Juno (32bit)(XP互換モードで起動)
・Android SDK r22.2

アクティビティ(MainActivity.java)

※特別な権限(Permission)は不要なのでマニフェストは省略します。
Android1.6以降で動作します。
Target SDK Version が4以上の設定でビルドできます。
SH-03C(実機)とBluestacks(エミュレーター)で動作することを確認しています。

動作保証はできませんが最低限の動作はするようです。
なぜかBlueStacksでは1000分の1秒の位が常にゼロで表示されます。

Playストアにはスタイリッシュなストップウォッチのアプリが沢山ありますが自分で作ってみるのも楽しいです。

関連ブログ
[Android] Javaのstaticクラス(Handler)から非sataticクラス(Activity)のメソッドを呼び出すには(弱参照)
[Android] PrintStream#printfの最適化(SDK r08でのエラーを別の方法で解決する)
[Android] ライブ壁紙の作り方
[Android] 方位センサーを使ってコンパスアプリを作る
[Android] OpenGLでプロ生ちゃんをアニメーションさせる
[Windows8][Android] Can't bind to local 8600 for debugger

以上、参考になれば幸いです。

2013年11月2日土曜日

[Android] Toastのフォントを変えるには

How to change font styles on Toast
Toastは画面に文字をオーバーレイ表示するのによく使われます。
過去のブログ [Android] Toastに画像やボタンを表示するには では文字以外に画像やボタンを表示する方法を書かせて頂きました。

この機能を応用してTextViewを表示すれば、Toastに表示する文字の大きさや色を変えることができます
今回はToastに赤い大きな文字を表示するサンプルを作ってみました。

このブログを書いている時点の環境は次の通りです。
・Windows8 (64bit)
・Eclipse Indigo SR2 (32bit)
・Android-SDK-r22.0.4

以下ソースです。

アクティビティ(MainActivity.java)

※特別な権限(Permission)は不要なのでマニフェストは省略します。
Target SDK Version が4以上の設定でビルドできます。
Android1.6以降で動作します。

Android-SDK付属のエミュレーターで実行するとこうなります。
解像度やフォントの種類によって見え方が異なることがありますのでご了承ください。

関連ブログ
[Android] Toastに画像やボタンを表示するには
[Android] SurfaceviewにToastを表示するには
[Android] Toastをcancelするには
[Android] OpenGLでプロ生ちゃんをアニメーションさせる
[Android] 端末の傾きに立方体を連動させる
[Android] 方位センサーを使ってコンパスアプリを作る
[Android] Javaのstaticクラスから非sataticメソッドを呼び出すには
[Android][Windows8] Can't bind to local 8600 for debugger
[Android] Android-SDKでやってはいけないこと
[Android] ライブ壁紙の作り方
[Android] Activityに時計を表示する(Activityの非同期更新)

以上、参考になれば幸いです。
n

2013年10月26日土曜日

wavファイルの書き出しは要注意 [CUBASE][StudioOne]

Attention to exporting wav files
拡張子の「wav」は一般的に音声ファイルに使われます。
wavファイルはメタ情報を含むことができ、メタ情報の内容により WAVBroadcast Wave Format に区別されるようです。

WAV (ウィキペディア)
http://ja.wikipedia.org/wiki/WAV
Broadcast Wave Format (ウィキペディア)
http://ja.wikipedia.org/wiki/Broadcast_Wave_Format

この2種類のフォーマットはメタ情報が異なりますが拡張子が同じなので簡単には区別できません。
どちらもWindows Media Playerで再生することができるので区別する必要がないように思えます。

ところが一部のBroadcast Wave FormatファイルはWindows サウンド設定で再生できない問題があるようです。
プロ生ちゃん音声が Windows サウンド設定で再生されない問題
http://pronama.azurewebsites.net/2013/09/09/sound/

※ 特定の製品について宣伝や中傷をするものではありません。


CUBASE や StudioOne で書き出したファイルは再生できる

CUBASE7ではミックスダウンの書き出し画面でBroadcast Wave Formatとしてファイルを書き出すことができます。
blog.fujiu.jp wavファイルの書き出しは要注意
StudioOne2.6はソング設定からメタ情報の設定ができますが、wavファイルは必ずBroadcast Wave Formatとしてエクスポートされるようです。
CUBASE7 や StudioOne2.6 で書き出したBroadcast Wave Formatのファイルはサウンド設定で再生することができました。

Windowsサウンド設定で再生できなかったファイルはProToolsで書き出されたようでした。
ProToolsのバージョンやエディション、動作環境などはすべて不明です。


なぜWindowsサウンド設定で再生されないのか

プロ生ちゃん音声がWindowsサウンド設定で再生できない原因は不明です。
ですがyouandiさんの日記でPlaySound関数で再生できないことが指摘されています。
プロ生ちゃんの音声がWindows サウンド設定で再生されない問題 - 桜、抹茶、白、日記
http://d.hatena.ne.jp/youandi/20130911/p1

さらにウィキペディアのRIFFの項目に興味深いことが書かれています。
http://ja.wikipedia.org/wiki/RIFF
情報源は不明ですがこのブログを書いている時点では「マイクロソフトのRIFFに関する文書は分散していて把握しきれないことも多く...」とのことです。

手元にProToolsがないので検証することができませんがProToolsのメタ情報かPlaySound関数のどちらかに不具合があるのかもしれません

2015年8月、Protools Firstで検証できました。
ProTools First のwavファイルはPlaySound関数で再生できるか?


Broadcast Wave FormatをWAVに変換する方法

Broadcast Wave Formatファイルのメタ情報を最小限にしてしまえばWAVファイルと同じになるはずです。
フリーウェアのSound Engine Freeが簡単です。
Broadcast Wave Formatのファイルをwavファイルとして保存し直せば変換できます。
Sound Engine Freeのダウンロードはこちらから
http://soundengine.jp/software/soundengine/
CUBASE7でも可能です。
「オーディオミックスダウン書出し」画面でWaveファイルのファイル形式を選び
オフ - Broadcast Waveチャンクを挿入
オン - Wave拡張フォーマットを使用しない
オフ - iXMLチャンクを挿入
オフ - テンポ設定を挿入
の設定で書き出すと変換できます。


WAV と Broadcast Wave Format を区別する方法

バイナリーエディターで開いてメタ情報に bext という文字列があればBroadcast Wave Formatです。(ウィキペディアが正しければ)
CUBASE7ならもっと簡単です。
Media Bayの結果リスト(Search Results)セクションの「File Type」(初期設定では一番右の列)に表示されます。
ちなみにStudioOne2.6 Artist はWAVとBroadcast Wave Formatの表示の区別はないようです。どちらも「Waveファイル」と表示されます。

wavファイルがこんなに複雑だとは知りませんでした。他にも不都合があるかもしれません。
配布目的のwavファイルを書き出すときはサンプリングレートやビット深度のほかメタ情報にも要注意です。


関連ブログ

[Android] SoundPoolのオーディオ再生ミスをなくす
[Unity] オーディオの音量が小さい
[Windows] オーディオ再生中にノイズが鳴る、途切れる
[PlasStation Mobile] オーディオファイルを再生するには

以上、参考になれば幸いです。

2013年10月19日土曜日

[インターネット] ブログのURLを自分のドメイン名に変更する

How to use a custom domain name for blogger.com
当ブログ blog.fujiu.jp はGoogleが提供するblogger.com(blogspot)を利用しています。
当ブログのURLは mtk-fujiu.blogspot.com が標準ですがカスタムドメインを設定し blog.fujiu.jp というURLでアクセスできるように設定しています。
blogger.comはURLを変更できます
blogger.comにドメイン名を設定する方法について簡単に説明します。

blogger.comのマイブログ画面から設定を開きます。

ドメイン名の設定をします。

ドメインレジストラー側の設定を次のようにしています。
ホスト名 blog.fujiu.jp
タイプ CNAME(別名)
コンテンツ ghs.google.com

※オリジナルのURLを設定する場合はご自身のホスト名に置き換えて設定してください。
詳しくはヘルプの カスタム ドメイン をご一読ください。


※設定後、カスタムドメインのURLでアクセスできるようになるまで1日かそれ以上の時間を要することがあります。

「fujiu.jp」はMtkが維持・管理しているドメイン名なので他の方が設定することはできません。
自分だけのURLを設定すると唯一無二のサイトができたような気がして自己満足度がとても高いです。

アプリ開発者ならドメイン名をお持ちの方が多いのではないでしょうか。
最近はドメイン一つあたり年間千円程度から維持することができるようになりました

個人的な感想ですがjpドメインだと中華民国(台湾)や韓国からのアクセスが増えるような気がします。

関連ブログ
[セキュリティ] bitly.com にスパムサイトと誤認されたら
[セキュリティ] Twitterに「スパム、または安全でない」と誤認されたら
[インターネット] Googleストリートビューにプライバシー情報が公開されてしまったら

以上、参考になれば幸いです。

2013年10月12日土曜日

[CUBASE] スペクトルモニターの精度

The spectrum precision
CUBASE7ではチャンネル設定やStudioEQにスペクトル(周波数ごとの振幅)が表示される様になりました。
CUBASE6以前はMultiScopeという付属プラグインでスペクトルを表示する方法がありました。
チャンネル設定とMultiScopeの精度を比べてみました。
環境は次の通りです。
・Windows8 (64bit)
・CUBASE7.0.5 (64bit)

検証する方法はオーディオトラックに付属プラグインのTestGeneratorをインサートするだけです。
TestGeneratorは初期状態で440Hzのサイン波を-12dBで出力します。

チャンネル設定やStudioEQは440Hzあたりをピークに表示しています。

一方、MultiScopeは波形がゆらゆらと動いて落ち着きません。440Hzあたりにピークがありますが、なぜか1.4kHz~1.5kHzに山ができてしまいます。

サイン波以外を比較するとさらに違いが分かります。三角波の比較では明らかに情報量が違います。

理由は不明ですがMultiScopeはかなり古いプラグインです。PCの平均的な処理能力が今よりずっと低かった頃から付属していたようなのでスペクトル解析も当時のPCの処理能力に合せて設計されていると思われます。

一方のチャンネル設定のスペクトルモニターはCUBASE7から搭載された機能です。現在の技術に合せて設計されていると思うのでチャンネル設定の方が精度が高いのだと思います。

さらにCUBASE7からStudioEQもスペクトル表示できるようになりました。右のSpectrumをクリックすると表示されます。
StudioEQの精度はチャンネル設定とほぼ同じようですが、振幅はより広い±30dBの表示です。

MultiScopeはプラグインなのでどこにでもインサートすることができます。
エフェクトをかける前とかけた後のスペクトルを比較する場合はMultiScopeを二つインサートしていましたが、より正確な比較をするときはStudioEQやチャンネル設定を使う方が良さそうです。

関連ブログ
[CUBASE][StudioOne] 音の遅れ(レイテンシー)の原因を探る
[CUABSE] Prologue・Mystic・Spectorの左側のLFOを使う方法
[Cubase] Mystic・Prologue・Spectorの同時発音数の設定方法
[CUBASE] CUBASE7のインストールとトラブル
[CUBASE] 「突然音が出なくなった」を解決する
[Windows] オーディオ再生中にノイズが鳴る
初音ミクV3とピアプロスタジオ [VOCALOID][StudioOne]
[VOCALOID][CUBASE] VOCALOID Editor for CUBASE(ボカキュー)で何が変わるか?
[VOCALOID Editor for CUBASE] ボーカロイドをMIDIキーボードで入力する
[VOCALOID] CUBASEで「ぼかりす」(VocaListener)っぽいことをする
[VOCALOID Editor for CUBASE] VOCALOIDが発音しないことがある
初音ミクV3とピアプロスタジオ

以上、参考になれば幸いです。

2013年10月5日土曜日

[VOCALOID] ピアプロスタジオをStudioOneなしで起動する

How to launch Piapro Studio wihtout StudioOne
初音ミクV3やKAITO V3に付属のピアプロスタジオはVSTプラグインです。
使用するにはホストアプリケーションとなるDAWを起動する必要があります。
StudioOneという付属のDAWをインストールすればStudioOneのプラグインとして使うことができます。

ただしStudioOneをはじめ多くのDAWは起動するまでにそれなりに時間がかかり、起動中はCPUやメモリーなどのリソースを消費します。
「StudioOneを使わずにピアプロスタジオを使いたい」とお考えの方は多いのではないでしょうか?

ピアプロスタジオをはじめとするVSTプラグインはスタンドアローンで起動することはできない仕様です。
ただし、フリーウェアのVST Hostを使って最小構成で起動できることが確認できました

このブログを書いている時点の環境は次の通りです。
・Windows8 (64bit)
・ピアプロスタジオ 1.0.0.3 (64bit)

こちらのサイトからVST Hostをダウンロードします。
http://www.hermannseib.com/english/vsthost.htm
64bitのWindowsで使うため vsthostx64.zip をダウンロードしました。
32bit環境でお使いになる場合は32bit版のピアプロスタジオをインストールし vsthostx86.zip をダウンロードしてください。

ダウンロードしたファイルは圧縮されているので解凍します。
今回は C:\vsthostx64 に解凍しました。
解凍できたら vsthost.exe をダブルクリックして起動します。

起動したらメニューの
File - New Plugin
を開きます。
C:\Program Files\VstPlugins
にある(はずの) Piapro Studio VSTi.dll を開きます。
Piapro Studio VSTi.dll のプラグインが表示されるので、赤丸の部分をクリックします。
これでピアプロスタジオが起動します。
あとはいじり倒すだけです。
VST Host上で起動したピアプロスタジオは、wavファイルやVSQXファイル(VOCALOID3 Editor形式のファイル)への書き出し機能も制限なく使えます。

ピアプロスタジオを最小構成で起動するとホストDAWに気を遣わなくて済みます。
その反面「エフェクトをかけたい」と思うことも少なくありません。
試しにVST Host上でEZ MIX2 LITEのエフェクトをかけてみた図です。
VST Hostだけでエフェクトをかけることもできましたが、素直にStudioOneを使った方がミキシングしやすいと思います。

初音ミクV3やKAITO V3をDAWなし・VOCALOID3 Editorなしで使いたい」といった場合におすすめの方法です。
ミク日本語のみ
ミク日本語と英語
関連ブログ
初音ミクV3とピアプロスタジオ [VOCALOID][StudioOne]
ピアプロスタジオ 64bit版 [VOCALOID][CUBASE]
[VOCALOID][StudioOne] KAITO V3 とピアプロスタジオ
VOCALOID Editor for CUBASE(ボカキュー)で何が変わるか?
[VOCALOID Editor for CUBASE] ボーカロイドをMIDIキーボードで入力する
[VOCALOID] CUBASEで「ぼかりす」(VocaListener)っぽいことをする
[VOCALOID] メグッポイドユーザー用 INTERNET FormantShift VST
[VOCALOID] VSTプラグインでVOCALOIDの声を聞きやすくする
[VOCALOID] StudioOneFreeでVOCALOIDの声を聞きやすくする
VOCALOID Deactivation Tool を使ってみました
[VOCALOID] 洛天依が届くまで
[VOCALOID] 洛天依を歌わせるには
[VOCALOID] VOCALOID3 Editor
[VOCALOID] VOCALOID2に英語の歌詞を流し込む(打ち込む)
[CUBASE] CUBASE7のインストールとトラブル
[CUBASE] 「突然音が出なくなった」を解決する
[Windows] オーディオ再生中にノイズが鳴る

ボーカロイドが音声案内するAndroidアプリを公開中です!
頭痛・肩凝り予防のストレッチを支援 Eye元気!2

以上、参考になれば幸いです。