AudioKit, AKPlayer: как играть по сэмплам, а не по времени - PullRequest
0 голосов
/ 10 сентября 2018

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

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

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

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

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

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

How to get AKPlayer to play from start and end samples

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

EDIT

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

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 - невероятный Шепард в этом мире!

Ответы [ 2 ]

0 голосов
/ 12 сентября 2018

Чтобы преобразовать кадры в секунды, следует разделить их на частоту дискретизации аудиофайла, а не на жестко заданное значение 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)
0 голосов
/ 11 сентября 2018

Я нашел решение, в основном 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!

...