Is synchronised looping supported for AKPlayers that are multiples in their duration?

左心房为你撑大大i 提交于 2020-05-17 05:56:29

问题


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

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!