MusicPlayer vol1 -概要・MusicPlayer.h-

2011/11/19

iOS5 から AudioToolbox に MusicPlayer が追加された。 ※間違いが含まれている場合があるので注意

/*!
    @header MusicPlayer.h
    
    @abstract   API for Music sequencing and playing services
    
    @discussion
        Basic idea behind the Sequencing Services APIs:

            A MusicSequence contains an arbitrary number of tracks (MusicTrack)
            each of which contains time-stamped (in units of beats) events in time-increasing order.  
            There are various types of events, defined below, including the expected MIDI events, tempo, 
            and extended events.
            
            A MusicTrack has properties which may be inspected and assigned, including support
            for looping, muting/soloing, and time-stamp interpretation. APIs exist for iterating through the 
            events in a MusicTrack, and for performing editing operations on them.
            
            A MusicPlayer is used to play a sequence and provides control of playback rate and
            setting to a particular time.
            
            Each MusicSequence may have an associated AUGraph object, which represents a set
            of AudioUnits and the connections between them.  Then, each MusicTrack of the
            MusicSequence may address its events to a specific AudioUnit within the AUGraph.
            In such a manner, it's possible to automate arbitrary parameters of AudioUnits,
            and schedule notes to be played to MusicDevices (AudioUnit software synthesizers)
            within an arbitrary audio processing network (AUGraph). A MusicSequence or its tracks
            can also address a MIDI endpoint directly.
        
        The objects defined in this header are:
            Music Sequence - container of music tracks
            Music Track - a time ordered list of events
            Music Track Iterator - an object to iterate over events in a track
            Music Player - an object used to play a sequence
*/

シーケンスと演奏サービスのAPI と思いっきり明記されています。 ビート単位に関するタイムスタンプで、任意のトラックで利用可能。 ループ、ミュート、ソロ、タイムスタンプ解像度(?)をサポート。 再生レートコントロール、特定の時間設定が可能。 シーケンサーは、AUGraph オブジェクトに関連しており、AudioUnitsと連携する。

シーケンストラックは、AUGraph を含む 特定の AudioUnit イベントを対処する。 これで、AudioUnits の任意パラメータを自動化することはできる。 ノートをスケジュールすることで、任意のオーディオプロセスを含む MusicDevices(AudioUnit ソフトシンセ)を再生する事ができる

MusicSequence もしくはトラックは、MIDIエンドポイントを直接対処することができる。 - Music Sequence - MusicTrackを含む - Music Track - イベントリストのオーダー時間 - Music Track Iterator - トラック内のイベントを Iterate するオブジェクト - Music Player - シーケンス再生で使われるオブジェクト

include

#include 
#include 
#include 
#include 
#include 

ざっと見て、 - MIDIServices.h で シーケンスを利用できる - AUGraph.h で フィルタを利用でき、Instrument(いわゆるソフトシンセ)とも連動できる と捉えてよいのだろうか?

■MusicEventType 〜 AUPresetEvent

MusicEventType

/*!
    @enum MusicEventType
    @abstract music event types, including both MIDI and "extended" protocol
    @constant kMusicEventType_NULL  
    @constant kMusicEventType_ExtendedNote      note with variable number of arguments (non-MIDI)
    @constant kMusicEventType_ExtendedTempo     tempo change in BPM
    @constant kMusicEventType_User              user defined data
    @constant kMusicEventType_Meta              standard MIDI file meta event
    @constant kMusicEventType_MIDINoteMessage       MIDI note-on with duration (for note-off)
    @constant kMusicEventType_MIDIChannelMessage    MIDI channel messages (other than note-on/off)
    @constant kMusicEventType_MIDIRawData           for MIDI system exclusive data
    @constant kMusicEventType_Parameter,        general purpose AudioUnit parameter, added in 10.2
    @constant kMusicEventType_AUPreset,         the AU's user preset CFDictionaryRef (the ClassInfo property), added 10.3
*/
enum
{
    kMusicEventType_NULL                    = 0,
    kMusicEventType_ExtendedNote            = 1,
    kMusicEventType_ExtendedTempo           = 3,
    kMusicEventType_User                    = 4,
    kMusicEventType_Meta                    = 5,
    kMusicEventType_MIDINoteMessage         = 6,
    kMusicEventType_MIDIChannelMessage      = 7,
    kMusicEventType_MIDIRawData             = 8,
    kMusicEventType_Parameter               = 9,
    kMusicEventType_AUPreset                = 10
};
typedef UInt32      MusicEventType;

