月別アーカイブ: 2008年6月

Core Audio Clock その4 スレーブ時の再生スピード調整

Core Audio ClockをMTCのスレーブにした時、あるいはインターナルのソースをHostTimeにした時、Core Audio Clockの時間を基準にしてオーディオを再生しようとすると、オーディオデバイスとスピードのずれが出てきますので、調整しなければいけません。 まず、オーディオの再生をしているときのIOProc内で、再生する頭のタイミングのHostTime(以下スタートホストタイム)と、HostTimeとオーディオデバイスのスピードの比率である「RateScalar」が取得できます。それと、MTCのスレーブにしているときはCoreAudioClockの「PlayRate」が、M... read more

テンポラリファイル名を取得する

テンポラリのディレクトリの中のテンポラリのファイル名を取得するサンプル。 NSTemporaryDirectory()でテンポラリフォルダを取得。mkstempsでテンポラリファイル名が取得できるが、一旦書き込み可能な文字列の配列にコピーしないといけない。NSStringのlengthでは日本語とか含まれている場合、取得した長さが配列の長さと違うので、strlenで配列の長さを取得してコピーする。 #import <Foundation/Foundation.h> int main (int argc, const char * argv[]) { &n... read more

Core Audio Clock その3 MTCスレーブ改

前回のCore Audio Clock その2で、MTCを受信してCore Audio Clockをスレーブで動かすというのをやりましたが、シンクソースにMTCを設定するだけではクォーターフレームメッセージしか受信してくれないので、フルタイムコードメッセージも受け取って再生時以外のタイムコードにも対応できるようにしてみたいと思います。 あれこれ試してみたところ、フルタイムコードをCore Audio Clockが勝手に解析してくれるような機能はないようなので、一旦フルタイムコードメッセージからタイムコードを抜き出してCore Audio ClockのCAClockSetCurrentTimeで... read more

Core MIDI その3 MIDIPacketListの送信

MIDIデータを送信する方法です。まず、MIDIPacketListの作り方を見てみます。 ひとつの普通のメッセージのMIDIPacketを含んだMIDIPacketListを作るだけであればMIDIPacketList構造体を作ってしまえばいいだけですが、複数のMIDIPacketを含んだMIDIPacketListを作りこんでいくには以下の関数を使います。 extern MIDIPacket * MIDIPacketListInit(MIDIPacketList *pktlist) extern MIDIPacket * MIDIPacketListAdd(MIDIPacketList... read more

NSInvocationの作成

NSInvocationOperationとか使っていて、NSInvocationの作り方が良くわからなかったので、自分で作る方法を調べてみました。以下のコードがNSInvocationを使ってtest:というメソッドを呼び出してみたものです。 #import <Cocoa/Cocoa.h> @interface InvocationTest : NSObject {     } @end @implementation InvocationTest - (void)awakeFromNib {     SEL sele... read more

Core MIDI その2 MIDIPacketの受信

Core MIDIではMIDIPacketというものがひとつのMIDIデータになります。そのMIDIPacketをMIDIPacketListに複数(あるいはひとつ)まとめて、MIDIエンドポイントを通してMIDIデータのやり取りをします。 MIDIPacketは構造体になっていて、以下のような感じで宣言されています。 struct MIDIPacket {     MIDITimeStamp   timeStamp;     UInt16          length... read more

Core MIDI その1 MIDIObject

Core MIDIに関してリアルタイムで調査中ですが、ちょこちょこと分かった事を書いて行こうと思います。ここのページにもいろいろと書いてありますので参考に。 まず用語解説的なところから始めまして、Core MIDIを使うときに必要なMIDIオブジェクトというものを見て行きます。MIDIオブジェクトは、 ・MIDIDevice ・MIDIEntity ・MIDIEndpoint ・MIDIClient ・MIDIPort という5つがあるのですが、上の3つは基本的にアプリケーション外部からCoreMIDI経由で取得するもの(MIDIEndpointは例外あり)で、下の2つのMIDIClie... read more

Core Audio Clock その2 MTCスレーブ

Core Audio ClockをMTCのスレーブにするサンプルです。 あれこれMIDIの設定とかしなくちゃいけないのかと思っていたら、意外と簡単でした。MIDIClientとかPortとかつくらずに、MIDIEndPointを直接渡してしまえばいいだけみたいです。 設定の順番としては、 ・CAClockを作成する ・SyncModeをMTCTransportにする ・SyncSourceにMTCが送られてくるMIDIEndPointを設定する ・タイムコードのフォーマットを送信側と合わせておく ・CAClockArmでMTCを受信できる状態にする ・同期する必要がなくなったらCAClock... read more

動き続けるCALayer

CoreAnimationでCALayerを動かし続けたい時の方法です。プロパティ変更での暗黙的なアニメーションだといろいろと不都合なので、CABasicAnimationを使ってやってみました。 以下がそのサンプルです。カスタムビューにアウトレットをつなげて実行してください。 // //  EndlessCoreAnimationTest.h // #import <Cocoa/Cocoa.h> #import <QuartzCore/QuartzCore.h> @interface E... read more