サクサク読めて、アプリ限定の機能も多数!
トップへ戻る
Pixel 9
objective-audio.jp
iOS8からAVAudioEngineという新たなオーディオの機能がAVFoundationに追加されました。AVAudioEngineというのはAUGraphのObjective-C版のような感じのものです。オーディオのプレイヤーやエフェクトやミキサーなどがNodeと呼ばれる部品で用意されていて、それらを繋いで音を鳴らす事が出来ます。 AUGraphよりもかなり簡単に使えるようになっているのですが、その反面、AUGraphを使うときのように細かい設定が出来るわけではなかったり、AUGraphで出来た事が出来なかったりする部分もあるので、いままでAUGraphを使っていた人にとっては物足りないかもしれません。でも、そんなに複雑な事をやらないのであれば、簡単にエフェクトをかけられたりするので便利だと思います。 AVAudioEngineに関してはWWDC2014でも解説されていますので、ちゃ
iOS6からの機能なので今さら感がありますが、拙作のTouch the Waveでも導入したMulti Route Audioの使い方をまとめておこうと思います。 Multi Route Audioとは USBオーディオインターフェースやHDMIなどの外部出力を接続したときに、ヘッドホンへ別系統の音を出力できる機能です。外部出力2chとヘッドホン2chの計4ch出力する事が出来ます。残念ながらマルチイン・アウトが搭載されているオーディオインターフェースをマルチで使えるという機能ではなく、USBオーディオインターフェースはイン・アウト2chのみで、それとは別にヘッドホンにも別の音をだせるというだけの機能です。 ちなみにUSBオーディオインターフェースの繋げ方を知らない方に説明しておきますと、カメラコネクションキットまたはUSBカメラアダプタを使ってUSBオーディオインターフェースを接続すると
はじめに しばらく何も開発ネタを書いていなかったので、Unityを使って簡単なBigStopWatch風のストップウォッチをチュートリアル形式で作っていこうと思います。 Unityというと3Dが得意なのは間違いないですが、2Dものを作るときにもエディタ上で逐一確認しながら作れるので非常に便利です。このチュートリアルでは使いませんが、NGUIとかUni2Dとか他にもいろいろ2D用のアセットがAsset Storeにありますので工夫をすれば2Dゲームもちゃんと作れます。 本屋さんに行くとUnityの入門書がまた最近増えているのを見かけますが、だいたいどれも、無料のアセットを使ってゲームを作ろう的な内容だったりするので(当たり前ですが)ここでは違うアプローチで、外部アセットはいっさい使わず素材ゼロの状態から2Dツールアプリ作っていこうと思います。実際、BigStopWatchはアイコン以外のリソ
ディスパッチはいままでの並列処理の方法と比べるとシンプルで簡単だ、なんて書かれていたりしますけど、どうやらセマフォは欠かせないようで、ディスパッチにもあります。 とりあえずサンプルコードから。 #include <stdio.h> #include <unistd.h> #include <dispatch/dispatch.h> int main (int argc, const char * argv[]) { dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0); dispatch_group_t group = dispatch_group_create(); dispatch_semaphore_t semaphore = dispatch_semaphore_
前回紹介したdispatch_applyはブロックの処理が終わるまで待ってくれていましたが、dispatch_asyncは別スレッドで処理されてしまうので、どの順番で処理されるのかも分からない状態でブロックを処理させっぱなしになってしまいます。 グループというのを使えば、asyncで処理する複数のブロックをひとつのグループにまとめて、それらのブロック全部が終わったタイミングを受け取る事が出来ます。 まず、グループを作る関数がこれです。 dispatch_group_t dispatch_group_create(void); 次に、グループで処理させたいブロックを渡すのがdispatch_group_asyncです。グループはasyncオンリーでsyncはありません。 void dispatch_group_async(dispatch_group_t group, dispatch_qu
前回のコードのように同じ処理をforループでキューに渡すようなとき、それ専用の関数がディスパッチには既に用意されています。dispatch_applyです。 void dispatch_apply(size_t iterations, dispatch_queue_t queue, void (^block)(size_t)); iterationsの数だけブロックをキューに渡して処理させます。ブロックはsize_tの引数を一つだけ持ち、よくあるforループと同じように0から1ずつ増やした値が渡されます。 まずは、サンプルコードです。 #include <stdio.h> #include <dispatch/dispatch.h> int main (int argc, const char * argv[]) { dispatch_queue_t queue = dispatch_ge
いまさらながら、GCDのサンプルソースはMac Dev Centerにもいろいろありますので参考に。中でもDispatch_Samplesなんかはシンプルなサンプルがたくさん集まってますので、最初に見るには良いと思います。 今回からはディスパッチの中でもソースというものを見ていこうと思います。前回のエントリにキューとソースは別なんて一度書いてしまいましたが、間違いでソースでもキューは使います。 と書いてて、ディスパッチのソースと、ソースコードの区別がわけ分からなくなりそうなので、ディスパッチのソースは「ディスパッチソース」と呼ぶ事にします。 ディスパッチソースの種類にはいろいろありますが、基本的には、何かしら外部からイベントを受け取ったらキューにブロックを渡すというもののようです。以下のようなものがあります。 DISPATCH_SOURCE_TYPE_DATA_ADD: DISPATCH_
iOS6からAudioQueueServiceにProcessingTapという機能が追加されました。 これを利用すると、Queueにバッファされた後のデータにエフェクトなど処理を挟み込む事ができるようになります。AudioQueueのピッチ処理はiOSでは機能していないと思いますが、AudioUnitを挟み込む事もできるので、VarispeedとかNewTimePitchとか使えば実現する事ができます。 AudioQueueProcessingTapNew ProcessingTapをAudioQueueで使えるようにするのが以下の関数です。 extern OSStatus AudioQueueProcessingTapNew( AudioQueueRef inAQ, AudioQueueProcessingTapCallback inCallback, void *inClientDa
さらに今更ながら、ASCII.jpさんの「マルチコア時代の新機軸! Snow LeopardのGCD」に、わりと一般向けの説明から始まって、コードを使用したプログラマ向けの説明までしているページがありました。とりあえずここらへんで基本知識を得てから、いろいろ試した方が良かったのかもしれません。 その記事を見ていて改めて発見したのは、dispatch_get_main_queueで、メインスレッドで実行されるキューが取得できるという事です。なるほど、これがあればperformSelectorOnMainThreadを呼ばなくてもディスパッチで呼び出しが完結できます。前回のタイマーとかはメインキュー使う方が良い気がします。 でも、こういった解説記事の中でディスパッチソースにまで触れられているものってあんまり見かけないですね。ディスパッチさえあればアプリの基本的な仕組みが作れてしまうみたいな。と
さらに今更ながら、ASCII.jpさんの「マルチコア時代の新機軸! Snow LeopardのGCD」に、わりと一般向けの説明から始まって、コードを使用したプログラマ向けの説明までしているページがあ…
iOSDC JAPAN 2017の前夜祭で「Objective-C++を使ってMRCで快適に開発する」という発表をしてきました。 Objective-Cに関するCfpは少ないだろうから選ばれる可能性が高そうだったのと、マニアックな話題にすると前夜祭に選ばれて発表が終わった後にスッキリとした気持ちで本編を見ることができるだろうという見込みがピッタリはまって、前夜祭で発表することとなりました。 「すごく参考になりました!早速使ってみます!」みたいなコメントは僕の知る限りひとつもいただけなかったのですが(それは当然)、すでにObjective-C++を使っている方が少なからずいらっしゃるこ... read more iOS8からAVAudioEngineという新たなオーディオの機能がAVFoundationに追加されました。AVAudioEngineというのはAUGraphのObjective-
世の中iOS 5といったらiCloudだSiriだと騒いでいますが、オーディオの新機能も実は結構あります。とりあえずどんなものがあるかだけ書いておきます。 AudioUnitプラグイン AudioUnitのプラグインがかなり追加されてます。Macでは以前からあるもののサブセット的な感じです。 【Generator】 ・ScheduledSoundPlayer ・AudioFilePlayer 【MusicDevice】 ・Sampler 音を再生するものはGeneratorとMusicDeviceですね。特にSamplerはSoundFont&MIDI対応のプレイバックシンセなので、SoundFontを作ってしまえばMIDI対応も簡単にできてしまいます。「なんとかピアノ」とか「シンギングなんとか」とか、AVAudioPlayerで無理矢理つくるんじゃなくて、これ使った方が良いです。Audi
※この記事の内容は、iOS4.2以降では正常に動作しない可能性があります。 iPodライブラリからの書き出し、第二回です。 前回、MP3からAACへの書き出しができないと書きましたが、おそらくAVAssetExportSessionがサポートしているファイルタイプにMP3がないからと思われます。supportedFileTypesメソッドで取得できるAVAssetExportSessionがサポートしているとおぼしきファイルタイプは以下のようなものです。 "com.apple.quicktime-movie", "com.apple.m4a-audio", "public.mpeg-4", "com.apple.m4v-video", "public.3gpp", "org.3gpp.adaptive-multi-rate-audio", "com.microsoft.waveform-a
前回の続きというほどのものでもない内容になってしまいますが、CMSampleBufferからオーディオのデータを取り出す方法です。CMSampleBufferGetAudioBufferListWithRetainedBlockBufferという関数を使います。前回の内容も含めてDeveloper Forumsに書いてあったコードを参考に調べていたのですが、削るに削ってこれだけになりました。 CMSampleBufferRef sampleBuffer = [audioMixOutput copyNextSampleBuffer]; CMBlockBufferRef blockBuffer; AudioBufferList audioBufferList; CMSampleBufferGetAudioBufferListWithRetainedBlockBuffer(sampleBuffe
iOSの勉強会用にCoreMIDIを調べてみたりしたのはいいものの、まだ発表する機会がなさそうなのと、気がつけば3ヶ月もブログを更新していなかったので、ちょっと書いておこうかなと思います。とりあえずこのエントリは、CoreMIDI対応アプリを開発する前の準備の話です。(※2011/7/26に内容を変更しています) CoreMIDIはiPadだけ? iOS 4.3.3より前のOSだと、外部とMIDIデータの送受信をできるのはiPadだけだったのですが、iOS 4.3.3以降だとiPhoneでもWi-fi経由でiPadと同じく使えるようになったようです。また、iPadではMIDIインターフェースをCamera Connection Kitにつなげれば使えたのですが、最近YAMAHAなどからドックに直接つなげるタイプのMIDIインターフェースが発売されましたので、iPhoneでもそれらをつかえば
MIDIデータを送信する方法です。まず、MIDIPacketListの作り方を見てみます。 ひとつの普通のメッセージのMIDIPacketを含んだMIDIPacketListを作るだけであればMIDIPacketList構造体を作ってしまえばいいだけですが、複数のMIDIPacketを含んだMIDIPacketListを作りこんでいくには以下の関数を使います。 extern MIDIPacket * MIDIPacketListInit(MIDIPacketList *pktlist) extern MIDIPacket * MIDIPacketListAdd(MIDIPacketList * pktlist, ByteCount listSize, MIDIPacket * curPacket, MIDITimeStamp time, ByteCoun
Grand Central Dispatchについて日本語で丁寧に詳しく説明してくれるサイトはないかなぁと待っていたのですが、待っている間にひととおり自分なりに調べ終えてしまったので、まとめて書いておきます。まちがいに気がついたらご指摘いただけるとうれしいです。 Grand Central Dispatch(以下ディスパッチと書きます。リファレンスとか関数名とかGrand Centralって全然ついていなくてDispatchだけですし。)とはなんぞやというと、Snow Leopardから導入された並列処理のAPIです。並列処理といえばLeopardではNSOperationというObjective-CのAPIが導入されましたが、ディスパッチはC言語のAPIとして用意されていて、システムに近い低レベルなところで使えるものです。 あれこれ試した印象で言うと、コアが2つしかないCPUのMacでた
iOS4.0のAVAssetExportSessionでiPod Libraryからファイルの書き出しができるようになったことは以前のエントリーに書きましたが、さらにiOS4.1からは、AVAssetReaderによって事前にコピーすること無く、直接iPodLibraryのオーディオファイルのデータを生のデータで読み込むことが出来るようになっています。また、AVAssetWriterという、オーディオファイルを作ることの出来るクラスも追加されています。 AVAssetExportSessionがMP3などを読み込むのにかなり使い勝手の悪いものだったのですが、AVAssetReaderはExtAudioFile的に簡単に好きなフォーマットに変換していろんなファイルが読み込めるので、かなり良さげな感じです。 ちなみに、ここではオーディオファイルだけを扱いますが、ビデオの読み込みや書き出しも出来
iOS 4.0になってようやくiPodライブラリにある音楽を生のデータとして扱うことができるようになりましたので、その方法をまとめておきたいと思います。ムービーも同じような方法でできるようですが、とりあえずここではオーディオに限定して説明していきます。ちなみにシミュレータにはiPodライブラリがないので試せません。コードは実機で実行してください。 大まかな手順としては以下のような感じです。 ① MPMediaItemを取得 ② AVURLAssetを生成 ③ AVAssetExportSessionを生成 ④ Exportを実行 では、やっていきましょう。 ① MPMediaItemを取得 MPMediaItemは、iOS3.xのときからありましたのでご存知の方も多いと思いますが、iPodライブラリに中にあるひとつひとつの曲(音楽の場合)の情報をもっているクラスです。これの取得の仕方は、い
AVFoundationといえばOS3.xではAVAudioPlayerとAVAudioRecorderくらいだったのですが、iOS4.0から一気にいろんなものが増えてます。僕が以前予想していたように、オーディオだけじゃなくて映像関係も扱えるように進化していますね。なんかいろいろありすぎて、かつ自分がAudioUnitでやりたいことを置き換えるようなものじゃなさそうなので基本的にはスルーしているのですが、一番手軽で役に立ちそうだったけどちょっと使い方にハマったAVPlayerを取り上げたいと思います。 AVAudioPlayerはサウンドファイルを再生するだけでしたが、AVPlayerはサウンドもムービーも関係なくこれひとつで再生できます。サウンドはファイルパス渡してプレイってするだけでなんとなく鳴ってしまうのであえて説明する必要はないと思いますが、ちょっと使い方を知らないと厄介なのがムー
OpenGL ESのRetina対応の方法をちょっとメモしておきます。OpenGL以外のRetina対応については@k_katsumiさんの記事「アプリケーションを iPhone 4 の Retina Display に対応するための方法いろいろ」がとても参考になると思います。というか、この記事を見てOpenGLについては書いてなかったので触発されて書くことにしました。 Xcodeの「OpenGL ES Application」で作成したプロジェクトの場合で書きますと、EAGLViewのViewのサイズはRetinaディスプレイでも変わらず320×480です。iOS4からUIView(およびEAGLViewなどのサブクラス)にcontentScaleFactorというメソッドが追加され、この値を変更することでUIViewの中の解像度を変更することができるようになりました。もうひとつ、UIV
iOS4.0がリリースされましたので、個人的に気になった変更点などをまとめておきたいと思います。大々的に告知されていたような目玉機能の羅列ではなく、主にオーディオ周りで気になったところです。 バックグラウンドオーディオ これはiOS4.0のオーディオ系では一番の改良点と思われます。自分のアプリがバックグラウンドに入っても音を流し続けられることができます。対応しているのはたしかiPhone 3GSとiPod touch第3世代とiPhone 4あたりですね。マルチタスク非対応のデバイスでは残念ながら使うことはできません。 とりあえずバックグラウンドで流せればいいのであれば設定は簡単です。info.plistに「Required background modes」という項目を作って、そこで選べるモードの中から「App plays audio」を選択するだけです。これでバックグラウンドに入っても
Queueを作る ディスパッチの基本的な使い方は、処理したいコードをブロックや関数で用意しておいて、キューにそのブロックや関数を渡すという流れになります。 ディスパッチのキューには2種類あります。アプリ(OS?)に最初から一つ用意されているグローバルキューと、自分で作るキューです。グローバルキューは並列に処理できますが、自分で作るキュー(以後シリアルキューと書いて区別します)は入れていった順番に直列でしか処理できません。 キューはdispatch_queue_tという型のオブジェクトで表されます。ディスパッチのオブジェクトは他にもいくつかありますが、それは次回以降に後回しにします。 グローバルキューを取得するにはこの関数を使います。 dispatch_queue_t dispatch_get_global_queue(long priority, unsigned long flags);
MIDIデータを送信する方法です。まず、MIDIPacketListの作り方を見てみます。 ひとつの普通のメッセージのMIDIPacketを含んだMIDIPacketListを作るだけであればMIDI…
MacとかiPhoneとかあまり関係なく基礎を固めようと思っていろいろ勉強モードに入っていまして、すこしずつまとめていこうと思います。まずはフーリエ変換についてです。 あくまでプログラムで使う事を前提に書いていきますので、いろいろおかしかったりするかもしれませんがご了承ください。もし、明らかに変だったら突っ込んでいただけるとうれしいです。基本的に小難しそうな数式とかはできるだけ出さずにコード重視、ビジュアル重視で書いていくつもりです。 プログラミングでフーリエ変換というと、高速フーリエ変換(FFT)を使うという事になると思うのですが、FFTについては特に詳しく書きません。プログラム化されたコードを見た場合、FFTだと高速化されたアルゴリズムだけで本質的な部分がわからないので、高速化していないノーマルな離散フーリエ変換(DFT)のプログラムを見て、フーリエ変換の仕組みを調べていきます。 オー
ちょっと記事にするには乗り遅れた感がありますが、「iPhone Core Audio プログラミング」という、iPhoneのオーディオプログラミングに特化した本が発売されています。今はもうだいたいどこの本屋さんいっても置いてありますね。詳しい内容については筆者の永野さんのサイトのページ「iPhone Core Audioプログラミング」(書籍) 発売へ。 iPhoneのオーディオのAPIについては、これ一冊に日本語でほぼ全て書いてあります。日本語です!iPhone Dev Centerにも「Core Audio 概要」とか「Audio Session Programming Guide」とかの日本語訳はありますが、Apple純正という安心感はあるものの翻訳なので、ネイティブな日本人が書いた文章というのはやっぱり分かりやすいです。もう僕がiPhoneの開発ネタを書く事もないかなぁなんて思った
vDSPで高速フーリエ変換を行う関数の使い方です。 vDSP One-Dimensional Fast Fourier Transforms Referenceというリファレンスを見ると、一次元のフーリエ変換だけで30個ほどの関数が用意されています。 大きく分けてRealとComplexがあり、そのそれぞれがさらに、In-Place(変換前のバッファにそのまま上書き)かOut-of-Place(変換前と後で別々のバッファ)かで分かれています。さらに細かく見るとfloat用とdouble用とか、一度にたくさん処理するものとか、いろいろあります。 今回はIn-PlaceでComplexのfft_zip()を使ってみます。 ところで、このfft_zip()関数などは、リファレンスには関数名にvDSP_がついていますが、コード補完では引数付きの状態では出てこなくて、vDSP_がつかないfft_zi
Core MIDIではMIDIPacketというものがひとつのMIDIデータになります。そのMIDIPacketをMIDIPacketListに複数(あるいはひとつ)まとめて、MIDIエンドポイントを通してMIDIデータのやり取りをします。 MIDIPacketは構造体になっていて、以下のような感じで宣言されています。 struct MIDIPacket { MIDITimeStamp timeStamp; UInt16 length; Byte data[256]; }; typedef struct MIDIPacket MIDIPacket; timeStampは、0であれば受け取ったらすぐに処理をしろという事で、値が入ってれば処理すべきHosttimeという事のようです。lengthはdataのサイズです。dataはMIDIデータそのもの
Perfumeニューアルバム「トライアングル」発売記念エントリー! トライアングルと言えばOpenGLと無理矢理こじつけて、スタンフォード大学の講義でngmoco:)の中の人がOpenGLの高速化テクニックを語っていたので、その内容を自分なりにまとめてみました。 といっても、僕は講義のビデオを見ても英語で何を言ってるのか全然分からないので、あくまでpdfとコードを見て勝手に理解しているだけです。日本語の資料がほとんどないプログラミングの世界にもなれてきて、ソースさえあれば大体分かりますしね。 自分でプログラミングしていくうちに経験則で分かっていた事も含まれていましたが、やっぱりプロは徹底的にやっているなぁという感じがします。半年前に知っておけばBigStopWatchつくるのに役立ったのに...。 講義のpdfとサンプルソースは以下のところにありますので、参考にしてください。Appleのi
次のページ
このページを最初にブックマークしてみませんか?
『objective-audio | MacとiOSでオーディオプログラミング』の新着エントリーを見る
j次のブックマーク
k前のブックマーク
lあとで読む
eコメント一覧を開く
oページを開く