我正在使用MusicPlayer API。据我所知,当您将.mid作为序列加载时,API会为您创建一个包含AUSampler的默认AUGraph。该AUSampler使用一个简单的基于正弦波的仪器来合成.mid
中的音符我的问题是,如何更改AUSampler中的默认乐器?我知道您可以使用SoundFont2文件(.sf2)并使用AudioUnitSetProperty方法添加它们。但是,如何访问此默认AUGraph?您是否必须先打开图表才能编辑AudioUnit,或者只打开图表来编辑节点之间的连接?
谢谢:)
答案 0 :(得分:4)
我已经写了一篇关于这个的教程,但here但是这里是一个过程的概述:
加载声音字体文件的功能(取自Apple文档):
-(OSStatus) loadFromDLSOrSoundFont: (NSURL *)bankURL withPatch: (int)presetNumber {
OSStatus result = noErr;
// fill out a bank preset data structure
AUSamplerBankPresetData bpdata;
bpdata.bankURL = (__bridge CFURLRef) bankURL;
bpdata.bankMSB = kAUSampler_DefaultMelodicBankMSB;
bpdata.bankLSB = kAUSampler_DefaultBankLSB;
bpdata.presetID = (UInt8) presetNumber;
// set the kAUSamplerProperty_LoadPresetFromBank property
result = AudioUnitSetProperty([pointer to your AUSampler node here],
kAUSamplerProperty_LoadPresetFromBank,
kAudioUnitScope_Global,
0,
&bpdata,
sizeof(bpdata));
// check for errors
NSCAssert (result == noErr,
@"Unable to set the preset property on the Sampler. Error code:%d '%.4s'",
(int) result,
(const char *)&result);
return result; }
然后你需要从Resources文件夹加载声音字体:
NSURL *presetURL = [[NSURL alloc] initFileURLWithPath:[[NSBundle mainBundle] pathForResource:@"Name of sound font" ofType:@"sf2"]];
// Initialise the sound font
[self loadFromDLSOrSoundFont: (NSURL *)presetURL withPatch: (int)10];
希望这有帮助!
答案 1 :(得分:0)
您可以查看Audiograph示例。它不使用soundFonts,但应该让您了解如何设置图表。
当我使用MusicPlayer时,我总是从代码/ GUI生成midi音符数据,并从头开始创建AUGraph(带调音台)。有一些方法可以派生/提取默认生成的AUGraph&加载midi文件得到的AUSampler(下面的示例代码),但我从未成功设置过这样的新声音。另一方面,从头开始创建AUGraph然后加载.sf2文件效果很好。
AUGraph graph;
result = MusicSequenceGetAUGraph (sequence, &graph);
MusicTrack firstTrack;
result = MusicSequenceGetIndTrack (sequence, 0, &firstTrack);
AUNode myNode;
result = MusicTrackGetDestNode(firstTrack,&myNode);
AudioUnit mySamplerUnit;
result = AUGraphNodeInfo(graph, myNode, 0, &mySamplerUnit);