1\documentclass{article} 2\title{Region layering} 3\author{} 4\date{} 5 6\usepackage{graphicx,amsmath} 7\begin{document} 8\maketitle 9 10\section{Introduction} 11 12When regions overlap in time, we need to decide which one should be 13played. 14 15 16\section{Layers} 17 18Each region on a playlist is on a \emph{layer}. All overlapping regions 19are on a unique layer, and when overlaps exist the highest-layered 20region is played. This is illustrated in Figure~\ref{fig:basic-layering}. 21 22\begin{figure}[ht] 23\begin{center} 24\includegraphics{basic-layering.pdf} 25\end{center} 26\caption{Basic region layering} 27\label{fig:basic-layering} 28\end{figure} 29 30Here we see that region $A$ overlaps $B$, $B$ overlaps $C$, and 31$D$ overlaps nothing. There are several ways in which these regions 32could be arranged; in the drawing, $A$ is on layer~2, $B$ on layer~1, 33$C$ and $D$ on layer~0. If this area is played back, region $A$ will 34play in its entirety, followed by the end part of region $B$, followed 35by the end part of region $C$, followed by the whole of region $D$. 36This follows the basic rule that, at any given point, the region on 37the highest layer will be played. 38 39 40\section{Which layer does a region go on?} 41 42The logic to decide which layer a region goes onto is somewhat complicated. 43This section describes it in hand-wavey and more technical terms. 44 45 46\subsection{Hand-wavey description} 47 48A playlist maintains an internal \emph{layering order} for regions. This order 49is not directly visible in Ardour, but it's useful to understand it 50nonetheless. Figure~\ref{fig:layering-order-1} gives a rough idea of what this 51means. 52 53\begin{figure}[ht] 54\begin{center} 55\includegraphics{layering-order-1.pdf} 56\end{center} 57\caption{Layering order} 58\label{fig:layering-order-1} 59\end{figure} 60 61Here we see 6 regions; as the layering order value increases, the region will 62be placed on a higher layer. 63 64Every time any region is moved, added or edited, a \emph{relayer} occurs. This 65collapses the regions down into layers. For our example, this would result in 66the arrangement in Figure~\ref{fig:layering-order-2}. 67 68\begin{figure}[ht] 69\begin{center} 70\includegraphics{layering-order-2.pdf} 71\end{center} 72\caption{Layering} 73\label{fig:layering-order-2} 74\end{figure} 75 76The relayer operation takes each region, in the layering order, and puts it 77on the lowest possible layer that it can be on without overlap. 78 79 80\subsubsection{Layering order} 81 82Given that arrangement, the remaining question is how the layering order is 83arrived at. The rules are as follows: 84 85\begin{itemize} 86 87\item When a region is added to a playlist, it goes above the current highest 88 region in the layering order. 89 90\item In `overlaid' track mode, moving or editing regions does not change the 91 layering order. Hence, moving regions about will maintain their position in 92 the layering order. Changing overlaps may change the \emph{layer} that the 93 region ends up on, but not the order in which they will be layered. 94 95\item In `stacked' track mode, moving regions places the region on the layer 96 that they are dropped on. This is achieved by modifying the layering order 97 for the region that is moved, so that when the relayer operation happens the 98 region ends up on the desired layer. 99 100\item When regions are `raised' or `lowered' in the stack, the layering order 101 is modified to achieve the desired layer change. 102 103\end{itemize} 104 105The upshot of all this is that regions should maintain their expected layering 106order, unless that order is explicitly change using `stacked' mode or by 107explicit layering commands like `raise' or `lower'. 108 109 110 111\subsection{Technical description} 112 113Each region on a playlist has three layering-related properties: its current 114layer $c$ (an integer) and its layering index $i$ (also an integer). It also 115has an \emph{optional} pending layer $p$ which is fractional. 116 117Whenever a region is added, moved, trimmed, etc.\ we run a \emph{relayer}. This 118does the following: 119 120\begin{enumerate} 121\item Take a list of all regions and remove those who have a value for $p$. 122\item Sort the remainder in ascending order of $i$. 123\item Insert the regions which have a value for $p$ in the correct place in the 124 list by comparing $c$ of those in the list to $p$ of the inserted region. 125\item Iterate over the resulting list, putting each region on the lowest available 126 layer, setting its current layer $c$, and clearing $p$. 127\item If any region had a pending layer, iterate through the region list again 128 giving each region a new layering index $i$ ascending from 0. 129\end{enumerate} 130 131The pending layer $p$ is set up in the following situations: 132\begin{enumerate} 133\item When a region is added to the playlist, $p$ is set to $\infty$. 134\item When a region is raised to the top of the playlist, $p$ is set to $\infty$. 135\item When a region is raised one step in the playlist, $p$ is set to $c + 1.5$. 136\item When a region is lowered to the bottom of the playlist, $p$ is set to $-0.5$. 137\item When a region is lowered one step int the playlist, $p$ is set to $c - 1.5$. 138\item When a region is explicitly put between layers $A$ and $B$ in `stacked' 139 mode, $p$ is set to $(A + B) / 2$. 140\end{enumerate} 141 142The idea of this approach is that the layering indices $i$ are used to keep a 143current state of the stack, and this state is used to maintain region 144relationships. Setting $p$ will alter these relationships, after which the 145layering indices $i$ are updated to reflect the new status quo. 146 147It is not sufficient to use current layer $c$ as the state of the stack. 148Consider two overlapping regions $P$ and $Q$, with $P$ on layer~0 and $Q$ on 149layer~1. Now raise $P$ to the top of the stack, so that $Q$ is on layer~0 and 150$P$ on layer~1. Move $P$ away from $Q$ (in overlaid mode) so that both regions 151are on layer~0. Now drag $P$ back over $Q$. One would expect $P$ to return to 152the top of the stack, since it was explicitly raised earlier. However, if the 153relayer operation were to compare $c$ for each region, they would be identical; 154the information that $P$ was once higher than $Q$ has been lost. 155 156 157\section{Stacked mode} 158 159When a track is being displayed in \emph{stacked} mode, regions are spread out 160vertically to indicate their layering, like in Figure~\ref{fig:stacked}. 161 162\begin{figure}[ht] 163\begin{center} 164\includegraphics[scale=0.5]{stacked.png} 165\end{center} 166\caption{A track in stacked mode} 167\label{fig:stacked} 168\end{figure} 169 170In this mode, layering is performed \emph{explicitly}. In other words, the 171user's immediate actions decide which layer a region should be put on. When a 172region move drag is started in stacked mode, the regions separate further out 173vertically, to leave space between each layer, as shown in 174Figure~\ref{fig:stacked-drag}. 175 176\begin{figure}[ht] 177\begin{center} 178\includegraphics[scale=0.5]{stacked-drag.png} 179\end{center} 180\caption{A track in stacked mode during a drag} 181\label{fig:stacked-drag} 182\end{figure} 183 184The region(s) being dragged can then be dropped in any location, horizontally 185and vertically, and the regions will be layered accordingly. 186 187 188\section{Overlaid mode} 189 190When a track is being displayed in \emph{overlaid} mode, regions are 191displayed on top of one another, like in Figure~\ref{fig:overlaid}. 192 193\begin{figure}[ht] 194\begin{center} 195\includegraphics[scale=0.5]{overlaid.png} 196\end{center} 197\caption{A track in overlaid mode} 198\label{fig:overlaid} 199\end{figure} 200 201In this mode, drags of regions maintain the same \emph{layer ordering}, even if the layers may 202change. 203 204\end{document} 205