ノート、チャンネル、テンポ、メタといったタイプがある。

MusicSequenceLoadFlags

/*!
    @enum MusicSequenceLoadFlags
    @abstract Flags used to customise loading behaviour
    @constant   kMusicSequenceLoadSMF_ChannelsToTracks
            If this flag is set the resultant Sequence will contain:
            a tempo track
            1 track for each MIDI Channel that is found in the SMF
            1 track for SysEx or MetaEvents - this will be the last track 
            in the sequence after the LoadSMFWithFlags calls
*/
enum
{
    kMusicSequenceLoadSMF_ChannelsToTracks  = (1 << 0)
};
typedef UInt32      MusicSequenceLoadFlags;

SMFファイル読み込み時のフラグ フラグがセットされていたら、テンポトラックを1トラックに設定(?)

MusicSequenceType

/*!
    @enum MusicSequenceType
    @abstract   A sequence type
    @discussion Different sequence types to describe the basic mode of operation of a sequence's time line
                You cannot change a music sequence's type to samples/seconds if there are tempo events
                The type will also define how the sequence is saved to a MIDI file:
                    Beats - normal midi file
                    Seconds - midi file with SMPTE time
                    Samples - cannot be saved to a midi file
    @constant   kMusicSequenceType_Beats
                    The default/normal type of a sequence.
                    Tempo track defines the number of beats per second and can have multiple tempo events
    @constant   kMusicSequenceType_Seconds
                    A music sequence with a single 60bpm tempo event
    @constant   kMusicSequenceType_Samples
                    A music sequence with a single tempo event that represents the audio sample rate
*/
enum {
    kMusicSequenceType_Beats        = 'beat',
    kMusicSequenceType_Seconds      = 'secs',
    kMusicSequenceType_Samples      = 'samp'
};
typedef UInt32      MusicSequenceType;

ミュージックシーケンスタイプ - Beats - 通常のMIDIファイル - Seconds - SMPTE の MIDIファイル - Samples - MIDIファイルに保存できない

MusicSequenceFileTypeID

/*!
    @enum MusicSequenceFileTypeID
    @abstract   describes different types of files that can be parsed by a music sequence
    @constant   kMusicSequenceFile_MIDIType
                    read and write MIDI files
    @constant   kMusicSequenceFile_iMelodyType
                    read iMelody files
*/
enum {
    kMusicSequenceFile_MIDIType         = 'midi',
    kMusicSequenceFile_iMelodyType      = 'imel'
};
typedef UInt32      MusicSequenceFileTypeID;

ミュージックシーケンスファイルタイプ - kMusicSequenceFile_MIDIType - MIDIファイル読み書き - kMusicSequenceFile_iMelodyType - iMelody ファイル読み書き

通常は、kMusicSequenceFile_MIDIType で大丈夫かと

MusicSequenceFileFlags

/*!
    @enum MusicSequenceFileFlags
    @abstract   controls the behaviour of the create file calls
    @constant   kMusicSequenceFileFlags_EraseFile
                    Erase an existing file when creating a new file
*/
enum {
    kMusicSequenceFileFlags_EraseFile = 1
};
typedef UInt32 MusicSequenceFileFlags;

現在、 kMusicSequenceFileFlags_EraseFile しかない。 新規作成ファイル時に、ファイルが存在したら消す

MusicTimeStamp

/*!
    @typedef    MusicTimeStamp
    @abstract   The type used to refer to time values in a music sequence
*/
typedef Float64     MusicTimeStamp;

シーケンス時のタイムスタンプで、時間指定の基本の型です。

MIDINoteMessage

/*!
    @struct     MIDINoteMessage
    @discussion The parameters to specify a MIDI note
*/
typedef struct MIDINoteMessage
{
    UInt8       channel;
    UInt8       note;
    UInt8       velocity;
    UInt8       releaseVelocity;    // was "reserved". 0 is the correct value when you don't know.
    Float32     duration;
} MIDINoteMessage;

MIDI ノートのパラメーター(UInt8)で、チャンネル、ノート、ベロシティ、リリースベロシティ、デュレーションがある。

