プログラミング

前回記事を書いてからだいぶ時間が経ってしまって5月にエントリがひとつもないのもさみしいので、書きかけだった記事をアップしておきます。iPadから書き込んでみたいというのもあったので...。 最近はi…  
離散フーリエ変換の第2回目という事で、実際にどういうことをやっているのかをコードで見ていきたいと思います。前回のDFTのコードの変換を行っているところが以下の部分です。 // iは抜き出す周波数 f…  
MacとかiPhoneとかあまり関係なく基礎を固めようと思っていろいろ勉強モードに入っていまして、すこしずつまとめていこうと思います。まずはフーリエ変換についてです。 あくまでプログラムで使う事を前…  
ちょっと記事にするには乗り遅れた感がありますが、「iPhone Core Audio プログラミング」という、iPhoneのオーディオプログラミングに特化した本が発売されています。今はもうだいたいど…  
さらに今更ながら、ASCII.jpさんの「マルチコア時代の新機軸! Snow LeopardのGCD」に、わりと一般向けの説明から始まって、コードを使用したプログラマ向けの説明までしているページがあ…  
いまさらながら、GCDのサンプルソースはMac Dev Centerにもいろいろありますので参考に。中でもDispatch_Samplesなんかはシンプルなサンプルがたくさん集まってますので、最初に…  
ディスパッチまだまだ続きます。でも、処理の高速化ってことを考えると、GCDよりOpenCLのほうが効果的なんじゃないかって気がしてきました。まあ、Airでしか試してないからだと思いますけど。 ディス…  
Mac OS X 10.6 Snow Leopardから、AudioHardware〜とかAudioDevice〜とかAudioStream〜とかのGet・Set系がことごとくDEPRECATEDに…  
前回紹介したdispatch_applyはブロックの処理が終わるまで待ってくれていましたが、dispatch_asyncは別スレッドで処理されてしまうので、どの順番で処理されるのかも分からない状態で…  
前回のコードのように同じ処理をforループでキューに渡すようなとき、それ専用の関数がディスパッチには既に用意されています。dispatch_applyです。 void dispatch_apply(…  
Queueを作る ディスパッチの基本的な使い方は、処理したいコードをブロックや関数で用意しておいて、キューにそのブロックや関数を渡すという流れになります。 ディスパッチのキューには2種類あります。ア…  
Grand Central Dispatchについて日本語で丁寧に詳しく説明してくれるサイトはないかなぁと待っていたのですが、待っている間にひととおり自分なりに調べ終えてしまったので、まとめて書いて…  
今日アップルの日本語ドキュメント見たらOS3.0の新機能のものが追加されてました。前からあった2.X用のドキュメントも、そのうち3.0用に直される模様。 iPhone Dev Centerの日本語ド…  
Perfumeニューアルバム「トライアングル」発売記念エントリー! トライアングルと言えばOpenGLと無理矢理こじつけて、スタンフォード大学の講義でngmoco:)の中の人がOpenGLの高速化テ…  
OS3.0がでてからもう結構時間が経ってますが、オーディオ周りの挙動に変更があったところをまとめておきます。 ロック時に音が途切れない AudioUnitのRemoteIOを使っている場合、Audi…  
いままでiPhoneのAudioUnitはRemoteIOしか使っていなくて、新規アプリ開発に向けてMixerのUnitを使ってみようと思ったら、なかなかうまくいかなくてハマってしまったのでメモして…  

時差

