iPhoneアプリ開発と留学

iPhoneアプリケーションを開発しているエンジニア。 2010年7月からアメリカで技術経営を学ぶために留学中

2010年12月

[iPhone 開発][iPad 開発] UIPickerViewのサイズを変更する

UIPickerViewの縦のサイズはInterface Builderなどではかえられないのですが、以下の方法でかえられます。
- (void)loadView
{
	picker = [[UIPickerView alloc] initWithFrame:CGRectZero];
	picker.delegate = self;
	picker.dataSource = self;
	picker.showsSelectionIndicator = YES;

	CGAffineTransform t0 = CGAffineTransformMakeTranslation(picker.bounds.size.width/2, picker.bounds.size.height/2);
	CGAffineTransform s0 = CGAffineTransformMakeScale(0.5, 0.5);
	CGAffineTransform t1 = CGAffineTransformMakeTranslation(-picker.bounds.size.width/2, -picker.bounds.size.height/2);
	picker.transform = CGAffineTransformConcat(t0, CGAffineTransformConcat(s0, t1));

	self.view = [[UIView alloc] initWithFrame:CGRectZero];
	[self.view addSubview:picker];
}

引用元: UIPickerView (resizing): http://www.mlsite.net/blog/?p=221

[iPhone 開発][iPad 開発][UI] UIデザインに役立ちそうなサイト

- WEBデザイナー向け☆iPhoneアプリのUIデザイン

- iPhoneアプリ開発者のためのUIデザインソースとUI解説集 : AppBank に関連する記事一覧

- [UIデザイン] iPhoneの使い方に合わせた快適なUIデザイン

- [iPhone][UI] iPhoneアプリのUIデザインを色んなアプリで行うときのテンプレート

- iPhone 3G, 4, iPadアプリ制作にばっちりなUIデザインキット12個まとめ

- iPhoneアプリのUIデザイン

- iPhone App Design Trends

- iPhone Apps Design Mistakes: Over-Blown Visuals

[iPhone 開発][iPad 開発][OpenGL ES] OpenGL ES のリンク集

サンプルプログラムのaurioTouchを勉強していたら、openGLも勉強する必要があるので、リンク集を作った。

- iPhoneのOpenGL ES1.1をこれからはじめる時の資料

- GLUTによる「手抜き」OpenGL入門

- OpenGL入門

- iPhone で 3D CG! OpenGL ES を使ってみよう

- [OpenGL ES][iPhone] OpenGL ESについて

- OpenGL ES from the Ground Up: Table of Contents

- The Categorized OpenGL ES Tutorial Collection

- OpenGL ES 1.1 Reference Pages

- OpenGL ES 2.0 Reference Pages

[iPhone 開発][iPad 開発] aurioTouch サンプルプログラム解析 (5)

今回はフーリエ変換モードの解説です。
といってもちょいと複雑なのでだいぶ省略して大事な部分だけ述べます。

aurioTouchAppDelegate.mmの「drawBuffers」を見ると以下のように代入しています。

drawBuffers[0][y] = (interpVal * 120);

44.1kHz / 2 / 1024 = 21.5 kHz ごとにその周波数帯域の音の強さを入れています。
つまりdrawBuffers[0][1]には0~21.5kHz, drawBuffers[0][2]には21.5kHz~43kHzという風になります。
drawBuffers[0][y]の最大値は127なのでなぜ、120なのかはよくわかりませんが、そのままいきます。なお、音の強さと書きましたが、SpectrumAnalysis.cppの「 SpectrumAnalysisProcess(mSpectrumAnalysis, mAudioBuffer, outFFTData, true)」が呼び出される際に、dBの値で音の強さを取得しているのでdB表示となります。よって以下のようになります。(縦軸の最大値は調べるのに時間かかりそうなのでやめました。)

46
かなり省略してしまいました。最初はFFTなども詳しく解析しようかなと思ったのですが、費用対効果が少ないのでやめました。

次回はスペクトログラムモードの解説です。




[iPhone 開発][iPad 開発] aurioTouch サンプルプログラム解析 (4)

今回は取得した音入力のioDataをどのようにディスプレイ表示しているかを説明します。

- 波形モード(aurioTouchDisplayModeOscilloscopeWaveform)

前回の続きで、aurioTouchAppDelegate.mmの「PerformThru」から進めます。


if文で分岐(if (THIS->displayMode == aurioTouchDisplayModeOscilloscopeWaveform))しているのですが、重要な部分は以下にしめします。


		int i;

