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.componentType
和cd.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音符?的主要内容,如果未能解决你的问题,请参考以下文章