2010年11月19日金曜日

ProcessingでAndroidアプリ開発

最近Processingにハマっている。

ProcessingはMITメディアラボで開発されたプログラミング言語。
メディアアートやインフォデザインなんかによく使われているらしい。

画像やインタラクションに強いため「動くモノ」、「触れるモノ」を簡単に作れるので触っててすごく楽しい。


そんなProcessingでAndroidアプリを作る方法を発見した。

…が、上記サイトの通りやってもうまく行かなかったので解決方法についてメモ。

とりあえずサイトの通りの手順だと

1.AndroidSDKをインスコ
2.Android互換バージョンのProcessingをココからゲッツ。解凍する。
3.Processingを立ち上げ、コーディング
4.コーディングし終わったら動作テスト
5.メニューバーの中にあるAndroid>Android Mode(もしくはCtrl+D)を選択。ファイルダイアログが出てくるのでAndroidSDKが保存してあるフォルダを選択する。

…ここで問題が発生した。
「Android core.zipがダウンロード出来ない」というエラーメッセージが出てきてうまくいかない。

ちょっと調べたところ、ココからファイルをダウンロードする部分がうまく動いていない様子。
上記ファイルを直接ダウンロード→Sketchフォルダに保存するとうまくいった。


…が、いざ実機にインストール、と思ったら自分が使っている端末のOSのバージョンがAndroid1.6で対応していなかった orz(エミュレータではキチンと動作しました)


まぁそれはいずれNexus Sを買ったときにでも(いつになることやら…)。


冒頭にも書きましたが、Processingはビジュアルやインタラクションに強く図形の描画、マウス、キー入力の取得が容易にできるプログラミング言語。
ということで、ゲームやデザイン系アプリのちょっとしたプロトタイプ開発に向いているんじゃないかな、と思います。

2010年10月23日土曜日

HT 03-Aの加速度センサ

HT 03-Aでプログラミングしていたときのこと。
EclipseのAndroid LogCat中に下記のような記述を発見。


10-23 14:55:42.172: DEBUG/SensorManager(4725): found sensor: AK8976A 3-axis Accelerometer, handle=0


"AK8976A"
「これはもしや、加速度センサの型番では?」
と思い、ググってみたら正解だったようで、旭化成の3軸加速度、電子コンパスICがヒットした。
データシートによるとサンプリング間隔は10~15msらしい。
つまり、SENSOR_DELAY_FASTESTで計測しても上記のサンプリング間隔より早く計測することは出来ない、ということ。

加速度センサ使ってアプリ作る人はこの点、ちょっと気を付けておいた方がいいかもです。

2010年10月12日火曜日

OEDEC2007の資料がかなり良さげ

音声処理について調べてる途中で、OEDEC2007のセッション資料を発見したのでメモ。
これが中々良さげ(以前Blogに掲載したAMDFの分かりやすい説明なんかも載っていた)。

音声処理以外にも映像やらデータ圧縮技術なんかについても掲載されているので非常に興味深い。
時間が出来たらじっくり読んどこう。

2010年10月4日月曜日

PythonWebめぐり

ウェーブレット変換の勉強中。
Web巡回して資料を探している最中にPythonでオシロ作ってるプロジェクトを発見した(一番上のヤツ)。

これは凄い…。
PyQtとかいうGUIモジュール使って作ってるらしい。

リッチなGUIをPythonで作りたいと思ってたからちょっと勉強してみたい。
これを参考にして今まで作ってきたアプリをゴージャス(爆)に改良することを目標にやってみるか。
ちょっと調べてみた感じここら辺が勉強用に丁度よさそう。

#肝心のウェーブレット変換も同じページに載ってたのでいじくってみよう。

2010年9月26日日曜日

Pythonで少数を分数に変換する関数作った

前の記事で書いたwavファイルの速度調整用にスクリプト書いたので載せておく。

少数を分数に変換するための関数。


def Euclidean(m,n):
if m < n:
m,n = n,m
if n == 0:
return m
elif m % n == 0:
return n
else:return Euclidean(n,m%n)

def deciToFrac(deci):
i = 0
while deci % 1 != 0:
deci = deci * 10
i += 1

numer,denomi = int(deci),int(10 ** i)

gcd = Euclidean(numer,denomi)

return numer / gcd,denomi / gcd



下の関数に少数を渡すと通分された分数に変換し、分子と分母を返す。
上の関数はユークリッドの互除法。
これを使って分子、分母を通分している。


使用結果はこんな感じ。



>>> deciToFrac(2.6)
(13, 5)
>>> deciToFrac(1.2)
(6, 5)

PyAudioで早送り再生とかディレイとか

PyAudioでwavファイルを早送り再生したりディレイで再生したりしてみた。

早送りやディレイは音楽の波形データを時間軸上で伸縮させることにより実現できる。
縮ませると早く、引き伸ばすとゆっくり再生できる。

すでに音楽データを数値の配列として扱うことが出来ているわけだから、データ間を補間したり逆にデータを間引くことによりこれらを実現することができる。

試しにコーディングしてみた。


def delay(inp,rate):
outp = []

for i in range(len(inp)):
for j in range(rate):
outp.append(inp[i])

return array(outp)

def fast(inp,rate):
outp = []

for i in range(len(inp) / rate):
outp.append(inp[i * rate])

return array(outp)



引数rateは何倍に遅くしたい(or早くしたい)かを決定するためのもの。

そのまま使うと整数倍でしか再生スピードを調整できないけど、二つを組み合わせると自在に変更可能(1.1倍再生ならfast(data,11)とdelay(data,10)の組み合わせ、とか)。

簡単なコードだけど試してみたら結構面白かった。
是非お試しあれ。

※追記:上の二つの関数を再生スピード変更関数として一元化、PyAudioでwav再生するプログラムを作ってみた。


from scipy import *
import pyaudio
import wave
import sys

def changePlaySpeed(inp,rate):
outp = []
for i in range(int(len(inp) / rate)):
outp.append(inp[int(i * float(rate))])
return array(outp)

chunk = 1024

wf = wave.open("hoge.wav", 'rb')

p = pyaudio.PyAudio()

# open stream
stream = p.open(format =
p.get_format_from_width(wf.getsampwidth()),
channels = wf.getnchannels(),
rate = wf.getframerate(),
output = True)

# read data
data = wf.readframes(chunk)

# play stream
while data != '':
stream.write(data)
data = wf.readframes(chunk)
data = frombuffer(data,dtype = "int16")
if data != '':
data = changePlaySpeed(data,1.8)
data = int16(data).tostring()


stream.close()
p.terminate()



changePlaySpeed()の2番目の引数で再生スピードを変更できます(2.0だったら2倍速、0.5だったら半分のスピード)。

ゆっくり再生すると変な音が混ざった感じに聞こえる。
あまりイクナイ。

再生している音源が悪いのかしら?
データの補完方法に問題があるような気もするなぁ。

とりあえず試してみました、くらいの感覚で。

2010年9月24日金曜日

グラフの対数表示とか研究室のイベントとか

今日は所属研究室の初回ゼミ&歓迎会でした。

ということで酔ってます。

今日の更新はいつにも増して内容が薄いです。

周波数特性グラフをデシベル表示にしてみました、というだけ。


こんな感じ。





前の記事に掲載した内容とほぼ変わらす。


変更点は各周波数に対するゲインを求める式を以下のように変えたのみ。



>>> 20 * log10(f[i] / fmax)



最近リアルタイム音声処理の本とか読み始めたのでそちらについても書きたいなー。