#ios #avfoundation
#iOS #avfoundation
Вопрос:
Я разрабатываю MIDI-плеер, обратившись к следующей веб-странице.
http://twocentstudios.com/2017/02/20/bouncing-midi-to-audio-on-ios/
Я не делаю никакой записи, я просто хочу воспроизвести SMF-файл. Однако, когда я запускаю setPreload (true), появляется сообщение «ОШИБКА УТВЕРЖДЕНИЯ: режим предварительной загрузки установлен во время рендеринга», и мое приложение зависает. Я искал «Предварительный режим, установленный во время рендеринга», но не смог найти никакой достоверной информации.
Пожалуйста, помогите кому-нибудь.
Редактировать:
привет, @dspr. Перкуссия звучит, даже если я не выполняю «AudioUnitSetProperty (kAUMIDISynthProperty_Enable_reload: 1)». Я думаю, это связано с тем, что БАНК ударных автоматически присваивается гл.10. Однако в этом состоянии пианино, гитара и другие не звучат. Инструменту AVAudioUnitMIDI требуется kaumidisynthproperty_enable_preload, чтобы проанализировать, какой тон присвоен какой дорожке в файле SMF, верно?
Какой метод AVAudioUnitMIDIInstrument использует для предварительной загрузки файлов SMF?
(1) AudioUnitSetProperty (kaumidisynthproperty_enable_preload: 1) в AVAudioUnitMIDISynth
(2) << Как выполнить предварительную загрузку? >>
(3) AudioUnitSetProperty (kaumidisynthproperty_enable_preload: 0) для AVAudioUnitMIDISynth
(4) Запустите AVAudioSequencer
Ответ №1:
Для этой цели MIDI-плеер использует kAUMIDISynthProperty_EnablePreload
свойство MIDISynth. Смотрите Комментарий Apple об этом ниже. Обратите внимание, что его следует использовать только перед воспроизведением 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,2 кГц или любой другой частотой дискретизации. В качестве простого примера, что происходит, если файл содержит набор ударных? Малый барабан (40) станет китайской тарелкой (52), играемой в два раза медленнее?
Насколько я понимаю этот пост, описанный взлом имеет уникальную цель — сделать запись. Так что, если вы просто хотите воспроизвести свой MIDI-файл, вы, безусловно, можете найти более простой и лучший пример.
Комментарии:
1. dspr, спасибо за ваш совет. Как я могу конкретно загрузить SMF в AVAudioUnitMIDISynth в примере кода по ссылке выше? (1) AudioUnitSetProperty (kaumidisynthproperty_enable_preload: 1) в AVAudioUnitMIDISynth (2) << Как выполнить предварительную загрузку? >> (3) AudioUnitSetProperty (kaumidisynthproperty_enable_preload: 0) для AVAudioUnitMIDISynth (4) Запустить AVAudioSequencer