首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >旧乐曲采样器的MusicTrackSetDestNode重置声音

旧乐曲采样器的MusicTrackSetDestNode重置声音
EN

Stack Overflow用户
提问于 2015-06-23 16:27:57
回答 1查看 151关注 0票数 3

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

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

代码语言:javascript
复制
// 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;
}

这就是我如何加载该曲目的声音:

代码语言:javascript
复制
[self samplerUnit:auSampleUnits[trackId] loadFromDLSOrSoundFont:url withPatch:patchNumber];

soundfont加载:

代码语言:javascript
复制
- (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正弦波声音。

我已经尝试了大约一天的时间来解决这个问题,但是还没有找到解决方法,有什么解决方案吗?

干杯!

EN

回答 1

Stack Overflow用户

发布于 2015-06-26 20:18:39

你有没有比较过MusicSequenceGetTrackCount和trackCount

看看MusicSequenceSetAUGraph的文档。默认情况下,序列中的所有音乐曲目都将定向到图形中的第一个节点,该节点是一个仪器单元(类型为DLSMusicDevice)

你想让拆分器做什么?它现在做的并不多。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/30997612

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档