我正在使用MusicPlayer应用程序接口。我知道,当您将.mid作为序列加载时,API会为您创建一个包含AUSampler的默认AUGraph。此AUSampler使用一个简单的基于正弦波的仪器来合成.mid中的音符
我的问题是,如何更改AUSampler中的默认仪器?我知道您可以使用SoundFont2文件(.sf2)并使用AudioUnitSetProperty方法添加它们。但是,如何访问这个默认的AUGraph呢?您是必须先打开图形才能编辑AudioUnit,还是仅为了编辑节点之间的连接而打开图形?
谢谢:)
发布于 2012-03-21 10:37:22
您可以看看Audiograph示例。它不使用soundFonts,但应该可以让您了解如何设置图形。
当我使用MusicPlayer时,我总是从代码/图形用户界面生成midi音符数据,并从头开始创建AUGraph (使用混音器)。有一些方法可以派生/提取从加载midi文件(下面的示例代码)产生的默认生成的AUGraph & AUSampler,但我从未成功地以这种方式设置新的soundFont。另一方面,从头开始创建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);发布于 2012-03-23 05:18:12
我已经写了一个关于这方面的教程,但是here,下面是这个过程的概要:
加载Sound Font文件的函数(取自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文件夹中加载Sound Font:
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];希望这能有所帮助!
https://stackoverflow.com/questions/9789179
复制相似问题