iOS:AVFoundation-在渲染期间设置预滚模式;我的应用程序挂起了

iOS:AVFoundation-在渲染期间设置预滚模式;我的应用程序挂起了,ios,avfoundation,Ios,Avfoundation,我正在开发MIDI播放器,请参考以下网页 我不做任何录音,我只想播放SMF文件。 然而,当我运行setPreload(true)时,它会显示“断言失败:在渲染期间设置预滚模式”,我的应用程序挂起。 我搜索了“在渲染期间设置预滚模式”,但找不到任何有效信息 请帮助某人 编辑: 你好,@dspr。 即使我没有执行“AudioUnitSetProperty(kAUMIDISynthProperty_EnablePreload:1)”,敲击声也会响起。 我想这是因为打击乐团是自动分配给第10章的。 然

我正在开发MIDI播放器,请参考以下网页

我不做任何录音,我只想播放SMF文件。 然而,当我运行setPreload(true)时,它会显示“断言失败:在渲染期间设置预滚模式”,我的应用程序挂起。 我搜索了“在渲染期间设置预滚模式”,但找不到任何有效信息

请帮助某人

编辑:

你好,@dspr。 即使我没有执行“AudioUnitSetProperty(kAUMIDISynthProperty_EnablePreload:1)”,敲击声也会响起。 我想这是因为打击乐团是自动分配给第10章的。 然而,在这种状态下,钢琴和吉他等都不会发出声音。 AVAudioUnitMIDI乐器需要kAUMIDISynthProperty_EnablePreload来分析SMF文件中哪个音轨分配了哪个音调,对吗

AVAudioUnitMIDIInstrument使用哪种方法预加载SMF文件

(1) AudioUnitSetProperty(KaumidisynthPropertyU EnablePreload:1)到AvaudioUnitMidSynth

(2) >

(3) AudioUnitSetProperty(KaumidisynthPropertyU EnablePreload:0)到AvaudioUnitMidSynth


(4) 启动AVAudioSequencer

MIDI播放器为此目的使用MidSynth的
kAUMIDISynthProperty_EnablePreload
属性。请参见下面的苹果评论。注意只能在MIDI播放之前使用,并且在尝试开始播放之前必须将其设置回0结尾的句子:

/*!
    @constant       kAUMIDISynthProperty_EnablePreload
    @discussion         Scope:          Global
                        Value Type:     UInt32
                        Access:         Write
 
                    Setting this property to 1 puts the MIDISynth in a mode where it will attempt to load
                    instruments from the bank or file when it receives a program change message.  This
                    is used internally by the MusicSequence.  It should only be used prior to MIDI playback,
                    and must be set back to 0 before attempting to start playback.
 */
编辑:坦白说,我对你的链接有点保留

One strategy I haven’t tried would be to pitch shift the MIDI up one octave, play it back at 2x, record it at 88.2kHz, then downsample to 44.1kHz. AVAudioSession presumably can’t go past 48kHz though.
显然,写这篇文章的人对音频和采样的知识非常贫乏。以两倍的速度播放一首转换为一个八度的MIDI歌曲实际上并不等同于以两倍的速度播放同样录制的音频,无论您以88.2kHz或任何其他采样率录制。举个简单的例子,文件中包含一个鼓集?圈套鼓(40)会变成中国钹(52),演奏速度会慢两倍吗


据我所知,这篇文章所描述的黑客有一个独特的目的,就是录音。因此,如果您只是想播放MIDI文件,您当然可以找到一个更简单、更好的示例。

dspr,谢谢您的建议。如何在上面链接中的示例代码中将SMF加载到AvaudioUnitMidSynth中?(1) AudioUnitSetProperty(kAUMIDISynthProperty_EnablePreload:1)到AvaudioUnitMidSynth(2)>(3)AudioUnitSetProperty(kAUMIDISynthProperty_EnablePreload:0)到AvaudioUnitMidSynth(4)启动AVAudioSequencer