The Antescofo language allows precise expression how a sequence of electronic actions is synchronized in real-time with musician events. In Antescofo language, an electronic phrase is written specifying delays between each actions into a block. Through a specific attribute, a particular synchronization strategy can be applied that will manage the temporal evolution of this phrase depending on the musician performance.
Estimation of musician's tempo and musician's position
The listening machine of Antescofo detects the events played by the musician and estimates its tempo at each detection. These informations let the system deduces a position of the musician at each instant and also to anticipate the arrival of future events.
Coordination of actions with temporal informations of the musician
Antescofo system maintain a local position and local tempo for each groups (sequence of actions), loops (repeated groups), curve (continuous actions), etc.
These local position and tempo can be completely independent to that of the musician when the tempo is explicitly specified :
group @tempo := 70
{
...
}
But when the position and the tempo of the group have to be coordinated with that of the musician, there are different ways to do it :
Loose synchronization
This is the default strategy.
Once a group is launched, the scheduling of its sequence of relatively-timed actions follows only the real-time changes of the tempo from the musician. The @loose synchronization strategy ensures a fluid evolution of the actions’ launching but it does not guarantee a precise synchronization with the events played by the musician.
Tight synchronization
If a group is tight, the triggering of its actions will stick to the detected position of the musician. The scheduling will be dynamically analyzed to associated the action relatively to the nearest event in the past.
Target synchronization
Target synchronizations are a intermediate between @tight and @loose strategies. These strategies aim to dynamically and locally adjust the tempo of a sequence for a smooth synchronization.
Static targets
Some events can be more important that others for the synchronization. These events can correspond to the beginning, or the end of a phrase or other events commonly referred as pivot event .
The language let the composer to list pivot events for a given group. During the performance, the local tempo of the group is dynamically adjusted with respect to these synchronization points. Then, each time musician position or musician tempo are updated, delays of the group are adjusted so that position and tempo of the group will converge to position and tempo of the musician at the prediction date of the next synchronization point. This strategy is smooth and preserve the continuity of continuous
curves.
Dynamic targets
In addition to the case above where synchronisation points are statically declared, the position of the group can be continuously adjusted depending on a specified window. The shorter the window is, the faster the re-synchronizations will be. Such dynamic targets can be expressed in beats, seconds or in number of events into the future. This strategy is smoother than \emph{static targets} since there are not distinguished events.
Adjusting the coordination reference
There are different ways to adjust the reference on which we want to synchronize a group of actions.
@conservative vs @progressive
@conservative and @progressive attributes concern the position of the musician. The idea is that, with @conservative attribute, the estimation of the musician will not anticipate the detection of the next event of the musician. With the @progressive strategy, the default one, the estimation of the position will continue to advance even if the forecasted event is not detected.@tempovar
“@tempo_var” associates a tempo and a position to the update of a variable. This mechanism enables the creation of a new temporal reference that is not the musician one. The Variable can be updated in the score or from the external environment (for example with message “setvar $v 3” or with OSC messages). For instance if we declare “@tempo_var $v (60, 2)”, $v.position is incremented by 2 and $v.tempo is updated each time the value $v is updated. Groups, loops and curves can be coordinated with such variables.
These mechanisms are illustrated by the attached patch where the effects of the different strategies can be listened on the synchronization of an accompaniment.
sync.zip (23.6 MB)