Tempo ramps - demystify comments a bit.
This commit is contained in:
parent
895bbbba11
commit
d8549c6ff5
@ -261,6 +261,7 @@ TempoSection::frame_at_beat (double beat, framecnt_t frame_rate) const
|
|||||||
{
|
{
|
||||||
return frame_at_tick (beat * BBT_Time::ticks_per_beat, frame_rate);
|
return frame_at_tick (beat * BBT_Time::ticks_per_beat, frame_rate);
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
Ramp Overview
|
Ramp Overview
|
||||||
|
|
||||||
@ -273,7 +274,7 @@ Ta----|--------------|* |
|
|||||||
| * | |
|
| * | |
|
||||||
T0----|* | |
|
T0----|* | |
|
||||||
* | | |
|
* | | |
|
||||||
_______________|___|_____
|
_______________|___|____
|
||||||
time a t (next tempo)
|
time a t (next tempo)
|
||||||
[ c ] defines c
|
[ c ] defines c
|
||||||
|
|
||||||
@ -281,32 +282,42 @@ Duration in beats at time a is the integral of some Tempo function.
|
|||||||
In our case, the Tempo function (Tempo at time t) is
|
In our case, the Tempo function (Tempo at time t) is
|
||||||
T(t) = T0(e^(ct))
|
T(t) = T0(e^(ct))
|
||||||
|
|
||||||
where c is the function constant:
|
where c is the function constant
|
||||||
c = log(Ta/T0)/a
|
c = log(Ta/T0)/a
|
||||||
and
|
so
|
||||||
a = log(Ta/T0)/c
|
a = log(Ta/T0)/c
|
||||||
|
|
||||||
Given the function constant, the integral of the Tempo function (the beat function, which is the duration in beats at some time t) is:
|
The integral over t of our Tempo function (the beat function, which is the duration in beats at some time t) is:
|
||||||
b(t) = T0(e^(ct) - 1) / c
|
b(t) = T0(e^(ct) - 1) / c
|
||||||
|
|
||||||
To find the time t at any beat b, we use the inverse function of the beat function (the time function) which can be shown to be :
|
To find the time t at beat duration b, we use the inverse function of the beat function (the time function) which can be shown to be:
|
||||||
t(b) = log((cb / T0) + 1) / c
|
t(b) = log((cb / T0) + 1) / c
|
||||||
|
|
||||||
We define c for a tempo ramp by placing a new tempo at some distance t away from our existing one.
|
The time t at which Tempo T occurs is a as above:
|
||||||
The problem is that we usually don't know t.
|
t(T) = log(T / T0) / c
|
||||||
We do know the duration in beats where the next tempo section lies.
|
|
||||||
Where t = a (when we define c), we can solve a in terms of beat duration b and the two relevant tempos using the beat function:
|
|
||||||
a = b log (Ta / T0) / (T0 (e^(log (Ta / T0)) - 1))
|
|
||||||
|
|
||||||
We then use a to set the function constant c (above).
|
We define c for this tempo ramp by placing a new tempo section at some time t after this one.
|
||||||
Solving a and setting c in one operation allows us to further reduce the problem to:
|
Our problem is that we usually don't know t.
|
||||||
|
We usually do know the duration in beats between this and the next tempo section.
|
||||||
|
Where t = a (i.e. when a is equal to the time of the next tempo section), we can solve t in terms of
|
||||||
|
beat duration and our two tempos.
|
||||||
|
A bit of scribbling with the beat function gives us:
|
||||||
|
t = b log (Ta / T0) / (T0 (e^(log (Ta / T0)) - 1))
|
||||||
|
|
||||||
|
By substituting our expanded t as a in the c function above, we see that our problem is reduced to:
|
||||||
c = T0 (e^(log (Ta / T0)) - 1) / b
|
c = T0 (e^(log (Ta / T0)) - 1) / b
|
||||||
|
|
||||||
|
We can now evaluate and store c for use in beat, time and tempo calculations until the following tempo section
|
||||||
|
(the one that defines c in conjunction with this one) is changed or moved.
|
||||||
|
|
||||||
Most of this stuff is taken from this paper:
|
Most of this stuff is taken from this paper:
|
||||||
|
|
||||||
WHERE’S THE BEAT?
|
WHERE’S THE BEAT?
|
||||||
TOOLS FOR DYNAMIC TEMPO CALCULATIONS
|
TOOLS FOR DYNAMIC TEMPO CALCULATIONS
|
||||||
Jan C. Schacher
|
Jan C. Schacher
|
||||||
Martin Neukom
|
Martin Neukom
|
||||||
|
Zurich University of Arts
|
||||||
|
Institute for Computer Music and Sound Technology
|
||||||
|
|
||||||
https://www.zhdk.ch/fileadmin/data_subsites/data_icst/Downloads/Timegrid/ICST_Tempopolyphony_ICMC07.pdf
|
https://www.zhdk.ch/fileadmin/data_subsites/data_icst/Downloads/Timegrid/ICST_Tempopolyphony_ICMC07.pdf
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user