如何编辑 AUGraph 的默认工具?
Posted
技术标签:
【中文标题】如何编辑 AUGraph 的默认工具?【英文标题】:How to edit the default instrument of an AUGraph? 【发布时间】:2012-03-20 14:55:16 【问题描述】:我正在使用 MusicPlayer API。我了解当您将 .mid 作为序列加载时,API 会为您创建一个默认的 AUGraph,其中包括一个 AUSampler。这个 AUSampler 使用一个简单的基于正弦波的乐器来合成 .mid 中的音符
我的问题是,如何更改 AUSampler 中的默认仪器?我了解您可以使用 SoundFont2 文件 (.sf2) 并使用 AudioUnitSetProperty 方法添加它们。但是,如何访问这个默认的 AUGraph?是否必须先打开图表才能编辑 AudioUnit,还是打开图表仅用于编辑节点之间的连接?
谢谢:)
【问题讨论】:
【参考方案1】:我已经为此编写了一个教程,但 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;
然后您需要从资源文件夹中加载声音字体:
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];
希望这会有所帮助!
【讨论】:
【参考方案2】:您可以查看Audiograph 示例。它不使用 soundFonts,但应该让您了解如何设置图表。
当我使用 MusicPlayer 时,我总是从代码/GUI 生成 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);
【讨论】:
是的,这就是我最终所做的。但是,我没有编辑生成的现有 AUGraph,而是将其复制到一个新的中,并在放入之前编辑了 AUSampler 的属性。就像一个魅力:) 您是在使用(计划使用)声音样本还是 sf2/DLS 方法? 目前,我使用的是 SF2,但遇到了问题。该应用程序在模拟器上运行良好,但是当我尝试加载执行播放的视图时它崩溃了。我相信,从控制台看,它由于内存不足而崩溃。我认为问题在于我的 SF2 文件是 72MB。这对于 iPad 来说似乎太大了。你知道任何小型的SF2钢琴吗?还是有更好的解决方案? 是的,将它切换回基于正弦的轻量级音调发生器,它工作正常。所以,我需要一个更轻量级的解决方案…… 这里有大量不同质量的 sf2 文件:hammersound.net/cgi-bin/soundlink.pl - 我发现的一件好事是使用相同 sf2 的多个 AUSampler 使用相同的声音资源,因此内存得到了优化。一些 sf2 有很多听起来完全不同的预设,因此重复使用相同的 sf2 是一种选择,并且仍然有一系列乐器。以上是关于如何编辑 AUGraph 的默认工具?的主要内容,如果未能解决你的问题,请参考以下文章
如何编辑Microsoft Office Word 2003默认的Normal.dot模板文件