如何修改AUGraph的默认乐器?

时间:2012-03-20 14:55:17

标签: iphone c ios audio core-audio

我正在使用MusicPlayer API。据我所知,当您将.mid作为序列加载​​时,API会为您创建一个包含AUSampler的默认AUGraph。该AUSampler使用一个简单的基于正弦波的仪器来合成.mid

中的音符

我的问题是,如何更改AUSampler中的默认乐器?我知道您可以使用SoundFont2文件(.sf2)并使用AudioUnitSetProperty方法添加它们。但是,如何访问此默认AUGraph?您是否必须先打开图表才能编辑AudioUnit,或者只打开图表来编辑节点之间的连接?

谢谢:)

2 个答案:

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