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 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 369 370 371 372 373 374 375 376 377 378 379 380 381 382 383 384 385 386 387 388 389 390 391 392 393 394 395 396 397 398 399 400 401 402 403 404 405 406 407 408 409 410 411 412 413 414 415 416 417 418 419 420 421 422 423
|
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE article PUBLIC "-//OASIS//DTD DocBook XML V4.1.2//EN" "http://www.oasis-open.org/docbook/xml/4.1.2/docbookx.dtd" [
<!ENTITY legal SYSTEM "legal.xml">
<!ENTITY appversion "2.18">
<!ENTITY manrevision "2.8">
<!ENTITY date "February 2007">
<!ENTITY app "<application>Good ViBrations</application>">
<!ENTITY appname "Gvb">
]>
<!--
(Do not remove this comment block.)
Maintained by the GNOME Documentation Project
http://developer.gnome.org/projects/gdp
Template version: 2.0 beta
Template last modified Feb 12, 2002
-->
<!-- =============Document Header ============================= -->
<article id="index" lang="en_GB">
<!-- please do not change the id; for translations, change lang to -->
<!-- appropriate code -->
<articleinfo>
<title>Good ViBrations</title>
<copyright>
<year>2009</year>
<holder>Pietro Battiston</holder>
</copyright>
<!-- translators: uncomment this:
<copyright>
<year>2009</year>
<holder>ME-THE-TRANSLATOR (Latin translation)</holder>
</copyright>
-->
<!-- An address can be added to the publisher information. If a role is
not specified, the publisher/author is the same for all versions of the
document. -->
<publisher role="maintainer">
<publishername>Pietro Battiston (<email>toobaz@email.it</email>)</publishername>
</publisher>
<legalnotice id="legalnotice">
<para>This document is made available under the Creative Commons ShareAlike 3.0 License (CC-BY-SA).</para>
<para>This documentation is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE AS DESCRIBED IN THE DISCLAIMER.</para>
<para>A copy of the licence is available <ulink url="http://creativecommons.org/licenses/by-sa/3.0">here</ulink>.</para>
</legalnotice>
<!-- This file contains link to license for the documentation (GNU FDL), and
other legal stuff such as "NO WARRANTY" statement. Please do not change
any of this. -->
<authorgroup>
<author>
<firstname>Pietro</firstname>
<surname>Battiston</surname>
<affiliation>
<orgname>GVB developer</orgname>
</affiliation>
</author>
<!-- This is appropriate place for other contributors: translators,
maintainers, etc. Commented out by default.
<othercredit role="translator">
<firstname>Latin</firstname>
<surname>Translator 1</surname>
<affiliation>
<orgname>Latin Translation Team</orgname>
<email>translator@gnome.org</email>
</affiliation>
<contrib>Latin translation</contrib>
</othercredit>
-->
</authorgroup>
<revhistory>
<revision>
<revnumber>Gvb manual 1.0</revnumber>
<date>November 2009</date>
<revdescription>
<para role="author">Pietro Battiston <email>toobaz@email.it</email></para>
<para role="publisher">Pietro Battiston</para>
</revdescription>
</revision>
</revhistory>
<releaseinfo>This manual describes version 1.2 of Good ViBrations (GVB).</releaseinfo>
<legalnotice>
<title>Feedback</title>
<para>To report a bug or make a suggestion regarding the <application>Good ViBrations</application> application or this manual, please use the project's <ulink url="https://bugs.launchpad.net/gvb" type="help">Launchpad page</ulink>.</para>
<!-- Translators may also add here feedback address for translations -->
</legalnotice>
<abstract role="description">
<para>User manual for <application>Good ViBrations</application>.</para>
</abstract>
</articleinfo>
<indexterm>
<primary>Good ViBrations</primary>
</indexterm>
<!-- ============= Document Body ============================= -->
<!-- ============= Introduction ============================== -->
<sect1 id="introduction">
<title>Introduction</title>
<para><application>Good ViBrations</application> is an application that can simulate 1 and 2-dimensional vibrations.</para>
<sect2 id="using">
<title>Good ViBrations main window</title>
<para>The vast majority of <application>Good ViBrations</application> functionalities can be accessed directly from the main screen:</para>
<figure id="main-window">
<title>GVB main window</title>
<screenshot>
<mediaobject>
<imageobject>
<imagedata fileref="figures/main_window.png" format="PNG"/>
</imageobject>
<textobject> <phrase>Shows the GVB main window.</phrase>
</textobject>
</mediaobject>
</screenshot>
</figure>
<para>On the left, the main action area can be seen, where the simulation is visualized.</para>
<para>On the right are the various controls and indicators: press <guibutton>Start</guibutton> to see them in action.</para>
<itemizedlist>
<listitem>
<para><guilabel>Speed</guilabel>: sets the speed at which the simulation evolves.</para>
</listitem>
<listitem>
<para><guilabel>Step</guilabel>: in those calculation methods which operate in discrete time (see <xref linkend="calculation-methods"/> for more info), this sets the time between an iteration and the following. Notice that the lower the value, the higher will be the precision of the simulation but also the computational effort required.</para>
</listitem>
<listitem>
<para>Below <guilabel>Step</guilabel>, is the counter, showing how many frames were calculated from the beginning of the simulation.</para>
</listitem>
<listitem>
<para><guilabel>calculation ms.</guilabel> shows the milliseconds which were spent, on average, in calculations for each frame (in the last 2 seconds).</para>
</listitem>
<listitem>
<para><guilabel>drawing ms.</guilabel> shows the milliseconds which were spent, on average, in graphically rendering each frame (in the last 2 seconds).</para>
</listitem>
<listitem>
<para><guilabel>Rope</guilabel> and <guilabel>Membrane</guilabel> allow to switch between (respectively) 1 dimension and 2 dimensions simulations. Changing this will stop and reset the animation.</para>
</listitem>
<listitem>
<para>Below, the button <guibutton>Start</guibutton> now shows <guibutton>Stop</guibutton>: push it in order to stop the animation.</para>
</listitem>
<listitem>
<para><guilabel>Calculation</guilabel>: sets the calculation method used. See <xref linkend="calculation-methods"/> for a list of methods and their descriptions.</para>
</listitem>
<listitem>
<para><guilabel>Frames/second</guilabel>: sets the number of frames shown per second. Under 20, the animation can appear choppy, but over 25, almost no improvement should be noticed (and the computational effort will increase for calculation methods operating in continuous time).</para>
</listitem>
<listitem>
<para><guilabel>Graphics</guilabel>: sets the drawing method used. See <xref linkend="drawing-methods"/> for a list of methods and their descriptions.</para>
</listitem>
</itemizedlist>
<warning>
<title>Beware excessive precision!</title>
<para><guilabel>Speed</guilabel>, <guilabel>Step</guilabel> and <guilabel>Frames/second</guilabel> are key parameters (together with the number of points used - see <xref linkend="number-of-points"/>) to determine the number of mathematical operations the computer must perform for each second of simulation: if excessive values are chosen, the animation may become choppy, or <application>Good ViBrations</application> may even freeze, becoming unresponsive. In this case, click <guibutton>Stop</guibutton> (only once): in most cases, the interface will be responsive again in few seconds.</para>
</warning>
</sect2>
<sect2 id="menu-file">
<title>The <guimenu>File</guimenu> menu</title>
<para>The <guimenu>File</guimenu> menu lists some general operations:</para>
<itemizedlist>
<listitem>
<para><menuchoice><guimenu>File</guimenu><guimenuitem>Open</guimenuitem></menuchoice>: open a disposition (the definition of points positions and speeds) from a file.</para>
</listitem>
<listitem>
<para><menuchoice><guimenu>File</guimenu><guimenuitem>Save</guimenuitem></menuchoice>: save the disposition and speed of points to a file.</para>
</listitem>
<listitem>
<para><menuchoice><guimenu>File</guimenu><guimenuitem>Save As</guimenuitem></menuchoice>: save the disposition and speed of points to a new file (if you still didn't save any disposition, this is equivalent to <menuchoice><guimenu>File</guimenu><guimenuitem>Save</guimenuitem></menuchoice>).</para>
</listitem>
<listitem>
<para><menuchoice><guimenu>File</guimenu><guimenuitem>Quit</guimenuitem></menuchoice>: exit <application>Good ViBrations</application>.</para>
</listitem>
</itemizedlist>
</sect2>
<sect2 id="menu-disposition">
<title>The <guimenu>Disposition</guimenu> menu</title>
<para>The <guimenu>Disposition</guimenu> menu allows to set the shape of the string or of the membrane at the start of the simulation. This can be done in two ways:</para>
<itemizedlist>
<listitem>
<para>by choosing one of the <guimenuitem>precooked</guimenuitem> dispositions: a collection of them is available, in both 1 and 2 dimensions,</para>
</listitem>
<listitem>
<para>by opening the <guimenuitem>advanced</guimenuitem> editor, also available for both 1 and 2 dimensions (see <xref linkend="advanced-editor"/>).</para>
</listitem>
</itemizedlist>
</sect2>
<sect2 id="menu-options">
<title>The <guimenu>Options</guimenu> menu</title>
<para>The <guimenu>Options</guimenu> menu allows to configure some aspects of the simulation.</para>
<itemizedlist>
<listitem>
<para><menuchoice><guimenu>Options</guimenu><guimenuitem>Number of points</guimenuitem></menuchoice>: change the number of points used in the simulation (see <xref linkend="number-of-points"/>).</para>
</listitem>
<listitem>
<para><menuchoice><guimenu>Options</guimenu><guimenuitem>Save frames as png</guimenuitem></menuchoice>: if this checkbox is toggled, the animation will be saved to disk instead of being rendered to screen: see <xref linkend="dump-to-png"/> for more information.</para>
</listitem>
</itemizedlist>
</sect2>
<sect2 id="menu-help">
<title>The <guimenu>Help</guimenu> menu</title>
<para>The <guimenu>Help</guimenu> menu can be used to access informations about the program.</para>
<itemizedlist>
<listitem>
<para><menuchoice><guimenu>Help</guimenu><guimenuitem>Contents</guimenuitem></menuchoice>: open this help.</para>
</listitem>
<listitem>
<para><menuchoice><guimenu>Help</guimenu><guimenuitem>About</guimenuitem></menuchoice>: show some informations about Good ViBrations.</para>
</listitem>
</itemizedlist>
</sect2>
</sect1>
<!--============== Number of points ===========-->
<sect1 id="number-of-points">
<title>Changing the number of points</title>
<para>In <application>Good ViBrations</application>, the string and the membrane are approximated as some points connected by straight lines. The higher the number of points, the higher the quality of the simulation, but also number of computational operations required to perform it. To change the number of points, click <menuchoice><guimenu>Options</guimenu><guimenuitem>Number of points</guimenuitem></menuchoice>.</para>
<warning>
<para>
When this dialog is opened, the animation, if running, will automatically pause and, if the number of points is then indeed changed, will reset to its initial disposition, since <application>Good ViBrations</application> is not able to change the number of points of a running simulation.
</para>
</warning>
<para>While in 1 dimension any number is equally acceptable, in 2 dimensions the points must be placed on a rectangular (and almost square) grid. If the number chosen does not fit, less points will be used. For instance, if the number of points chosen is 11, only 9 will be used (3×3), if it is 14, only 12 will be used (3×4).</para>
<warning>
<title>When points are too many</title>
<para>
The number of points used is a key factor in determining the computational requirements to perform the simulation: performance may deteriorate very fast with their increase in number, and while some number between 100 and 150 should be acceptable on any computer, a number above those values may cause the interface to be unresponsive (depending also on the calculation method chosen - see <xref linkend="calculation-methods"/> - and on the value of the others parameters explained in <xref linkend="using"/>).
</para>
</warning>
<tip>
<para>
If you want to observe harmonics, some optimal number can be found in the following way:
<itemizedlist>
<listitem>
<para>take a number with many small factors, for instance 2×2×3=12,</para>
</listitem>
<listitem>
<para>substract 1: 11.</para>
</listitem>
<listitem>
<para>if you want to perform a bidimensional simulation, take its square: 11×11=121.</para>
</listitem>
</itemizedlist>
This example will allow you to observe optimally the second, fourth and third harmonics.
</para>
</tip>
</sect1>
<sect1 id="drawing-methods">
<title>Drawing methods</title>
<para><application>Good ViBrations</application> has three different ways of rendering a simulation, both in 1 and 2 dimensions, accessible through the drop-down box:</para>
<itemizedlist>
<listitem>
<para><guilabel>wave</guilabel>/<guilabel>3D</guilabel> the points are drawn at different heights (in perspective, if working in 2 dimensions), resulting in something indeed similar to a string or to a membrane;</para>
</listitem>
<listitem>
<para><guilabel>speeds</guilabel> is similar to the former, but it also shows the current speed of each point, in the form of a red segment oriented in the direction of movement;</para>
</listitem>
<listitem>
<para><guilabel>geo</guilabel> shows the heights as a geographical maps would show altitudes: points are represented by squares, with colours varying from dark blue (lowest points) to light blue, green, brown, dark brown and finally white (highest points).</para>
</listitem>
</itemizedlist>
</sect1>
<!-- ============= Advanced editor ============================== -->
<sect1 id="advanced-editor">
<title>The advanced dispositions editor</title>
<para>By clicking <menuchoice><guimenu>Dispositions</guimenu><guimenuitem>1 dimension: advanced</guimenuitem></menuchoice> or <menuchoice><guimenu>Dispositions</guimenu><guimenuitem>2 dimensions: advanced</guimenuitem></menuchoice>, the advanced dispositions editor opens. This is a window that allows to configure the starting position of the string or of the membrane interactively, with much more freedom than by just taking one of the <guimenuitem>precooked</guimenuitem> dispositions.</para>
<figure id="advanced-editor-2d">
<title>The advanced editor in 2 dimensions</title>
<screenshot>
<mediaobject>
<imageobject>
<imagedata fileref="figures/advanced_editor_2d.png" format="PNG"/>
</imageobject>
<textobject> <phrase>Shows the GVB advanced editor.</phrase>
</textobject>
</mediaobject>
</screenshot>
</figure>
<para>On the top, the <guilabel>Graphics</guilabel> drop-down box makes it possible to change the visualization of the disposition in the editor, similarly to what could be done in the main window. Notice that in this case there is no particular difference between <guilabel>wave</guilabel>/<guilabel>3D</guilabel> and <guilabel>speeds</guilabel>, since there is no speed involved.</para>
<para>The advanced editor works by tuning the parameters of given wave shapes and combining them. On the left, a preview of the disposition makes it possible to see changes as they are applied. On the right are the various controls that can be used to tune the shape until it is as desired.</para>
<sect2 id="dimension-specific-controls">
<title>Dimension-speficic controls</title>
<itemizedlist>
<listitem>
<para><guilabel>Waveform</guilabel>: determines the form of the wave to use: can be <guilabel>sinusoidal</guilabel>, <guilabel>triangular</guilabel>, <guilabel>square</guilabel> or just a <guilabel>peak</guilabel>.</para>
</listitem>
<listitem>
<para><guilabel>Total lenght</guilabel>: determines the fraction of the available space on which the new shape be applied. It defaults to all of it, but if for instance the cursor is halfway, the resulting shape will occupy only half of space of the simulation.</para>
</listitem>
<listitem>
<para><guilabel>Shift</guilabel>: determines if the wave shape must start from the first point (default) or from some other point in the middle. Notice that if the wave shape is shifted, any part that overflows from the right/front border will by placed to the left/back, in a sort of rotation.</para>
</listitem>
<listitem>
<para><guilabel>Wavelenght</guilabel>: determines the wavelenght of the wave, which is the space over which its shape repeats, or in other terms the distance between two subsequent peaks of it. It defaults to exactly the whole space, but its value can be tuned down to 4 times less and up to 4 times more.</para>
</listitem>
<listitem>
<para><guilabel>Phase</guilabel>: determines the phase of the wave, which is the offset by which the waveform shifted. If <guilabel>Total lenght</guilabel> is set to the maximum, this has exactly the same effect of <guilabel>Shift</guilabel>; if however this is not the case, it can be used to shift/rotate the wave shape inside the range in which it is applied.</para>
</listitem>
<listitem>
<para><guilabel>Amplitude</guilabel>: determines the amplitude of the wave, which is the vertical distance between its peaks and the rest line: defaults to the maximum, but can be reduced to scale down vertically the wave shape.</para>
</listitem>
<listitem>
<para><guilabel>Centering</guilabel>: determines at which point the waveform must reach its peak: it defaults to the middle - resulting in a symmetric waveform - but can be moved left or right to increase the slope of the shape on the left of the peak and decrease it on the right, or vice versa.</para>
</listitem>
<listitem>
<para><guilabel>Reflect</guilabel>: toggling this check substitutes the wave shape with its symmetric with respect to an horizontal axis in the middle.</para>
</listitem>
</itemizedlist>
<para>Those listed so far are properties that are bound to a single dimension: hence, when working in 2 dimensions, two instances of each are available, one in the <guilabel>Horizontal</guilabel> column and one in the <guilabel>Vertical</guilabel> one, applying respectively to the left-right and to the back-front domain.</para>
</sect2>
<sect2 id="general-controls">
<title>General controls</title>
<para>The other options that follow are instead general, applying to 1 or 2 dimensions.</para>
<itemizedlist>
<listitem>
<para><guilabel>Invert</guilabel>: toggling or untoggling this check inverts the wave shape, hence changing the height of every point through a reflection on the horizontal plane: what is above will go below, and vice versa.</para>
</listitem>
<listitem>
<para><guilabel>Composition rule</guilabel> (only enabled when working in 2 dimensions): since the dimension-specific controls only result in the definition of two particular 1-dimensional wave shapes, which will be oriented one from left to right and one from back to front, here it is possible to establish how those two shapes must then be combined:</para>
<itemizedlist>
<listitem><guilabel>product</guilabel>: each point's height will be the product of the heights given by the two shapes;
</listitem>
<listitem><guilabel>sum</guilabel>: each point's height will be the sum of the heights given by the two shapes;
</listitem>
<listitem><guilabel>maximum</guilabel>: each point's height will be the maximum value it takes among the two shapes;
</listitem>
<listitem><guilabel>minimum</guilabel>: each point's height will be the minimum value it takes among the two shapes.
</listitem>
</itemizedlist>
</listitem>
<listitem>
<para><guilabel>Add to current disposition</guilabel>: if the number of dimensions we are working in is the same as the one currently used in the main window's simulation, it is possible, by toggling this check, to sum the wave form just created to the current state of the simulation. This is a very powerful tool to get arbitrarily complex dispositions, by just adding one wave shape at a time, possibly each restricted to a particular section of the available space.</para>
</listitem>
</itemizedlist>
<para>On the bottom of the window, three buttons are available.</para>
<itemizedlist>
<listitem>
<para><guibutton>Revert</guibutton> resets all the regulations to their default values.</para>
</listitem>
<listitem>
<para><guibutton>Cancel</guibutton> closes the window, discarding any change made.</para>
</listitem>
<listitem>
<para><guibutton>Apply</guibutton> closes the window, applying all changes made.</para>
</listitem>
</itemizedlist>
</sect2>
</sect1>
<sect1 id="calculation-methods">
<title>Calculation methods</title>
<para>Several calculation methods are available in <application>Good ViBrations</application>, and are accessible from the <guilabel>Calculation</guilabel> drop-down box in the main window.</para>
<warning>
<title>Warning, technical details!</title>
<para>This page contains a technically detailed list of the algorythms available in <application>Good ViBrations</application>, and as such it is probably not understandable to readers not practical with the mathematical concepts used. Since it's not necessary to be graduated in math to use <application>Good ViBrations</application>, here's a smaller and simpler summary:</para>
<itemizedlist>
<listitem>
<para><guilabel>naif</guilabel>: unprecise and slow, no real reason to ever use it;</para>
</listitem>
<listitem>
<para><guilabel>naif matrix</guilabel>: identical to <guilabel>naif</guilabel>, but faster;</para>
</listitem>
<listitem>
<para><guilabel>quad</guilabel>: more precise, but requires more computational power;</para>
</listitem>
<listitem>
<para><guilabel>eig</guilabel>: less precise than <guilabel>quad</guilabel> for very short animations, but the most precise on the long run, since it will not introduce and amplify errors as time passes by: however, it must do some initial calculations, which may take a lot of time and make the program interface become unresponsive before the animation starts, if a high numbers of points is used.</para>
</listitem>
</itemizedlist>
</warning>
<para>The more detailed list follows.</para>
<itemizedlist>
<listitem>
<para><guilabel>naif</guilabel> operates in discrete time: it calculates the position of a point at a given iteration roughly as the position in the previous iteration plus the speed in the previous iteration multiplied by the time elapsed (which is given by the parameter <guilabel>Step</guilabel>), and the speed at a given iteration as the difference between its height and the average height of the surrounding points at previous iteration.</para>
</listitem>
<listitem>
<para><guilabel>naif matrix</guilabel> is identical to <guilabel>naif</guilabel> except it doesn't calculate the points singularly, but considers them as a vector, which is updated iteration after iteration through the multiplication by a proper matrix. It can be considered as a benchmark: comparing calculation times with <guilabel>naif</guilabel>'s ones gives an idea of how much the underying scipy libraries for matrix computations are able to perform better than native Python code.</para>
</listitem>
<listitem>
<para><guilabel>quad</guilabel> is similar to <guilabel>naif</guilabel>, except it doesn't linearize the calculation of speed, which is no more calculated as the simple difference in height with respect to the surrounding points, but instead takes in consideration the "real" distance, including the horizontal component.</para>
</listitem>
<listitem>
<para><guilabel>eig</guilabel> operates in continuous time: it takes the linearized problem (as <guilabel>naif</guilabel>), but considers the associated system of differential equations, which is determined by a given matrix, of which it computes the exponential: for this step to be accomplished, it must calculate the eigenvalues and eigenvectors of it (through the scipy library). Once this calculation is done, it simply multiplies together the resulting matrix and the diagonal matrix given by the exponentials of the eigenvalues.</para>
</listitem>
</itemizedlist>
</sect1>
<sect1 id="dump-to-png">
<title>Saving frames as images</title>
<para>When <menuchoice><guimenu>Options</guimenu><guimenuitem>Save frames as png</guimenuitem></menuchoice> is clicked, a dialog will open asking to choose a directory, and the frames will be saved in that directory as png images instead than being rendered to screen. This is useful when they are needed to create a video, or when the complexity of calculation involved is simply to high for them to be seen in real time.</para>
<para>Clicking it again will untoggle the checkbox, and the animation will start to be drawn again to screen.</para>
<tip>An easy way to transform the produced images into a video is the following:
<itemizedlist>
<listitem>
<para>ensure the program <command>ffmpeg</command> is installed on your system,</para>
</listitem>
<listitem>
<para>open a terminal and move to the directory containing the images prepared with <application>Good ViBrations</application>,</para>
</listitem>
<listitem>
<para>give the command <command>ffmpeg -i %08d.png video.mp4</command>.</para>
</listitem>
</itemizedlist></tip>
</sect1>
</article>
|