├── .github └── workflows │ └── build.yml ├── .gitignore ├── .gitmodules ├── LICENSE ├── README.md ├── Rumor.png ├── Rumor ├── MOD │ ├── Rumor.ttl │ ├── manifest.ttl │ ├── modgui.ttl │ └── modgui │ │ ├── icon-rumor.html │ │ ├── knobs │ │ └── boxy │ │ │ └── black.png │ │ ├── pedals │ │ ├── boxy │ │ │ └── black.png │ │ └── footswitch.png │ │ ├── screenshot-rumor.png │ │ ├── stylesheet-rumor.css │ │ ├── thumbnail-rumor.png │ │ └── utils │ │ ├── dropdown-arrow-black.png │ │ └── dropdown-arrow-white.png ├── Rumor.c ├── Rumor.cpp ├── Rumor.ttl ├── gx_resampler.cc ├── gx_resampler.h ├── lv2_plugin.cc ├── lv2_plugin.h ├── makefile ├── manifest.ttl ├── rumor.cc ├── rumor.dsp ├── rumor_table.h └── zita-resampler-1.1.0 │ ├── AUTHORS │ ├── README │ ├── resampler-table.cc │ ├── resampler.cc │ └── zita-resampler │ ├── resampler-table.h │ └── resampler.h ├── makefile └── resources ├── LED_Red.c ├── LED_Red.png ├── footsw.c ├── footsw.png ├── fx_knob.c ├── fx_knob.png ├── monster.c └── monster.png /.github/workflows/build.yml: -------------------------------------------------------------------------------- 1 | name: build 2 | 3 | on: [push] 4 | 5 | jobs: 6 | build: 7 | 8 | runs-on: ubuntu-latest 9 | 10 | steps: 11 | - name: remove tag 12 | uses: dev-drprasad/delete-tag-and-release@v0.2.0 13 | with: 14 | delete_release: false 15 | tag_name: Latest 16 | env: 17 | GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} 18 | 19 | - uses: actions/checkout@v1 20 | - name: submodule update 21 | run: git submodule update --init 22 | - name: make lv2 23 | run: | 24 | sudo apt-get install lv2-dev libcairo2-dev libx11-dev 25 | - name: build 26 | run: make 27 | - name: compress 28 | run: | 29 | cd /home/runner/work/Rumor/Rumor/Rumor 30 | zip -r /home/runner/work/Rumor/Rumor/Rumor/Rumor.lv2.zip ./Rumor.lv2 31 | 32 | - name: Create Release 33 | id: create_release 34 | uses: actions/create-release@v1 35 | env: 36 | GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} 37 | with: 38 | tag_name: Latest 39 | release_name: Release latest 40 | draft: false 41 | prerelease: true 42 | 43 | - name: Upload Release Asset 44 | id: upload-release-asset 45 | uses: actions/upload-release-asset@v1 46 | env: 47 | GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} 48 | with: 49 | upload_url: ${{ steps.create_release.outputs.upload_url }} 50 | asset_path: /home/runner/work/Rumor/Rumor/Rumor/Rumor.lv2.zip 51 | asset_name: Rumor.lv2.zip 52 | asset_content_type: application/zip 53 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | *.a 2 | *.o 3 | *.lv2 4 | *.so 5 | Rumor/xresources.h 6 | -------------------------------------------------------------------------------- /.gitmodules: -------------------------------------------------------------------------------- 1 | [submodule "libxputty"] 2 | path = libxputty 3 | url = https://github.com/brummer10/libxputty.git 4 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | 2 | 0BSD 3 | 4 | BSD Zero Clause License 5 | 6 | Copyright (c) 2020 Hermann Meyer 7 | 8 | Permission to use, copy, modify, and/or distribute this software for any 9 | purpose with or without fee is hereby granted. 10 | 11 | THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH 12 | REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY 13 | AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, 14 | INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM 15 | LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR 16 | OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR 17 | PERFORMANCE OF THIS SOFTWARE. 18 | 19 | 20 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Rumor.lv2 2 | The Rumor is pure, nasty growling bass fuzz pedal, with bold out-front presence, and cutting articulation. 3 | 4 | ![Rumor](https://github.com/brummer10/Rumor/blob/master/Rumor.png?raw=true) 5 | 6 | ## Features 7 | 8 | - Nasty FUZZ simulation. 9 | 10 | ## Dependencys 11 | 12 | - libcairo2-dev 13 | - libx11-dev 14 | 15 | ## Binary 16 | 17 | ![example workflow](https://github.com/brummer10/Rumor/actions/workflows/build.yml/badge.svg) 18 | 19 | [Rumor.lv2.zip](https://github.com/brummer10/Rumor/releases/download/Latest/Rumor.lv2.zip) 20 | 21 | ## Build 22 | 23 | - git submodule init 24 | - git submodule update 25 | - make 26 | - make install # will install into ~/.lv2 ... AND/OR.... 27 | - sudo make install # will install into /usr/lib/lv2 28 | -------------------------------------------------------------------------------- /Rumor.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/brummer10/Rumor/5ad260520f118960c51123ecc6890afba7d81f61/Rumor.png -------------------------------------------------------------------------------- /Rumor/MOD/Rumor.ttl: -------------------------------------------------------------------------------- 1 | 2 | @prefix doap: . 3 | @prefix foaf: . 4 | @prefix lv2: . 5 | @prefix rdf: . 6 | @prefix rdfs: . 7 | @prefix guiext: . 8 | @prefix opts: . 9 | @prefix time: . 10 | @prefix units: . 11 | @prefix atom: . 12 | @prefix urid: . 13 | @prefix pprop: . 14 | @prefix midi: . 15 | @prefix patch: . 16 | 17 | 18 | 19 | a foaf:Person ; 20 | foaf:name "brummer" . 21 | 22 | 23 | a lv2:Plugin , 24 | lv2:DistortionPlugin ; 25 | doap:maintainer ; 26 | doap:name "Rumor" ; 27 | lv2:project ; 28 | lv2:requiredFeature urid:map ; 29 | lv2:optionalFeature lv2:hardRTCapable ; 30 | lv2:minorVersion 1 ; 31 | lv2:microVersion 2 ; 32 | 33 | guiext:ui ; 34 | 35 | rdfs:comment """ 36 | The Rumor is pure, nasty growling bass fuzz pedal, with bold out-front presence, and cutting articulation. 37 | """; 38 | 39 | 40 | lv2:port [ 41 | a lv2:AudioPort , 42 | lv2:InputPort ; 43 | lv2:index 0 ; 44 | lv2:symbol "in0" ; 45 | lv2:name "In0" ; 46 | ], [ 47 | a lv2:AudioPort , 48 | lv2:OutputPort ; 49 | lv2:index 1 ; 50 | lv2:symbol "out0" ; 51 | lv2:name "Out0" ; 52 | ], [ 53 | a lv2:InputPort , 54 | lv2:ControlPort ; 55 | lv2:index 2 ; 56 | lv2:designation lv2:enabled; 57 | lv2:portProperty lv2:toggled ; 58 | lv2:symbol "Bypass" ; 59 | lv2:name "bypass" ; 60 | lv2:default 1 ; 61 | lv2:minimum 0 ; 62 | lv2:maximum 1 ; 63 | ], [ 64 | a lv2:InputPort , 65 | lv2:ControlPort ; 66 | lv2:index 3 ; 67 | lv2:symbol "Knob1" ; 68 | lv2:name "intensity" ; 69 | lv2:default 0.000000 ; 70 | lv2:minimum 0.000000 ; 71 | lv2:maximum 1.000000 ; 72 | ], [ 73 | a lv2:InputPort , 74 | lv2:ControlPort ; 75 | lv2:index 4 ; 76 | lv2:symbol "Knob2" ; 77 | lv2:name "volume" ; 78 | lv2:default 0.5 ; 79 | lv2:minimum 0.000000 ; 80 | lv2:maximum 1.000000 ; 81 | ] . 82 | 83 | 84 | 85 | a guiext:X11UI; 86 | guiext:binary ; 87 | lv2:extensionData guiext::idle ; 88 | lv2:extensionData guiext:resize ; 89 | lv2:extensionData guiext:idleInterface ; 90 | lv2:requiredFeature guiext:idleInterface ; 91 | lv2:optionalFeature opts:options ; 92 | opts:supportedOption guiext:scaleFactor ; . 93 | -------------------------------------------------------------------------------- /Rumor/MOD/manifest.ttl: -------------------------------------------------------------------------------- 1 | 2 | @prefix lv2: . 3 | @prefix rdfs: . 4 | 5 | a lv2:Plugin ; 6 | lv2:binary ; 7 | rdfs:seeAlso . 8 | rdfs:seeAlso . 9 | -------------------------------------------------------------------------------- /Rumor/MOD/modgui.ttl: -------------------------------------------------------------------------------- 1 | @prefix modgui: . 2 | @prefix lv2: . 3 | 4 | 5 | modgui:gui [ 6 | modgui:resourcesDirectory ; 7 | modgui:iconTemplate ; 8 | modgui:stylesheet ; 9 | modgui:screenshot ; 10 | modgui:thumbnail ; 11 | modgui:brand "brummer" ; 12 | modgui:label "Rumor" ; 13 | modgui:model "boxy" ; 14 | modgui:panel "2-knobs" ; 15 | modgui:color "black" ; 16 | modgui:knob "black" ; 17 | modgui:port [ 18 | lv2:index 0 ; 19 | lv2:symbol "Knob2" ; 20 | lv2:name "volume" ; 21 | ] , [ 22 | lv2:index 1 ; 23 | lv2:symbol "Knob1" ; 24 | lv2:name "intensity" ; 25 | ] ; 26 | ] . 27 | -------------------------------------------------------------------------------- /Rumor/MOD/modgui/icon-rumor.html: -------------------------------------------------------------------------------- 1 |
2 |
3 |
4 |
5 | {{#controls}} 6 |
7 |
8 | {{name}} 9 |
10 | {{/controls}} 11 |
12 |
13 |
14 | {{#effect.ports.audio.input}} 15 |
16 |
17 |
18 | {{/effect.ports.audio.input}} 19 | {{#effect.ports.midi.input}} 20 |
21 |
22 |
23 | {{/effect.ports.midi.input}} 24 | {{#effect.ports.cv.input}} 25 |
26 |
27 |
28 | {{/effect.ports.cv.input}} 29 |
30 |
31 | {{#effect.ports.audio.output}} 32 |
33 |
34 |
35 | {{/effect.ports.audio.output}} 36 | {{#effect.ports.midi.output}} 37 |
38 |
39 |
40 | {{/effect.ports.midi.output}} 41 | {{#effect.ports.cv.output}} 42 |
43 |
44 |
45 | {{/effect.ports.cv.output}} 46 |
47 |
48 | -------------------------------------------------------------------------------- /Rumor/MOD/modgui/knobs/boxy/black.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/brummer10/Rumor/5ad260520f118960c51123ecc6890afba7d81f61/Rumor/MOD/modgui/knobs/boxy/black.png -------------------------------------------------------------------------------- /Rumor/MOD/modgui/pedals/boxy/black.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/brummer10/Rumor/5ad260520f118960c51123ecc6890afba7d81f61/Rumor/MOD/modgui/pedals/boxy/black.png -------------------------------------------------------------------------------- /Rumor/MOD/modgui/pedals/footswitch.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/brummer10/Rumor/5ad260520f118960c51123ecc6890afba7d81f61/Rumor/MOD/modgui/pedals/footswitch.png -------------------------------------------------------------------------------- /Rumor/MOD/modgui/screenshot-rumor.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/brummer10/Rumor/5ad260520f118960c51123ecc6890afba7d81f61/Rumor/MOD/modgui/screenshot-rumor.png -------------------------------------------------------------------------------- /Rumor/MOD/modgui/stylesheet-rumor.css: -------------------------------------------------------------------------------- 1 | /* STYLES FOR THE BOXY PEDAL */ 2 | 3 | @import url(/fonts/nexa/stylesheet.css); 4 | @import url(/fonts/questrial/stylesheet.css); 5 | 6 | 7 | /* = CONTAINER 8 | ================================================ */ 9 | .mod-pedal-boxy{{{cns}}} { 10 | background-position:center center; 11 | background-repeat:no-repeat; 12 | background-size:230px 431px; 13 | height:431px; 14 | position:absolute; 15 | width:230px; 16 | border-radius: 21px; 17 | } 18 | 19 | .mod-pedal-boxy{{{cns}}}.mod-boxy50 { 20 | background-size:301px 315px; 21 | height:315px; 22 | width:301px; 23 | } 24 | 25 | .mod-pedal-boxy{{{cns}}}.mod-boxy75 { 26 | background-size:326px 431px; 27 | width:326px; 28 | } 29 | 30 | .mod-pedal-boxy{{{cns}}}.mod-boxy85 { 31 | background-size:364px 431px; 32 | width:364px; 33 | } 34 | 35 | .mod-pedal-boxy{{{cns}}}.mod-boxy100 { 36 | background-size:421px 431px; 37 | width:421px; 38 | } 39 | 40 | /* PORTS 41 | ================================================ */ 42 | 43 | .mod-pedal-boxy{{{cns}}}.mod-boxy50 .mod-pedal-input, 44 | .mod-pedal-boxy{{{cns}}}.mod-boxy50 .mod-pedal-output { 45 | top: 66px; 46 | } 47 | 48 | /* = PLUGIN'S AUTHOR 49 | ================================================ */ 50 | .mod-pedal-boxy{{{cns}}} .mod-plugin-brand { 51 | left:0; 52 | position:absolute; 53 | right:0; 54 | text-align:center; 55 | text-transform:uppercase; 56 | top:160px; 57 | } 58 | 59 | .mod-pedal-boxy{{{cns}}} .mod-plugin-brand h1 { 60 | border-color:#000; 61 | border-radius:12px; 62 | border-style:solid; 63 | border-width:4px; 64 | display:inline-block; 65 | font-family:"Nexa"; 66 | font-size:32px; 67 | padding:3px 9px 0; 68 | } 69 | 70 | .mod-pedal-boxy{{{cns}}}.mod-five-knobs .mod-plugin-brand, 71 | .mod-pedal-boxy{{{cns}}}.mod-six-knobs .mod-plugin-brand, 72 | .mod-pedal-boxy{{{cns}}}.mod-seven-knobs .mod-plugin-brand, 73 | .mod-pedal-boxy{{{cns}}}.mod-eight-knobs .mod-plugin-brand { 74 | top:190px; 75 | } 76 | 77 | .mod-pedal-boxy{{{cns}}}.mod-boxy50 .mod-plugin-brand { 78 | top:16px; 79 | } 80 | 81 | .mod-pedal-boxy{{{cns}}}.mod-one-footswitch-presets .mod-plugin-brand { 82 | top:12px; 83 | } 84 | 85 | 86 | /* = PLUGIN'S NAME 87 | ================================================ */ 88 | .mod-pedal-boxy{{{cns}}} .mod-plugin-name { 89 | left:30px; 90 | overflow:hidden; 91 | position:absolute; 92 | right:30px; 93 | text-align:center; 94 | top:340px; 95 | } 96 | 97 | .mod-pedal-boxy{{{cns}}} .mod-plugin-name h1 { 98 | font-family:"Questrial"; 99 | font-size:21px; 100 | line-height:1; 101 | } 102 | 103 | .mod-pedal-boxy{{{cns}}}.mod-five-knobs .mod-plugin-name, 104 | .mod-pedal-boxy{{{cns}}}.mod-six-knobs .mod-plugin-name, 105 | .mod-pedal-boxy{{{cns}}}.mod-seven-knobs .mod-plugin-name, 106 | .mod-pedal-boxy{{{cns}}}.mod-eight-knobs .mod-plugin-name { 107 | top:350px; 108 | } 109 | 110 | .mod-pedal-boxy{{{cns}}}.mod-boxy50 .mod-plugin-name { 111 | top:230px; 112 | } 113 | 114 | 115 | /* = LIGHT ON/OFF 116 | ================================================ */ 117 | .mod-pedal-boxy{{{cns}}} .mod-light { 118 | background-position:center center; 119 | background-repeat:no-repeat; 120 | height:32px; 121 | left:10px; 122 | position:absolute; 123 | right:10px; 124 | top:235px; 125 | } 126 | 127 | .mod-pedal-boxy{{{cns}}}.mod-five-knobs .mod-light, 128 | .mod-pedal-boxy{{{cns}}}.mod-six-knobs .mod-light, 129 | .mod-pedal-boxy{{{cns}}}.mod-seven-knobs .mod-light, 130 | .mod-pedal-boxy{{{cns}}}.mod-eight-knobs .mod-light { 131 | top:253px; 132 | } 133 | 134 | .mod-pedal-boxy{{{cns}}}.mod-boxy50 .mod-light { 135 | top:105px; 136 | } 137 | 138 | .mod-pedal-boxy{{{cns}}}.mod-one-footswitch-presets .mod-light { 139 | top:120px; 140 | } 141 | 142 | 143 | /* = FOOTSWITCH 144 | ================================================ */ 145 | .mod-pedal-boxy{{{cns}}} .mod-footswitch { 146 | background-image:url(/resources/pedals/footswitch.png{{{ns}}}); 147 | background-position:bottom center; 148 | background-repeat:no-repeat; 149 | background-size:auto 132px; 150 | bottom: 95px; 151 | left: 13px; 152 | right: 13px; 153 | cursor:pointer; 154 | height:66px; 155 | width: 66px; 156 | margin: auto; 157 | position:absolute !important; 158 | } 159 | .mod-pedal-boxy{{{cns}}} .mod-footswitch.on { 160 | background-position-y: top !important 161 | } 162 | 163 | .mod-pedal-boxy{{{cns}}}.mod-five-knobs .mod-footswitch, 164 | .mod-pedal-boxy{{{cns}}}.mod-six-knobs .mod-footswitch, 165 | .mod-pedal-boxy{{{cns}}}.mod-seven-knobs .mod-footswitch, 166 | .mod-pedal-boxy{{{cns}}}.mod-eight-knobs .mod-footswitch { 167 | top:285px; 168 | } 169 | 170 | .mod-pedal-boxy{{{cns}}}.mod-boxy50 .mod-footswitch { 171 | top:140px; 172 | } 173 | 174 | .mod-pedal-boxy{{{cns}}}.mod-one-footswitch-presets .mod-footswitch { 175 | top:170px; 176 | } 177 | 178 | 179 | /* = KNOBS 180 | ================================================ */ 181 | .mod-pedal-boxy{{{cns}}} .mod-control-group { 182 | margin:20px !important; 183 | position:relative; 184 | text-align:center; 185 | z-index:30; 186 | } 187 | .mod-pedal-boxy{{{cns}}} .top { 188 | margin-top:0px !important; 189 | } 190 | 191 | .mod-pedal-boxy{{{cns}}}.mod-one-footswitch-presets .mod-control-group { 192 | margin:10px !important; 193 | top:75px; 194 | } 195 | 196 | .mod-pedal-boxy{{{cns}}}.mod-one-footswitch-presets .mod-control-group > select { 197 | width:100%; 198 | } 199 | 200 | .mod-pedal-boxy{{{cns}}} .mod-control-group .mod-knob { 201 | overflow:hidden; 202 | position:relative; 203 | } 204 | 205 | .mod-pedal-boxy{{{cns}}} .mod-control-group .mod-knob > span.mod-knob-title { 206 | bottom:0px; 207 | display:block; 208 | font-size:11px; 209 | font-weight:bold; 210 | height:12px; 211 | left:0; 212 | line-height:1; 213 | margin:0; 214 | overflow:hidden; 215 | padding:0; 216 | position:absolute; 217 | right:0; 218 | text-transform:uppercase; 219 | } 220 | 221 | /* ONE KNOB */ 222 | .mod-pedal-boxy{{{cns}}}.mod-one-knob .mod-control-group .mod-knob .mod-knob-image { 223 | background-image:url(/resources/knobs/boxy/boxy.png{{{ns}}}); 224 | background-repeat:no-repeat; 225 | background-size:auto 98px; 226 | height:98px; 227 | width:98px; 228 | margin:0 auto; 229 | } 230 | .mod-pedal-boxy{{{cns}}}.mod-one-knob .mod-control-group .mod-knob > span.mod-knob-title { 231 | font-size:15px; 232 | height:15px; 233 | } 234 | .mod-pedal-boxy{{{cns}}}.mod-one-knob .mod-control-group .mod-knob { 235 | height:115px; 236 | } 237 | 238 | /* TWO KNOBS */ 239 | .mod-pedal-boxy{{{cns}}}.mod-two-knobs .mod-control-group .mod-knob .mod-knob-image { 240 | background-image:url(/resources/knobs/boxy/boxy.png{{{ns}}}); 241 | background-repeat:no-repeat; 242 | background-size:auto 90px; 243 | height:90px; 244 | width:90px; 245 | margin:0 auto; 246 | } 247 | .mod-pedal-boxy{{{cns}}}.mod-two-knobs .mod-control-group .mod-knob > span.mod-knob-title { 248 | font-size:13px; 249 | } 250 | .mod-pedal-boxy{{{cns}}}.mod-two-knobs .mod-control-group .mod-knob { 251 | float:left; 252 | width:50%; 253 | } 254 | .mod-pedal-boxy{{{cns}}}.mod-two-knobs .mod-control-group .mod-knob { 255 | height:103px; 256 | } 257 | 258 | /* THREE AND HIGHER KNOBS */ 259 | .mod-pedal-boxy{{{cns}}}.mod-three-knobs .mod-control-group .mod-knob .mod-knob-image, 260 | .mod-pedal-boxy{{{cns}}}.mod-four-knobs .mod-control-group .mod-knob .mod-knob-image, 261 | .mod-pedal-boxy{{{cns}}}.mod-five-knobs .mod-control-group .mod-knob .mod-knob-image, 262 | .mod-pedal-boxy{{{cns}}}.mod-six-knobs .mod-control-group .mod-knob .mod-knob-image, 263 | .mod-pedal-boxy{{{cns}}}.mod-seven-knobs .mod-control-group .mod-knob .mod-knob-image, 264 | .mod-pedal-boxy{{{cns}}}.mod-eight-knobs .mod-control-group .mod-knob .mod-knob-image { 265 | background-image:url(/resources/knobs/lata/lata.png{{{ns}}}); 266 | background-repeat:no-repeat; 267 | background-size:auto 60px; 268 | height:60px; 269 | width:60px; 270 | margin:0 auto; 271 | } 272 | .mod-pedal-boxy{{{cns}}}.mod-three-knobs .mod-control-group .mod-knob, 273 | .mod-pedal-boxy{{{cns}}}.mod-four-knobs .mod-control-group .mod-knob, 274 | .mod-pedal-boxy{{{cns}}}.mod-five-knobs .mod-control-group .mod-knob, 275 | .mod-pedal-boxy{{{cns}}}.mod-six-knobs .mod-control-group .mod-knob, 276 | .mod-pedal-boxy{{{cns}}}.mod-seven-knobs .mod-control-group .mod-knob, 277 | .mod-pedal-boxy{{{cns}}}.mod-eight-knobs .mod-control-group .mod-knob { 278 | display:inline-block; 279 | height:73px; 280 | } 281 | 282 | /* EIGTH KNOBS */ 283 | .mod-pedal-boxy{{{cns}}}.mod-eight-knobs .mod-knob { 284 | width:70px; 285 | } 286 | 287 | /* = ENUMERATED LIST 288 | ================================================ */ 289 | .mod-pedal-boxy{{{cns}}} .mod-enumerated-group { 290 | height:31px; 291 | margin:20px auto 0 !important; 292 | position:relative; 293 | width:190px; 294 | z-index:35; 295 | } 296 | 297 | .mod-pedal-boxy{{{cns}}}.mod-three-knobs .mod-enumerated-group, 298 | .mod-pedal-boxy{{{cns}}}.mod-four-knobs .mod-enumerated-group { 299 | margin-bottom:5px !important; 300 | } 301 | 302 | .mod-pedal-boxy{{{cns}}}.mod-four-knobs .mod-enumerated-group { 303 | width:250px; 304 | } 305 | 306 | .mod-pedal-boxy{{{cns}}} .mod-enumerated { 307 | background-position:right center; 308 | background-repeat:no-repeat; 309 | font-size:11px; 310 | font-weight:bold; 311 | left:0; 312 | line-height:2; 313 | overflow:hidden; 314 | position:absolute; 315 | right:0; 316 | text-align:left; 317 | } 318 | 319 | .mod-pedal-boxy{{{cns}}} .mod-enumerated .mod-enumerated-selected { 320 | background-color:rgba(0,0,0,.3); 321 | box-shadow:inset 0 0 4px rgba(0,0,0,.3); 322 | border-radius:4px; 323 | padding:3px 9px; 324 | } 325 | 326 | .mod-pedal-boxy{{{cns}}} .mod-enumerated .mod-enumerated-selected { 327 | border-radius:4px 4px 0 0; 328 | } 329 | 330 | .mod-pedal-boxy{{{cns}}} .mod-enumerated .mod-enumerated-list { 331 | display:none; 332 | color:#fff; 333 | } 334 | 335 | .mod-pedal-boxy{{{cns}}} .mod-enumerated .mod-enumerated-list { 336 | background-color:rgba(0,0,0,.9); 337 | display:none; 338 | height:115px; 339 | overflow:auto; 340 | position:relative; 341 | } 342 | 343 | .mod-pedal-boxy{{{cns}}} .mod-enumerated .mod-enumerated-list > div { 344 | padding:3px 9px; 345 | } 346 | 347 | .mod-pedal-boxy{{{cns}}} .mod-enumerated .mod-enumerated-list > div:hover { 348 | background-color:rgba(255,255,255,.2); 349 | cursor:pointer; 350 | } 351 | 352 | /* SLIDER 353 | ================================================ */ 354 | .mod-pedal-boxy{{{cns}}} .mod-slider:first-child { 355 | margin-left:8px; 356 | } 357 | 358 | .mod-pedal-boxy{{{cns}}} .mod-slider { 359 | color:black; 360 | float:left; 361 | font-size:11px; 362 | height:140px; 363 | margin-bottom:2px; 364 | margin-right:2px; 365 | overflow:hidden; 366 | position:relative; 367 | text-align:center; 368 | width:33px; 369 | } 370 | 371 | 372 | .mod-pedal-boxy{{{cns}}} .mod-slider .mod-slider-title { 373 | display:block; 374 | font-size:11px; 375 | font-weight:bold; 376 | line-height:1; 377 | margin-bottom:3px; 378 | overflow:hidden; 379 | padding:7px 0 5px; 380 | position:relative; 381 | } 382 | 383 | .mod-pedal-boxy{{{cns}}} .mod-slider .mod-slider-image { 384 | background-image:url(/resources/pedals/slider.png{{{ns}}}); 385 | background-repeat:no-repeat; 386 | background-size:auto 110px; 387 | height:110px; 388 | margin:0 auto; 389 | width:44px; 390 | } 391 | 392 | .mod-pedal-boxy{{{cns}}} .mod-slider .mod-slider-image:hover { 393 | cursor:pointer; 394 | } 395 | 396 | .mod-pedal-boxy{{{cns}}}.mod-three-sliders .mod-slider { 397 | margin:0; 398 | width:33%; 399 | } 400 | 401 | .mod-pedal-boxy{{{cns}}}.mod-four-sliders .mod-slider { 402 | margin:0; 403 | width:25%; 404 | } 405 | 406 | .mod-pedal-boxy{{{cns}}}.mod-five-sliders .mod-slider { 407 | margin:0; 408 | width:20%; 409 | } 410 | 411 | .mod-pedal-boxy{{{cns}}}.mod-six-sliders .mod-slider { 412 | margin:0; 413 | width:16.5%; 414 | } 415 | 416 | .mod-pedal-boxy{{{cns}}}.mod-seven-sliders .mod-slider { 417 | margin:0; 418 | width:14.2%; 419 | } 420 | 421 | .mod-pedal-boxy{{{cns}}}.mod-eight-sliders .mod-slider { 422 | margin:0; 423 | width:12.5%; 424 | } 425 | 426 | .mod-pedal-boxy{{{cns}}}.mod-nine-sliders .mod-slider { 427 | margin:0; 428 | width:11.11%; 429 | } 430 | 431 | .mod-pedal-boxy{{{cns}}}.mod-ten-sliders .mod-slider { 432 | margin:0; 433 | width:10%; 434 | } 435 | 436 | .mod-pedal-boxy{{{cns}}}.mod-ten-sliders .mod-slider .mod-slider-image { 437 | margin-left:-5px; 438 | } 439 | 440 | .mod-pedal-boxy{{{cns}}}.mod-twelve-sliders .mod-slider { 441 | margin:0; 442 | width:8.333333%; 443 | } 444 | 445 | .mod-pedal-boxy{{{cns}}}.mod-twelve-sliders .mod-slider .mod-slider-image { 446 | margin-left:-5px; 447 | } 448 | 449 | 450 | /* = BACKGROUND IMAGES - Color of the pedal 451 | ================================================ */ 452 | .mod-pedal-boxy{{{cns}}}.mod-gold { 453 | background-image:url(/resources/pedals/boxy/gold.png{{{ns}}}); 454 | } 455 | .mod-pedal-boxy{{{cns}}}.mod-boxy50.mod-gold { 456 | background-image:url(/resources/pedals/boxy-small/gold.png{{{ns}}}); 457 | } 458 | .mod-pedal-boxy{{{cns}}}.mod-boxy75.mod-gold { 459 | background-image:url(/resources/pedals/boxy75/gold.png{{{ns}}}); 460 | } 461 | .mod-pedal-boxy{{{cns}}}.mod-boxy85.mod-gold { 462 | background-image:url(/resources/pedals/boxy85/gold.png{{{ns}}}); 463 | } 464 | .mod-pedal-boxy{{{cns}}}.mod-boxy100.mod-gold { 465 | background-image:url(/resources/pedals/boxy100/gold.png{{{ns}}}); 466 | } 467 | .mod-pedal-boxy{{{cns}}}.mod-slime { 468 | background-image:url(/resources/pedals/boxy/slime.png{{{ns}}}); 469 | } 470 | .mod-pedal-boxy{{{cns}}}.mod-boxy50.mod-slime { 471 | background-image:url(/resources/pedals/boxy-small/slime.png{{{ns}}}); 472 | } 473 | .mod-pedal-boxy{{{cns}}}.mod-boxy75.mod-slime { 474 | background-image:url(/resources/pedals/boxy75/slime.png{{{ns}}}); 475 | } 476 | .mod-pedal-boxy{{{cns}}}.mod-boxy85.mod-slime { 477 | background-image:url(/resources/pedals/boxy85/slime.png{{{ns}}}); 478 | } 479 | .mod-pedal-boxy{{{cns}}}.mod-boxy100.mod-slime { 480 | background-image:url(/resources/pedals/boxy100/slime.png{{{ns}}}); 481 | } 482 | .mod-pedal-boxy{{{cns}}}.mod-yellow { 483 | background-image:url(/resources/pedals/boxy/yellow.png{{{ns}}}); 484 | } 485 | .mod-pedal-boxy{{{cns}}}.mod-boxy50.mod-yellow { 486 | background-image:url(/resources/pedals/boxy-small/yellow.png{{{ns}}}); 487 | } 488 | .mod-pedal-boxy{{{cns}}}.mod-boxy75.mod-yellow { 489 | background-image:url(/resources/pedals/boxy75/yellow.png{{{ns}}}); 490 | } 491 | .mod-pedal-boxy{{{cns}}}.mod-boxy85.mod-yellow { 492 | background-image:url(/resources/pedals/boxy85/yellow.png{{{ns}}}); 493 | } 494 | .mod-pedal-boxy{{{cns}}}.mod-boxy100.mod-yellow { 495 | background-image:url(/resources/pedals/boxy100/yellow.png{{{ns}}}); 496 | } 497 | .mod-pedal-boxy{{{cns}}}.mod-pink { 498 | background-image:url(/resources/pedals/boxy/pink.png{{{ns}}}); 499 | } 500 | .mod-pedal-boxy{{{cns}}}.mod-boxy50.mod-pink { 501 | background-image:url(/resources/pedals/boxy-small/pink.png{{{ns}}}); 502 | } 503 | .mod-pedal-boxy{{{cns}}}.mod-boxy75.mod-pink { 504 | background-image:url(/resources/pedals/boxy75/pink.png{{{ns}}}); 505 | } 506 | .mod-pedal-boxy{{{cns}}}.mod-boxy85.mod-pink { 507 | background-image:url(/resources/pedals/boxy85/pink.png{{{ns}}}); 508 | } 509 | .mod-pedal-boxy{{{cns}}}.mod-boxy100.mod-pink { 510 | background-image:url(/resources/pedals/boxy100/pink.png{{{ns}}}); 511 | } 512 | .mod-pedal-boxy{{{cns}}}.mod-zinc { 513 | background-image:url(/resources/pedals/boxy/zinc.png{{{ns}}}); 514 | } 515 | .mod-pedal-boxy{{{cns}}}.mod-boxy50.mod-zinc { 516 | background-image:url(/resources/pedals/boxy-small/zinc.png{{{ns}}}); 517 | } 518 | .mod-pedal-boxy{{{cns}}}.mod-boxy75.mod-zinc { 519 | background-image:url(/resources/pedals/boxy75/zinc.png{{{ns}}}); 520 | } 521 | .mod-pedal-boxy{{{cns}}}.mod-boxy85.mod-zinc { 522 | background-image:url(/resources/pedals/boxy85/zinc.png{{{ns}}}); 523 | } 524 | .mod-pedal-boxy{{{cns}}}.mod-boxy100.mod-zinc { 525 | background-image:url(/resources/pedals/boxy100/zinc.png{{{ns}}}); 526 | } 527 | .mod-pedal-boxy{{{cns}}}.mod-cream { 528 | background-image:url(/resources/pedals/boxy/cream.png{{{ns}}}); 529 | } 530 | .mod-pedal-boxy{{{cns}}}.mod-boxy50.mod-cream { 531 | background-image:url(/resources/pedals/boxy-small/cream.png{{{ns}}}); 532 | } 533 | .mod-pedal-boxy{{{cns}}}.mod-boxy75.mod-cream { 534 | background-image:url(/resources/pedals/boxy75/cream.png{{{ns}}}); 535 | } 536 | .mod-pedal-boxy{{{cns}}}.mod-boxy85.mod-cream { 537 | background-image:url(/resources/pedals/boxy85/cream.png{{{ns}}}); 538 | } 539 | .mod-pedal-boxy{{{cns}}}.mod-boxy100.mod-cream { 540 | background-image:url(/resources/pedals/boxy100/cream.png{{{ns}}}); 541 | } 542 | .mod-pedal-boxy{{{cns}}}.mod-blue { 543 | background-image:url(/resources/pedals/boxy/blue.png{{{ns}}}); 544 | } 545 | .mod-pedal-boxy{{{cns}}}.mod-boxy50.mod-blue { 546 | background-image:url(/resources/pedals/boxy-small/blue.png{{{ns}}}); 547 | } 548 | .mod-pedal-boxy{{{cns}}}.mod-boxy75.mod-blue { 549 | background-image:url(/resources/pedals/boxy75/blue.png{{{ns}}}); 550 | } 551 | .mod-pedal-boxy{{{cns}}}.mod-boxy85.mod-blue { 552 | background-image:url(/resources/pedals/boxy85/blue.png{{{ns}}}); 553 | } 554 | .mod-pedal-boxy{{{cns}}}.mod-boxy100.mod-blue { 555 | background-image:url(/resources/pedals/boxy100/blue.png{{{ns}}}); 556 | } 557 | .mod-pedal-boxy{{{cns}}}.mod-tribal2 { 558 | background-image:url(/resources/pedals/boxy/tribal2.png{{{ns}}}); 559 | } 560 | .mod-pedal-boxy{{{cns}}}.mod-boxy50.mod-tribal2 { 561 | background-image:url(/resources/pedals/boxy-small/tribal2.png{{{ns}}}); 562 | } 563 | .mod-pedal-boxy{{{cns}}}.mod-boxy75.mod-tribal2 { 564 | background-image:url(/resources/pedals/boxy75/tribal2.png{{{ns}}}); 565 | } 566 | .mod-pedal-boxy{{{cns}}}.mod-boxy85.mod-tribal2 { 567 | background-image:url(/resources/pedals/boxy85/tribal2.png{{{ns}}}); 568 | } 569 | .mod-pedal-boxy{{{cns}}}.mod-boxy100.mod-tribal2 { 570 | background-image:url(/resources/pedals/boxy100/tribal2.png{{{ns}}}); 571 | } 572 | .mod-pedal-boxy{{{cns}}}.mod-purple { 573 | background-image:url(/resources/pedals/boxy/purple.png{{{ns}}}); 574 | } 575 | .mod-pedal-boxy{{{cns}}}.mod-boxy50.mod-purple { 576 | background-image:url(/resources/pedals/boxy-small/purple.png{{{ns}}}); 577 | } 578 | .mod-pedal-boxy{{{cns}}}.mod-boxy75.mod-purple { 579 | background-image:url(/resources/pedals/boxy75/purple.png{{{ns}}}); 580 | } 581 | .mod-pedal-boxy{{{cns}}}.mod-boxy85.mod-purple { 582 | background-image:url(/resources/pedals/boxy85/purple.png{{{ns}}}); 583 | } 584 | .mod-pedal-boxy{{{cns}}}.mod-boxy100.mod-purple { 585 | background-image:url(/resources/pedals/boxy100/purple.png{{{ns}}}); 586 | } 587 | .mod-pedal-boxy{{{cns}}}.mod-lava { 588 | background-image:url(/resources/pedals/boxy/lava.png{{{ns}}}); 589 | } 590 | .mod-pedal-boxy{{{cns}}}.mod-boxy50.mod-lava { 591 | background-image:url(/resources/pedals/boxy-small/lava.png{{{ns}}}); 592 | } 593 | .mod-pedal-boxy{{{cns}}}.mod-boxy75.mod-lava { 594 | background-image:url(/resources/pedals/boxy75/lava.png{{{ns}}}); 595 | } 596 | .mod-pedal-boxy{{{cns}}}.mod-boxy85.mod-lava { 597 | background-image:url(/resources/pedals/boxy85/lava.png{{{ns}}}); 598 | } 599 | .mod-pedal-boxy{{{cns}}}.mod-boxy100.mod-lava { 600 | background-image:url(/resources/pedals/boxy100/lava.png{{{ns}}}); 601 | } 602 | .mod-pedal-boxy{{{cns}}}.mod-black { 603 | background-image:url(/resources/pedals/boxy/black.png{{{ns}}}); 604 | } 605 | .mod-pedal-boxy{{{cns}}}.mod-boxy50.mod-black { 606 | background-image:url(/resources/pedals/boxy-small/black.png{{{ns}}}); 607 | } 608 | .mod-pedal-boxy{{{cns}}}.mod-boxy75.mod-black { 609 | background-image:url(/resources/pedals/boxy75/black.png{{{ns}}}); 610 | } 611 | .mod-pedal-boxy{{{cns}}}.mod-boxy85.mod-black { 612 | background-image:url(/resources/pedals/boxy85/black.png{{{ns}}}); 613 | } 614 | .mod-pedal-boxy{{{cns}}}.mod-boxy100.mod-black { 615 | background-image:url(/resources/pedals/boxy100/black.png{{{ns}}}); 616 | } 617 | .mod-pedal-boxy{{{cns}}}.mod-orange { 618 | background-image:url(/resources/pedals/boxy/orange.png{{{ns}}}); 619 | } 620 | .mod-pedal-boxy{{{cns}}}.mod-boxy50.mod-orange { 621 | background-image:url(/resources/pedals/boxy-small/orange.png{{{ns}}}); 622 | } 623 | .mod-pedal-boxy{{{cns}}}.mod-boxy75.mod-orange { 624 | background-image:url(/resources/pedals/boxy75/orange.png{{{ns}}}); 625 | } 626 | .mod-pedal-boxy{{{cns}}}.mod-boxy85.mod-orange { 627 | background-image:url(/resources/pedals/boxy85/orange.png{{{ns}}}); 628 | } 629 | .mod-pedal-boxy{{{cns}}}.mod-boxy100.mod-orange { 630 | background-image:url(/resources/pedals/boxy100/orange.png{{{ns}}}); 631 | } 632 | .mod-pedal-boxy{{{cns}}}.mod-white { 633 | background-image:url(/resources/pedals/boxy/white.png{{{ns}}}); 634 | } 635 | .mod-pedal-boxy{{{cns}}}.mod-boxy50.mod-white { 636 | background-image:url(/resources/pedals/boxy-small/white.png{{{ns}}}); 637 | } 638 | .mod-pedal-boxy{{{cns}}}.mod-boxy75.mod-white { 639 | background-image:url(/resources/pedals/boxy75/white.png{{{ns}}}); 640 | } 641 | .mod-pedal-boxy{{{cns}}}.mod-boxy85.mod-white { 642 | background-image:url(/resources/pedals/boxy85/white.png{{{ns}}}); 643 | } 644 | .mod-pedal-boxy{{{cns}}}.mod-boxy100.mod-white { 645 | background-image:url(/resources/pedals/boxy100/white.png{{{ns}}}); 646 | } 647 | .mod-pedal-boxy{{{cns}}}.mod-racing { 648 | background-image:url(/resources/pedals/boxy/racing.png{{{ns}}}); 649 | } 650 | .mod-pedal-boxy{{{cns}}}.mod-boxy50.mod-racing { 651 | background-image:url(/resources/pedals/boxy-small/racing.png{{{ns}}}); 652 | } 653 | .mod-pedal-boxy{{{cns}}}.mod-boxy75.mod-racing { 654 | background-image:url(/resources/pedals/boxy75/racing.png{{{ns}}}); 655 | } 656 | .mod-pedal-boxy{{{cns}}}.mod-boxy85.mod-racing { 657 | background-image:url(/resources/pedals/boxy85/racing.png{{{ns}}}); 658 | } 659 | .mod-pedal-boxy{{{cns}}}.mod-boxy100.mod-racing { 660 | background-image:url(/resources/pedals/boxy100/racing.png{{{ns}}}); 661 | } 662 | .mod-pedal-boxy{{{cns}}}.mod-red { 663 | background-image:url(/resources/pedals/boxy/red.png{{{ns}}}); 664 | } 665 | .mod-pedal-boxy{{{cns}}}.mod-boxy50.mod-red { 666 | background-image:url(/resources/pedals/boxy-small/red.png{{{ns}}}); 667 | } 668 | .mod-pedal-boxy{{{cns}}}.mod-boxy75.mod-red { 669 | background-image:url(/resources/pedals/boxy75/red.png{{{ns}}}); 670 | } 671 | .mod-pedal-boxy{{{cns}}}.mod-boxy85.mod-red { 672 | background-image:url(/resources/pedals/boxy85/red.png{{{ns}}}); 673 | } 674 | .mod-pedal-boxy{{{cns}}}.mod-boxy100.mod-red { 675 | background-image:url(/resources/pedals/boxy100/red.png{{{ns}}}); 676 | } 677 | .mod-pedal-boxy{{{cns}}}.mod-dots { 678 | background-image:url(/resources/pedals/boxy/dots.png{{{ns}}}); 679 | } 680 | .mod-pedal-boxy{{{cns}}}.mod-boxy50.mod-dots { 681 | background-image:url(/resources/pedals/boxy-small/dots.png{{{ns}}}); 682 | } 683 | .mod-pedal-boxy{{{cns}}}.mod-boxy75.mod-dots { 684 | background-image:url(/resources/pedals/boxy75/dots.png{{{ns}}}); 685 | } 686 | .mod-pedal-boxy{{{cns}}}.mod-boxy85.mod-dots { 687 | background-image:url(/resources/pedals/boxy85/dots.png{{{ns}}}); 688 | } 689 | .mod-pedal-boxy{{{cns}}}.mod-boxy100.mod-dots { 690 | background-image:url(/resources/pedals/boxy100/dots.png{{{ns}}}); 691 | } 692 | .mod-pedal-boxy{{{cns}}}.mod-brown { 693 | background-image:url(/resources/pedals/boxy/brown.png{{{ns}}}); 694 | } 695 | .mod-pedal-boxy{{{cns}}}.mod-boxy50.mod-brown { 696 | background-image:url(/resources/pedals/boxy-small/brown.png{{{ns}}}); 697 | } 698 | .mod-pedal-boxy{{{cns}}}.mod-boxy75.mod-brown { 699 | background-image:url(/resources/pedals/boxy75/brown.png{{{ns}}}); 700 | } 701 | .mod-pedal-boxy{{{cns}}}.mod-boxy85.mod-brown { 702 | background-image:url(/resources/pedals/boxy85/brown.png{{{ns}}}); 703 | } 704 | .mod-pedal-boxy{{{cns}}}.mod-boxy100.mod-brown { 705 | background-image:url(/resources/pedals/boxy100/brown.png{{{ns}}}); 706 | } 707 | .mod-pedal-boxy{{{cns}}}.mod-petrol { 708 | background-image:url(/resources/pedals/boxy/petrol.png{{{ns}}}); 709 | } 710 | .mod-pedal-boxy{{{cns}}}.mod-boxy50.mod-petrol { 711 | background-image:url(/resources/pedals/boxy-small/petrol.png{{{ns}}}); 712 | } 713 | .mod-pedal-boxy{{{cns}}}.mod-boxy75.mod-petrol { 714 | background-image:url(/resources/pedals/boxy75/petrol.png{{{ns}}}); 715 | } 716 | .mod-pedal-boxy{{{cns}}}.mod-boxy85.mod-petrol { 717 | background-image:url(/resources/pedals/boxy85/petrol.png{{{ns}}}); 718 | } 719 | .mod-pedal-boxy{{{cns}}}.mod-boxy100.mod-petrol { 720 | background-image:url(/resources/pedals/boxy100/petrol.png{{{ns}}}); 721 | } 722 | .mod-pedal-boxy{{{cns}}}.mod-wood0 { 723 | background-image:url(/resources/pedals/boxy/wood0.png{{{ns}}}); 724 | } 725 | .mod-pedal-boxy{{{cns}}}.mod-boxy50.mod-wood0 { 726 | background-image:url(/resources/pedals/boxy-small/wood0.png{{{ns}}}); 727 | } 728 | .mod-pedal-boxy{{{cns}}}.mod-boxy75.mod-wood0 { 729 | background-image:url(/resources/pedals/boxy75/wood0.png{{{ns}}}); 730 | } 731 | .mod-pedal-boxy{{{cns}}}.mod-boxy85.mod-wood0 { 732 | background-image:url(/resources/pedals/boxy85/wood0.png{{{ns}}}); 733 | } 734 | .mod-pedal-boxy{{{cns}}}.mod-boxy100.mod-wood0 { 735 | background-image:url(/resources/pedals/boxy100/wood0.png{{{ns}}}); 736 | } 737 | .mod-pedal-boxy{{{cns}}}.mod-wood1 { 738 | background-image:url(/resources/pedals/boxy/wood1.png{{{ns}}}); 739 | } 740 | .mod-pedal-boxy{{{cns}}}.mod-boxy50.mod-wood1 { 741 | background-image:url(/resources/pedals/boxy-small/wood1.png{{{ns}}}); 742 | } 743 | .mod-pedal-boxy{{{cns}}}.mod-boxy75.mod-wood1 { 744 | background-image:url(/resources/pedals/boxy75/wood1.png{{{ns}}}); 745 | } 746 | .mod-pedal-boxy{{{cns}}}.mod-boxy85.mod-wood1 { 747 | background-image:url(/resources/pedals/boxy85/wood1.png{{{ns}}}); 748 | } 749 | .mod-pedal-boxy{{{cns}}}.mod-boxy100.mod-wood1 { 750 | background-image:url(/resources/pedals/boxy100/wood1.png{{{ns}}}); 751 | } 752 | .mod-pedal-boxy{{{cns}}}.mod-wood2 { 753 | background-image:url(/resources/pedals/boxy/wood2.png{{{ns}}}); 754 | } 755 | .mod-pedal-boxy{{{cns}}}.mod-boxy50.mod-wood2 { 756 | background-image:url(/resources/pedals/boxy-small/wood2.png{{{ns}}}); 757 | } 758 | .mod-pedal-boxy{{{cns}}}.mod-boxy75.mod-wood2 { 759 | background-image:url(/resources/pedals/boxy75/wood2.png{{{ns}}}); 760 | } 761 | .mod-pedal-boxy{{{cns}}}.mod-boxy85.mod-wood2 { 762 | background-image:url(/resources/pedals/boxy85/wood2.png{{{ns}}}); 763 | } 764 | .mod-pedal-boxy{{{cns}}}.mod-boxy100.mod-wood2 { 765 | background-image:url(/resources/pedals/boxy100/wood2.png{{{ns}}}); 766 | } 767 | .mod-pedal-boxy{{{cns}}}.mod-wood3 { 768 | background-image:url(/resources/pedals/boxy/wood3.png{{{ns}}}); 769 | } 770 | .mod-pedal-boxy{{{cns}}}.mod-boxy50.mod-wood3 { 771 | background-image:url(/resources/pedals/boxy-small/wood3.png{{{ns}}}); 772 | } 773 | .mod-pedal-boxy{{{cns}}}.mod-boxy75.mod-wood3 { 774 | background-image:url(/resources/pedals/boxy75/wood3.png{{{ns}}}); 775 | } 776 | .mod-pedal-boxy{{{cns}}}.mod-boxy85.mod-wood3 { 777 | background-image:url(/resources/pedals/boxy85/wood3.png{{{ns}}}); 778 | } 779 | .mod-pedal-boxy{{{cns}}}.mod-boxy100.mod-wood3 { 780 | background-image:url(/resources/pedals/boxy100/wood3.png{{{ns}}}); 781 | } 782 | .mod-pedal-boxy{{{cns}}}.mod-wood4 { 783 | background-image:url(/resources/pedals/boxy/wood4.png{{{ns}}}); 784 | } 785 | .mod-pedal-boxy{{{cns}}}.mod-boxy50.mod-wood4 { 786 | background-image:url(/resources/pedals/boxy-small/wood4.png{{{ns}}}); 787 | } 788 | .mod-pedal-boxy{{{cns}}}.mod-boxy75.mod-wood4 { 789 | background-image:url(/resources/pedals/boxy75/wood4.png{{{ns}}}); 790 | } 791 | .mod-pedal-boxy{{{cns}}}.mod-boxy85.mod-wood4 { 792 | background-image:url(/resources/pedals/boxy85/wood4.png{{{ns}}}); 793 | } 794 | .mod-pedal-boxy{{{cns}}}.mod-boxy100.mod-wood4 { 795 | background-image:url(/resources/pedals/boxy100/wood4.png{{{ns}}}); 796 | } 797 | .mod-pedal-boxy{{{cns}}}.mod-cyan { 798 | background-image:url(/resources/pedals/boxy/cyan.png{{{ns}}}); 799 | } 800 | .mod-pedal-boxy{{{cns}}}.mod-boxy50.mod-cyan { 801 | background-image:url(/resources/pedals/boxy-small/cyan.png{{{ns}}}); 802 | } 803 | .mod-pedal-boxy{{{cns}}}.mod-boxy75.mod-cyan { 804 | background-image:url(/resources/pedals/boxy75/cyan.png{{{ns}}}); 805 | } 806 | .mod-pedal-boxy{{{cns}}}.mod-boxy85.mod-cyan { 807 | background-image:url(/resources/pedals/boxy85/cyan.png{{{ns}}}); 808 | } 809 | .mod-pedal-boxy{{{cns}}}.mod-boxy100.mod-cyan { 810 | background-image:url(/resources/pedals/boxy100/cyan.png{{{ns}}}); 811 | } 812 | .mod-pedal-boxy{{{cns}}}.mod-gray { 813 | background-image:url(/resources/pedals/boxy/gray.png{{{ns}}}); 814 | } 815 | .mod-pedal-boxy{{{cns}}}.mod-boxy50.mod-gray { 816 | background-image:url(/resources/pedals/boxy-small/gray.png{{{ns}}}); 817 | } 818 | .mod-pedal-boxy{{{cns}}}.mod-boxy75.mod-gray { 819 | background-image:url(/resources/pedals/boxy75/gray.png{{{ns}}}); 820 | } 821 | .mod-pedal-boxy{{{cns}}}.mod-boxy85.mod-gray { 822 | background-image:url(/resources/pedals/boxy85/gray.png{{{ns}}}); 823 | } 824 | .mod-pedal-boxy{{{cns}}}.mod-boxy100.mod-gray { 825 | background-image:url(/resources/pedals/boxy100/gray.png{{{ns}}}); 826 | } 827 | .mod-pedal-boxy{{{cns}}}.mod-none { 828 | background-image:url(/resources/pedals/boxy/none.png{{{ns}}}); 829 | } 830 | .mod-pedal-boxy{{{cns}}}.mod-boxy50.mod-none { 831 | background-image:url(/resources/pedals/boxy-small/none.png{{{ns}}}); 832 | } 833 | .mod-pedal-boxy{{{cns}}}.mod-boxy75.mod-none { 834 | background-image:url(/resources/pedals/boxy75/none.png{{{ns}}}); 835 | } 836 | .mod-pedal-boxy{{{cns}}}.mod-boxy85.mod-none { 837 | background-image:url(/resources/pedals/boxy85/none.png{{{ns}}}); 838 | } 839 | .mod-pedal-boxy{{{cns}}}.mod-boxy100.mod-none { 840 | background-image:url(/resources/pedals/boxy100/none.png{{{ns}}}); 841 | } 842 | .mod-pedal-boxy{{{cns}}}.mod-flowerpower { 843 | background-image:url(/resources/pedals/boxy/flowerpower.png{{{ns}}}); 844 | } 845 | .mod-pedal-boxy{{{cns}}}.mod-boxy50.mod-flowerpower { 846 | background-image:url(/resources/pedals/boxy-small/flowerpower.png{{{ns}}}); 847 | } 848 | .mod-pedal-boxy{{{cns}}}.mod-boxy75.mod-flowerpower { 849 | background-image:url(/resources/pedals/boxy75/flowerpower.png{{{ns}}}); 850 | } 851 | .mod-pedal-boxy{{{cns}}}.mod-boxy85.mod-flowerpower { 852 | background-image:url(/resources/pedals/boxy85/flowerpower.png{{{ns}}}); 853 | } 854 | .mod-pedal-boxy{{{cns}}}.mod-boxy100.mod-flowerpower { 855 | background-image:url(/resources/pedals/boxy100/flowerpower.png{{{ns}}}); 856 | } 857 | .mod-pedal-boxy{{{cns}}}.mod-darkblue { 858 | background-image:url(/resources/pedals/boxy/darkblue.png{{{ns}}}); 859 | } 860 | .mod-pedal-boxy{{{cns}}}.mod-boxy50.mod-darkblue { 861 | background-image:url(/resources/pedals/boxy-small/darkblue.png{{{ns}}}); 862 | } 863 | .mod-pedal-boxy{{{cns}}}.mod-boxy75.mod-darkblue { 864 | background-image:url(/resources/pedals/boxy75/darkblue.png{{{ns}}}); 865 | } 866 | .mod-pedal-boxy{{{cns}}}.mod-boxy85.mod-darkblue { 867 | background-image:url(/resources/pedals/boxy85/darkblue.png{{{ns}}}); 868 | } 869 | .mod-pedal-boxy{{{cns}}}.mod-boxy100.mod-darkblue { 870 | background-image:url(/resources/pedals/boxy100/darkblue.png{{{ns}}}); 871 | } 872 | .mod-pedal-boxy{{{cns}}}.mod-tribal1 { 873 | background-image:url(/resources/pedals/boxy/tribal1.png{{{ns}}}); 874 | } 875 | .mod-pedal-boxy{{{cns}}}.mod-boxy50.mod-tribal1 { 876 | background-image:url(/resources/pedals/boxy-small/tribal1.png{{{ns}}}); 877 | } 878 | .mod-pedal-boxy{{{cns}}}.mod-boxy75.mod-tribal1 { 879 | background-image:url(/resources/pedals/boxy75/tribal1.png{{{ns}}}); 880 | } 881 | .mod-pedal-boxy{{{cns}}}.mod-boxy85.mod-tribal1 { 882 | background-image:url(/resources/pedals/boxy85/tribal1.png{{{ns}}}); 883 | } 884 | .mod-pedal-boxy{{{cns}}}.mod-boxy100.mod-tribal1 { 885 | background-image:url(/resources/pedals/boxy100/tribal1.png{{{ns}}}); 886 | } 887 | .mod-pedal-boxy{{{cns}}}.mod-warning { 888 | background-image:url(/resources/pedals/boxy/warning.png{{{ns}}}); 889 | } 890 | .mod-pedal-boxy{{{cns}}}.mod-boxy50.mod-warning { 891 | background-image:url(/resources/pedals/boxy-small/warning.png{{{ns}}}); 892 | } 893 | .mod-pedal-boxy{{{cns}}}.mod-boxy75.mod-warning { 894 | background-image:url(/resources/pedals/boxy75/warning.png{{{ns}}}); 895 | } 896 | .mod-pedal-boxy{{{cns}}}.mod-boxy85.mod-warning { 897 | background-image:url(/resources/pedals/boxy85/warning.png{{{ns}}}); 898 | } 899 | .mod-pedal-boxy{{{cns}}}.mod-boxy100.mod-warning { 900 | background-image:url(/resources/pedals/boxy100/warning.png{{{ns}}}); 901 | } 902 | .mod-pedal-boxy{{{cns}}}.mod-green { 903 | background-image:url(/resources/pedals/boxy/green.png{{{ns}}}); 904 | } 905 | .mod-pedal-boxy{{{cns}}}.mod-boxy50.mod-green { 906 | background-image:url(/resources/pedals/boxy-small/green.png{{{ns}}}); 907 | } 908 | .mod-pedal-boxy{{{cns}}}.mod-boxy75.mod-green { 909 | background-image:url(/resources/pedals/boxy75/green.png{{{ns}}}); 910 | } 911 | .mod-pedal-boxy{{{cns}}}.mod-boxy85.mod-green { 912 | background-image:url(/resources/pedals/boxy85/green.png{{{ns}}}); 913 | } 914 | .mod-pedal-boxy{{{cns}}}.mod-boxy100.mod-green { 915 | background-image:url(/resources/pedals/boxy100/green.png{{{ns}}}); 916 | } 917 | 918 | 919 | /* = COLORS - Color of the pedals labels 920 | ================================================ */ 921 | .mod-pedal-boxy{{{cns}}}.mod-tribal2 .mod-enumerated, 922 | .mod-pedal-boxy{{{cns}}}.mod-purple .mod-enumerated, 923 | .mod-pedal-boxy{{{cns}}}.mod-lava .mod-enumerated, 924 | .mod-pedal-boxy{{{cns}}}.mod-black .mod-enumerated, 925 | .mod-pedal-boxy{{{cns}}}.mod-racing .mod-enumerated, 926 | .mod-pedal-boxy{{{cns}}}.mod-red .mod-enumerated, 927 | .mod-pedal-boxy{{{cns}}}.mod-brown .mod-enumerated, 928 | .mod-pedal-boxy{{{cns}}}.mod-petrol .mod-enumerated, 929 | .mod-pedal-boxy{{{cns}}}.mod-wood2 .mod-enumerated, 930 | .mod-pedal-boxy{{{cns}}}.mod-wood3 .mod-enumerated, 931 | .mod-pedal-boxy{{{cns}}}.mod-wood4 .mod-enumerated, 932 | .mod-pedal-boxy{{{cns}}}.mod-gray .mod-enumerated, 933 | .mod-pedal-boxy{{{cns}}}.mod-none .mod-enumerated, 934 | .mod-pedal-boxy{{{cns}}}.mod-flowerpower .mod-enumerated, 935 | .mod-pedal-boxy{{{cns}}}.mod-darkblue .mod-enumerated, 936 | .mod-pedal-boxy{{{cns}}}.mod-warning .mod-enumerated, 937 | .mod-pedal-boxy{{{cns}}}.mod-green .mod-enumerated 938 | { 939 | background-image:url(/resources/utils/dropdown-arrow-white.png{{{ns}}}); 940 | } 941 | .mod-pedal-boxy{{{cns}}}.mod-gold .mod-enumerated, 942 | .mod-pedal-boxy{{{cns}}}.mod-slime .mod-enumerated, 943 | .mod-pedal-boxy{{{cns}}}.mod-yellow .mod-enumerated, 944 | .mod-pedal-boxy{{{cns}}}.mod-pink .mod-enumerated, 945 | .mod-pedal-boxy{{{cns}}}.mod-zinc .mod-enumerated, 946 | .mod-pedal-boxy{{{cns}}}.mod-cream .mod-enumerated, 947 | .mod-pedal-boxy{{{cns}}}.mod-blue .mod-enumerated, 948 | .mod-pedal-boxy{{{cns}}}.mod-orange .mod-enumerated, 949 | .mod-pedal-boxy{{{cns}}}.mod-white .mod-enumerated, 950 | .mod-pedal-boxy{{{cns}}}.mod-dots .mod-enumerated, 951 | .mod-pedal-boxy{{{cns}}}.mod-wood0 .mod-enumerated, 952 | .mod-pedal-boxy{{{cns}}}.mod-wood1 .mod-enumerated, 953 | .mod-pedal-boxy{{{cns}}}.mod-cyan .mod-enumerated, 954 | .mod-pedal-boxy{{{cns}}}.mod-tribal1 .mod-enumerated 955 | { 956 | background-image:url(/resources/utils/dropdown-arrow-black.png{{{ns}}}); 957 | } 958 | .mod-pedal-boxy{{{cns}}}.mod-tribal2 h1, 959 | .mod-pedal-boxy{{{cns}}}.mod-tribal2 .mod-enumerated, 960 | .mod-pedal-boxy{{{cns}}}.mod-tribal2 .mod-control-group .mod-knob > span.mod-knob-title, 961 | .mod-pedal-boxy{{{cns}}}.mod-purple h1, 962 | .mod-pedal-boxy{{{cns}}}.mod-purple .mod-enumerated, 963 | .mod-pedal-boxy{{{cns}}}.mod-purple .mod-control-group .mod-knob > span.mod-knob-title, 964 | .mod-pedal-boxy{{{cns}}}.mod-lava h1, 965 | .mod-pedal-boxy{{{cns}}}.mod-lava .mod-enumerated, 966 | .mod-pedal-boxy{{{cns}}}.mod-lava .mod-control-group .mod-knob > span.mod-knob-title, 967 | .mod-pedal-boxy{{{cns}}}.mod-black h1, 968 | .mod-pedal-boxy{{{cns}}}.mod-black .mod-enumerated, 969 | .mod-pedal-boxy{{{cns}}}.mod-black .mod-control-group .mod-knob > span.mod-knob-title, 970 | .mod-pedal-boxy{{{cns}}}.mod-racing h1, 971 | .mod-pedal-boxy{{{cns}}}.mod-racing .mod-enumerated, 972 | .mod-pedal-boxy{{{cns}}}.mod-racing .mod-control-group .mod-knob > span.mod-knob-title, 973 | .mod-pedal-boxy{{{cns}}}.mod-red h1, 974 | .mod-pedal-boxy{{{cns}}}.mod-red .mod-enumerated, 975 | .mod-pedal-boxy{{{cns}}}.mod-red .mod-control-group .mod-knob > span.mod-knob-title, 976 | .mod-pedal-boxy{{{cns}}}.mod-brown h1, 977 | .mod-pedal-boxy{{{cns}}}.mod-brown .mod-enumerated, 978 | .mod-pedal-boxy{{{cns}}}.mod-brown .mod-control-group .mod-knob > span.mod-knob-title, 979 | .mod-pedal-boxy{{{cns}}}.mod-petrol h1, 980 | .mod-pedal-boxy{{{cns}}}.mod-petrol .mod-enumerated, 981 | .mod-pedal-boxy{{{cns}}}.mod-petrol .mod-control-group .mod-knob > span.mod-knob-title, 982 | .mod-pedal-boxy{{{cns}}}.mod-wood2 h1, 983 | .mod-pedal-boxy{{{cns}}}.mod-wood2 .mod-enumerated, 984 | .mod-pedal-boxy{{{cns}}}.mod-wood2 .mod-control-group .mod-knob > span.mod-knob-title, 985 | .mod-pedal-boxy{{{cns}}}.mod-wood3 h1, 986 | .mod-pedal-boxy{{{cns}}}.mod-wood3 .mod-enumerated, 987 | .mod-pedal-boxy{{{cns}}}.mod-wood3 .mod-control-group .mod-knob > span.mod-knob-title, 988 | .mod-pedal-boxy{{{cns}}}.mod-wood4 h1, 989 | .mod-pedal-boxy{{{cns}}}.mod-wood4 .mod-enumerated, 990 | .mod-pedal-boxy{{{cns}}}.mod-wood4 .mod-control-group .mod-knob > span.mod-knob-title, 991 | .mod-pedal-boxy{{{cns}}}.mod-gray h1, 992 | .mod-pedal-boxy{{{cns}}}.mod-gray .mod-enumerated, 993 | .mod-pedal-boxy{{{cns}}}.mod-gray .mod-control-group .mod-knob > span.mod-knob-title, 994 | .mod-pedal-boxy{{{cns}}}.mod-none h1, 995 | .mod-pedal-boxy{{{cns}}}.mod-none .mod-enumerated, 996 | .mod-pedal-boxy{{{cns}}}.mod-none .mod-control-group .mod-knob > span.mod-knob-title, 997 | .mod-pedal-boxy{{{cns}}}.mod-flowerpower h1, 998 | .mod-pedal-boxy{{{cns}}}.mod-flowerpower .mod-enumerated, 999 | .mod-pedal-boxy{{{cns}}}.mod-flowerpower .mod-control-group .mod-knob > span.mod-knob-title, 1000 | .mod-pedal-boxy{{{cns}}}.mod-darkblue h1, 1001 | .mod-pedal-boxy{{{cns}}}.mod-darkblue .mod-enumerated, 1002 | .mod-pedal-boxy{{{cns}}}.mod-darkblue .mod-control-group .mod-knob > span.mod-knob-title, 1003 | .mod-pedal-boxy{{{cns}}}.mod-warning h1, 1004 | .mod-pedal-boxy{{{cns}}}.mod-warning .mod-enumerated, 1005 | .mod-pedal-boxy{{{cns}}}.mod-warning .mod-control-group .mod-knob > span.mod-knob-title, 1006 | .mod-pedal-boxy{{{cns}}}.mod-green h1, 1007 | .mod-pedal-boxy{{{cns}}}.mod-green .mod-enumerated, 1008 | .mod-pedal-boxy{{{cns}}}.mod-green .mod-control-group .mod-knob > span.mod-knob-title 1009 | { 1010 | color:white; 1011 | } 1012 | .mod-pedal-boxy{{{cns}}}.mod-gold h1, 1013 | .mod-pedal-boxy{{{cns}}}.mod-gold .mod-enumerated, 1014 | .mod-pedal-boxy{{{cns}}}.mod-gold .mod-control-group .mod-knob > span.mod-knob-title, 1015 | .mod-pedal-boxy{{{cns}}}.mod-slime h1, 1016 | .mod-pedal-boxy{{{cns}}}.mod-slime .mod-enumerated, 1017 | .mod-pedal-boxy{{{cns}}}.mod-slime .mod-control-group .mod-knob > span.mod-knob-title, 1018 | .mod-pedal-boxy{{{cns}}}.mod-yellow h1, 1019 | .mod-pedal-boxy{{{cns}}}.mod-yellow .mod-enumerated, 1020 | .mod-pedal-boxy{{{cns}}}.mod-yellow .mod-control-group .mod-knob > span.mod-knob-title, 1021 | .mod-pedal-boxy{{{cns}}}.mod-pink h1, 1022 | .mod-pedal-boxy{{{cns}}}.mod-pink .mod-enumerated, 1023 | .mod-pedal-boxy{{{cns}}}.mod-pink .mod-control-group .mod-knob > span.mod-knob-title, 1024 | .mod-pedal-boxy{{{cns}}}.mod-zinc h1, 1025 | .mod-pedal-boxy{{{cns}}}.mod-zinc .mod-enumerated, 1026 | .mod-pedal-boxy{{{cns}}}.mod-zinc .mod-control-group .mod-knob > span.mod-knob-title, 1027 | .mod-pedal-boxy{{{cns}}}.mod-cream h1, 1028 | .mod-pedal-boxy{{{cns}}}.mod-cream .mod-enumerated, 1029 | .mod-pedal-boxy{{{cns}}}.mod-cream .mod-control-group .mod-knob > span.mod-knob-title, 1030 | .mod-pedal-boxy{{{cns}}}.mod-blue h1, 1031 | .mod-pedal-boxy{{{cns}}}.mod-blue .mod-enumerated, 1032 | .mod-pedal-boxy{{{cns}}}.mod-blue .mod-control-group .mod-knob > span.mod-knob-title, 1033 | .mod-pedal-boxy{{{cns}}}.mod-orange h1, 1034 | .mod-pedal-boxy{{{cns}}}.mod-orange .mod-enumerated, 1035 | .mod-pedal-boxy{{{cns}}}.mod-orange .mod-control-group .mod-knob > span.mod-knob-title, 1036 | .mod-pedal-boxy{{{cns}}}.mod-white h1, 1037 | .mod-pedal-boxy{{{cns}}}.mod-white .mod-enumerated, 1038 | .mod-pedal-boxy{{{cns}}}.mod-white .mod-control-group .mod-knob > span.mod-knob-title, 1039 | .mod-pedal-boxy{{{cns}}}.mod-dots h1, 1040 | .mod-pedal-boxy{{{cns}}}.mod-dots .mod-enumerated, 1041 | .mod-pedal-boxy{{{cns}}}.mod-dots .mod-control-group .mod-knob > span.mod-knob-title, 1042 | .mod-pedal-boxy{{{cns}}}.mod-wood0 h1, 1043 | .mod-pedal-boxy{{{cns}}}.mod-wood0 .mod-enumerated, 1044 | .mod-pedal-boxy{{{cns}}}.mod-wood0 .mod-control-group .mod-knob > span.mod-knob-title, 1045 | .mod-pedal-boxy{{{cns}}}.mod-wood1 h1, 1046 | .mod-pedal-boxy{{{cns}}}.mod-wood1 .mod-enumerated, 1047 | .mod-pedal-boxy{{{cns}}}.mod-wood1 .mod-control-group .mod-knob > span.mod-knob-title, 1048 | .mod-pedal-boxy{{{cns}}}.mod-cyan h1, 1049 | .mod-pedal-boxy{{{cns}}}.mod-cyan .mod-enumerated, 1050 | .mod-pedal-boxy{{{cns}}}.mod-cyan .mod-control-group .mod-knob > span.mod-knob-title, 1051 | .mod-pedal-boxy{{{cns}}}.mod-tribal1 h1, 1052 | .mod-pedal-boxy{{{cns}}}.mod-tribal1 .mod-enumerated, 1053 | .mod-pedal-boxy{{{cns}}}.mod-tribal1 .mod-control-group .mod-knob > span.mod-knob-title 1054 | { 1055 | color:black; 1056 | } 1057 | .mod-pedal-boxy{{{cns}}}.mod-tribal2 h1, 1058 | .mod-pedal-boxy{{{cns}}}.mod-purple h1, 1059 | .mod-pedal-boxy{{{cns}}}.mod-lava h1, 1060 | .mod-pedal-boxy{{{cns}}}.mod-black h1, 1061 | .mod-pedal-boxy{{{cns}}}.mod-racing h1, 1062 | .mod-pedal-boxy{{{cns}}}.mod-red h1, 1063 | .mod-pedal-boxy{{{cns}}}.mod-brown h1, 1064 | .mod-pedal-boxy{{{cns}}}.mod-petrol h1, 1065 | .mod-pedal-boxy{{{cns}}}.mod-wood2 h1, 1066 | .mod-pedal-boxy{{{cns}}}.mod-wood3 h1, 1067 | .mod-pedal-boxy{{{cns}}}.mod-wood4 h1, 1068 | .mod-pedal-boxy{{{cns}}}.mod-gray h1, 1069 | .mod-pedal-boxy{{{cns}}}.mod-none h1, 1070 | .mod-pedal-boxy{{{cns}}}.mod-flowerpower h1, 1071 | .mod-pedal-boxy{{{cns}}}.mod-darkblue h1, 1072 | .mod-pedal-boxy{{{cns}}}.mod-warning h1, 1073 | .mod-pedal-boxy{{{cns}}}.mod-green h1 1074 | { 1075 | border-color:white; 1076 | } 1077 | .mod-pedal-boxy{{{cns}}}.mod-gold h1, 1078 | .mod-pedal-boxy{{{cns}}}.mod-slime h1, 1079 | .mod-pedal-boxy{{{cns}}}.mod-yellow h1, 1080 | .mod-pedal-boxy{{{cns}}}.mod-pink h1, 1081 | .mod-pedal-boxy{{{cns}}}.mod-zinc h1, 1082 | .mod-pedal-boxy{{{cns}}}.mod-cream h1, 1083 | .mod-pedal-boxy{{{cns}}}.mod-blue h1, 1084 | .mod-pedal-boxy{{{cns}}}.mod-orange h1, 1085 | .mod-pedal-boxy{{{cns}}}.mod-white h1, 1086 | .mod-pedal-boxy{{{cns}}}.mod-dots h1, 1087 | .mod-pedal-boxy{{{cns}}}.mod-wood0 h1, 1088 | .mod-pedal-boxy{{{cns}}}.mod-wood1 h1, 1089 | .mod-pedal-boxy{{{cns}}}.mod-cyan h1, 1090 | .mod-pedal-boxy{{{cns}}}.mod-tribal1 h1 1091 | { 1092 | border-color:black; 1093 | } 1094 | /* STYLES FOR THE BOXY KNOB */ 1095 | 1096 | 1097 | /* = KNOBS 1098 | ================================================ */ 1099 | .mod-pedal-boxy{{{cns}}} .mod-control-group.mod-copper .mod-knob .mod-knob-image { 1100 | background-image:url(/resources/knobs/boxy/copper.png{{{ns}}}); 1101 | }.mod-pedal-boxy{{{cns}}} .mod-control-group.mod-aluminium .mod-knob .mod-knob-image { 1102 | background-image:url(/resources/knobs/boxy/aluminium.png{{{ns}}}); 1103 | }.mod-pedal-boxy{{{cns}}} .mod-control-group.mod-gold .mod-knob .mod-knob-image { 1104 | background-image:url(/resources/knobs/boxy/gold.png{{{ns}}}); 1105 | }.mod-pedal-boxy{{{cns}}} .mod-control-group.mod-petrol .mod-knob .mod-knob-image { 1106 | background-image:url(/resources/knobs/boxy/petrol.png{{{ns}}}); 1107 | }.mod-pedal-boxy{{{cns}}} .mod-control-group.mod-silver .mod-knob .mod-knob-image { 1108 | background-image:url(/resources/knobs/boxy/silver.png{{{ns}}}); 1109 | }.mod-pedal-boxy{{{cns}}} .mod-control-group.mod-bronze .mod-knob .mod-knob-image { 1110 | background-image:url(/resources/knobs/boxy/bronze.png{{{ns}}}); 1111 | }.mod-pedal-boxy{{{cns}}} .mod-control-group.mod-blue .mod-knob .mod-knob-image { 1112 | background-image:url(/resources/knobs/boxy/blue.png{{{ns}}}); 1113 | }.mod-pedal-boxy{{{cns}}} .mod-control-group.mod-steel .mod-knob .mod-knob-image { 1114 | background-image:url(/resources/knobs/boxy/steel.png{{{ns}}}); 1115 | }.mod-pedal-boxy{{{cns}}} .mod-control-group.mod-purple .mod-knob .mod-knob-image { 1116 | background-image:url(/resources/knobs/boxy/purple.png{{{ns}}}); 1117 | }.mod-pedal-boxy{{{cns}}} .mod-control-group.mod-black .mod-knob .mod-knob-image { 1118 | background-image:url(/resources/knobs/boxy/black.png{{{ns}}}); 1119 | }.mod-pedal-boxy{{{cns}}} .mod-control-group.mod-green .mod-knob .mod-knob-image { 1120 | background-image:url(/resources/knobs/boxy/green.png{{{ns}}}); 1121 | } 1122 | -------------------------------------------------------------------------------- /Rumor/MOD/modgui/thumbnail-rumor.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/brummer10/Rumor/5ad260520f118960c51123ecc6890afba7d81f61/Rumor/MOD/modgui/thumbnail-rumor.png -------------------------------------------------------------------------------- /Rumor/MOD/modgui/utils/dropdown-arrow-black.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/brummer10/Rumor/5ad260520f118960c51123ecc6890afba7d81f61/Rumor/MOD/modgui/utils/dropdown-arrow-black.png -------------------------------------------------------------------------------- /Rumor/MOD/modgui/utils/dropdown-arrow-white.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/brummer10/Rumor/5ad260520f118960c51123ecc6890afba7d81f61/Rumor/MOD/modgui/utils/dropdown-arrow-white.png -------------------------------------------------------------------------------- /Rumor/Rumor.c: -------------------------------------------------------------------------------- 1 | 2 | #define CONTROLS 4 3 | 4 | #define GUI_ELEMENTS 1 5 | 6 | #define TAB_ELEMENTS 0 7 | 8 | 9 | #define PLUGIN_UI_URI "https://github.com/brummer10/Rumor_UI" 10 | 11 | 12 | #include "lv2_plugin.h" 13 | 14 | 15 | #include "xresources.h" 16 | 17 | void set_costum_theme(Xputty *main) { 18 | main->color_scheme->normal = (Colors) { 19 | /* cairo / r / g / b / a / */ 20 | .fg = { 0.850, 0.850, 0.850, 1.000}, 21 | .bg = { 0.121, 0.098, 0.141, 1.000}, 22 | .base = { 0.000, 0.000, 0.000, 1.000}, 23 | .text = { 0.900, 0.900, 0.900, 1.000}, 24 | .shadow = { 0.000, 0.000, 0.000, 0.200}, 25 | .frame = { 0.000, 0.000, 0.000, 1.000}, 26 | .light = { 0.100, 0.100, 0.100, 1.000} 27 | }; 28 | 29 | main->color_scheme->prelight = (Colors) { 30 | /* cairo / r / g / b / a / */ 31 | .fg = { 1.000, 0.000, 1.000, 1.000}, 32 | .bg = { 0.250, 0.250, 0.250, 1.000}, 33 | .base = { 0.300, 0.300, 0.300, 1.000}, 34 | .text = { 1.000, 1.000, 1.000, 1.000}, 35 | .shadow = { 0.100, 0.100, 0.100, 0.400}, 36 | .frame = { 0.300, 0.300, 0.300, 1.000}, 37 | .light = { 0.300, 0.300, 0.300, 1.000} 38 | }; 39 | 40 | main->color_scheme->selected = (Colors) { 41 | /* cairo / r / g / b / a / */ 42 | .fg = { 0.900, 0.900, 0.900, 1.000}, 43 | .bg = { 0.200, 0.200, 0.200, 1.000}, 44 | .base = { 0.500, 0.180, 0.180, 1.000}, 45 | .text = { 1.000, 1.000, 1.000, 1.000}, 46 | .shadow = { 0.800, 0.180, 0.180, 0.200}, 47 | .frame = { 0.500, 0.180, 0.180, 1.000}, 48 | .light = { 0.500, 0.180, 0.180, 1.000} 49 | }; 50 | 51 | main->color_scheme->active = (Colors) { 52 | /* cairo / r / g / b / a / */ 53 | .fg = { 0.000, 1.000, 1.000, 1.000}, 54 | .bg = { 0.000, 0.000, 0.000, 1.000}, 55 | .base = { 0.180, 0.380, 0.380, 1.000}, 56 | .text = { 0.750, 0.750, 0.750, 1.000}, 57 | .shadow = { 0.180, 0.380, 0.380, 0.500}, 58 | .frame = { 0.180, 0.380, 0.380, 1.000}, 59 | .light = { 0.180, 0.380, 0.380, 1.000} 60 | }; 61 | 62 | main->color_scheme->insensitive = (Colors) { 63 | /* cairo / r / g / b / a / */ 64 | .fg = { 0.850, 0.850, 0.850, 0.500}, 65 | .bg = { 0.100, 0.100, 0.100, 0.500}, 66 | .base = { 0.000, 0.000, 0.000, 0.500}, 67 | .text = { 0.900, 0.900, 0.900, 0.500}, 68 | .shadow = { 0.000, 0.000, 0.000, 0.100}, 69 | .frame = { 0.000, 0.000, 0.000, 0.500}, 70 | .light = { 0.100, 0.100, 0.100, 0.500} 71 | }; 72 | } 73 | 74 | #include "lv2_plugin.cc" 75 | 76 | 77 | 78 | void plugin_value_changed(X11_UI *ui, Widget_t *w, PortIndex index) { 79 | // do special stuff when needed 80 | if (index == 2) adj_set_value(ui->widget[3]->adj, adj_get_value(ui->widget[0]->adj)); 81 | } 82 | 83 | void plugin_set_window_size(int *w,int *h,const char * plugin_uri, float scale) { 84 | (*w) = 300 * scale; //set initial width of main window 85 | (*h) = 344 * scale; //set initial height of main window 86 | } 87 | 88 | const char* plugin_set_name() { 89 | return "Rumor"; //set plugin name to display on UI 90 | } 91 | 92 | void plugin_create_controller_widgets(X11_UI *ui, const char * plugin_uri, float scale) { 93 | set_costum_theme(&ui->main); 94 | ui->elem[0] = add_lv2_image (ui->elem[0], ui->win, -1, "Image5", ui, 30, 30, 240 * scale, 283 * scale); 95 | widget_get_scaled_png(ui->elem[0], LDVAR(monster_png)); 96 | ui->widget[0] = add_lv2_image_toggle (ui->widget[0], ui->elem[0], 2, "", ui, 90, 180, 60 * scale, 60 * scale); 97 | widget_get_png(ui->widget[0], LDVAR(footsw_png)); 98 | 99 | ui->widget[1] = add_lv2_knob (ui->widget[1], ui->elem[0], 3, "intensity", ui, 0, 30, 91 * scale, 101 * scale); 100 | widget_get_png(ui->widget[1], LDVAR(fx_knob_png)); 101 | set_adjustment(ui->widget[1]->adj, 0.000, 0.000, 0.000, 1.000, 0.010, CL_CONTINUOS); 102 | 103 | ui->widget[2] = add_lv2_knob (ui->widget[2], ui->elem[0], 4, "volume", ui, 150, 30, 91 * scale, 101 * scale); 104 | widget_get_png(ui->widget[2], LDVAR(fx_knob_png)); 105 | set_adjustment(ui->widget[2]->adj, 0.000, 0.000, 0.000, 1.000, 0.010, CL_CONTINUOS); 106 | 107 | 108 | ui->widget[3] = add_lv2_image_toggle (ui->widget[3], ui->elem[0], 2, "", ui, 98, 135, 44 * scale, 44 * scale); 109 | widget_get_png(ui->widget[3], LDVAR(LED_Red_png)); 110 | } 111 | 112 | void plugin_cleanup(X11_UI *ui) { 113 | // clean up used sources when needed 114 | } 115 | 116 | 117 | void plugin_port_event(LV2UI_Handle handle, uint32_t port_index, 118 | uint32_t buffer_size, uint32_t format, 119 | const void * buffer) { 120 | // port value change message from host 121 | // do special stuff when needed 122 | } 123 | 124 | -------------------------------------------------------------------------------- /Rumor/Rumor.cpp: -------------------------------------------------------------------------------- 1 | 2 | #include 3 | #include 4 | #include 5 | #include 6 | #include 7 | 8 | #include 9 | 10 | #ifndef _MOD_DEVICE_DUO 11 | #include "resampler.cc" 12 | #include "resampler-table.cc" 13 | #include "zita-resampler/resampler.h" 14 | #include "gx_resampler.cc" 15 | #endif 16 | #include "rumor.cc" 17 | ///////////////////////// MACRO SUPPORT //////////////////////////////// 18 | 19 | #define PLUGIN_URI "https://github.com/brummer10/Rumor" 20 | 21 | #ifndef max 22 | #define max(x, y) (((x) > (y)) ? (x) : (y)) 23 | #endif 24 | #ifndef min 25 | #define min(x, y) (((x) < (y)) ? (x) : (y)) 26 | #endif 27 | 28 | ///////////////////////// DENORMAL PROTECTION WITH SSE ///////////////// 29 | 30 | #ifdef NOSSE 31 | #undef __SSE__ 32 | #endif 33 | 34 | #ifdef __SSE__ 35 | #include 36 | #ifndef _IMMINTRIN_H_INCLUDED 37 | #include 38 | #endif 39 | /* On Intel set FZ (Flush to Zero) and DAZ (Denormals Are Zero) 40 | flags to avoid costly denormals */ 41 | #ifdef __SSE3__ 42 | #ifndef _PMMINTRIN_H_INCLUDED 43 | #include 44 | #endif 45 | #else 46 | #ifndef _XMMINTRIN_H_INCLUDED 47 | #include 48 | #endif 49 | #endif //__SSE3__ 50 | 51 | #endif //__SSE__ 52 | 53 | ////////////////////////////// PLUG-IN CLASS /////////////////////////// 54 | 55 | namespace rumor { 56 | 57 | class DenormalProtection 58 | { 59 | private: 60 | #if defined (__SSE__) || (__arm64__) || defined (__aarch64__) 61 | uint32_t mxcsr_mask; 62 | uint32_t mxcsr; 63 | uint32_t old_mxcsr; 64 | #endif 65 | 66 | public: 67 | inline void set_() { 68 | #if defined (__arm64__) || defined (__aarch64__) 69 | asm volatile("mrs %0, fpcr" : "=r" (old_mxcsr)); 70 | mxcsr = old_mxcsr; 71 | asm volatile("msr fpcr, %0" : : "ri" (mxcsr | 1 << 24)); 72 | #elif defined (__SSE__) 73 | old_mxcsr = _mm_getcsr(); 74 | mxcsr = old_mxcsr; 75 | _mm_setcsr((mxcsr | _MM_DENORMALS_ZERO_MASK | _MM_FLUSH_ZERO_MASK) & mxcsr_mask); 76 | #endif 77 | }; 78 | inline void reset_() { 79 | #if defined (__arm64__) || defined (__aarch64__) 80 | asm volatile("msr fpcr, %0" : : "ri" (old_mxcsr)); 81 | #elif defined (__SSE__) 82 | _mm_setcsr(old_mxcsr); 83 | #endif 84 | }; 85 | 86 | inline DenormalProtection() 87 | { 88 | #ifdef __SSE__ 89 | mxcsr_mask = 0xffbf; // Default MXCSR mask 90 | mxcsr = 0; 91 | #if defined(__x86_64__) || defined(_M_X64) 92 | uint8_t fxsave[512] __attribute__ ((aligned (16))); // Structure for storing FPU state with FXSAVE command 93 | 94 | memset(fxsave, 0, sizeof(fxsave)); 95 | __builtin_ia32_fxsave(&fxsave); 96 | uint32_t mask = *(reinterpret_cast(&fxsave[0x1c])); // Obtain the MXCSR mask from FXSAVE structure 97 | if (mask != 0) 98 | mxcsr_mask = mask; 99 | #endif 100 | #endif 101 | }; 102 | 103 | inline ~DenormalProtection() {}; 104 | }; 105 | 106 | class Xrumor 107 | { 108 | private: 109 | float* input0; 110 | float* output0; 111 | float* bypass; 112 | float bypass_; 113 | rumor::Dsp* dsp; 114 | // bypass ramping 115 | bool needs_ramp_down; 116 | bool needs_ramp_up; 117 | float ramp_down; 118 | float ramp_up; 119 | float ramp_up_step; 120 | float ramp_down_step; 121 | bool bypassed; 122 | DenormalProtection MXCSR; 123 | 124 | // private functions 125 | inline void run_dsp_(uint32_t n_samples); 126 | inline void connect_(uint32_t port,void* data); 127 | inline void init_dsp_(uint32_t rate); 128 | inline void connect_all__ports(uint32_t port, void* data); 129 | inline void activate_f(); 130 | inline void clean_up(); 131 | inline void deactivate_f(); 132 | public: 133 | // LV2 Descriptor 134 | static const LV2_Descriptor descriptor; 135 | // static wrapper to private functions 136 | static void deactivate(LV2_Handle instance); 137 | static void cleanup(LV2_Handle instance); 138 | static void run(LV2_Handle instance, uint32_t n_samples); 139 | static void activate(LV2_Handle instance); 140 | static void connect_port(LV2_Handle instance, uint32_t port, void* data); 141 | static LV2_Handle instantiate(const LV2_Descriptor* descriptor, 142 | double rate, const char* bundle_path, 143 | const LV2_Feature* const* features); 144 | Xrumor(); 145 | ~Xrumor(); 146 | }; 147 | 148 | // constructor 149 | Xrumor::Xrumor() : 150 | 151 | input0(NULL), 152 | output0(NULL), 153 | bypass(NULL), 154 | bypass_(2), 155 | dsp(rumor::plugin()), 156 | needs_ramp_down(false), 157 | needs_ramp_up(false), 158 | bypassed(false) {}; 159 | 160 | // destructor 161 | Xrumor::~Xrumor() { 162 | dsp->del_instance(dsp); 163 | }; 164 | 165 | ///////////////////////// PRIVATE CLASS FUNCTIONS ///////////////////// 166 | 167 | void Xrumor::init_dsp_(uint32_t rate) 168 | { 169 | dsp->init(rate); 170 | // set values for internal ramping 171 | ramp_down_step = 32 * (256 * rate) / 48000; 172 | ramp_up_step = ramp_down_step; 173 | ramp_down = ramp_down_step; 174 | ramp_up = 0.0; 175 | } 176 | 177 | // connect the Ports used by the plug-in class 178 | void Xrumor::connect_(uint32_t port,void* data) 179 | { 180 | switch ((PortIndex)port) 181 | { 182 | case 0: 183 | input0 = static_cast(data); 184 | break; 185 | case 1: 186 | output0 = static_cast(data); 187 | break; 188 | case 2: 189 | bypass = static_cast(data); 190 | break; 191 | default: 192 | break; 193 | } 194 | } 195 | 196 | void Xrumor::activate_f() 197 | { 198 | // allocate the internal DSP mem 199 | } 200 | 201 | void Xrumor::clean_up() 202 | { 203 | // delete the internal DSP mem 204 | } 205 | 206 | void Xrumor::deactivate_f() 207 | { 208 | // delete the internal DSP mem 209 | } 210 | 211 | void Xrumor::run_dsp_(uint32_t n_samples) 212 | { 213 | if(n_samples<1) return; 214 | MXCSR.set_(); 215 | 216 | // do inplace processing on default 217 | if(output0 != input0) 218 | memcpy(output0, input0, n_samples*sizeof(float)); 219 | 220 | float buf0[n_samples]; 221 | // check if bypass is pressed 222 | if (bypass_ != static_cast(*(bypass))) { 223 | bypass_ = static_cast(*(bypass)); 224 | if (!bypass_) { 225 | needs_ramp_down = true; 226 | needs_ramp_up = false; 227 | } else { 228 | needs_ramp_down = false; 229 | needs_ramp_up = true; 230 | bypassed = false; 231 | } 232 | } 233 | 234 | if (needs_ramp_down || needs_ramp_up) { 235 | memcpy(buf0, input0, n_samples*sizeof(float)); 236 | } 237 | if (!bypassed) { 238 | dsp->compute(n_samples, output0, output0); 239 | } 240 | // check if ramping is needed 241 | if (needs_ramp_down) { 242 | float fade = 0; 243 | for (uint32_t i=0; i= 0.0) { 245 | --ramp_down; 246 | } 247 | fade = max(0.0,ramp_down) /ramp_down_step ; 248 | output0[i] = output0[i] * fade + buf0[i] * (1.0 - fade); 249 | } 250 | if (ramp_down <= 0.0) { 251 | // when ramped down, clear buffer from dsp 252 | needs_ramp_down = false; 253 | bypassed = true; 254 | ramp_down = ramp_down_step; 255 | ramp_up = 0.0; 256 | dsp->clear_state_f(); 257 | } else { 258 | ramp_up = ramp_down; 259 | } 260 | } else if (needs_ramp_up) { 261 | float fade = 0; 262 | for (uint32_t i=0; i= ramp_up_step) { 270 | needs_ramp_up = false; 271 | ramp_up = 0.0; 272 | ramp_down = ramp_down_step; 273 | } else { 274 | ramp_down = ramp_up; 275 | } 276 | } 277 | MXCSR.reset_(); 278 | } 279 | 280 | void Xrumor::connect_all__ports(uint32_t port, void* data) 281 | { 282 | // connect the Ports used by the plug-in class 283 | connect_(port,data); 284 | dsp->connect(port,data); 285 | } 286 | 287 | ////////////////////// STATIC CLASS FUNCTIONS //////////////////////// 288 | 289 | LV2_Handle 290 | Xrumor::instantiate(const LV2_Descriptor* descriptor, 291 | double rate, const char* bundle_path, 292 | const LV2_Feature* const* features) 293 | { 294 | // init the plug-in class 295 | Xrumor *self = new Xrumor(); 296 | if (!self) { 297 | return NULL; 298 | } 299 | self->init_dsp_((uint32_t)rate); 300 | return (LV2_Handle)self; 301 | } 302 | 303 | void Xrumor::connect_port(LV2_Handle instance, 304 | uint32_t port, void* data) 305 | { 306 | // connect all ports 307 | static_cast(instance)->connect_all__ports(port, data); 308 | } 309 | 310 | void Xrumor::activate(LV2_Handle instance) 311 | { 312 | // allocate needed mem 313 | static_cast(instance)->activate_f(); 314 | } 315 | 316 | void Xrumor::run(LV2_Handle instance, uint32_t n_samples) 317 | { 318 | // run dsp 319 | static_cast(instance)->run_dsp_(n_samples); 320 | } 321 | 322 | void Xrumor::deactivate(LV2_Handle instance) 323 | { 324 | // free allocated mem 325 | static_cast(instance)->deactivate_f(); 326 | } 327 | 328 | void Xrumor::cleanup(LV2_Handle instance) 329 | { 330 | // well, clean up after us 331 | Xrumor* self = static_cast(instance); 332 | self->clean_up(); 333 | delete self; 334 | } 335 | 336 | const LV2_Descriptor Xrumor::descriptor = 337 | { 338 | PLUGIN_URI , 339 | Xrumor::instantiate, 340 | Xrumor::connect_port, 341 | Xrumor::activate, 342 | Xrumor::run, 343 | Xrumor::deactivate, 344 | Xrumor::cleanup, 345 | NULL 346 | }; 347 | 348 | } // end namespace rumor 349 | 350 | ////////////////////////// LV2 SYMBOL EXPORT /////////////////////////// 351 | 352 | LV2_SYMBOL_EXPORT 353 | const LV2_Descriptor* 354 | lv2_descriptor(uint32_t index) 355 | { 356 | switch (index) 357 | { 358 | case 0: 359 | return &rumor::Xrumor::descriptor; 360 | default: 361 | return NULL; 362 | } 363 | } 364 | 365 | ///////////////////////////// FIN ////////////////////////////////////// 366 | -------------------------------------------------------------------------------- /Rumor/Rumor.ttl: -------------------------------------------------------------------------------- 1 | 2 | @prefix doap: . 3 | @prefix foaf: . 4 | @prefix lv2: . 5 | @prefix rdf: . 6 | @prefix rdfs: . 7 | @prefix guiext: . 8 | @prefix opts: . 9 | @prefix time: . 10 | @prefix units: . 11 | @prefix atom: . 12 | @prefix urid: . 13 | @prefix pprop: . 14 | @prefix midi: . 15 | @prefix patch: . 16 | 17 | 18 | 19 | a foaf:Person ; 20 | foaf:name "brummer" . 21 | 22 | 23 | a lv2:Plugin , 24 | lv2:DistortionPlugin ; 25 | doap:maintainer ; 26 | doap:name "Rumor" ; 27 | lv2:project ; 28 | lv2:requiredFeature urid:map ; 29 | lv2:optionalFeature lv2:hardRTCapable ; 30 | lv2:minorVersion 1 ; 31 | lv2:microVersion 0 ; 32 | 33 | guiext:ui ; 34 | 35 | rdfs:comment """ 36 | ... 37 | """; 38 | 39 | 40 | lv2:port [ 41 | a lv2:AudioPort , 42 | lv2:InputPort ; 43 | lv2:index 0 ; 44 | lv2:symbol "in0" ; 45 | lv2:name "In0" ; 46 | ], [ 47 | a lv2:AudioPort , 48 | lv2:OutputPort ; 49 | lv2:index 1 ; 50 | lv2:symbol "out0" ; 51 | lv2:name "Out0" ; 52 | ], [ 53 | a lv2:InputPort , 54 | lv2:ControlPort ; 55 | lv2:index 2 ; 56 | lv2:designation lv2:enabled; 57 | lv2:portProperty lv2:toggled ; 58 | lv2:symbol "Bypass" ; 59 | lv2:name "bypass" ; 60 | lv2:default 1 ; 61 | lv2:minimum 0 ; 62 | lv2:maximum 1 ; 63 | ], [ 64 | a lv2:InputPort , 65 | lv2:ControlPort ; 66 | lv2:index 3 ; 67 | lv2:symbol "Knob1" ; 68 | lv2:name "intensity" ; 69 | lv2:default 0.000000 ; 70 | lv2:minimum 0.000000 ; 71 | lv2:maximum 1.000000 ; 72 | ], [ 73 | a lv2:InputPort , 74 | lv2:ControlPort ; 75 | lv2:index 4 ; 76 | lv2:symbol "Knob2" ; 77 | lv2:name "volume" ; 78 | lv2:default 0.000000 ; 79 | lv2:minimum 0.000000 ; 80 | lv2:maximum 1.000000 ; 81 | ] . 82 | 83 | 84 | 85 | a guiext:X11UI; 86 | guiext:binary ; 87 | lv2:extensionData guiext::idle ; 88 | lv2:extensionData guiext:resize ; 89 | lv2:extensionData guiext:idleInterface ; 90 | lv2:requiredFeature guiext:idleInterface ; 91 | lv2:optionalFeature opts:options ; 92 | opts:supportedOption guiext:scaleFactor ; . 93 | -------------------------------------------------------------------------------- /Rumor/gx_resampler.cc: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright (C) 2012 Hermann Meyer, Andreas Degert, Pete Shorthose 3 | * 4 | * This program is free software; you can redistribute it and/or modify 5 | * it under the terms of the GNU General Public License as published by 6 | * the Free Software Foundation; either version 2 of the License, or 7 | * (at your option) any later version. 8 | * 9 | * This program is distributed in the hope that it will be useful, 10 | * but WITHOUT ANY WARRANTY; without even the implied warranty of 11 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 12 | * GNU General Public License for more details. 13 | * 14 | * You should have received a copy of the GNU General Public License 15 | * along with this program; if not, write to the Free Software 16 | * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. 17 | * -------------------------------------------------------------------------- 18 | */ 19 | 20 | #include "gx_resampler.h" 21 | #include 22 | 23 | namespace gx_resample 24 | { 25 | 26 | int FixedRateResampler::setup(int _inputRate, int _outputRate) 27 | { 28 | const int qual = 16; // resulting in a total delay of 2*qual (0.7ms @44100) 29 | inputRate = _inputRate; 30 | outputRate = _outputRate; 31 | if (inputRate == outputRate) { 32 | return 0; 33 | } 34 | // upsampler 35 | int ret = r_up.setup(inputRate, outputRate, 1, qual); 36 | if (ret) { 37 | return ret; 38 | } 39 | // k == filtlen() == 2 * qual 40 | // pre-fill with k-1 zeros 41 | r_up.inp_count = r_up.filtlen() - 1; 42 | r_up.out_count = 1; 43 | r_up.inp_data = r_up.out_data = 0; 44 | r_up.process(); 45 | // downsampler 46 | ret = r_down.setup(outputRate, inputRate, 1, qual); 47 | if (ret) { 48 | return ret; 49 | } 50 | // k == filtlen() == 2 * qual * fact 51 | // pre-fill with k-2 zeros 52 | r_down.inp_count = r_down.filtlen() - 2; 53 | r_down.out_count = 1; 54 | r_down.inp_data = r_down.out_data = 0; 55 | r_down.process(); 56 | return 0; 57 | } 58 | 59 | int FixedRateResampler::up(int count, float *input, float *output) 60 | { 61 | if (inputRate == outputRate) { 62 | memcpy(output, input, count*sizeof(float)); 63 | r_down.out_count = count; 64 | return count; 65 | } 66 | r_up.inp_count = count; 67 | r_down.out_count = count+1; // +1 == trick to drain input 68 | r_up.inp_data = input; 69 | int m = max_out_count(count); 70 | r_up.out_count = m; 71 | r_up.out_data = output; 72 | r_up.process(); 73 | assert(r_up.inp_count == 0); 74 | assert(r_up.out_count <= 1); 75 | r_down.inp_count = m - r_up.out_count; 76 | return r_down.inp_count; 77 | } 78 | 79 | void FixedRateResampler::down(float *input, float *output) 80 | { 81 | if (inputRate == outputRate) { 82 | memcpy(output, input, r_down.out_count*sizeof(float)); 83 | return; 84 | } 85 | r_down.inp_data = input; 86 | r_down.out_data = output; 87 | r_down.process(); 88 | assert(r_down.inp_count == 0); 89 | assert(r_down.out_count == 1); 90 | } 91 | 92 | } // namespace gx_resample 93 | -------------------------------------------------------------------------------- /Rumor/gx_resampler.h: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright (C) 2012 Hermann Meyer, Andreas Degert, Pete Shorthose 3 | * 4 | * This program is free software; you can redistribute it and/or modify 5 | * it under the terms of the GNU General Public License as published by 6 | * the Free Software Foundation; either version 2 of the License, or 7 | * (at your option) any later version. 8 | * 9 | * This program is distributed in the hope that it will be useful, 10 | * but WITHOUT ANY WARRANTY; without even the implied warranty of 11 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 12 | * GNU General Public License for more details. 13 | * 14 | * You should have received a copy of the GNU General Public License 15 | * along with this program; if not, write to the Free Software 16 | * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. 17 | * -------------------------------------------------------------------------- 18 | */ 19 | 20 | 21 | #pragma once 22 | 23 | #ifndef SRC_HEADERS_GX_RESAMPLER_H_ 24 | #define SRC_HEADERS_GX_RESAMPLER_H_ 25 | 26 | #include 27 | #include 28 | #include 29 | #include 30 | #include 31 | 32 | namespace gx_resample 33 | { 34 | 35 | #define MAX_UPSAMPLE 8 36 | 37 | 38 | class FixedRateResampler { 39 | private: 40 | Resampler r_up, r_down; 41 | int inputRate, outputRate; 42 | int last_in_count; 43 | public: 44 | int setup(int _inputRate, int _outputRate); 45 | int up(int count, float *input, float *output); 46 | void down(float *input, float *output); 47 | int max_out_count(int in_count) { 48 | return static_cast(ceil((in_count*static_cast(outputRate))/inputRate)); } 49 | }; 50 | 51 | } 52 | #endif // SRC_HEADERS_GX_RESAMPLER_H_ 53 | -------------------------------------------------------------------------------- /Rumor/lv2_plugin.cc: -------------------------------------------------------------------------------- 1 | /* 2 | * 0BSD 3 | * 4 | * BSD Zero Clause License 5 | * 6 | * Copyright (c) 2019 Hermann Meyer 7 | * 8 | * Permission to use, copy, modify, and/or distribute this software for any 9 | * purpose with or without fee is hereby granted. 10 | 11 | * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH 12 | * REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY 13 | * AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, 14 | * INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM 15 | * LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR 16 | * OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR 17 | * PERFORMANCE OF THIS SOFTWARE. 18 | * 19 | */ 20 | 21 | 22 | #include "lv2_plugin.h" 23 | 24 | /*--------------------------------------------------------------------- 25 | ----------------------------------------------------------------------- 26 | the main LV2 handle->XWindow 27 | ----------------------------------------------------------------------- 28 | ----------------------------------------------------------------------*/ 29 | 30 | // setup a color theme 31 | static void set_default_theme(Xputty *main) { 32 | main->color_scheme->normal = (Colors) { 33 | /* cairo / r / g / b / a / */ 34 | /*fg */ { 0.68, 0.44, 0.00, 1.00}, 35 | /*bg */ { 0.1, 0.1, 0.1, 1.0}, 36 | /*base */ { 0.1, 0.1, 0.1, 1.0}, 37 | /*text */ { 0.85, 0.52, 0.00, 1.00}, 38 | /*shadow */ { 0.1, 0.1, 0.1, 0.2}, 39 | /*frame */ { 0.0, 0.0, 0.0, 1.0}, 40 | /*light */ { 0.1, 0.1, 0.2, 1.0} 41 | }; 42 | 43 | main->color_scheme->prelight = (Colors) { 44 | /*fg */ { 1.0, 1.0, 1.0, 1.0}, 45 | /*bg */ { 0.25, 0.25, 0.25, 1.0}, 46 | /*base */ { 0.2, 0.2, 0.2, 1.0}, 47 | /*text */ { 0.7, 0.7, 0.7, 1.0}, 48 | /*shadow */ { 0.1, 0.1, 0.1, 0.4}, 49 | /*frame */ { 0.3, 0.3, 0.3, 1.0}, 50 | /*light */ { 0.3, 0.3, 0.3, 1.0} 51 | }; 52 | 53 | main->color_scheme->selected = (Colors) { 54 | /*fg */ { 0.9, 0.9, 0.9, 1.0}, 55 | /*bg */ { 0.2, 0.2, 0.2, 1.0}, 56 | /*base */ { 0.1, 0.1, 0.1, 1.0}, 57 | /*text */ { 1.0, 1.0, 1.0, 1.0}, 58 | /*shadow */ { 0.18, 0.18, 0.18, 0.2}, 59 | /*frame */ { 0.18, 0.18, 0.18, 1.0}, 60 | /*light */ { 0.18, 0.18, 0.28, 1.0} 61 | }; 62 | } 63 | 64 | static void set_default_knob_color(KnobColors* kp) { 65 | *kp = (KnobColors) { 66 | /* cairo / r / g / b / a / */ 67 | /*p1f */ { 0.349, 0.313, 0.243, 1.0}, 68 | /*p2f */ { 0.349, 0.235, 0.011, 1.0}, 69 | /*p3f */ { 0.15, 0.15, 0.15, 1.0}, 70 | /*p4f */ { 0.1, 0.1, 0.1, 1.00}, 71 | /*p5f */ { 0.05, 0.05, 0.05, 1.0}, 72 | /*p1k */ { 0.349, 0.313, 0.243, 1.0}, 73 | /*p2k */ { 0.349, 0.235, 0.011, 1.0}, 74 | /*p3k */ { 0.15, 0.15, 0.15, 1.0}, 75 | /*p4k */ { 0.1, 0.1, 0.1, 1.00}, 76 | /*p5k */ { 0.05, 0.05, 0.05, 1.0}, 77 | }; 78 | } 79 | 80 | // draw the window 81 | static void draw_window(void *w_, void* user_data) { 82 | Widget_t *w = (Widget_t*)w_; 83 | set_pattern(w,&w->app->color_scheme->selected,&w->app->color_scheme->normal,BACKGROUND_); 84 | cairo_paint (w->crb); 85 | set_pattern(w,&w->app->color_scheme->normal,&w->app->color_scheme->selected,BACKGROUND_); 86 | cairo_rectangle (w->crb,4,4,w->width-8,w->height-8); 87 | cairo_set_line_width(w->crb,4); 88 | cairo_stroke(w->crb); 89 | 90 | cairo_text_extents_t extents; 91 | use_text_color_scheme(w, get_color_state(w)); 92 | cairo_set_font_size (w->crb, w->app->big_font/w->scale.ascale); 93 | cairo_text_extents(w->crb,w->label , &extents); 94 | double tw = extents.width/2.0; 95 | 96 | widget_set_scale(w); 97 | if (w->image) { 98 | cairo_set_source_surface (w->crb, w->image, 0, 0); 99 | cairo_paint (w->crb); 100 | } 101 | use_text_color_scheme(w, get_color_state(w)); 102 | #ifdef USE_ATOM 103 | X11_UI* ui = (X11_UI*)w->parent_struct; 104 | X11_UI_Private_t *ps = (X11_UI_Private_t*)ui->private_ptr; 105 | if (strlen(ps->filename)) { 106 | cairo_text_extents(w->crb, basename(ps->filename), &extents); 107 | double twf = extents.width/2.0; 108 | cairo_move_to (w->crb, max(5,(w->scale.init_width*0.5)-twf), w->scale.init_y+20 ); 109 | cairo_show_text(w->crb, basename(ps->filename)); 110 | } 111 | #endif 112 | cairo_move_to (w->crb, (w->scale.init_width*0.5)-tw, w->scale.init_height-10 ); 113 | cairo_show_text(w->crb, w->label); 114 | widget_reset_scale(w); 115 | cairo_new_path (w->crb); 116 | } 117 | 118 | // if controller value changed send notify to host 119 | static void value_changed(void *w_, void* user_data) { 120 | Widget_t *w = (Widget_t*)w_; 121 | X11_UI* ui = (X11_UI*)w->parent_struct; 122 | float v = adj_get_value(w->adj); 123 | ui->write_function(ui->controller,w->data,sizeof(float),0,&v); 124 | plugin_value_changed(ui, w, (PortIndex)w->data); 125 | } 126 | 127 | 128 | Widget_t* add_lv2_knob(Widget_t *w, Widget_t *p, PortIndex index, const char * label, 129 | X11_UI* ui, int x, int y, int width, int height) { 130 | w = add_knob(p, label, x, y, width, height); 131 | w->parent_struct = ui; 132 | w->data = index; 133 | w->func.value_changed_callback = value_changed; 134 | return w; 135 | } 136 | 137 | 138 | Widget_t* add_lv2_combobox(Widget_t *w, Widget_t *p, PortIndex index, const char * label, 139 | X11_UI* ui, int x, int y, int width, int height) { 140 | w = add_combobox(p, label, x, y, width, height); 141 | w->parent_struct = ui; 142 | w->data = index; 143 | w->func.value_changed_callback = value_changed; 144 | return w; 145 | } 146 | 147 | 148 | Widget_t* add_lv2_vmeter(Widget_t *w, Widget_t *p, PortIndex index, const char * label, 149 | X11_UI* ui, int x, int y, int width, int height) { 150 | w = add_vmeter(p, label, false, x, y, width, height); 151 | w->parent_struct = ui; 152 | w->data = index; 153 | tooltip_set_text(w, label); 154 | w->func.value_changed_callback = value_changed; 155 | return w; 156 | } 157 | 158 | Widget_t* add_lv2_hmeter(Widget_t *w, Widget_t *p, PortIndex index, const char * label, 159 | X11_UI* ui, int x, int y, int width, int height) { 160 | w = add_hmeter(p, label, false, x, y, width, height); 161 | w->parent_struct = ui; 162 | w->data = index; 163 | tooltip_set_text(w, label); 164 | w->func.value_changed_callback = value_changed; 165 | return w; 166 | } 167 | 168 | Widget_t* add_lv2_vslider(Widget_t *w, Widget_t *p, PortIndex index, const char * label, 169 | X11_UI* ui, int x, int y, int width, int height) { 170 | w = add_vslider(p, label, x, y, width, height); 171 | w->parent_struct = ui; 172 | w->data = index; 173 | w->func.value_changed_callback = value_changed; 174 | return w; 175 | } 176 | 177 | Widget_t* add_lv2_hslider(Widget_t *w, Widget_t *p, PortIndex index, const char * label, 178 | X11_UI* ui, int x, int y, int width, int height) { 179 | w = add_hslider(p, label, x, y, width, height); 180 | w->parent_struct = ui; 181 | w->data = index; 182 | w->func.value_changed_callback = value_changed; 183 | return w; 184 | } 185 | 186 | Widget_t* add_lv2_toggle_button(Widget_t *w, Widget_t *p, PortIndex index, const char * label, 187 | X11_UI* ui, int x, int y, int width, int height) { 188 | w = add_toggle_button(p, label, x, y, width, height); 189 | w->parent_struct = ui; 190 | w->data = index; 191 | w->func.value_changed_callback = value_changed; 192 | return w; 193 | } 194 | 195 | Widget_t* add_lv2_image_toggle(Widget_t *w, Widget_t *p, PortIndex index, const char * label, 196 | X11_UI* ui, int x, int y, int width, int height) { 197 | w = add_switch_image_button(p, label, x, y, width, height); 198 | w->parent_struct = ui; 199 | w->data = index; 200 | w->func.value_changed_callback = value_changed; 201 | return w; 202 | } 203 | 204 | Widget_t* add_lv2_button(Widget_t *w, Widget_t *p, PortIndex index, const char * label, 205 | X11_UI* ui, int x, int y, int width, int height) { 206 | w = add_button(p, label, x, y, width, height); 207 | w->parent_struct = ui; 208 | w->data = index; 209 | w->func.value_changed_callback = value_changed; 210 | return w; 211 | } 212 | 213 | Widget_t* add_lv2_valuedisplay(Widget_t *w, Widget_t *p, PortIndex index, const char * label, 214 | X11_UI* ui, int x, int y, int width, int height) { 215 | w = add_valuedisplay(p, label, x, y, width, height); 216 | w->parent_struct = ui; 217 | w->data = index; 218 | w->func.value_changed_callback = value_changed; 219 | return w; 220 | } 221 | 222 | Widget_t* add_lv2_label(Widget_t *w, Widget_t *p, PortIndex index, const char * label, 223 | X11_UI* ui, int x, int y, int width, int height) { 224 | w = add_label(p, label, x, y, width, height); 225 | w->parent_struct = ui; 226 | w->data = index; 227 | w->func.value_changed_callback = value_changed; 228 | return w; 229 | } 230 | 231 | Widget_t* add_lv2_frame(Widget_t *w, Widget_t *p, PortIndex index, const char * label, 232 | X11_UI* ui, int x, int y, int width, int height) { 233 | w = add_frame(p, label, x, y, width, height); 234 | w->parent_struct = ui; 235 | w->data = index; 236 | w->func.value_changed_callback = value_changed; 237 | return w; 238 | } 239 | 240 | Widget_t* add_lv2_image(Widget_t *w, Widget_t *p, PortIndex index, const char * label, 241 | X11_UI* ui, int x, int y, int width, int height) { 242 | w = add_image(p, label, x, y, width, height); 243 | w->parent_struct = ui; 244 | w->data = index; 245 | return w; 246 | } 247 | 248 | Widget_t* add_lv2_waveview(Widget_t *w, Widget_t *p, PortIndex index, const char * label, 249 | X11_UI* ui, int x, int y, int width, int height) { 250 | w = add_waveview(p, label, x, y, width, height); 251 | w->parent_struct = ui; 252 | w->data = index; 253 | w->func.value_changed_callback = value_changed; 254 | return w; 255 | } 256 | 257 | Widget_t* add_lv2_tabbox(Widget_t *w, Widget_t *p, PortIndex index, const char * label, 258 | X11_UI* ui, int x, int y, int width, int height) { 259 | w = add_tabbox(p, label, x, y, width, height); 260 | w->parent_struct = ui; 261 | w->data = index; 262 | return w; 263 | } 264 | 265 | Widget_t* add_lv2_tab(Widget_t *w, Widget_t *p, PortIndex index, const char * label, X11_UI* ui) { 266 | w = tabbox_add_tab(p, label); 267 | w->parent_struct = ui; 268 | w->data = index; 269 | return w; 270 | } 271 | 272 | Widget_t* add_lv2_file_button(Widget_t *w, Widget_t *p, PortIndex index, const char * label, 273 | X11_UI* ui, int x, int y, int width, int height) { 274 | w = add_file_button(p, x, y, width, height, "", ""); 275 | w->data = index; 276 | return w; 277 | } 278 | 279 | void load_bg_image(X11_UI* ui, const char* image) { 280 | cairo_surface_t *getpng = cairo_image_surface_create_from_png (image); 281 | int width = cairo_image_surface_get_width(getpng); 282 | int height = cairo_image_surface_get_height(getpng); 283 | int width_t = ui->win->scale.init_width; 284 | int height_t = ui->win->scale.init_height; 285 | double x = (double)width_t/(double)width; 286 | double y = (double)height_t/(double)height; 287 | cairo_surface_destroy(ui->win->image); 288 | ui->win->image = NULL; 289 | 290 | ui->win->image = cairo_surface_create_similar (ui->win->surface, 291 | CAIRO_CONTENT_COLOR_ALPHA, width_t, height_t); 292 | cairo_t *cri = cairo_create (ui->win->image); 293 | cairo_scale(cri, x,y); 294 | cairo_set_source_surface (cri, getpng,0,0); 295 | cairo_paint (cri); 296 | cairo_surface_destroy(getpng); 297 | cairo_destroy(cri); 298 | } 299 | 300 | void load_controller_image(Widget_t* w, const char* image) { 301 | cairo_surface_t *getpng = cairo_image_surface_create_from_png (image); 302 | int width = cairo_image_surface_get_width(getpng); 303 | int height = cairo_image_surface_get_height(getpng); 304 | cairo_surface_destroy(w->image); 305 | w->image = NULL; 306 | 307 | w->image = cairo_surface_create_similar (w->surface, 308 | CAIRO_CONTENT_COLOR_ALPHA, width, height); 309 | cairo_t *cri = cairo_create (w->image); 310 | cairo_set_source_surface (cri, getpng,0,0); 311 | cairo_paint (cri); 312 | cairo_surface_destroy(getpng); 313 | cairo_destroy(cri); 314 | } 315 | 316 | // init the xwindow and return the LV2UI handle 317 | static LV2UI_Handle instantiate(const LV2UI_Descriptor * descriptor, 318 | const char * plugin_uri, const char * bundle_path, 319 | LV2UI_Write_Function write_function, 320 | LV2UI_Controller controller, LV2UI_Widget * widget, 321 | const LV2_Feature * const * features) { 322 | 323 | X11_UI* ui = (X11_UI*)malloc(sizeof(X11_UI)); 324 | 325 | if (!ui) { 326 | fprintf(stderr,"ERROR: failed to instantiate plugin with URI %s\n", plugin_uri); 327 | return NULL; 328 | } 329 | 330 | ui->parentXwindow = 0; 331 | ui->private_ptr = NULL; 332 | LV2_Options_Option *opts = NULL; 333 | 334 | int i = 0; 335 | for(;iwidget[i] = NULL; 337 | i = 0; 338 | for(;ielem[i] = NULL; 340 | 341 | i = 0; 342 | for (; features[i]; ++i) { 343 | if (!strcmp(features[i]->URI, LV2_UI__parent)) { 344 | ui->parentXwindow = features[i]->data; 345 | } else if(!strcmp(features[i]->URI, LV2_OPTIONS__options)) { 346 | opts = features[i]->data; 347 | } else if (!strcmp(features[i]->URI, LV2_UI__resize)) { 348 | ui->resize = (LV2UI_Resize*)features[i]->data; 349 | } else if (!strcmp(features[i]->URI, LV2_URID_URI "#map")) { 350 | ui->map = (LV2_URID_Map*)features[i]->data; 351 | } 352 | } 353 | 354 | if (ui->parentXwindow == NULL) { 355 | fprintf(stderr, "ERROR: Failed to open parentXwindow for %s\n", plugin_uri); 356 | free(ui); 357 | return NULL; 358 | } 359 | 360 | float scale = 1.0; 361 | if (opts != NULL) { 362 | const LV2_URID ui_scaleFactor = ui->map->map(ui->map->handle, LV2_UI__scaleFactor); 363 | const LV2_URID atom_Float = ui->map->map(ui->map->handle, LV2_ATOM__Float); 364 | for (const LV2_Options_Option* o = opts; o->key; ++o) { 365 | if (o->context == LV2_OPTIONS_INSTANCE && 366 | o->key == ui_scaleFactor && o->type == atom_Float) { 367 | scale = *(float*)o->value; 368 | break; 369 | } 370 | } 371 | if (scale <= 0) scale = 1.0; 372 | } 373 | 374 | // init Xputty 375 | main_init(&ui->main); 376 | ui->kp = (KnobColors*)malloc(sizeof(KnobColors)); 377 | set_default_knob_color(ui->kp); 378 | set_default_theme(&ui->main); 379 | int w = 1; 380 | int h = 1; 381 | plugin_set_window_size(&w,&h,plugin_uri, scale); 382 | // create the toplevel Window on the parentXwindow provided by the host 383 | ui->win = create_window(&ui->main, (Window)ui->parentXwindow, 0, 0, w, h); 384 | ui->win->parent_struct = ui; 385 | ui->win->label = plugin_set_name(); 386 | // connect the expose func 387 | ui->win->func.expose_callback = draw_window; 388 | // create controller widgets 389 | plugin_create_controller_widgets(ui,plugin_uri, scale); 390 | // map all widgets into the toplevel Widget_t 391 | widget_show_all(ui->win); 392 | // set the widget pointer to the X11 Window from the toplevel Widget_t 393 | *widget = (void*)ui->win->widget; 394 | // request to resize the parentXwindow to the size of the toplevel Widget_t 395 | if (ui->resize){ 396 | ui->resize->ui_resize(ui->resize->handle, w, h); 397 | } 398 | // store pointer to the host controller 399 | ui->controller = controller; 400 | // store pointer to the host write function 401 | ui->write_function = write_function; 402 | 403 | return (LV2UI_Handle)ui; 404 | } 405 | 406 | // cleanup after usage 407 | static void cleanup(LV2UI_Handle handle) { 408 | X11_UI* ui = (X11_UI*)handle; 409 | free(ui->kp); 410 | plugin_cleanup(ui); 411 | // Xputty free all memory used 412 | main_quit(&ui->main); 413 | free(ui->private_ptr); 414 | free(ui); 415 | } 416 | 417 | static void null_callback(void *w_, void* user_data) { 418 | 419 | } 420 | 421 | /*--------------------------------------------------------------------- 422 | ----------------------------------------------------------------------- 423 | LV2 interface 424 | ----------------------------------------------------------------------- 425 | ----------------------------------------------------------------------*/ 426 | 427 | // port value change message from host 428 | static void port_event(LV2UI_Handle handle, uint32_t port_index, 429 | uint32_t buffer_size, uint32_t format, 430 | const void * buffer) { 431 | X11_UI* ui = (X11_UI*)handle; 432 | float value = *(float*)buffer; 433 | int i=0; 434 | for (;iwidget[i] && port_index == (uint32_t)ui->widget[i]->data) { 436 | // prevent event loop between host and plugin 437 | xevfunc store = ui->widget[i]->func.value_changed_callback; 438 | ui->widget[i]->func.value_changed_callback = null_callback; 439 | // Xputty check if the new value differs from the old one 440 | // and set new one, when needed 441 | adj_set_value(ui->widget[i]->adj, value); 442 | // activate value_change_callback back 443 | ui->widget[i]->func.value_changed_callback = store; 444 | } 445 | } 446 | plugin_port_event(handle, port_index, buffer_size, format, buffer); 447 | } 448 | 449 | // LV2 idle interface to host 450 | static int ui_idle(LV2UI_Handle handle) { 451 | X11_UI* ui = (X11_UI*)handle; 452 | // Xputty event loop setup to run one cycle when called 453 | run_embedded(&ui->main); 454 | return 0; 455 | } 456 | 457 | // LV2 resize interface to host 458 | static int ui_resize(LV2UI_Feature_Handle handle, int w, int h) { 459 | X11_UI* ui = (X11_UI*)handle; 460 | // Xputty sends configure event to the toplevel widget to resize itself 461 | if (ui) send_configure_event(ui->win,0, 0, w, h); 462 | return 0; 463 | } 464 | 465 | // connect idle and resize functions to host 466 | static const void* extension_data(const char* uri) { 467 | static const LV2UI_Idle_Interface idle = { ui_idle }; 468 | static const LV2UI_Resize resize = { 0 ,ui_resize }; 469 | if (!strcmp(uri, LV2_UI__idleInterface)) { 470 | return &idle; 471 | } 472 | if (!strcmp(uri, LV2_UI__resize)) { 473 | return &resize; 474 | } 475 | return NULL; 476 | } 477 | 478 | static const LV2UI_Descriptor descriptors[] = { 479 | {PLUGIN_UI_URI,instantiate,cleanup,port_event,extension_data}, 480 | #ifdef PLUGIN_UI_URI2 481 | {PLUGIN_UI_URI2,instantiate,cleanup,port_event,extension_data}, 482 | #endif 483 | }; 484 | 485 | 486 | 487 | #ifdef __cplusplus 488 | extern "C" { 489 | #endif 490 | LV2_SYMBOL_EXPORT 491 | const LV2UI_Descriptor* lv2ui_descriptor(uint32_t index) { 492 | if (index >= sizeof(descriptors) / sizeof(descriptors[0])) { 493 | return NULL; 494 | } 495 | return descriptors + index; 496 | } 497 | #ifdef __cplusplus 498 | } 499 | #endif 500 | 501 | -------------------------------------------------------------------------------- /Rumor/lv2_plugin.h: -------------------------------------------------------------------------------- 1 | /* 2 | * 0BSD 3 | * 4 | * BSD Zero Clause License 5 | * 6 | * Copyright (c) 2019 Hermann Meyer 7 | * 8 | * Permission to use, copy, modify, and/or distribute this software for any 9 | * purpose with or without fee is hereby granted. 10 | 11 | * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH 12 | * REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY 13 | * AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, 14 | * INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM 15 | * LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR 16 | * OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR 17 | * PERFORMANCE OF THIS SOFTWARE. 18 | * 19 | */ 20 | 21 | 22 | #include "lv2/lv2plug.in/ns/lv2core/lv2.h" 23 | #include "lv2/lv2plug.in/ns/extensions/ui/ui.h" 24 | #include "lv2/lv2plug.in/ns/ext/state/state.h" 25 | #include "lv2/lv2plug.in/ns/ext/worker/worker.h" 26 | #include 27 | #include "lv2/lv2plug.in/ns/ext/options/options.h" 28 | #ifdef USE_ATOM 29 | #include 30 | #include "lv2/lv2plug.in/ns/ext/atom/forge.h" 31 | #include 32 | #include 33 | #include "lv2/lv2plug.in/ns/ext/patch/patch.h" 34 | #endif 35 | 36 | #ifndef LV2_UI__scaleFactor 37 | #define LV2_UI__scaleFactor "http://lv2plug.in/ns/extensions/ui#scaleFactor" 38 | #endif 39 | 40 | // xwidgets.h includes xputty.h and all defined widgets from Xputty 41 | #include "xwidgets.h" 42 | #include "xfile-dialog.h" 43 | 44 | #pragma once 45 | 46 | #ifndef LV2_PLUGIN_H_ 47 | #define LV2_PLUGIN_H_ 48 | 49 | #ifdef __cplusplus 50 | extern "C" { 51 | #endif 52 | 53 | typedef struct { 54 | int stride; 55 | int width; 56 | int height; 57 | unsigned char* data; 58 | } CairoImageData; 59 | 60 | // struct to define the knob pattern colors 61 | typedef struct { 62 | double p1f[4]; 63 | double p2f[4]; 64 | double p3f[4]; 65 | double p4f[4]; 66 | double p5f[4]; 67 | double p1k[4]; 68 | double p2k[4]; 69 | double p3k[4]; 70 | double p4k[4]; 71 | double p5k[4]; 72 | } KnobColors; 73 | 74 | typedef int PortIndex; 75 | 76 | // main window struct 77 | typedef struct { 78 | void *parentXwindow; 79 | Xputty main; 80 | Widget_t *win; 81 | Widget_t *widget[CONTROLS]; 82 | Widget_t *elem[GUI_ELEMENTS]; 83 | Widget_t *tab_elem[TAB_ELEMENTS]; 84 | KnobColors *kp; 85 | void *private_ptr; 86 | int need_resize; 87 | LV2_URID_Map* map; 88 | void *controller; 89 | LV2UI_Write_Function write_function; 90 | LV2UI_Resize* resize; 91 | } X11_UI; 92 | 93 | // controller value changed, forward value to host when needed 94 | void plugin_value_changed(X11_UI *ui, Widget_t *w, PortIndex index); 95 | 96 | // set the plugin initial window size 97 | void plugin_set_window_size(int *w,int *h,const char * plugin_uri, float scale); 98 | 99 | // set the plugin name 100 | const char* plugin_set_name(); 101 | 102 | // create all needed controller 103 | void plugin_create_controller_widgets(X11_UI *ui, const char * plugin_uri, float scale); 104 | 105 | 106 | Widget_t* add_lv2_knob(Widget_t *w, Widget_t *p, PortIndex index, const char * label, 107 | X11_UI* ui, int x, int y, int width, int height); 108 | 109 | Widget_t* add_lv2_combobox(Widget_t *w, Widget_t *p, PortIndex index, const char * label, 110 | X11_UI* ui, int x, int y, int width, int height); 111 | 112 | Widget_t* add_lv2_vmeter(Widget_t *w, Widget_t *p, PortIndex index, const char * label, 113 | X11_UI* ui, int x, int y, int width, int height); 114 | 115 | Widget_t* add_lv2_hmeter(Widget_t *w, Widget_t *p, PortIndex index, const char * label, 116 | X11_UI* ui, int x, int y, int width, int height); 117 | 118 | Widget_t* add_lv2_vslider(Widget_t *w, Widget_t *p, PortIndex index, const char * label, 119 | X11_UI* ui, int x, int y, int width, int height); 120 | 121 | Widget_t* add_lv2_hslider(Widget_t *w, Widget_t *p, PortIndex index, const char * label, 122 | X11_UI* ui, int x, int y, int width, int height); 123 | 124 | Widget_t* add_lv2_toggle_button(Widget_t *w, Widget_t *p, PortIndex index, const char * label, 125 | X11_UI* ui, int x, int y, int width, int height); 126 | 127 | Widget_t* add_lv2_image_toggle(Widget_t *w, Widget_t *p, PortIndex index, const char * label, 128 | X11_UI* ui, int x, int y, int width, int height); 129 | 130 | Widget_t* add_lv2_button(Widget_t *w, Widget_t *p, PortIndex index, const char * label, 131 | X11_UI* ui, int x, int y, int width, int height); 132 | 133 | Widget_t* add_lv2_valuedisplay(Widget_t *w, Widget_t *p, PortIndex index, const char * label, 134 | X11_UI* ui, int x, int y, int width, int height); 135 | 136 | Widget_t* add_lv2_label(Widget_t *w, Widget_t *p, PortIndex index, const char * label, 137 | X11_UI* ui, int x, int y, int width, int height); 138 | 139 | Widget_t* add_lv2_frame(Widget_t *w, Widget_t *p, PortIndex index, const char * label, 140 | X11_UI* ui, int x, int y, int width, int height); 141 | 142 | Widget_t* add_lv2_image(Widget_t *w, Widget_t *p, PortIndex index, const char * label, 143 | X11_UI* ui, int x, int y, int width, int height); 144 | 145 | Widget_t* add_lv2_waveview(Widget_t *w, Widget_t *p, PortIndex index, const char * label, 146 | X11_UI* ui, int x, int y, int width, int height); 147 | 148 | Widget_t* add_lv2_tabbox(Widget_t *w, Widget_t *p, PortIndex index, const char * label, 149 | X11_UI* ui, int x, int y, int width, int height); 150 | 151 | Widget_t* add_lv2_tab(Widget_t *w, Widget_t *p, PortIndex index, const char * label, X11_UI* ui); 152 | 153 | Widget_t* add_lv2_file_button(Widget_t *w, Widget_t *p, PortIndex index, const char * label, 154 | X11_UI* ui, int x, int y, int width, int height); 155 | 156 | void load_bg_image(X11_UI* ui, const char* image); 157 | 158 | void load_controller_image(Widget_t* w, const char* image); 159 | 160 | // free used mem on exit 161 | void plugin_cleanup(X11_UI *ui); 162 | 163 | // controller value changed message from host 164 | void plugin_port_event(LV2UI_Handle handle, uint32_t port_index, 165 | uint32_t buffer_size, uint32_t format, 166 | const void * buffer); 167 | #ifdef __cplusplus 168 | } 169 | #endif 170 | 171 | #endif //LV2_PLUGIN_H_ 172 | -------------------------------------------------------------------------------- /Rumor/makefile: -------------------------------------------------------------------------------- 1 | 2 | 3 | UNAME := $(shell uname) 4 | # check if user is root 5 | user = $(shell whoami) 6 | ifeq ($(user),root) 7 | INSTALL_DIR = /usr/lib/lv2 8 | else 9 | INSTALL_DIR = ~/.lv2 10 | endif 11 | 12 | # check CPU and supported optimization flags 13 | ifeq ($(UNAME), Linux) 14 | ifneq ($(shell cat /proc/cpuinfo | grep sse3 ) , ) 15 | SSE_CFLAGS = -msse3 -mfpmath=sse -mfxsr 16 | else ifneq ($(shell cat /proc/cpuinfo | grep sse2 ) , ) 17 | SSE_CFLAGS = -msse2 -mfpmath=sse -mfxsr 18 | else ifneq ($(shell cat /proc/cpuinfo | grep sse ) , ) 19 | SSE_CFLAGS = -msse -mfpmath=sse -mfxsr 20 | else ifneq ($(shell cat /proc/cpuinfo | grep ARM ) , ) 21 | ifneq ($(shell cat /proc/cpuinfo | grep ARMv7 ) , ) 22 | ifneq ($(shell cat /proc/cpuinfo | grep vfpd32 ) , ) 23 | SSE_CFLAGS = -march=armv7-a -mfpu=vfpv3 24 | else ifneq ($(shell cat /proc/cpuinfo | grep vfpv3 ) , ) 25 | SSE_CFLAGS = -march=armv7-a -mfpu=vfpv3 26 | endif 27 | else 28 | ARMCPU = "YES" 29 | endif 30 | else 31 | SSE_CFLAGS = 32 | endif 33 | endif 34 | 35 | # check LD version 36 | ifneq ($(shell xxd --version 2>&1 | head -n 1 | grep xxd),) 37 | USE_XXD = 1 38 | else ifneq ($(shell $(LD) --version 2>&1 | head -n 1 | grep LLD),) 39 | ifneq ($(shell uname -a | grep x86_64), ) 40 | LDEMULATION := elf_x86_64 41 | else ifneq ($(shell uname -a | grep amd64), ) 42 | LDEMULATION := elf_x86_64 43 | else ifneq ($(shell uname -a | grep i386), ) 44 | LDEMULATION := elf_i386 45 | endif 46 | USE_LDD = 1 47 | else ifneq ($(shell gold --version 2>&1 | head -n 1 | grep gold),) 48 | LD = gold 49 | endif 50 | 51 | 52 | NAME = Rumor 53 | space := $(subst ,, ) 54 | EXEC_NAME := $(subst $(space),_,$(NAME)) 55 | BUNDLE = $(EXEC_NAME).lv2 56 | RESOURCES_DIR :=../resources/ 57 | LIB_DIR := ../libxputty/libxputty/ 58 | HEADER_DIR := $(LIB_DIR)include/ 59 | UI_LIB:= $(LIB_DIR)libxputty.a 60 | STRIP ?= strip 61 | 62 | RESOURCES := $(wildcard $(RESOURCES_DIR)*.png) 63 | RESOURCES_OBJ := $(notdir $(patsubst %.png,%.o,$(RESOURCES))) 64 | RESOURCES_LIB := $(notdir $(patsubst %.png,%.a,$(RESOURCES))) 65 | RESOURCE_EXTLD := $(notdir $(patsubst %.png,%_png,$(RESOURCES))) 66 | RESOURCEHEADER := xresources.h 67 | GUI_LDFLAGS += -I$(HEADER_DIR) -Wl,-Bstatic -L. $(UI_LIB) \ 68 | -Wl,-Bdynamic `pkg-config --cflags --libs cairo x11` 69 | LDFLAGS += -fvisibility=hidden -shared -lm -fPIC \ 70 | -Wl,-z,noexecstack -Wl,--no-undefined -Wl,--gc-sections 71 | CXXFLAGS += -fPIC -DPIC -O3 -Wall -floop-parallelize-all \ 72 | -ftree-loop-distribution -floop-interchange -ftree-vectorize \ 73 | -I./zita-resampler-1.1.0 -I./zita-resampler-1.1.0/zita-resampler \ 74 | -fomit-frame-pointer -fstrength-reduce -fstack-protector -fvisibility=hidden \ 75 | -fdata-sections -Wl,--gc-sections -Wl,--exclude-libs,ALL $(SSE_CFLAGS) 76 | SLP_LDFLAGS += -fvisibility=hidden -Wl,-Bstatic `pkg-config --cflags --libs xputty` \ 77 | -Wl,-Bdynamic `pkg-config --cflags --libs cairo x11 lilv-0` \ 78 | -shared -lm -fPIC -Wl,-z,noexecstack -Wl,--no-undefined -Wl,--gc-sections 79 | CFLAGS := -O2 -D_FORTIFY_SOURCE=2 -Wall -fstack-protector -fvisibility=hidden \ 80 | -fdata-sections -Wl,--gc-sections -Wl,-z,relro,-z,now -Wl,--exclude-libs,ALL 81 | 82 | .PHONY : all install uninstall 83 | 84 | .NOTPARALLEL: 85 | 86 | all: $(RESOURCEHEADER) $(EXEC_NAME) 87 | 88 | @mkdir -p ./$(BUNDLE) 89 | @cp ./*.ttl ./$(BUNDLE) 90 | @cp ./*.so ./$(BUNDLE) 91 | @if [ -f ./$(BUNDLE)/$(EXEC_NAME).so ]; then echo "build finish, now run make install"; \ 92 | else echo "sorry, build failed"; fi 93 | 94 | mod : clean nogui 95 | @mkdir -p ./$(BUNDLE) 96 | @cp -R ./MOD/* ./$(BUNDLE) 97 | @mv ./*.so ./$(BUNDLE) 98 | @if [ -f ./$(BUNDLE)/$(EXEC_NAME).so ]; then echo $(BLUE)"build finish, now run make install"; \ 99 | else echo $(RED)"sorry, build failed"; fi 100 | @echo $(NONE) 101 | 102 | $(RESOURCEHEADER): $(RESOURCES_OBJ) 103 | rm -f $(RESOURCEHEADER) 104 | for f in $(RESOURCE_EXTLD); do \ 105 | echo 'EXTLD('$${f}')' >> $(RESOURCEHEADER) ; \ 106 | done 107 | 108 | ifdef USE_XXD 109 | $(RESOURCES_OBJ): $(RESOURCES) 110 | @#use this line to regenerate the *.c files from used images 111 | @#cd $(RESOURCES_DIR) && xxd -i $(patsubst %.o,%.png,$@) > $(patsubst %.o,%.c,$@) 112 | $(CC) -c $(RESOURCES_DIR)$(patsubst %.o,%.c,$@) -o $@ 113 | $(AR) rcs $(patsubst %.o,%.a,$@) $@ 114 | else ifdef USE_LDD 115 | $(RESOURCES_OBJ): $(RESOURCES) 116 | cd $(RESOURCES_DIR) && $(LD) -r -b binary -m $(LDEMULATION) -z noexecstack $(patsubst %.o,%.png,$@) -o ../$@ 117 | $(AR) rcs $(patsubst %.o,%.a,$@) $@ 118 | LDFLAGS += -DUSE_LD=1 119 | else 120 | $(RESOURCES_OBJ): $(RESOURCES) 121 | cd $(RESOURCES_DIR) && $(LD) -r -b binary -z noexecstack --strip-all $(patsubst %.o,%.png,$@) -o ../$@ 122 | $(AR) rcs $(patsubst %.o,%.a,$@) $@ 123 | LDFLAGS += -DUSE_LD=1 124 | endif 125 | 126 | $(EXEC_NAME):$(RESOURCES_OBJ) 127 | @# use this line when you include libxputty as submodule 128 | @$(CC) $(CFLAGS) '$(NAME).c' -L. $(RESOURCES_LIB) $(UI_LIB) -o '$(EXEC_NAME)_ui.so' $(LDFLAGS) $(GUI_LDFLAGS) -I./ 129 | $(CXX) $(CXXFLAGS) $(EXEC_NAME).cpp $(LDFLAGS) -o $(EXEC_NAME).so 130 | @#$(CC) $(CFLAGS) '$(NAME).c' -L. $(RESOURCES_LIB) -o '$(EXEC_NAME)_ui.so' $(SLP_LDFLAGS) -I./ 131 | $(STRIP) -s -x -X -R .comment -R .note.ABI-tag $(EXEC_NAME).so 132 | $(STRIP) -s -x -X -R .comment -R .note.ABI-tag $(EXEC_NAME)_ui.so 133 | 134 | nogui : clean 135 | $(CXX) $(CXXFLAGS) $(EXEC_NAME).cpp $(LDFLAGS) -o $(EXEC_NAME).so 136 | $(STRIP) -s -x -X -R .comment -R .note.ABI-tag $(EXEC_NAME).so 137 | 138 | install : 139 | ifneq ("$(wildcard ./$(BUNDLE))","") 140 | @mkdir -p $(DESTDIR)$(INSTALL_DIR)/$(BUNDLE) 141 | cp -r ./$(BUNDLE)/* $(DESTDIR)$(INSTALL_DIR)/$(BUNDLE) 142 | @echo ". ., done" 143 | else 144 | @echo ". ., you must build first" 145 | endif 146 | 147 | uninstall : 148 | @rm -rf $(INSTALL_DIR)/$(BUNDLE) 149 | @echo ". ., done" 150 | 151 | clean: 152 | rm -f *.a *.o *.so xresources.h 153 | @rm -rf ./$(BUNDLE) 154 | 155 | -------------------------------------------------------------------------------- /Rumor/manifest.ttl: -------------------------------------------------------------------------------- 1 | 2 | @prefix lv2: . 3 | @prefix rdfs: . 4 | 5 | a lv2:Plugin ; 6 | lv2:binary ; 7 | rdfs:seeAlso . 8 | -------------------------------------------------------------------------------- /Rumor/rumor.cc: -------------------------------------------------------------------------------- 1 | // generated from file 'rumor.dsp' by dsp2cc: 2 | // Code generated with Faust 2.37.3 (https://faust.grame.fr) 3 | 4 | #include 5 | #include 6 | 7 | #define FAUSTFLOAT float 8 | 9 | using std::signbit; 10 | 11 | #define max(x, y) (((x) > (y)) ? (x) : (y)) 12 | #define min(x, y) (((x) < (y)) ? (x) : (y)) 13 | 14 | template inline T mydsp_faustpower2_f(T x) {return (x * x);} 15 | template inline T mydsp_faustpower3_f(T x) {return ((x * x) * x);} 16 | template inline T mydsp_faustpower4_f(T x) {return (((x * x) * x) * x);} 17 | template inline T mydsp_faustpower5_f(T x) {return ((((x * x) * x) * x) * x);} 18 | template inline T mydsp_faustpower6_f(T x) {return (((((x * x) * x) * x) * x) * x);} 19 | 20 | #define always_inline inline __attribute__((__always_inline__)) 21 | 22 | typedef enum 23 | { 24 | input0, 25 | output0, 26 | bypass, 27 | INTENSITY, 28 | LEVEL, 29 | } PortIndex; 30 | 31 | #include "rumor_table.h" 32 | 33 | namespace rumor { 34 | 35 | class Dsp { 36 | private: 37 | #ifndef _MOD_DEVICE_DUO 38 | gx_resample::FixedRateResampler smp; 39 | uint32_t sample_rate; 40 | #endif 41 | uint32_t fSampleRate; 42 | int iVec0[2]; 43 | double fRec7[2]; 44 | double fRec5[2]; 45 | double fRec3[2]; 46 | double fRec1[2]; 47 | double fRec9[2]; 48 | double fConst0; 49 | double fConst1; 50 | FAUSTFLOAT fVslider0; 51 | FAUSTFLOAT *fVslider0_; 52 | double fRec11[2]; 53 | double fConst3; 54 | double fConst5; 55 | double fVec1[3]; 56 | double fConst6; 57 | double fConst7; 58 | double fConst8; 59 | double fConst9; 60 | double fRec10[3]; 61 | double fRec0[2]; 62 | FAUSTFLOAT fHslider0; 63 | FAUSTFLOAT *fHslider0_; 64 | double fRec12[2]; 65 | 66 | #ifndef _MOD_DEVICE_DUO 67 | double lowpass_fRec1[3]; 68 | double lowpass_fRec0[3]; 69 | #endif 70 | 71 | public: 72 | void connect(uint32_t port,void* data); 73 | void del_instance(Dsp *p); 74 | void clear_state_f(); 75 | void init(uint32_t sample_rate); 76 | void compute(int count, FAUSTFLOAT *input0, FAUSTFLOAT *output0); 77 | Dsp(); 78 | ~Dsp(); 79 | }; 80 | 81 | 82 | 83 | Dsp::Dsp() { 84 | } 85 | 86 | Dsp::~Dsp() { 87 | } 88 | 89 | inline void Dsp::clear_state_f() 90 | { 91 | for (int l0 = 0; (l0 < 2); l0 = (l0 + 1)) iVec0[l0] = 0; 92 | for (int l1 = 0; (l1 < 2); l1 = (l1 + 1)) fRec7[l1] = 0.0; 93 | for (int l2 = 0; (l2 < 2); l2 = (l2 + 1)) fRec5[l2] = 0.0; 94 | for (int l3 = 0; (l3 < 2); l3 = (l3 + 1)) fRec3[l3] = 0.0; 95 | for (int l4 = 0; (l4 < 2); l4 = (l4 + 1)) fRec1[l4] = 0.0; 96 | for (int l5 = 0; (l5 < 2); l5 = (l5 + 1)) fRec9[l5] = 0.0; 97 | for (int l6 = 0; (l6 < 2); l6 = (l6 + 1)) fRec11[l6] = 0.0; 98 | for (int l7 = 0; (l7 < 3); l7 = (l7 + 1)) fVec1[l7] = 0.0; 99 | for (int l8 = 0; (l8 < 3); l8 = (l8 + 1)) fRec10[l8] = 0.0; 100 | for (int l9 = 0; (l9 < 2); l9 = (l9 + 1)) fRec0[l9] = 0.0; 101 | for (int l10 = 0; (l10 < 2); l10 = (l10 + 1)) fRec12[l10] = 0.0; 102 | #ifndef _MOD_DEVICE_DUO 103 | for (int l0 = 0; (l0 < 3); l0 = (l0 + 1)) lowpass_fRec1[l0] = 0.0; 104 | for (int l1 = 0; (l1 < 3); l1 = (l1 + 1)) lowpass_fRec0[l1] = 0.0; 105 | #endif 106 | } 107 | 108 | inline void Dsp::init(uint32_t RsamplingFreq) 109 | { 110 | #ifndef _MOD_DEVICE_DUO 111 | sample_rate = 96000; 112 | smp.setup(RsamplingFreq, sample_rate); 113 | fSampleRate = sample_rate; 114 | #else 115 | fSampleRate = RsamplingFreq; 116 | #endif 117 | fConst0 = std::min(192000.0, std::max(1.0, double(fSampleRate))); 118 | fConst1 = mydsp_faustpower2_f(fConst0); 119 | double fConst2 = (2.50211256782905e-10 * fConst0); 120 | fConst3 = (fConst2 + -1.41841347670627e-07); 121 | double fConst4 = (3.2334114663882602e-10 * fConst0); 122 | fConst5 = (fConst4 + -1.8384980771754499e-06); 123 | fConst6 = (3.68740380275009e-05 * fConst0); 124 | fConst7 = (0.0 - fConst6); 125 | fConst8 = (fConst2 + 1.41841347670627e-07); 126 | fConst9 = (fConst4 + 1.8384980771754499e-06); 127 | clear_state_f(); 128 | } 129 | 130 | void always_inline Dsp::compute(int count, FAUSTFLOAT *input0, FAUSTFLOAT *output0) 131 | { 132 | #define fVslider0 (*fVslider0_) 133 | #define fHslider0 (*fHslider0_) 134 | #ifndef _MOD_DEVICE_DUO 135 | int upcount = smp.max_out_count(count); 136 | FAUSTFLOAT buf[upcount]; 137 | memset(buf, 0, upcount*sizeof(float)); 138 | int ReCount = smp.up(count, input0, buf); 139 | #else 140 | if(output0 != input0) 141 | memcpy(output0, input0, count*sizeof(float)); 142 | float* buf = output0; 143 | int ReCount = count; 144 | #endif 145 | double fSlow0 = (0.00036676987543879196 * (std::exp((3.0 * (1.0 - double(fVslider0)))) + -1.0)); 146 | double fSlow1 = (0.0070000000000000062 * double(fHslider0)); 147 | for (int i0 = 0; (i0 < ReCount); i0 = (i0 + 1)) { 148 | double fTemp0 = double(buf[i0]); 149 | iVec0[0] = 1; 150 | double fTemp1 = double(rumorclip(double((0.66600000000000004 * fRec0[1])))); 151 | double fTemp2 = (0.5 * fRec1[1]); 152 | double fTemp3 = (0.40000000000000002 * fRec3[1]); 153 | double fTemp4 = (fTemp2 + ((0.29999999999999999 * fRec5[1]) + fTemp3)); 154 | double fTemp5 = (((0.20000000000000001 * fRec7[1]) + fTemp1) - fTemp4); 155 | fRec7[0] = fTemp5; 156 | double fRec8 = (0.0 - (0.20000000000000001 * fTemp5)); 157 | fRec5[0] = (fRec8 + fRec7[1]); 158 | double fRec6 = (0.29999999999999999 * (fTemp1 - fTemp4)); 159 | fRec3[0] = (fRec6 + fRec5[1]); 160 | double fRec4 = (0.40000000000000002 * (fTemp1 - (fTemp3 + fTemp2))); 161 | fRec1[0] = (fRec4 + fRec3[1]); 162 | double fRec2 = (0.5 * (fTemp1 - fTemp2)); 163 | fRec9[0] = ((9.9999999999999995e-21 * double((1 - iVec0[1]))) - fRec9[1]); 164 | fRec11[0] = (fSlow0 + (0.99299999999999999 * fRec11[1])); 165 | double fTemp6 = (fTemp0 + fRec9[0]); 166 | fVec1[0] = fTemp6; 167 | fRec10[0] = (0.0 - ((((fRec10[1] * ((fConst1 * ((0.0 - (6.4668229327765205e-10 * fRec11[0])) + -5.0042251356581001e-10)) + 0.00018384980771754501)) + (fRec10[2] * ((fConst0 * (fConst3 + (fConst5 * fRec11[0]))) + 9.1924903858772505e-05))) - (((6.8740380275009003e-06 * fVec1[1]) + (fConst6 * fVec1[2])) + (fConst7 * fTemp6))) / ((fConst0 * (fConst8 + (fConst9 * fRec11[0]))) + 9.1924903858772505e-05))); 168 | fRec0[0] = ((fTemp0 + (fRec1[1] + (fRec2 + (2.0 * fRec9[0])))) - double(rumorclip(double((fRec10[0] - fTemp6))))); 169 | fRec12[0] = (fSlow1 + (0.99299999999999999 * fRec12[1])); 170 | buf[i0] = FAUSTFLOAT((fRec0[0] * fRec12[0])); 171 | iVec0[1] = iVec0[0]; 172 | fRec7[1] = fRec7[0]; 173 | fRec5[1] = fRec5[0]; 174 | fRec3[1] = fRec3[0]; 175 | fRec1[1] = fRec1[0]; 176 | fRec9[1] = fRec9[0]; 177 | fRec11[1] = fRec11[0]; 178 | fVec1[2] = fVec1[1]; 179 | fVec1[1] = fVec1[0]; 180 | fRec10[2] = fRec10[1]; 181 | fRec10[1] = fRec10[0]; 182 | fRec0[1] = fRec0[0]; 183 | fRec12[1] = fRec12[0]; 184 | } 185 | #ifndef _MOD_DEVICE_DUO 186 | for (int i0 = 0; (i0 < ReCount); i0 = (i0 + 1)) { 187 | lowpass_fRec1[0] = (double(buf[i0]) - ((1.7383024478502873 * lowpass_fRec1[1]) + (0.75793715340193646 * lowpass_fRec1[2]))); 188 | lowpass_fRec0[0] = (((1.7481198006261118 * lowpass_fRec1[1]) + (0.87405990031305592 * (lowpass_fRec1[0] + lowpass_fRec1[2]))) - ((1.8709501296525741 * lowpass_fRec0[1]) + (0.89208313498371072 * lowpass_fRec0[2]))); 189 | buf[i0] = FAUSTFLOAT(((1.8815166323181425 * lowpass_fRec0[1]) + (0.94075831615907124 * (lowpass_fRec0[0] + lowpass_fRec0[2])))); 190 | lowpass_fRec1[2] = lowpass_fRec1[1]; 191 | lowpass_fRec1[1] = lowpass_fRec1[0]; 192 | lowpass_fRec0[2] = lowpass_fRec0[1]; 193 | lowpass_fRec0[1] = lowpass_fRec0[0]; 194 | } 195 | smp.down(buf, output0); 196 | #endif 197 | #undef fVslider0 198 | #undef fHslider0 199 | } 200 | 201 | 202 | void Dsp::connect(uint32_t port,void* data) 203 | { 204 | switch ((PortIndex)port) 205 | { 206 | case INTENSITY: 207 | fVslider0_ = static_cast(data); // , 0.5, 0.0, 1.0, 0.01 208 | break; 209 | case LEVEL: 210 | fHslider0_ = static_cast(data); // , 0.5, 0.0, 1.0, 0.01 211 | break; 212 | default: 213 | break; 214 | } 215 | } 216 | 217 | Dsp *plugin() { 218 | return new Dsp(); 219 | } 220 | 221 | void Dsp::del_instance(Dsp *p) 222 | { 223 | delete p; 224 | } 225 | } // end namespace rumor 226 | -------------------------------------------------------------------------------- /Rumor/rumor.dsp: -------------------------------------------------------------------------------- 1 | 2 | 3 | /******************************************************************************* 4 | **************************** File generated by ********************************* 5 | ******************************************************************************** 6 | ./build-plug.py -i Ruiner.sch -t 1 -T -b 7 | *******************************************************************************/ 8 | 9 | // generated automatically 10 | // DO NOT MODIFY! 11 | declare id "rumor"; 12 | declare name "rumor"; 13 | declare category "Extern"; 14 | declare shortname "rumor"; 15 | declare description "rumor"; 16 | declare samplerate "96000"; 17 | 18 | import("stdfaust.lib"); 19 | 20 | /******************************************************************************* 21 | * 1-dimensional function table for linear interpolation 22 | *******************************************************************************/ 23 | rd = library("reducemaps.lib"); 24 | 25 | //-- Rdtable from waveform 26 | rtable(table, r) = (table, int(r)):rdtable; 27 | 28 | //-- Copy the sign of x to f 29 | ccopysign(f, x) = ma.fabs(f) * sign(x); 30 | 31 | //-- Get sign of value x 32 | sign(x) = x<0, 1, -1 : select2; 33 | 34 | //-- Check if value x is negative 35 | fsignbit(x) = x<0; 36 | 37 | //-- Get fractal part of value n 38 | fractal(n) = n - int(n); 39 | 40 | //-- Interpolate value between i and i+1 in table with fractal coefficient f. 41 | interpolation(table, size, f, i) = select2(i<0,select2(i>size-2, 42 | rtable(table, i)*(1-f) + rtable(table,i+1)*f, rtable(table, size-1)), 43 | rtable(table, 0)); 44 | 45 | //-- reduce dc-offset (noise) from table response for very low values 46 | table_gate(table,x) = select2(ma.fabs(x):rd.maxn(4096) _; 187 | 188 | process = +(anti_denormal_ac) : ts9 : + ~ (*(0.666) : rumorclip : fi.allpassn(4,(-0.2, 0.3, 0.4, 0.5))) : *(Volume) with { 189 | Volume = hslider("level[name:Volume]", 0.5, 0, 1, 0.01) : si.smooth(0.993); 190 | }; 191 | -------------------------------------------------------------------------------- /Rumor/rumor_table.h: -------------------------------------------------------------------------------- 1 | 2 | // rumor_table generated by DK/circ_table_gen.py -- do not modify manually 3 | 4 | // variables used 5 | // --sig_max 1.400000 6 | // --table_div 3.393005 7 | // --table_op 1.000000 8 | 9 | struct tablerumor { // 1-dimensional function table 10 | float low; 11 | float high; 12 | float istep; 13 | int size; 14 | float data[]; 15 | }; 16 | 17 | template 18 | struct tablerumor_imp { 19 | float low; 20 | float high; 21 | float istep; 22 | int size; 23 | float data[tab_size]; 24 | operator tablerumor&() const { return *(tablerumor*)this; } 25 | }; 26 | 27 | static tablerumor_imp<200> rumor_table = { 28 | 0,0.833333,142.143,200, { 29 | 0.000000000000,0.001179247307,0.005700404200,0.013696114078,0.023372061838, 30 | 0.033432794676,0.043461811993,0.053388498434,0.063206993536,0.072917985483, 31 | 0.082522533444,0.092021701974,0.101416548612,0.110708139580,0.119897750725, 32 | 0.128986887338,0.137976888372,0.146868847166,0.155663806805,0.164362801522, 33 | 0.172966854232,0.181476976838,0.189894170368,0.198219425108,0.206453720733, 34 | 0.214598026432,0.222653301025,0.230620493087,0.238500541057,0.246294373355, 35 | 0.254002908490,0.261627055172,0.269167712416,0.276625769647,0.284002106808, 36 | 0.291297594461,0.298513093886,0.305649457186,0.312707527379,0.319688138504, 37 | 0.326592115711,0.333420275357,0.340173425105,0.346852364012,0.353457882624, 38 | 0.359990763066,0.366451779133,0.372841696377,0.379161272199,0.385411255930, 39 | 0.391592388924,0.397705404640,0.403751028723,0.409729979096,0.415642966031, 40 | 0.421490692243,0.427273852959,0.432993136006,0.438649221887,0.444242783860, 41 | 0.449774488011,0.455244993338,0.460654951821,0.466005008498,0.471295801539, 42 | 0.476527962321,0.481702115497,0.486818879071,0.491878864466,0.496882676597, 43 | 0.501830913938,0.506724168591,0.511563026356,0.516348066795,0.521079863300, 44 | 0.525758983159,0.530385987621,0.534961431958,0.539485865535,0.543959831863, 45 | 0.548383868671,0.552758507962,0.557084276074,0.561361693746,0.565591276168, 46 | 0.569773533050,0.573908968673,0.577998081951,0.582041366486,0.586039310626, 47 | 0.589992397521,0.593901105176,0.597765906508,0.601587269401,0.605365656755, 48 | 0.609101526546,0.612795331873,0.616447521011,0.620058537463,0.623628820013, 49 | 0.627158802772,0.630648915230,0.634099582305,0.637511224392,0.640884257411, 50 | 0.644219092854,0.647516137833,0.650775795125,0.653998463223,0.657184536373, 51 | 0.660334404627,0.663448453885,0.666527065939,0.669570618516,0.672579485321, 52 | 0.675554036085,0.678494636598,0.681401648760,0.684275430616,0.687116336403, 53 | 0.689924716583,0.692700917890,0.695445283366,0.698158152402,0.700839860776, 54 | 0.703490740691,0.706111120814,0.708701326313,0.711261678897,0.713792496847, 55 | 0.716294095057,0.718766785071,0.721210875114,0.723626670131,0.726014471821, 56 | 0.728374578671,0.730707285991,0.733012885948,0.735291667597,0.737543916918, 57 | 0.739769916846,0.741969947304,0.744144285236,0.746293204636,0.748416976584, 58 | 0.750515869273,0.752590148041,0.754640075401,0.756665911073,0.758667912011, 59 | 0.760646332435,0.762601423857,0.764533435114,0.766442612393,0.768329199259, 60 | 0.770193436687,0.772035563085,0.773855814323,0.775654423761,0.777431622274, 61 | 0.779187638282,0.780922697769,0.782637024317,0.784330839128,0.786004361046, 62 | 0.787657806589,0.789291389968,0.790905323116,0.792499815706,0.794075075183, 63 | 0.795631306783,0.797168713555,0.798687496389,0.800187854035,0.801669983128, 64 | 0.803134078210,0.804580331752,0.806008934176,0.807420073876,0.808813937243, 65 | 0.810190708681,0.811550570633,0.812893703599,0.814220286159,0.815530494989, 66 | 0.816824504887,0.818102488790,0.819364617792,0.820611061169,0.821841986392, 67 | 0.823057559150,0.824257943370,0.825443301233,0.826613793191,0.827769577993, 68 | 0.828910812693,0.830037652677,0.831150251674,0.832248761780,0.833333333468 69 | } 70 | }; 71 | 72 | double always_inline rumorclip(double x) { 73 | double f = fabs(x); 74 | f = f * rumor_table.istep; 75 | int i = static_cast(f); 76 | if (i < 0) { 77 | f = rumor_table.data[0]; 78 | } else if (i >= rumor_table.size-1) { 79 | f = rumor_table.data[rumor_table.size-1]; 80 | } else { 81 | f -= i; 82 | f = rumor_table.data[i]*(1-f) + rumor_table.data[i+1]*f; 83 | } 84 | return copysign(f, x); 85 | } 86 | 87 | -------------------------------------------------------------------------------- /Rumor/zita-resampler-1.1.0/AUTHORS: -------------------------------------------------------------------------------- 1 | Fons Adriaensen 2 | -------------------------------------------------------------------------------- /Rumor/zita-resampler-1.1.0/README: -------------------------------------------------------------------------------- 1 | Files in this directory are from zita-resampler by 2 | Fons Adriaensen 3 | 4 | Please refer to the version official archive 5 | http://kokkinizita.linuxaudio.org/linuxaudio/ 6 | 7 | These files are only included to ease compilation 8 | and installion of Guitarix. Don't modify. 9 | -------------------------------------------------------------------------------- /Rumor/zita-resampler-1.1.0/resampler-table.cc: -------------------------------------------------------------------------------- 1 | // ---------------------------------------------------------------------------- 2 | // 3 | // Copyright (C) 2006-2012 Fons Adriaensen 4 | // 5 | // This program is free software; you can redistribute it and/or modify 6 | // it under the terms of the GNU General Public License as published by 7 | // the Free Software Foundation; either version 3 of the License, or 8 | // (at your option) any later version. 9 | // 10 | // This program is distributed in the hope that it will be useful, 11 | // but WITHOUT ANY WARRANTY; without even the implied warranty of 12 | // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 13 | // GNU General Public License for more details. 14 | // 15 | // You should have received a copy of the GNU General Public License 16 | // along with this program. If not, see . 17 | // 18 | // ---------------------------------------------------------------------------- 19 | 20 | 21 | #include 22 | #include 23 | #include 24 | #include 25 | #include 26 | 27 | 28 | int zita_resampler_major_version (void) 29 | { 30 | return ZITA_RESAMPLER_MAJOR_VERSION; 31 | } 32 | 33 | 34 | int zita_resampler_minor_version (void) 35 | { 36 | return ZITA_RESAMPLER_MINOR_VERSION; 37 | } 38 | 39 | 40 | static double sinc (double x) 41 | { 42 | x = fabs (x); 43 | if (x < 1e-6) return 1.0; 44 | x *= M_PI; 45 | return sin (x) / x; 46 | } 47 | 48 | 49 | static double wind (double x) 50 | { 51 | x = fabs (x); 52 | if (x >= 1.0) return 0.0f; 53 | x *= M_PI; 54 | return 0.384 + 0.500 * cos (x) + 0.116 * cos (2 * x); 55 | } 56 | 57 | 58 | 59 | Resampler_table *Resampler_table::_list = 0; 60 | Resampler_mutex Resampler_table::_mutex; 61 | 62 | 63 | Resampler_table::Resampler_table (double fr, unsigned int hl, unsigned int np) : 64 | _next (0), 65 | _refc (0), 66 | _fr (fr), 67 | _hl (hl), 68 | _np (np) 69 | { 70 | unsigned int i, j; 71 | double t; 72 | float *p; 73 | 74 | _ctab = new float [hl * (np + 1)]; 75 | p = _ctab; 76 | for (j = 0; j <= np; j++) 77 | { 78 | t = (double) j / (double) np; 79 | for (i = 0; i < hl; i++) 80 | { 81 | p [hl - i - 1] = (float)(fr * sinc (t * fr) * wind (t / hl)); 82 | t += 1; 83 | } 84 | p += hl; 85 | } 86 | } 87 | 88 | 89 | Resampler_table::~Resampler_table (void) 90 | { 91 | delete[] _ctab; 92 | } 93 | 94 | 95 | Resampler_table *Resampler_table::create (double fr, unsigned int hl, unsigned int np) 96 | { 97 | Resampler_table *P; 98 | 99 | _mutex.lock (); 100 | P = _list; 101 | while (P) 102 | { 103 | if ((fr >= P->_fr * 0.999) && (fr <= P->_fr * 1.001) && (hl == P->_hl) && (np == P->_np)) 104 | { 105 | P->_refc++; 106 | _mutex.unlock (); 107 | return P; 108 | } 109 | P = P->_next; 110 | } 111 | P = new Resampler_table (fr, hl, np); 112 | P->_refc = 1; 113 | P->_next = _list; 114 | _list = P; 115 | _mutex.unlock (); 116 | return P; 117 | } 118 | 119 | 120 | void Resampler_table::destroy (Resampler_table *T) 121 | { 122 | Resampler_table *P, *Q; 123 | 124 | _mutex.lock (); 125 | if (T) 126 | { 127 | T->_refc--; 128 | if (T->_refc == 0) 129 | { 130 | P = _list; 131 | Q = 0; 132 | while (P) 133 | { 134 | if (P == T) 135 | { 136 | if (Q) Q->_next = T->_next; 137 | else _list = T->_next; 138 | break; 139 | } 140 | Q = P; 141 | P = P->_next; 142 | } 143 | delete T; 144 | } 145 | } 146 | _mutex.unlock (); 147 | } 148 | 149 | 150 | void Resampler_table::print_list (void) 151 | { 152 | Resampler_table *P; 153 | 154 | printf ("Resampler table\n----\n"); 155 | for (P = _list; P; P = P->_next) 156 | { 157 | printf ("refc = %3d fr = %10.6lf hl = %4d np = %4d\n", P->_refc, P->_fr, P->_hl, P->_np); 158 | } 159 | printf ("----\n\n"); 160 | } 161 | 162 | -------------------------------------------------------------------------------- /Rumor/zita-resampler-1.1.0/resampler.cc: -------------------------------------------------------------------------------- 1 | // ---------------------------------------------------------------------------- 2 | // 3 | // Copyright (C) 2006-2012 Fons Adriaensen 4 | // 5 | // This program is free software; you can redistribute it and/or modify 6 | // it under the terms of the GNU General Public License as published by 7 | // the Free Software Foundation; either version 3 of the License, or 8 | // (at your option) any later version. 9 | // 10 | // This program is distributed in the hope that it will be useful, 11 | // but WITHOUT ANY WARRANTY; without even the implied warranty of 12 | // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 13 | // GNU General Public License for more details. 14 | // 15 | // You should have received a copy of the GNU General Public License 16 | // along with this program. If not, see . 17 | // 18 | // ---------------------------------------------------------------------------- 19 | 20 | 21 | #include 22 | #include 23 | #include 24 | #include 25 | #include 26 | 27 | 28 | static unsigned int gcd (unsigned int a, unsigned int b) 29 | { 30 | if (a == 0) return b; 31 | if (b == 0) return a; 32 | while (1) 33 | { 34 | if (a > b) 35 | { 36 | a = a % b; 37 | if (a == 0) return b; 38 | if (a == 1) return 1; 39 | } 40 | else 41 | { 42 | b = b % a; 43 | if (b == 0) return a; 44 | if (b == 1) return 1; 45 | } 46 | } 47 | return 1; 48 | } 49 | 50 | 51 | Resampler::Resampler (void) : 52 | _table (0), 53 | _nchan (0), 54 | _buff (0) 55 | { 56 | reset (); 57 | } 58 | 59 | 60 | Resampler::~Resampler (void) 61 | { 62 | clear (); 63 | } 64 | 65 | 66 | int Resampler::setup (unsigned int fs_inp, 67 | unsigned int fs_out, 68 | unsigned int nchan, 69 | unsigned int hlen) 70 | { 71 | if ((hlen < 8) || (hlen > 96)) return 1; 72 | return setup (fs_inp, fs_out, nchan, hlen, 1.0 - 2.6 / hlen); 73 | } 74 | 75 | 76 | int Resampler::setup (unsigned int fs_inp, 77 | unsigned int fs_out, 78 | unsigned int nchan, 79 | unsigned int hlen, 80 | double frel) 81 | { 82 | unsigned int g, h, k, n, s; 83 | double r; 84 | float *B = 0; 85 | Resampler_table *T = 0; 86 | 87 | k = s = 0; 88 | if (fs_inp && fs_out && nchan) 89 | { 90 | r = (double) fs_out / (double) fs_inp; 91 | g = gcd (fs_out, fs_inp); 92 | n = fs_out / g; 93 | s = fs_inp / g; 94 | if ((16 * r >= 1) && (n <= 1000)) 95 | { 96 | h = hlen; 97 | k = 250; 98 | if (r < 1) 99 | { 100 | frel *= r; 101 | h = (unsigned int)(ceil (h / r)); 102 | k = (unsigned int)(ceil (k / r)); 103 | } 104 | T = Resampler_table::create (frel, h, n); 105 | B = new float [nchan * (2 * h - 1 + k)]; 106 | } 107 | } 108 | clear (); 109 | if (T) 110 | { 111 | _table = T; 112 | _buff = B; 113 | _nchan = nchan; 114 | _inmax = k; 115 | _pstep = s; 116 | return reset (); 117 | } 118 | else return 1; 119 | } 120 | 121 | 122 | void Resampler::clear (void) 123 | { 124 | Resampler_table::destroy (_table); 125 | delete[] _buff; 126 | _buff = 0; 127 | _table = 0; 128 | _nchan = 0; 129 | _inmax = 0; 130 | _pstep = 0; 131 | reset (); 132 | } 133 | 134 | 135 | double Resampler::inpdist (void) const 136 | { 137 | if (!_table) return 0; 138 | return (int)(_table->_hl + 1 - _nread) - (double)_phase / _table->_np; 139 | } 140 | 141 | 142 | int Resampler::inpsize (void) const 143 | { 144 | if (!_table) return 0; 145 | return 2 * _table->_hl; 146 | } 147 | 148 | 149 | int Resampler::reset (void) 150 | { 151 | if (!_table) return 1; 152 | 153 | inp_count = 0; 154 | out_count = 0; 155 | inp_data = 0; 156 | out_data = 0; 157 | _index = 0; 158 | _nread = 0; 159 | _nzero = 0; 160 | _phase = 0; 161 | if (_table) 162 | { 163 | _nread = 2 * _table->_hl; 164 | return 0; 165 | } 166 | return 1; 167 | } 168 | 169 | 170 | int Resampler::process (void) 171 | { 172 | unsigned int hl, ph, np, dp, in, nr, nz, i, n, c; 173 | float *p1, *p2; 174 | 175 | if (!_table) return 1; 176 | 177 | hl = _table->_hl; 178 | np = _table->_np; 179 | dp = _pstep; 180 | in = _index; 181 | nr = _nread; 182 | ph = _phase; 183 | nz = _nzero; 184 | n = (2 * hl - nr) * _nchan; 185 | p1 = _buff + in * _nchan; 186 | p2 = p1 + n; 187 | 188 | while (out_count) 189 | { 190 | if (nr) 191 | { 192 | if (inp_count == 0) break; 193 | if (inp_data) 194 | { 195 | for (c = 0; c < _nchan; c++) p2 [c] = inp_data [c]; 196 | inp_data += _nchan; 197 | nz = 0; 198 | } 199 | else 200 | { 201 | for (c = 0; c < _nchan; c++) p2 [c] = 0; 202 | if (nz < 2 * hl) nz++; 203 | } 204 | nr--; 205 | p2 += _nchan; 206 | inp_count--; 207 | } 208 | else 209 | { 210 | if (out_data) 211 | { 212 | if (nz < 2 * hl) 213 | { 214 | float *c1 = _table->_ctab + hl * ph; 215 | float *c2 = _table->_ctab + hl * (np - ph); 216 | for (c = 0; c < _nchan; c++) 217 | { 218 | float *q1 = p1 + c; 219 | float *q2 = p2 + c; 220 | float s = 1e-20f; 221 | for (i = 0; i < hl; i++) 222 | { 223 | q2 -= _nchan; 224 | s += *q1 * c1 [i] + *q2 * c2 [i]; 225 | q1 += _nchan; 226 | } 227 | *out_data++ = s - 1e-20f; 228 | } 229 | } 230 | else 231 | { 232 | for (c = 0; c < _nchan; c++) *out_data++ = 0; 233 | } 234 | } 235 | out_count--; 236 | 237 | ph += dp; 238 | if (ph >= np) 239 | { 240 | nr = ph / np; 241 | ph -= nr * np; 242 | in += nr; 243 | p1 += nr * _nchan;; 244 | if (in >= _inmax) 245 | { 246 | n = (2 * hl - nr) * _nchan; 247 | memcpy (_buff, p1, n * sizeof (float)); 248 | in = 0; 249 | p1 = _buff; 250 | p2 = p1 + n; 251 | } 252 | } 253 | } 254 | } 255 | _index = in; 256 | _nread = nr; 257 | _phase = ph; 258 | _nzero = nz; 259 | 260 | return 0; 261 | } 262 | 263 | 264 | -------------------------------------------------------------------------------- /Rumor/zita-resampler-1.1.0/zita-resampler/resampler-table.h: -------------------------------------------------------------------------------- 1 | // ---------------------------------------------------------------------------- 2 | // 3 | // Copyright (C) 2006-2012 Fons Adriaensen 4 | // 5 | // This program is free software; you can redistribute it and/or modify 6 | // it under the terms of the GNU General Public License as published by 7 | // the Free Software Foundation; either version 3 of the License, or 8 | // (at your option) any later version. 9 | // 10 | // This program is distributed in the hope that it will be useful, 11 | // but WITHOUT ANY WARRANTY; without even the implied warranty of 12 | // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 13 | // GNU General Public License for more details. 14 | // 15 | // You should have received a copy of the GNU General Public License 16 | // along with this program. If not, see . 17 | // 18 | // ---------------------------------------------------------------------------- 19 | 20 | 21 | #ifndef __RESAMPLER_TABLE_H 22 | #define __RESAMPLER_TABLE_H 23 | 24 | 25 | #include 26 | 27 | 28 | #define ZITA_RESAMPLER_MAJOR_VERSION 1 29 | #define ZITA_RESAMPLER_MINOR_VERSION 1 30 | 31 | 32 | extern int zita_resampler_major_version (void); 33 | extern int zita_resampler_minor_version (void); 34 | 35 | 36 | class Resampler_mutex 37 | { 38 | private: 39 | 40 | friend class Resampler_table; 41 | 42 | Resampler_mutex (void) { pthread_mutex_init (&_mutex, 0); } 43 | ~Resampler_mutex (void) { pthread_mutex_destroy (&_mutex); } 44 | void lock (void) { pthread_mutex_lock (&_mutex); } 45 | void unlock (void) { pthread_mutex_unlock (&_mutex); } 46 | 47 | pthread_mutex_t _mutex; 48 | }; 49 | 50 | 51 | class Resampler_table 52 | { 53 | public: 54 | 55 | static void print_list (void); 56 | 57 | private: 58 | 59 | Resampler_table (double fr, unsigned int hl, unsigned int np); 60 | ~Resampler_table (void); 61 | 62 | friend class Resampler; 63 | friend class VResampler; 64 | 65 | Resampler_table *_next; 66 | unsigned int _refc; 67 | float *_ctab; 68 | double _fr; 69 | unsigned int _hl; 70 | unsigned int _np; 71 | 72 | static Resampler_table *create (double fr, unsigned int hl, unsigned int np); 73 | static void destroy (Resampler_table *T); 74 | 75 | static Resampler_table *_list; 76 | static Resampler_mutex _mutex; 77 | }; 78 | 79 | 80 | #endif 81 | -------------------------------------------------------------------------------- /Rumor/zita-resampler-1.1.0/zita-resampler/resampler.h: -------------------------------------------------------------------------------- 1 | // ---------------------------------------------------------------------------- 2 | // 3 | // Copyright (C) 2006-2012 Fons Adriaensen 4 | // 5 | // This program is free software; you can redistribute it and/or modify 6 | // it under the terms of the GNU General Public License as published by 7 | // the Free Software Foundation; either version 3 of the License, or 8 | // (at your option) any later version. 9 | // 10 | // This program is distributed in the hope that it will be useful, 11 | // but WITHOUT ANY WARRANTY; without even the implied warranty of 12 | // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 13 | // GNU General Public License for more details. 14 | // 15 | // You should have received a copy of the GNU General Public License 16 | // along with this program. If not, see . 17 | // 18 | // ---------------------------------------------------------------------------- 19 | 20 | 21 | #ifndef __RESAMPLER_H 22 | #define __RESAMPLER_H 23 | 24 | 25 | #include 26 | 27 | 28 | class Resampler 29 | { 30 | public: 31 | 32 | Resampler (void); 33 | ~Resampler (void); 34 | 35 | int setup (unsigned int fs_inp, 36 | unsigned int fs_out, 37 | unsigned int nchan, 38 | unsigned int hlen); 39 | 40 | int setup (unsigned int fs_inp, 41 | unsigned int fs_out, 42 | unsigned int nchan, 43 | unsigned int hlen, 44 | double frel); 45 | 46 | void clear (void); 47 | int reset (void); 48 | int nchan (void) const { return _nchan; } 49 | int filtlen (void) const { return inpsize (); } // Deprecated 50 | int inpsize (void) const; 51 | double inpdist (void) const; 52 | int process (void); 53 | 54 | unsigned int inp_count; 55 | unsigned int out_count; 56 | float *inp_data; 57 | float *out_data; 58 | void *inp_list; 59 | void *out_list; 60 | 61 | private: 62 | 63 | Resampler_table *_table; 64 | unsigned int _nchan; 65 | unsigned int _inmax; 66 | unsigned int _index; 67 | unsigned int _nread; 68 | unsigned int _nzero; 69 | unsigned int _phase; 70 | unsigned int _pstep; 71 | float *_buff; 72 | void *_dummy [8]; 73 | }; 74 | 75 | 76 | #endif 77 | -------------------------------------------------------------------------------- /makefile: -------------------------------------------------------------------------------- 1 | 2 | BLUE = "\033[1;34m" 3 | RED = "\033[1;31m" 4 | NONE = "\033[0m" 5 | 6 | SUBDIR := Rumor 7 | 8 | NOGOAL := mod install all 9 | 10 | .PHONY: $(SUBDIR) libxputty recurse 11 | 12 | $(MAKECMDGOALS) recurse: $(SUBDIR) 13 | 14 | clean: 15 | 16 | check-and-reinit-submodules : 17 | ifeq (,$(filter $(NOGOAL),$(MAKECMDGOALS))) 18 | ifeq (,$(findstring clean,$(MAKECMDGOALS))) 19 | @if git submodule status 2>/dev/null | egrep -q '^[-]|^[+]' ; then \ 20 | echo $(RED)"INFO: Need to reinitialize git submodules"$(NONE); \ 21 | git submodule update --init; \ 22 | echo $(BLUE)"Done"$(NONE); \ 23 | else echo $(BLUE)"Submodule up to date"$(NONE); \ 24 | fi 25 | endif 26 | endif 27 | 28 | libxputty: check-and-reinit-submodules 29 | ifeq (,$(filter $(NOGOAL),$(MAKECMDGOALS))) 30 | @exec $(MAKE) -j 1 -C $@ $(MAKECMDGOALS) 31 | endif 32 | 33 | $(SUBDIR): libxputty 34 | @exec $(MAKE) -j 1 -C $@ $(MAKECMDGOALS) 35 | 36 | 37 | -------------------------------------------------------------------------------- /resources/LED_Red.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/brummer10/Rumor/5ad260520f118960c51123ecc6890afba7d81f61/resources/LED_Red.png -------------------------------------------------------------------------------- /resources/footsw.c: -------------------------------------------------------------------------------- 1 | unsigned char footsw_png[] = { 2 | 0x89, 0x50, 0x4e, 0x47, 0x0d, 0x0a, 0x1a, 0x0a, 0x00, 0x00, 0x00, 0x0d, 3 | 0x49, 0x48, 0x44, 0x52, 0x00, 0x00, 0x00, 0x64, 0x00, 0x00, 0x00, 0x32, 4 | 0x08, 0x06, 0x00, 0x00, 0x00, 0xaa, 0x35, 0x7e, 0xbe, 0x00, 0x00, 0x1d, 5 | 0x4d, 0x49, 0x44, 0x41, 0x54, 0x78, 0x9c, 0xed, 0x7a, 0x79, 0x50, 0xd3, 6 | 0xe7, 0xbe, 0xfe, 0xeb, 0xbd, 0xed, 0xb9, 0xd5, 0x5e, 0xdb, 0x73, 0x5a, 7 | 0x5b, 0xbb, 0x9c, 0x2a, 0x5a, 0xdb, 0x53, 0x5a, 0x17, 0x5c, 0x58, 0x04, 8 | 0xa1, 0x2c, 0xea, 0xb1, 0x02, 0xb7, 0x40, 0x05, 0x04, 0x0a, 0x16, 0x17, 9 | 0x14, 0x01, 0xeb, 0x86, 0xb4, 0x15, 0x29, 0xa2, 0x6c, 0x09, 0x4b, 0x80, 10 | 0x84, 0x10, 0x20, 0x41, 0x10, 0x28, 0x05, 0xd9, 0xd7, 0x10, 0x90, 0x7d, 11 | 0x93, 0xb0, 0x0b, 0x51, 0xb0, 0xa0, 0xec, 0x8b, 0x20, 0x50, 0x20, 0x40, 12 | 0x02, 0xcf, 0xef, 0x0f, 0x4c, 0x7e, 0x50, 0xb5, 0x47, 0x6c, 0x7b, 0x96, 13 | 0x19, 0x9f, 0x99, 0x77, 0x32, 0x13, 0x86, 0x99, 0xef, 0xf3, 0x7d, 0x3e, 14 | 0xeb, 0xf3, 0x86, 0x90, 0xe7, 0x78, 0x8e, 0xe7, 0x78, 0x8e, 0xe7, 0x78, 15 | 0x8e, 0xe7, 0x78, 0x8e, 0xe7, 0xf8, 0x37, 0x87, 0xb3, 0xb3, 0xf3, 0x0b, 16 | 0xe6, 0xe6, 0xe6, 0xeb, 0x2d, 0x2c, 0x2c, 0xbe, 0x3c, 0x7c, 0xf8, 0xb0, 17 | 0x8b, 0xb5, 0xb5, 0x75, 0x88, 0x9d, 0x9d, 0x5d, 0xcc, 0xe9, 0xd3, 0xa7, 18 | 0x63, 0xce, 0x9d, 0x3b, 0x17, 0xe2, 0xe8, 0xe8, 0xe8, 0xe2, 0xe2, 0xe2, 19 | 0xf2, 0xa5, 0xab, 0xab, 0xeb, 0xfa, 0xbc, 0xbc, 0xbc, 0x17, 0xfe, 0xd5, 20 | 0xcf, 0xfb, 0x24, 0xfc, 0x47, 0xf3, 0x30, 0x34, 0x34, 0x7c, 0xf5, 0xfc, 21 | 0xf9, 0xf3, 0x66, 0xf1, 0xf1, 0xf1, 0x99, 0x8d, 0x8d, 0x8d, 0x03, 0xc3, 22 | 0xc3, 0xc3, 0xd3, 0xb3, 0x0f, 0x31, 0x36, 0x36, 0x26, 0x1a, 0x1d, 0x1d, 23 | 0x15, 0x75, 0x74, 0x74, 0x08, 0xe3, 0xe2, 0xe2, 0xee, 0x5e, 0xba, 0x74, 24 | 0xa9, 0xda, 0xd5, 0xd5, 0x95, 0x4f, 0xa1, 0x50, 0xf8, 0x3e, 0x3e, 0x3e, 25 | 0xa9, 0x0c, 0x06, 0xc3, 0x36, 0x24, 0x24, 0x44, 0x36, 0x35, 0x35, 0x75, 26 | 0xd9, 0xbf, 0x9a, 0x87, 0xae, 0xae, 0xee, 0x32, 0x7d, 0x7d, 0x7d, 0x59, 27 | 0x43, 0x43, 0x43, 0x5b, 0x33, 0x33, 0xb3, 0xd4, 0x03, 0x07, 0x0e, 0xf0, 28 | 0x0f, 0x1f, 0x3e, 0xcc, 0xb7, 0xb1, 0xb1, 0xa9, 0x72, 0x77, 0x77, 0x6f, 29 | 0x2c, 0x2f, 0x2f, 0x7f, 0x50, 0x52, 0x52, 0xf2, 0x80, 0x46, 0xa3, 0x35, 30 | 0x5d, 0xbc, 0x78, 0xb1, 0xea, 0xdf, 0x8e, 0x87, 0xae, 0xae, 0xee, 0xb2, 31 | 0x8b, 0x17, 0x2f, 0x9e, 0x6a, 0x6f, 0x6f, 0xef, 0xc7, 0x3c, 0xb4, 0xb6, 32 | 0xb6, 0x82, 0xc7, 0xe3, 0x21, 0x26, 0x26, 0x06, 0x31, 0x31, 0x31, 0xe0, 33 | 0x72, 0xb9, 0xb8, 0x7d, 0xfb, 0x36, 0xa6, 0xa7, 0xa7, 0x31, 0x3e, 0x3e, 34 | 0x2e, 0x4a, 0x4f, 0x4f, 0xbf, 0x47, 0xa3, 0xd1, 0xaa, 0xe8, 0x74, 0x3a, 35 | 0x9f, 0xc9, 0x64, 0xf2, 0xd9, 0x6c, 0x36, 0x2f, 0x22, 0x22, 0xe2, 0x72, 36 | 0x6c, 0x6c, 0xac, 0x02, 0x9f, 0xcf, 0x7f, 0xf1, 0x9f, 0xcd, 0xc3, 0xca, 37 | 0xca, 0xea, 0x45, 0x1d, 0x1d, 0x1d, 0x05, 0x7d, 0x7d, 0xfd, 0xcb, 0x46, 38 | 0x46, 0x46, 0x3c, 0x53, 0x53, 0x53, 0xbe, 0x44, 0x0c, 0x47, 0x47, 0xc7, 39 | 0x86, 0xdc, 0xdc, 0xdc, 0xde, 0xbe, 0xbe, 0xbe, 0xc9, 0xa9, 0xa9, 0x29, 40 | 0x8c, 0x8d, 0x8d, 0xe1, 0xee, 0xdd, 0xbb, 0x53, 0xb9, 0xb9, 0xb9, 0xfd, 41 | 0x81, 0x81, 0x81, 0x37, 0x7d, 0x7d, 0x7d, 0xf9, 0xff, 0x16, 0x3c, 0x0c, 42 | 0x0d, 0x0d, 0xdf, 0x6a, 0x6a, 0x6a, 0x6a, 0x9d, 0x2f, 0x44, 0x43, 0x43, 43 | 0x03, 0x0a, 0x0b, 0x0b, 0x91, 0x91, 0x91, 0x81, 0xf8, 0xf8, 0x78, 0x44, 44 | 0x47, 0x47, 0x23, 0x2c, 0x2c, 0x0c, 0x2c, 0x16, 0x0b, 0x74, 0x3a, 0x1d, 45 | 0x34, 0x1a, 0x0d, 0x4c, 0x26, 0x13, 0x79, 0x79, 0x79, 0x10, 0x08, 0x04, 46 | 0x93, 0x21, 0x21, 0x21, 0x35, 0xa1, 0xa1, 0xa1, 0xfc, 0xf0, 0xf0, 0x70, 47 | 0x7e, 0x74, 0x74, 0x34, 0x3f, 0x36, 0x36, 0x96, 0x97, 0x98, 0x98, 0x78, 48 | 0x86, 0xcb, 0xe5, 0xbe, 0xfc, 0xcf, 0xe2, 0x61, 0x6e, 0x6e, 0xfe, 0xb2, 49 | 0xb6, 0xb6, 0xf6, 0x19, 0x3d, 0x3d, 0x3d, 0x9e, 0xa1, 0xa1, 0x21, 0x7f, 50 | 0xbe, 0x18, 0x51, 0x51, 0x51, 0x77, 0xc7, 0xc6, 0xc6, 0x44, 0x33, 0x33, 51 | 0x33, 0x98, 0x99, 0x99, 0xc1, 0xcf, 0x3f, 0xff, 0x8c, 0xfe, 0xfe, 0x7e, 52 | 0x74, 0x77, 0x77, 0xa3, 0xaf, 0xaf, 0x0f, 0xf7, 0xee, 0xdd, 0x9b, 0x4e, 53 | 0x48, 0x48, 0xb8, 0x1b, 0x18, 0x18, 0xc8, 0x0f, 0x09, 0x09, 0xf9, 0xd7, 54 | 0xf0, 0x00, 0xb0, 0xe4, 0xff, 0xfe, 0xef, 0xff, 0xde, 0x19, 0x1e, 0x1e, 55 | 0x9e, 0x90, 0x08, 0x31, 0x3b, 0x3b, 0x8b, 0xb1, 0xb1, 0x31, 0x34, 0x37, 56 | 0x37, 0xa3, 0xb4, 0xb4, 0x14, 0x99, 0x99, 0x99, 0x48, 0x48, 0x48, 0x40, 57 | 0x74, 0x74, 0x34, 0x38, 0x1c, 0x0e, 0x82, 0x82, 0x82, 0x10, 0x10, 0x10, 58 | 0x00, 0x1f, 0x1f, 0x1f, 0x50, 0xa9, 0x54, 0x78, 0x78, 0x78, 0xc0, 0xcf, 59 | 0xcf, 0x0f, 0x61, 0x61, 0x61, 0xb3, 0x3c, 0x1e, 0xef, 0x6e, 0x4c, 0x4c, 60 | 0x4c, 0x75, 0x6c, 0x6c, 0x2c, 0x3f, 0x31, 0x31, 0x91, 0x9f, 0x96, 0x96, 61 | 0xc6, 0xcf, 0xce, 0xce, 0xa6, 0xe5, 0xe5, 0xe5, 0xad, 0x00, 0xb0, 0xe4, 62 | 0x8f, 0xe4, 0xa1, 0xab, 0xab, 0xbb, 0x42, 0x47, 0x47, 0x87, 0xa6, 0xa7, 63 | 0xa7, 0xc7, 0x97, 0x88, 0x61, 0x63, 0x63, 0x53, 0x97, 0x91, 0x91, 0xd1, 64 | 0x3b, 0x3e, 0x3e, 0x2e, 0xc2, 0x3f, 0xc0, 0xd0, 0xd0, 0x10, 0x3a, 0x3a, 65 | 0x3a, 0x50, 0x57, 0x57, 0x37, 0x9e, 0x9e, 0x9e, 0x7e, 0x37, 0x2a, 0x2a, 66 | 0xaa, 0xe6, 0x9f, 0xca, 0x03, 0xc0, 0x12, 0x3d, 0x3d, 0x3d, 0xb9, 0xd1, 67 | 0xd1, 0x51, 0xe1, 0x7c, 0x31, 0x24, 0xa7, 0xa3, 0xa3, 0x03, 0x95, 0x95, 68 | 0x95, 0xc8, 0xce, 0xce, 0x46, 0x42, 0x42, 0x02, 0xa2, 0xa2, 0xa2, 0xc0, 69 | 0x66, 0xb3, 0x11, 0x18, 0x18, 0x08, 0x3f, 0x3f, 0x3f, 0x78, 0x79, 0x79, 70 | 0xc1, 0xd3, 0xd3, 0x13, 0xee, 0xee, 0xee, 0x70, 0x73, 0x73, 0x83, 0x9b, 71 | 0x9b, 0x1b, 0x28, 0x14, 0x0a, 0x04, 0x02, 0xc1, 0xcf, 0x5c, 0x2e, 0xf7, 72 | 0x56, 0x5a, 0x5a, 0x1a, 0x9f, 0xcb, 0xe5, 0xf2, 0xaf, 0x5f, 0xbf, 0xce, 73 | 0x2f, 0x2a, 0x2a, 0x62, 0x97, 0x95, 0x95, 0xc9, 0xfe, 0x11, 0x64, 0x00, 74 | 0x2c, 0xd1, 0xd6, 0xd6, 0x96, 0xd5, 0xd1, 0xd1, 0x61, 0xcf, 0x17, 0x83, 75 | 0xc5, 0x62, 0xb5, 0x4d, 0x4d, 0x4d, 0xcd, 0x48, 0xb8, 0x09, 0x85, 0x42, 76 | 0x14, 0x14, 0x14, 0x20, 0x3d, 0x3d, 0x5d, 0x9a, 0xf1, 0x57, 0xae, 0x5c, 77 | 0x41, 0x70, 0x70, 0x30, 0x18, 0x0c, 0x06, 0x22, 0x23, 0x23, 0x21, 0x10, 78 | 0x08, 0xd0, 0xd3, 0xd3, 0x83, 0x9b, 0x37, 0x6f, 0xce, 0x94, 0x95, 0x95, 79 | 0x8d, 0x25, 0x27, 0x27, 0xdf, 0x4e, 0x4e, 0x4e, 0xae, 0xca, 0xca, 0xca, 80 | 0xaa, 0xca, 0xcd, 0xcd, 0xfd, 0x43, 0x79, 0x10, 0x3d, 0x3d, 0x3d, 0x99, 81 | 0xbe, 0xbe, 0xbe, 0x9f, 0x1f, 0x27, 0xc6, 0xec, 0xec, 0x2c, 0x46, 0x46, 82 | 0x46, 0x50, 0x5f, 0x5f, 0x8f, 0xdc, 0xdc, 0x5c, 0x24, 0x26, 0x26, 0x22, 83 | 0x2a, 0x2a, 0x0a, 0xa1, 0xa1, 0xa1, 0xa0, 0xd3, 0xe9, 0xf0, 0xf5, 0xf5, 84 | 0x05, 0x85, 0x42, 0x59, 0x20, 0x86, 0x9b, 0x9b, 0x1b, 0x2e, 0x5d, 0xba, 85 | 0x04, 0x4b, 0x4b, 0x4b, 0xb4, 0xb4, 0xb4, 0xcc, 0xf0, 0xf9, 0xfc, 0xee, 86 | 0xfc, 0xfc, 0xfc, 0xba, 0xa2, 0xa2, 0xa2, 0xaa, 0xf2, 0xf2, 0xf2, 0xca, 87 | 0xaa, 0xaa, 0x2a, 0xf6, 0xed, 0xdb, 0xb7, 0x57, 0xfc, 0xde, 0x3c, 0x1e, 88 | 0x66, 0x06, 0x5b, 0x4f, 0x4f, 0xaf, 0x72, 0xff, 0xfe, 0xfd, 0x55, 0xc7, 89 | 0x8f, 0x1f, 0xaf, 0xab, 0xad, 0xad, 0x1d, 0x99, 0x1f, 0xfd, 0x0f, 0x1e, 90 | 0x3c, 0x80, 0x40, 0x20, 0x40, 0x71, 0x71, 0xf1, 0x82, 0x8c, 0x9f, 0x5f, 91 | 0x82, 0x7d, 0x7d, 0x7d, 0x41, 0xa5, 0x52, 0x41, 0xa7, 0xd3, 0x11, 0x1f, 92 | 0x1f, 0x0f, 0x2e, 0x97, 0x8b, 0xfc, 0xfc, 0xfc, 0x99, 0xdc, 0xdc, 0xdc, 93 | 0x5e, 0x2e, 0x97, 0xdb, 0x90, 0x9f, 0x9f, 0x5f, 0x5d, 0x52, 0x52, 0x52, 94 | 0x59, 0x59, 0x59, 0xf9, 0xfb, 0xf3, 0x30, 0x37, 0x37, 0x7f, 0x39, 0x3a, 95 | 0x3a, 0xba, 0xfc, 0x49, 0x62, 0x48, 0xce, 0x9d, 0x3b, 0x77, 0x50, 0x50, 96 | 0x50, 0x80, 0xa4, 0xa4, 0x24, 0x44, 0x46, 0x46, 0x22, 0x24, 0x24, 0x04, 97 | 0xfe, 0xfe, 0xfe, 0xf0, 0xf2, 0xf2, 0x82, 0x87, 0x87, 0xc7, 0x02, 0x31, 98 | 0xdc, 0xdc, 0xdc, 0xe0, 0xee, 0xee, 0x8e, 0xaf, 0xbf, 0xfe, 0x1a, 0x8e, 99 | 0x8e, 0x8e, 0xa8, 0xa9, 0xa9, 0x41, 0x5b, 0x5b, 0xdb, 0xe4, 0xcd, 0x9b, 100 | 0x37, 0x7b, 0x6e, 0xdc, 0xb8, 0x71, 0xb3, 0xae, 0xae, 0x8e, 0xdf, 0xd4, 101 | 0xd4, 0x44, 0xeb, 0xed, 0xed, 0xfd, 0xdd, 0x6a, 0xb1, 0xb9, 0xb9, 0xf9, 102 | 0xcb, 0x92, 0x32, 0x75, 0xfc, 0xf8, 0xf1, 0xfa, 0xb8, 0xb8, 0xb8, 0xae, 103 | 0x89, 0x89, 0x09, 0xf1, 0x2f, 0x79, 0x89, 0x44, 0x22, 0xb4, 0xb5, 0xb5, 104 | 0xa1, 0xa2, 0xa2, 0x02, 0x5c, 0x2e, 0x57, 0x9a, 0xf1, 0x1c, 0x0e, 0x07, 105 | 0x4c, 0x26, 0x13, 0xfe, 0xfe, 0xfe, 0xf0, 0xf6, 0xf6, 0x06, 0x85, 0x42, 106 | 0x81, 0x87, 0x87, 0x07, 0x5c, 0x5d, 0x5d, 0xe1, 0xeb, 0xeb, 0x0b, 0x3f, 107 | 0x3f, 0x3f, 0x24, 0x25, 0x25, 0xa1, 0xba, 0xba, 0x7a, 0xb2, 0xb2, 0xb2, 108 | 0xb2, 0xb7, 0xb4, 0xb4, 0xf4, 0x66, 0x6d, 0x6d, 0x6d, 0x55, 0x63, 0x63, 109 | 0xe3, 0xef, 0xc7, 0xc3, 0xca, 0xca, 0xea, 0xc5, 0x23, 0x47, 0x8e, 0xb8, 110 | 0xfd, 0x23, 0x31, 0x66, 0x67, 0x67, 0x31, 0x30, 0x30, 0x80, 0xd2, 0xd2, 111 | 0x52, 0x24, 0x27, 0x27, 0xe3, 0xea, 0xd5, 0xab, 0x08, 0x0a, 0x0a, 0x92, 112 | 0x66, 0xc7, 0xe3, 0xc4, 0xf0, 0xf4, 0xf4, 0x04, 0x85, 0x42, 0xc1, 0x96, 113 | 0x2d, 0x5b, 0x10, 0x17, 0x17, 0x87, 0x9c, 0x9c, 0x1c, 0x54, 0x55, 0x55, 114 | 0xa1, 0xb1, 0xb1, 0x51, 0x54, 0x55, 0x55, 0x75, 0x4f, 0x20, 0x10, 0x54, 115 | 0xb7, 0xb6, 0xb6, 0x9e, 0x05, 0xf0, 0x9b, 0xa7, 0x16, 0x2b, 0x2b, 0xab, 116 | 0x17, 0xb5, 0xb5, 0xb5, 0xcf, 0x18, 0x18, 0x18, 0x54, 0xf9, 0xf8, 0xf8, 117 | 0xfc, 0x34, 0x34, 0x34, 0x34, 0x3d, 0x3b, 0x3b, 0x3b, 0x3b, 0x3f, 0x33, 118 | 0xe6, 0x73, 0xe9, 0xef, 0xef, 0x47, 0x75, 0x75, 0x35, 0x78, 0x3c, 0x9e, 119 | 0x34, 0xe3, 0xd9, 0x6c, 0x36, 0x18, 0x0c, 0x06, 0x68, 0x34, 0x9a, 0xb4, 120 | 0x1f, 0xce, 0xe7, 0x74, 0xe1, 0xc2, 0x05, 0xd8, 0xdb, 0xdb, 0x83, 0xc3, 121 | 0xe1, 0x20, 0x2f, 0x2f, 0x0f, 0x75, 0x75, 0x75, 0x22, 0x3e, 0x9f, 0xff, 122 | 0xbb, 0xf2, 0x20, 0x3a, 0x3a, 0x3a, 0x0a, 0xd9, 0xd9, 0xd9, 0x9d, 0x00, 123 | 0x20, 0x16, 0x8b, 0x7f, 0x55, 0x90, 0x99, 0x99, 0x19, 0xd4, 0xd6, 0xd6, 124 | 0x22, 0x35, 0x35, 0x15, 0x11, 0x11, 0x11, 0x60, 0x30, 0x18, 0xf0, 0xf6, 125 | 0xf6, 0x7e, 0xa4, 0x54, 0x79, 0x78, 0x78, 0xc0, 0xd3, 0xd3, 0x13, 0x54, 126 | 0x2a, 0x15, 0xde, 0xde, 0xde, 0xb0, 0xb4, 0xb4, 0x84, 0x85, 0x85, 0x05, 127 | 0xe2, 0xe3, 0xe3, 0x91, 0x98, 0x98, 0x88, 0x84, 0x84, 0x04, 0xa4, 0xa7, 128 | 0xa7, 0xcf, 0x96, 0x95, 0x95, 0x8d, 0xd4, 0xd5, 0xd5, 0x55, 0xf5, 0xf6, 129 | 0xf6, 0x2a, 0xfe, 0x1e, 0x3c, 0xce, 0x9c, 0x39, 0x53, 0x51, 0x54, 0x54, 130 | 0x34, 0x24, 0x16, 0x8b, 0x7f, 0xa9, 0xc5, 0x23, 0x5c, 0xa6, 0xa6, 0xa6, 131 | 0x20, 0x10, 0x08, 0x90, 0x97, 0x97, 0x87, 0xc4, 0xc4, 0x44, 0x69, 0xc6, 132 | 0x07, 0x04, 0x04, 0xc0, 0xdb, 0xdb, 0xfb, 0x91, 0x7e, 0x28, 0x09, 0x32, 133 | 0x4b, 0x4b, 0x4b, 0x5c, 0xb8, 0x70, 0x01, 0x41, 0x41, 0x41, 0x88, 0x8e, 134 | 0x8e, 0x96, 0xf2, 0xa8, 0xaf, 0xaf, 0xaf, 0xba, 0x7f, 0xff, 0xbe, 0xc2, 135 | 0x6f, 0x22, 0xa1, 0xab, 0xab, 0xbb, 0xcc, 0xc0, 0xc0, 0xc0, 0x55, 0x2c, 136 | 0x16, 0xcf, 0x02, 0x40, 0x7b, 0x7b, 0x3b, 0x06, 0x07, 0x07, 0x21, 0x12, 137 | 0x89, 0x9e, 0x98, 0x2d, 0xf7, 0xee, 0xdd, 0x43, 0x46, 0x46, 0x06, 0xc2, 138 | 0xc3, 0xc3, 0xe1, 0xef, 0xef, 0x0f, 0x4f, 0x4f, 0xcf, 0x47, 0xb2, 0x42, 139 | 0x22, 0x84, 0x24, 0xcd, 0xbd, 0xbc, 0xbc, 0xf0, 0xfa, 0xeb, 0xaf, 0x23, 140 | 0x3c, 0x3c, 0x1c, 0x91, 0x91, 0x91, 0x88, 0x88, 0x88, 0x00, 0x87, 0xc3, 141 | 0x01, 0x9d, 0x4e, 0xc7, 0x89, 0x13, 0x27, 0x84, 0xad, 0xad, 0xad, 0x5e, 142 | 0x00, 0x96, 0xff, 0x16, 0x1e, 0xfa, 0xfa, 0xfa, 0x97, 0x9b, 0x9b, 0x9b, 143 | 0xc7, 0x25, 0xcf, 0xfd, 0x6b, 0x1c, 0xe6, 0x0f, 0x2a, 0x45, 0x45, 0x45, 144 | 0xd2, 0x12, 0xcc, 0x62, 0xb1, 0xe0, 0xe7, 0xe7, 0x07, 0x2a, 0x95, 0xfa, 145 | 0x88, 0x18, 0x92, 0x40, 0x73, 0x72, 0x72, 0xc2, 0x86, 0x0d, 0x1b, 0xe0, 146 | 0xec, 0xec, 0x0c, 0x3a, 0x9d, 0x2e, 0x1d, 0x6c, 0x4e, 0x9d, 0x3a, 0x25, 147 | 0x6c, 0x6f, 0x6f, 0xa7, 0x02, 0x78, 0xf6, 0xd2, 0xa5, 0xaf, 0xaf, 0x2f, 148 | 0x6b, 0x6f, 0x6f, 0x5f, 0x06, 0x00, 0x8d, 0x8d, 0x8d, 0xe0, 0xf3, 0xf9, 149 | 0x68, 0x68, 0x68, 0x40, 0x4b, 0x4b, 0x0b, 0x7a, 0x7a, 0x7a, 0x20, 0x14, 150 | 0x0a, 0x1f, 0x21, 0x31, 0x39, 0x39, 0x89, 0x9c, 0x9c, 0x1c, 0x70, 0x38, 151 | 0x1c, 0x78, 0x79, 0x79, 0x2d, 0x78, 0x58, 0x2a, 0x95, 0x0a, 0x1f, 0x1f, 152 | 0x1f, 0xd0, 0x68, 0x34, 0x04, 0x04, 0x04, 0x80, 0x4e, 0xa7, 0x23, 0x30, 153 | 0x30, 0x10, 0x4c, 0x26, 0x13, 0xaf, 0xbf, 0xfe, 0x3a, 0xec, 0xed, 0xed, 154 | 0xc1, 0x64, 0x32, 0x11, 0x14, 0x14, 0x04, 0x06, 0x83, 0x81, 0xcb, 0x97, 155 | 0x2f, 0x63, 0xe7, 0xce, 0x9d, 0xd3, 0x45, 0x45, 0x45, 0xe5, 0x63, 0x63, 156 | 0x63, 0x9b, 0x08, 0x21, 0xff, 0xf5, 0xac, 0x3c, 0x8c, 0x8c, 0x8c, 0x78, 157 | 0xed, 0xed, 0xed, 0x42, 0x00, 0x18, 0x1e, 0x1e, 0x7e, 0x62, 0x66, 0xcc, 158 | 0x3f, 0x63, 0x63, 0x63, 0xa8, 0xac, 0xac, 0x44, 0x4a, 0x4a, 0x0a, 0x22, 159 | 0x22, 0x22, 0xc0, 0x64, 0x32, 0xe1, 0xe3, 0xe3, 0xf3, 0x48, 0xa9, 0x72, 160 | 0x77, 0x77, 0x87, 0x87, 0x87, 0x07, 0x28, 0x14, 0x0a, 0xa8, 0x54, 0x2a, 161 | 0xb4, 0xb4, 0xb4, 0x60, 0x6c, 0x6c, 0x0c, 0x67, 0x67, 0x67, 0xf8, 0xf9, 162 | 0xf9, 0xc1, 0xcd, 0xcd, 0x0d, 0xbb, 0x77, 0xef, 0x9e, 0x2e, 0x2f, 0x2f, 163 | 0x2f, 0x9b, 0x9a, 0x9a, 0x5a, 0xff, 0xcc, 0x82, 0x18, 0x1a, 0x1a, 0xda, 164 | 0xd2, 0xe9, 0xf4, 0x56, 0x00, 0xe0, 0xf1, 0x78, 0xc8, 0xcd, 0xcd, 0x45, 165 | 0x7e, 0x7e, 0x3e, 0x8a, 0x8a, 0x8a, 0x50, 0x51, 0x51, 0x81, 0xba, 0xba, 166 | 0x3a, 0xb4, 0xb6, 0xb6, 0x62, 0x78, 0x78, 0x78, 0x01, 0x11, 0x3e, 0x9f, 167 | 0x0f, 0x16, 0x8b, 0x05, 0x77, 0x77, 0x77, 0xb8, 0xbb, 0xbb, 0x83, 0x42, 168 | 0xa1, 0xc0, 0xc7, 0xc7, 0x07, 0xfe, 0xfe, 0xfe, 0x60, 0x30, 0x18, 0x60, 169 | 0x32, 0x99, 0x60, 0xb1, 0x58, 0x08, 0x09, 0x09, 0x41, 0x68, 0x68, 0x28, 170 | 0xd8, 0x6c, 0x36, 0xd6, 0xaf, 0x5f, 0x0f, 0x75, 0x75, 0x75, 0x29, 0x29, 171 | 0x2a, 0x95, 0x8a, 0xf3, 0xe7, 0xcf, 0x43, 0x5d, 0x5d, 0x5d, 0x74, 0xfd, 172 | 0xfa, 0xf5, 0x5b, 0xc3, 0xc3, 0xc3, 0x67, 0x09, 0x21, 0x2f, 0x10, 0x42, 173 | 0x16, 0x3d, 0x42, 0x1a, 0x1a, 0x1a, 0xda, 0x9a, 0x9a, 0x9a, 0xf2, 0xdb, 174 | 0xdb, 0xdb, 0x85, 0xb3, 0xb3, 0xb3, 0x10, 0x0a, 0x85, 0xd2, 0x69, 0x4a, 175 | 0x24, 0x12, 0xfd, 0xaa, 0x28, 0x02, 0x81, 0x00, 0x69, 0x69, 0x69, 0x08, 176 | 0x0f, 0x0f, 0x07, 0x9d, 0x4e, 0x07, 0x95, 0x4a, 0x7d, 0x6c, 0x2f, 0x9c, 177 | 0x9f, 0xf5, 0x4e, 0x4e, 0x4e, 0xf8, 0xeb, 0x5f, 0xff, 0x0a, 0x1b, 0x1b, 178 | 0x1b, 0x38, 0x3b, 0x3b, 0xc3, 0xc9, 0xc9, 0x09, 0x5a, 0x5a, 0x5a, 0xd3, 179 | 0x25, 0x25, 0x25, 0x4d, 0x93, 0x93, 0x93, 0x5f, 0x3f, 0x93, 0x18, 0xce, 180 | 0xce, 0xce, 0x2f, 0x98, 0x99, 0x99, 0xa5, 0xc6, 0xc6, 0xc6, 0x76, 0x02, 181 | 0x40, 0x72, 0x72, 0x32, 0x52, 0x52, 0x52, 0x90, 0x9a, 0x9a, 0x8a, 0xb4, 182 | 0xb4, 0x34, 0x64, 0x64, 0x64, 0x80, 0xcb, 0xe5, 0x22, 0x27, 0x27, 0x07, 183 | 0x85, 0x85, 0x85, 0xa8, 0xae, 0xae, 0x46, 0x47, 0x47, 0x07, 0xc4, 0x62, 184 | 0x31, 0x3a, 0x3a, 0x3a, 0x40, 0xa3, 0xd1, 0xe0, 0xe9, 0xe9, 0x09, 0x3f, 185 | 0x3f, 0x3f, 0x04, 0x06, 0x06, 0x22, 0x38, 0x38, 0x18, 0xa1, 0xa1, 0xa1, 186 | 0xe0, 0x70, 0x38, 0xb8, 0x72, 0xe5, 0x0a, 0xc2, 0xc3, 0xc3, 0x11, 0x1e, 187 | 0x1e, 0x8e, 0x88, 0x88, 0x08, 0x5c, 0xbd, 0x7a, 0x15, 0xaa, 0xaa, 0xaa, 188 | 0xd8, 0xb0, 0x61, 0x03, 0x1c, 0x1c, 0x1c, 0xe0, 0xe4, 0xe4, 0x04, 0x67, 189 | 0x67, 0x67, 0x9c, 0x3d, 0x7b, 0x16, 0xaa, 0xaa, 0xaa, 0xa2, 0xec, 0xec, 190 | 0xec, 0xdb, 0x83, 0x83, 0x83, 0x5c, 0x00, 0xff, 0x4b, 0x08, 0xf9, 0xef, 191 | 0x67, 0xe1, 0x71, 0xe0, 0xc0, 0x01, 0x7e, 0x47, 0x47, 0x87, 0x50, 0x2c, 192 | 0x16, 0x4b, 0xf7, 0x0c, 0x81, 0x40, 0x80, 0xb6, 0xb6, 0x36, 0xf4, 0xf7, 193 | 0xf7, 0x63, 0x6a, 0x6a, 0xea, 0x89, 0x83, 0x4a, 0x56, 0x56, 0x16, 0xc2, 194 | 0xc2, 0xc2, 0xe0, 0xeb, 0xeb, 0xbb, 0xa0, 0x54, 0x49, 0xb2, 0xde, 0xdb, 195 | 0xdb, 0x1b, 0x34, 0x1a, 0x0d, 0xfe, 0xfe, 0xfe, 0xa0, 0xd3, 0xe9, 0x60, 196 | 0x30, 0x18, 0x58, 0xbe, 0x7c, 0x39, 0x8c, 0x8d, 0x8d, 0x71, 0xea, 0xd4, 197 | 0x29, 0x9c, 0x3b, 0x77, 0x0e, 0xea, 0xea, 0xea, 0xd3, 0xa5, 0xa5, 0xa5, 198 | 0x82, 0xa9, 0xa9, 0xa9, 0x74, 0x00, 0x8b, 0x37, 0x24, 0xcd, 0xcd, 0xcd, 199 | 0xd7, 0x1f, 0x38, 0x70, 0x80, 0x9f, 0x9c, 0x9c, 0xdc, 0x05, 0x00, 0xb1, 200 | 0xb1, 0xb1, 0xd2, 0xf3, 0xe3, 0x8f, 0x3f, 0x2e, 0xf8, 0x9c, 0x7f, 0xae, 201 | 0x5d, 0xbb, 0x86, 0xdc, 0xdc, 0x5c, 0xe4, 0xe6, 0xe6, 0xe2, 0xda, 0xb5, 202 | 0x6b, 0x8f, 0xfc, 0xfd, 0x49, 0xff, 0xab, 0xa9, 0xa9, 0x89, 0x4f, 0x3e, 203 | 0xf9, 0x04, 0x56, 0x56, 0x56, 0x38, 0x75, 0xea, 0x14, 0xec, 0xed, 0xed, 204 | 0x61, 0x63, 0x63, 0x83, 0xed, 0xdb, 0xb7, 0x8b, 0xd2, 0xd2, 0xd2, 0x5a, 205 | 0xba, 0xbb, 0xbb, 0xeb, 0x27, 0x26, 0x26, 0x14, 0x09, 0x21, 0x7f, 0x22, 206 | 0x8b, 0xc8, 0x12, 0x09, 0x8f, 0xc3, 0x87, 0x0f, 0xf3, 0x3b, 0x3b, 0x3b, 207 | 0x85, 0x92, 0xde, 0x51, 0x50, 0x50, 0x80, 0xe2, 0xe2, 0x62, 0x54, 0x54, 208 | 0x54, 0xa0, 0xba, 0xba, 0x1a, 0x02, 0x81, 0x00, 0x1d, 0x1d, 0x1d, 0x18, 209 | 0x1b, 0x1b, 0x5b, 0x20, 0x08, 0x00, 0x14, 0x16, 0x16, 0x22, 0x34, 0x34, 210 | 0x54, 0x3a, 0x2d, 0xba, 0xbb, 0xbb, 0x4b, 0xcb, 0xaf, 0x9f, 0x9f, 0x1f, 211 | 0x02, 0x02, 0x02, 0x16, 0x64, 0x7e, 0x70, 0x70, 0x30, 0x56, 0xad, 0x5a, 212 | 0x05, 0x65, 0x65, 0x65, 0x1c, 0x3c, 0x78, 0x10, 0x36, 0x36, 0x36, 0x50, 213 | 0x53, 0x53, 0x13, 0x95, 0x96, 0x96, 0x0a, 0x26, 0x26, 0x26, 0xaa, 0x01, 214 | 0x6c, 0x58, 0xb4, 0x20, 0x0f, 0xad, 0x67, 0x7e, 0x42, 0x42, 0x42, 0x27, 215 | 0x00, 0x5c, 0xbd, 0x7a, 0x15, 0x11, 0x11, 0x11, 0xd2, 0xc8, 0xbe, 0x72, 216 | 0xe5, 0x0a, 0x38, 0x1c, 0x0e, 0x42, 0x43, 0x43, 0x11, 0x1c, 0x1c, 0x2c, 217 | 0xdd, 0xc8, 0x3d, 0x3d, 0x3d, 0x41, 0xa3, 0xd1, 0x16, 0x64, 0x4b, 0x75, 218 | 0x75, 0x35, 0x0a, 0x0b, 0x0b, 0x91, 0x93, 0x93, 0x03, 0x2e, 0x97, 0x8b, 219 | 0x8c, 0x8c, 0x0c, 0xa4, 0xa5, 0xa5, 0x21, 0x35, 0x35, 0x15, 0x29, 0x29, 220 | 0x29, 0x48, 0x4e, 0x4e, 0x86, 0xa2, 0xa2, 0x22, 0x36, 0x6d, 0xda, 0x04, 221 | 0x53, 0x53, 0x53, 0x1c, 0x3a, 0x74, 0x08, 0xd6, 0xd6, 0xd6, 0x38, 0x78, 222 | 0xf0, 0x20, 0xe4, 0xe5, 0xe5, 0x45, 0xf1, 0xf1, 0xf1, 0x77, 0x7e, 0xfa, 223 | 0xe9, 0xa7, 0x86, 0xa1, 0xa1, 0xa1, 0x63, 0x84, 0x90, 0xa5, 0x64, 0x11, 224 | 0x59, 0x22, 0xe1, 0x61, 0x6d, 0x6d, 0xcd, 0xef, 0xea, 0xea, 0x12, 0x4e, 225 | 0x4d, 0x4d, 0x01, 0x00, 0xd2, 0xd3, 0xd3, 0x91, 0x99, 0x99, 0x09, 0x2e, 226 | 0x97, 0x0b, 0x1e, 0x8f, 0x87, 0xbc, 0xbc, 0x3c, 0x14, 0x15, 0x15, 0xa1, 227 | 0xb2, 0xb2, 0x12, 0x02, 0x81, 0x00, 0x03, 0x03, 0x03, 0xd2, 0x1e, 0x23, 228 | 0x10, 0x08, 0xc0, 0x60, 0x30, 0xa4, 0xee, 0x82, 0xaf, 0xaf, 0x2f, 0xe8, 229 | 0x74, 0xfa, 0x82, 0xd2, 0xcb, 0x66, 0xb3, 0xc1, 0xe1, 0x70, 0x10, 0x16, 230 | 0x16, 0x86, 0x2b, 0x57, 0xae, 0x40, 0x51, 0x51, 0x11, 0x1f, 0x7d, 0xf4, 231 | 0x11, 0xf6, 0xef, 0xdf, 0x0f, 0x4b, 0x4b, 0x4b, 0xa8, 0xa8, 0xa8, 0x88, 232 | 0x0a, 0x0b, 0x0b, 0x6f, 0x8d, 0x8f, 0x8f, 0xd7, 0x00, 0x30, 0x5f, 0xb4, 233 | 0x20, 0x0f, 0xef, 0x01, 0xf8, 0x11, 0x11, 0x11, 0xad, 0x00, 0xc0, 0x66, 234 | 0xb3, 0x11, 0x1a, 0x1a, 0x8a, 0x90, 0x90, 0x10, 0xb0, 0x58, 0x2c, 0x30, 235 | 0x99, 0x4c, 0x30, 0x18, 0x0c, 0xf8, 0xfb, 0xfb, 0xc3, 0xc7, 0xc7, 0x47, 236 | 0xba, 0x89, 0xbb, 0xbb, 0xbb, 0x83, 0xc5, 0x62, 0x81, 0xcf, 0xe7, 0x2f, 237 | 0x88, 0xb4, 0xe1, 0xe1, 0x61, 0xb4, 0xb6, 0xb6, 0xa2, 0xae, 0xae, 0x0e, 238 | 0x15, 0x15, 0x15, 0x28, 0x2a, 0x2a, 0x42, 0x7e, 0x7e, 0x3e, 0x72, 0x73, 239 | 0x73, 0xc1, 0xe3, 0xf1, 0xb0, 0x76, 0xed, 0x5a, 0x28, 0x2b, 0x2b, 0xc3, 240 | 0xc4, 0xc4, 0x04, 0x46, 0x46, 0x46, 0xb0, 0xb0, 0xb0, 0x80, 0x89, 0x89, 241 | 0x09, 0xb6, 0x6c, 0xd9, 0x22, 0x8a, 0x8c, 0x8c, 0x6c, 0x6d, 0x6c, 0x6c, 242 | 0x6c, 0xec, 0xed, 0xed, 0xf5, 0x21, 0x84, 0xbc, 0x42, 0x08, 0x79, 0x91, 243 | 0x3c, 0x65, 0x96, 0x48, 0x78, 0x9c, 0x38, 0x71, 0x82, 0xdf, 0xd9, 0xd9, 244 | 0x29, 0x94, 0xf4, 0x8f, 0xf8, 0xf8, 0x78, 0x24, 0x24, 0x24, 0x20, 0x21, 245 | 0x21, 0x01, 0x89, 0x89, 0x89, 0x48, 0x4c, 0x4c, 0x44, 0x52, 0x52, 0x12, 246 | 0x52, 0x52, 0x52, 0x90, 0x96, 0x96, 0x86, 0xac, 0xac, 0x2c, 0x14, 0x16, 247 | 0x16, 0x4a, 0xc5, 0xf1, 0xf2, 0xf2, 0x02, 0x83, 0xc1, 0x40, 0x68, 0x68, 248 | 0x28, 0xc2, 0xc2, 0xc2, 0xa4, 0xe5, 0x36, 0x32, 0x32, 0x12, 0x91, 0x91, 249 | 0x91, 0x88, 0x8a, 0x8a, 0x42, 0x54, 0x54, 0x14, 0xa2, 0xa3, 0xa3, 0x11, 250 | 0x1d, 0x1d, 0x0d, 0x0d, 0x0d, 0x0d, 0xac, 0x5e, 0xbd, 0x1a, 0x9f, 0x7f, 251 | 0xfe, 0x39, 0x4c, 0x4c, 0x4c, 0xa0, 0xa4, 0xa4, 0x24, 0xca, 0xcd, 0xcd, 252 | 0xbd, 0x3d, 0x32, 0x32, 0x52, 0x33, 0x33, 0x33, 0x73, 0x69, 0xd1, 0x82, 253 | 0x58, 0x5b, 0x5b, 0x87, 0x9c, 0x38, 0x71, 0x82, 0xef, 0xe5, 0xe5, 0xd5, 254 | 0x08, 0x00, 0x4c, 0x26, 0x13, 0x81, 0x81, 0x81, 0xa0, 0xd3, 0xe9, 0x08, 255 | 0x08, 0x08, 0x00, 0x8d, 0x46, 0x5b, 0x60, 0x18, 0x4a, 0xea, 0xaa, 0x97, 256 | 0x97, 0x17, 0x38, 0x1c, 0x0e, 0x72, 0x72, 0x72, 0x30, 0x39, 0x39, 0xf9, 257 | 0x48, 0x4d, 0x16, 0x0a, 0x85, 0xe8, 0xe9, 0xe9, 0x41, 0x4b, 0x4b, 0x0b, 258 | 0x1a, 0x1a, 0x1a, 0xc0, 0xe7, 0xf3, 0xc1, 0xe3, 0xf1, 0xf0, 0xc2, 0x0b, 259 | 0x2f, 0x40, 0x47, 0x47, 0x07, 0xe6, 0xe6, 0xe6, 0xd0, 0xd5, 0xd5, 0xc5, 260 | 0xbe, 0x7d, 0xfb, 0xa0, 0xaf, 0xaf, 0x8f, 0x0d, 0x1b, 0x36, 0x88, 0x43, 261 | 0x43, 0x43, 0xef, 0x56, 0x57, 0x57, 0x37, 0xb5, 0xb5, 0xb5, 0xc5, 0x10, 262 | 0x42, 0x5e, 0x23, 0x84, 0xfc, 0x0f, 0x79, 0xca, 0x89, 0x4b, 0xc2, 0xe3, 263 | 0xf4, 0xe9, 0xd3, 0xfc, 0xae, 0xae, 0x2e, 0xe1, 0xf8, 0xf8, 0x38, 0x00, 264 | 0x48, 0x5f, 0x9c, 0xe4, 0x45, 0x4a, 0x5e, 0xac, 0xa4, 0x0a, 0x84, 0x85, 265 | 0x85, 0x21, 0x34, 0x34, 0x14, 0x0c, 0x06, 0x03, 0x5e, 0x5e, 0x5e, 0x18, 266 | 0x18, 0x18, 0x80, 0x40, 0x20, 0x40, 0x61, 0x61, 0x21, 0xb2, 0xb2, 0xb2, 267 | 0x90, 0x96, 0x96, 0x86, 0x94, 0x94, 0x14, 0x24, 0x25, 0x25, 0x49, 0x05, 268 | 0x95, 0x08, 0x1c, 0x1f, 0x1f, 0x0f, 0x35, 0x35, 0x35, 0xac, 0x5a, 0xb5, 269 | 0x0a, 0x9f, 0x7d, 0xf6, 0x19, 0xf6, 0xed, 0xdb, 0x87, 0x6d, 0xdb, 0xb6, 270 | 0x89, 0xb8, 0x5c, 0x6e, 0xf3, 0x83, 0x07, 0x0f, 0x6a, 0x67, 0x66, 0x66, 271 | 0x42, 0x17, 0x2d, 0xc8, 0xc3, 0x1b, 0x32, 0xfe, 0x37, 0xdf, 0x7c, 0xc3, 272 | 0x9f, 0x9d, 0x9d, 0x9d, 0x0d, 0x0e, 0x0e, 0x86, 0x9f, 0x9f, 0x1f, 0x7c, 273 | 0x7d, 0x7d, 0xe1, 0xed, 0xed, 0x0d, 0x2a, 0x95, 0xfa, 0xc8, 0x72, 0xe4, 274 | 0xe9, 0xe9, 0x09, 0x7f, 0x7f, 0x7f, 0x84, 0x87, 0x87, 0x23, 0x23, 0x23, 275 | 0x03, 0xf7, 0xee, 0xdd, 0x7b, 0x6c, 0xa3, 0x04, 0x00, 0x91, 0x48, 0x84, 276 | 0xc1, 0xc1, 0x41, 0xb4, 0xb7, 0xb7, 0xc3, 0xcf, 0xcf, 0x0f, 0xcb, 0x96, 277 | 0x2d, 0xc3, 0x81, 0x03, 0x07, 0xf0, 0xd5, 0x57, 0x5f, 0x61, 0xf7, 0xee, 278 | 0xdd, 0xd0, 0xd5, 0xd5, 0x85, 0xb6, 0xb6, 0x36, 0x64, 0x65, 0x65, 0xc5, 279 | 0x74, 0x3a, 0xbd, 0xbd, 0xa4, 0xa4, 0xe4, 0xd6, 0xed, 0xdb, 0xb7, 0xd3, 280 | 0x09, 0x21, 0x2b, 0x09, 0x21, 0xcb, 0x9e, 0x56, 0x10, 0x09, 0x0f, 0x07, 281 | 0x07, 0x07, 0x7e, 0x77, 0x77, 0xb7, 0x70, 0x74, 0x74, 0x14, 0x00, 0x70, 282 | 0xe5, 0xca, 0x15, 0x84, 0x85, 0x85, 0x81, 0xc3, 0xe1, 0x80, 0xcd, 0x66, 283 | 0x2f, 0xc8, 0xfc, 0xf9, 0xfe, 0x9b, 0x9b, 0x9b, 0x1b, 0x18, 0x0c, 0x06, 284 | 0x04, 0x02, 0x81, 0xf4, 0xd9, 0x25, 0xe2, 0x54, 0x56, 0x56, 0xa2, 0xa8, 285 | 0xa8, 0x08, 0x79, 0x79, 0x79, 0xe0, 0xf1, 0x78, 0xe0, 0x72, 0xb9, 0xc8, 286 | 0xcc, 0xcc, 0x44, 0x7a, 0x7a, 0x3a, 0x36, 0x6e, 0xdc, 0x88, 0x35, 0x6b, 287 | 0xd6, 0x60, 0xd7, 0xae, 0x5d, 0xd0, 0xd3, 0xd3, 0xc3, 0xe6, 0xcd, 0x9b, 288 | 0x45, 0x19, 0x19, 0x19, 0x2d, 0x83, 0x83, 0x83, 0xb5, 0x33, 0x33, 0x33, 289 | 0x3f, 0x2e, 0x5a, 0x90, 0xd3, 0xa7, 0x4f, 0xc7, 0x38, 0x38, 0x38, 0xf0, 290 | 0x1d, 0x1d, 0x1d, 0xf9, 0xe3, 0xe3, 0xe3, 0xa2, 0xdc, 0xdc, 0xdc, 0x05, 291 | 0x42, 0x3c, 0x6e, 0x16, 0xf7, 0xf6, 0xf6, 0x06, 0x83, 0xc1, 0x40, 0x44, 292 | 0x44, 0x04, 0x52, 0x53, 0x53, 0x51, 0x5b, 0x5b, 0x8b, 0x99, 0x99, 0x99, 293 | 0x5f, 0x1d, 0x2b, 0xc5, 0x62, 0x31, 0xcc, 0xcd, 0xcd, 0xb1, 0x79, 0xf3, 294 | 0x66, 0x1c, 0x3c, 0x78, 0x10, 0x16, 0x16, 0x16, 0x50, 0x57, 0x57, 0xc7, 295 | 0xdf, 0xff, 0xfe, 0x77, 0xec, 0xde, 0xbd, 0x1b, 0x1f, 0x7e, 0xf8, 0xa1, 296 | 0xd8, 0xcb, 0xcb, 0xab, 0x23, 0x27, 0x27, 0xa7, 0xb9, 0xae, 0xae, 0x2e, 297 | 0x8b, 0x10, 0xf2, 0x57, 0x42, 0xc8, 0x72, 0xf2, 0x94, 0x7d, 0x64, 0x3e, 298 | 0x8f, 0x9e, 0x9e, 0x1e, 0xe1, 0xe0, 0xe0, 0x20, 0x00, 0x20, 0x38, 0x38, 299 | 0x78, 0x41, 0xe9, 0x0d, 0x08, 0x08, 0x80, 0x9f, 0x9f, 0x9f, 0x34, 0xeb, 300 | 0x25, 0x81, 0x46, 0xa1, 0x50, 0x10, 0x1a, 0x1a, 0x8a, 0xc2, 0xc2, 0xc2, 301 | 0x47, 0xf6, 0x96, 0xb1, 0xb1, 0x31, 0x74, 0x74, 0x74, 0x40, 0x20, 0x10, 302 | 0xa0, 0xba, 0xba, 0x1a, 0x15, 0x15, 0x15, 0x28, 0x2e, 0x2e, 0x46, 0x41, 303 | 0x41, 0x01, 0x56, 0xac, 0x58, 0x01, 0x59, 0x59, 0x59, 0x68, 0x69, 0x69, 304 | 0x41, 0x57, 0x57, 0x17, 0x72, 0x72, 0x72, 0xa2, 0xd4, 0xd4, 0xd4, 0x96, 305 | 0xfe, 0xfe, 0xfe, 0x3a, 0xb1, 0x58, 0xbc, 0x78, 0x41, 0x1e, 0xde, 0x1d, 306 | 0xf3, 0x2f, 0x5e, 0xbc, 0xc8, 0x1f, 0x18, 0x18, 0x98, 0xec, 0xee, 0xee, 307 | 0x06, 0x85, 0x42, 0x79, 0xac, 0x65, 0x30, 0xbf, 0xd9, 0x05, 0x05, 0x05, 308 | 0xe1, 0xea, 0xd5, 0xab, 0x48, 0x4e, 0x4e, 0x46, 0x69, 0x69, 0x29, 0x06, 309 | 0x06, 0x06, 0x7e, 0x55, 0x90, 0x9c, 0x9c, 0x1c, 0xc8, 0xc8, 0xc8, 0xc0, 310 | 0xd8, 0xd8, 0x18, 0x47, 0x8e, 0x1c, 0x81, 0xa9, 0xa9, 0x29, 0x54, 0x55, 311 | 0x55, 0xa1, 0xa5, 0xa5, 0x05, 0x4d, 0x4d, 0x4d, 0xac, 0x5b, 0xb7, 0x4e, 312 | 0xec, 0xee, 0xee, 0xde, 0x99, 0x99, 0x99, 0xd9, 0xc2, 0xe7, 0xf3, 0x13, 313 | 0x09, 0x21, 0x6b, 0x08, 0x21, 0xaf, 0x92, 0xb9, 0x9d, 0x64, 0x51, 0x3c, 314 | 0x7a, 0x7a, 0x7a, 0x84, 0x3d, 0x3d, 0x3d, 0x00, 0x00, 0x06, 0x83, 0x01, 315 | 0x3a, 0x9d, 0x0e, 0x7f, 0x7f, 0x7f, 0xd0, 0x68, 0x34, 0x69, 0xb0, 0xcd, 316 | 0x0f, 0x34, 0x77, 0x77, 0x77, 0xf8, 0xfa, 0xfa, 0x22, 0x2c, 0x2c, 0x0c, 317 | 0x59, 0x59, 0x59, 0x4f, 0xe4, 0x32, 0x35, 0x35, 0x85, 0xfe, 0xfe, 0x7e, 318 | 0xb4, 0xb5, 0xb5, 0x41, 0x20, 0x10, 0xe0, 0xc7, 0x1f, 0x7f, 0x04, 0x21, 319 | 0x04, 0xdb, 0xb6, 0x6d, 0xc3, 0xce, 0x9d, 0x3b, 0xa5, 0x82, 0xa4, 0xa4, 320 | 0xa4, 0xb4, 0xf4, 0xf5, 0xf5, 0xd5, 0x89, 0xc5, 0x62, 0xf6, 0xa2, 0x05, 321 | 0x71, 0x74, 0x74, 0x74, 0xb9, 0x78, 0xf1, 0x22, 0xdf, 0xd5, 0xd5, 0x95, 322 | 0xdf, 0xd7, 0xd7, 0x27, 0x14, 0x0a, 0x85, 0x08, 0x0f, 0x0f, 0x7f, 0xa2, 323 | 0x65, 0xe0, 0xe5, 0xe5, 0x05, 0x7f, 0x7f, 0x7f, 0x84, 0x84, 0x84, 0x20, 324 | 0x32, 0x32, 0x12, 0x49, 0x49, 0x49, 0x28, 0x28, 0x28, 0xc0, 0x9d, 0x3b, 325 | 0x77, 0x9e, 0x28, 0xc6, 0xe0, 0xe0, 0x20, 0xf6, 0xef, 0xdf, 0x8f, 0x6d, 326 | 0xdb, 0xb6, 0xe1, 0xd8, 0xb1, 0x63, 0x38, 0x7a, 0xf4, 0x28, 0x0c, 0x0c, 327 | 0x0c, 0xa0, 0xac, 0xac, 0x0c, 0x75, 0x75, 0x75, 0xa8, 0xab, 0xab, 0xe3, 328 | 0xfd, 0xf7, 0xdf, 0x17, 0xbb, 0xba, 0xba, 0x76, 0xa6, 0xa6, 0xa6, 0xde, 329 | 0xa9, 0xa8, 0xa8, 0x60, 0x13, 0x42, 0xd6, 0x91, 0xb9, 0x3e, 0xf2, 0x54, 330 | 0x82, 0xcc, 0xe7, 0xd1, 0xdb, 0xdb, 0x2b, 0xec, 0xea, 0xea, 0x42, 0x7f, 331 | 0x7f, 0x3f, 0x22, 0x23, 0x23, 0x7f, 0xb5, 0xfc, 0xba, 0xb9, 0xb9, 0x49, 332 | 0xed, 0xf5, 0xf0, 0xf0, 0x70, 0xa4, 0xa5, 0xa5, 0x49, 0xcb, 0xd6, 0x93, 333 | 0x8e, 0x48, 0x24, 0xc2, 0x83, 0x07, 0x0f, 0x60, 0x6f, 0x6f, 0x8f, 0x3f, 334 | 0xff, 0xf9, 0xcf, 0x50, 0x54, 0x54, 0xc4, 0xee, 0xdd, 0xbb, 0xa1, 0xa7, 335 | 0xa7, 0xb7, 0x40, 0x10, 0x91, 0x48, 0x74, 0x79, 0xd1, 0x82, 0x3c, 0xfc, 336 | 0x55, 0x05, 0x9f, 0x42, 0xa1, 0xf0, 0xfb, 0xfb, 0xfb, 0x85, 0x83, 0x83, 337 | 0x83, 0x28, 0x28, 0x28, 0x58, 0xe0, 0x4d, 0x49, 0xa2, 0x68, 0xfe, 0x28, 338 | 0x18, 0x1a, 0x1a, 0x8a, 0xa8, 0xa8, 0x28, 0x24, 0x26, 0x26, 0x22, 0x37, 339 | 0x37, 0x17, 0xf5, 0xf5, 0xf5, 0x18, 0x19, 0x19, 0x79, 0xac, 0x2d, 0x71, 340 | 0xea, 0xd4, 0x29, 0x2c, 0x5f, 0xbe, 0x1c, 0x56, 0x56, 0x56, 0x38, 0x7e, 341 | 0xfc, 0x38, 0xac, 0xad, 0xad, 0xa1, 0xae, 0xae, 0x0e, 0x25, 0x25, 0x25, 342 | 0xa8, 0xa9, 0xa9, 0x41, 0x4d, 0x4d, 0x0d, 0x6b, 0xd6, 0xac, 0x11, 0xbb, 343 | 0xb8, 0xb8, 0x74, 0x25, 0x25, 0x25, 0xdd, 0x29, 0x2b, 0x2b, 0x73, 0x26, 344 | 0x84, 0x7c, 0x48, 0x08, 0x79, 0x9d, 0xcc, 0x4d, 0x5a, 0x8b, 0xe2, 0xd1, 345 | 0xd7, 0xd7, 0x27, 0xec, 0xea, 0xea, 0x42, 0x5d, 0x5d, 0x1d, 0x04, 0x02, 346 | 0x01, 0xa8, 0x54, 0xaa, 0xd4, 0x42, 0x7f, 0x9c, 0x01, 0xea, 0xe3, 0xe3, 347 | 0x03, 0x26, 0x93, 0x89, 0x88, 0x88, 0x08, 0xa4, 0xa4, 0xa4, 0xa0, 0xb2, 348 | 0xb2, 0xf2, 0x91, 0x3d, 0xe5, 0x97, 0xa7, 0xb7, 0xb7, 0x17, 0x5a, 0x5a, 349 | 0x5a, 0xf8, 0xe8, 0xa3, 0x8f, 0xb0, 0x7d, 0xfb, 0x76, 0x68, 0x6b, 0x6b, 350 | 0xc3, 0xc0, 0xc0, 0x00, 0x9b, 0x36, 0x6d, 0x12, 0xa5, 0xa6, 0xa6, 0xb6, 351 | 0x0c, 0x0c, 0x0c, 0xd4, 0x8a, 0xc5, 0xe2, 0x03, 0x8b, 0x16, 0xc4, 0xd5, 352 | 0xd5, 0x75, 0x3d, 0x85, 0x42, 0xe1, 0xfb, 0xfa, 0xfa, 0xf2, 0xfb, 0xfb, 353 | 0xfb, 0x85, 0xf7, 0xef, 0xdf, 0xc7, 0xad, 0x5b, 0xb7, 0xe0, 0xef, 0xef, 354 | 0xff, 0x88, 0x6d, 0xe0, 0xe5, 0xe5, 0x25, 0xdd, 0xc8, 0xd9, 0x6c, 0x36, 355 | 0xa2, 0xa2, 0xa2, 0x90, 0x90, 0x90, 0x80, 0xec, 0xec, 0x6c, 0x54, 0x56, 356 | 0x56, 0xa2, 0xa3, 0xa3, 0x63, 0xc1, 0x43, 0xff, 0xfc, 0xf3, 0xcf, 0x38, 357 | 0x73, 0xe6, 0x0c, 0x96, 0x2e, 0x5d, 0x8a, 0xe3, 0xc7, 0x8f, 0xc3, 0xd6, 358 | 0xd6, 0x16, 0x36, 0x36, 0x36, 0x30, 0x37, 0x37, 0x87, 0x92, 0x92, 0x12, 359 | 0x94, 0x94, 0x94, 0xa0, 0xaa, 0xaa, 0x0a, 0x55, 0x55, 0x55, 0xc8, 0xc8, 360 | 0xc8, 0x88, 0x2f, 0x5e, 0xbc, 0xd8, 0x95, 0x94, 0x94, 0x74, 0xa7, 0xbc, 361 | 0xbc, 0xfc, 0x4b, 0x42, 0xc8, 0xdf, 0x08, 0x21, 0x2b, 0x9e, 0x56, 0x90, 362 | 0xf9, 0x3c, 0xfa, 0xfa, 0xfa, 0x84, 0xdd, 0xdd, 0xdd, 0x28, 0x2c, 0x2c, 363 | 0x44, 0x67, 0x67, 0x27, 0xe8, 0x74, 0xfa, 0x13, 0xef, 0x69, 0xa8, 0x54, 364 | 0x2a, 0xfc, 0xfc, 0xfc, 0xc0, 0x62, 0xb1, 0xa4, 0x19, 0x5f, 0x54, 0x54, 365 | 0xf4, 0x08, 0x97, 0x5f, 0x1e, 0x0a, 0x85, 0x82, 0x57, 0x5f, 0x7d, 0x15, 366 | 0x0a, 0x0a, 0x0a, 0x50, 0x55, 0x55, 0x85, 0x9e, 0x9e, 0x1e, 0x8c, 0x8d, 367 | 0x8d, 0x21, 0x27, 0x27, 0x27, 0xca, 0xca, 0xca, 0x6a, 0x1e, 0x1a, 0x1a, 368 | 0xaa, 0x05, 0xb0, 0x71, 0xd1, 0x82, 0xe4, 0xe5, 0xe5, 0xbd, 0xe0, 0xe3, 369 | 0xe3, 0x93, 0x4a, 0xa7, 0xd3, 0xf9, 0x7d, 0x7d, 0x7d, 0xc2, 0xbe, 0xbe, 370 | 0x3e, 0x34, 0x35, 0x35, 0xa1, 0xb1, 0xb1, 0x11, 0xdf, 0x7e, 0xfb, 0x2d, 371 | 0x2e, 0x5c, 0xb8, 0xb0, 0xc0, 0x30, 0x0c, 0x08, 0x08, 0x40, 0x50, 0x50, 372 | 0x10, 0x38, 0x1c, 0x0e, 0xa2, 0xa3, 0xa3, 0x91, 0x90, 0x90, 0x80, 0xcc, 373 | 0xcc, 0x4c, 0x94, 0x96, 0x96, 0xa2, 0xb9, 0xb9, 0x59, 0x1a, 0x59, 0x6d, 374 | 0x6d, 0x6d, 0xb0, 0xb5, 0xb5, 0xc5, 0xd2, 0xa5, 0x4b, 0x61, 0x63, 0x63, 375 | 0x03, 0x3b, 0x3b, 0x3b, 0xd8, 0xd9, 0xd9, 0xc1, 0xc6, 0xc6, 0x06, 0x9a, 376 | 0x9a, 0x9a, 0x50, 0x54, 0x54, 0x84, 0xa2, 0xa2, 0x22, 0x54, 0x55, 0x55, 377 | 0xb1, 0x63, 0xc7, 0x0e, 0xc8, 0xc8, 0xc8, 0x88, 0x2f, 0x5d, 0xba, 0xd4, 378 | 0x95, 0x92, 0x92, 0x72, 0xa3, 0xbc, 0xbc, 0x7c, 0x07, 0xf9, 0xff, 0x19, 379 | 0xf2, 0x54, 0x25, 0x6b, 0x3e, 0x8f, 0xde, 0xde, 0x5e, 0x61, 0x67, 0x67, 380 | 0x27, 0x8a, 0x8b, 0x8b, 0x91, 0x9d, 0x9d, 0x8d, 0xf8, 0xf8, 0x78, 0xb8, 381 | 0xba, 0xba, 0x3e, 0xd6, 0x9b, 0xf2, 0xf6, 0xf6, 0x46, 0x40, 0x40, 0x80, 382 | 0xb4, 0x04, 0x27, 0x26, 0x26, 0x4a, 0x7e, 0xa0, 0xf1, 0x58, 0x9b, 0x65, 383 | 0x66, 0x66, 0x06, 0x99, 0x99, 0x99, 0x58, 0xbb, 0x76, 0x2d, 0x36, 0x6d, 384 | 0xda, 0x04, 0x45, 0x45, 0x45, 0xec, 0xda, 0xb5, 0x0b, 0xc6, 0xc6, 0xc6, 385 | 0x30, 0x33, 0x33, 0xc3, 0xe6, 0xcd, 0x9b, 0x45, 0x3c, 0x1e, 0xaf, 0x79, 386 | 0x64, 0x64, 0x24, 0x0b, 0xc0, 0x9f, 0x16, 0x2d, 0x08, 0x21, 0x84, 0x30, 387 | 0x18, 0x0c, 0x5b, 0x26, 0x93, 0xc9, 0xef, 0xee, 0xee, 0x16, 0x76, 0x76, 388 | 0x76, 0xa2, 0xa1, 0xa1, 0x01, 0xf5, 0xf5, 0xf5, 0xa8, 0xa8, 0xa8, 0x80, 389 | 0x8e, 0x8e, 0x0e, 0x0c, 0x0d, 0x0d, 0x71, 0xf1, 0xe2, 0x45, 0xd0, 0x68, 390 | 0x34, 0xd0, 0xe9, 0x74, 0xb0, 0x58, 0x2c, 0x84, 0x85, 0x85, 0x21, 0x3a, 391 | 0x3a, 0x1a, 0xf1, 0xf1, 0xf1, 0xc8, 0xc8, 0xc8, 0x40, 0x61, 0x61, 0x21, 392 | 0x1a, 0x1a, 0x1a, 0xd0, 0xd0, 0xd0, 0x80, 0xc0, 0xc0, 0x40, 0xa8, 0xa9, 393 | 0xa9, 0xe1, 0xed, 0xb7, 0xdf, 0xc6, 0xd1, 0xa3, 0x47, 0x71, 0xe2, 0xc4, 394 | 0x09, 0xe9, 0x31, 0x30, 0x30, 0x80, 0xa2, 0xa2, 0x22, 0x14, 0x14, 0x14, 395 | 0xa4, 0xd1, 0xa5, 0xa2, 0xa2, 0x82, 0xd5, 0xab, 0x57, 0x8b, 0x5d, 0x5d, 396 | 0x5d, 0x3b, 0xd3, 0xd3, 0xd3, 0x83, 0x08, 0x21, 0x0a, 0x84, 0x90, 0xf7, 397 | 0x09, 0x21, 0x7f, 0x79, 0x5a, 0x41, 0xe6, 0xf3, 0xe8, 0xea, 0xea, 0x12, 398 | 0xde, 0xbd, 0x7b, 0x17, 0xa5, 0xa5, 0xa5, 0x48, 0x49, 0x49, 0x41, 0x42, 399 | 0x42, 0x02, 0x7c, 0x7c, 0x7c, 0x1e, 0x29, 0x55, 0x54, 0x2a, 0x15, 0x34, 400 | 0x1a, 0x0d, 0x0c, 0x06, 0x43, 0x9a, 0xf1, 0x89, 0x89, 0x89, 0xe0, 0xf1, 401 | 0x78, 0xa8, 0xae, 0xae, 0x46, 0x7f, 0x7f, 0xff, 0x23, 0x62, 0xdc, 0xb8, 402 | 0x71, 0x43, 0x92, 0xd1, 0x50, 0x52, 0x52, 0x82, 0x8a, 0x8a, 0x0a, 0x74, 403 | 0x75, 0x75, 0x71, 0xe0, 0xc0, 0x01, 0x58, 0x58, 0x58, 0x40, 0x4e, 0x4e, 404 | 0x4e, 0x74, 0xfd, 0xfa, 0xf5, 0xdb, 0x63, 0x63, 0x63, 0x67, 0xc9, 0x33, 405 | 0xba, 0xd6, 0x24, 0x24, 0x24, 0x44, 0x96, 0xcd, 0x66, 0xf3, 0xda, 0xda, 406 | 0xda, 0x26, 0x9b, 0x9b, 0x9b, 0xc1, 0xe7, 0xf3, 0x51, 0x5d, 0x5d, 0x8d, 407 | 0xf2, 0xf2, 0x72, 0xe4, 0xe4, 0xe4, 0xe0, 0xe8, 0xd1, 0xa3, 0x90, 0x91, 408 | 0x91, 0xc1, 0xc7, 0x1f, 0x7f, 0x8c, 0x2f, 0xbe, 0xf8, 0x42, 0x7a, 0x31, 409 | 0x13, 0x19, 0x19, 0x89, 0xb0, 0xb0, 0x30, 0x78, 0x79, 0x79, 0xe1, 0xc4, 410 | 0x89, 0x13, 0xd8, 0xb3, 0x67, 0x0f, 0xd6, 0xac, 0x59, 0x83, 0x37, 0xde, 411 | 0x78, 0x03, 0xda, 0xda, 0xda, 0x38, 0x7e, 0xfc, 0xb8, 0x34, 0x33, 0x4e, 412 | 0x9c, 0x38, 0x01, 0x13, 0x13, 0x13, 0x28, 0x28, 0x28, 0x40, 0x5e, 0x5e, 413 | 0x1e, 0xf2, 0xf2, 0xf2, 0x50, 0x50, 0x50, 0xc0, 0x8e, 0x1d, 0x3b, 0xa0, 414 | 0xac, 0xac, 0x8c, 0xd5, 0xab, 0x57, 0x8b, 0x29, 0x14, 0x4a, 0x73, 0x56, 415 | 0x56, 0xd6, 0x11, 0x42, 0xc8, 0x66, 0x42, 0xc8, 0x6a, 0x32, 0xb7, 0xad, 416 | 0x3f, 0xb5, 0x7d, 0x32, 0x9f, 0x87, 0x64, 0xb9, 0xe3, 0x72, 0xb9, 0x88, 417 | 0x88, 0x88, 0x80, 0xa7, 0xa7, 0x27, 0x1c, 0x1d, 0x1d, 0x17, 0x58, 0xe8, 418 | 0xde, 0xde, 0xde, 0xf0, 0xf7, 0xf7, 0x07, 0x93, 0xc9, 0x04, 0x87, 0xc3, 419 | 0x91, 0x96, 0x60, 0x2e, 0x97, 0x8b, 0x8a, 0x8a, 0x0a, 0xb4, 0xb5, 0xb5, 420 | 0x2d, 0x70, 0x89, 0x33, 0x33, 0x33, 0xa1, 0xaa, 0xaa, 0x8a, 0x95, 0x2b, 421 | 0x57, 0x42, 0x45, 0x45, 0x05, 0xf2, 0xf2, 0xf2, 0xd0, 0xd2, 0xd2, 0x82, 422 | 0x91, 0x91, 0x11, 0x0e, 0x1f, 0x3e, 0x0c, 0x73, 0x73, 0x73, 0x6c, 0xda, 423 | 0xb4, 0x49, 0x54, 0x54, 0x54, 0x54, 0x39, 0x3d, 0x3d, 0xbd, 0x85, 0x3c, 424 | 0x83, 0x63, 0x4d, 0x08, 0x21, 0x24, 0x35, 0x35, 0x75, 0x59, 0x44, 0x44, 425 | 0xc4, 0xe5, 0xc6, 0xc6, 0xc6, 0x89, 0xc2, 0xc2, 0x42, 0x14, 0x14, 0x14, 426 | 0xa0, 0xb4, 0xb4, 0x14, 0xc5, 0xc5, 0xc5, 0xc8, 0xc9, 0xc9, 0x41, 0x42, 427 | 0x42, 0x02, 0x1c, 0x1c, 0x1c, 0xb0, 0x7b, 0xf7, 0x6e, 0xac, 0x5f, 0xbf, 428 | 0x1e, 0x6f, 0xbc, 0xf1, 0x06, 0x5e, 0x7a, 0xe9, 0x25, 0x2c, 0x59, 0xb2, 429 | 0x04, 0x4b, 0x96, 0x2c, 0xc1, 0xd2, 0xa5, 0x4b, 0xf1, 0xd6, 0x5b, 0x6f, 430 | 0x41, 0x4e, 0x4e, 0x0e, 0x3a, 0x3a, 0x3a, 0x38, 0x72, 0xe4, 0x08, 0xac, 431 | 0xad, 0xad, 0x61, 0x63, 0x63, 0x03, 0x5b, 0x5b, 0x5b, 0xd8, 0xd9, 0xd9, 432 | 0xc1, 0xc8, 0xc8, 0x08, 0xf2, 0xf2, 0xf2, 0xd8, 0xba, 0x75, 0x2b, 0xb6, 433 | 0x6e, 0xdd, 0x8a, 0x6d, 0xdb, 0xb6, 0x41, 0x41, 0x41, 0x01, 0x5b, 0xb6, 434 | 0x6c, 0x81, 0x8c, 0x8c, 0x0c, 0xde, 0x79, 0xe7, 0x1d, 0x11, 0x8d, 0x46, 435 | 0xcb, 0xce, 0xcb, 0xcb, 0xdb, 0x43, 0x08, 0xf9, 0x84, 0x10, 0xf2, 0x0e, 436 | 0x21, 0x64, 0x51, 0xae, 0xef, 0x7c, 0x1e, 0xf9, 0xf9, 0xf9, 0xe0, 0xf1, 437 | 0x78, 0xc8, 0xcc, 0xcc, 0x44, 0x5c, 0x5c, 0x1c, 0xe8, 0x74, 0x3a, 0x8e, 438 | 0x1d, 0x3b, 0x06, 0x4b, 0x4b, 0x4b, 0x38, 0x39, 0x39, 0x81, 0x4a, 0xa5, 439 | 0x4a, 0x07, 0x94, 0xf9, 0x19, 0x2f, 0x29, 0xc1, 0xc5, 0xc5, 0xc5, 0x10, 440 | 0x08, 0x04, 0x78, 0xf0, 0xe0, 0x01, 0x7a, 0x7b, 0x7b, 0x41, 0xa1, 0x50, 441 | 0xb0, 0x76, 0xed, 0x5a, 0xc8, 0xc8, 0xc8, 0x60, 0xc7, 0x8e, 0x1d, 0xd8, 442 | 0xba, 0x75, 0xab, 0xb4, 0x77, 0x1c, 0x38, 0x70, 0x00, 0x86, 0x86, 0x86, 443 | 0xd8, 0xba, 0x75, 0x2b, 0xfe, 0xf6, 0xb7, 0xbf, 0x4d, 0x97, 0x95, 0x95, 444 | 0x5d, 0x01, 0xf0, 0xda, 0x33, 0x89, 0x21, 0x41, 0x6c, 0x6c, 0xac, 0xc2, 445 | 0xb5, 0x6b, 0xd7, 0x2a, 0x7d, 0x7c, 0x7c, 0x46, 0x23, 0x23, 0x23, 0x67, 446 | 0x33, 0x33, 0x33, 0xa5, 0x84, 0x12, 0x12, 0x12, 0x10, 0x19, 0x19, 0x09, 447 | 0x17, 0x17, 0x17, 0x18, 0x19, 0x19, 0xc1, 0xc0, 0xc0, 0x00, 0xfb, 0xf6, 448 | 0xed, 0x83, 0x91, 0x91, 0x11, 0x4c, 0x4c, 0x4c, 0x60, 0x66, 0x66, 0x06, 449 | 0x0b, 0x0b, 0x0b, 0x58, 0x5a, 0x5a, 0xe2, 0xf0, 0xe1, 0xc3, 0xb0, 0xb2, 450 | 0xb2, 0x82, 0xb5, 0xb5, 0x35, 0x8e, 0x1f, 0x3f, 0x0e, 0x2b, 0x2b, 0x2b, 451 | 0xec, 0xdd, 0xbb, 0x17, 0xdb, 0xb6, 0x6d, 0xc3, 0x96, 0x2d, 0x5b, 0xb0, 452 | 0x79, 0xf3, 0x66, 0xe9, 0xe7, 0xba, 0x75, 0xeb, 0xf0, 0xda, 0x6b, 0xaf, 453 | 0xe1, 0x83, 0x0f, 0x3e, 0x98, 0x3c, 0x7c, 0xf8, 0x70, 0x17, 0x8b, 0xc5, 454 | 0xf2, 0x24, 0x84, 0x28, 0x91, 0xb9, 0x91, 0xf7, 0x0d, 0x32, 0x67, 0x30, 455 | 0x2e, 0x2a, 0xed, 0x25, 0x3c, 0xbc, 0xbd, 0xbd, 0x47, 0xc3, 0xc3, 0xc3, 456 | 0x67, 0xe3, 0xe3, 0xe3, 0x11, 0x17, 0x17, 0x87, 0xb0, 0xb0, 0x30, 0x78, 457 | 0x7a, 0x7a, 0xc2, 0xc6, 0xc6, 0x06, 0x1f, 0x7e, 0xf8, 0x21, 0xb4, 0xb4, 458 | 0xb4, 0xe0, 0xe4, 0xe4, 0x04, 0x06, 0x83, 0x81, 0xe0, 0xe0, 0x60, 0x5c, 459 | 0xb9, 0x72, 0x45, 0x5a, 0x82, 0xd3, 0xd3, 0xd3, 0x51, 0x50, 0x50, 0x80, 460 | 0x1f, 0x7f, 0xfc, 0x11, 0xf6, 0xf6, 0xf6, 0xd0, 0xd2, 0xd2, 0xc2, 0xab, 461 | 0xaf, 0xbe, 0x0a, 0x39, 0x39, 0x39, 0xa9, 0x18, 0x2a, 0x2a, 0x2a, 0xd8, 462 | 0xbb, 0x77, 0x2f, 0x8c, 0x8c, 0x8c, 0xa0, 0xa1, 0xa1, 0x81, 0x55, 0xab, 463 | 0x56, 0xcd, 0x2a, 0x29, 0x29, 0x8d, 0xf9, 0xf9, 0xf9, 0xdd, 0xe6, 0xf3, 464 | 0xf9, 0x07, 0xc8, 0x9c, 0x5b, 0xfd, 0xec, 0xe0, 0xf3, 0xf9, 0x2f, 0x26, 465 | 0x26, 0x26, 0x9e, 0xb9, 0x76, 0xed, 0x5a, 0x0d, 0x93, 0xc9, 0xec, 0xf4, 466 | 0xf0, 0xf0, 0x10, 0xb3, 0x58, 0x2c, 0xc4, 0xc5, 0xc5, 0xe1, 0xda, 0xb5, 467 | 0x6b, 0x88, 0x8c, 0x8c, 0x44, 0x70, 0x70, 0x30, 0x28, 0x14, 0x0a, 0x4e, 468 | 0x9e, 0x3c, 0x09, 0x13, 0x13, 0x13, 0x18, 0x1b, 0x1b, 0xc3, 0xc4, 0xc4, 469 | 0x04, 0x5f, 0x7e, 0xf9, 0xa5, 0x54, 0x90, 0x43, 0x87, 0x0e, 0xc1, 0xca, 470 | 0xca, 0x0a, 0x5f, 0x7d, 0xf5, 0x15, 0x3e, 0xff, 0xfc, 0x73, 0x28, 0x29, 471 | 0x29, 0x61, 0xeb, 0xd6, 0xad, 0x52, 0x11, 0x36, 0x6e, 0xdc, 0x88, 0x75, 472 | 0xeb, 0xd6, 0x61, 0xe5, 0xca, 0x95, 0x78, 0xe5, 0x95, 0x57, 0x66, 0xb5, 473 | 0xb4, 0xb4, 0x46, 0xcf, 0x9f, 0x3f, 0xdf, 0x13, 0x18, 0x18, 0x18, 0xcf, 474 | 0xe5, 0x72, 0x75, 0x08, 0x21, 0x1b, 0x09, 0x21, 0xef, 0x11, 0x42, 0xfe, 475 | 0x4c, 0x16, 0x69, 0xc1, 0xff, 0x92, 0x07, 0x83, 0xc1, 0xe8, 0xbc, 0x74, 476 | 0xe9, 0x92, 0x98, 0x46, 0xa3, 0x81, 0xcd, 0x66, 0x83, 0xc9, 0x64, 0xc2, 477 | 0xd5, 0xd5, 0x15, 0x76, 0x76, 0x76, 0x50, 0x53, 0x53, 0xc3, 0x6b, 0xaf, 478 | 0xbd, 0x86, 0xe5, 0xcb, 0x97, 0x63, 0xd5, 0xaa, 0x55, 0x50, 0x54, 0x54, 479 | 0x84, 0x86, 0x86, 0x06, 0xd4, 0xd4, 0xd4, 0xb0, 0x71, 0xe3, 0x46, 0xac, 480 | 0x58, 0xb1, 0x02, 0x84, 0x10, 0xfc, 0xe5, 0x2f, 0x7f, 0x81, 0xac, 0xac, 481 | 0x2c, 0x94, 0x95, 0x95, 0xb1, 0x7d, 0xfb, 0x76, 0xc8, 0xcb, 0xcb, 0x63, 482 | 0xc7, 0x8e, 0x1d, 0xd8, 0xb5, 0x6b, 0x17, 0xd4, 0xd4, 0xd4, 0x20, 0x2b, 483 | 0x2b, 0x8b, 0xb7, 0xde, 0x7a, 0x6b, 0xc6, 0xd6, 0xd6, 0xb6, 0x2f, 0x23, 484 | 0x23, 0xa3, 0xa5, 0xb6, 0xb6, 0xd6, 0x7b, 0x7c, 0x7c, 0xfc, 0x6d, 0xf2, 485 | 0xac, 0xfd, 0x63, 0x3e, 0xb8, 0x5c, 0xee, 0xcb, 0x59, 0x59, 0x59, 0xb4, 486 | 0x9c, 0x9c, 0x9c, 0xaa, 0xc4, 0xc4, 0xc4, 0x26, 0x57, 0x57, 0xd7, 0xfb, 487 | 0x17, 0x2e, 0x5c, 0x98, 0x66, 0x30, 0x18, 0xe0, 0x70, 0x38, 0x60, 0xb1, 488 | 0x58, 0xa0, 0xd1, 0x68, 0xb8, 0x7c, 0xf9, 0x32, 0x1c, 0x1c, 0x1c, 0x60, 489 | 0x6d, 0x6d, 0x0d, 0x0b, 0x0b, 0x0b, 0x98, 0x9a, 0x9a, 0xc2, 0xd8, 0xd8, 490 | 0x18, 0x5f, 0x7c, 0xf1, 0x05, 0x74, 0x74, 0x74, 0xa0, 0xae, 0xae, 0x0e, 491 | 0x45, 0x45, 0x45, 0x69, 0x89, 0xda, 0xbc, 0x79, 0x33, 0xe4, 0xe4, 0xe4, 492 | 0xb0, 0x6e, 0xdd, 0x3a, 0xac, 0x58, 0xb1, 0x02, 0xaf, 0xbf, 0xfe, 0xfa, 493 | 0xcc, 0x27, 0x9f, 0x7c, 0x22, 0xb4, 0xb0, 0xb0, 0x18, 0x3c, 0x7f, 0xfe, 494 | 0x7c, 0x4f, 0x48, 0x48, 0x48, 0x0e, 0x8f, 0xc7, 0xfb, 0x9c, 0x10, 0xb2, 495 | 0x8d, 0xcc, 0x65, 0xc7, 0x4a, 0x32, 0x57, 0xae, 0x9e, 0xe9, 0xe6, 0x50, 496 | 0xc2, 0x83, 0xc7, 0xe3, 0x55, 0xc5, 0xc7, 0xc7, 0x0b, 0x9c, 0x9d, 0x9d, 497 | 0x07, 0x1d, 0x1c, 0x1c, 0xa6, 0x25, 0x4d, 0xfc, 0xd2, 0xa5, 0x4b, 0x38, 498 | 0x79, 0xf2, 0x24, 0x4c, 0x4d, 0x4d, 0xa1, 0xa1, 0xa1, 0x01, 0x59, 0x59, 499 | 0x59, 0xac, 0x5a, 0xb5, 0x0a, 0xef, 0xbe, 0xfb, 0x2e, 0xde, 0x7d, 0xf7, 500 | 0x5d, 0xc8, 0xc8, 0xc8, 0x40, 0x56, 0x56, 0x16, 0x0a, 0x0a, 0x0a, 0x50, 501 | 0x51, 0x51, 0x81, 0x8a, 0x8a, 0x0a, 0x94, 0x94, 0x94, 0xa0, 0xac, 0xac, 502 | 0x0c, 0x0d, 0x0d, 0x0d, 0x6c, 0xdf, 0xbe, 0x1d, 0xef, 0xbf, 0xff, 0x3e, 503 | 0xd6, 0xae, 0x5d, 0x2b, 0xd2, 0xd1, 0xd1, 0x19, 0x61, 0xb1, 0x58, 0xf7, 504 | 0xb2, 0xb3, 0xb3, 0x9b, 0x9b, 0x9b, 0x9b, 0xaf, 0x8c, 0x8d, 0x8d, 0xad, 505 | 0x24, 0x8b, 0x18, 0x44, 0xfe, 0x21, 0xf2, 0xf2, 0xf2, 0x56, 0x14, 0x15, 506 | 0x15, 0xb1, 0x4b, 0x4b, 0x4b, 0x2b, 0x4b, 0x4a, 0x4a, 0x6a, 0x52, 0x52, 507 | 0x52, 0x04, 0x54, 0x2a, 0x75, 0xd0, 0xc5, 0xc5, 0x65, 0x46, 0x72, 0x75, 508 | 0xe9, 0xee, 0xee, 0x0e, 0x27, 0x27, 0x27, 0x9c, 0x39, 0x73, 0x06, 0x47, 509 | 0x8f, 0x1e, 0x85, 0x99, 0x99, 0x19, 0x0c, 0x0c, 0x0c, 0xb0, 0x77, 0xef, 510 | 0x5e, 0xec, 0xdc, 0xb9, 0x13, 0x9f, 0x7e, 0xfa, 0x29, 0x94, 0x95, 0x95, 511 | 0xa1, 0xa4, 0xa4, 0x84, 0x6d, 0xdb, 0xb6, 0x61, 0xc3, 0x86, 0x0d, 0x78, 512 | 0xef, 0xbd, 0xf7, 0xf0, 0xca, 0x2b, 0xaf, 0xcc, 0xca, 0xca, 0xca, 0x0a, 513 | 0x8d, 0x8d, 0x8d, 0x87, 0x6c, 0x6d, 0x6d, 0xfb, 0x5c, 0x5d, 0x5d, 0x3b, 514 | 0xc3, 0xc3, 0xc3, 0x0b, 0xb8, 0x5c, 0xae, 0x31, 0x21, 0x44, 0x91, 0x10, 515 | 0x22, 0x4b, 0xe6, 0x3c, 0xac, 0xbf, 0x10, 0x42, 0x5e, 0x22, 0xbf, 0x21, 516 | 0xca, 0x24, 0x3c, 0x4a, 0x4a, 0x4a, 0x2a, 0xf3, 0xf3, 0xf3, 0x6b, 0xe3, 517 | 0xe2, 0xe2, 0x6e, 0xb9, 0xba, 0xba, 0x0e, 0x39, 0x39, 0x39, 0xcd, 0xb8, 518 | 0xba, 0xba, 0xc2, 0xc5, 0xc5, 0x05, 0xe7, 0xce, 0x9d, 0xc3, 0xb1, 0x63, 519 | 0xc7, 0x60, 0x66, 0x66, 0x86, 0xcf, 0x3f, 0xff, 0x1c, 0x7b, 0xf6, 0xec, 520 | 0xc1, 0xce, 0x9d, 0x3b, 0xa1, 0xa9, 0xa9, 0x09, 0x0d, 0x0d, 0x0d, 0xa8, 521 | 0xab, 0xab, 0xe3, 0xd3, 0x4f, 0x3f, 0x85, 0xa6, 0xa6, 0x26, 0xb4, 0xb4, 522 | 0xb4, 0xa0, 0xae, 0xae, 0x8e, 0x0d, 0x1b, 0x36, 0x60, 0xe5, 0xca, 0x95, 523 | 0xb3, 0x7b, 0xf6, 0xec, 0x19, 0xf1, 0xf7, 0xf7, 0xef, 0x48, 0x4a, 0x4a, 524 | 0xba, 0x53, 0x59, 0x59, 0xd9, 0xd4, 0xd5, 0xd5, 0xf5, 0x83, 0x50, 0x28, 525 | 0x5c, 0x4d, 0x9e, 0x31, 0x88, 0x9e, 0x08, 0x00, 0x4b, 0xca, 0xca, 0xca, 526 | 0x64, 0xab, 0xaa, 0xaa, 0xd8, 0xf5, 0xf5, 0xf5, 0xfc, 0xfa, 0xfa, 0x7a, 527 | 0x7e, 0x4d, 0x4d, 0x4d, 0x75, 0x6c, 0x6c, 0x6c, 0xab, 0x83, 0x83, 0xc3, 528 | 0x84, 0x83, 0x83, 0xc3, 0xcc, 0xa5, 0x4b, 0x97, 0xe0, 0xe2, 0xe2, 0x82, 529 | 0x6f, 0xbf, 0xfd, 0x16, 0x27, 0x4f, 0x9e, 0xc4, 0x91, 0x23, 0x47, 0x60, 530 | 0x66, 0x66, 0x86, 0x7d, 0xfb, 0xf6, 0x41, 0x47, 0x47, 0x07, 0xbb, 0x76, 531 | 0xed, 0x82, 0x86, 0x86, 0x06, 0x14, 0x15, 0x15, 0xf1, 0xc1, 0x07, 0x1f, 532 | 0xe0, 0xcd, 0x37, 0xdf, 0x9c, 0x7d, 0xe7, 0x9d, 0x77, 0x44, 0x7b, 0xf7, 533 | 0xee, 0x1d, 0xb1, 0xb6, 0xb6, 0xee, 0x77, 0x74, 0x74, 0xec, 0x66, 0x30, 534 | 0x18, 0xed, 0x3f, 0xfc, 0xf0, 0x43, 0x5e, 0x56, 0x56, 0xd6, 0x91, 0x1b, 535 | 0x37, 0x6e, 0x28, 0x93, 0xb9, 0x46, 0xbe, 0x9a, 0xcc, 0x2d, 0x83, 0x2f, 536 | 0xff, 0x56, 0x62, 0x12, 0x1e, 0x95, 0x95, 0x95, 0xec, 0xda, 0xda, 0xda, 537 | 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0x8a, 0x8a, 0x8a, 0xda, 0x1f, 0x7e, 0xf8, 538 | 0xa1, 0xed, 0xec, 0xd9, 0xb3, 0x13, 0xf6, 0xf6, 0xf6, 0x33, 0xdf, 0x7f, 539 | 0xff, 0x3d, 0x2e, 0x5c, 0xb8, 0x80, 0x33, 0x67, 0xce, 0xc0, 0xda, 0xda, 540 | 0x1a, 0x96, 0x96, 0x96, 0x30, 0x33, 0x33, 0x93, 0xf6, 0x49, 0x7d, 0x7d, 541 | 0x7d, 0xe8, 0xeb, 0xeb, 0xe3, 0xb3, 0xcf, 0x3e, 0x83, 0xbc, 0xbc, 0x3c, 542 | 0xd6, 0xac, 0x59, 0x33, 0xfb, 0xf1, 0xc7, 0x1f, 0x4f, 0x7e, 0xfb, 0xed, 543 | 0xb7, 0xbd, 0x31, 0x31, 0x31, 0x3f, 0x15, 0x17, 0x17, 0xdf, 0xfa, 0xe9, 544 | 0xa7, 0x9f, 0x1a, 0x06, 0x06, 0x06, 0xa2, 0xc6, 0xc7, 0xc7, 0xb7, 0x3c, 545 | 0xdc, 0x3b, 0x7e, 0x7b, 0xa9, 0x7a, 0x1c, 0x99, 0xdb, 0xb7, 0x6f, 0xaf, 546 | 0x68, 0x6a, 0x6a, 0xa2, 0x35, 0x37, 0x37, 0xf3, 0xef, 0xdc, 0xb9, 0x53, 547 | 0xd5, 0xd2, 0xd2, 0x52, 0x7d, 0xe3, 0xc6, 0x8d, 0x9b, 0x01, 0x01, 0x01, 548 | 0xbd, 0xb6, 0xb6, 0xb6, 0x93, 0xa7, 0x4f, 0x9f, 0xc6, 0x77, 0xdf, 0x7d, 549 | 0x27, 0xbd, 0x82, 0x3d, 0x74, 0xe8, 0x10, 0x4c, 0x4d, 0x4d, 0x61, 0x60, 550 | 0x60, 0x80, 0xcf, 0x3e, 0xfb, 0x0c, 0x72, 0x72, 0x72, 0x78, 0xf3, 0xcd, 551 | 0x37, 0xf1, 0xee, 0xbb, 0xef, 0x8a, 0x34, 0x35, 0x35, 0x7f, 0xb6, 0xb6, 552 | 0xb6, 0xee, 0x3f, 0x77, 0xee, 0x5c, 0x8f, 0x97, 0x97, 0x57, 0x47, 0x58, 553 | 0x58, 0x58, 0x5b, 0x7c, 0x7c, 0x7c, 0x5a, 0x76, 0x76, 0xb6, 0xe1, 0x43, 554 | 0x31, 0xd6, 0x13, 0x42, 0x64, 0x08, 0x21, 0x6f, 0x92, 0x39, 0x87, 0xf7, 555 | 0xa9, 0xef, 0x41, 0x9e, 0x86, 0x47, 0x63, 0x63, 0x23, 0x4d, 0x20, 0x10, 556 | 0x54, 0x35, 0x37, 0x37, 0x57, 0x35, 0x35, 0x35, 0xd5, 0x94, 0x97, 0x97, 557 | 0xdf, 0x0c, 0x08, 0x08, 0xe8, 0xb5, 0xb3, 0xb3, 0x9b, 0xb4, 0xb7, 0xb7, 558 | 0xc7, 0xf7, 0xdf, 0x7f, 0x0f, 0x47, 0x47, 0x47, 0xd8, 0xdb, 0xdb, 0xe3, 559 | 0xeb, 0xaf, 0xbf, 0x86, 0xb5, 0xb5, 0x35, 0x8e, 0x1c, 0x39, 0x02, 0x73, 560 | 0x73, 0x73, 0xa8, 0xab, 0xab, 0x63, 0xf5, 0xea, 0xd5, 0xf8, 0xe8, 0xa3, 561 | 0x8f, 0xa6, 0x0f, 0x1d, 0x3a, 0x74, 0x3f, 0x2c, 0x2c, 0xac, 0x2d, 0x23, 562 | 0x23, 0xa3, 0xe5, 0xe6, 0xcd, 0x9b, 0x8d, 0x3d, 0x3d, 0x3d, 0x75, 0xc3, 563 | 0xc3, 0xc3, 0xcc, 0x89, 0x89, 0x89, 0xf7, 0xfe, 0x30, 0x31, 0xe6, 0xa3, 564 | 0xb7, 0xb7, 0xf7, 0xe5, 0xbb, 0x77, 0xef, 0x9e, 0xe9, 0xec, 0xec, 0xe4, 565 | 0x75, 0x76, 0x76, 0x56, 0x75, 0x76, 0x76, 0x56, 0xb7, 0xb6, 0xb6, 0xd6, 566 | 0xd5, 0xd4, 0xd4, 0x34, 0x06, 0x04, 0x04, 0xf4, 0x59, 0x59, 0x59, 0xcd, 567 | 0x1c, 0x3b, 0x76, 0x0c, 0x76, 0x76, 0x76, 0x38, 0x76, 0xec, 0x18, 0x4c, 568 | 0x4c, 0x4c, 0xa0, 0xa9, 0xa9, 0x89, 0x0f, 0x3f, 0xfc, 0x10, 0x6f, 0xbe, 569 | 0xf9, 0xe6, 0xcc, 0x9e, 0x3d, 0x7b, 0x46, 0xce, 0x9d, 0x3b, 0xd7, 0xeb, 570 | 0xe4, 0xe4, 0xd4, 0xed, 0xe3, 0xe3, 0xd3, 0xce, 0xe1, 0x70, 0xda, 0x62, 571 | 0x62, 0x62, 0xea, 0x53, 0x53, 0x53, 0xd9, 0xf9, 0xf9, 0xf9, 0x9f, 0x91, 572 | 0xb9, 0x05, 0xf0, 0x63, 0x32, 0x27, 0xc6, 0x4a, 0x32, 0xe7, 0xee, 0xbe, 573 | 0x44, 0xe6, 0x46, 0xdd, 0xdf, 0x2d, 0xed, 0x7b, 0x7b, 0x7b, 0x5f, 0x6e, 574 | 0x6d, 0x6d, 0x3d, 0x7b, 0xef, 0xde, 0xbd, 0x9c, 0xce, 0xce, 0xce, 0xaa, 575 | 0x8e, 0x8e, 0x8e, 0xea, 0xb6, 0xb6, 0xb6, 0xda, 0xba, 0xba, 0xba, 0x9b, 576 | 0x41, 0x41, 0x41, 0xbd, 0x36, 0x36, 0x36, 0xe2, 0x93, 0x27, 0x4f, 0xe2, 577 | 0xbb, 0xef, 0xbe, 0xc3, 0x37, 0xdf, 0x7c, 0x03, 0x5b, 0x5b, 0x5b, 0x7c, 578 | 0xf1, 0xc5, 0x17, 0xd8, 0xbc, 0x79, 0x33, 0x56, 0xad, 0x5a, 0x35, 0x73, 579 | 0xf0, 0xe0, 0xc1, 0xfb, 0x51, 0x51, 0x51, 0xad, 0x69, 0x69, 0x69, 0x2d, 580 | 0x55, 0x55, 0x55, 0x4d, 0xed, 0xed, 0xed, 0xf5, 0x03, 0x03, 0x03, 0xf9, 581 | 0xa3, 0xa3, 0xa3, 0xdf, 0x01, 0x90, 0xb8, 0x09, 0x7f, 0xac, 0x18, 0x12, 582 | 0x00, 0x78, 0xf1, 0xfe, 0xfd, 0xfb, 0x0a, 0xf7, 0xef, 0xdf, 0x77, 0x1d, 583 | 0x1c, 0x1c, 0xcc, 0x19, 0x1a, 0x1a, 0xaa, 0xee, 0xef, 0xef, 0xaf, 0xe9, 584 | 0xea, 0xea, 0xaa, 0xcb, 0xcd, 0xcd, 0xbd, 0x73, 0xf6, 0xec, 0xd9, 0x91, 585 | 0xaf, 0xbe, 0xfa, 0x4a, 0x6c, 0x68, 0x68, 0x88, 0x2d, 0x5b, 0xb6, 0xe0, 586 | 0xfd, 0xf7, 0xdf, 0x17, 0xab, 0xaa, 0xaa, 0x8e, 0x9d, 0x39, 0x73, 0xa6, 587 | 0xd7, 0xc3, 0xc3, 0xa3, 0x33, 0x38, 0x38, 0xf8, 0x5e, 0x4c, 0x4c, 0xcc, 588 | 0x4f, 0xf1, 0xf1, 0xf1, 0x75, 0xe9, 0xe9, 0xe9, 0x31, 0x39, 0x39, 0x39, 589 | 0x36, 0x25, 0x25, 0x25, 0x6a, 0x84, 0x10, 0x39, 0x32, 0xe7, 0x57, 0xad, 590 | 0x22, 0x73, 0x23, 0xee, 0x2b, 0x64, 0x4e, 0x8c, 0xdf, 0xb7, 0x06, 0x3f, 591 | 0x86, 0xc7, 0x83, 0x07, 0x0f, 0x72, 0x86, 0x87, 0x87, 0xab, 0x86, 0x87, 592 | 0x87, 0xab, 0x1f, 0x3c, 0x78, 0x50, 0x53, 0x5e, 0x5e, 0xde, 0x7c, 0xe1, 593 | 0xc2, 0x85, 0x61, 0x5b, 0x5b, 0x5b, 0xd1, 0xc3, 0x7b, 0x71, 0xac, 0x5f, 594 | 0xbf, 0x5e, 0xac, 0xad, 0xad, 0x3d, 0x12, 0x18, 0x18, 0xd8, 0x9e, 0x96, 595 | 0x96, 0xd6, 0x52, 0x53, 0x53, 0xd3, 0xd4, 0xd9, 0xd9, 0x59, 0x7f, 0xff, 596 | 0xfe, 0xfd, 0xfc, 0xd1, 0xd1, 0x51, 0x8a, 0x50, 0x28, 0x54, 0x7d, 0xf8, 597 | 0x63, 0xb8, 0xdf, 0x35, 0x78, 0x16, 0x43, 0x68, 0xd9, 0xd4, 0xd4, 0xd4, 598 | 0x27, 0x93, 0x93, 0x93, 0x5f, 0x0b, 0x85, 0xc2, 0x8c, 0xe1, 0xe1, 0xe1, 599 | 0x9a, 0xfe, 0xfe, 0xfe, 0xda, 0xe6, 0xe6, 0xe6, 0x9b, 0xb1, 0xb1, 0xb1, 600 | 0xf7, 0xf6, 0xef, 0xdf, 0x3f, 0xae, 0xaa, 0xaa, 0x3a, 0xee, 0xec, 0xec, 601 | 0xdc, 0x1d, 0x1c, 0x1c, 0xdc, 0x16, 0x15, 0x15, 0xd5, 0x9a, 0x9a, 0x9a, 602 | 0xda, 0xc2, 0xe3, 0xf1, 0xca, 0xf3, 0xf3, 0xf3, 0xfd, 0x8a, 0x8a, 0x8a, 603 | 0xcc, 0xcb, 0xca, 0xca, 0xd4, 0xc9, 0xdc, 0x16, 0x2e, 0x4b, 0xe6, 0xee, 604 | 0x3b, 0xde, 0x26, 0x73, 0x7e, 0xd5, 0xff, 0x92, 0xb9, 0x32, 0xf5, 0x87, 605 | 0x93, 0x7b, 0xc8, 0xe3, 0xe3, 0xe9, 0xe9, 0x69, 0x3b, 0xb1, 0x58, 0x9c, 606 | 0x36, 0x3d, 0x3d, 0x5d, 0x35, 0x31, 0x31, 0x51, 0xdd, 0xd7, 0xd7, 0x57, 607 | 0xc7, 0xe3, 0xf1, 0x5a, 0x0f, 0x1d, 0x3a, 0x34, 0xb6, 0x67, 0xcf, 0x9e, 608 | 0x31, 0x16, 0x8b, 0x75, 0xef, 0xfa, 0xf5, 0xeb, 0xb7, 0x6a, 0x6b, 0x6b, 609 | 0x1b, 0x7b, 0x7a, 0x7a, 0xea, 0x46, 0x46, 0x46, 0xb2, 0x26, 0x26, 0x26, 610 | 0x4e, 0x4f, 0x4f, 0x4f, 0x6f, 0x02, 0xf0, 0xea, 0x3f, 0xe3, 0x59, 0x9f, 611 | 0x16, 0x4b, 0x00, 0xbc, 0x34, 0x3d, 0x3d, 0xbd, 0x65, 0x7c, 0x7c, 0xfc, 612 | 0xd0, 0xf0, 0xf0, 0x30, 0xa5, 0xb7, 0xb7, 0x37, 0xaa, 0xb9, 0xb9, 0x39, 613 | 0x3d, 0x3f, 0x3f, 0xff, 0x7a, 0x76, 0x76, 0x76, 0x46, 0x45, 0x45, 0x05, 614 | 0xbb, 0xb6, 0xb6, 0xd6, 0xb1, 0xa6, 0xa6, 0xc6, 0xb0, 0xbe, 0xbe, 0x7e, 615 | 0x2b, 0x99, 0xdb, 0x2d, 0x3e, 0x26, 0x84, 0x7c, 0x40, 0xe6, 0x1a, 0xf7, 616 | 0xdb, 0x64, 0xae, 0x79, 0xbf, 0x42, 0xe6, 0xae, 0x69, 0xff, 0x44, 0xfe, 617 | 0x05, 0x04, 0x01, 0xbc, 0x00, 0x60, 0x03, 0x00, 0xf3, 0x99, 0x99, 0x99, 618 | 0x4b, 0xd3, 0xd3, 0xd3, 0xec, 0xd1, 0xd1, 0xd1, 0xf8, 0xe6, 0xe6, 0xe6, 619 | 0xf4, 0x5b, 0xb7, 0x6e, 0xc5, 0x0e, 0x0d, 0x0d, 0x51, 0xa6, 0xa7, 0xa7, 620 | 0x2d, 0x01, 0x6c, 0x02, 0x20, 0xe9, 0x6b, 0xff, 0x16, 0x22, 0xfc, 0x12, 621 | 0x4b, 0xc8, 0xdc, 0xc3, 0xbd, 0x40, 0xe6, 0x22, 0xfb, 0x65, 0x32, 0x57, 622 | 0xff, 0x57, 0x10, 0x42, 0xde, 0x22, 0x73, 0xb6, 0xc7, 0x5f, 0xc9, 0xdc, 623 | 0x82, 0xf7, 0x1e, 0x21, 0xe4, 0xdd, 0x87, 0xdf, 0xaf, 0x20, 0x73, 0x0b, 624 | 0xdf, 0x72, 0x32, 0xb7, 0x85, 0xff, 0x4b, 0x84, 0xf8, 0x07, 0x90, 0x70, 625 | 0xfb, 0xb7, 0x7d, 0xf9, 0xbf, 0x06, 0xc9, 0xc3, 0xff, 0x37, 0x99, 0x13, 626 | 0xe7, 0x4f, 0x64, 0xae, 0x0f, 0x2c, 0x25, 0x73, 0x91, 0xff, 0xf2, 0xc3, 627 | 0xcf, 0x65, 0x0f, 0xbf, 0xfb, 0x1f, 0x32, 0x77, 0xbf, 0x21, 0x69, 0x82, 628 | 0xff, 0x71, 0x84, 0xff, 0x93, 0xb0, 0x64, 0xde, 0xf9, 0xaf, 0x27, 0x1c, 629 | 0xc9, 0xdf, 0x9f, 0xe3, 0x39, 0x9e, 0xe3, 0x39, 0x9e, 0xe3, 0x3f, 0x07, 630 | 0xff, 0x0f, 0x07, 0x67, 0xd4, 0x0d, 0xec, 0x7b, 0x12, 0xb1, 0x00, 0x00, 631 | 0x00, 0x00, 0x49, 0x45, 0x4e, 0x44, 0xae, 0x42, 0x60, 0x82 632 | }; 633 | unsigned int footsw_png_len = 7558; 634 | -------------------------------------------------------------------------------- /resources/footsw.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/brummer10/Rumor/5ad260520f118960c51123ecc6890afba7d81f61/resources/footsw.png -------------------------------------------------------------------------------- /resources/fx_knob.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/brummer10/Rumor/5ad260520f118960c51123ecc6890afba7d81f61/resources/fx_knob.png -------------------------------------------------------------------------------- /resources/monster.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/brummer10/Rumor/5ad260520f118960c51123ecc6890afba7d81f61/resources/monster.png --------------------------------------------------------------------------------