[chuck-users] Latency Vs Midi timings precision
Julien Saint-Martin
julien.saintmartin at googlemail.com
Thu Mar 29 06:05:46 EDT 2018
Hi Chuck community,
Just a little message to tell you how I deal with my midi jitter problem.
I asked my friend to send me a midi message every beats. The first msg of
four is different.
Then I code a program to do an average on time difference of midi event.
Then it resync all my sequences thanks to another class I coded (
MASTER_SEQ3.update_ref_times).
To fine tune the overall latency I asked my friend to generate a regular
clic sound and I do it on my own. Then we recorded, analyses and updates
the latency.
I am satified of the result, it works to play music together. Of course I
think there is still around 2ms jitter but it is not an issue for us.
I copy/paste the code below if someone is interested.
Other part of my code can be find here: https://github.com/supabassmasta/dev
And don't hesistate to ask me if you want more details.
class tick_adjust {
// ------------ LATENCY --------------
196::ms => dur latency;
48::ms => dur jitter_mean;
[5 , 8, 16, 24, 32] @=> int refresh_rate[];
0=> int refresh_index;
time ref, next;
0 => int started;
0::ms => dur delta_mean;
0 => int cnt;
fun void midi_ev(int in) {
// in == 1 : Bar (4 beat) start
// other : other beats
if (!started) {
if (in == 1) {
now => ref;
ref - latency - jitter_mean => ref => next;
MASTER_SEQ3.update_ref_times(ref, data.tick * 4 );
<<<"UPDATE 1st ref">>>;
1=> started;
}
}
else {
now => time midi_time;
next - (midi_time - latency - jitter_mean) => dur
delta;
// midi_time- next + latency => dur delta;
// ------------ MEAN ---------------
// delta * 0.05 + delta_mean * 0.95 => delta_mean;
delta * (1. / (refresh_rate[refresh_index] $ float) )
+ delta_mean *(1.- ( 1. / (refresh_rate[refresh_index] $ float ))) =>
delta_mean;
}
if (started) {
cnt + 1 => cnt;
if (cnt == refresh_rate[refresh_index]){
next - delta_mean => ref => next;
MASTER_SEQ3.update_ref_times(ref, data.tick * 4 );
<<<"UPDATE delta_mean: ", delta_mean/1::ms ," refresh rate: ",
refresh_rate[refresh_index] >>>;
0::ms => delta_mean;
0=> cnt;
if (refresh_index < refresh_rate.size() - 1){
refresh_index + 1 => refresh_index;
}
}
next + data.tick => next;
}
}
}
"Scarlett 2i4 USB MIDI 1" => string device;
MidiIn min;
MidiMsg msg;
// open the device
for(0 => int i; i < 8; i++ )
{
// open the device
if( min.open( i ) )
{
if ( min.name() == device ) {
<<< "device", i, "->", min.name(), "->", "open as input:
SUCCESS" >>>;
break;
}
else {
// min.close();
}
}
else {
<<<"Cannot open", device>>>;
break;
}
}
<<< "MIDI device:", min.num(), " -> ", min.name() >>>;
tick_adjust ta;
while( true )
{
min => now;
while( min.recv(msg) )
{
<<< msg.data1, msg.data2, msg.data3 >>>;
if (msg.data1 == 144 && msg.data2 == 36 && msg.data3 == 100 ){
// first beat of for
ta.midi_ev(1);
}
else if (msg.data1 == 144 && msg.data2 == 24 && msg.data3 == 100 ) {
// other beat
ta.midi_ev(0);
}
}
}
2018-03-20 0:07 GMT+01:00 Mario Buoninfante <mario.buoninfante at gmail.com>:
> Hi Julien,
>
> as far as I know the best thing to do should be to set the period buffer
> to 3, at this point you could easily decrease the buffer size both on Jack
> and ChucK (you can find more info on Linux audio website or just googling).
> in my setup at the moment I have the buffer size on Jack = 256 and on ChucK
> = 512 and it works fine. I've got an average Asus machine, i5 (5th or 6th
> generation) with 8gb of RAM. but unfortunately MIDI on ALSA driver is not
> as accurate as CoreAudio is. let's say it's well known to introduce jitter.
> so I suspect the problem lies there.
>
> cheers,
> Mario
>
> 2018-03-19 16:03 GMT+00:00 Julien Saint-Martin <julien.saintmartin@
> googlemail.com>:
>
>> Hi Mario,
>>
>> In qjackctl my config is (my parameters names are in French so maybe my
>> translation is not the exactly same) :
>> Samples/Period: 4096
>> Sample rate: 44100
>> Period/Buffer: 2
>>
>> Midi Driver: None
>>
>> I call ChucK (Jack version) with parameter --bufsize8192
>>
>> What is the specific setup your are talking about ?
>>
>> Thanks!
>> Julien
>>
>>
>>
>> 2018-03-19 15:16 GMT+01:00 Mario Buoninfante <mario.buoninfante at gmail.com
>> >:
>>
>>> Hi Julien,
>>>
>>> I work on Linux as well, using Jack as audio core. there's a specific
>>> setup I've got that uses ChucK as slave (an external hardware sends MIDI
>>> clock to it and Pure Data). I have to say I've never experienced anything
>>> like this, but honestly this specific ChucK script I'm using is in sync
>>> with everything, but doesn't need to be super accurate. So I've never
>>> measured if performance in this situation. could you provide some info more
>>> about your settings? how are you setting latency? buffer size on Jack,
>>> ChucK?
>>>
>>> cheers,
>>> Mario
>>>
>>> 2018-03-19 11:11 GMT+00:00 Julien Saint-Martin <
>>> julien.saintmartin at googlemail.com>:
>>>
>>>> Hi there,
>>>>
>>>> I am trying to synchronize my ChucK Loops and Synth with a friend.
>>>> We use midi messages and I am Slave.
>>>> I use Linux with Jack server.
>>>>
>>>> To ensure ChucK processing without glitches I play with latency
>>>> (usually 186 ms).
>>>> But I noticed that perdiodic midi messages are randomly delayed (kind
>>>> of jitter of about 80ms) when received in ChucK.
>>>> I also noticed that the jitter decrease when I reduce Latency.
>>>>
>>>> Latency is not a problem for me, and it is needed for Chuck to compute
>>>> without glitches (XRun in Jack server).
>>>>
>>>> Do you know where the Jitter comes from (Linux, Jack, ChucK) ?
>>>> Is there a solution to reduce it keeping some latency ?
>>>>
>>>> Happy Chucking,
>>>>
>>>> Julien
>>>>
>>>> _______________________________________________
>>>> chuck-users mailing list
>>>> chuck-users at lists.cs.princeton.edu
>>>> https://lists.cs.princeton.edu/mailman/listinfo/chuck-users
>>>>
>>>>
>>>
>>> _______________________________________________
>>> chuck-users mailing list
>>> chuck-users at lists.cs.princeton.edu
>>> https://lists.cs.princeton.edu/mailman/listinfo/chuck-users
>>>
>>>
>>
>> _______________________________________________
>> chuck-users mailing list
>> chuck-users at lists.cs.princeton.edu
>> https://lists.cs.princeton.edu/mailman/listinfo/chuck-users
>>
>>
>
> _______________________________________________
> chuck-users mailing list
> chuck-users at lists.cs.princeton.edu
> https://lists.cs.princeton.edu/mailman/listinfo/chuck-users
>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.cs.princeton.edu/pipermail/chuck-users/attachments/20180329/a784aeb0/attachment.html>
More information about the chuck-users
mailing list