我正在寻找一种方法来混合 2 个或更多 MIDI 文件,每个文件都有自己的声音字体文件。我找到了一个文件的以下代码,并尝试做多个音乐播放器,但我想这不应该是正确的方法。而且我每秒都会听到一些奇怪的流行声音。
那么有没有其他方法,也许没有音乐播放器和音乐序列方法,仅使用 au 单位?
这是我在另一个线程中找到的代码:
-(void) playMusic:(NSString*) name
{
NSString *presetURLPath = [[NSBundle mainBundle] pathForResource:@"GortsMiniPianoJ1" ofType:@"SF2"];
NSURL * presetURL = [NSURL fileURLWithPath:presetURLPath];
[self loadFromDLSOrSoundFont: (NSURL *)presetURL withPatch: (int)3];
NSString *midiFilePath = [[NSBundle mainBundle] pathForResource:name ofType:@"mid"];
NSURL * midiFileURL = [NSURL fileURLWithPath:midiFilePath];
NewMusicPlayer(&musicPlayer);
if (NewMusicSequence(&musicSequence) != noErr)
{
[NSException raise:@"play" format:@"Can't create MusicSequence"];
}
if(MusicSequenceFileLoad(musicSequence, (CFURLRef)midiFileURL, 0, 0 != noErr))
{
[NSException raise:@"play" format:@"Can't load MusicSequence"];
}
MusicPlayerSetSequence(musicPlayer, musicSequence);
MusicSequenceSetAUGraph(musicSequence, _processingGraph);
MusicPlayerPreroll(musicPlayer);
MusicPlayerStart(musicPlayer);
}
多个音乐播放器实例听起来有点尴尬(保持同步),我怀疑多个 AUTOGraph 是否可以工作。我自己没试过。
一种使用单个实例的方法MusicPlayer
是将每个 MIDI 文件中的曲目加载到“主”序列中。您可以为每个轨道分配一个 AUSampler 节点(具有唯一的 soundFont)(MusicTrackSetDestNode
)并通过一个连接它们AUMixer
。您需要管理每个 MIDI 文件的速度(使用MusicTrackNewExtendedTempoEvent
) 将文件速度分配给相关轨道。静音轨道+轨道音量可以在轨道或混音器级别轻松处理。
我想很大程度上取决于您正在使用的 MIDI 文件的性质。 Fwiw - 我对 iOS 上的 midi 文件播放进行了大量研究,没有什么比 MusicPlayer 更容易使用的了。但是,那Bass lib如果 MusicPlayer 不适合您,可能值得一看。
指定混频器输入的数量:
// set the bus count
UInt32 numBuses = BUS_COUNT; // a constant defined elsewhere
result = AudioUnitSetProperty(mixerUnit,
kAudioUnitProperty_ElementCount,
kAudioUnitScope_Input,
0,
&numBuses,
sizeof(numBuses));
if (noErr != result) {[self printErrorMessage: @"Error setting Bus Count" withStatus: result]; return;}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)