Deep-Symmetry / dysentery

Exploring ways to participate in a Pioneer Pro DJ Link network
Eclipse Public License 1.0
196 stars 24 forks source link

Document and implement CDJ-3000 loop information #50

Closed brunchboy closed 1 year ago

brunchboy commented 1 year ago

Now that I finally have some CDJ-3000s, I can see new information in their larger status packets. The section after 1b0 provides information about looping, presumably the start and end, along with perhaps other things. The end position may be 4 bytes at 1c0, as it moves when the loop is doubled/halved. The start may be 4 bytes at 1b8? The size in beats is 2 bytes at 1c8. And there is some other stuff in there. This explains how it shows up on the other players’ screens, and it would be nice to document it and support it in Beat Link and BLT.

brunchboy commented 1 year ago

Correction: the start seems to be 4 bytes at 1b6 or 2 at 1b8, the end 4 bytes at 1be or 2 at 1c0. But I can’t figure out the units. They don’t seem to be half-frames, or milliseconds, or anything we’ve seen before. They seem closest to ⅛ beat units, but even that does not work out quite right (and it also means the start and end were showing up as the same for loops shorter than that). More investigation is required.

brunchboy commented 1 year ago

It looks like multiplying the start/end times by 65 yields the track position in milliseconds.

brunchboy commented 1 year ago

Nope, not quite. It’s multiplying by 66.666… that works. Which is 1000/15, or ten times what halfFrameToTime() returns. So beats are reported in 1/20 frame units for some weird reason.

brunchboy commented 1 year ago

And no again, that was another blind alley. Testing with longer tracks revealed the actual formula: take the loop position bytes, multiply by 65,536, then divide by 1,000. That actually looks right at both the beginning and end of very long tracks.

brunchboy commented 1 year ago

All right, this is documented in the protocol analysis, and implemented in Beat Link (and therefore in BLT).