【问题标题】:How to edit the default instrument of an AUGraph?如何编辑 AUGraph 的默认工具?
【发布时间】:2012-03-20 14:55:16
【问题描述】:

我正在使用 MusicPlayer API。我了解当您将 .mid 作为序列加载​​时,API 会为您创建一个默认的 AUGraph,其中包括一个 AUSampler。这个 AUSampler 使用一个简单的基于正弦波的乐器来合成 .mid 中的音符

我的问题是,如何更改 AUSampler 中的默认仪器?我了解您可以使用 SoundFont2 文件 (.sf2) 并使用 AudioUnitSetProperty 方法添加它们。但是,如何访问这个默认的 AUGraph?是否必须先打开图表才能编辑 AudioUnit,还是打开图表仅用于编辑节点之间的连接?

谢谢:)

【问题讨论】:

    标签: iphone c ios audio core-audio


    【解决方案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 是一种选择,并且仍然有一系列乐器。
      猜你喜欢
      • 1970-01-01
      • 2012-05-20
      • 1970-01-01
      • 1970-01-01
      • 2017-11-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多