I see scztt has tried to solve that here with a PtimeClutch
, but I suspect one (addionally) needs to account for near-zero length events with some tolerance. I’ve tried it with different length/durs and it seems to work properly, i.e. doesn’t “lose sync”, e.g. on \melody
in the next example:
(p = Ppar([
Pbind(\degree, Pkey(\melody), \dur, 0.2),
Pbind(\degree, Pkey(\melody), \ctranspose, 24, \dur, 0.4)
]) <> PtimeClutch(Pbind (\melody, Pshuf([1,2,3,4], inf)), 1e-06));
r = p.asStream
r.nextN(2, ()) // several times
Output
-> [ ( \melody: 1, \degree: 1, \dur: 0.2, \delta: 0.0 ), ( \melody: 1, \degree: 1, \dur: 0.4, \delta: 0.2,
\ctranspose: 24 ) ]
-> [ ( \melody: 4, \degree: 4, \dur: 0.2, \delta: 0.2 ), ( \melody: 4, \degree: 4, \dur: 0.4, \delta: 0.0,
\ctranspose: 24 ) ]
-> [ ( \melody: 2, \degree: 2, \dur: 0.2, \delta: 0.2 ), ( \melody: 2, \degree: 2, \dur: 0.2, \delta: 0.2 ) ]
-> [ ( \melody: 3, \degree: 3, \dur: 0.4, \delta: 0.0,
\ctranspose: 24 ), ( \melody: 3, \degree: 3, \dur: 0.2, \delta: 0.2 ) ]
-> [ ( \melody: 1, \degree: 1, \dur: 0.2, \delta: 0.2 ), ( \melody: 1, \degree: 1, \dur: 0.2, \delta: 2.2204460492503e-16 ) ]
-> [ ( \melody: 4, \degree: 4, \dur: 0.4, \delta: 0.2,
\ctranspose: 24 ), ( \melody: 4, \degree: 4, \dur: 0.2, \delta: 0.2 ) ]
-> [ ( \melody: 2, \degree: 2, \dur: 0.2, \delta: 2.2204460492503e-16 ), ( \melody: 2, \degree: 2, \dur: 0.4, \delta: 0.2,
\ctranspose: 24 ) ]
-> [ ( \melody: 3, \degree: 3, \dur: 0.2, \delta: 0.2 ), ( \melody: 3, \degree: 3, \dur: 0.2, \delta: 2.2204460492503e-16 ) ]
-> [ ( \melody: 1, \degree: 1, \dur: 0.4, \delta: 0.2,
\ctranspose: 24 ), ( \melody: 1, \degree: 1, \dur: 0.2, \delta: 0.2 ) ]
-> [ ( \melody: 4, \degree: 4, \dur: 0.4, \delta: 0.0,
\ctranspose: 24 ), ( \melody: 4, \degree: 4, \dur: 0.2, \delta: 0.2 ) ]
-> [ ( \melody: 2, \degree: 2, \dur: 0.2, \delta: 0.2 ), ( \melody: 2, \degree: 2, \dur: 0.4, \delta: 4.4408920985006e-16,
\ctranspose: 24 ) ]
-> [ ( \melody: 3, \degree: 3, \dur: 0.2, \delta: 0.2 ), ( \melody: 3, \degree: 3, \dur: 0.2, \delta: 0.2 ) ]