iOS如何播放midi音符?

Posted

技术标签:

【中文标题】iOS如何播放midi音符?【英文标题】:iOS how to play midi notes? 【发布时间】:2015-05-29 04:10:20 【问题描述】:

我已经搜索并已经完成了一个可以播放 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没有清晰或深刻的了解...

更新:在添加outNode 时使用cd.componentSubType = kAudioUnitSubType_RemoteIO; 是正确的,并且可以成功播放柔和的MIDI 音符。

【问题讨论】:

这是一篇关于如何使用带有 MID MusicSequence 的 AUGraph 的博文。还有一个带有工作示例的 github 存储库。 rockhoppertech.com/blog/swift-augraph-and-musicsequence @GeneDeLisa 这是一个关于 AUGraph 的好教程,谢谢 【参考方案1】:

kAudioUnitSubType_GenericOutput 应该是 kAudioUnitSubType_RemoteIO 适用于 iOS。

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

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

【讨论】:

我已将 kAudioUnitSubType_GenericOutput 更改为 kAudioUnitSubType_RemoteIO 并测试正常【参考方案2】:

将 AVFoundation 和 AudioToolbox 框架链接到您的项目,然后使用以下代码:

#import <AVFoundation/AVFoundation.h>

NSURL *midiUrl = [[NSBundle mainBundle] URLForResource:@"even voor mij" withExtension:@"mid"];

MusicPlayer player = NULL;

NewMusicPlayer(&player);

MusicSequence sequence = NULL;

NewMusicSequence(&sequence);

MusicSequenceFileLoad(sequence, (__bridge CFURLRef)midiUrl, NULL, NULL);

MusicPlayerSetSequence(player, sequence);

MusicPlayerStart(player);

【讨论】:

你在这里尝试播放 MIDI 文件,这不是问题的答案:在 iOS 上播放 MIDI 音符。

以上是关于iOS如何播放midi音符?的主要内容,如果未能解决你的问题,请参考以下文章

如何播放具有确定持续时间的 MIDI 音符

iOS AUSampler 连续播放 MIDI 音符

如何在 Android 上播放非正弦音符?迷笛?

在 Java 中播放时将 midi 文件输出到控制台

C++ 中的 MIDI 音符消息

在播放时捕捉 MIDI 音符?