如何编辑 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 的默认工具?的主要内容,如果未能解决你的问题,请参考以下文章

获取 Mac Catalyst 中的默认文档编辑器工具栏

如何编辑Microsoft Office Word 2003默认的Normal.dot模板文件

Chrome Web Developer 工具,无法进行实时 CSS 编辑,重置为默认值

tso ispf“查看保存终止”如何更改默认

关于Linux中默认文本编辑工具vi/vim

百度编辑器(UEditor)自定义工具栏