我正在寻找一种方法来混合 2 个或更多 midi 文件,每个文件都有自己的声音字体文件。我为一个文件找到了以下代码,并尝试做多个音乐播放器,但我想这不应该是正确的方法。此外,我每秒都会听到一些奇怪的流行音乐。
那么有没有其他方法,也许没有 musicplayer 和 musicsequence 方法,只使用 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);
}
最佳答案
多个 MusicPlayer 实例听起来有点笨拙(为了保持同步),我怀疑多个 AUGraphs 是否可行。我自己还没有尝试过。
使用 MusicPlayer
的唯一实例的一种方法是将每个 midi 文件中的轨道加载到“主”序列中。您可以为每个音轨 (MusicTrackSetDestNode
) 分配一个 AUSampler 节点(具有唯一的 soundFont),并通过 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;}
关于ios - 混合 midi 文件,每个文件都有自己的声音字体,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11706042/