ios - 混合 midi 文件,每个文件都有自己的声音字体

标签 ios audio core-audio midi coremidi

我正在寻找一种方法来混合 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/

相关文章:

javascript - 如何使用webrtc录制高质量立体声音频?

javascript - 触摸/单击和输入事件监听器不会触发 iOS

ios - 动态自动布局调整大小

objective-c - iPhone MPMoviePlayerController 在真实设备上播放视频时失去声音

java - 在java中检测相似的发音词

c++ - 核心音频中 AAC 文件的数据包大小 (mBytesPerPacket) 或比特率

ios - 在iOS上混合和均衡多个压缩音频流

ios - 如何在 Swift 中将 UnsafeMutablePointer<AudioBufferList> 转换为 AudioBuffer?

ios - 如何从处理 iPhone 上的应用程序中消失应用程序

c++ - iOS Vuforia从后台进入后出现错误