iTunes Connect上でのリリース日を、アプリのアップデートが公開された日に設定すると、AppStore上のリリース日もアップデートされた日に更新されるというのは開発者のみなさんなら周知の事…  
今回は、iPhoneオーディオのIOバッファサイズについてです。とりあえず、前回までのコードに、以下のようなsetIOBufferSizeメソッドを追加して、initにその呼び出しを加えてください。…  
開発用のMacは初代MacBook Pro15インチ使ってたんですけど、毎日持ち歩いてるので、ずしりとくるこの重さに耐えきれずMacBook Airに変えました。鞄に何も入ってないんじゃないかって心…  
iPhoneのアプリでオーディオを再生・録音する場合に、iPodの音楽を鳴らしたままミックスして出したり、ロックした時にも音を出せるようにするには、AudioSessionSetProperty関数…  
以前、RemoteIOでのオーディオ再生というエントリでRemoteIOでオーディオ再生をする方法を書きましたが、それだけだとiPhoneのアプリとしては設定が不足です。オーディオを扱うアプリでは、…  
iPhoneでアラームとか通話とかが割り込んできてアプリのオーディオが停止してしまうときの通知を受け取るにはAudioSessionでInterruption Callbackを登録するって感じなの…  
OpenGL ESで文字列を表示しようと思ったのですが、OpenGL自体にそんな機能は無さそうなので、テクスチャに文字列を描画する方法を調べてみました。 テクスチャをCGContextから作って貼…  
Touch the Waveの波形表示が再生位置とちょっとずれていたので、修正したものをApp Storeに提出してあります。何も無ければ2〜3日後くらいには公開されるんじゃないでしょうか。 それ…  
iPhone OSが2.2にアップデートされまして、Frameworkに新しくAVFoundationなんてものが追加されていました。今のところAVAudioPlayerというAPIしか無いようで…  
iPhone用のアプリも公開できて一段落つきまして、さらにNDAも緩和されたという事で、iPhoneのオーディオプログラミングネタを書いていきたいと思います。 iPhoneで音を再生する方法はいく…  
iPodのクリックホイールのように、グルグルと円を描いて値を増減させる例です。NSViewのサブクラスで以下のような感じに。1周まわすと1.0増減します。 //// YKJogWheelView.h…  

for文の宣言

