Music TrackSetDestNode 重置旧音乐曲目的采样器声音

Posted

技术标签:

【中文标题】Music TrackSetDestNode 重置旧音乐曲目的采样器声音【英文标题】:MusicTrackSetDestNode Reseting sound of sampler for old Musictracks 【发布时间】:2015-06-23 08:27:57 【问题描述】:

我正在制作一个音乐应用程序,您可以在其中向现有音序器添加新乐器。这些乐器是存储在数组中的单独的 AudioUnitSampler,因此当加载新乐器和音轨时,它会加载该音轨将要使用的声音。

这就是我目前向 AUGraph 添加轨道的方式。

// Return count as an id for the new track
- (int) addMusicTrack: (MusicTrack)musicTrack withNode:(AUNode)newSamplerNode withAudioUnit:(AudioUnit)newSamplerUnit 

    tracksCount++;
    int trackId = tracksCount;

    MusicPlayerStop(_musicPlayer);
    status = MusicSequenceNewTrack(sequence, &tracks[trackId]);
    MusicSequenceSetAUGraph(sequence, graph);

    if(status)
        printf("Error adding main track: %d", (int)status);
        status = 0;
    

    timeDiff = 32.f/_tempo;

    [self setLoopDuration:DEFAULT_LOOP_DURATION forTrack:trackId];
    currentOctaveNumber = 59;

    AudioComponentDescription samplerNodeDesc;
    samplerNodeDesc.componentManufacturer = (OSType)kAudioUnitManufacturer_Apple;
    samplerNodeDesc.componentType = (OSType)kAudioUnitType_MusicDevice;
    samplerNodeDesc.componentSubType = (OSType)kAudioUnitSubType_Sampler;
    samplerNodeDesc.componentFlags = 0;
    samplerNodeDesc.componentFlagsMask = 0;
    status = AUGraphAddNode(graph, &samplerNodeDesc, &auSampleNodes[trackId]);

    AudioComponentDescription splitterNodeDesc;
    splitterNodeDesc.componentManufacturer = (OSType)kAudioUnitManufacturer_Apple;
    splitterNodeDesc.componentType = (OSType)kAudioUnitType_FormatConverter;
    splitterNodeDesc.componentSubType = (OSType)kAudioUnitSubType_Splitter;
    splitterNodeDesc.componentFlags = 0;
    splitterNodeDesc.componentFlagsMask = 0;
    status = AUGraphAddNode(graph, &splitterNodeDesc, &splitterNodes[trackId]);

    // node info
    status = AUGraphNodeInfo(graph, auSampleNodes[trackId], 0, &auSampleUnits[trackId]);
    status = AUGraphNodeInfo(graph, splitterNodes[trackId], 0, &splitterUnits[trackId]);

    // connecting nodes samplernode ==> Splitter ==> Mixer
    status = AUGraphConnectNodeInput(graph, auSampleNodes[trackId], 0, splitterNodes[trackId], 0);
    status = AUGraphConnectNodeInput(graph, splitterNodes[trackId], 0, mixerNode, trackId);

    status = MusicTrackSetDestNode(tracks[trackId], auSampleNodes[trackId]);

    status = AUGraphUpdate(graph, NULL);
    if (status) printf("Error updating graph: %ld\n", status);

    MusicPlayerStart(_musicPlayer);

    return trackId;

这就是我为该曲目加载声音的方式:

[self samplerUnit:auSampleUnits[trackId] loadFromDLSOrSoundFont:url withPatch:patchNumber];

声音字体加载:

- (OSStatus)samplerUnit:(AudioUnit)sampler loadFromDLSOrSoundFont:(NSURL *)bankURL withPatch:(int)presetNumber

    OSStatus result = noErr;

    // Fill out the sampler instrument data structure
    AUSamplerInstrumentData insdata;
    insdata.fileURL = (__bridge CFURLRef) bankURL;
    insdata.bankMSB  = kAUSampler_DefaultMelodicBankMSB;
    insdata.bankLSB  = (UInt8)0;
    insdata.presetID = (UInt8) presetNumber;
    insdata.instrumentType = kInstrumentType_DLSPreset; // DLS and SF2 are the same enum values

    // Load the instrument
    result = AudioUnitSetProperty(sampler,
                                  kAUSamplerProperty_LoadInstrument,
                                  kAudioUnitScope_Global,
                                  0,
                                  &insdata,
                                  sizeof(insdata));

    NSCAssert (result == noErr,
               @"Unable to set the preset property on the Sampler. Error code: %d",
               (int) result);

    return result;

因此,目前,为最近添加的轨道加载了适当的声音,但旧轨道的声音现在是默认的 AudioUnitSampler 正弦波声音。

我已经尝试解决此问题大约一天了,但还没有找到解决方法,有什么解决方案吗?

干杯!!!

【问题讨论】:

【参考方案1】:

您是否将 trackCount 与 MusicSequenceGetTrackCount 进行比较?

查看MusicSequenceSetAUGraph 的文档。 "默认情况下,序列中的所有音乐曲目都指向图表中的第一个节点,该节点是一个乐器单元(DLSMusicDevice 类型)

您希望拆分器做什么?它现在做的不多。

【讨论】:

终于通过做最奇怪的事情让它工作了;调试时意外修复。这就是我添加的所有内容if (trackId == 2) MusicSequenceSetAUGraph(sequence,graph); 到目前为止,我不知道为什么会这样 我在status = MusicSequenceNewTrack(sequence,&tracks[trackId]);之后添加了这个

以上是关于Music TrackSetDestNode 重置旧音乐曲目的采样器声音的主要内容,如果未能解决你的问题,请参考以下文章

Music21:获取音符的曲目索引

Music

如何从 music21 乐谱中获取所有钢琴部分?

继承—Music

music

编写Music类