You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

1482 lines
70 KiB

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta name="generator" content="Asciidoctor 2.0.12">
<meta name="author" content="Laborejo Software Suite">
<title>Vico</title>
<style>
/* Asciidoctor default stylesheet | MIT License | https://asciidoctor.org */
/* Uncomment @import statement to use as custom stylesheet */
/*@import "https://fonts.googleapis.com/css?family=Open+Sans:300,300italic,400,400italic,600,600italic%7CNoto+Serif:400,400italic,700,700italic%7CDroid+Sans+Mono:400,700";*/
article,aside,details,figcaption,figure,footer,header,hgroup,main,nav,section{display:block}
audio,video{display:inline-block}
audio:not([controls]){display:none;height:0}
html{font-family:sans-serif;-ms-text-size-adjust:100%;-webkit-text-size-adjust:100%}
a{background:none}
a:focus{outline:thin dotted}
a:active,a:hover{outline:0}
h1{font-size:2em;margin:.67em 0}
abbr[title]{border-bottom:1px dotted}
b,strong{font-weight:bold}
dfn{font-style:italic}
hr{-moz-box-sizing:content-box;box-sizing:content-box;height:0}
mark{background:#ff0;color:#000}
code,kbd,pre,samp{font-family:monospace;font-size:1em}
pre{white-space:pre-wrap}
q{quotes:"\201C" "\201D" "\2018" "\2019"}
small{font-size:80%}
sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}
sup{top:-.5em}
sub{bottom:-.25em}
img{border:0}
svg:not(:root){overflow:hidden}
figure{margin:0}
fieldset{border:1px solid silver;margin:0 2px;padding:.35em .625em .75em}
legend{border:0;padding:0}
button,input,select,textarea{font-family:inherit;font-size:100%;margin:0}
button,input{line-height:normal}
button,select{text-transform:none}
button,html input[type="button"],input[type="reset"],input[type="submit"]{-webkit-appearance:button;cursor:pointer}
button[disabled],html input[disabled]{cursor:default}
input[type="checkbox"],input[type="radio"]{box-sizing:border-box;padding:0}
button::-moz-focus-inner,input::-moz-focus-inner{border:0;padding:0}
textarea{overflow:auto;vertical-align:top}
table{border-collapse:collapse;border-spacing:0}
*,*::before,*::after{-moz-box-sizing:border-box;-webkit-box-sizing:border-box;box-sizing:border-box}
html,body{font-size:100%}
body{background:#fff;color:rgba(0,0,0,.8);padding:0;margin:0;font-family:"Noto Serif","DejaVu Serif",serif;font-weight:400;font-style:normal;line-height:1;position:relative;cursor:auto;tab-size:4;word-wrap:anywhere;-moz-osx-font-smoothing:grayscale;-webkit-font-smoothing:antialiased}
a:hover{cursor:pointer}
img,object,embed{max-width:100%;height:auto}
object,embed{height:100%}
img{-ms-interpolation-mode:bicubic}
.left{float:left!important}
.right{float:right!important}
.text-left{text-align:left!important}
.text-right{text-align:right!important}
.text-center{text-align:center!important}
.text-justify{text-align:justify!important}
.hide{display:none}
img,object,svg{display:inline-block;vertical-align:middle}
textarea{height:auto;min-height:50px}
select{width:100%}
.subheader,.admonitionblock td.content>.title,.audioblock>.title,.exampleblock>.title,.imageblock>.title,.listingblock>.title,.literalblock>.title,.stemblock>.title,.openblock>.title,.paragraph>.title,.quoteblock>.title,table.tableblock>.title,.verseblock>.title,.videoblock>.title,.dlist>.title,.olist>.title,.ulist>.title,.qlist>.title,.hdlist>.title{line-height:1.45;color:#7a2518;font-weight:400;margin-top:0;margin-bottom:.25em}
div,dl,dt,dd,ul,ol,li,h1,h2,h3,#toctitle,.sidebarblock>.content>.title,h4,h5,h6,pre,form,p,blockquote,th,td{margin:0;padding:0}
a{color:#2156a5;text-decoration:underline;line-height:inherit}
a:hover,a:focus{color:#1d4b8f}
a img{border:0}
p{font-family:inherit;font-weight:400;font-size:1em;line-height:1.6;margin-bottom:1.25em;text-rendering:optimizeLegibility}
p aside{font-size:.875em;line-height:1.35;font-style:italic}
h1,h2,h3,#toctitle,.sidebarblock>.content>.title,h4,h5,h6{font-family:"Open Sans","DejaVu Sans",sans-serif;font-weight:300;font-style:normal;color:#ba3925;text-rendering:optimizeLegibility;margin-top:1em;margin-bottom:.5em;line-height:1.0125em}
h1 small,h2 small,h3 small,#toctitle small,.sidebarblock>.content>.title small,h4 small,h5 small,h6 small{font-size:60%;color:#e99b8f;line-height:0}
h1{font-size:2.125em}
h2{font-size:1.6875em}
h3,#toctitle,.sidebarblock>.content>.title{font-size:1.375em}
h4,h5{font-size:1.125em}
h6{font-size:1em}
hr{border:solid #dddddf;border-width:1px 0 0;clear:both;margin:1.25em 0 1.1875em;height:0}
em,i{font-style:italic;line-height:inherit}
strong,b{font-weight:bold;line-height:inherit}
small{font-size:60%;line-height:inherit}
code{font-family:"Droid Sans Mono","DejaVu Sans Mono",monospace;font-weight:400;color:rgba(0,0,0,.9)}
ul,ol,dl{font-size:1em;line-height:1.6;margin-bottom:1.25em;list-style-position:outside;font-family:inherit}
ul,ol{margin-left:1.5em}
ul li ul,ul li ol{margin-left:1.25em;margin-bottom:0;font-size:1em}
ul.square li ul,ul.circle li ul,ul.disc li ul{list-style:inherit}
ul.square{list-style-type:square}
ul.circle{list-style-type:circle}
ul.disc{list-style-type:disc}
ol li ul,ol li ol{margin-left:1.25em;margin-bottom:0}
dl dt{margin-bottom:.3125em;font-weight:bold}
dl dd{margin-bottom:1.25em}
abbr,acronym{text-transform:uppercase;font-size:90%;color:rgba(0,0,0,.8);border-bottom:1px dotted #ddd;cursor:help}
abbr{text-transform:none}
blockquote{margin:0 0 1.25em;padding:.5625em 1.25em 0 1.1875em;border-left:1px solid #ddd}
blockquote cite{display:block;font-size:.9375em;color:rgba(0,0,0,.6)}
blockquote cite::before{content:"\2014 \0020"}
blockquote cite a,blockquote cite a:visited{color:rgba(0,0,0,.6)}
blockquote,blockquote p{line-height:1.6;color:rgba(0,0,0,.85)}
@media screen and (min-width:768px){h1,h2,h3,#toctitle,.sidebarblock>.content>.title,h4,h5,h6{line-height:1.2}
h1{font-size:2.75em}
h2{font-size:2.3125em}
h3,#toctitle,.sidebarblock>.content>.title{font-size:1.6875em}
h4{font-size:1.4375em}}
table{background:#fff;margin-bottom:1.25em;border:solid 1px #dedede;word-wrap:normal}
table thead,table tfoot{background:#f7f8f7}
table thead tr th,table thead tr td,table tfoot tr th,table tfoot tr td{padding:.5em .625em .625em;font-size:inherit;color:rgba(0,0,0,.8);text-align:left}
table tr th,table tr td{padding:.5625em .625em;font-size:inherit;color:rgba(0,0,0,.8)}
table tr.even,table tr.alt{background:#f8f8f7}
table thead tr th,table tfoot tr th,table tbody tr td,table tr td,table tfoot tr td{line-height:1.6}
h1,h2,h3,#toctitle,.sidebarblock>.content>.title,h4,h5,h6{line-height:1.2;word-spacing:-.05em}
h1 strong,h2 strong,h3 strong,#toctitle strong,.sidebarblock>.content>.title strong,h4 strong,h5 strong,h6 strong{font-weight:400}
.center{margin-left:auto;margin-right:auto}
.stretch{width:100%}
.clearfix::before,.clearfix::after,.float-group::before,.float-group::after{content:" ";display:table}
.clearfix::after,.float-group::after{clear:both}
:not(pre).nobreak{word-wrap:normal}
:not(pre).nowrap{white-space:nowrap}
:not(pre).pre-wrap{white-space:pre-wrap}
:not(pre):not([class^=L])>code{font-size:.9375em;font-style:normal!important;letter-spacing:0;padding:.1em .5ex;word-spacing:-.15em;background:#f7f7f8;-webkit-border-radius:4px;border-radius:4px;line-height:1.45;text-rendering:optimizeSpeed}
pre{color:rgba(0,0,0,.9);font-family:"Droid Sans Mono","DejaVu Sans Mono",monospace;line-height:1.45;text-rendering:optimizeSpeed}
pre code,pre pre{color:inherit;font-size:inherit;line-height:inherit}
pre>code{display:block}
pre.nowrap,pre.nowrap pre{white-space:pre;word-wrap:normal}
em em{font-style:normal}
strong strong{font-weight:400}
.keyseq{color:rgba(51,51,51,.8)}
kbd{font-family:"Droid Sans Mono","DejaVu Sans Mono",monospace;display:inline-block;color:rgba(0,0,0,.8);font-size:.65em;line-height:1.45;background:#f7f7f7;border:1px solid #ccc;-webkit-border-radius:3px;border-radius:3px;-webkit-box-shadow:0 1px 0 rgba(0,0,0,.2),0 0 0 .1em white inset;box-shadow:0 1px 0 rgba(0,0,0,.2),0 0 0 .1em #fff inset;margin:0 .15em;padding:.2em .5em;vertical-align:middle;position:relative;top:-.1em;white-space:nowrap}
.keyseq kbd:first-child{margin-left:0}
.keyseq kbd:last-child{margin-right:0}
.menuseq,.menuref{color:#000}
.menuseq b:not(.caret),.menuref{font-weight:inherit}
.menuseq{word-spacing:-.02em}
.menuseq b.caret{font-size:1.25em;line-height:.8}
.menuseq i.caret{font-weight:bold;text-align:center;width:.45em}
b.button::before,b.button::after{position:relative;top:-1px;font-weight:400}
b.button::before{content:"[";padding:0 3px 0 2px}
b.button::after{content:"]";padding:0 2px 0 3px}
p a>code:hover{color:rgba(0,0,0,.9)}
#header,#content,#footnotes,#footer{width:100%;margin-left:auto;margin-right:auto;margin-top:0;margin-bottom:0;max-width:62.5em;*zoom:1;position:relative;padding-left:.9375em;padding-right:.9375em}
#header::before,#header::after,#content::before,#content::after,#footnotes::before,#footnotes::after,#footer::before,#footer::after{content:" ";display:table}
#header::after,#content::after,#footnotes::after,#footer::after{clear:both}
#content{margin-top:1.25em}
#content::before{content:none}
#header>h1:first-child{color:rgba(0,0,0,.85);margin-top:2.25rem;margin-bottom:0}
#header>h1:first-child+#toc{margin-top:8px;border-top:1px solid #dddddf}
#header>h1:only-child,body.toc2 #header>h1:nth-last-child(2){border-bottom:1px solid #dddddf;padding-bottom:8px}
#header .details{border-bottom:1px solid #dddddf;line-height:1.45;padding-top:.25em;padding-bottom:.25em;padding-left:.25em;color:rgba(0,0,0,.6);display:-ms-flexbox;display:-webkit-flex;display:flex;-ms-flex-flow:row wrap;-webkit-flex-flow:row wrap;flex-flow:row wrap}
#header .details span:first-child{margin-left:-.125em}
#header .details span.email a{color:rgba(0,0,0,.85)}
#header .details br{display:none}
#header .details br+span::before{content:"\00a0\2013\00a0"}
#header .details br+span.author::before{content:"\00a0\22c5\00a0";color:rgba(0,0,0,.85)}
#header .details br+span#revremark::before{content:"\00a0|\00a0"}
#header #revnumber{text-transform:capitalize}
#header #revnumber::after{content:"\00a0"}
#content>h1:first-child:not([class]){color:rgba(0,0,0,.85);border-bottom:1px solid #dddddf;padding-bottom:8px;margin-top:0;padding-top:1rem;margin-bottom:1.25rem}
#toc{border-bottom:1px solid #e7e7e9;padding-bottom:.5em}
#toc>ul{margin-left:.125em}
#toc ul.sectlevel0>li>a{font-style:italic}
#toc ul.sectlevel0 ul.sectlevel1{margin:.5em 0}
#toc ul{font-family:"Open Sans","DejaVu Sans",sans-serif;list-style-type:none}
#toc li{line-height:1.3334;margin-top:.3334em}
#toc a{text-decoration:none}
#toc a:active{text-decoration:underline}
#toctitle{color:#7a2518;font-size:1.2em}
@media screen and (min-width:768px){#toctitle{font-size:1.375em}
body.toc2{padding-left:15em;padding-right:0}
#toc.toc2{margin-top:0!important;background:#f8f8f7;position:fixed;width:15em;left:0;top:0;border-right:1px solid #e7e7e9;border-top-width:0!important;border-bottom-width:0!important;z-index:1000;padding:1.25em 1em;height:100%;overflow:auto}
#toc.toc2 #toctitle{margin-top:0;margin-bottom:.8rem;font-size:1.2em}
#toc.toc2>ul{font-size:.9em;margin-bottom:0}
#toc.toc2 ul ul{margin-left:0;padding-left:1em}
#toc.toc2 ul.sectlevel0 ul.sectlevel1{padding-left:0;margin-top:.5em;margin-bottom:.5em}
body.toc2.toc-right{padding-left:0;padding-right:15em}
body.toc2.toc-right #toc.toc2{border-right-width:0;border-left:1px solid #e7e7e9;left:auto;right:0}}
@media screen and (min-width:1280px){body.toc2{padding-left:20em;padding-right:0}
#toc.toc2{width:20em}
#toc.toc2 #toctitle{font-size:1.375em}
#toc.toc2>ul{font-size:.95em}
#toc.toc2 ul ul{padding-left:1.25em}
body.toc2.toc-right{padding-left:0;padding-right:20em}}
#content #toc{border-style:solid;border-width:1px;border-color:#e0e0dc;margin-bottom:1.25em;padding:1.25em;background:#f8f8f7;-webkit-border-radius:4px;border-radius:4px}
#content #toc>:first-child{margin-top:0}
#content #toc>:last-child{margin-bottom:0}
#footer{max-width:none;background:rgba(0,0,0,.8);padding:1.25em}
#footer-text{color:rgba(255,255,255,.8);line-height:1.44}
#content{margin-bottom:.625em}
.sect1{padding-bottom:.625em}
@media screen and (min-width:768px){#content{margin-bottom:1.25em}
.sect1{padding-bottom:1.25em}}
.sect1:last-child{padding-bottom:0}
.sect1+.sect1{border-top:1px solid #e7e7e9}
#content h1>a.anchor,h2>a.anchor,h3>a.anchor,#toctitle>a.anchor,.sidebarblock>.content>.title>a.anchor,h4>a.anchor,h5>a.anchor,h6>a.anchor{position:absolute;z-index:1001;width:1.5ex;margin-left:-1.5ex;display:block;text-decoration:none!important;visibility:hidden;text-align:center;font-weight:400}
#content h1>a.anchor::before,h2>a.anchor::before,h3>a.anchor::before,#toctitle>a.anchor::before,.sidebarblock>.content>.title>a.anchor::before,h4>a.anchor::before,h5>a.anchor::before,h6>a.anchor::before{content:"\00A7";font-size:.85em;display:block;padding-top:.1em}
#content h1:hover>a.anchor,#content h1>a.anchor:hover,h2:hover>a.anchor,h2>a.anchor:hover,h3:hover>a.anchor,#toctitle:hover>a.anchor,.sidebarblock>.content>.title:hover>a.anchor,h3>a.anchor:hover,#toctitle>a.anchor:hover,.sidebarblock>.content>.title>a.anchor:hover,h4:hover>a.anchor,h4>a.anchor:hover,h5:hover>a.anchor,h5>a.anchor:hover,h6:hover>a.anchor,h6>a.anchor:hover{visibility:visible}
#content h1>a.link,h2>a.link,h3>a.link,#toctitle>a.link,.sidebarblock>.content>.title>a.link,h4>a.link,h5>a.link,h6>a.link{color:#ba3925;text-decoration:none}
#content h1>a.link:hover,h2>a.link:hover,h3>a.link:hover,#toctitle>a.link:hover,.sidebarblock>.content>.title>a.link:hover,h4>a.link:hover,h5>a.link:hover,h6>a.link:hover{color:#a53221}
details,.audioblock,.imageblock,.literalblock,.listingblock,.stemblock,.videoblock{margin-bottom:1.25em}
details>summary:first-of-type{cursor:pointer;display:list-item;outline:none;margin-bottom:.75em}
.admonitionblock td.content>.title,.audioblock>.title,.exampleblock>.title,.imageblock>.title,.listingblock>.title,.literalblock>.title,.stemblock>.title,.openblock>.title,.paragraph>.title,.quoteblock>.title,table.tableblock>.title,.verseblock>.title,.videoblock>.title,.dlist>.title,.olist>.title,.ulist>.title,.qlist>.title,.hdlist>.title{text-rendering:optimizeLegibility;text-align:left;font-family:"Noto Serif","DejaVu Serif",serif;font-size:1rem;font-style:italic}
table.tableblock.fit-content>caption.title{white-space:nowrap;width:0}
.paragraph.lead>p,#preamble>.sectionbody>[class="paragraph"]:first-of-type p{font-size:1.21875em;line-height:1.6;color:rgba(0,0,0,.85)}
table.tableblock #preamble>.sectionbody>[class="paragraph"]:first-of-type p{font-size:inherit}
.admonitionblock>table{border-collapse:separate;border:0;background:none;width:100%}
.admonitionblock>table td.icon{text-align:center;width:80px}
.admonitionblock>table td.icon img{max-width:none}
.admonitionblock>table td.icon .title{font-weight:bold;font-family:"Open Sans","DejaVu Sans",sans-serif;text-transform:uppercase}
.admonitionblock>table td.content{padding-left:1.125em;padding-right:1.25em;border-left:1px solid #dddddf;color:rgba(0,0,0,.6);word-wrap:anywhere}
.admonitionblock>table td.content>:last-child>:last-child{margin-bottom:0}
.exampleblock>.content{border-style:solid;border-width:1px;border-color:#e6e6e6;margin-bottom:1.25em;padding:1.25em;background:#fff;-webkit-border-radius:4px;border-radius:4px}
.exampleblock>.content>:first-child{margin-top:0}
.exampleblock>.content>:last-child{margin-bottom:0}
.sidebarblock{border-style:solid;border-width:1px;border-color:#dbdbd6;margin-bottom:1.25em;padding:1.25em;background:#f3f3f2;-webkit-border-radius:4px;border-radius:4px}
.sidebarblock>:first-child{margin-top:0}
.sidebarblock>:last-child{margin-bottom:0}
.sidebarblock>.content>.title{color:#7a2518;margin-top:0;text-align:center}
.exampleblock>.content>:last-child>:last-child,.exampleblock>.content .olist>ol>li:last-child>:last-child,.exampleblock>.content .ulist>ul>li:last-child>:last-child,.exampleblock>.content .qlist>ol>li:last-child>:last-child,.sidebarblock>.content>:last-child>:last-child,.sidebarblock>.content .olist>ol>li:last-child>:last-child,.sidebarblock>.content .ulist>ul>li:last-child>:last-child,.sidebarblock>.content .qlist>ol>li:last-child>:last-child{margin-bottom:0}
.literalblock pre,.listingblock>.content>pre{-webkit-border-radius:4px;border-radius:4px;overflow-x:auto;padding:1em;font-size:.8125em}
@media screen and (min-width:768px){.literalblock pre,.listingblock>.content>pre{font-size:.90625em}}
@media screen and (min-width:1280px){.literalblock pre,.listingblock>.content>pre{font-size:1em}}
.literalblock pre,.listingblock>.content>pre:not(.highlight),.listingblock>.content>pre[class="highlight"],.listingblock>.content>pre[class^="highlight "]{background:#f7f7f8}
.literalblock.output pre{color:#f7f7f8;background:rgba(0,0,0,.9)}
.listingblock>.content{position:relative}
.listingblock code[data-lang]::before{display:none;content:attr(data-lang);position:absolute;font-size:.75em;top:.425rem;right:.5rem;line-height:1;text-transform:uppercase;color:inherit;opacity:.5}
.listingblock:hover code[data-lang]::before{display:block}
.listingblock.terminal pre .command::before{content:attr(data-prompt);padding-right:.5em;color:inherit;opacity:.5}
.listingblock.terminal pre .command:not([data-prompt])::before{content:"$"}
.listingblock pre.highlightjs{padding:0}
.listingblock pre.highlightjs>code{padding:1em;-webkit-border-radius:4px;border-radius:4px}
.listingblock pre.prettyprint{border-width:0}
.prettyprint{background:#f7f7f8}
pre.prettyprint .linenums{line-height:1.45;margin-left:2em}
pre.prettyprint li{background:none;list-style-type:inherit;padding-left:0}
pre.prettyprint li code[data-lang]::before{opacity:1}
pre.prettyprint li:not(:first-child) code[data-lang]::before{display:none}
table.linenotable{border-collapse:separate;border:0;margin-bottom:0;background:none}
table.linenotable td[class]{color:inherit;vertical-align:top;padding:0;line-height:inherit;white-space:normal}
table.linenotable td.code{padding-left:.75em}
table.linenotable td.linenos{border-right:1px solid currentColor;opacity:.35;padding-right:.5em}
pre.pygments .lineno{border-right:1px solid currentColor;opacity:.35;display:inline-block;margin-right:.75em}
pre.pygments .lineno::before{content:"";margin-right:-.125em}
.quoteblock{margin:0 1em 1.25em 1.5em;display:table}
.quoteblock:not(.excerpt)>.title{margin-left:-1.5em;margin-bottom:.75em}
.quoteblock blockquote,.quoteblock p{color:rgba(0,0,0,.85);font-size:1.15rem;line-height:1.75;word-spacing:.1em;letter-spacing:0;font-style:italic;text-align:justify}
.quoteblock blockquote{margin:0;padding:0;border:0}
.quoteblock blockquote::before{content:"\201c";float:left;font-size:2.75em;font-weight:bold;line-height:.6em;margin-left:-.6em;color:#7a2518;text-shadow:0 1px 2px rgba(0,0,0,.1)}
.quoteblock blockquote>.paragraph:last-child p{margin-bottom:0}
.quoteblock .attribution{margin-top:.75em;margin-right:.5ex;text-align:right}
.verseblock{margin:0 1em 1.25em}
.verseblock pre{font-family:"Open Sans","DejaVu Sans",sans;font-size:1.15rem;color:rgba(0,0,0,.85);font-weight:300;text-rendering:optimizeLegibility}
.verseblock pre strong{font-weight:400}
.verseblock .attribution{margin-top:1.25rem;margin-left:.5ex}
.quoteblock .attribution,.verseblock .attribution{font-size:.9375em;line-height:1.45;font-style:italic}
.quoteblock .attribution br,.verseblock .attribution br{display:none}
.quoteblock .attribution cite,.verseblock .attribution cite{display:block;letter-spacing:-.025em;color:rgba(0,0,0,.6)}
.quoteblock.abstract blockquote::before,.quoteblock.excerpt blockquote::before,.quoteblock .quoteblock blockquote::before{display:none}
.quoteblock.abstract blockquote,.quoteblock.abstract p,.quoteblock.excerpt blockquote,.quoteblock.excerpt p,.quoteblock .quoteblock blockquote,.quoteblock .quoteblock p{line-height:1.6;word-spacing:0}
.quoteblock.abstract{margin:0 1em 1.25em;display:block}
.quoteblock.abstract>.title{margin:0 0 .375em;font-size:1.15em;text-align:center}
.quoteblock.excerpt>blockquote,.quoteblock .quoteblock{padding:0 0 .25em 1em;border-left:.25em solid #dddddf}
.quoteblock.excerpt,.quoteblock .quoteblock{margin-left:0}
.quoteblock.excerpt blockquote,.quoteblock.excerpt p,.quoteblock .quoteblock blockquote,.quoteblock .quoteblock p{color:inherit;font-size:1.0625rem}
.quoteblock.excerpt .attribution,.quoteblock .quoteblock .attribution{color:inherit;text-align:left;margin-right:0}
p.tableblock:last-child{margin-bottom:0}
td.tableblock>.content{margin-bottom:1.25em;word-wrap:anywhere}
td.tableblock>.content>:last-child{margin-bottom:-1.25em}
table.tableblock,th.tableblock,td.tableblock{border:0 solid #dedede}
table.grid-all>*>tr>*{border-width:1px}
table.grid-cols>*>tr>*{border-width:0 1px}
table.grid-rows>*>tr>*{border-width:1px 0}
table.frame-all{border-width:1px}
table.frame-ends{border-width:1px 0}
table.frame-sides{border-width:0 1px}
table.frame-none>colgroup+*>:first-child>*,table.frame-sides>colgroup+*>:first-child>*{border-top-width:0}
table.frame-none>:last-child>:last-child>*,table.frame-sides>:last-child>:last-child>*{border-bottom-width:0}
table.frame-none>*>tr>:first-child,table.frame-ends>*>tr>:first-child{border-left-width:0}
table.frame-none>*>tr>:last-child,table.frame-ends>*>tr>:last-child{border-right-width:0}
table.stripes-all tr,table.stripes-odd tr:nth-of-type(odd),table.stripes-even tr:nth-of-type(even),table.stripes-hover tr:hover{background:#f8f8f7}
th.halign-left,td.halign-left{text-align:left}
th.halign-right,td.halign-right{text-align:right}
th.halign-center,td.halign-center{text-align:center}
th.valign-top,td.valign-top{vertical-align:top}
th.valign-bottom,td.valign-bottom{vertical-align:bottom}
th.valign-middle,td.valign-middle{vertical-align:middle}
table thead th,table tfoot th{font-weight:bold}
tbody tr th{background:#f7f8f7}
tbody tr th,tbody tr th p,tfoot tr th,tfoot tr th p{color:rgba(0,0,0,.8);font-weight:bold}
p.tableblock>code:only-child{background:none;padding:0}
p.tableblock{font-size:1em}
ol{margin-left:1.75em}
ul li ol{margin-left:1.5em}
dl dd{margin-left:1.125em}
dl dd:last-child,dl dd:last-child>:last-child{margin-bottom:0}
ol>li p,ul>li p,ul dd,ol dd,.olist .olist,.ulist .ulist,.ulist .olist,.olist .ulist{margin-bottom:.625em}
ul.checklist,ul.none,ol.none,ul.no-bullet,ol.no-bullet,ol.unnumbered,ul.unstyled,ol.unstyled{list-style-type:none}
ul.no-bullet,ol.no-bullet,ol.unnumbered{margin-left:.625em}
ul.unstyled,ol.unstyled{margin-left:0}
ul.checklist{margin-left:.625em}
ul.checklist li>p:first-child>.fa-square-o:first-child,ul.checklist li>p:first-child>.fa-check-square-o:first-child{width:1.25em;font-size:.8em;position:relative;bottom:.125em}
ul.checklist li>p:first-child>input[type="checkbox"]:first-child{margin-right:.25em}
ul.inline{display:-ms-flexbox;display:-webkit-box;display:flex;-ms-flex-flow:row wrap;-webkit-flex-flow:row wrap;flex-flow:row wrap;list-style:none;margin:0 0 .625em -1.25em}
ul.inline>li{margin-left:1.25em}
.unstyled dl dt{font-weight:400;font-style:normal}
ol.arabic{list-style-type:decimal}
ol.decimal{list-style-type:decimal-leading-zero}
ol.loweralpha{list-style-type:lower-alpha}
ol.upperalpha{list-style-type:upper-alpha}
ol.lowerroman{list-style-type:lower-roman}
ol.upperroman{list-style-type:upper-roman}
ol.lowergreek{list-style-type:lower-greek}
.hdlist>table,.colist>table{border:0;background:none}
.hdlist>table>tbody>tr,.colist>table>tbody>tr{background:none}
td.hdlist1,td.hdlist2{vertical-align:top;padding:0 .625em}
td.hdlist1{font-weight:bold;padding-bottom:1.25em}
td.hdlist2{word-wrap:anywhere}
.literalblock+.colist,.listingblock+.colist{margin-top:-.5em}
.colist td:not([class]):first-child{padding:.4em .75em 0;line-height:1;vertical-align:top}
.colist td:not([class]):first-child img{max-width:none}
.colist td:not([class]):last-child{padding:.25em 0}
.thumb,.th{line-height:0;display:inline-block;border:solid 4px #fff;-webkit-box-shadow:0 0 0 1px #ddd;box-shadow:0 0 0 1px #ddd}
.imageblock.left{margin:.25em .625em 1.25em 0}
.imageblock.right{margin:.25em 0 1.25em .625em}
.imageblock>.title{margin-bottom:0}
.imageblock.thumb,.imageblock.th{border-width:6px}
.imageblock.thumb>.title,.imageblock.th>.title{padding:0 .125em}
.image.left,.image.right{margin-top:.25em;margin-bottom:.25em;display:inline-block;line-height:0}
.image.left{margin-right:.625em}
.image.right{margin-left:.625em}
a.image{text-decoration:none;display:inline-block}
a.image object{pointer-events:none}
sup.footnote,sup.footnoteref{font-size:.875em;position:static;vertical-align:super}
sup.footnote a,sup.footnoteref a{text-decoration:none}
sup.footnote a:active,sup.footnoteref a:active{text-decoration:underline}
#footnotes{padding-top:.75em;padding-bottom:.75em;margin-bottom:.625em}
#footnotes hr{width:20%;min-width:6.25em;margin:-.25em 0 .75em;border-width:1px 0 0}
#footnotes .footnote{padding:0 .375em 0 .225em;line-height:1.3334;font-size:.875em;margin-left:1.2em;margin-bottom:.2em}
#footnotes .footnote a:first-of-type{font-weight:bold;text-decoration:none;margin-left:-1.05em}
#footnotes .footnote:last-of-type{margin-bottom:0}
#content #footnotes{margin-top:-.625em;margin-bottom:0;padding:.75em 0}
.gist .file-data>table{border:0;background:#fff;width:100%;margin-bottom:0}
.gist .file-data>table td.line-data{width:99%}
div.unbreakable{page-break-inside:avoid}
.big{font-size:larger}
.small{font-size:smaller}
.underline{text-decoration:underline}
.overline{text-decoration:overline}
.line-through{text-decoration:line-through}
.aqua{color:#00bfbf}
.aqua-background{background:#00fafa}
.black{color:#000}
.black-background{background:#000}
.blue{color:#0000bf}
.blue-background{background:#0000fa}
.fuchsia{color:#bf00bf}
.fuchsia-background{background:#fa00fa}
.gray{color:#606060}
.gray-background{background:#7d7d7d}
.green{color:#006000}
.green-background{background:#007d00}
.lime{color:#00bf00}
.lime-background{background:#00fa00}
.maroon{color:#600000}
.maroon-background{background:#7d0000}
.navy{color:#000060}
.navy-background{background:#00007d}
.olive{color:#606000}
.olive-background{background:#7d7d00}
.purple{color:#600060}
.purple-background{background:#7d007d}
.red{color:#bf0000}
.red-background{background:#fa0000}
.silver{color:#909090}
.silver-background{background:#bcbcbc}
.teal{color:#006060}
.teal-background{background:#007d7d}
.white{color:#bfbfbf}
.white-background{background:#fafafa}
.yellow{color:#bfbf00}
.yellow-background{background:#fafa00}
span.icon>.fa{cursor:default}
a span.icon>.fa{cursor:inherit}
.admonitionblock td.icon [class^="fa icon-"]{font-size:2.5em;text-shadow:1px 1px 2px rgba(0,0,0,.5);cursor:default}
.admonitionblock td.icon .icon-note::before{content:"\f05a";color:#19407c}
.admonitionblock td.icon .icon-tip::before{content:"\f0eb";text-shadow:1px 1px 2px rgba(155,155,0,.8);color:#111}
.admonitionblock td.icon .icon-warning::before{content:"\f071";color:#bf6900}
.admonitionblock td.icon .icon-caution::before{content:"\f06d";color:#bf3400}
.admonitionblock td.icon .icon-important::before{content:"\f06a";color:#bf0000}
.conum[data-value]{display:inline-block;color:#fff!important;background:rgba(0,0,0,.8);-webkit-border-radius:50%;border-radius:50%;text-align:center;font-size:.75em;width:1.67em;height:1.67em;line-height:1.67em;font-family:"Open Sans","DejaVu Sans",sans-serif;font-style:normal;font-weight:bold}
.conum[data-value] *{color:#fff!important}
.conum[data-value]+b{display:none}
.conum[data-value]::after{content:attr(data-value)}
pre .conum[data-value]{position:relative;top:-.125em}
b.conum *{color:inherit!important}
.conum:not([data-value]):empty{display:none}
dt,th.tableblock,td.content,div.footnote{text-rendering:optimizeLegibility}
h1,h2,p,td.content,span.alt{letter-spacing:-.01em}
p strong,td.content strong,div.footnote strong{letter-spacing:-.005em}
p,blockquote,dt,td.content,span.alt{font-size:1.0625rem}
p{margin-bottom:1.25rem}
.sidebarblock p,.sidebarblock dt,.sidebarblock td.content,p.tableblock{font-size:1em}
.exampleblock>.content{background:#fffef7;border-color:#e0e0dc;-webkit-box-shadow:0 1px 4px #e0e0dc;box-shadow:0 1px 4px #e0e0dc}
.print-only{display:none!important}
@page{margin:1.25cm .75cm}
@media print{*{-webkit-box-shadow:none!important;box-shadow:none!important;text-shadow:none!important}
html{font-size:80%}
a{color:inherit!important;text-decoration:underline!important}
a.bare,a[href^="#"],a[href^="mailto:"]{text-decoration:none!important}
a[href^="http:"]:not(.bare)::after,a[href^="https:"]:not(.bare)::after{content:"(" attr(href) ")";display:inline-block;font-size:.875em;padding-left:.25em}
abbr[title]::after{content:" (" attr(title) ")"}
pre,blockquote,tr,img,object,svg{page-break-inside:avoid}
thead{display:table-header-group}
svg{max-width:100%}
p,blockquote,dt,td.content{font-size:1em;orphans:3;widows:3}
h2,h3,#toctitle,.sidebarblock>.content>.title{page-break-after:avoid}
#header,#content,#footnotes,#footer{max-width:none}
#toc,.sidebarblock,.exampleblock>.content{background:none!important}
#toc{border-bottom:1px solid #dddddf!important;padding-bottom:0!important}
body.book #header{text-align:center}
body.book #header>h1:first-child{border:0!important;margin:2.5em 0 1em}
body.book #header .details{border:0!important;display:block;padding:0!important}
body.book #header .details span:first-child{margin-left:0!important}
body.book #header .details br{display:block}
body.book #header .details br+span::before{content:none!important}
body.book #toc{border:0!important;text-align:left!important;padding:0!important;margin:0!important}
body.book #toc,body.book #preamble,body.book h1.sect0,body.book .sect1>h2{page-break-before:always}
.listingblock code[data-lang]::before{display:block}
#footer{padding:0 .9375em}
.hide-on-print{display:none!important}
.print-only{display:block!important}
.hide-for-print{display:none!important}
.show-for-print{display:inherit!important}}
@media print,amzn-kf8{#header>h1:first-child{margin-top:1.25rem}
.sect1{padding:0!important}
.sect1+.sect1{border:0}
#footer{background:none}
#footer-text{color:rgba(0,0,0,.6);font-size:.9em}}
@media amzn-kf8{#header,#content,#footnotes,#footer{padding:0}}
</style>
</head>
<body class="article toc2 toc-left">
<div id="header">
<h1>Vico</h1>
<div class="details">
<span id="author" class="author">Laborejo Software Suite</span><br>
</div>
<div id="toc" class="toc2">
<div id="toctitle">Table of Contents</div>
<ul class="sectlevel1">
<li><a href="#_introduction">1. Introduction</a>
<ul class="sectlevel2">
<li><a href="#_basic_principles">1.1. Basic Principles</a></li>
<li><a href="#_midi_support">1.2. MIDI support</a></li>
<li><a href="#_mouse_and_keyboard_shortcuts">1.3. Mouse and keyboard shortcuts</a></li>
</ul>
</li>
<li><a href="#_description_of_the_graphical_user_interface_and_its_functions">2. Description of the graphical user interface and its functions</a></li>
<li><a href="#_piano_at_the_left_side">3. Piano at the left side</a></li>
<li><a href="#_main_view">4. Main View</a>
<ul class="sectlevel2">
<li><a href="#_moving_and_navigation">4.1. Moving and Navigation</a></li>
<li><a href="#_zoom_and_scaling">4.2. Zoom and Scaling</a></li>
<li><a href="#_layers">4.3. Layers</a>
<ul class="sectlevel3">
<li><a href="#_shadows">4.3.1. Shadows</a></li>
<li><a href="#_colors">4.3.2. Colors</a></li>
<li><a href="#_midi_channels">4.3.3. Midi Channels</a></li>
</ul>
</li>
</ul>
</li>
<li><a href="#_live_recording">5. Live Recording</a>
<ul class="sectlevel2">
<li><a href="#_layer_filter">5.1. Layer Filter</a></li>
<li><a href="#_jack_transport_and_timebase_bar_lines">5.2. JACK Transport and Timebase: Bar lines</a></li>
</ul>
</li>
<li><a href="#_notes_and_events">6. Notes and events</a>
<ul class="sectlevel2">
<li><a href="#_notes">6.1. Notes</a></li>
<li><a href="#_other_events">6.2. Other Events</a>
<ul class="sectlevel3">
<li><a href="#_control_changes_0xb0">6.2.1. Control Changes (0xB0)</a></li>
<li><a href="#_program_change_0xc0">6.2.2. Program Change (0xC0)</a></li>
<li><a href="#_channel_pressure_monophonic_aftertouch_0xd0">6.2.3. Channel Pressure / "Monophonic Aftertouch" (0xD0)</a></li>
<li><a href="#_pitch_bend_0xe0_only_7bit_msb">6.2.4. Pitch Bend (0xE0 - only 7bit MSB)</a></li>
<li><a href="#_polyphonic_aftertouch_0xa0">6.2.5. Polyphonic Aftertouch (0xA0)</a></li>
</ul>
</li>
</ul>
</li>
<li><a href="#_editing_and_moving_events">7. Editing and Moving Events</a>
<ul class="sectlevel2">
<li><a href="#_text_annotation">7.1. Text Annotation</a></li>
<li><a href="#_selections">7.2. Selections</a>
<ul class="sectlevel3">
<li><a href="#_invert_selection">7.2.1. Invert selection</a></li>
</ul>
</li>
<li><a href="#_change_event_position">7.3. Change event position</a></li>
<li><a href="#_changing_note_durations">7.4. Changing Note Durations</a></li>
<li><a href="#_snap_to_grid_and_positions">7.5. Snap to Grid and Positions</a></li>
<li><a href="#_change_note_volume_velocity">7.6. Change Note Volume / Velocity</a></li>
<li><a href="#_copy_cut_paste">7.7. Copy, Cut, Paste</a></li>
<li><a href="#_undo_changes_undo_redo">7.8. Undo changes / Undo &amp; Redo</a></li>
</ul>
</li>
<li><a href="#_velocity_view">8. Velocity View</a></li>
<li><a href="#_miscellaneous_for_advanced_users">9. Miscellaneous for Advanced Users</a>
<ul class="sectlevel2">
<li><a href="#_parameters_and_settings_at_the_beginning_of_the_track">9.1. Parameters and Settings at the Beginning of the Track</a></li>
<li><a href="#_high_resolution_midi_parameters_msb_and_lsb">9.2. High Resolution MIDI Parameters (MSB and LSB)</a></li>
<li><a href="#_overlapping_notes">9.3. Overlapping Notes</a></li>
<li><a href="#_control_changes_are_upside_down_in_vico">9.4. Control changes are upside down in Vico.</a></li>
<li><a href="#_rounding_error_my_notes_are_at_the_wrong_position">9.5. Rounding Error: My Notes are at the Wrong Position</a></li>
</ul>
</li>
<li><a href="#_installation_and_start">10. Installation and Start</a></li>
<li><a href="#_help_and_development">11. Help and Development</a>
<ul class="sectlevel2">
<li><a href="#_testing_and_reporting_errors">11.1. Testing and Reporting Errors</a></li>
<li><a href="#_programming">11.2. Programming</a></li>
<li><a href="#_translations">11.3. Translations</a></li>
</ul>
</li>
</ul>
</div>
</div>
<div id="content">
<div id="preamble">
<div class="sectionbody">
<div class="paragraph">
<p>For program version 1.2.2</p>
</div>
</div>
</div>
<div class="sect1">
<h2 id="_introduction">1. Introduction</h2>
<div class="sectionbody">
<div class="paragraph">
<p>THIS PROGRAM IS NO LONGER IN DEVELOPMENT. NO FURTHER UPDATES!
In August 2020 it became clear that the choice of programming languages and libraries lead to grave performance problems.
Combined with the fact that this is hardly a unique program, a piano roll midi sequencer, it has been decided that
no further development will happen. Here is the original description of the program:</p>
</div>
<div class="paragraph">
<p>Vico is a minimalistic Midi sequencer that is intended to be used in parallel with other software.</p>
</div>
<div class="paragraph">
<p>"Vico" (with c like ts in "bats") just means "sequence" or "order" in Esperanto for obvious reasons.</p>
</div>
<div class="paragraph">
<p>In a loop- or pattern based environment you often want to have a 'free flowing' track in order to
create an instrumental solo, for example. Sometimes you just want to record a sketch or an idea
quickly and not open or create an entire DAW project.</p>
</div>
<div class="paragraph">
<p>Vico fulfills these conditions by connecting exactly one source to one output, and records and
plays back in between. Or to put it another way: you only get one track, intended
for one instrument (but with convenient layers).</p>
</div>
<div class="paragraph">
<p>Vico has been written primarily for users of Patroneo, but has no closer technical bond. Patroneo
is a program characterized by strict repetitions and constant reuse of very short patterns. With
this you can quickly create whole arrangements for drums, bass and accompaniment chords, but a
beautiful, long melody is extremely cumbersome. Therefore Vico wants to solve this problem.</p>
</div>
<div class="paragraph">
<p>However, all programs that run as JACK transport masters or JACK timebase masters are suitable as
"remote control".</p>
</div>
<div class="sect2">
<h3 id="_basic_principles">1.1. Basic Principles</h3>
<div class="paragraph">
<p>Vico itself doesn&#8217;t create sounds and offers only a single output for JACK midi and organizes all
events on up to ten layers, similar to graphics programs.</p>
</div>
<div class="paragraph">
<p>There is an input for JACK-Midi to which you can connect MIDI instruments or other programs.</p>
</div>
<div class="paragraph">
<p>At the start you see an empty track. The playhead is always at the point where JACK Transport is
located.</p>
</div>
<div class="paragraph">
<p>The bar lines are also shown in the meter of the JACK master. If none present, there are no bars.</p>
</div>
<div class="paragraph">
<p>A red playhead indicates that you are in recording mode.</p>
</div>
<div class="paragraph">
<p>If transport is in progress, a midi keyboard or similar can be used to record events.</p>
</div>
<div class="paragraph">
<p>With mouse and keyboard all events can be set by hand and changed afterwards. (see below). With the
exception of Velocity, all events are displayed in the main track.</p>
</div>
<div class="paragraph">
<p>To simplify things, you can switch a rhythm grid on and off as well as use a 'snap to grid'
functionality.</p>
</div>
<div class="paragraph">
<p>All editing requires the creation of a selection by using the Shift and the left mouse button to
draws a rectangle. A click with the right mouse button ends the selection.</p>
</div>
<div class="paragraph">
<p>Starting, saving, loading and closing your project is best done through the New Session Manager.</p>
</div>
</div>
<div class="sect2">
<h3 id="_midi_support">1.2. MIDI support</h3>
<div class="paragraph">
<p>Vico supports all MIDI channel messages:</p>
</div>
<div class="ulist">
<ul>
<li>
<p>Notes (ON 0x80 and OFF 0x90 are combined to a rectangular note)</p>
</li>
<li>
<p>Control Changes (0xB0)</p>
</li>
<li>
<p>Program Change (0xC0)</p>
</li>
<li>
<p>Channel Pressure / "Monophonic Aftertouch" (0xD0)</p>
</li>
<li>
<p>Pitch Bend (0xE0 - only 7bit MSB)</p>
</li>
<li>
<p>Polyphonic Aftertouch (0xA0)</p>
</li>
</ul>
</div>
<div class="paragraph">
<p>All messages can either be recorded live or entered manually. Post-production is possible for all
channel messages.</p>
</div>
<div class="paragraph">
<p>The midi channel is discarded during recording. Instead, each layer has the option of setting a
channel on which transmission takes place.</p>
</div>
<div class="paragraph">
<p>All non-musical events (0xF&#8230;&#8203;) are ignored, including all MIDI transport messages (not JACK
transport), tune requests, etc. The same applies to SystemExclusive events.</p>
</div>
</div>
<div class="sect2">
<h3 id="_mouse_and_keyboard_shortcuts">1.3. Mouse and keyboard shortcuts</h3>
<div class="paragraph">
<p>All keyboard shortcuts can be found in the menus, there are no "secret" keys.</p>
</div>
<div class="paragraph">
<p>In contrast, mouse commands are not available in the graphical user interface and have to be
learned here:</p>
</div>
<div class="paragraph">
<p>(LM = Left mouse button, RM = Right mouse button, Wheel = Move mouse wheel, MM = Middle mouse button, usually by pressing the wheel itself)</p>
</div>
<div class="ulist">
<ul>
<li>
<p>Shift + hold LM, move mouse: Draws a rectangle to select events.</p>
</li>
<li>
<p>RM on the background: Resets the selection.</p>
</li>
<li>
<p>LM on a selected event, then move mouse: Moves selected events up/down or left/right</p>
</li>
<li>
<p>Keep control (Ctrl) pressed: Moves left / right only</p>
</li>
<li>
<p>Hold down the Alt key: Moves only up / down</p>
</li>
<li>
<p>MM: Plays the note under the mouse pointer. There does not have to be an actual note, the position alone is enough. This is also possible on the piano.</p>
</li>
<li>
<p>RM on an event: Opens a menu with further commands.</p>
</li>
<li>
<p>Wheel: Scrolls the note area up and down.</p>
</li>
<li>
<p>Wheel, keep Alt pressed: Scrolls the note area left and right</p>
</li>
<li>
<p>Wheel on Velocities in the lower area: Changes the volume of the individual note, independent of the current selection.</p>
</li>
<li>
<p>Ctrl + Space: Starts playback at cursor position</p>
</li>
</ul>
</div>
</div>
</div>
</div>
<div class="sect1">
<h2 id="_description_of_the_graphical_user_interface_and_its_functions">2. Description of the graphical user interface and its functions</h2>
<div class="sectionbody">
<div class="imageblock">
<div class="content">
<a class="image" href="overview-english.png"><img src="overview-english.png" alt="Screenshot with Captions"></a>
</div>
</div>
<div class="paragraph">
<p>All points, and more, are discussed in detail below.</p>
</div>
<div class="ulist">
<ul>
<li>
<p><strong>[A]</strong> Menu bar</p>
</li>
<li>
<p><strong>[B]</strong> Main view (music and events)</p>
</li>
<li>
<p><strong>[C]</strong> Piano</p>
</li>
<li>
<p><strong>[D]</strong> Velocity View</p>
</li>
<li>
<p><strong>[E]</strong> Some notes</p>
</li>
<li>
<p><strong>[F]</strong> Another event, as an example</p>
</li>
<li>
<p><strong>[G]</strong> Status bar with current layer and layers MIDI channel</p>
</li>
</ul>
</div>
<div class="paragraph">
<p>Normally, when Vico is running in Agordejo (new-session manager), there is no internal way to <strong>exit</strong> the
program. If you use options of your window manager like [X], Alt+F4 etc., the graphical user
interface will only be hidden.</p>
</div>
<div class="paragraph">
<p>To really close Vico you can use Agordejo (New Session Manager). Here you can also restore
visibility.</p>
</div>
<div class="paragraph">
<p>The current visibility setting will be saved.</p>
</div>
</div>
</div>
<div class="sect1">
<h2 id="_piano_at_the_left_side">3. Piano at the left side</h2>
<div class="sectionbody">
<div class="paragraph">
<p>At the left side of the program window is a rotated keyboard. It serves only as an orientation aid.</p>
</div>
<div class="paragraph">
<p>The numbers between 0 and 127 written in the keys are MIDI pitches. 60 is the middle C in this system.</p>
</div>
<div class="paragraph">
<p>If the middle mouse button is held down and the mouse is moved over the keyboard, the pitch sounds
via the connected instrument.</p>
</div>
</div>
</div>
<div class="sect1">
<h2 id="_main_view">4. Main View</h2>
<div class="sectionbody">
<div class="paragraph">
<p>The main view uses rhythm as a linear dimension (technically: midi ticks). This means
that a note with the same duration always looks the same.
If the tempo (BPM) changes, the playhead moves faster or slower.
Conversely, this means that there can be no timeline where you can see at which second an event
takes place.</p>
</div>
<div class="sect2">
<h3 id="_moving_and_navigation">4.1. Moving and Navigation</h3>
<div class="paragraph">
<p>The mouse wheel scrolls the main view up and down. Pressing the Alt key scrolls forwards or
backwards (left / right) instead.</p>
</div>
<div class="paragraph">
<p>The "Navigation" menu offers additional options.</p>
</div>
</div>
<div class="sect2">
<h3 id="_zoom_and_scaling">4.2. Zoom and Scaling</h3>
<div class="paragraph">
<p>If you hold down Ctrl and turn the mouse wheel, the main view becomes larger or smaller.</p>
</div>
<div class="paragraph">
<p>If you hold down Shift while turning , only the time axis will be scaled. Notes are compressed or
stretched so that you can either see more at once or set more precise start and end positions.</p>
</div>
<div class="paragraph">
<p>Zooming and scaling is purely visual and has no effect on the music itself.</p>
</div>
</div>
<div class="sect2">
<h3 id="_layers">4.3. Layers</h3>
<div class="paragraph">
<p>Notes are not organized in tracks, but in layers. There are ten of them.
In the "Layers" menu, or with the function keys F1 to F10, the current layer can be selected.</p>
</div>
<div class="sect3">
<h4 id="_shadows">4.3.1. Shadows</h4>
<div class="paragraph">
<p>Layers lie on top of each other and obstruct each other. However, you can activate so-called
shadows, which project another layer onto the current one. Shadows cannot be edited. All shadows
disappear as soon as you change the active layer.</p>
</div>
<div class="paragraph">
<p>Shift+function key, e.g. F3, shows the third layer as shadow. F12 shows all as shadows.</p>
</div>
</div>
<div class="sect3">
<h4 id="_colors">4.3.2. Colors</h4>
<div class="paragraph">
<p>Each layer can have a color, which can be selected in the layer menu. Mainly notes and events use
this color. The mouse pointer is always in the inverted color.</p>
</div>
</div>
<div class="sect3">
<h4 id="_midi_channels">4.3.3. Midi Channels</h4>
<div class="paragraph">
<p>Channels are not properties of events. Each layer has its own midi channel, between 1 and 16, on
which sending takes place. For a new project this is always channel 1.</p>
</div>
<div class="paragraph">
<p>When recording, all incoming midi channels are listened to, but the channel gets discarded
immediately and changed to the respective layer channel.</p>
</div>
</div>
</div>
</div>
</div>
<div class="sect1">
<h2 id="_live_recording">5. Live Recording</h2>
<div class="sectionbody">
<div class="paragraph">
<p>Vico has a MIDI-in jackport to which you can connect any software or hardware instruments.</p>
</div>
<div class="paragraph">
<p>The input port will route everything immediately to the output port, regardless of Vicos internal
state (recording or not), but with the channel of the current layer. Routing is done in real time.</p>
</div>
<div class="paragraph">
<p>To record something, the recording mode must be activated (Edit&#8594;"Toggle recording mode"). This is
already the case when the program starts. A red playhead shows recording mode, a black one is just
playback. JACK Transport must also be running. If neither is the case, Vico reacts, e.g. to notes,
by just marking the pitch in color.</p>
</div>
<div class="paragraph">
<p>Since Vico always follows the JACK time-base (see below), the recording also takes place at this
position. You can jump to the position in another program where you want to record a solo and press
Play in this program. In principle Vico can be used like a program running in the background (which
in fact works with NSM&#8217;s GUI hiding).</p>
</div>
<div class="sect2">
<h3 id="_layer_filter">5.1. Layer Filter</h3>
<div class="paragraph">
<p>It quickly happens that you record a plethora of events that make further editing extremely
tedious. Imagine, additionaly to a melody there is also MIDI aftertouch on every note, and the
Modwheel (CC) is also used. The whole screen will be full of symbols.</p>
</div>
<div class="paragraph">
<p>In the "Filter" menu are several ways to sort and move events.</p>
</div>
<div class="paragraph">
<p>The simplest usage is to use a filter for all layers and only set the event type, e.g. aftertouch.
Now all aftertouch events will be moved to the current layer.</p>
</div>
<div class="paragraph">
<p>In addition, you can of course set the target layer yourself. It is also possible to define the
respective MIDI bytes as upper and lower limits.</p>
</div>
<div class="paragraph">
<p>Example: Event type "Note" with Byte1 Minimum 0 and Maximum 59 moves all low notes, e.g. the
accompaniment of a piano piece, but all high notes remain on the target layer.</p>
</div>
<div class="paragraph">
<p>The other menu commands in "Filter" offer variations, but work in the same way.</p>
</div>
</div>
<div class="sect2">
<h3 id="_jack_transport_and_timebase_bar_lines">5.2. JACK Transport and Timebase: Bar lines</h3>
<div class="paragraph">
<p>Vico was constructed with the declared goal of running as slave in a session. If you start it alone
you can of course record and use all functions, but you cannot see barlines and it&#8217;s a little
harder to find the right positions.</p>
</div>
<div class="paragraph">
<p>If there is a program that acts as JACK timebase "master" Vico will follow its time signature and
transport position.</p>
</div>
<div class="paragraph">
<p>With "Edit"&#8594;"Show rhythm lines in grid" (key L) you can switch off bar lines completely.</p>
</div>
<div class="paragraph">
<p>Vico has no predetermined duration. The main view has practically infinite dimensions, and you
always work where all other programs are.</p>
</div>
<div class="paragraph">
<p>As soon as Transport is running, the main view jumps to Playhead unless Edit&#8594;"Follow Playhead" is
disabled.</p>
</div>
<div class="paragraph">
<p>Starting and stopping the transport is possible from any running JACK program, including Vico
itself. (space bar)</p>
</div>
</div>
</div>
</div>
<div class="sect1">
<h2 id="_notes_and_events">6. Notes and events</h2>
<div class="sectionbody">
<div class="paragraph">
<p>If you want to insert notes and events with mouse and keyboard and not record them via MIDI
instrument, the menus "Input" and "Grid" offer numerous ways.</p>
</div>
<div class="paragraph">
<p>Events are always sent on the midi channel of their respective layer.</p>
</div>
<div class="sect2">
<h3 id="_notes">6.1. Notes</h3>
<div class="paragraph">
<p>When the program starts, the mouse pointer is a small rectangle with a text indicating the pitch.
This is the mode for entering notes of arbitrary length. By holding down and dragging the left
mouse button you can draw notes. You must first move the mouse pointer to the correct pitch. and
then start drawing.</p>
</div>
<div class="paragraph">
<p>Fixed durations are available in the "Input" menu. These can be selected with the number keys.
After key "1" a click with the left mouse button inserts a whole note, with key "2" a Half note
etc. "0" selects the free mode again.</p>
</div>
<div class="paragraph">
<p>Dotted note lengths can be switched on and off for all fixed durations.</p>
</div>
<div class="paragraph">
<p>Inserted notes have an average velocity (median) of all previous notes.</p>
</div>
</div>
<div class="sect2">
<h3 id="_other_events">6.2. Other Events</h3>
<div class="paragraph">
<p>All other events can also be inserted with the mouse. This may not be very convenient or fast due
to large amounts of data, but it is at least possible. A live recording is probably preferable.</p>
</div>
<div class="sect3">
<h4 id="_control_changes_0xb0">6.2.1. Control Changes (0xB0)</h4>
<div class="paragraph">
<p>First you have to select the CC type in a submenu, e.g. "Volume (CC7)".</p>
</div>
<div class="paragraph">
<p>The height in the main view determines intensity from 0 to 127.</p>
</div>
<div class="paragraph">
<p>If you want to set control changes of another type you have to select the menu entry again (or
press the shortcut).</p>
</div>
<div class="paragraph">
<p>Control Changes cannot later change their type, e.g. from Modwheel to Volume. They would have to be
deleted and recreated.</p>
</div>
</div>
<div class="sect3">
<h4 id="_program_change_0xc0">6.2.2. Program Change (0xC0)</h4>
<div class="paragraph">
<p>To change the program to select another instrument, simply set the event to a position. The label
indicates the program number and the General MIDI instrument. If the connected JACK-instrument does
not follow MIDI-naming, you can ignore the names.</p>
</div>
</div>
<div class="sect3">
<h4 id="_channel_pressure_monophonic_aftertouch_0xd0">6.2.3. Channel Pressure / "Monophonic Aftertouch" (0xD0)</h4>
<div class="paragraph">
<p>Channel Pressure presents itself as a simple X without further labeling or selection.
The "higher" its position, the more intense.</p>
</div>
</div>
<div class="sect3">
<h4 id="_pitch_bend_0xe0_only_7bit_msb">6.2.4. Pitch Bend (0xE0 - only 7bit MSB)</h4>
<div class="paragraph">
<p>Pitch Bend presents itself as a small circle without further labeling or choices. The
"higher", the more intensive.</p>
</div>
</div>
<div class="sect3">
<h4 id="_polyphonic_aftertouch_0xa0">6.2.5. Polyphonic Aftertouch (0xA0)</h4>
<div class="paragraph">
<p>First you have to select, in a submenu, the note for which you want Aftertouch to apply. Then you
can insert the event. Intensity is, again, the "pitch". If you want to set Polyphonic Aftertouch
for another note you have to select the menu entry again (or press the shortcut).</p>
</div>
<div class="paragraph">
<p>Polyphonic Aftertouch cannot later change their relation to a pitch.
They would have to be deleted and recreated.</p>
</div>
</div>
</div>
</div>
</div>
<div class="sect1">
<h2 id="_editing_and_moving_events">7. Editing and Moving Events</h2>
<div class="sectionbody">
<div class="paragraph">
<p>All events can be edited after inserting. If tidiness has been established by using layers, maybe
through filters, editing becomes much easier.</p>
</div>
<div class="paragraph">
<p>Writing text annotations is the only function in the main view that does not require creating a
selection.</p>
</div>
<div class="paragraph">
<p>Everything else requires selected events, even if it is only one.</p>
</div>
<div class="sect2">
<h3 id="_text_annotation">7.1. Text Annotation</h3>
<div class="paragraph">
<p>If no selection exists at the moment, the right mouse button can be used to write a text annotation
on an event. It has no effect on the music.</p>
</div>
</div>
<div class="sect2">
<h3 id="_selections">7.2. Selections</h3>
<div class="paragraph">
<p>First of all, right-clicking is the best way to deselect your selection.</p>
</div>
<div class="paragraph">
<p>If you hold down the Shift key, the input-event symbols disappear from the mouse pointer. Instead,
you get the normal pointer and can press, hold and drag a rectangle to select events.</p>
</div>
<div class="paragraph">
<p>Additionally marked events will be added to the existing selection.</p>
</div>
<div class="paragraph">
<p>The selection can extend over several layers.</p>
</div>
<div class="paragraph">
<p>The main view scrolls automatically when you move the mouse pointer to the left or right edge. But
often zooming out is the better way to mark many events at once.</p>
</div>
<div class="paragraph">
<p>The "Edit" menu offers the possibility to select the whole layer (Ctrl+A) or even all layers
(Ctrl+Shift+A)</p>
</div>
<div class="sect3">
<h4 id="_invert_selection">7.2.1. Invert selection</h4>
<div class="paragraph">
<p>If you use the Ctrl key instead of Shift, the selection is inverted: Selected notes are deselected,
all others become marked.</p>
</div>
<div class="paragraph">
<p>This is especially useful if you want to remove single notes from a selection, for example after
Ctrl+A.</p>
</div>
</div>
</div>
<div class="sect2">
<h3 id="_change_event_position">7.3. Change event position</h3>
<div class="paragraph">
<p>By pressing / holding / dragging with the left mouse button, all events can be moved both in their
timeline position (left/right) as well as their pitch or event intensity (up/down).</p>
</div>
<div class="paragraph">
<p>If you hold down the Alt key, events only move to the left/right, no matter if the mouse also moves
up and down. This increases control and prevents slips in pitch.</p>
</div>
<div class="paragraph">
<p>If you hold down the Ctrl key, events only move up/down, no matter if the mouse also moves to the
left or right. This increases control and prevents slippage in the Position in time.</p>
</div>
<div class="paragraph">
<p>You can also use the arrow keys to move events step by step in all directions. This method is
sometimes the fastest and most accurate.</p>
</div>
</div>
<div class="sect2">
<h3 id="_changing_note_durations">7.4. Changing Note Durations</h3>
<div class="paragraph">
<p>The duration of notes in the selection can be changed both to forward and backward. To do this, you
can move the mouse to the left or right edge of a note with the left mouse button (push/hold/pull).
All selected notes are changed by the same amount.</p>
</div>
<div class="paragraph">
<p>There is a minimum duration that cannot be shortened. Only one of the selected notes has to meet
this minimum duration in order to stop the entire process.</p>
</div>
<div class="paragraph">
<p>If non-notes are selected at the same time, they are ignored during the process.</p>
</div>
</div>
<div class="sect2">
<h3 id="_snap_to_grid_and_positions">7.5. Snap to Grid and Positions</h3>
<div class="paragraph">
<p>The "Snap to Grid" menu allows you to place events on a fixed position. When the program is
started, the grid is initially switched off: free positioning at any time position is possible.</p>
</div>
<div class="paragraph">
<p>Like the number keys set note duration, Shift+numbers set the grid-rhythm for snapping. A quarter
note grid allows only events and notes on quarter note positions.</p>
</div>
<div class="paragraph">
<p>Setting Snap To Grid to eighths or sixteenths notes is usually a good compromise between robust
input and rhythmic flexibility.</p>
</div>
<div class="paragraph">
<p>With free note duration (Shift+0), the beginning is bound to the grid, but the end is free.</p>
</div>
<div class="paragraph">
<p>When modifying note durations, the grid is active.</p>
</div>
</div>
<div class="sect2">
<h3 id="_change_note_volume_velocity">7.6. Change Note Volume / Velocity</h3>
<div class="paragraph">
<p>In the main view, you can only change the volume of notes using menu commands. Another option is
the Velocity View (see below).</p>
</div>
<div class="paragraph">
<p>The "Edit" menu offers several options: You can increase or decrease velocities step by step. The
keyboard shortcuts are + and -.</p>
</div>
<div class="paragraph">
<p>There is also a command that allows you either to change all notes relatively or to set all notes
to a fixed value. If you write a "+" or "-" in front of the value in the input line the change is
considered relative.</p>
</div>
<div class="paragraph">
<p>Example: "+23" increases all velocities by 23, "23" sets all to 23, "-42" decreases all by 42.</p>
</div>
<div class="paragraph">
<p>Caution! It is technically allowed to have velocities smaller than 0 and larger than 127. This is
not musically possible and must be observed and corrected by hand.</p>
</div>
<div class="paragraph">
<p>A further command is to "compress" velocities. All velocities are compressed proportionally into a
new boundary. For example: Velocities 0 (lowest), 64 (middle) and 127 (highest) are compressed to
value between 70 and 90. We get: 70 (lowest), 80 (middle), and 90 (highest).</p>
</div>
<div class="paragraph">
<p>All these commands ignore non-notes.</p>
</div>
</div>
<div class="sect2">
<h3 id="_copy_cut_paste">7.7. Copy, Cut, Paste</h3>
<div class="paragraph">
<p>As in almost all programs there are copy, cut and paste.
The usual shortcuts are used: Ctrl+C, Ctrl+X, Ctrl+V.</p>
</div>
<div class="paragraph">
<p>Selected notes are copied to a background buffer with Ctrl+C; Ctrl+X deletes the original
selection. Since the selection can span several layers, one can also copy from multiple layers.</p>
</div>
<div class="paragraph">
<p>Ctrl+V inserts a copy <strong>at the same place</strong>.
It is possible to change the layer to insert a copy.</p>
</div>
<div class="paragraph">
<p>If you insert notes on the same layer, the notes overlap initially, so they are "invisible"! But
only one set of notes is selected! This means that you can move notes immediately.</p>
</div>
</div>
<div class="sect2">
<h3 id="_undo_changes_undo_redo">7.8. Undo changes / Undo &amp; Redo</h3>
<div class="paragraph">
<p>Ctrl+Z ("Undo") reverts the last change.</p>
</div>
<div class="paragraph">
<p>Ctrl+Shift+Z ("Redo") cancels the last undo, i.e. goes back one step (&#8230;&#8203;forward?). If you have
changed something in the meantime, Redo is no longer possible.</p>
</div>
<div class="paragraph">
<p>Undo is only possible to the state of the program start.</p>
</div>
</div>
</div>
</div>
<div class="sect1">
<h2 id="_velocity_view">8. Velocity View</h2>
<div class="sectionbody">
<div class="paragraph">
<p>The velocity view is located at the bottom of the program window. It serves as an overview of
volume and also allows you to change individual notes.</p>
</div>
<div class="paragraph">
<p>The special characteristic of this view is that it only displays notes and no other events, and
secondly only selected notes are displayed. Even individual chord members can be reviewed without
obstruction from other notes.</p>
</div>
<div class="paragraph">
<p>The velocity view shows all notes below their starting position in the main view, i.e. scrolls at
the same rate. Each column is a note. The rhythm is not displayed; all columns have the same width.</p>
</div>
<div class="paragraph">
<p>If the mouse cursor hovers over a column, the mouse wheel will change velocity in steps of two for
exactly that one note. To change the velocities of all selected notes at once, you must use the
menu commands in the Use "Edit" menu (see above)</p>
</div>
</div>
</div>
<div class="sect1">
<h2 id="_miscellaneous_for_advanced_users">9. Miscellaneous for Advanced Users</h2>
<div class="sectionbody">
<div class="sect2">
<h3 id="_parameters_and_settings_at_the_beginning_of_the_track">9.1. Parameters and Settings at the Beginning of the Track</h3>
<div class="paragraph">
<p>There is no hidden data or settings. Everything Vico sends is also visible to the user. This means
above all that there are no default values for a songs beginning.</p>
</div>
<div class="paragraph">
<p>For example: In a piece for Violin you change the instrument to a Viola (Program Change) at the end
of the piece. If played back from the start it will still be the Viola, because the connected
JACK-instrument did not receive a message to switch to a Violin.</p>
</div>
<div class="paragraph">
<p>Therefore you have to set the violin explicitly at the start.
The same applies to pitch bend or control changes such as piano pedal, modwheel, expression etc..</p>
</div>
</div>
<div class="sect2">
<h3 id="_high_resolution_midi_parameters_msb_and_lsb">9.2. High Resolution MIDI Parameters (MSB and LSB)</h3>
<div class="paragraph">
<p>Some MIDI parameters are 14bit instead of the usual 7bit. They are built from two values. This is
standard midi practice and must be learned from another source.
For Vico, these values must also be set as two separate 7bit entries.</p>
</div>
</div>
<div class="sect2">
<h3 id="_overlapping_notes">9.3. Overlapping Notes</h3>
<div class="paragraph">
<p>The MIDI format does not forbid a Note-On to be followed by another Note-On of the same pitch
without a Note-Off having occurred beforehand. It does not make much musical sense in most cases,
but it is permitted by the MIDI standard and therefore supported by Vico. In general you should try
to avoid overlapping notes of the same pitch (even on multiple layers if they share the same midi
channel).</p>
</div>
</div>
<div class="sect2">
<h3 id="_control_changes_are_upside_down_in_vico">9.4. Control changes are upside down in Vico.</h3>
<div class="paragraph">
<p>Wise MIDI-owls know: MIDI messages have two parameters (Byte1 and Byte2). For notes, byte1 is pitch
and byte2 velocity. For control changes byte1 is the type (e.g. volume) and byte2 the intensity.
But in Vico, CCs show Byte2 as pitch, so you can actually shift them up and down.</p>
</div>
</div>
<div class="sect2">
<h3 id="_rounding_error_my_notes_are_at_the_wrong_position">9.5. Rounding Error: My Notes are at the Wrong Position</h3>
<div class="paragraph">
<p>Mathematics and computing cannot be cheated anymore at some point. With extreme scaling
(Ctrl+Shift+Mouse wheel), when notes are very strongly compressed and 64th notes get placed on a
64th grid, rounding errors may occur and thus mispositioning will happen by a few pixels or midi
ticks.</p>
</div>
<div class="paragraph">
<p>Solution: Change the scaling, display notes more stretched.</p>
</div>
</div>
</div>
</div>
<div class="sect1">
<h2 id="_installation_and_start">10. Installation and Start</h2>
<div class="sectionbody">
<div class="paragraph">
<p>Vico is exclusive for Linux. The best way to install is to use your package manager.
If it is not there, or only in an outdated version, please ask your Linux distribution to provide a recent version.</p>
</div>
<div class="paragraph">
<p>If available in the package repository, please continue reading directly at "Start vico from Agordejo / New Session Manager".
If not, you can build Vico yourself.</p>
</div>
<div class="ulist">
<div class="title">Build and Install</div>
<ul>
<li>
<p>Please check the supplied README.md for dependencies.</p>
</li>
<li>
<p>You can download a release or clone the git version</p>
<div class="ulist">
<ul>
<li>
<p>Download the latest version from <a href="https://www.laborejo.org/downloads" class="bare">https://www.laborejo.org/downloads</a> and extract it.</p>
</li>
<li>
<p>git clone <a href="https://git.laborejo.org/lss/vico.git" class="bare">https://git.laborejo.org/lss/vico.git</a></p>
</li>
</ul>
</div>
</li>
<li>
<p>Change into the new directory and use these commands:</p>
</li>
<li>
<p><code>./configure --prefix=/usr</code></p>
<div class="ulist">
<ul>
<li>
<p>The default prefix is /usr/local</p>
</li>
</ul>
</div>
</li>
<li>
<p><code>make</code></p>
</li>
<li>
<p><code>sudo make install</code></p>
</li>
</ul>
</div>
<div class="ulist">
<div class="title">Start vico from Agordejo (New Session Manager, NSM)</div>
<ul>
<li>
<p>Run <code>agordejo</code></p>
</li>
<li>
<p>Press the <code>New</code> button, and enter a name for your piece of music.</p>
</li>
<li>
<p>Use the launcher to add <code>vico</code> to the session.</p>
</li>
<li>
<p>Add any compatible programs, e.g. synthesizers.</p>
</li>
</ul>
</div>
<div class="paragraph">
<p>Please read README.md for other ways of starting vico, which are impractical for actual use but can
be helpful for testing and development.</p>
</div>
</div>
</div>
<div class="sect1">
<h2 id="_help_and_development">11. Help and Development</h2>
<div class="sectionbody">
<div class="paragraph">
<p>You can help Vico in several ways: Testing and reporting errors, translating, marketing, support, programming and more.</p>
</div>
<div class="sect2">
<h3 id="_testing_and_reporting_errors">11.1. Testing and Reporting Errors</h3>
<div class="paragraph">
<p>If you find a bug in the program (or it runs too slow) please contact us in a way that suits you best.
We are thankful for any help.</p>
</div>
<div class="ulist">
<div class="title">How to contact us</div>
<ul>
<li>
<p>Report bugs and issues: <a href="https://www.laborejo.org/bugs" class="bare">https://www.laborejo.org/bugs</a></p>
</li>
<li>
<p>Website: <a href="https://www.laborejo.org" class="bare">https://www.laborejo.org</a></p>
</li>
<li>
<p>E-Mail: <a href="mailto:info@laborejo.org">info@laborejo.org</a></p>
</li>
<li>
<p>If you see the opportunity and know that a developer will read it also forums, social media etc..</p>
</li>
</ul>
</div>
</div>
<div class="sect2">
<h3 id="_programming">11.2. Programming</h3>
<div class="paragraph">
<p>If you want to do some programming and don&#8217;t know where to start please get in contact with us directly.
The short version is: clone the git, change the code, create a git patch or point me to your public git.</p>
</div>
</div>
<div class="sect2">
<h3 id="_translations">11.3. Translations</h3>
<div class="paragraph">
<p>Vico is very easy to translate with the help of the Qt-Toolchain, without any need for programming.
The easiest way is to contact the developers and they will setup the new language.</p>
</div>
<div class="paragraph">
<p>However, here are the complete instructions for doing a translation completely on your own and integrating it into the program.
The program is split in two parts. A shared "template" between the Laborejo Software Suite and the actual program.</p>
</div>
<div class="paragraph">
<p>The process is the same for both parts, but needs to be done in different directories:
<code>template/qtgui</code> and plain <code>/qtgui</code>, relative to the root directory, where the vico executable is.</p>
</div>
<div class="paragraph">
<p>Everytime you see "template/qtgui" below you can substitute that with just "qtgui" to translate the other part of Vico.</p>
</div>
<div class="paragraph">
<p>You can add a new language like this:</p>
</div>
<div class="ulist">
<ul>
<li>
<p>Open a terminal and navigate to template/qtgui/resources/translations</p>
</li>
<li>
<p>Edit the file <code>config.pro</code> with a text editor</p>
<div class="ulist">
<ul>
<li>
<p>Append the name of your language in the last line, in the form <code>XY.ts</code>, where XY is the language code.</p>
</li>
<li>
<p>Make sure to leave a space between the individual languages entries.</p>
</li>
</ul>
</div>
</li>
<li>
<p>Run <code>sh update.sh</code> in the same directory</p>
<div class="ulist">
<ul>
<li>
<p>The program has now generated a new <code>.ts</code> file in the same directory.</p>
</li>
</ul>
</div>
</li>
<li>
<p>Start Qt Linguist with <code>linguist-qt5</code> (may be named differently) and open your newly generated file</p>
</li>
<li>
<p>Select your "Target Language" and use the program to create a translation</p>
</li>
<li>
<p>Send us the <code>.ts</code> file, such as by e-mail to <a href="mailto:info@laborejo.org">info@laborejo.org</a></p>
</li>
</ul>
</div>
<div class="paragraph">
<p>You can also incorporate the translation into Vico for testing purposes. This requires rudimentary Python knowledge.</p>
</div>
<div class="ulist">
<ul>
<li>
<p>Run the "Release" option in QtLinguists "File" menu. It creates a <code>.qm</code> file in the same directory as your <code>.ts</code> file.</p>
</li>
<li>
<p>Edit <code>template/qtgui/resources/resources.qrc</code> and duplicate the line <code>&lt;file&gt;translations/de.qm&lt;/file&gt;</code> but change it to your new .qm file.</p>
</li>
<li>
<p>run <code>sh buildresources.sh</code></p>
</li>
<li>
<p>Edit <code>engine/config.py</code>: add your language to the line that begins with "supportedLanguages" like this: <code>{"German": "de.qm", "Esperanto: "eo.qm"}</code></p>
<div class="ulist">
<ul>
<li>
<p>To find out your language string (German, Esperanto etc.) open the <code>python3</code> interpreter in a terminal and run the following command:</p>
</li>
<li>
<p><code>from PyQt5 import QtCore;QtCore.QLocale().languageToString(QtCore.QLocale().language())</code></p>
</li>
</ul>
</div>
</li>
</ul>
</div>
<div class="paragraph">
<p>To test the new translation you can either run the program normally, if your system is set to that language. Alternatively start vico via the terminal:</p>
</div>
<div class="ulist">
<ul>
<li>
<p><code>LANGUAGE=de_DE.UTF-8 ./vico -V --save /dev/null</code></p>
</li>
</ul>
</div>
</div>
</div>
</div>
</div>
<div id="footer">
<div id="footer-text">
Last updated 2021-01-18 00:43:11 +0100
</div>
</div>
</body>
</html>