2015-05-29 190 views
3

我已經搜索並已經完成了可以播放MIDI音符的OS X應用程序,但是當我在iOS中嘗試時,沒有任何事情發生。這裏是核心代碼:iOS如何播放midi音符?

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); 

如何設置cd和iOS的正常播放MIDI音符?我沒有明確或Audio Unit/AUGraph更深刻的瞭解...

更新:使用cd.componentSubType = kAudioUnitSubType_RemoteIO;當添加outNode將是正確的和打軟MIDI成功地指出。

+0

這是一篇關於如何在MID MusicSequence中使用AUGraph的博客文章。還有一個github回購與一個工作的例子。 http://www.rockhoppertech.com/blog/swift-augraph-and-musicsequence/ –

+1

@GeneDeLisa這是一個關於AUGraph的好教程,謝謝 –

回答

2

kAudioUnitSubType_GenericOutput應該kAudioUnitSubType_RemoteIO 爲iOS。

您需要讓圖表運行以播放音頻,因此不要立即調用AUGraphStop()和DisposeAUGraph()。

爲了測試圖形,我會使用kAudioUnitSubType_Sampler而不是kAudioUnitSubType_MIDISynth,因爲如果您沒有設置它的預設,它會有一個內置的波形發生器。然後,當你得到圖表的工作,試試你的合成器。

+0

我已將kAudioUnitSubType_GenericOutput更改爲kAudioUnitSubType_RemoteIO並測試OK –

0

鏈接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); 
+1

你在這裏試圖播放一個MIDI文件,這不是答案問題:只在iOS上播放MIDI音符。 –