b177514930
git-svn-id: svn://localhost/ardour2/branches/3.0@11111 d708f5d6-7413-0410-9779-e7cbd77b26cf
205 lines
7.3 KiB
TeX
205 lines
7.3 KiB
TeX
\documentclass{article}
|
|
\title{Region layering}
|
|
\author{}
|
|
\date{}
|
|
|
|
\usepackage{graphicx,amsmath}
|
|
\begin{document}
|
|
\maketitle
|
|
|
|
\section{Introduction}
|
|
|
|
When regions overlap in time, we need to decide which one should be
|
|
played.
|
|
|
|
|
|
\section{Layers}
|
|
|
|
Each region on a playlist is on a \emph{layer}. All overlapping regions
|
|
are on a unique layer, and when overlaps exist the highest-layered
|
|
region is played. This is illustrated in Figure~\ref{fig:basic-layering}.
|
|
|
|
\begin{figure}[ht]
|
|
\begin{center}
|
|
\includegraphics{basic-layering.pdf}
|
|
\end{center}
|
|
\caption{Basic region layering}
|
|
\label{fig:basic-layering}
|
|
\end{figure}
|
|
|
|
Here we see that region $A$ overlaps $B$, $B$ overlaps $C$, and
|
|
$D$ overlaps nothing. There are several ways in which these regions
|
|
could be arranged; in the drawing, $A$ is on layer~2, $B$ on layer~1,
|
|
$C$ and $D$ on layer~0. If this area is played back, region $A$ will
|
|
play in its entirety, followed by the end part of region $B$, followed
|
|
by the end part of region $C$, followed by the whole of region $D$.
|
|
This follows the basic rule that, at any given point, the region on
|
|
the highest layer will be played.
|
|
|
|
|
|
\section{Which layer does a region go on?}
|
|
|
|
The logic to decide which layer a region goes onto is somewhat complicated.
|
|
This section describes it in hand-wavey and more technical terms.
|
|
|
|
|
|
\subsection{Hand-wavey description}
|
|
|
|
A playlist maintains an internal \emph{layering order} for regions. This order
|
|
is not directly visible in Ardour, but it's useful to understand it
|
|
nonetheless. Figure~\ref{fig:layering-order-1} gives a rough idea of what this
|
|
means.
|
|
|
|
\begin{figure}[ht]
|
|
\begin{center}
|
|
\includegraphics{layering-order-1.pdf}
|
|
\end{center}
|
|
\caption{Layering order}
|
|
\label{fig:layering-order-1}
|
|
\end{figure}
|
|
|
|
Here we see 6 regions; as the layering order value increases, the region will
|
|
be placed on a higher layer.
|
|
|
|
Every time any region is moved, added or edited, a \emph{relayer} occurs. This
|
|
collapses the regions down into layers. For our example, this would result in
|
|
the arrangement in Figure~\ref{fig:layering-order-2}.
|
|
|
|
\begin{figure}[ht]
|
|
\begin{center}
|
|
\includegraphics{layering-order-2.pdf}
|
|
\end{center}
|
|
\caption{Layering}
|
|
\label{fig:layering-order-2}
|
|
\end{figure}
|
|
|
|
The relayer operation takes each region, in the layering order, and puts it
|
|
on the lowest possible layer that it can be on without overlap.
|
|
|
|
|
|
\subsubsection{Layering order}
|
|
|
|
Given that arrangement, the remaining question is how the layering order is
|
|
arrived at. The rules are as follows:
|
|
|
|
\begin{itemize}
|
|
|
|
\item When a region is added to a playlist, it goes above the current highest
|
|
region in the layering order.
|
|
|
|
\item In `overlaid' track mode, moving or editing regions does not change the
|
|
layering order. Hence, moving regions about will maintain their position in
|
|
the layering order. Changing overlaps may change the \emph{layer} that the
|
|
region ends up on, but not the order in which they will be layered.
|
|
|
|
\item In `stacked' track mode, moving regions places the region on the layer
|
|
that they are dropped on. This is achieved by modifying the layering order
|
|
for the region that is moved, so that when the relayer operation happens the
|
|
region ends up on the desired layer.
|
|
|
|
\item When regions are `raised' or `lowered' in the stack, the layering order
|
|
is modified to achieve the desired layer change.
|
|
|
|
\end{itemize}
|
|
|
|
The upshot of all this is that regions should maintain their expected layering
|
|
order, unless that order is explicitly change using `stacked' mode or by
|
|
explicit layering commands like `raise' or `lower'.
|
|
|
|
|
|
|
|
\subsection{Technical description}
|
|
|
|
Each region on a playlist has three layering-related properties: its current
|
|
layer $c$ (an integer) and its layering index $i$ (also an integer). It also
|
|
has an \emph{optional} pending layer $p$ which is fractional.
|
|
|
|
Whenever a region is added, moved, trimmed, etc.\ we run a \emph{relayer}. This
|
|
does the following:
|
|
|
|
\begin{enumerate}
|
|
\item Take a list of all regions and remove those who have a value for $p$.
|
|
\item Sort the remainder in ascending order of $i$.
|
|
\item Insert the regions which have a value for $p$ in the correct place in the
|
|
list by comparing $c$ of those in the list to $p$ of the inserted region.
|
|
\item Iterate over the resulting list, putting each region on the lowest available
|
|
layer, setting its current layer $c$, and clearing $p$.
|
|
\item If any region had a pending layer, iterate through the region list again
|
|
giving each region a new layering index $i$ ascending from 0.
|
|
\end{enumerate}
|
|
|
|
The pending layer $p$ is set up in the following situations:
|
|
\begin{enumerate}
|
|
\item When a region is added to the playlist, $p$ is set to $\infty$.
|
|
\item When a region is raised to the top of the playlist, $p$ is set to $\infty$.
|
|
\item When a region is raised one step in the playlist, $p$ is set to $c + 1.5$.
|
|
\item When a region is lowered to the bottom of the playlist, $p$ is set to $-0.5$.
|
|
\item When a region is lowered one step int the playlist, $p$ is set to $c - 1.5$.
|
|
\item When a region is explicitly put between layers $A$ and $B$ in `stacked'
|
|
mode, $p$ is set to $(A + B) / 2$.
|
|
\end{enumerate}
|
|
|
|
The idea of this approach is that the layering indices $i$ are used to keep a
|
|
current state of the stack, and this state is used to maintain region
|
|
relationships. Setting $p$ will alter these relationships, after which the
|
|
layering indices $i$ are updated to reflect the new status quo.
|
|
|
|
It is not sufficient to use current layer $c$ as the state of the stack.
|
|
Consider two overlapping regions $P$ and $Q$, with $P$ on layer~0 and $Q$ on
|
|
layer~1. Now raise $P$ to the top of the stack, so that $Q$ is on layer~0 and
|
|
$P$ on layer~1. Move $P$ away from $Q$ (in overlaid mode) so that both regions
|
|
are on layer~0. Now drag $P$ back over $Q$. One would expect $P$ to return to
|
|
the top of the stack, since it was explicitly raised earlier. However, if the
|
|
relayer operation were to compare $c$ for each region, they would be identical;
|
|
the information that $P$ was once higher than $Q$ has been lost.
|
|
|
|
|
|
\section{Stacked mode}
|
|
|
|
When a track is being displayed in \emph{stacked} mode, regions are spread out
|
|
vertically to indicate their layering, like in Figure~\ref{fig:stacked}.
|
|
|
|
\begin{figure}[ht]
|
|
\begin{center}
|
|
\includegraphics[scale=0.5]{stacked.png}
|
|
\end{center}
|
|
\caption{A track in stacked mode}
|
|
\label{fig:stacked}
|
|
\end{figure}
|
|
|
|
In this mode, layering is performed \emph{explicitly}. In other words, the
|
|
user's immediate actions decide which layer a region should be put on. When a
|
|
region move drag is started in stacked mode, the regions separate further out
|
|
vertically, to leave space between each layer, as shown in
|
|
Figure~\ref{fig:stacked-drag}.
|
|
|
|
\begin{figure}[ht]
|
|
\begin{center}
|
|
\includegraphics[scale=0.5]{stacked-drag.png}
|
|
\end{center}
|
|
\caption{A track in stacked mode during a drag}
|
|
\label{fig:stacked-drag}
|
|
\end{figure}
|
|
|
|
The region(s) being dragged can then be dropped in any location, horizontally
|
|
and vertically, and the regions will be layered accordingly.
|
|
|
|
|
|
\section{Overlaid mode}
|
|
|
|
When a track is being displayed in \emph{overlaid} mode, regions are
|
|
displayed on top of one another, like in Figure~\ref{fig:overlaid}.
|
|
|
|
\begin{figure}[ht]
|
|
\begin{center}
|
|
\includegraphics[scale=0.5]{overlaid.png}
|
|
\end{center}
|
|
\caption{A track in overlaid mode}
|
|
\label{fig:overlaid}
|
|
\end{figure}
|
|
|
|
In this mode, drags of regions maintain the same \emph{layer ordering}, even if the layers may
|
|
change.
|
|
|
|
\end{document}
|