以前、Objective-Cのメソッド内で、 for (int i = 0; i みたいにfor文の中で宣言をするとエラーが出ていましたが、いつの間にか使えるようになってました。c99対応ってこと…  

24ビット

24bitのオーディオデータを作ったり読みこもうとしてもObjective-C(というかC言語)では24bitの型がありませんので、符号付き32bit整数の上位24bit分を使うというのが簡単な方法で…  
オシロスコープで表示できるようなリサージュ波形を描画するには、 x = sin(右チャンネルのオーディオデータ);y = sin(左チャンネルのオーディオデータ); という感じでサンプルごとに座標を求…  
Core Audio ClockをMTCのスレーブにした時、あるいはインターナルのソースをHostTimeにした時、Core Audio Clockの時間を基準にしてオーディオを再生しようとすると、オ…  
テンポラリのディレクトリの中のテンポラリのファイル名を取得するサンプル。 NSTemporaryDirectory()でテンポラリフォルダを取得。mkstempsでテンポラリファイル名が取得できるが、…  
前回のCore Audio Clock その2で、MTCを受信してCore Audio Clockをスレーブで動かすというのをやりましたが、シンクソースにMTCを設定するだけではクォーターフレームメッ…  
ステレオ素材をモノにする場合、ヒルベルト変換というもので片チャンの位相を90度ずらしてやるとバランスが崩れず良いらしいという事で、vDSPのFFTを使ってやってみました。 変換したいオーディオデータを…  
MIDIデータを送信する方法です。まず、MIDIPacketListの作り方を見てみます。 ひとつの普通のメッセージのMIDIPacketを含んだMIDIPacketListを作るだけであればMIDI…  
NSInvocationOperationとか使っていて、NSInvocationの作り方が良くわからなかったので、自分で作る方法を調べてみました。以下のコードがNSInvocationを使ってtes…  
Core MIDIではMIDIPacketというものがひとつのMIDIデータになります。そのMIDIPacketをMIDIPacketListに複数(あるいはひとつ)まとめて、MIDIエンドポイントを…  
Core MIDIに関してリアルタイムで調査中ですが、ちょこちょこと分かった事を書いて行こうと思います。ここのページにもいろいろと書いてありますので参考に。 まず用語解説的なところから始めまして、Co…  
Core Audio ClockをMTCのスレーブにするサンプルです。 あれこれMIDIの設定とかしなくちゃいけないのかと思っていたら、意外と簡単でした。MIDIClientとかPortとかつくらずに…  
オーディオとは直接関係ありませんが、CoreAnimationでCALayerを動かし続けたい時の方法です。プロパティ変更での暗黙的なアニメーションだといろいろと不都合なので、CABasicAnim…  
ちょっと最近Core Audio Clockの使い方を調べていたので、分かったところまでを書いておきます。たぶんオーディオデバイスとMIDIデータとの同期などに本来の威力を発揮するのでしょうが、MID…  
今回は、Audio File APIを使ったオーディオファイルの読み書きの方法を見て行きたいと思います。前回のExtendedAudioFileはフォーマットを指定すれば勝手に変換して読み書きしてくれ…  
Core AudioのAudioToolbox.Frameworkにはオーディオファイルの読み書きに2通り方法が用意されています。<AudioToolbox/AudioFile.h>での、…  
Core Audioのオーディオデバイスと入出力のデータをやり取りするには、入出力を行う関数を登録したあと、デバイスの動作を開始させます。入出力の関数の登録を行う関数は<CoreAudio/Au…  
オーディオデバイスの設定が外部から変更された時や、前回のようにオーディオデバイスの設定を変更し、その変更がちゃんと適用された後に処理を行いたい場合、プロパティが変更されたという通知を受け取るように設定…  
iPodとかQuickTimePlayerのような、再生する位置を表示・変更できるようなスライダーを使いたいと思って、NSSliderにジャカジャカ位置を送っていたら、うまいことクリックして変更できな…  
※2009/10/2追記《このエントリーはMac OS X 10.5での場合について書かれています。10.6以降の場合はこちらをご覧ください。》 今回はプロパティに値を設定してみたいと思います。 取…  
NSOperationってCoreAnimationみたいな派手な機能と違って、あまり解説されていない気がするので、使い方を書いておきます。オーディオのアプリケーションでも、読み込んだオーディオファイ…  
※2009/10/2追記《このエントリーはMac OS X 10.5での場合について書かれています。10.6以降の場合はこちらをご覧ください。》 今回は、Core Audioのデバイスなどから情報(…  
※2009/10/2追記《このエントリーはMac OS X 10.5での場合について書かれています。10.6以降の場合はこちらをご覧ください。》 前回の最後に、情報のやり取りをすると書いていましたが…  
Core Audioにおいて、オーディオデータの状態(リニアPCM等のフォーマットとか、ビットやサンプリングレートとか、チャンネル数とか)を表す構造体がAudioStreamBasicDescript…  
いままでvDSPやら何やらと、オーディオプログラミングでも補助的なものをネタにしていたので、ちょっとここらへんで基本に立ち返ってCore Audioの基本的な部分を書いていこうと思います。自分的にもち…  
たとえば、AudioUnitとかでコールバックをObjective-Cで記述する方法。 AudioUnitCallbackStructを以下のような感じで宣言して、inputProcRefConにはコ…  
オーディオファイルにエフェクトをバッチ処理でかけるような時に、AudioUnitを使って出来ないかと思ったのですが、そういう事ができそうなkAudioUnitType_OfflineEffectを取得…  
vDSPで高速フーリエ変換を行う関数の使い方です。 vDSP One-Dimensional Fast Fourier Transforms Referenceというリファレンスを見ると、一次元のフー…  
0.0 = -inf dB、1.0 = 0dBとした場合。 リニア値からdBへ変換するには、 dBVolume = 20.0*log10(linearVolume); dBからリニア値へ変換するには、…  

vDSPの基本

vDSPの基本的な使い方は、こちらを参考に。 Vectorizing with vDSP and vecLib (Forever For Now) 英文や数式が苦手な僕ですが、こうやってコードっぽく書…  
Panの設定値をL=0.0、R=1.0としたとき、Lchのボリュームはcos()に、Rchのボリュームはsin()にpan*π/2を渡す。 float lVolume = cos(pan*M_PI_2…  

biquad filter

Mac OS XのAccelerateフレームワークには、連続したデータの配列にデジタル信号処理をするときなどに便利な関数がいろいろ用意されています。Accelerateフレームワークを使えば1つの記…