SInt8 *data_ptr = (SInt8 *)(ioData->mBuffers[0].mData);
for (i=0; i<inNumberFrames; i++)
{
if ((i+drawBufferIdx) >= drawBufferLen)
{
cycleOscilloscopeLines();
drawBufferIdx = -i;
}
drawBuffers[0][i + drawBufferIdx] = data_ptr[2];
data_ptr += 4;
}
drawBufferIdx += inNumberFrames;

まず、data_ptrはmBuffers[0].mDataへのポインタなのですが、図示すると以下のようになります。

58


1 フレーム(1サンプル)は4byteになるのですが、drawBuffersにdata_ptr[2]を代入しています。これはdata_ptr[1]に したり他の値を入れてみるとわかるのですが、4byteの3byte目だけを取得しています。10進数でたとえていうなら1234とあったら2とし、 5678なら6としています。大部分の音が3byte目以内に収まり、細かな値は計算を早くするため省略していると思われます。


次にdrawBuffersの定義は以下です。


// This determines how slowly the oscilloscope lines fade away from the display.
// Larger numbers = slower fade (and more strain on the graphics processing)
SInt8 *drawBuffers[kNumDrawBuffers];


その他関連しそうなところ

#define kNumDrawBuffers 12

int drawBufferLen = kDefaultDrawSamples;

#define kDefaultDrawSamples 1024

こ のdrawBuffersに入れられな値を見て、デゥスプレイ表示します。波形は濃い緑から薄い緑へとだんだんフェードバックしているのですが、これは drawBuffers[0]に濃いもの(新しいもの)、drawBuffers[11]に薄いもの(古いもの)を入れる事で対応しています。その[0] から[1]など値を入れ替えていく関数がcycleOscilloscopeLines()です。またまた図示すると以下になります。

46
描画でいきるデータはそろったのでいよいよディスプレイ出力の説明です。
少 々省きますが、EAGLView.mの「- (void)drawView」が呼ばれて、その後、aurioTouchAppDelegate.mmの「- (void)drawView:(id)sender forTime:(NSTimeInterval)time」、「drawOscilloscope」が呼ばれます。OpenGLの部分は省略し、以下に ポイントとなるコードを示します。

	int drawBuffer_i;
// Draw a line for each stored line in our buffer (the lines are stored and fade over time)
for (drawBuffer_i=0; drawBuffer_i<kNumDrawBuffers; drawBuffer_i++)
{
if (!drawBuffers[drawBuffer_i]) continue;

oscilLine_ptr = oscilLine;
drawBuffer_ptr = drawBuffers[drawBuffer_i];

GLfloat i;
// Fill our vertex array with points
for (i=0.; i<max; i=i+1.)
{
*oscilLine_ptr++ = i/max;
*oscilLine_ptr++ = (Float32)(*drawBuffer_ptr++) / 128.;
}

// If we're drawing the newest line, draw it in solid green. Otherwise, draw it in a faded green.
if (drawBuffer_i == 0)
glColor4f(0., 1., 0., 1.);
else
glColor4f(0., 1., 0., (.24 * (1. - ((GLfloat)drawBuffer_i / (GLfloat)kNumDrawBuffers))));

// Set up vertex pointer,
glVertexPointer(2, GL_FLOAT, 0, oscilLine);

// and draw the line.
glDrawArrays(GL_LINE_STRIP, 0, drawBufferLen);

}

oscilLine_ptrに音を表示するために、順々にx座標の値とy座標の値(音の強さ)を入れていっています。
そしてOpenGLのコードで順々に線をつないでいき波形としています。ディスプレイに縦軸と横軸の範囲などの表示はありませんが、わかりやすいように追記してみました。

52
以上で、波形モード終了です。次回はフーリエ変換モードの解説です。
といってもちょっとかわるだけです。












記事検索
<% for ( var i = 0; i < 7; i++ ) { %> <% } %>
<%= wdays[i] %>
<% for ( var i = 0; i < cal.length; i++ ) { %> <% for ( var j = 0; j < cal[i].length; j++) { %> <% } %> <% } %>
0) { %> id="calendar-291409-day-<%= cal[i][j]%>"<% } %>><%= cal[i][j] %>
yahoo
twitter
  • ライブドアブログ

'); label.html('\ ライブドアブログでは広告のパーソナライズや効果測定のためクッキー(cookie)を使用しています。
\ このバナーを閉じるか閲覧を継続することでクッキーの使用を承認いただいたものとさせていただきます。
\ また、お客様は当社パートナー企業における所定の手続きにより、クッキーの使用を管理することもできます。
\ 詳細はライブドア利用規約をご確認ください。\ '); banner.append(label); var closeButton = $('