1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
|
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<!--Converted with LaTeX2HTML 2008 (1.71)
original version by: Nikos Drakos, CBLU, University of Leeds
* revised and updated by: Marcus Hennecke, Ross Moore, Herb Swan
* with significant contributions from:
Jens Lippmann, Marek Rouchal, Martin Wilck and others -->
<HTML>
<HEAD>
<TITLE>Automation</TITLE>
<META NAME="description" CONTENT="Automation">
<META NAME="keywords" CONTENT="developer_docs">
<META NAME="resource-type" CONTENT="document">
<META NAME="distribution" CONTENT="global">
<META HTTP-EQUIV="Content-Type" CONTENT="text/html; charset=utf-8">
<META NAME="Generator" CONTENT="LaTeX2HTML v2008">
<META HTTP-EQUIV="Content-Style-Type" CONTENT="text/css">
<LINK REL="STYLESHEET" HREF="developer_docs.css">
<LINK REL="previous" HREF="node6.html">
<LINK REL="up" HREF="node6.html">
<LINK REL="next" HREF="node8.html">
</HEAD>
<BODY >
<DIV CLASS="navigation"><!--Navigation Panel-->
<A NAME="tex2html148"
HREF="node8.html">
<IMG WIDTH="37" HEIGHT="24" ALIGN="BOTTOM" BORDER="0" ALT="next"
SRC="/usr/share/latex2html/icons/next.png"></A>
<A NAME="tex2html144"
HREF="node6.html">
<IMG WIDTH="26" HEIGHT="24" ALIGN="BOTTOM" BORDER="0" ALT="up"
SRC="/usr/share/latex2html/icons/up.png"></A>
<A NAME="tex2html140"
HREF="node6.html">
<IMG WIDTH="63" HEIGHT="24" ALIGN="BOTTOM" BORDER="0" ALT="previous"
SRC="/usr/share/latex2html/icons/prev.png"></A>
<A NAME="tex2html146"
HREF="node1.html">
<IMG WIDTH="65" HEIGHT="24" ALIGN="BOTTOM" BORDER="0" ALT="contents"
SRC="/usr/share/latex2html/icons/contents.png"></A>
<BR>
<B> Next:</B> <A NAME="tex2html149"
HREF="node8.html">Feature requests</A>
<B> Up:</B> <A NAME="tex2html145"
HREF="node6.html">Design decisions</A>
<B> Previous:</B> <A NAME="tex2html141"
HREF="node6.html">Design decisions</A>
<B> <A NAME="tex2html147"
HREF="node1.html">Contents</A></B>
<BR>
<BR></DIV>
<!--End of Navigation Panel-->
<!--Table of Child-Links-->
<A NAME="CHILD_LINKS"><STRONG>Subsections</STRONG></A>
<UL CLASS="ChildLinks">
<LI><UL>
<LI><UL>
<LI><A NAME="tex2html150"
HREF="node7.html#SECTION00310010000000000000">Maintaining a slave control list</A>
<LI><A NAME="tex2html151"
HREF="node7.html#SECTION00310020000000000000">Holding iterators</A>
<LI><A NAME="tex2html152"
HREF="node7.html#SECTION00310030000000000000">Just use the current data access functions</A>
</UL></UL></UL>
<!--End of Table of Child-Links-->
<HR>
<H1><A NAME="SECTION00310000000000000000">
Automation</A>
</H1>
As of revision 1490, automation is handled in two ways: User-generated
(live) automation data (generated by the user moving sliders while playing)
is fed into <TT>fterfirstP`P=95 _ `P=58 :
`P>64
`P<91 PPP
<`<=95 _ `<=58 :
`<>64
`<<91 <<<
c@amelhyph<269>>luginI::_controlFifo</TT>. Automation data is kept
in <TT>fterfirstA`A=95 _ `A=58 :
`A>64
`A<91 AAA
<`<=95 _ `<=58 :
`<>64
`<<91 <<<
c@amelhyph<269>>udioTrack::_controller</TT>, which is a <TT>fterfirstC`C=95 _ `C=58 :
`C>64
`C<91 CCC
<`<=95 _ `<=58 :
`<>64
`<<91 <<<
c@amelhyph<269>>trlListList</TT>,
that is, a list of <TT>fterfirstC`C=95 _ `C=58 :
`C>64
`C<91 CCC
<`<=95 _ `<=58 :
`<>64
`<<91 <<<
c@amelhyph<269>>trlList</TT>s, that is, a list of lists of
controller-objects which hold the control points of the automation graph.
The <TT>fterfirstC`C=95 _ `C=58 :
`C>64
`C<91 CCC
<`<=95 _ `<=58 :
`<>64
`<<91 <<<
c@amelhyph<269>>trlList</TT> also stores whether the list is meant discrete
(a new control point results in a value-jump) or continous (a new control
point results in the value slowly sloping to the new value).
<P>
While <TT>fterfirstP`P=95 _ `P=58 :
`P>64
`P<91 PPP
<`<=95 _ `<=58 :
`<>64
`<<91 <<<
c@amelhyph<269>>luginI::_controlFifo</TT> can be queried very quickly and
thus is processed with a very high resolution (only limited by the
minimum control period setting), the automation value are expensive to
query, and are only processed once in an audio <SPAN CLASS="textit">driver</SPAN> period.
This might lead to noticeable jumps in value.
<P>
This could possibly be solved in two ways:
<H4><A NAME="SECTION00310010000000000000">
Maintaining a slave control list</A>
</H4>
This approach would maintain a fully redundant slave control list,
similar to <TT>fterfirstP`P=95 _ `P=58 :
`P>64
`P<91 PPP
<`<=95 _ `<=58 :
`<>64
`<<91 <<<
c@amelhyph<269>>luginI::_controlFifo</TT>. This list must be updated
every time any automation-related thing is changed, and shall contain
every controller change as a tuple of controller number and value.
This could be processed in the same loop as <TT>fterfirstP`P=95 _ `P=58 :
`P>64
`P<91 PPP
<`<=95 _ `<=58 :
`<>64
`<<91 <<<
c@amelhyph<269>>luginI::_controlFifo</TT>,
making it comfortable to implement; furthermore, it allows to cleanly
offer automation-settings at other places in future (such as storing
automation data in parts or similar).
<P>
<H4><A NAME="SECTION00310020000000000000">
Holding iterators</A>
</H4>
We also could hold a list of iterators of the single <TT>fterfirstC`C=95 _ `C=58 :
`C>64
`C<91 CCC
<`<=95 _ `<=58 :
`<>64
`<<91 <<<
c@amelhyph<269>>trlList</TT>s.
This would also cause low CPU usage, because usually, the iterators only
need to be incremented once. However, it is pretty complex to implement,
because the iterators may become totally wrong (because of a seek in the
song), and we must iterate through a whole list of iterators.
<P>
<H4><A NAME="SECTION00310030000000000000">
Just use the current data access functions</A>
</H4>
By just using the current functions for accessing automation data,
we might get a quick-and-dirty solution, which however wastes way too
much CPU ressources. This is because on <SPAN CLASS="textit">every single frame</SPAN>, we
need to do a binary search on multiple controller lists.
<P>
<DIV CLASS="navigation"><HR>
<!--Navigation Panel-->
<A NAME="tex2html148"
HREF="node8.html">
<IMG WIDTH="37" HEIGHT="24" ALIGN="BOTTOM" BORDER="0" ALT="next"
SRC="/usr/share/latex2html/icons/next.png"></A>
<A NAME="tex2html144"
HREF="node6.html">
<IMG WIDTH="26" HEIGHT="24" ALIGN="BOTTOM" BORDER="0" ALT="up"
SRC="/usr/share/latex2html/icons/up.png"></A>
<A NAME="tex2html140"
HREF="node6.html">
<IMG WIDTH="63" HEIGHT="24" ALIGN="BOTTOM" BORDER="0" ALT="previous"
SRC="/usr/share/latex2html/icons/prev.png"></A>
<A NAME="tex2html146"
HREF="node1.html">
<IMG WIDTH="65" HEIGHT="24" ALIGN="BOTTOM" BORDER="0" ALT="contents"
SRC="/usr/share/latex2html/icons/contents.png"></A>
<BR>
<B> Next:</B> <A NAME="tex2html149"
HREF="node8.html">Feature requests</A>
<B> Up:</B> <A NAME="tex2html145"
HREF="node6.html">Design decisions</A>
<B> Previous:</B> <A NAME="tex2html141"
HREF="node6.html">Design decisions</A>
<B> <A NAME="tex2html147"
HREF="node1.html">Contents</A></B> </DIV>
<!--End of Navigation Panel-->
</BODY>
</HTML>
|