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
ざっと見て、 - MIDIServices.h で シーケンスを利用できる - AUGraph.h で フィルタを利用でき、Instrument(いわゆるソフトシンセ)とも連動できる と捉えてよいのだろうか?
■MusicEventType 〜 AUPresetEvent
/*!
@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;
ノート、チャンネル、テンポ、メタといったタイプがある。
/*!
@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トラックに設定(?)
/*!
@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ファイルに保存できない
/*!
@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 で大丈夫かと
/*!
@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 しかない。 新規作成ファイル時に、ファイルが存在したら消す
/*!
@typedef MusicTimeStamp
@abstract The type used to refer to time values in a music sequence
*/
typedef Float64 MusicTimeStamp;
シーケンス時のタイムスタンプで、時間指定の基本の型です。
/*!
@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)で、チャンネル、ノート、ベロシティ、リリースベロシティ、デュレーションがある。
/*!
@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、予約がある。
/*!
@struct MIDIRawData
@discussion Generally used to represent a MIDI SysEx message
*/
typedef struct MIDIRawData
{
UInt32 length;
UInt8 data[1];
} MIDIRawData;
MIDI生データで、エクスクルーシブメッセージとして利用
/*!
@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データの生の構造かと)
/*!
@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;
開発者が独自に定義できるユーザデータイベントパラメータ(構造体)
/*!
@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 を振り分けられる?
/*!
@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 のパラメータがよくわかっていないので、何とも・・・
これは、iPhone Core Audio の本を読み直しですね。。。 ■参考 スコープについて
/*!
@struct ExtendedTempoEvent
@discussion specifies the value for a tempo in beats per minute
*/
typedef struct ExtendedTempoEvent
{
Float64 bpm;
} ExtendedTempoEvent;
テンポイベント(30〜250くらい)で、bpm(Float64) が利用可能
/*!
@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 のパラメータがよくわからないので・・・ シーケンスするときにサンプル音と連動する。