我正在制作一个音乐应用程序,您可以添加新的乐器到现有的音序器。这些乐器是独立的AudioUnitSamplers存储在一个数组中,因此当加载新的乐器和曲目时,它将加载该曲目要使用的声音。
这就是我目前向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];soundfont加载:
- (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正弦波声音。
我已经尝试了大约一天的时间来解决这个问题,但是还没有找到解决方法,有什么解决方案吗?
干杯!
发布于 2015-06-26 20:18:39
你有没有比较过MusicSequenceGetTrackCount和trackCount
看看MusicSequenceSetAUGraph的文档。默认情况下,序列中的所有音乐曲目都将定向到图形中的第一个节点,该节点是一个仪器单元(类型为DLSMusicDevice)
你想让拆分器做什么?它现在做的并不多。
https://stackoverflow.com/questions/30997612
复制相似问题