iOS怎么玩midi笔记?

谢小进*_*谢小进 5 midi core-audio audiotoolbox audiounit ios

我已经搜索过并且已经完成了可以播放MIDI音符的OS X应用程序,但是当我在iOS中尝试时,什么都没发生.这是核心代码:

AUGraph graph;
AudioUnit synthUnit;
AUNode synthNode, outNode;

NewAUGraph(&graph);

AudioComponentDescription cd;
cd.componentManufacturer = kAudioUnitManufacturer_Apple;

cd.componentType = kAudioUnitType_MusicDevice;
cd.componentSubType = kAudioUnitSubType_MIDISynth;
AUGraphAddNode(graph, &cd, &synthNode);

cd.componentType = kAudioUnitType_Output;
cd.componentSubType = kAudioUnitSubType_GenericOutput;
AUGraphAddNode(graph, &cd, &outNode), "AUGraphAddNode");

CheckError(AUGraphOpen(graph), "AUGraphOpen");

AUGraphConnectNodeInput(graph, synthNode, 0, outNode, 0);

AUGraphNodeInfo(graph, synthNode, 0, &synthUnit);

AUGraphInitialize(graph);
CAShow(graph);

AUGraphStart(graph);

CFURLRef bankURL = ... //gs_instruments.dls
AudioUnitSetProperty(synthUnit,
                    kMusicDeviceProperty_SoundBankURL,
                    kAudioUnitScope_Global,
                    0,
                    &bankURL,
                    sizeof(bankURL));

static UInt32 kChannelMessage_NoteOn = 0x90;
UInt8 channel = 0;
UInt8 note = 60;
UInt32 velocity = 127;

MusicDeviceMIDIEvent(synthUnit,
                    kChannelMessage_NoteOn | channel,
                    note,
                    velocity,
                    0);

AUGraphStop(graph);
DisposeAUGraph(graph);
Run Code Online (Sandbox Code Playgroud)

我知道cd.componentTypecd.componentSubType设置可能不正确,因为iOS应用程序和OS X应用程序之间的区别就是它.在OS X中:

AudioComponentDescription cd;
cd.componentManufacturer = kAudioUnitManufacturer_Apple;

cd.componentType = kAudioUnitType_MusicDevice;
cd.componentSubType = kAudioUnitSubType_DLSSynth;
AUGraphAddNode(graph, &cd, &synthNode);

cd.componentType = kAudioUnitType_Output;
cd.componentSubType = kAudioUnitSubType_DefaultOutput;
AUGraphAddNode(graph, &cd, &outNode);
Run Code Online (Sandbox Code Playgroud)

如何cd在iOS中正确设置和播放MIDI音符?我没有明确或更深刻的了解Audio Unit/ AUGraph...

更新:使用cd.componentSubType = kAudioUnitSubType_RemoteIO;添加的时候outNode会是正确的,并成功地打软MIDI音符.

dav*_*234 2

对于 iOS,kAudioUnitSubType_GenericOutput 应为 kAudioUnitSubType_RemoteIO。

您需要让图形运行才能播放音频,因此不要立即调用 AUGraphStop() 和 DisposeAUGraph()。

为了测试图表,我将使用 kAudioUnitSubType_Sampler 而不是 kAudioUnitSubType_MIDISynth,因为如果您不设置它的预设,它有一个内置的波形发生器。然后当你让图表工作时,尝试你的合成器。