<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>NASKIT &#187; プログラミング</title>
	<atom:link href="http://naskit.com/category/%e3%83%97%e3%83%ad%e3%82%b0%e3%83%a9%e3%83%9f%e3%83%b3%e3%82%b0/feed/" rel="self" type="application/rss+xml" />
	<link>http://naskit.com</link>
	<description>AndroidとかUnityとか</description>
	<lastBuildDate>Sun, 15 Apr 2012 09:14:00 +0000</lastBuildDate>
	<language>ja</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.2</generator>
		<item>
		<title>moblのサンプルを見てみる</title>
		<link>http://naskit.com/2011/02/09/mobl%e3%81%ae%e3%82%b5%e3%83%b3%e3%83%97%e3%83%ab%e3%82%92%e8%a6%8b%e3%81%a6%e3%81%bf%e3%82%8b/</link>
		<comments>http://naskit.com/2011/02/09/mobl%e3%81%ae%e3%82%b5%e3%83%b3%e3%83%97%e3%83%ab%e3%82%92%e8%a6%8b%e3%81%a6%e3%81%bf%e3%82%8b/#comments</comments>
		<pubDate>Tue, 08 Feb 2011 17:44:56 +0000</pubDate>
		<dc:creator>saikoro</dc:creator>
				<category><![CDATA[Android]]></category>
		<category><![CDATA[mobl]]></category>
		<category><![CDATA[プログラミング]]></category>
		<category><![CDATA[iPhone]]></category>

		<guid isPermaLink="false">http://naskit.com/?p=634</guid>
		<description><![CDATA[前回はHelloWorldだけを動かしてみたが、今回はサンプルを見てみたい。 moblのサンプルページに Your First Application Todo List Higher-Level Controls St [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://naskit.com/2011/02/07/スマートフォン向けhtml5アプリ製作言語mobl/" target="_blank">前回</a>はHelloWorldだけを動かしてみたが、今回はサンプルを見てみたい。</p>
<p><a href="http://www.mobl-lang.org/learn/" target="_blank">moblのサンプルページ</a>に</p>
<ul>
<li>Your First Application</li>
<li>Todo List</li>
<li>Higher-Level Controls</li>
<li>Styling User Interfaces</li>
<li>Calling Web Services: Twitter Trends</li>
<li>Styling User Interfaces</li>
</ul>
<p>などのチュートリアルがある。<br />
Todo Listは<a href="http://d.hatena.ne.jp/y_koh/20110206/1297006444" target="_blank">悪あがきプログラマー</a>さんで解説されている。</p>
<p>3つのファイルに記述するだけでリスト表示、新規登録、更新、削除、検索機能を持ったWebアプリを作成することができる。<br />
これはすごい。</p>
<pre class="brush: plain; title: ; notranslate">
// todo.mobl
// todoというアプリケーションを宣言しているのだろう
application todo

// なにやら必要なモジュールをインポート？
import mobl::ui::generic
import model

// ルート画面
screen root() {
  // ヘッダー
  header(&quot;Tasks&quot;) {
    // ボタンを追加すればデフォで右端に表示される。イベントはあとで追加するscreenを関数のように呼び出す
    button(&quot;Add&quot;, onclick={ addTask(); })
  }
 // グループってのは複数のアイテムがある要素なのだろうか
  group {
    // あとで定義するTaskに対する取得条件を記述してグリグリとリスト表示する。すげぇ
    list( t in Task.all() order by date desc) {
      item { taskItem(t) }
    }
  }
 // リストの下に検索ボタン。 イベントはあとで定義するscreen searchを呼び出し
  button(&quot;Search&quot;, onclick={ search(); })
}

// リストでグリグリされる各要素の定義
control taskItem(t : Task) {
  // チェックボックス Taskのdoneフィールドを直接true/falseを切り替えている
  checkBox(t.done, label=t.name)
// コンテクストメニュー  リストの右端のボタン。押すとなかのボタンが表示される
contextMenu {
   // 削除ボタン  イベントで remove関数でデータを直接削除している
    button(&quot;Delete&quot;, onclick={
      remove(t);
    })
   // 編集ボタン  イベントで あとで定義するscreen editTaskを呼び出し
    button(&quot;Edit&quot;, onclick={
      editTask(t);
    })
  }
}
// 新規追加画面
screen addTask() {
  var newTask = Task()

  header(&quot;Add&quot;) {
    backButton()
    button(&quot;Add&quot;, onclick={
      newTask.date = now();
      add(newTask);
      screen return;
    })
  }
  group {
    item { textField(newTask.name, placeholder=&quot;Task name&quot;) }
  }
}
// 編集画面
screen editTask(t : Task) {
  header(&quot;Edit&quot;) {
    button(&quot;Done&quot;, onclick={ screen return; })
  }
  group {
    item { textField(t.name, placeholder=&quot;Task name&quot;) }
    item { textField(t.description, placeholder=&quot;Task description&quot;) }
  }
}
// 検索画面
screen search() {
  var phrase = &quot;&quot;

  header(&quot;Search&quot;) { backButton() }
  searchBox(phrase, placeholder=&quot;Search term&quot;)
  group {
    list(t in Task.searchPrefix(phrase)) {
      item { taskItem(t) }
    }
  }
}
</pre>
<pre class="brush: plain; title: ; notranslate">
// モデル定義   スキーマを定義するだけでローカルストレージにテーブルを作成してくれる
module model

entity Task {
  name        : String (searchable)
  description : String (searchable)
  done        : Bool
  date        : DateTime
}
</pre>
<pre class="brush: plain; title: ; notranslate">
// 設定ファイル  デバッグを有効にしている。ブラウザのコンソールにログを表示してくれる。運用するときはdebugは解除だ
configuration

debug
title &quot;Todo&quot;
</pre>
<p>mobl言語ってのはJSONに似たような構造なのだがルールがイマイチよく分からない。<br />
セミコロンの有無など。<br />
関数の呼出には必要なのだろうか。<br />
でもそんなに難しくもないしeclipseで少しはコード補完してくれるので、2、3サンプルをやれば大体わかるはず。</p>
<p>あとはリモートサーバと連携する方法とデザイン変更や画像の扱いがわかればなんとか使えるかな。<br />
ボチボチ、サンプルを見てみよう。</p>
<div class="plus-one-wrap"><g:plusone size="medium" href="http://naskit.com/2011/02/09/mobl%e3%81%ae%e3%82%b5%e3%83%b3%e3%83%97%e3%83%ab%e3%82%92%e8%a6%8b%e3%81%a6%e3%81%bf%e3%82%8b/"></g:plusone></div>]]></content:encoded>
			<wfw:commentRss>http://naskit.com/2011/02/09/mobl%e3%81%ae%e3%82%b5%e3%83%b3%e3%83%97%e3%83%ab%e3%82%92%e8%a6%8b%e3%81%a6%e3%81%bf%e3%82%8b/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>デザイナーですか</title>
		<link>http://naskit.com/2010/11/03/%e3%83%87%e3%82%b6%e3%82%a4%e3%83%8a%e3%83%bc%e3%81%a7%e3%81%99%e3%81%8b/</link>
		<comments>http://naskit.com/2010/11/03/%e3%83%87%e3%82%b6%e3%82%a4%e3%83%8a%e3%83%bc%e3%81%a7%e3%81%99%e3%81%8b/#comments</comments>
		<pubDate>Tue, 02 Nov 2010 18:47:55 +0000</pubDate>
		<dc:creator>saikoro</dc:creator>
				<category><![CDATA[Android]]></category>
		<category><![CDATA[プログラミング]]></category>

		<guid isPermaLink="false">http://naskit.com/?p=463</guid>
		<description><![CDATA[デザイナー能力を身に着けたい！最近こう思うようになった。]]></description>
			<content:encoded><![CDATA[<p>デザイナー能力を身に着けたい！最近こう思うようになった。<br />
センスは無いし自分のアプリを見ても少し悲しくなる。</p>
<p>私はWeb系の仕事をしているのが、基本作業はデザイナーとプログラマーで分かている。<br />
デザイナーをHTMLにコーディングし、そこへJavascriptなり、PHPなりJavaなりでロジックを入れてゆく。</p>
<p>しかしユーザーインターフェースの設計が適当すぎるデザインもしばしばある。デザイナーとプログラマでどちらが責任を持つべきか曖昧なところ。</p>
<p>そこで思ったのだが、かっこよい<strong>イラスト</strong>を描けるだけで<strong>デザイナー</strong>と呼ばれるべきなのか。<br />
かっこよいイラストを作れる人は<strong>イラストレーター</strong>であってデザイナーではないのではないか。</p>
<p>たとえば市販車の場合、保安基準も満たせない公道も走れないような車を”デザイン”して評価されるか。<br />
たとえば建築物のデザインをして、地震への強度や使い勝手もままならない設計をして評価されるか。<br />
たとえば飲食店を”デザイン”して、消防法や衛生面の問題で営業できないような店を作って評価されるか。</p>
<p>されるわけないな。</p>
<p>もっとまともに設計せんかい！と思うことは多いのだが、カッコよいイラストを描いてくれる自称デザイナー様の意を汲み取って、ユーザーインターフェースを作るのはやはり実際にモノを作るエンジニア側の仕事であるなーと最近になって痛感するのであった。</p>
<p>デザインもプログラムも出来る人はスゴイ。うらやましい。私もそうなりたい。<br />
いつまでも「俺知らね」ではすまない！精進せねばならぬ。</p>
<p>でもね、でもね、どんなコントロールがあるか知っておこうね！<br />
せめて、せめて、どんな解像度のディスプレイに表示されるか考えようね！<br />
お絵描きじゃないからね！！</p>
<div class="plus-one-wrap"><g:plusone size="medium" href="http://naskit.com/2010/11/03/%e3%83%87%e3%82%b6%e3%82%a4%e3%83%8a%e3%83%bc%e3%81%a7%e3%81%99%e3%81%8b/"></g:plusone></div>]]></content:encoded>
			<wfw:commentRss>http://naskit.com/2010/11/03/%e3%83%87%e3%82%b6%e3%82%a4%e3%83%8a%e3%83%bc%e3%81%a7%e3%81%99%e3%81%8b/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Xperiaのカメラ</title>
		<link>http://naskit.com/2010/04/08/xperia%e3%81%ae%e3%82%ab%e3%83%a1%e3%83%a9/</link>
		<comments>http://naskit.com/2010/04/08/xperia%e3%81%ae%e3%82%ab%e3%83%a1%e3%83%a9/#comments</comments>
		<pubDate>Wed, 07 Apr 2010 16:58:53 +0000</pubDate>
		<dc:creator>saikoro</dc:creator>
				<category><![CDATA[Android]]></category>
		<category><![CDATA[プログラミング]]></category>
		<category><![CDATA[ToyCam]]></category>
		<category><![CDATA[Xperia]]></category>

		<guid isPermaLink="false">http://naskit.com/?p=306</guid>
		<description><![CDATA[Xperiaのカメラでいろいろ困った。]]></description>
			<content:encoded><![CDATA[<p><strong>Xperia X10 SO-01B</strong>は良く売れてるみだい。</p>
<p>AndroidMarketのデベロッパーコンソールの件数をGoogleDocumentにスプレッドシートに記録してるのだが、<br />
3月31日からダウンロード数が増えているので、すごく影響があるみたい。</p>
<p>私のアプリは２つとも<a href="http://androider.jp/" tartet="_blank">アンドロイダーさん</a>に掲載してもらってるけど、Xperiaで動作確認が取れたアプリはXperiaマークがついていた。すごい・・。<br />
んで<a href="http://naskit.com/android-app/androboice/" target="_blank">Androboice</a>は動作するらしい。よかったよかった。<br />
しかし<a href="http://naskit.com/android-app/toycam/" target="_blank">ToyCam</a>ではうまく動作しないらしい。</p>
<p>調べたところXperiaではカメラのプレビューサイズで480&#215;320を設定できないようだ。[320x240][640x480]は設定できるっぽい。<br />
<a href="http://naskit.com/android-app/toycam/" target="_blank">ToyCam</a>はカメラのプレビュー映像のひとコマを保存するだけのアプリである。<br />
最近つけたトイカメラ風のエフェクトはおまけである。あとで加工できるし・・。なんとかしなきゃ。</p>
<p>SDKで動的にカメラのプレビューサイズに設定可能な値一覧を取得できないか調べると、<br />
<a href="http://developer.android.com/reference/android/hardware/Camera.Parameters.html#getSupportedPreviewSizes()">Camera.Parameters.getSupportedPreviewSizes()</a>って素敵なAPIがあるじゃないか！<br />
でもこれ、API　Level5からなんだな。XperiaはAndroidOS1.6=API　Level4だからこのメソッドは使えない。</p>
<p>なにか良い方法はないものか、と考えた。<br />
んでカメラプレビュー用のSurfaceViewのSurfaceHolder.CallbackのsurfaceChanged()で</p>
<pre class="brush: java; title: ; notranslate">
// Camera  mCamera
Camera.Parameters cp = mCamera.getParameters();
mCamera.setParameters(cp);
String[] sizes = {
		&quot;176x144&quot;,
		&quot;240x160&quot;,
		&quot;320x240&quot;,
		&quot;480x320&quot;,
		&quot;640x480&quot;,
		&quot;800x480&quot;,
		&quot;854x480&quot;,
};
for (String size : sizes) {
	String[] s = size.split(&quot;x&quot;, 2);
	cp = mCamera.getParameters();
	cp.setPreviewSize(Integer.parseInt(s[0]), Integer.parseInt(s[1]));
	mCamera.setParameters(cp);
	cp = mCamera.getParameters();
	Camera.Size sz = cp.getPreviewSize();
	Log.v(&quot;&quot;, size + &quot; is &quot; + size.equals(sz.width + &quot;x&quot; + sz.height));  // OKならtrue ダメならfalse
}
</pre>
<p>こんなふうにしたらプレビューに設定してもよい値が取得できそうだ。<br />
サイズのリストは<a href="http://gitorious.org/replicant/msm7k/blobs/8d4e54bcf9c5ec671d03e4cf9386565acedf1d05/libcamera2/QualcommCameraHardware.cpp" target="_blank">ここ</a>にあった。これはG1用のソースかな。。たいていQualcomm製のチップだからいけるかな。</p>
<p>OS2.0以降と以前で処理を切り分けて値を取得する何かを仕込む作業をしないといけない・・。<br />
OS2.0以降でもアプリ開発のターゲットがOS1.5からだったとしたら、どっちみち<br />
<strong>Camera.Parameters.getSupportedPreviewSizes()</strong><br />
を使って設定可能の値リストを取得することができない。<br />
だからリフレクションしてメソッドを掘り出さなければいけない。<br />
そこのところの詳しいやり方は「羅針盤」や「PICTRHYTHM」などで有名なテックファームさんのブログ記事<br />
「<a href="http://labs.techfirm.co.jp/android/cho/1647" target="_blank">NexusOneでAPIDemos/CameraPreviewが落ちる件</a>」で取り上げられていた。この記事をありがたく参考にしてToyCamをアップデートしたい。トホホ。</p>
<div class="plus-one-wrap"><g:plusone size="medium" href="http://naskit.com/2010/04/08/xperia%e3%81%ae%e3%82%ab%e3%83%a1%e3%83%a9/"></g:plusone></div>]]></content:encoded>
			<wfw:commentRss>http://naskit.com/2010/04/08/xperia%e3%81%ae%e3%82%ab%e3%83%a1%e3%83%a9/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>【書籍】コードからわかる Androidプログラミングのしくみ</title>
		<link>http://naskit.com/2010/03/30/%e3%82%b3%e3%83%bc%e3%83%89%e3%81%8b%e3%82%89%e3%82%8f%e3%81%8b%e3%82%8b-android%e3%83%97%e3%83%ad%e3%82%b0%e3%83%a9%e3%83%9f%e3%83%b3%e3%82%b0%e3%81%ae%e3%81%97%e3%81%8f%e3%81%bf/</link>
		<comments>http://naskit.com/2010/03/30/%e3%82%b3%e3%83%bc%e3%83%89%e3%81%8b%e3%82%89%e3%82%8f%e3%81%8b%e3%82%8b-android%e3%83%97%e3%83%ad%e3%82%b0%e3%83%a9%e3%83%9f%e3%83%b3%e3%82%b0%e3%81%ae%e3%81%97%e3%81%8f%e3%81%bf/#comments</comments>
		<pubDate>Tue, 30 Mar 2010 14:21:24 +0000</pubDate>
		<dc:creator>saikoro</dc:creator>
				<category><![CDATA[Android]]></category>
		<category><![CDATA[プログラミング]]></category>

		<guid isPermaLink="false">http://naskit.com/?p=299</guid>
		<description><![CDATA[【書籍】<strong>コードからわかる Androidプログラミングのしくみ</strong>を購入した。]]></description>
			<content:encoded><![CDATA[<p>【書籍】<strong>コードからわかる Androidプログラミングのしくみ</strong><br />
を購入した。</p>
<p>サブタイトルは「開発で困ったときの解決アプローチ」である。<br />
<iframe src="http://rcm-jp.amazon.co.jp/e/cm?lt1=_blank&#038;bc1=000000&#038;IS2=1&#038;bg1=545454&#038;fc1=DDDDDD&#038;lc1=7AB8FF&#038;t=saikoblog-22&#038;o=9&#038;p=8&#038;l=as1&#038;m=amazon&#038;f=ifr&#038;md=1X69VDGQCMF7Z30FM082&#038;asins=4822284093" style="width:120px;height:240px;" scrolling="no" marginwidth="0" marginheight="0" frameborder="0"></iframe></p>
<p>原著があり、タイトルは「Unlocking Android A Developer&#8217;s Guide」というらしい。<br />
サンプルコードも<a href="http://manning.com/ableson/">原著のサイト</a>からダウンロードするようになっている。</p>
<p>内容は入門用というわけではなく、アプリを開発した経験がないと難しいかな。<br />
ページは索引も含めて464ページ。イラストは少なく、コードと解説がギッシリである。</p>
<p>Androidの概要・eclipseを使った開発環境・ユーザーインターフェース・IntentとService・データの永続化関連・ネットワーク関連・電話機能関連・通知関連・マルチメディア（内OpenGLESに10ページ）・GPSをしっかりと解説していて、そのあとサンプルアプリケーションの作成やネイティブアプリケーションのビルド方法（NDKが出る前のやり方）となっている。</p>
<p>そして、監修者付録として AppWidgetの作り方・AsyncTaskの解説・AndroidNDKの解説がある。</p>
<p>さらっと読んだだけだが濃いぃー内容だった。何度も読み返すことになりそうだ。</p>
<p>これまでAndroidの開発入門書を2冊読んだけど、まだまだ知らないことが沢山あるのだなと思った。<br />
入門書と日本語のWebの情報でもなんとかアプリは作れてしまうがアプリ開発者なら読んでおいて損はない。</p>
<div class="plus-one-wrap"><g:plusone size="medium" href="http://naskit.com/2010/03/30/%e3%82%b3%e3%83%bc%e3%83%89%e3%81%8b%e3%82%89%e3%82%8f%e3%81%8b%e3%82%8b-android%e3%83%97%e3%83%ad%e3%82%b0%e3%83%a9%e3%83%9f%e3%83%b3%e3%82%b0%e3%81%ae%e3%81%97%e3%81%8f%e3%81%bf/"></g:plusone></div>]]></content:encoded>
			<wfw:commentRss>http://naskit.com/2010/03/30/%e3%82%b3%e3%83%bc%e3%83%89%e3%81%8b%e3%82%89%e3%82%8f%e3%81%8b%e3%82%8b-android%e3%83%97%e3%83%ad%e3%82%b0%e3%83%a9%e3%83%9f%e3%83%b3%e3%82%b0%e3%81%ae%e3%81%97%e3%81%8f%e3%81%bf/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Androidで音声処理4</title>
		<link>http://naskit.com/2010/03/17/android%e3%81%a7%e9%9f%b3%e5%a3%b0%e5%87%a6%e7%90%864/</link>
		<comments>http://naskit.com/2010/03/17/android%e3%81%a7%e9%9f%b3%e5%a3%b0%e5%87%a6%e7%90%864/#comments</comments>
		<pubDate>Tue, 16 Mar 2010 17:35:44 +0000</pubDate>
		<dc:creator>saikoro</dc:creator>
				<category><![CDATA[Android]]></category>
		<category><![CDATA[HT-03A]]></category>
		<category><![CDATA[プログラミング]]></category>
		<category><![CDATA[Androboice]]></category>
		<category><![CDATA[WAV]]></category>

		<guid isPermaLink="false">http://naskit.com/?p=275</guid>
		<description><![CDATA[Androboiceってアプリ作ったときのメモ ピッチシフト編]]></description>
			<content:encoded><![CDATA[<p>ピッチシフトについてメモ</p>
<p>音声データを再生するときに早送りにしたり、ゆっくり再生すると声が高くなったり低くなったりする。<br />
再生するスピードを変えずに声の高さだけを変えることをピッチシフトと言うらしい。</p>
<p>やり方はいろいろあるようで、音声データを短い時間に区切って間引いたり、かさ増ししたりして音データをつなげなおすと音程が変わる方法や、フーリエ変換で音の周波数を求め、周波数を変更して逆フーリエ変換で戻してやる方法があるようだ。</p>
<p>Androboiceではとりあえず間引いたりかさ増しする方法で実現している。</p>
<p>音を1オクターブ高くするには周波数を2倍にすればよいらしい。だから短い時間に区切って音データを半分に間引いて、間引いたデータを区切ったデータの後ろにくっつけて長さを同じにする。それを全てのデータ分実行すると再生速度そのままで1オクターブ高い音が作れる。</p>
<pre class="brush: plain; title: ; notranslate">
0,1,2,3,4,5,6,7,8,9
を
0,2,4,6,8,0,2,4,6,8
にする
</pre>
<p>これで2倍の高さの音になる。</p>
<p>この「0,1,2,3,4,5,6,7,8,9」って音の幅はどれくらいかというと8000Hzで約33msec分で240サンプル分を間引き処理してつなげている。</p>
<pre class="brush: plain; title: ; notranslate">
0,1,2,3,4,5,6 .....237,238,239,    240,241,242,243, ... 7998,7999
これを
0,2,4,6, ... 236,238,0,2,4,6, ... 236,238,      240,242,244, ... 7996,7998
こんな具合で1秒間の処理おわり
</pre>
<p>238と240のつなぎ目は滑らかにならないので雑音のようになるのだが、なめらかにする処理は省略した。分からないので。</p>
<p>なぜ30msecで区切ることにしたのかというと、自分の声を録音して波形編集ソフトで変換してみて、大体30msecくらいならうまくいくかなーと思ったから。人の声は大体300Hzくらいなので1秒間に300回なんらかの波が繰り返されていることになる。んで30msecなら6回から10回くらい繰り返しているので、「これなら加工しやすいだろう」となんとなく感覚で決めた。</p>
<p>まあ、waveデータを加工して音作りをしている人にとっては大したことないのかもしれないが、良い勉強になった。</p>
<p>フーリエ変換バージョンもあるのだが、1秒の音を変換するのに9秒くらいかかってしまう。これではFFTとは言えないくらい遅い。<br />
floatの配列を使って演算しているのだが、これがボトルネックなのだろう。FixPointで計算するかJNIを使うしかないかもしれない。<br />
また勉強することが増えた。</p>
<div class="plus-one-wrap"><g:plusone size="medium" href="http://naskit.com/2010/03/17/android%e3%81%a7%e9%9f%b3%e5%a3%b0%e5%87%a6%e7%90%864/"></g:plusone></div>]]></content:encoded>
			<wfw:commentRss>http://naskit.com/2010/03/17/android%e3%81%a7%e9%9f%b3%e5%a3%b0%e5%87%a6%e7%90%864/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Androidで音声処理3</title>
		<link>http://naskit.com/2010/03/07/android%e3%81%a7%e9%9f%b3%e5%a3%b0%e5%87%a6%e7%90%863/</link>
		<comments>http://naskit.com/2010/03/07/android%e3%81%a7%e9%9f%b3%e5%a3%b0%e5%87%a6%e7%90%863/#comments</comments>
		<pubDate>Sat, 06 Mar 2010 22:51:04 +0000</pubDate>
		<dc:creator>saikoro</dc:creator>
				<category><![CDATA[Android]]></category>
		<category><![CDATA[HT-03A]]></category>
		<category><![CDATA[プログラミング]]></category>
		<category><![CDATA[Androboice]]></category>
		<category><![CDATA[WAV]]></category>

		<guid isPermaLink="false">http://naskit.com/?p=267</guid>
		<description><![CDATA[Androboiceってアプリを作ったときのメモ]]></description>
			<content:encoded><![CDATA[<h2>Androboiceってアプリを作ったときのメモ</h2>
<p><a class="wp-caption" href="http://naskit.com/2010/02/26/androidで音声処理2/" target="_self">前回</a>の続き。</p>
<p>で、AndroidでPCMデータの再生</p>
<p>AudioTrackクラスで前回rec.rawとして保存した生PCMデータを再生できる。以下コード</p>
<pre class="brush: java; title: ; notranslate">
// 各種例外処理は略
// サンプルレート 8kHz
int SAMPLE_RATE = 8000;
// オーディオトラック取得
audioTrack = new AudioTrack(AudioManager.STREAM_MUSIC,
		SAMPLE_RATE,
		AudioFormat.CHANNEL_CONFIGURATION_MONO,
		AudioFormat.ENCODING_PCM_16BIT,
		AudioTrack.getMinBufferSize(SAMPLE_RATE,
									AudioFormat.CHANNEL_CONFIGURATION_MONO,
									AudioFormat.ENCODING_PCM_16BIT) ,
		AudioTrack.MODE_STREAM);

// 録音したファイル取得
File recFile = new File(Environment.getExternalStorageDirectory().getAbsolutePath() + &quot;/rec.raw&quot;);
InputStream is = new FileInputStream(recFile);
// バイトデータの配列
long length = mOutFile.length();
byte[] byteData = new byte[(int)length];
// ファイルのデータを全て読み込み
int offset = 0, numRead = 0;
while (offset &lt; byteData.length
		&amp;&amp; (numRead = is.read(byteData, offset, byteData.length - offset)) &gt;= 0) {
	offset += numRead;
}
is.close();

// 出力
audioTrack.play();
audioTrack.write(byteData, 0, byteData.length);
</pre>
<p>コードは<a href="http://www.supergnes.com/blog/?p=70">ここ</a>を参考にした。<br />
これでスピーカーから音が出る。<br />
が、しかしDroidとかMilestoneとかG1とかで動かないらしい。<br />
AudioTrackが取得できない条件があるみたい。サンプルレートが問題なのだろうか。<br />
手元にないのでわからんが。。。2.0のエミュレータでは動くのだが・・・まいった;(</p>
<p>AudioTrackとAudioRecordクラスは指定したフレームごとにコールされるリスナを登録できるらしい。<br />
それを使えば録音・再生のシークバーとかを実装できるのかな。うまくいかないのだが・・。</p>
<p>なんにせよ情報が少なすぎる・・。Audioまわりを詳しくまとめた書籍があったら買うのだが。</p>
<div class="plus-one-wrap"><g:plusone size="medium" href="http://naskit.com/2010/03/07/android%e3%81%a7%e9%9f%b3%e5%a3%b0%e5%87%a6%e7%90%863/"></g:plusone></div>]]></content:encoded>
			<wfw:commentRss>http://naskit.com/2010/03/07/android%e3%81%a7%e9%9f%b3%e5%a3%b0%e5%87%a6%e7%90%863/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>Androidで音声処理2</title>
		<link>http://naskit.com/2010/02/26/android%e3%81%a7%e9%9f%b3%e5%a3%b0%e5%87%a6%e7%90%862/</link>
		<comments>http://naskit.com/2010/02/26/android%e3%81%a7%e9%9f%b3%e5%a3%b0%e5%87%a6%e7%90%862/#comments</comments>
		<pubDate>Thu, 25 Feb 2010 17:03:55 +0000</pubDate>
		<dc:creator>saikoro</dc:creator>
				<category><![CDATA[Android]]></category>
		<category><![CDATA[HT-03A]]></category>
		<category><![CDATA[プログラミング]]></category>
		<category><![CDATA[Andro]]></category>
		<category><![CDATA[Androboice]]></category>
		<category><![CDATA[RIFF]]></category>
		<category><![CDATA[WAV]]></category>

		<guid isPermaLink="false">http://naskit.com/?p=256</guid>
		<description><![CDATA[Androboiceってアプリを作ったときのメモ
AudioRecordでのwavファイルの録音]]></description>
			<content:encoded><![CDATA[<h2>Androboiceってアプリを作ったときのメモ</h2>
<p><a class="wp-caption" href="http://naskit.com/2010/02/24/android%E3%81%A7%E9%9F%B3%E5%A3%B0%E5%87%A6%E7%90%861/" target="_self">前回</a>の続き。</p>
<p>で、Androidでどうやって録音するか。</p>
<p>AudioRecordクラスでは前回の音データが取得できる。以下コード。</p>
<pre class="brush: java; title: ; notranslate">
// サンプルレート 8kHz
int SAMPLE_RATE = 8000;
// フラグ
isRecoding = true;
// プロセスの優先度を上げる
android.os.Process.setThreadPriority(
          android.os.Process.THREAD_PRIORITY_URGENT_AUDIO);
// バッファサイズを求める サンプルレート8kHz  モノラル 16ビット/サンプル
int audioBuf = AudioRecord.getMinBufferSize(SAMPLE_RATE,
                     AudioFormat.CHANNEL_CONFIGURATION_MONO,
                     AudioFormat.ENCODING_PCM_16BIT) * 2;
// レコーダの取得  サンプルレート8kHz  モノラル 16ビット/サンプル
AudioRecord audioRecord =  new AudioRecord(MediaRecorder.AudioSource.MIC,
                           SAMPLE_RATE,
                           AudioFormat.CHANNEL_CONFIGURATION_MONO,
                           AudioFormat.ENCODING_PCM_16BIT,
                           audioBuf);
// バッファ
byte[] buffer = new byte[audioBuf];
// 録音用ファイル取得  SDカード状態チェック略
File recFile = new File(Environment.getExternalStorageDirectory().getAbsolutePath() + &quot;/rec.raw&quot;);
recFile.createNewFile();
// ファイル書き込み  例外処理略
FileOutputStream out =  new FileOutputStream(recFile);
// 録音開始
audioRecord.startRecording();
// フラグが落ちるまでループ  例外処理略
while(isRecoding) {
	// バッファを読み込んで書き込む
	audioRecord.read(buffer, 0, audioBuf);
}
// 終了処理 例外処理略
audioRecord.stop();
out.close();
out = null;
</pre>
<p>実際はスレッドなんかで実行してフラグで録音ループを抜ける。これでSDカードにrec.rawってファイルができる。<br />
ファイルの中身はサンプルレート8000Hz、1サンプルあたり16ビット、モノラルのバイトデータ。ヘッダ情報のないWindowsのwavファイルのデータチャンクのところ。これにRIFFとかfmtチャンクを加えればwavファイルの出来上がり。<br />
逆に言うと、サンプルレート8000Hz、1サンプルあたり16ビット、モノラルのwavファイルの先頭からヘッダ情報の40バイトをちぎったのと同じデータなのだ。</p>
<p>んで、1サンプル16ビット＝2バイトずつデータが並んでいて、16ビットなので65536段階の強弱の信号が記録されている。<br />
16ビットでサンプルした場合は、符号付き(-32768 ～ +32767)であらわすらしい。 無音は 0。<br />
8ビットでサンプルした場合は、符号なし（0~ +255）無音は128であらわす。</p>
<p>8ビットの場合はそのままJavaのbyte型の変数の配列に1サンプルずつデータが入っているが、<br />
16ビットでサンプルした場合はエンディアンに気をつけないといけない。<br />
取得できるデータはwavファイルと同じリトルエンディアンであるらしく、前8ビットには下の桁、後ろ8ビットには上の桁（2進数的に）<br />
が収まっている。</p>
<pre class="brush: plain; title: ; notranslate">
byte[] buff = new buff[2];
リトルエンディアン 16bitの1
前8ビット    後ろ8ビット
00000001  00000000        // 2進数
0x0100                    // 16進数
buff[0]  == 0x01
buff[1]  == 0x00

リトルエンディアン 16bitの32767
11111111  01111111       //  2進数
0xFF7F                    // 16進数
buff[0]  == 0xFF
buff[1]  == 0xF7

リトルエンディアン 16bitの-32768
00000000 10000000        //  2進数
0x0080                     // 16進数
buff[0]  == 0x00
buff[1]  == 0x80
</pre>
<p>このようにバイナリエディタなんかでダンプしただけではパッと見て分かりにくいデータなのだ。<br />
これが分かるまで苦労した。バイナリデータは触ったことなかったし。<br />
Windowsの電卓ソフトの関数電卓モードを活用させてもらった。</p>
<p>んで、上のサンプルで保存したrec.rawファイルにヘッダをつけてwavファイルにする。以下コード</p>
<pre class="brush: java; title: ; notranslate">

// WAVヘッダをつけて保存
// 各種例外処理略 チェック処理略
public void addWavHeader() {
	// 録音したファイル
	File recFile = new File(Environment.getExternalStorageDirectory().getAbsolutePath() + &quot;/rec.raw&quot;);
	// WAVファイル
	File wavFile = new File(Environment.getExternalStorageDirectory().getAbsolutePath() + &quot;/rec.wav&quot;);
	// ストリーム
    FileInputStream in = new FileInputStream(recFile);
	FileOutputStream out = new FileOutputStream(wavFile);

	// ヘッダ作成  サンプルレート8kHz
	byte[] header = createHeader(8000, (int)recFile.length());
	// ヘッダの書き出し
	out.write(header);

	// 録音したファイルのバイトデータ読み込み
	int n = 0,offset = 0;
	byte[] buffer = new byte[(int)recFile.length()];
	while (offset &lt; buffer.length
			&amp;&amp; (n = in.read(buffer, offset, buffer.length - offset)) &gt;= 0) {
		offset += n;
	}
	// バイトデータ書き込み
	out.write(buffer);

	// 終了
	in.close();
	out.close();
}

// Wavファイルのヘッダを作成する（PCM16ビット モノラル）
// sampleRate  サンプルレート
// datasize データサイズ
// これなんかもっとキレイに書けると思うが 。。 Ringroidのソースなんかキレイかも
public static byte[] createHeader(int sampleRate, int datasize) {
	byte[] byteRIFF = {'R', 'I', 'F', 'F'};
	byte[] byteFilesizeSub8 = intToBytes((datasize + 36));	// ファイルサイズ-8バイト数
	byte[] byteWAVE = {'W', 'A', 'V', 'E'};
	byte[] byteFMT_ = {'f', 'm', 't', ' '};
	byte[] byte16bit = intToBytes(16);					// fmtチャンクのバイト数
	byte[] byteSamplerate = intToBytes(sampleRate);		// サンプルレート
	byte[] byteBytesPerSec = intToBytes(sampleRate * 2);	// バイト/秒 = サンプルレート x 1チャンネル x 2バイト
	byte[] bytePcmMono = {0x01, 0x00, 0x01, 0x00};		// フォーマットID 1 =リニアPCM  ,  チャンネル 1 = モノラル
	byte[] byteBlockBit = {0x02, 0x00, 0x10, 0x00};		// ブロックサイズ2バイト サンプルあたりのビット数16ビット
	byte[] byteDATA = {'d', 'a', 't', 'a'};
	byte[] byteDatasize = intToBytes(datasize);			// データサイズ

	ByteArrayOutputStream out = new ByteArrayOutputStream();
	try {
		out.write(byteRIFF);
		out.write(byteFilesizeSub8);
		out.write(byteWAVE);
		out.write(byteFMT_);
		out.write(byte16bit);
		out.write(bytePcmMono);
		out.write(byteSamplerate);
		out.write(byteBytesPerSec);
		out.write(byteBlockBit);
		out.write(byteDATA);
		out.write(byteDatasize);

	} catch (IOException e) {
		return out.toByteArray();
	}

	return out.toByteArray();
}
// int型32ビットデータをリトルエンディアンのバイト配列にする
public static byte[] intToBytes(int value) {
	byte[] bt = new byte[4];
	bt[0] = (byte)(value &amp; 0x000000ff);
	bt[1] = (byte)((value &amp; 0x0000ff00) &gt;&gt; 8);
	bt[2] = (byte)((value &amp; 0x00ff0000) &gt;&gt; 16);
	bt[3] = (byte)((value &amp; 0xff000000) &gt;&gt; 24);
	return bt;
}
</pre>
<p>これでSDカードにrec.wavってファイルができるはず。あとは標準の音楽ソフトかパソコンで再生すればOK牧場。<br />
WAVファイルを保存してゴニョゴニョできるソフトはそんなに多くないので、うまくやれば人気のアプリになりそう。<br />
3gppとちがって加工しやすいし。3gpのフォーマット読んだだけで心が折れそうになったし・・。</p>
<p>PCでWAVファイルとかゴニョゴニョしてた人たちには大したことないかもしれないが、苦労した。<br />
良い勉強になった。<br />
はて、次はAudioTrackで再生の予定。</p>
<div class="plus-one-wrap"><g:plusone size="medium" href="http://naskit.com/2010/02/26/android%e3%81%a7%e9%9f%b3%e5%a3%b0%e5%87%a6%e7%90%862/"></g:plusone></div>]]></content:encoded>
			<wfw:commentRss>http://naskit.com/2010/02/26/android%e3%81%a7%e9%9f%b3%e5%a3%b0%e5%87%a6%e7%90%862/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Androidで音声処理1</title>
		<link>http://naskit.com/2010/02/24/android%e3%81%a7%e9%9f%b3%e5%a3%b0%e5%87%a6%e7%90%861/</link>
		<comments>http://naskit.com/2010/02/24/android%e3%81%a7%e9%9f%b3%e5%a3%b0%e5%87%a6%e7%90%861/#comments</comments>
		<pubDate>Tue, 23 Feb 2010 19:16:56 +0000</pubDate>
		<dc:creator>saikoro</dc:creator>
				<category><![CDATA[Android]]></category>
		<category><![CDATA[HT-03A]]></category>
		<category><![CDATA[プログラミング]]></category>
		<category><![CDATA[Androboice]]></category>

		<guid isPermaLink="false">http://naskit.com/?p=238</guid>
		<description><![CDATA[Androboiceってアプリを作ったときのメモ]]></description>
			<content:encoded><![CDATA[<h2><strong>Androboice</strong>ってアプリを作ったときのメモ</h2>
<p>AndroidではAudioRecordとAudioTrackという方法でマイクの音を音データにしたり、音データをスピーカーに送ることができる。<br />
その前にまず、そもそも音データってなに？ってところから始まる。他のOSとかで音データを触ったことがないから。</p>
<p style="text-align: left;">音ってのは空気の振動で、コンピュータで音データを扱うということは空気の振動を0と1に置き換えること、0と1の信号を使って空気を振動させることになる。 私の理解では。<br />
<a href="http://naskit.com/wp-content/uploads/sound_mic.png"><img class="size-medium wp-image-240 aligncenter" title="sound_mic" src="http://naskit.com/wp-content/uploads/sound_mic-300x123.png" alt="" width="300" height="123" /></a></p>
<p style="text-align: left;">大きな音がマイクに入ると、大きな電流がコンピュータに流れ、小さな音だと小さな電流がコンピュータに流れる。</p>
<p style="text-align: left;">コンピュータは流れてきた電流を<span style="color: #ff00ff;">一定時間ごとに</span>データを記録していく。大・小・大・小・中・大・小・・・・などと。</p>
<p style="text-align: left;">実際には20,000 ・-20,000 ・ 200 ・100 ・ -100 ・・・・みたいな感じで。</p>
<p style="text-align: left;">記録した音データに何らかの処理をして、マイクの逆パターンでスピーカーに大・小・大・小・中・大・小・・・・と電流を送れば音が出る。</p>
<p style="text-align: left;">
<p style="text-align: left;">
<p style="text-align: left;">
<p style="text-align: left;">
<p style="text-align: left;">
<p style="text-align: left;">
<p style="text-align: left;"><strong>サンプリングレート</strong></p>
<p style="text-align: left;">一定時間ごとにマイクからの電流を計測して記録する（サンプリングする）けど、どれくらいの間隔で記録するかは『1秒間に何回記録するか「<strong>Hｚ　ヘルツ</strong>」』であらわす。</p>
<p style="text-align: left;">音楽CDだと1秒間に44,100回＝44100Hz。他にも22,050Hzとか16,000Hzとか11,025Hzとか8,000Hzとかがよく使われるみたい。実際の音波はもっと細かいけど連続毎秒44,100回記録しておけば、それ以上記録してても人間の耳には違いが分からないらしい。</p>
<p style="text-align: left;">
<p style="text-align: left;">
<p style="text-align: left;">
<h4>ビット/サンプル  BitPerSample</h4>
<p style="text-align: left;">マイクから流れてくる電流を記録するときどれくらいの細かさで記録するかは16ビットとか8ビットとかがよく使われるらしい。</p>
<p style="text-align: left;">それぞれ、65,535段階か256段階。16ビットとか8ビットはコンピュータでデータを扱いやすい。音楽CDは16ビットらしい。</p>
<p style="text-align: left;">
<p style="text-align: left;">だから、<strong>モノラル</strong>でサンプリングレート44100Hzで16Bit/Sampleで10秒間録音したら、データサイズは</p>
<p style="text-align: left;">1チャンネル x 44,100回 x 10秒 x 16Bit = 7,056,000Bit = 882キロバイトになると。</p>
<p style="text-align: left;">
<p style="text-align: left;"><strong>ステレオ</strong>でサンプリングレート44100Hzで16Bit/Sampleで80分間録音したら、データサイズは</p>
<p style="text-align: left;">2チャンネル x 44,100回 x 4,800秒 x 16Bit = 6,773,760,000Bit =846,720キロバイト(約800MB)になると。</p>
<p style="text-align: left;">80分のCD-Rの容量と大体あったので、こんな考えで間違ってはいないだろう。</p>
<p style="text-align: left;">
<p style="text-align: left;">これらのデータを切ったりつなげたりすれば、マイクからの音にエフェクトをかけられると思った。<strong><span style="color: #808080;"><a class="wp-caption" href="http://naskit.com/2010/02/26/android%E3%81%A7%E9%9F%B3%E5%A3%B0%E5%87%A6%E7%90%862/" target="_self">つづく</a></span></strong>。</p>
<p style="text-align: left;">
<div class="plus-one-wrap"><g:plusone size="medium" href="http://naskit.com/2010/02/24/android%e3%81%a7%e9%9f%b3%e5%a3%b0%e5%87%a6%e7%90%861/"></g:plusone></div>]]></content:encoded>
			<wfw:commentRss>http://naskit.com/2010/02/24/android%e3%81%a7%e9%9f%b3%e5%a3%b0%e5%87%a6%e7%90%861/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>デジタルシグナルプロセッシングとかマトリックスとかエンディアンとか</title>
		<link>http://naskit.com/2010/02/06/%e3%83%87%e3%82%b8%e3%82%bf%e3%83%ab%e3%82%b7%e3%82%b0%e3%83%8a%e3%83%ab%e3%83%97%e3%83%ad%e3%82%bb%e3%83%83%e3%82%b7%e3%83%b3%e3%82%b0%e3%81%a8%e3%81%8b/</link>
		<comments>http://naskit.com/2010/02/06/%e3%83%87%e3%82%b8%e3%82%bf%e3%83%ab%e3%82%b7%e3%82%b0%e3%83%8a%e3%83%ab%e3%83%97%e3%83%ad%e3%82%bb%e3%83%83%e3%82%b7%e3%83%b3%e3%82%b0%e3%81%a8%e3%81%8b/#comments</comments>
		<pubDate>Fri, 05 Feb 2010 18:54:12 +0000</pubDate>
		<dc:creator>saikoro</dc:creator>
				<category><![CDATA[Android]]></category>
		<category><![CDATA[プログラミング]]></category>
		<category><![CDATA[iPhone]]></category>
		<category><![CDATA[Ringroid]]></category>
		<category><![CDATA[SoundTouch]]></category>
		<category><![CDATA[ToyCam]]></category>

		<guid isPermaLink="false">http://naskit.com/?p=207</guid>
		<description><![CDATA[ToyCamをリリースして画像処理の面白さや可能性に気がついたのだが、画像処理とかって結局数学なのか！と思った。
デジタル信号処理とかいうのか、そんなサイトをググると見たこともない数式ばかり・・。]]></description>
			<content:encoded><![CDATA[<p>ToyCamをリリースして画像処理の面白さや可能性に気がついたのだが、画像処理とかって結局数学なのか！と思った。<br />
デジタル信号処理とかいうのか、そんなサイトをググると見たこともない数式ばかり・・。</p>
<p>画像にエフェクトをかけるには括弧のなかに数字がたくさん並んでいる<br />
<a href="http://naskit.com/wp-content/uploads/seikeidaisu.png"><img src="http://naskit.com/wp-content/uploads/seikeidaisu-300x177.png" alt="" title="seikeidaisu" width="180" class="size-medium wp-image-209" /></a><br />
こんな式とか出てくる。</p>
<p>ToyCamなんかはほとんどコピペみたいなものだから苦労はしなかったが、トイカメラ風のフィルタ処理を追加しようと気軽に考えていたのは間違いであった。改めて画像処理・音声処理・映像処理アプリはすごいと思ったのである。</p>
<p>オーディオにエフェクトをかけるのもフーリエ何とかで音データを解析したり加工したりするみたいだ。わけ分からん・・・。<br />
RingroidのソースコードやSoundTouchとかいうライブラリのソースコードも見てみたが、そもそもファイルフォーマットから勉強しないといけないと知った。</p>
<p>iPhoneではカメラアプリやオーディオ系のアプリが充実していてとても楽しそうだ。それに、画像や音は世界中の人にとってわかりやすいと思う。Android普及にはそんなアプリが増えることも重要だと思う。<br />
モテアプリっていうのかな？女の子に<br />
「みてこれ！スゴイっしょ！」<br />
って言えるアプリ。</p>
<p>DSPといえばメモリーとかと一緒に購入するWindowsを思い浮かべたり、マトリックスといえばキアヌリーブスのあの映画を思い浮かべたり、エンディアンのことをインディアンの仲間だと思っているようではいけない。<br />
基本的なところから勉強していかなければ・・・・と思った今日この頃。</p>
<div class="plus-one-wrap"><g:plusone size="medium" href="http://naskit.com/2010/02/06/%e3%83%87%e3%82%b8%e3%82%bf%e3%83%ab%e3%82%b7%e3%82%b0%e3%83%8a%e3%83%ab%e3%83%97%e3%83%ad%e3%82%bb%e3%83%83%e3%82%b7%e3%83%b3%e3%82%b0%e3%81%a8%e3%81%8b/"></g:plusone></div>]]></content:encoded>
			<wfw:commentRss>http://naskit.com/2010/02/06/%e3%83%87%e3%82%b8%e3%82%bf%e3%83%ab%e3%82%b7%e3%82%b0%e3%83%8a%e3%83%ab%e3%83%97%e3%83%ad%e3%82%bb%e3%83%83%e3%82%b7%e3%83%b3%e3%82%b0%e3%81%a8%e3%81%8b/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
	</channel>
</rss>

