Skip to content

HTTPS clone URL

Subversion checkout URL

You can clone with HTTPS or Subversion.

Download ZIP
Browse files

MIDI documentation (still WIP, on-going)

  • Loading branch information...
commit d64b32746f7aae43fad9d74bd2af1e18370f026e 1 parent 3b739f3
Werner Almesberger wpwrak authored
16 src/compiler/doc/Makefile
View
@@ -10,7 +10,7 @@ PICS = arch msg bind stim \
pot-0 pot-90 pot-180 pot-270 \
enc-0 enc-90 enc-270 enc-450 enc-405 \
dial-0 dial-90 dial-180 dial-360 \
- dial-405 dial-315
+ dial-405 dial-405-idle dial-315 dial-45 dial-135 dial-315f
GEN = nocvars.inc
@@ -18,7 +18,7 @@ GEN = nocvars.inc
all: midi.pdf
-midi.pdf: midi.tex $(PICS:%=%.$(PICEXT)) $(GEN)
+midi.pdf: midi.tex floats.inc $(PICS:%=%.$(PICEXT)) $(GEN)
pdflatex midi
xpdf: midi.pdf
@@ -102,9 +102,21 @@ dial-360.$(PICEXT): dial.fig
dial-405.$(PICEXT): dial.fig
$(call fig2pdf, 45deg cw-slow)
+dial-405-idle.$(PICEXT): dial.fig
+ $(call fig2pdf, 45deg)
+
dial-315.$(PICEXT): dial.fig
$(call fig2pdf, 315deg ccw)
+dial-45.$(PICEXT): dial.fig
+ $(call fig2pdf, 45deg ccw-slow)
+
+dial-135.$(PICEXT): dial.fig
+ $(call fig2pdf, 135deg ccw-fast)
+
+dial-315f.$(PICEXT): dial.fig
+ $(call fig2pdf, 315deg ccw-fast)
+
nocvars.inc: ../fnp.ids
./mknocvars <$< >$@ || { rm -f $@; exit 1; }
54 src/compiler/doc/arch.fig
View
@@ -22,32 +22,32 @@ Single
1 1 0 3 0 7 50 -1 -1 0.000 1 0.0000 4050 3825 675 450 4050 3825 4725 4275
4 1 0 45 -1 18 12 0.0000 4 150 1050 4050 3915 Translation\001
-6
-6 6480 2205 8370 4995
+6 6480 2655 8370 5445
2 2 0 2 0 7 55 -1 -1 0.000 0 0 -1 0 0 5
- 6525 2250 8325 2250 8325 4950 6525 4950 6525 2250
-4 0 0 45 -1 18 12 0.0000 4 195 1560 6750 2925 var = range(aux);\001
-4 0 32 55 -1 18 12 0.0000 4 195 990 6750 3240 per_frame:\001
-4 0 32 55 -1 18 12 0.0000 4 180 960 6975 3555 rot = time;\001
-4 0 32 55 -1 18 12 0.0000 4 135 1110 6975 3870 zoom = var;\001
-4 0 32 55 -1 18 12 0.0000 4 105 840 6750 2610 ...more...\001
-4 0 32 55 -1 18 12 0.0000 4 105 840 6975 4185 ...more...\001
+ 6525 2700 8325 2700 8325 5400 6525 5400 6525 2700
+4 0 0 45 -1 18 12 0.0000 4 195 1560 6750 3375 var = range(aux);\001
+4 0 32 55 -1 18 12 0.0000 4 195 990 6750 3690 per_frame:\001
+4 0 32 55 -1 18 12 0.0000 4 180 960 6975 4005 rot = time;\001
+4 0 32 55 -1 18 12 0.0000 4 135 1110 6975 4320 zoom = var;\001
+4 0 32 55 -1 18 12 0.0000 4 105 840 6750 3060 ...more...\001
+4 0 32 55 -1 18 12 0.0000 4 105 840 6975 4635 ...more...\001
-6
-6 1305 3825 1665 4185
-1 3 0 2 0 7 50 -1 -1 0.000 1 0.0000 1485 4005 127 127 1485 4005 1395 3915
+6 1305 3915 1665 4275
+1 3 0 2 0 7 50 -1 -1 0.000 1 0.0000 1485 4095 127 127 1485 4095 1395 4005
2 1 0 2 0 7 50 -1 -1 0.000 0 0 -1 0 0 2
- 1485 4005 1395 3915
+ 1485 4095 1395 4005
-6
-6 1485 3285 1665 3600
-5 1 0 2 0 7 50 -1 -1 0.000 0 0 0 0 1575.000 3375.000 1530 3375 1575 3330 1620 3375
-5 1 0 2 0 7 50 -1 -1 0.000 0 1 0 0 1575.000 3510.000 1530 3510 1575 3555 1620 3510
-1 3 0 2 0 7 47 -1 15 0.000 1 0.0000 1575 3375 45 45 1575 3375 1620 3375
+6 945 3330 1260 3510
+5 1 0 2 0 7 50 -1 -1 0.000 0 0 0 0 1035.000 3420.000 1035 3465 990 3420 1035 3375
+5 1 0 2 0 7 50 -1 -1 0.000 0 1 0 0 1170.000 3420.000 1170 3465 1215 3420 1170 3375
+1 3 0 2 0 7 47 -1 15 0.000 1 1.5708 1035 3420 45 45 1035 3420 1035 3375
2 1 0 2 0 7 49 -1 -1 0.000 0 0 -1 0 0 2
- 1530 3375 1530 3510
+ 1035 3465 1170 3465
2 1 0 2 0 7 49 -1 -1 0.000 0 0 -1 0 0 2
- 1620 3375 1620 3510
+ 1035 3375 1170 3375
-6
-1 3 0 2 0 7 50 -1 -1 0.000 1 0.0000 1080 3420 90 90 1080 3420 1170 3420
-1 3 0 2 0 7 50 -1 -1 0.000 1 0.0000 1350 3420 90 90 1350 3420 1440 3420
+1 3 0 2 0 7 50 -1 -1 0.000 1 0.0000 1530 3420 90 90 1530 3420 1620 3420
+1 3 0 2 0 7 50 -1 -1 0.000 1 0.0000 1530 3690 90 90 1530 3690 1620 3690
2 1 0 2 0 7 53 -1 -1 0.000 0 0 -1 0 0 2
3600 5355 4725 5355
2 1 0 2 0 7 53 -1 -1 0.000 0 0 -1 0 0 2
@@ -71,19 +71,19 @@ Single
1890 3825 3330 3825
2 1 0 2 0 7 50 -1 -1 0.000 0 0 7 1 0 3
1 1 2.00 60.00 60.00
- 4770 3825 6885 3825 6885 2970
-2 1 0 2 0 7 50 -1 -1 0.000 0 0 -1 1 0 3
- 1 1 2.00 60.00 60.00
- 6705 2880 4050 2880 4050 3330
-2 1 0 2 0 7 50 -1 -1 0.000 0 0 -1 0 0 2
+ 4770 3825 6885 3825 6885 3420
+2 1 0 2 0 7 50 -1 -1 0.000 0 1 -1 0 0 2
1080 4320 1080 3645
-2 1 0 4 0 7 50 -1 -1 0.000 0 0 -1 0 0 2
+2 1 0 4 0 7 50 -1 -1 0.000 0 1 -1 0 0 2
990 4095 1170 4095
2 2 0 3 0 7 50 -1 -1 0.000 0 0 -1 0 0 5
810 3150 1800 3150 1800 4500 810 4500 810 3150
+2 1 0 2 0 7 50 -1 -1 0.000 0 0 -1 1 0 4
+ 1 1 2.00 60.00 60.00
+ 7470 3195 7470 2880 4050 2880 4050 3330
4 1 0 45 -1 18 12 0.0000 4 150 525 12330 6570 Patch\001
-4 1 0 45 -1 18 12 0.0000 4 150 435 3285 5355 dev1\001
-4 1 0 45 -1 18 12 0.0000 4 150 435 3285 6480 dev2\001
+4 1 0 45 -1 18 12 0.0000 4 150 615 3285 5355 Gizmo\001
+4 1 32 45 -1 18 12 0.0000 4 150 435 3285 6480 Frob\001
4 0 0 45 -1 18 12 0.0000 4 150 1380 4185 4725 Characteristics\001
4 1 0 45 -1 18 12 0.0000 4 150 630 2610 3735 Events\001
4 1 0 45 -1 18 12 0.0000 4 150 1500 3960 7470 Device database\001
4 src/compiler/doc/bind.fig
View
@@ -136,7 +136,7 @@ Single
4 1 0 50 -1 18 12 0.0000 4 150 690 5400 6255 MIDICC\001
4 1 0 50 -1 18 12 0.0000 4 135 315 6300 6255 103\001
4 1 0 50 -1 18 12 0.0000 4 195 300 6750 6255 pot\001
-4 1 0 45 -1 18 12 0.0000 4 150 435 4185 6030 dev1\001
+4 1 0 45 -1 18 12 0.0000 4 150 615 4185 6030 Gizmo\001
4 1 0 50 -1 18 12 0.0000 4 150 1050 10350 3555 Translators\001
4 1 0 30 -1 14 20 0.0000 4 270 3315 5625 4050 var = range(aux);\001
4 1 0 50 -1 18 12 0.0000 4 150 525 4815 6030 Name\001
@@ -144,7 +144,7 @@ Single
4 1 0 50 -1 18 12 0.0000 4 150 345 6750 6030 Dev\001
4 1 0 50 -1 18 12 0.0000 4 150 330 6345 6030 Ctrl\001
4 1 0 50 -1 18 12 0.0000 4 150 480 5895 6030 Chan\001
-4 1 0 45 -1 18 12 0.0000 4 150 435 4185 7380 dev2\001
+4 1 32 45 -1 18 12 0.0000 4 150 435 4185 7380 Frob\001
4 1 0 50 -1 18 12 0.0000 4 150 1500 5490 8820 Device database\001
4 1 0 50 -1 18 12 0.0000 4 150 330 8955 8370 Ctrl\001
4 1 0 50 -1 18 12 0.0000 4 150 435 9450 8370 Proc\001
38 src/compiler/doc/floats.inc
View
@@ -0,0 +1,38 @@
+\newcommand{\figarch}{
+\begin{figure}[!tb]
+\begin{center}
+\includegraphics{arch.pdf}
+\end{center}
+\caption{Input event processing in Flickernoise.}
+\label{arch}
+\end{figure}}
+
+\newcommand{\figmsg}{
+\begin{figure}[!tb]
+\begin{center}
+\includegraphics{msg.pdf}
+\end{center}
+\caption{Anatomy of a MIDI Control Change message.}
+\label{msg}
+\end{figure}}
+
+\newcommand{\figbind}{
+\begin{figure}[!tb]
+\begin{center}
+\includegraphics{bind.pdf}
+\end{center}
+\caption{When binding a control variable, information from the device
+ database, a translation map, and the table of patch variables is
+ combined into a stimulus entry.}
+\label{bind}
+\end{figure}}
+
+\newcommand{\figstim}{
+\begin{figure}[!tb]
+\begin{center}
+\includegraphics{stim.pdf}
+\end{center}
+\caption{When a MIDI control message is received, Flickernoise looks
+ for a matching stimulus and processes the value accordingly.}
+\label{stim}
+\end{figure}}
249 src/compiler/doc/midi.tex
View
@@ -4,13 +4,14 @@
\usepackage{fullpage}
\usepackage{parskip}
\usepackage{booktabs}
-\usepackage{epsfig}
\usepackage{moreverb}
\usepackage{nicefrac}
\newenvironment{expose}{\vskip3mm\qquad\begin{raggedright}}{%
\end{raggedright}\vskip3mm}
+\input floats.inc
+
\begin{document}
\title{Using MIDI in Flickernoise Patches}
@@ -19,10 +20,6 @@
\maketitle
-\begin{abstract}
-This document describes how MIDI
-\end{abstract}
-
%\setcounter{tocdepth}{1}
\tableofcontents
@@ -36,7 +33,7 @@ \section{Introduction}
\item the MIDI device specifications should not have to be part of
patches,
\item Flickernoise should only consider devices that are really present, and
- \item we should support other events that just MIDI control message,
+ \item we should support other events than just MIDI control message,
such as other MIDI message types, DMX, keyboard, IR remote, etc.
\end{itemize}
@@ -56,6 +53,7 @@ \section{Quick start}
aux = pot(103);
but1 = button(16);
but2 = button(17);
+ select = switch(24);
}
sensitivity = range(main);
@@ -67,15 +65,16 @@ \section{Quick start}
In lines 1 through 6 we describe the controls the MIDI device called
``Gizmo'' provides. In this case, we have one fader, one potentiometer,
-and two buttons. We assign them names that represent their role: {\tt main}
+two buttons, and one switch. We assign them names that represent their
+role: {\tt main}
for the principal fader, {\tt aux} for the potentiometer, and so on.
The numbers are the respective MIDI controller numbers the device uses.
They can be found with the MIDI monitor function of the ``MIDI settings''
dialog in Flickernoise.
-In line 8, we bind the {\tt main} control to a variable. This variable is
-then used in per-frame and per-vertex equations. As line 12 shows, one
+In line 9, we bind the {\tt main} control to a variable. This variable is
+then used in per-frame and per-vertex equations. As line 13 shows, one
can also change this variable, e.g., to make the sensitivity slowly decay
if there is no input from the MIDI device.
@@ -83,21 +82,37 @@ \section{Quick start}
% -----------------------------------------------------------------------------
+\figarch
+
+
\section{Architecture}
-When a MIDI device is1
-\begin{figure}[!tb]
-\begin{center}
-\includegraphics{arch.pdf}
-\end{center}
-\caption{Input event processing in Flickernoise.}
-\label{arch}
-\end{figure}
+For each MIDI device, an entry in the device database is selected.
+This entry describes the characteristics of the elements of the MIDI
+device, e.g., what kind of control elements they are and what
+addresses they use.
+
+A patch using MIDI devices binds control elements to variables.
+When binding, the patch specifies how it expects the element to
+behave, e.g., whether it should produce continuous values between
+0 and 1 or just 0 when ''off'' and 1 when ''on''.
+
+Event messages from the MIDI device identify the element they
+belong to and carry a numeric value indicating the element's state.
+This value is translated according to the element's characteristics
+from the device database combined with the expected function from
+the patch.
+
+Finally, result is stored in the control variable where it can
+then be used by the equations in the patch.
% - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+\figmsg
+
+
\subsection{MIDI control messages}
A MIDI device sends a message each time one of its elements is actuated.
@@ -109,14 +124,6 @@ \subsection{MIDI control messages}
MIDI device generates a MIDI Control Change messages, as shown in
figure \ref{msg}.
-\begin{figure}[!tb]
-\begin{center}
-\includegraphics{msg.pdf}
-\end{center}
-\caption{Anatomy of a MIDI Control Change message.}
-\label{msg}
-\end{figure}
-
Channel numbers are encoded as values from 0 to 15 in the actual
MIDI message but are commonly presented as 1 to 16 to the user.
Also Flickernoise follows this convention.
@@ -132,10 +139,20 @@ \subsection{MIDI control messages}
% - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-\subsection{@@@}
+\subsection{Control variables}
+Patches communicate with the outside world though variables. MIDI
+control input is no exception. Instead of using pre-defined names
+like it is the case for {\tt time}, {\tt bass}, etc., the names of
+MIDI control variables can be chosen freely.
+
+Values from MIDI controls are usually translated to
+the range 0 to 1. This can be as simple a division by 127.
+Section \ref{binding} describes more ways to translate MIDI messages.
+
+Updates of control variables are synchronized with patch execution
+such that updates never happen while the patch is running.
-@@@
% -----------------------------------------------------------------------------
@@ -144,6 +161,8 @@ \section{Using controls in patches}
@@@
+
+
% - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
@@ -169,13 +188,18 @@ \subsection{Device database}
{\em channel} is the MIDI channel number, from 1 to 16. If the channel
is omitted, the element will match any channel.
+{\em control\_number}
+
+This is the example from the quick start section with channel numbers
+added:
+
\begin{listing}{1}
-midi "dev1" {
+midi "Gizmo" {
main = fader(1, 102);
aux = pot(1, 103);
but1 = button(1, 16);
but2 = button(1, 17);
- sw = switch(1, 24);
+ select = switch(1, 24);
}
\end{listing}
@@ -184,6 +208,7 @@ \subsection{Device database}
\subsection{Binding}
+\label{binding}
In order to use a control in a patch, we have to establish a connection
between the control element (in the device database) and a patch
@@ -227,30 +252,17 @@ \subsection{Binding}
{\em element\_name} is the name of the control element, as in the
device database.
-\begin{figure}[!tb]
-\begin{center}
-\includegraphics{bind.pdf}
-\end{center}
-\caption{When binding a control variable, information from the device
- database, a translation map, and the table of patch variables is
- combined into a stimulus entry.}
-\label{bind}
-\end{figure}
+\figbind
+
+@@@
% - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-\subsection{Event processing}
+\figstim
-\begin{figure}[!tb]
-\begin{center}
-\includegraphics{stim.pdf}
-\end{center}
-\caption{When a MIDI control message is received, Flickernoise looks
- for a matching stimulus and processes the value accordingly.}
-\label{stim}
-\end{figure}
+\subsection{Event processing}
Figure \ref{stim} illustrates how events are translated into changes
of control variables.
@@ -272,7 +284,7 @@ \subsection{Event processing}
\subsection{Writing to control variables}
-A patch can overwrite the values control variables. In the case of
+A patch can overwrite the values of control variables. In the case of
per-frame variables, they retain their modified content across
frames until a new event arrives. The new event will always overwrite
the previous value of the variable without regard for any changes that
@@ -309,13 +321,13 @@ \subsection{Writing to control variables}
% -----------------------------------------------------------------------------
-\section{Control devices}
+\section{Control elements}
-In the section below, we describe the various control elements, their
-declaration, and their behaviour. In the example, we show the physical
-state of the element, the value a MIDI control may typically send for
-the element in that state, and then the resulting values for the
-various translations.
+In the sections below, we describe the various control elements, who
+they are described in the device database, and their behaviour. We
+give examples, that show the physical state of the element, the value
+a MIDI control may typically send for the element in that state, and
+then the resulting values for the various translations.
Since {\tt range}, {\tt unbounded}, and {\tt cycle} only differ from
each other in one case, they are usually abbreviated as just
@@ -394,7 +406,7 @@ \subsection{Rotary potentiometers}
in the next section.
The example below shows a potentiometer that travels over an angle
-of $270^{\circ}$:
+of $270^\circ$:
\begin{expose}
\begin{tabular}{lccccl}
@@ -418,6 +430,7 @@ \subsection{Rotary potentiometers}
\subsection{Rotary encoders acting as potentiometers}
+\label{encpot}
Rotary encoders look similar to potentiometers but differ from them
by not having a mechanical stop. This means that they can be turned
@@ -431,8 +444,8 @@ \subsection{Rotary encoders acting as potentiometers}
{\tt pot} and bound with {\tt range}.
The example below shows a rotary encoder covering the full value range
-in one $360^{\circ}$ turn that is first turned $450^{\circ}$ clockwise
-and then $45^{\circ}$ counterclockwise:
+in one $360^\circ$ turn that is first turned $450^\circ$ clockwise
+and then $45^\circ$ counterclockwise:
\begin{expose}
\begin{tabular}{lcccccl}
@@ -452,8 +465,15 @@ \subsection{Rotary encoders acting as potentiometers}
\end{tabular}
\end{expose}
-Note that it stops at MIDI value 127 at the third turn and the
-remaining $90^{\circ}$ are ignored.
+The encoder stops at MIDI value 127 at the third turn and the
+remaining $90^\circ$ are ignored.
+
+Note that the the above is a bit simplified. Rotary encoders commonly
+found in MIDI devices only have 20--30 positions per full turn. When
+turning them slowly, it therefore takes several full turns to cross
+the entire range. To permit quick changes, MIDI controllers usually
+change the value in steps larger than one when the encoder is turned
+rapidly.
% - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
@@ -588,6 +608,42 @@ \subsection{One-way buttons}
\subsection{Differential encoders}
\label{diff}
+The rotary encoders of some controllers send differential values
+instead of the usual absolute values. Differential values allows
+Flickernoise not only to translate them to absolute values, but
+also enables more sophisticated translations.
+
+Differential values are encoded as signed 7 bit numbers. This means
+that values in the range 0--63 represent an increase by that amount
+while values in the range 0--127 represent a decrease by 128 minus
+the value. E.g., a value of 127 would mean a decrease by one.
+
+Differential encoders are declared with {\tt differential()}:
+
+\begin{listing}{1}
+midi ... {
+ name = differential(...);
+}
+\end{listing}
+
+There are three distinct options for binding them to continuous values:
+with {\tt range()}, the
+emulate potentiometers with a range from 0 to 1. With {\tt unbounded},
+the control variable can also assume values below 0 or above 1. Finally,
+{\tt cyclic} limits the control variable to a range from 0 to 1 but
+makes it wrap from 1 to 0 when increasing, and from 0 to 1 when
+decreasing.
+
+\begin{listing}{1}
+var1 = range(name1);
+var2 = unbounded(name2);
+var3 = cyclic(name3);
+\end{listing}
+
+This example illustrates the values that result for the different
+translations when turning an encoder that needs one $360^\circ$ turn
+for the full value range by a total of $405^\circ$:
+
\begin{expose}
\begin{tabular}{lccccccl}
\raisebox{6mm}{User input} &
@@ -595,20 +651,83 @@ \subsection{Differential encoders}
\includegraphics{dial-90.pdf} &
\includegraphics{dial-180.pdf} &
\includegraphics{dial-360.pdf} &
+ \includegraphics{dial-405.pdf} \\
+ \cmidrule(r){1-6}
+ MIDI value &
+ & 32 & 32 & 63 & 16 \\
+ \midrule
+ Translation
+ & 0 & 0.25 & 0.5 & 1 & 1 & \tt range \\
+ & 0 & 0.25 & 0.5 & 1 & 1.125 & \tt unbounded \\
+ & 0 & 0.25 & 0.5 & 0 & 0.125 & \tt cyclic \\
+\end{tabular}
+\end{expose}
+
+Continuing the example above, we turn the controller now by
+$90^\circ$ in a counterclockwise direction:
+
+\begin{expose}
+\begin{tabular}{lccl}
+ \raisebox{6mm}{User input} &
+ \includegraphics{dial-405-idle.pdf} &
+ \includegraphics{dial-315.pdf} \\
+ \cmidrule(r){1-3}
+ MIDI value &
+ & 96 \\
+ \midrule
+ Translation
+ & 1 & 0.75 & \tt range \\
+ & 1.125 & 0.875 & \tt unbounded \\
+ & 0.125 & 0.875 & \tt cyclic \\
+\end{tabular}
+\end{expose}
+
+Starting from zero again, we now turn the controller first
+$45^\circ$ clockwise and then $450^\circ$ counterclockwise:
+
+\begin{expose}
+\begin{tabular}{lcccccl}
+ \raisebox{6mm}{User input} &
+ \includegraphics{dial-0.pdf} &
\includegraphics{dial-405.pdf} &
+ \includegraphics{dial-315.pdf} &
+ \includegraphics{dial-135.pdf} &
+ \includegraphics{dial-315f.pdf} \\
+ \cmidrule(r){1-6}
+ MIDI value &
+ & 16 & 96 & 64 & 64 \\
+ \midrule
+ Translation
+ & 0 & 0.125 & 0 & 0 & 0 & \tt range \\
+ & 0 & 0.125 & -0.125 & -0.625 & -1.125 & \tt unbounded \\
+ & 0 & 0.125 & 0.875 & 0.375 & 0.875 & \tt cyclic \\
+\end{tabular}
+\end{expose}
+
+When emulation a button or a switch, any clockwise turn will set the
+control variable to 1 while any counterclockwise turn will set it to
+zero:
+
+\begin{expose}
+\begin{tabular}{lccccl}
+ \raisebox{6mm}{User input} &
+ \includegraphics{dial-0.pdf} &
+ \includegraphics{dial-90.pdf} &
+ \includegraphics{dial-45.pdf} &
\includegraphics{dial-315.pdf} \\
- \cmidrule(r){1-7}
+ \cmidrule(r){1-5}
MIDI value &
- & 32 & 32 & 64 & 16 & 96 \\
+ & 32 & 112 & 96 \\
\midrule
Translation
- & 0 & 0.25 & 0.5 & 1 & 1 & 0.75 & \tt range \\
- & 0 & 0.25 & 0.5 & 1 & 1.125 & 0.875 & \tt unbounded \\
- & 0 & 0.25 & 0.5 & 0 & 0.125 & 0.875 & \tt cyclic \\
-% & 0 & 1 & 1 & 0 & \tt button, switch \\
+ & 0 & 1 & 0 & 0 & \tt button, switch \\
\end{tabular}
\end{expose}
+Like the rotary encoders emulating potentiometers described in section
+\ref{encpot}, the values a device sends for differential encoders may be
+increased if turning rapidly.
+
% The control variable can assume any value, including negative
% values and values greater than one. This can be used with
% certain rotary encoders. If the device in question has no
Please sign in to comment.
Something went wrong with that request. Please try again.