iOS 如何播放 midi 音符?

标签 ios core-audio midi audiounit audiotoolbox

我已经搜索过并且已经完成了一个可以播放 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);

我知道 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);

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

更新:使用 cd.componentSubType = kAudioUnitSubType_RemoteIO; 添加 outNode 时将正确并成功播放软 MIDI 音符。

最佳答案

kAudioUnitSubType_GenericOutput 应该是 kAudioUnitSubType_RemoteIO 适用于 iOS。

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

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

关于iOS 如何播放 midi 音符?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30520988/

相关文章:

java - 使用Java发送sysex消息

swift - 试图找到 Swift MIDI 回调解决方法

iphone - 在我的主 tableView 中添加 Facebook Like 按钮?

ios - SMS Message Composer 在联系人位置显示一个洞

ios - 为什么iOS GameCenter 多人实时匹配每次都创建新线程?

swift - 多个文件播放器上的 Core Audio 声音计量

ios - 有人可以告诉我Crashlytics Beta中可以存在的最大ipa版本数是多少。 Beta中可以存在多少天?

ios - 与 AudioUnit 一起播放声音文件

multithreading - 循环缓冲区的填充速度快于AVAudioSourceNode渲染 block 可以从中读取数据的速度

swift - 将 midi 弯音转换为 0 到 4 对数刻度