MIDIChannelMessage

/*!
    @struct     MIDIChannelMessage
    @discussion The parameters to specify a MIDI channel message
*/
typedef struct MIDIChannelMessage
{
    UInt8       status;     // contains message and channel
    
    // message specific data
    UInt8       data1;      
    UInt8       data2;
    UInt8       reserved;
} MIDIChannelMessage;

MIDIチャンネルメッセージのパラメータ(UInt8)で、ステータス(メッセージとチャンネル)、データ1、データ2、予約がある。

MIDIRawData

/*!
    @struct     MIDIRawData
    @discussion Generally used to represent a MIDI SysEx message
*/
typedef struct MIDIRawData
{
    UInt32      length;
    UInt8       data[1];
} MIDIRawData;

MIDI生データで、エクスクルーシブメッセージとして利用

MIDIMetaEvent

/*!
    @struct     MIDIMetaEvent
    @discussion The parameters to specify a MIDI meta event
*/
typedef struct MIDIMetaEvent
{
    UInt8       metaEventType;
    UInt8       unused1;
    UInt8       unused2;
    UInt8       unused3;
    UInt32      dataLength;
    UInt8       data[1];
} MIDIMetaEvent;

MIDIメタデータ MIDIメタデータのパラメータは、metaEventType(UInt8)、未使用1〜3(UInt8)、データ長(UInt32)、データ[1](UInt8)がある。 (これはMIDIデータの生の構造かと)

MusicEventUserData

/*!
    @struct     MusicEventUserData
    @discussion Provides a general struct for specifying a user defined event. 
    @field      length
                    the size in bytes of the data
    @field      data
                    size bytes of user defined event data
*/
typedef struct MusicEventUserData
{
    UInt32      length;
    UInt8       data[1];
} MusicEventUserData;

開発者が独自に定義できるユーザデータイベントパラメータ(構造体)

ExtendedNoteOnEvent

/*!
    @struct     ExtendedNoteOnEvent
    @discussion The parameters to specify an extended note on event
*/
typedef struct ExtendedNoteOnEvent
{
    MusicDeviceInstrumentID     instrumentID;
    MusicDeviceGroupID          groupID;
    Float32                     duration;
    MusicDeviceNoteParams       extendedParams;
} ExtendedNoteOnEvent;

拡張用ノートイベントで音色ID、グループID、デュレーション、拡張パラメータ 拡張データの規格に対応していれば、利用できる? MusicDeviceInstrumentID 、MusicDeviceGroupID で MusicDevice を振り分けられる?

ParameterEvent

/*!
    @struct     ParameterEvent
    @discussion The parameters to specify a parameter event to an audio unit.
*/
typedef struct ParameterEvent
{
    AudioUnitParameterID        parameterID;
    AudioUnitScope              scope;
    AudioUnitElement            element;
    AudioUnitParameterValue     value;
} ParameterEvent;

AudioUnit 用の特殊イベントパラメータ(構造体) AudioUnit のパラメータがよくわかっていないので、何とも・・・

  • AudioUnitParameterID - filter cut-off frequency がある
  • AudioUnitScope - 0 〜 1024 の AudioUnit スコープ で、global, input, output がある
  • AudioUnitElement - スコープは1つ以上のメンバーを持ち、Elementによって関連づけられる。 input bus 1 は 入力スコープ
  • AudioUnitParameterValue - AudioUnit パラメータ値

これは、iPhone Core Audio の本を読み直しですね。。。 ■参考 スコープについて

ExtendedTempoEvent

/*!
    @struct     ExtendedTempoEvent
    @discussion specifies the value for a tempo in beats per minute
*/
typedef struct ExtendedTempoEvent
{
    Float64     bpm;
} ExtendedTempoEvent;

テンポイベント(30〜250くらい)で、bpm(Float64) が利用可能

AUPresetEvent

/*!
    @struct     AUPresetEvent
    @discussion The parameters to specify a preset for an audio unit.
*/
typedef struct AUPresetEvent
{
    AudioUnitScope              scope;
    AudioUnitElement            element;
    CFPropertyListRef           preset;
} AUPresetEvent;

AudioUnit用の、特殊プリセットパラメータ(構造体)

これも、AudioUnit のパラメータがよくわからないので・・・ シーケンスするときにサンプル音と連動する。