Forums > Max For Live

Live API: Timer questions


Dec 27 2009 | 3:15 am

Hi. I’m trying to build an accurate timer that correctly reflects tempo changes, but I’m having trouble. I found two possible solutions in the LOM (live_set current_song_time and live_set current_smpte_song_time) which I thought might help, but I’m getting strange behavior. If you want to help me, please paste this into an empty max device, draw a tempo ramp in Live, and watch what happens. For me, it gets off the correct time as soon as the tempo changes. Does this happen for you? Do you have any suggestions or leads for me?
Thanks a million!


-- Pasted Max Patch, click to expand. --

Dec 27 2009 | 10:52 am

Hi I’ve done some experimenting for an accurate time-signal that follows the live song. This patch is the best I’ve come up with until now.

It’s a MFL patcher and a JS script called transport.js.

Willem Lageman


-- Pasted Max Patch, click to expand. --

// JS FILE transport.js
post("re_compile");

inlets = 1;
outlets = 6;
autowatch = 1;

var signature_numerator;
var prev_bar = -1;
var prev_beat = -1;

var is_playing = 0;
var loop = 0;

var loop_start = 0;

var loop_end = 0;

function bang()
{
post("bang");
}

function is_running(on)
{
post("is_playing: " + on);
post();
this.is_playing = on;
if (on != 0)
{
this.prev_bar = -1;
this.prev_beat = -1;
}
}

function is_looping(on)
{
post("is_looping: " + on);
post();
this.loop = on;

if (on == 0)
timepoint_loopstart(0, 0)
}

function on_loop_start_change(beat)
{
this.loop_start = beat;

bar = Math.floor(beat / this.signature_numerator) + 1;
beat = Math.floor(beat % this.signature_numerator) + 1;
post("loop_start", bar, beat, 0);
post();
//timepoint_loopstart(bar, beat);
}

function on_loop_length_change(beat)
{
this.loop_length = beat;

bar = Math.floor(beat / this.signature_numerator) + 1;
beat = Math.floor(beat % this.signature_numerator) + 1;
post("loop_length", bar, beat, 0);
post();
//timepoint_loopstart(bar, beat);
}

function on_metro(bar, beat, unit, resolution, tempo, signature_numerator, signature_denomenator, state, raw_ticks)
{
if (this.signature_numerator != signature_numerator)
{
this.signature_numerator = signature_numerator;
post("signature_numerator: ", signature_numerator);
}

if (beat != this.prev_beat)
if (unit < 20)
on_beat(bar, beat, unit);
//else
// do_beat(bar, beat, unit);
}

function on_beat(bar, beat, unit)
{
song_pos = (bar – 1) * this.signature_numerator + beat – 1;
loop_end = this.loop_start + this.loop_length;

if (this.loop > 0)
{
if (song_pos >= loop_start)
{
bar1 = Math.floor(this.loop_start / this.signature_numerator) + 1;
beat1 = Math.floor(this.loop_start % this.signature_numerator) + 1;
timepoint_loopstart(bar1, beat1);
}
else
{
timepoint_loopstart(0, 0);
}
if (song_pos == loop_end)
{
bar = Math.floor(this.loop_start / this.signature_numerator) + 1;
beat = Math.floor(this.loop_start % this.signature_numerator) + 1;
song_pos = this.loop_start;
this.prev_bar = -1;
this.prev_beat = -1;
}
}
else
{
timepoint_loopstart(0, 0)
}

post("Pos: " + bar + "." + beat + "." + unit);
if (this.prev_beat != beat)
post("Pos: " + song_pos + " Loopstart: " + this.loop_start + " Loopend: " + (this.loop_start + this.loop_length));
post();

outlet(3, bar, beat);
outlet(2, beat);
this.prev_beat = beat;
if (this.prev_bar != bar)
{
outlet(1, bar);
this.prev_bar = bar;
}
outlet(0, bang);
do_beat(bar, beat, unit);
}

function do_beat(bar, beat, unit)
{
var next_bar = bar;
var next_beat = beat + 1;
if (next_beat > this.signature_numerator)
{
next_bar ++;
next_beat = 1;
}
//this.prev_bar = next_bar;
outlet(4, next_bar, next_beat, 0);
}

function timepoint_loopstart(bar, beat)
{
//post("Timepoint_loopstart: ", bar, beat);
//post();
outlet(5, bar, beat, 0);
}
// END JS FILE


pid
Dec 27 2009 | 11:56 am

hello Willem Lageman, this seems brilliant to me, so really – thanks for sharing, very generous.

in the copying / pasting / etc from forum to patch + .js file, of course the patch loses the 6 connections from the outlets of the .js. i think i can work it out ok, but could you confirm exactly where they are all supposed to be connected to?

i’d love to investigate your patch/js more in the knowledge i’d be doing the patching/coding justice!…

Dec 27 2009 | 12:02 pm

Hi The six outlets go from left to right to:
– button
– number
– number
– message
– timepoint
– timepoint

Willem.


pid
Dec 27 2009 | 1:03 pm

thanks very much

Viewing 5 posts - 1 through 5 (of 5 total)

Forums > Max For Live