问题
Id' like to know if synchronised looping is supported for AKPlayer
(s) that are multiples in their duration?
Seems that is not supported or if not intended, it's a bug? Found similar report here (How to use the loop if the track was not started from the beginning (with buffering type = .always in AKPlayer )), where I thought I was providing a solution but after plenty of tests found that the solution provided does not work either. See attachment (*)
I've planned to record some loops that have a duration that is the same or a multiple of the smallest loop
. Firstly, found that synchronization failed when trying to start .play
for several AKPlayer
at the same AVAudioTime
start point. After a few attempts, fixed by sticking to buffering .always
, among other things such as .prepare
method. So, hopefully, that's out of the way...
The problem is that I expect to listen to a bunch of loops
play synchronously, even if some are 2x or 4x longer in duration...
So while expecting to have looping work for the main requirement where:
- Loop1 of duration 2.5 [looping]
- Loop2 of duration 2.5 [looping]
- Loop3 of duration 5 [looping]
Noticed that the Loop3
behaves badly, where the last half repeats a few times, let's say for a 4/4, looking at the beat numbers we'd hear the following:
- Loop1: 1 2 3 4, 1 2 3 4, 1 2 3 4, 1 2 3 4
- Loop2: 1 2 3 4, 1 2 3 4, 1 2 3 4, 1 2 3 4
- Loop3: 1 2 3 4 5 6 7 8, 5 6 7 8, 5 6 7 8
Is this expected to fail? is loop
of separate players that the duration is multiples, a feature that is supported?
After a few more tests, I find that this happens after adding a third track. For example:
- Loop1: 1 2 3 4
- Loop2: 1 2 3 4 5 6 7 8
Seems to work fine this far, but now I add a new track:
- Loop1: 1 2 3 4
- Loop2: 1 2 3 4 5 6 7 8
- Loop3: 1 2 3 4
And what I hear is:
- Loop1: 1 2 3 4 1 2 3 4 1 2 3 4
- Loop2: 1 2 3 4 1 2 3 4 5 6 7 8
- Loop3: 1 2 3 4 1 2 3 4 1 2 3 4
I'd try AKClipRecorder but just found that I need to declare the length ahead of recording time, it breaks the main requirement :)
(*) Audio file exposing the issue, this test was done with AKWaveTable
but seems to be the same problem. I'll look into rewriting some code that is easier to share to see if it's related to my implementation but, there's the link I've shared at the top, where someone else exposes the same problem.
https://drive.google.com/open?id=1zxIJgFFvTwGsve11RFpc-_Z94gEEzql7
回答1:
I believe that I got the problem and that is related to scheduling the play start time for newer loops.
Before, I'd record a loop and then play it at the currentTime
that is the value of a master player. The problem with that is regarding the startTime
that the player
holds in its state, which is immutable given that is read from memory, from my point of view. Which will always be true to more or less the end-point of the master loop, which is mid-point for the recorded loop that happens to be twice the size or another multiple of the master loop.
To solve this I've scheduled the player items differently, as follows:
player.startTime = 0
player.endTime = audioFile.duration
let offsetCurrentime = ((beatLength * 4.0) - currentTime)
player.play(at: AVAudioTime.now() + offsetCurrentime)
The .startTime
defines the start of the loop start point, I've also declared the duration length as the .endTime
; Finally, I've computed the length of the master bar
or the master loop that I use as a reference (or looper clock), which then is passed to the play
method. Meaning that I'm scheduling it to play to the startTime
and not from the currentTime
as that would cause issues, as I've exposed before!
To summarize, use the property at
of method .play
to schedule when to start from the starting point
and NOT from the current time the loop is on playing.
来源:https://stackoverflow.com/questions/61689675/is-synchronised-looping-supported-for-akplayers-that-are-multiples-in-their-dura