AudioKit, AKPlayer: Как играть по семплам, а не по времени

В настоящее время я с большим успехом использую FDWaveFormView для отображения сигналов, представляющих звук, который я записываю с AKMicrophone или AKAudioFile.

Я успешно могу выделить определенные области в форме волны, и FDwaveForm возвращает диапазон семплов из аудиофайла.

Моя проблема сейчас в том, что я не могу найти подходящий метод в AKPlayer, который позволил бы мне воспроизвести от начального до конечного сэмпла.

Я заметил, что AKSamplePlayer устарел, но у него есть метод: play(from: Sample, to: Sample)

Я предполагаю, что я смогу выполнить некоторую математику, чтобы перевести позицию образца во время (как Double, как предписано в AKPlayer), однако я не нашел подходящей математики или функций для этого, какие-либо подсказки?

Чтобы быть точным в том, что я пытаюсь сделать, обратитесь к изображению ниже:

AudioKit, AKPlayer: Как играть по семплам, а не по времени

Примечание для всех основных участников AudioKit, которые могут увидеть этот вопрос, я знаю, что существует множество компонентов AudioKitUI, которые могут упростить это, однако только FDWaveFormView предоставил мне функциональность, которая мне нужна для этого конкретного приложения, я рад обсудить дальнейшее офлайн, еще раз большое спасибо.

РЕДАКТИРОВАТЬ

Я придумал код, который, как мне кажется, решил эту проблему:

let startingSampleIndex = self.waveformPlot.highlightedSamples!.min()
let endingSampleIndex = self.waveformPlot.highlightedSamples!.max()
let millisecondsPerSample : Double = 1000 / 44100

let startingDuration : Double = (startingSampleIndex! * millisecondsPerSample) / 1000
let endingDuration : Double = (endingSampleIndex! * millisecondsPerSample) / 1000

print("StartSample:\(startingSampleIndex!) | EndSample:\(endingSampleIndex!) | milliPerSample:\(millisecondsPerSample) | StartDuration:\(startingDuration) | EndDuration:\(endingDuration)")
player.play(from: startingDuration, to: endingDuration)

Основное уравнение - это numberOfSamples * millisecondsPerSample = timeInMilliseconds, разделив на 1000, я могу нормализовать все до секунд, чего хочет AKPlayer. Если кто-то увидит здесь что-то проблемное, я бы хотел получить совет, но я думаю, что это помогло! Извините, я все еще новичок в DSP и очень благодарен за то, что AudioKit стал невероятным Шепардом в этом мире!

Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
3
0
545
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Я нашел решение, по сути RTFM на DSP 101 и образцы ?:

let startingSampleIndex = self.waveformPlot.highlightedSamples!.min()
let endingSampleIndex = self.waveformPlot.highlightedSamples!.max()
let millisecondsPerSample : Double = 1000 / 44100

let startingDuration : Double = (startingSampleIndex! * millisecondsPerSample) / 1000
let endingDuration : Double = (endingSampleIndex! * millisecondsPerSample) / 1000

print("StartSample:\(startingSampleIndex!) | EndSample:\(endingSampleIndex!) | milliPerSample:\(millisecondsPerSample) | StartDuration:\(startingDuration) | EndDuration:\(endingDuration)")
player.play(from: startingDuration, to: endingDuration)

Это работает превосходно, еще раз спасибо и FDWaveFormView, и AudioKit!

Ответ принят как подходящий

Чтобы преобразовать кадры в секунды, вы должны разделить на частоту дискретизации аудиофайла, а не на жестко заданное значение 44100:

    guard let frameRange = self.waveformPlot.highlightedSamples else { return }
    let startTime = frameRange.min() / audioFile.fileFormat.sampleRate
    let endTime = frameRange.max() / audioFile.fileFormat.sampleRate
    player.play(from: startTime, to: endTime)

Полностью согласен, Райан, отмечу твой ответ как правильный! Просто двигался быстро .... Спасибо за всю вашу тяжелую работу над AudioKit!

Max 12.09.2018 22:32

Другие вопросы по теме