├── .idea ├── .name ├── scopes │ └── CORE.xml ├── vcs.xml ├── copyright │ ├── profiles_settings.xml │ └── GPLv3.xml ├── modules.xml ├── misc.xml ├── pymidicontrol.iml └── compiler.xml ├── docs └── __init__.py ├── avio ├── __init__.py ├── trigger.py ├── events.py ├── bpm.py ├── combotrigger.py ├── library.py ├── videomixer.py ├── midi.py ├── sequencer.py ├── controller.py └── router.py ├── bitwig └── 00149_MusicForAGamepad │ ├── .bitwig-project │ └── 00149_MusicForAGamepad.bwproject ├── test.gif ├── library ├── fonts │ ├── 1015sn.ttf │ ├── 3dlet.ttf │ ├── Blox2.ttf │ ├── ataxia.ttf │ ├── b2sq.ttf │ ├── bocuma.ttf │ ├── bumped.ttf │ ├── ccaps.ttf │ ├── claw1.ttf │ ├── claw2.ttf │ ├── dented.ttf │ ├── fascii.ttf │ ├── gather.ttf │ ├── graze.ttf │ ├── grudge.ttf │ ├── gyrose.ttf │ ├── hassle.ttf │ ├── hbevel.ttf │ ├── hearts.ttf │ ├── hyde.ttf │ ├── ilits.ttf │ ├── imposs.ttf │ ├── jagged.ttf │ ├── janken.ttf │ ├── jargon.ttf │ ├── jasper.ttf │ ├── jekyll.ttf │ ├── knot.ttf │ ├── loopy.ttf │ ├── lucid.ttf │ ├── lucid2.ttf │ ├── lucido.ttf │ ├── lynx.ttf │ ├── mincer.ttf │ ├── neural.ttf │ ├── notqr.ttf │ ├── pdark.ttf │ ├── pseudo.ttf │ ├── qlumpy.ttf │ ├── queasy.ttf │ ├── reason.ttf │ ├── revert.ttf │ ├── rotund.ttf │ ├── ryuker.ttf │ ├── tetri.ttf │ ├── thwart.ttf │ ├── tonik.ttf │ ├── united.ttf │ ├── wager.ttf │ ├── waver.ttf │ ├── weaver.ttf │ ├── wobbly.ttf │ ├── xhume.ttf │ ├── yonder.ttf │ ├── zenith.ttf │ ├── zoidal.ttf │ ├── 1015snr.ttf │ ├── 18holes.ttf │ ├── 36daysag.ttf │ ├── 36daythk.ttf │ ├── 4shadow.ttf │ ├── 4shadowo.ttf │ ├── 8bitlim.ttf │ ├── 8bitlimo.ttf │ ├── 8bitlimr.ttf │ ├── 8blimro.ttf │ ├── 90stars.ttf │ ├── Condui2i.ttf │ ├── Splatz2.ttf │ ├── Strande2.ttf │ ├── Swirled2.ttf │ ├── Tragic2.ttf │ ├── Unxgala.ttf │ ├── Unxgalaw.ttf │ ├── Unxgalo.ttf │ ├── Unxgalwo.ttf │ ├── acidrefl.ttf │ ├── acknowtt.ttf │ ├── aescrawl.ttf │ ├── aesymatt.ttf │ ├── aftermat.ttf │ ├── alphbeta.ttf │ ├── amalgama.ttf │ ├── amalgamo.ttf │ ├── amplitud.ttf │ ├── arthriti.ttf │ ├── aspartam.ttf │ ├── ataxiao.ttf │ ├── automati.ttf │ ├── b2sqol1.ttf │ ├── b2sqol2.ttf │ ├── backlash.ttf │ ├── bandless.ttf │ ├── bandmess.ttf │ ├── bandwdth.ttf │ ├── bendable.ttf │ ├── bewilder.ttf │ ├── bewildet.ttf │ ├── bin01st.ttf │ ├── binaryt.ttf │ ├── binaryx.ttf │ ├── binchrt.ttf │ ├── binx01s.ttf │ ├── binxchr.ttf │ ├── bitbttf.ttf │ ├── bknuckss.ttf │ ├── bknuckst.ttf │ ├── blackoni.ttf │ ├── bleakseg.ttf │ ├── bloktilt.ttf │ ├── blonibld.ttf │ ├── blonirex.ttf │ ├── bobcayge.ttf │ ├── bobcaygr.ttf │ ├── bocumaad.ttf │ ├── bocumaba.ttf │ ├── bocumade.ttf │ ├── bocumang.ttf │ ├── brassknu.ttf │ ├── brigadom.ttf │ ├── brigadow.ttf │ ├── candystr.ttf │ ├── ccapshad.ttf │ ├── chemrea.ttf │ ├── chemreb.ttf │ ├── chintzy.ttf │ ├── chintzys.ttf │ ├── chumbly.ttf │ ├── circulat.ttf │ ├── clasict1.ttf │ ├── clasict2.ttf │ ├── cleavttr.ttf │ ├── codelife.ttf │ ├── collecro.ttf │ ├── collecrs.ttf │ ├── collecto.ttf │ ├── collects.ttf │ ├── combusii.ttf │ ├── combuspl.ttf │ ├── combusti.ttf │ ├── combustt.ttf │ ├── combustw.ttf │ ├── compc1o.ttf │ ├── compc1s.ttf │ ├── compc2o.ttf │ ├── compc2s.ttf │ ├── compc3o.ttf │ ├── compc3s.ttf │ ├── conduit.ttf │ ├── conduit2.ttf │ ├── crackdr2.ttf │ ├── crkdownr.ttf │ ├── crkdwno1.ttf │ ├── crkdwno2.ttf │ ├── darkside.ttf │ ├── dashdot.ttf │ ├── dastardl.ttf │ ├── dblayer1.ttf │ ├── dblayer2.ttf │ ├── dblayer3.ttf │ ├── dblayer4.ttf │ ├── dblbogey.ttf │ ├── decrepit.ttf │ ├── dephun2.ttf │ ├── detonate.ttf │ ├── discorda.ttf │ ├── draggle.ttf │ ├── draggleo.ttf │ ├── dynamic.ttf │ ├── dyphusio.ttf │ ├── dystorqu.ttf │ ├── ecliptic.ttf │ ├── edundot.ttf │ ├── edunline.ttf │ ├── elsewhe2.ttf │ ├── elsewher.ttf │ ├── embosst1.ttf │ ├── embosst2.ttf │ ├── embosst3.ttf │ ├── encappln.ttf │ ├── encapsul.ttf │ ├── entangle.ttf │ ├── enthuse.ttf │ ├── enthuses.ttf │ ├── entlayra.ttf │ ├── entlayrb.ttf │ ├── entplain.ttf │ ├── euphor3d.ttf │ ├── euphoric.ttf │ ├── exagger8.ttf │ ├── extracti.ttf │ ├── falsepos.ttf │ ├── falsposr.ttf │ ├── fasciicr.ttf │ ├── fasciisc.ttf │ ├── fasciism.ttf │ ├── fasciitw.ttf │ ├── fauxsnow.ttf │ ├── fbsbltc.ttf │ ├── fbsbltc2.ttf │ ├── fidgety.ttf │ ├── flipside.ttf │ ├── forcible.ttf │ ├── freaktur.ttf │ ├── frizzed.ttf │ ├── fullcomp.ttf │ ├── galapogo.ttf │ ├── galvaniz.ttf │ ├── gaposiso.ttf │ ├── gaposiss.ttf │ ├── gasping.ttf │ ├── gathrgap.ttf │ ├── genotyph.ttf │ ├── genotyps.ttf │ ├── genotyrh.ttf │ ├── genotyrs.ttf │ ├── gesture.ttf │ ├── gestures.ttf │ ├── gesturet.ttf │ ├── gesturts.ttf │ ├── gosebmp2.ttf │ ├── gosebmps.ttf │ ├── gr8higts.ttf │ ├── granular.ttf │ ├── grapple.ttf │ ├── graveyrd.ttf │ ├── graviseg.ttf │ ├── gravitat.ttf │ ├── grotesq.ttf │ ├── grudge2.ttf │ ├── gyneric.ttf │ ├── gyneric3.ttf │ ├── gyroresh.ttf │ ├── gyrosesq.ttf │ ├── hackslsh.ttf │ ├── hairball.ttf │ ├── handmedo.ttf │ ├── handmeds.ttf │ ├── hdmaker.ttf │ ├── hillock.ttf │ ├── homespun.ttf │ ├── hyperion.ttf │ ├── inertia.ttf │ ├── inevitab.ttf │ ├── inkswipe.ttf │ ├── inktank.ttf │ ├── intersc.ttf │ ├── intersec.ttf │ ├── interso.ttf │ ├── irritate.ttf │ ├── jaspers.ttf │ ├── jawbhard.ttf │ ├── jawbreak.ttf │ ├── jawbrko1.ttf │ ├── jawbrko2.ttf │ ├── jeopardi.ttf │ ├── jeopardt.ttf │ ├── jmacscrl.ttf │ ├── joltcaff.ttf │ ├── jupiterc.ttf │ ├── kaliberr.ttf │ ├── kalibers.ttf │ ├── kaliberx.ttf │ ├── kataacti.ttf │ ├── katainac.ttf │ ├── keyrialt.ttf │ ├── keyridge.ttf │ ├── kickflip.ttf │ ├── kinkaid.ttf │ ├── kirbyss.ttf │ ├── konecto1.ttf │ ├── konecto2.ttf │ ├── konector.ttf │ ├── koneerie.ttf │ ├── kurvatur.ttf │ ├── lakeshor.ttf │ ├── lamebrai.ttf │ ├── larkspur.ttf │ ├── lethargi.ttf │ ├── licostrg.ttf │ ├── lightout.ttf │ ├── lineding.ttf │ ├── lowdown.ttf │ ├── lucid2o.ttf │ ├── lyneous.ttf │ ├── lyneousl.ttf │ ├── macropsi.ttf │ ├── madscrwl.ttf │ ├── mima4x4i.ttf │ ├── mima4x4o.ttf │ ├── mimaalt1.ttf │ ├── mimaalt2.ttf │ ├── mimafuse.ttf │ ├── minikott.ttf │ ├── minikstt.ttf │ ├── mishmash.ttf │ ├── mobilize.ttf │ ├── monkphon.ttf │ ├── moronmis.ttf │ ├── mysteron.ttf │ ├── nanosecw.ttf │ ├── naughts.ttf │ ├── neuralol.ttf │ ├── nominal.ttf │ ├── nostalgi.ttf │ ├── nsecthck.ttf │ ├── nsecthin.ttf │ ├── nucleus.ttf │ ├── numskull.ttf │ ├── nymonak.ttf │ ├── obloquyo.ttf │ ├── obloquys.ttf │ ├── obstacle.ttf │ ├── obstacll.ttf │ ├── offkiltl.ttf │ ├── offkiltr.ttf │ ├── opiated.ttf │ ├── orbicula.ttf │ ├── outersid.ttf │ ├── overhead.ttf │ ├── persuasi.ttf │ ├── phorfeir.ttf │ ├── phorfeis.ttf │ ├── pincers.ttf │ ├── pindown.ttf │ ├── pindownp.ttf │ ├── pindwnx.ttf │ ├── pindwnxp.ttf │ ├── pixlkrud.ttf │ ├── plasdrip.ttf │ ├── plasdrpe.ttf │ ├── pneumati.ttf │ ├── pneutall.ttf │ ├── pneuwide.ttf │ ├── powdwrk5.ttf │ ├── qbicle1.ttf │ ├── qbicle2.ttf │ ├── qbicle3.ttf │ ├── qbicle4.ttf │ ├── qlumpysh.ttf │ ├── quacksal.ttf │ ├── quadrcal.ttf │ ├── quadrtic.ttf │ ├── quandary.ttf │ ├── quantfh.ttf │ ├── quantflt.ttf │ ├── quantrh.ttf │ ├── quantrnd.ttf │ ├── quanttap.ttf │ ├── quaranti.ttf │ ├── quarthck.ttf │ ├── quarthin.ttf │ ├── queasyol.ttf │ ├── quillexo.ttf │ ├── quillexs.ttf │ ├── rambling.ttf │ ├── ravaged2.ttf │ ├── ravcater.ttf │ ├── raydiat2.ttf │ ├── reasonsh.ttf │ ├── redundan.ttf │ ├── regenera.ttf │ ├── registry.ttf │ ├── rehearsc.ttf │ ├── rehearso.ttf │ ├── rehearsp.ttf │ ├── relapse.ttf │ ├── revertro.ttf │ ├── rotundo.ttf │ ├── roughday.ttf │ ├── sarcasti.ttf │ ├── saunder.ttf │ ├── scalines.ttf │ ├── sclnmaze.ttf │ ├── sequence.ttf │ ├── setbackt.ttf │ ├── sideways.ttf │ ├── simplto2.ttf │ ├── skullcap.ttf │ ├── slender.ttf │ ├── slenderw.ttf │ ├── slenmini.ttf │ ├── slenstub.ttf │ ├── snailets.ttf │ ├── spaciouo.ttf │ ├── spacious.ttf │ ├── spastic2.ttf │ ├── spheroid.ttf │ ├── spheroix.ttf │ ├── sqroute.ttf │ ├── stagnati.ttf │ ├── supragc.ttf │ ├── supragl.ttf │ ├── symmetry.ttf │ ├── syndrome.ttf │ ├── syntheti.ttf │ ├── syracuse.ttf │ ├── tearful.ttf │ ├── techniqo.ttf │ ├── techniqu.ttf │ ├── techover.ttf │ ├── telephas.ttf │ ├── tsextolo.ttf │ ├── tsextols.ttf │ ├── turmoil.ttf │ ├── ubiquity.ttf │ ├── unanimo.ttf │ ├── unanimoi.ttf │ ├── underscr.ttf │ ├── underwhe.ttf │ ├── underwho.ttf │ ├── undrscr2.ttf │ ├── unlearn2.ttf │ ├── unlearne.ttf │ ├── unrespon.ttf │ ├── upheavtt.ttf │ ├── upraise.ttf │ ├── urcompi.ttf │ ├── urcompo.ttf │ ├── vacantz.ttf │ ├── vanished.ttf │ ├── vantage.ttf │ ├── variance.ttf │ ├── vertigo.ttf │ ├── vertigo2.ttf │ ├── vertigup.ttf │ ├── vertiup2.ttf │ ├── vigilanc.ttf │ ├── vindicti.ttf │ ├── visitor1.ttf │ ├── visitor2.ttf │ ├── volatil1.ttf │ ├── volatil2.ttf │ ├── wagerlos.ttf │ ├── wagerwon.ttf │ ├── wayward.ttf │ ├── waywards.ttf │ ├── weatherd.ttf │ ├── weathers.ttf │ ├── whatever.ttf │ ├── whipsnap.ttf │ ├── wigsquig.ttf │ ├── wincing.ttf │ ├── withstan.ttf │ ├── wyvernwi.ttf │ ├── wyvernww.ttf │ ├── xeroxmal.ttf │ ├── xipital.ttf │ ├── xmaslght.ttf │ ├── xtrusion.ttf │ ├── yearend.ttf │ ├── yesterda.ttf │ ├── yielding.ttf │ ├── yoshisst.ttf │ ├── yourcomp.ttf │ ├── zeldadxt.ttf │ ├── zephyrea.ttf │ ├── zephyreg.ttf │ ├── zerovelo.ttf │ ├── zirccube.ttf │ ├── zirconia.ttf │ ├── zoetrope.ttf │ ├── zurklezo.ttf │ ├── zurklezs.ttf │ └── editundo.ttf └── matelight │ └── 40x16 │ └── gif │ ├── 34_5.gif │ ├── 6183.gif │ ├── Roots.gif │ ├── Scene.gif │ ├── laser2.gif │ ├── ElectronSpin.gif │ ├── OmegaPointWC.gif │ ├── Unbenannt-1.gif │ ├── FlowerOfLifeV2.gif │ ├── RiemannFlower.gif │ ├── SteinerChain2.gif │ ├── SteinerOwl_oo.gif │ ├── Triangulation.gif │ ├── Triangulation2.gif │ ├── QuantumTunnelv3_v23.gif │ ├── RiemannRadio_I2_P+1.gif │ ├── EveryWallIsADoorFAniC.gif │ ├── FlowerOfLifeV2colalt.gif │ ├── IndrasNet_HiTech_gif1.gif │ └── 8a2bd6b580bc42799a6dd01c765acc8aed294516.gif ├── avio-legacy ├── avio-nogui ├── splash.py ├── component.py ├── install ├── avio_standalone ├── camera.py ├── matelight.py ├── logo.svg ├── app.py └── logger.py ├── images ├── startscreen.png └── startscreen_matelight.png ├── requirements.txt ├── .gitignore ├── frontend ├── avio.config.js ├── avio.module.js ├── avio │ └── avio.scss └── assets │ └── avio_menu_logo.svg ├── README.rst └── setup.py /.idea/.name: -------------------------------------------------------------------------------- 1 | AVIO -------------------------------------------------------------------------------- /docs/__init__.py: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /avio/__init__.py: -------------------------------------------------------------------------------- 1 | __author__ = 'riot' 2 | -------------------------------------------------------------------------------- /bitwig/00149_MusicForAGamepad/.bitwig-project: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /test.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ri0t/avio/HEAD/test.gif -------------------------------------------------------------------------------- /library/fonts/1015sn.ttf: -------------------------------------------------------------------------------- 1 | /usr/share/fonts/truetype/aenigma/1015sn.ttf -------------------------------------------------------------------------------- /library/fonts/3dlet.ttf: -------------------------------------------------------------------------------- 1 | /usr/share/fonts/truetype/aenigma/3dlet.ttf -------------------------------------------------------------------------------- /library/fonts/Blox2.ttf: -------------------------------------------------------------------------------- 1 | /usr/share/fonts/truetype/aenigma/Blox2.ttf -------------------------------------------------------------------------------- /library/fonts/ataxia.ttf: -------------------------------------------------------------------------------- 1 | /usr/share/fonts/truetype/aenigma/ataxia.ttf -------------------------------------------------------------------------------- /library/fonts/b2sq.ttf: -------------------------------------------------------------------------------- 1 | /usr/share/fonts/truetype/aenigma/b2sq.ttf -------------------------------------------------------------------------------- /library/fonts/bocuma.ttf: -------------------------------------------------------------------------------- 1 | /usr/share/fonts/truetype/aenigma/bocuma.ttf -------------------------------------------------------------------------------- /library/fonts/bumped.ttf: -------------------------------------------------------------------------------- 1 | /usr/share/fonts/truetype/aenigma/bumped.ttf -------------------------------------------------------------------------------- /library/fonts/ccaps.ttf: -------------------------------------------------------------------------------- 1 | /usr/share/fonts/truetype/aenigma/ccaps.ttf -------------------------------------------------------------------------------- /library/fonts/claw1.ttf: -------------------------------------------------------------------------------- 1 | /usr/share/fonts/truetype/aenigma/claw1.ttf -------------------------------------------------------------------------------- /library/fonts/claw2.ttf: -------------------------------------------------------------------------------- 1 | /usr/share/fonts/truetype/aenigma/claw2.ttf -------------------------------------------------------------------------------- /library/fonts/dented.ttf: -------------------------------------------------------------------------------- 1 | /usr/share/fonts/truetype/aenigma/dented.ttf -------------------------------------------------------------------------------- /library/fonts/fascii.ttf: -------------------------------------------------------------------------------- 1 | /usr/share/fonts/truetype/aenigma/fascii.ttf -------------------------------------------------------------------------------- /library/fonts/gather.ttf: -------------------------------------------------------------------------------- 1 | /usr/share/fonts/truetype/aenigma/gather.ttf -------------------------------------------------------------------------------- /library/fonts/graze.ttf: -------------------------------------------------------------------------------- 1 | /usr/share/fonts/truetype/aenigma/graze.ttf -------------------------------------------------------------------------------- /library/fonts/grudge.ttf: -------------------------------------------------------------------------------- 1 | /usr/share/fonts/truetype/aenigma/grudge.ttf -------------------------------------------------------------------------------- /library/fonts/gyrose.ttf: -------------------------------------------------------------------------------- 1 | /usr/share/fonts/truetype/aenigma/gyrose.ttf -------------------------------------------------------------------------------- /library/fonts/hassle.ttf: -------------------------------------------------------------------------------- 1 | /usr/share/fonts/truetype/aenigma/hassle.ttf -------------------------------------------------------------------------------- /library/fonts/hbevel.ttf: -------------------------------------------------------------------------------- 1 | /usr/share/fonts/truetype/aenigma/hbevel.ttf -------------------------------------------------------------------------------- /library/fonts/hearts.ttf: -------------------------------------------------------------------------------- 1 | /usr/share/fonts/truetype/aenigma/hearts.ttf -------------------------------------------------------------------------------- /library/fonts/hyde.ttf: -------------------------------------------------------------------------------- 1 | /usr/share/fonts/truetype/aenigma/hyde.ttf -------------------------------------------------------------------------------- /library/fonts/ilits.ttf: -------------------------------------------------------------------------------- 1 | /usr/share/fonts/truetype/aenigma/ilits.ttf -------------------------------------------------------------------------------- /library/fonts/imposs.ttf: -------------------------------------------------------------------------------- 1 | /usr/share/fonts/truetype/aenigma/imposs.ttf -------------------------------------------------------------------------------- /library/fonts/jagged.ttf: -------------------------------------------------------------------------------- 1 | /usr/share/fonts/truetype/aenigma/jagged.ttf -------------------------------------------------------------------------------- /library/fonts/janken.ttf: -------------------------------------------------------------------------------- 1 | /usr/share/fonts/truetype/aenigma/janken.ttf -------------------------------------------------------------------------------- /library/fonts/jargon.ttf: -------------------------------------------------------------------------------- 1 | /usr/share/fonts/truetype/aenigma/jargon.ttf -------------------------------------------------------------------------------- /library/fonts/jasper.ttf: -------------------------------------------------------------------------------- 1 | /usr/share/fonts/truetype/aenigma/jasper.ttf -------------------------------------------------------------------------------- /library/fonts/jekyll.ttf: -------------------------------------------------------------------------------- 1 | /usr/share/fonts/truetype/aenigma/jekyll.ttf -------------------------------------------------------------------------------- /library/fonts/knot.ttf: -------------------------------------------------------------------------------- 1 | /usr/share/fonts/truetype/aenigma/knot.ttf -------------------------------------------------------------------------------- /library/fonts/loopy.ttf: -------------------------------------------------------------------------------- 1 | /usr/share/fonts/truetype/aenigma/loopy.ttf -------------------------------------------------------------------------------- /library/fonts/lucid.ttf: -------------------------------------------------------------------------------- 1 | /usr/share/fonts/truetype/aenigma/lucid.ttf -------------------------------------------------------------------------------- /library/fonts/lucid2.ttf: -------------------------------------------------------------------------------- 1 | /usr/share/fonts/truetype/aenigma/lucid2.ttf -------------------------------------------------------------------------------- /library/fonts/lucido.ttf: -------------------------------------------------------------------------------- 1 | /usr/share/fonts/truetype/aenigma/lucido.ttf -------------------------------------------------------------------------------- /library/fonts/lynx.ttf: -------------------------------------------------------------------------------- 1 | /usr/share/fonts/truetype/aenigma/lynx.ttf -------------------------------------------------------------------------------- /library/fonts/mincer.ttf: -------------------------------------------------------------------------------- 1 | /usr/share/fonts/truetype/aenigma/mincer.ttf -------------------------------------------------------------------------------- /library/fonts/neural.ttf: -------------------------------------------------------------------------------- 1 | /usr/share/fonts/truetype/aenigma/neural.ttf -------------------------------------------------------------------------------- /library/fonts/notqr.ttf: -------------------------------------------------------------------------------- 1 | /usr/share/fonts/truetype/aenigma/notqr.ttf -------------------------------------------------------------------------------- /library/fonts/pdark.ttf: -------------------------------------------------------------------------------- 1 | /usr/share/fonts/truetype/aenigma/pdark.ttf -------------------------------------------------------------------------------- /library/fonts/pseudo.ttf: -------------------------------------------------------------------------------- 1 | /usr/share/fonts/truetype/aenigma/pseudo.ttf -------------------------------------------------------------------------------- /library/fonts/qlumpy.ttf: -------------------------------------------------------------------------------- 1 | /usr/share/fonts/truetype/aenigma/qlumpy.ttf -------------------------------------------------------------------------------- /library/fonts/queasy.ttf: -------------------------------------------------------------------------------- 1 | /usr/share/fonts/truetype/aenigma/queasy.ttf -------------------------------------------------------------------------------- /library/fonts/reason.ttf: -------------------------------------------------------------------------------- 1 | /usr/share/fonts/truetype/aenigma/reason.ttf -------------------------------------------------------------------------------- /library/fonts/revert.ttf: -------------------------------------------------------------------------------- 1 | /usr/share/fonts/truetype/aenigma/revert.ttf -------------------------------------------------------------------------------- /library/fonts/rotund.ttf: -------------------------------------------------------------------------------- 1 | /usr/share/fonts/truetype/aenigma/rotund.ttf -------------------------------------------------------------------------------- /library/fonts/ryuker.ttf: -------------------------------------------------------------------------------- 1 | /usr/share/fonts/truetype/aenigma/ryuker.ttf -------------------------------------------------------------------------------- /library/fonts/tetri.ttf: -------------------------------------------------------------------------------- 1 | /usr/share/fonts/truetype/aenigma/tetri.ttf -------------------------------------------------------------------------------- /library/fonts/thwart.ttf: -------------------------------------------------------------------------------- 1 | /usr/share/fonts/truetype/aenigma/thwart.ttf -------------------------------------------------------------------------------- /library/fonts/tonik.ttf: -------------------------------------------------------------------------------- 1 | /usr/share/fonts/truetype/aenigma/tonik.ttf -------------------------------------------------------------------------------- /library/fonts/united.ttf: -------------------------------------------------------------------------------- 1 | /usr/share/fonts/truetype/aenigma/united.ttf -------------------------------------------------------------------------------- /library/fonts/wager.ttf: -------------------------------------------------------------------------------- 1 | /usr/share/fonts/truetype/aenigma/wager.ttf -------------------------------------------------------------------------------- /library/fonts/waver.ttf: -------------------------------------------------------------------------------- 1 | /usr/share/fonts/truetype/aenigma/waver.ttf -------------------------------------------------------------------------------- /library/fonts/weaver.ttf: -------------------------------------------------------------------------------- 1 | /usr/share/fonts/truetype/aenigma/weaver.ttf -------------------------------------------------------------------------------- /library/fonts/wobbly.ttf: -------------------------------------------------------------------------------- 1 | /usr/share/fonts/truetype/aenigma/wobbly.ttf -------------------------------------------------------------------------------- /library/fonts/xhume.ttf: -------------------------------------------------------------------------------- 1 | /usr/share/fonts/truetype/aenigma/xhume.ttf -------------------------------------------------------------------------------- /library/fonts/yonder.ttf: -------------------------------------------------------------------------------- 1 | /usr/share/fonts/truetype/aenigma/yonder.ttf -------------------------------------------------------------------------------- /library/fonts/zenith.ttf: -------------------------------------------------------------------------------- 1 | /usr/share/fonts/truetype/aenigma/zenith.ttf -------------------------------------------------------------------------------- /library/fonts/zoidal.ttf: -------------------------------------------------------------------------------- 1 | /usr/share/fonts/truetype/aenigma/zoidal.ttf -------------------------------------------------------------------------------- /library/fonts/1015snr.ttf: -------------------------------------------------------------------------------- 1 | /usr/share/fonts/truetype/aenigma/1015snr.ttf -------------------------------------------------------------------------------- /library/fonts/18holes.ttf: -------------------------------------------------------------------------------- 1 | /usr/share/fonts/truetype/aenigma/18holes.ttf -------------------------------------------------------------------------------- /library/fonts/36daysag.ttf: -------------------------------------------------------------------------------- 1 | /usr/share/fonts/truetype/aenigma/36daysag.ttf -------------------------------------------------------------------------------- /library/fonts/36daythk.ttf: -------------------------------------------------------------------------------- 1 | /usr/share/fonts/truetype/aenigma/36daythk.ttf -------------------------------------------------------------------------------- /library/fonts/4shadow.ttf: -------------------------------------------------------------------------------- 1 | /usr/share/fonts/truetype/aenigma/4shadow.ttf -------------------------------------------------------------------------------- /library/fonts/4shadowo.ttf: -------------------------------------------------------------------------------- 1 | /usr/share/fonts/truetype/aenigma/4shadowo.ttf -------------------------------------------------------------------------------- /library/fonts/8bitlim.ttf: -------------------------------------------------------------------------------- 1 | /usr/share/fonts/truetype/aenigma/8bitlim.ttf -------------------------------------------------------------------------------- /library/fonts/8bitlimo.ttf: -------------------------------------------------------------------------------- 1 | /usr/share/fonts/truetype/aenigma/8bitlimo.ttf -------------------------------------------------------------------------------- /library/fonts/8bitlimr.ttf: -------------------------------------------------------------------------------- 1 | /usr/share/fonts/truetype/aenigma/8bitlimr.ttf -------------------------------------------------------------------------------- /library/fonts/8blimro.ttf: -------------------------------------------------------------------------------- 1 | /usr/share/fonts/truetype/aenigma/8blimro.ttf -------------------------------------------------------------------------------- /library/fonts/90stars.ttf: -------------------------------------------------------------------------------- 1 | /usr/share/fonts/truetype/aenigma/90stars.ttf -------------------------------------------------------------------------------- /library/fonts/Condui2i.ttf: -------------------------------------------------------------------------------- 1 | /usr/share/fonts/truetype/aenigma/Condui2i.ttf -------------------------------------------------------------------------------- /library/fonts/Splatz2.ttf: -------------------------------------------------------------------------------- 1 | /usr/share/fonts/truetype/aenigma/Splatz2.ttf -------------------------------------------------------------------------------- /library/fonts/Strande2.ttf: -------------------------------------------------------------------------------- 1 | /usr/share/fonts/truetype/aenigma/Strande2.ttf -------------------------------------------------------------------------------- /library/fonts/Swirled2.ttf: -------------------------------------------------------------------------------- 1 | /usr/share/fonts/truetype/aenigma/Swirled2.ttf -------------------------------------------------------------------------------- /library/fonts/Tragic2.ttf: -------------------------------------------------------------------------------- 1 | /usr/share/fonts/truetype/aenigma/Tragic2.ttf -------------------------------------------------------------------------------- /library/fonts/Unxgala.ttf: -------------------------------------------------------------------------------- 1 | /usr/share/fonts/truetype/aenigma/Unxgala.ttf -------------------------------------------------------------------------------- /library/fonts/Unxgalaw.ttf: -------------------------------------------------------------------------------- 1 | /usr/share/fonts/truetype/aenigma/Unxgalaw.ttf -------------------------------------------------------------------------------- /library/fonts/Unxgalo.ttf: -------------------------------------------------------------------------------- 1 | /usr/share/fonts/truetype/aenigma/Unxgalo.ttf -------------------------------------------------------------------------------- /library/fonts/Unxgalwo.ttf: -------------------------------------------------------------------------------- 1 | /usr/share/fonts/truetype/aenigma/Unxgalwo.ttf -------------------------------------------------------------------------------- /library/fonts/acidrefl.ttf: -------------------------------------------------------------------------------- 1 | /usr/share/fonts/truetype/aenigma/acidrefl.ttf -------------------------------------------------------------------------------- /library/fonts/acknowtt.ttf: -------------------------------------------------------------------------------- 1 | /usr/share/fonts/truetype/aenigma/acknowtt.ttf -------------------------------------------------------------------------------- /library/fonts/aescrawl.ttf: -------------------------------------------------------------------------------- 1 | /usr/share/fonts/truetype/aenigma/aescrawl.ttf -------------------------------------------------------------------------------- /library/fonts/aesymatt.ttf: -------------------------------------------------------------------------------- 1 | /usr/share/fonts/truetype/aenigma/aesymatt.ttf -------------------------------------------------------------------------------- /library/fonts/aftermat.ttf: -------------------------------------------------------------------------------- 1 | /usr/share/fonts/truetype/aenigma/aftermat.ttf -------------------------------------------------------------------------------- /library/fonts/alphbeta.ttf: -------------------------------------------------------------------------------- 1 | /usr/share/fonts/truetype/aenigma/alphbeta.ttf -------------------------------------------------------------------------------- /library/fonts/amalgama.ttf: -------------------------------------------------------------------------------- 1 | /usr/share/fonts/truetype/aenigma/amalgama.ttf -------------------------------------------------------------------------------- /library/fonts/amalgamo.ttf: -------------------------------------------------------------------------------- 1 | /usr/share/fonts/truetype/aenigma/amalgamo.ttf -------------------------------------------------------------------------------- /library/fonts/amplitud.ttf: -------------------------------------------------------------------------------- 1 | /usr/share/fonts/truetype/aenigma/amplitud.ttf -------------------------------------------------------------------------------- /library/fonts/arthriti.ttf: -------------------------------------------------------------------------------- 1 | /usr/share/fonts/truetype/aenigma/arthriti.ttf -------------------------------------------------------------------------------- /library/fonts/aspartam.ttf: -------------------------------------------------------------------------------- 1 | /usr/share/fonts/truetype/aenigma/aspartam.ttf -------------------------------------------------------------------------------- /library/fonts/ataxiao.ttf: -------------------------------------------------------------------------------- 1 | /usr/share/fonts/truetype/aenigma/ataxiao.ttf -------------------------------------------------------------------------------- /library/fonts/automati.ttf: -------------------------------------------------------------------------------- 1 | /usr/share/fonts/truetype/aenigma/automati.ttf -------------------------------------------------------------------------------- /library/fonts/b2sqol1.ttf: -------------------------------------------------------------------------------- 1 | /usr/share/fonts/truetype/aenigma/b2sqol1.ttf -------------------------------------------------------------------------------- /library/fonts/b2sqol2.ttf: -------------------------------------------------------------------------------- 1 | /usr/share/fonts/truetype/aenigma/b2sqol2.ttf -------------------------------------------------------------------------------- /library/fonts/backlash.ttf: -------------------------------------------------------------------------------- 1 | /usr/share/fonts/truetype/aenigma/backlash.ttf -------------------------------------------------------------------------------- /library/fonts/bandless.ttf: -------------------------------------------------------------------------------- 1 | /usr/share/fonts/truetype/aenigma/bandless.ttf -------------------------------------------------------------------------------- /library/fonts/bandmess.ttf: -------------------------------------------------------------------------------- 1 | /usr/share/fonts/truetype/aenigma/bandmess.ttf -------------------------------------------------------------------------------- /library/fonts/bandwdth.ttf: -------------------------------------------------------------------------------- 1 | /usr/share/fonts/truetype/aenigma/bandwdth.ttf -------------------------------------------------------------------------------- /library/fonts/bendable.ttf: -------------------------------------------------------------------------------- 1 | /usr/share/fonts/truetype/aenigma/bendable.ttf -------------------------------------------------------------------------------- /library/fonts/bewilder.ttf: -------------------------------------------------------------------------------- 1 | /usr/share/fonts/truetype/aenigma/bewilder.ttf -------------------------------------------------------------------------------- /library/fonts/bewildet.ttf: -------------------------------------------------------------------------------- 1 | /usr/share/fonts/truetype/aenigma/bewildet.ttf -------------------------------------------------------------------------------- /library/fonts/bin01st.ttf: -------------------------------------------------------------------------------- 1 | /usr/share/fonts/truetype/aenigma/bin01st.ttf -------------------------------------------------------------------------------- /library/fonts/binaryt.ttf: -------------------------------------------------------------------------------- 1 | /usr/share/fonts/truetype/aenigma/binaryt.ttf -------------------------------------------------------------------------------- /library/fonts/binaryx.ttf: -------------------------------------------------------------------------------- 1 | /usr/share/fonts/truetype/aenigma/binaryx.ttf -------------------------------------------------------------------------------- /library/fonts/binchrt.ttf: -------------------------------------------------------------------------------- 1 | /usr/share/fonts/truetype/aenigma/binchrt.ttf -------------------------------------------------------------------------------- /library/fonts/binx01s.ttf: -------------------------------------------------------------------------------- 1 | /usr/share/fonts/truetype/aenigma/binx01s.ttf -------------------------------------------------------------------------------- /library/fonts/binxchr.ttf: -------------------------------------------------------------------------------- 1 | /usr/share/fonts/truetype/aenigma/binxchr.ttf -------------------------------------------------------------------------------- /library/fonts/bitbttf.ttf: -------------------------------------------------------------------------------- 1 | /usr/share/fonts/truetype/aenigma/bitbttf.ttf -------------------------------------------------------------------------------- /library/fonts/bknuckss.ttf: -------------------------------------------------------------------------------- 1 | /usr/share/fonts/truetype/aenigma/bknuckss.ttf -------------------------------------------------------------------------------- /library/fonts/bknuckst.ttf: -------------------------------------------------------------------------------- 1 | /usr/share/fonts/truetype/aenigma/bknuckst.ttf -------------------------------------------------------------------------------- /library/fonts/blackoni.ttf: -------------------------------------------------------------------------------- 1 | /usr/share/fonts/truetype/aenigma/blackoni.ttf -------------------------------------------------------------------------------- /library/fonts/bleakseg.ttf: -------------------------------------------------------------------------------- 1 | /usr/share/fonts/truetype/aenigma/bleakseg.ttf -------------------------------------------------------------------------------- /library/fonts/bloktilt.ttf: -------------------------------------------------------------------------------- 1 | /usr/share/fonts/truetype/aenigma/bloktilt.ttf -------------------------------------------------------------------------------- /library/fonts/blonibld.ttf: -------------------------------------------------------------------------------- 1 | /usr/share/fonts/truetype/aenigma/blonibld.ttf -------------------------------------------------------------------------------- /library/fonts/blonirex.ttf: -------------------------------------------------------------------------------- 1 | /usr/share/fonts/truetype/aenigma/blonirex.ttf -------------------------------------------------------------------------------- /library/fonts/bobcayge.ttf: -------------------------------------------------------------------------------- 1 | /usr/share/fonts/truetype/aenigma/bobcayge.ttf -------------------------------------------------------------------------------- /library/fonts/bobcaygr.ttf: -------------------------------------------------------------------------------- 1 | /usr/share/fonts/truetype/aenigma/bobcaygr.ttf -------------------------------------------------------------------------------- /library/fonts/bocumaad.ttf: -------------------------------------------------------------------------------- 1 | /usr/share/fonts/truetype/aenigma/bocumaad.ttf -------------------------------------------------------------------------------- /library/fonts/bocumaba.ttf: -------------------------------------------------------------------------------- 1 | /usr/share/fonts/truetype/aenigma/bocumaba.ttf -------------------------------------------------------------------------------- /library/fonts/bocumade.ttf: -------------------------------------------------------------------------------- 1 | /usr/share/fonts/truetype/aenigma/bocumade.ttf -------------------------------------------------------------------------------- /library/fonts/bocumang.ttf: -------------------------------------------------------------------------------- 1 | /usr/share/fonts/truetype/aenigma/bocumang.ttf -------------------------------------------------------------------------------- /library/fonts/brassknu.ttf: -------------------------------------------------------------------------------- 1 | /usr/share/fonts/truetype/aenigma/brassknu.ttf -------------------------------------------------------------------------------- /library/fonts/brigadom.ttf: -------------------------------------------------------------------------------- 1 | /usr/share/fonts/truetype/aenigma/brigadom.ttf -------------------------------------------------------------------------------- /library/fonts/brigadow.ttf: -------------------------------------------------------------------------------- 1 | /usr/share/fonts/truetype/aenigma/brigadow.ttf -------------------------------------------------------------------------------- /library/fonts/candystr.ttf: -------------------------------------------------------------------------------- 1 | /usr/share/fonts/truetype/aenigma/candystr.ttf -------------------------------------------------------------------------------- /library/fonts/ccapshad.ttf: -------------------------------------------------------------------------------- 1 | /usr/share/fonts/truetype/aenigma/ccapshad.ttf -------------------------------------------------------------------------------- /library/fonts/chemrea.ttf: -------------------------------------------------------------------------------- 1 | /usr/share/fonts/truetype/aenigma/chemrea.ttf -------------------------------------------------------------------------------- /library/fonts/chemreb.ttf: -------------------------------------------------------------------------------- 1 | /usr/share/fonts/truetype/aenigma/chemreb.ttf -------------------------------------------------------------------------------- /library/fonts/chintzy.ttf: -------------------------------------------------------------------------------- 1 | /usr/share/fonts/truetype/aenigma/chintzy.ttf -------------------------------------------------------------------------------- /library/fonts/chintzys.ttf: -------------------------------------------------------------------------------- 1 | /usr/share/fonts/truetype/aenigma/chintzys.ttf -------------------------------------------------------------------------------- /library/fonts/chumbly.ttf: -------------------------------------------------------------------------------- 1 | /usr/share/fonts/truetype/aenigma/chumbly.ttf -------------------------------------------------------------------------------- /library/fonts/circulat.ttf: -------------------------------------------------------------------------------- 1 | /usr/share/fonts/truetype/aenigma/circulat.ttf -------------------------------------------------------------------------------- /library/fonts/clasict1.ttf: -------------------------------------------------------------------------------- 1 | /usr/share/fonts/truetype/aenigma/clasict1.ttf -------------------------------------------------------------------------------- /library/fonts/clasict2.ttf: -------------------------------------------------------------------------------- 1 | /usr/share/fonts/truetype/aenigma/clasict2.ttf -------------------------------------------------------------------------------- /library/fonts/cleavttr.ttf: -------------------------------------------------------------------------------- 1 | /usr/share/fonts/truetype/aenigma/cleavttr.ttf -------------------------------------------------------------------------------- /library/fonts/codelife.ttf: -------------------------------------------------------------------------------- 1 | /usr/share/fonts/truetype/aenigma/codelife.ttf -------------------------------------------------------------------------------- /library/fonts/collecro.ttf: -------------------------------------------------------------------------------- 1 | /usr/share/fonts/truetype/aenigma/collecro.ttf -------------------------------------------------------------------------------- /library/fonts/collecrs.ttf: -------------------------------------------------------------------------------- 1 | /usr/share/fonts/truetype/aenigma/collecrs.ttf -------------------------------------------------------------------------------- /library/fonts/collecto.ttf: -------------------------------------------------------------------------------- 1 | /usr/share/fonts/truetype/aenigma/collecto.ttf -------------------------------------------------------------------------------- /library/fonts/collects.ttf: -------------------------------------------------------------------------------- 1 | /usr/share/fonts/truetype/aenigma/collects.ttf -------------------------------------------------------------------------------- /library/fonts/combusii.ttf: -------------------------------------------------------------------------------- 1 | /usr/share/fonts/truetype/aenigma/combusii.ttf -------------------------------------------------------------------------------- /library/fonts/combuspl.ttf: -------------------------------------------------------------------------------- 1 | /usr/share/fonts/truetype/aenigma/combuspl.ttf -------------------------------------------------------------------------------- /library/fonts/combusti.ttf: -------------------------------------------------------------------------------- 1 | /usr/share/fonts/truetype/aenigma/combusti.ttf -------------------------------------------------------------------------------- /library/fonts/combustt.ttf: -------------------------------------------------------------------------------- 1 | /usr/share/fonts/truetype/aenigma/combustt.ttf -------------------------------------------------------------------------------- /library/fonts/combustw.ttf: -------------------------------------------------------------------------------- 1 | /usr/share/fonts/truetype/aenigma/combustw.ttf -------------------------------------------------------------------------------- /library/fonts/compc1o.ttf: -------------------------------------------------------------------------------- 1 | /usr/share/fonts/truetype/aenigma/compc1o.ttf -------------------------------------------------------------------------------- /library/fonts/compc1s.ttf: -------------------------------------------------------------------------------- 1 | /usr/share/fonts/truetype/aenigma/compc1s.ttf -------------------------------------------------------------------------------- /library/fonts/compc2o.ttf: -------------------------------------------------------------------------------- 1 | /usr/share/fonts/truetype/aenigma/compc2o.ttf -------------------------------------------------------------------------------- /library/fonts/compc2s.ttf: -------------------------------------------------------------------------------- 1 | /usr/share/fonts/truetype/aenigma/compc2s.ttf -------------------------------------------------------------------------------- /library/fonts/compc3o.ttf: -------------------------------------------------------------------------------- 1 | /usr/share/fonts/truetype/aenigma/compc3o.ttf -------------------------------------------------------------------------------- /library/fonts/compc3s.ttf: -------------------------------------------------------------------------------- 1 | /usr/share/fonts/truetype/aenigma/compc3s.ttf -------------------------------------------------------------------------------- /library/fonts/conduit.ttf: -------------------------------------------------------------------------------- 1 | /usr/share/fonts/truetype/aenigma/conduit.ttf -------------------------------------------------------------------------------- /library/fonts/conduit2.ttf: -------------------------------------------------------------------------------- 1 | /usr/share/fonts/truetype/aenigma/conduit2.ttf -------------------------------------------------------------------------------- /library/fonts/crackdr2.ttf: -------------------------------------------------------------------------------- 1 | /usr/share/fonts/truetype/aenigma/crackdr2.ttf -------------------------------------------------------------------------------- /library/fonts/crkdownr.ttf: -------------------------------------------------------------------------------- 1 | /usr/share/fonts/truetype/aenigma/crkdownr.ttf -------------------------------------------------------------------------------- /library/fonts/crkdwno1.ttf: -------------------------------------------------------------------------------- 1 | /usr/share/fonts/truetype/aenigma/crkdwno1.ttf -------------------------------------------------------------------------------- /library/fonts/crkdwno2.ttf: -------------------------------------------------------------------------------- 1 | /usr/share/fonts/truetype/aenigma/crkdwno2.ttf -------------------------------------------------------------------------------- /library/fonts/darkside.ttf: -------------------------------------------------------------------------------- 1 | /usr/share/fonts/truetype/aenigma/darkside.ttf -------------------------------------------------------------------------------- /library/fonts/dashdot.ttf: -------------------------------------------------------------------------------- 1 | /usr/share/fonts/truetype/aenigma/dashdot.ttf -------------------------------------------------------------------------------- /library/fonts/dastardl.ttf: -------------------------------------------------------------------------------- 1 | /usr/share/fonts/truetype/aenigma/dastardl.ttf -------------------------------------------------------------------------------- /library/fonts/dblayer1.ttf: -------------------------------------------------------------------------------- 1 | /usr/share/fonts/truetype/aenigma/dblayer1.ttf -------------------------------------------------------------------------------- /library/fonts/dblayer2.ttf: -------------------------------------------------------------------------------- 1 | /usr/share/fonts/truetype/aenigma/dblayer2.ttf -------------------------------------------------------------------------------- /library/fonts/dblayer3.ttf: -------------------------------------------------------------------------------- 1 | /usr/share/fonts/truetype/aenigma/dblayer3.ttf -------------------------------------------------------------------------------- /library/fonts/dblayer4.ttf: -------------------------------------------------------------------------------- 1 | /usr/share/fonts/truetype/aenigma/dblayer4.ttf -------------------------------------------------------------------------------- /library/fonts/dblbogey.ttf: -------------------------------------------------------------------------------- 1 | /usr/share/fonts/truetype/aenigma/dblbogey.ttf -------------------------------------------------------------------------------- /library/fonts/decrepit.ttf: -------------------------------------------------------------------------------- 1 | /usr/share/fonts/truetype/aenigma/decrepit.ttf -------------------------------------------------------------------------------- /library/fonts/dephun2.ttf: -------------------------------------------------------------------------------- 1 | /usr/share/fonts/truetype/aenigma/dephun2.ttf -------------------------------------------------------------------------------- /library/fonts/detonate.ttf: -------------------------------------------------------------------------------- 1 | /usr/share/fonts/truetype/aenigma/detonate.ttf -------------------------------------------------------------------------------- /library/fonts/discorda.ttf: -------------------------------------------------------------------------------- 1 | /usr/share/fonts/truetype/aenigma/discorda.ttf -------------------------------------------------------------------------------- /library/fonts/draggle.ttf: -------------------------------------------------------------------------------- 1 | /usr/share/fonts/truetype/aenigma/draggle.ttf -------------------------------------------------------------------------------- /library/fonts/draggleo.ttf: -------------------------------------------------------------------------------- 1 | /usr/share/fonts/truetype/aenigma/draggleo.ttf -------------------------------------------------------------------------------- /library/fonts/dynamic.ttf: -------------------------------------------------------------------------------- 1 | /usr/share/fonts/truetype/aenigma/dynamic.ttf -------------------------------------------------------------------------------- /library/fonts/dyphusio.ttf: -------------------------------------------------------------------------------- 1 | /usr/share/fonts/truetype/aenigma/dyphusio.ttf -------------------------------------------------------------------------------- /library/fonts/dystorqu.ttf: -------------------------------------------------------------------------------- 1 | /usr/share/fonts/truetype/aenigma/dystorqu.ttf -------------------------------------------------------------------------------- /library/fonts/ecliptic.ttf: -------------------------------------------------------------------------------- 1 | /usr/share/fonts/truetype/aenigma/ecliptic.ttf -------------------------------------------------------------------------------- /library/fonts/edundot.ttf: -------------------------------------------------------------------------------- 1 | /usr/share/fonts/truetype/aenigma/edundot.ttf -------------------------------------------------------------------------------- /library/fonts/edunline.ttf: -------------------------------------------------------------------------------- 1 | /usr/share/fonts/truetype/aenigma/edunline.ttf -------------------------------------------------------------------------------- /library/fonts/elsewhe2.ttf: -------------------------------------------------------------------------------- 1 | /usr/share/fonts/truetype/aenigma/elsewhe2.ttf -------------------------------------------------------------------------------- /library/fonts/elsewher.ttf: -------------------------------------------------------------------------------- 1 | /usr/share/fonts/truetype/aenigma/elsewher.ttf -------------------------------------------------------------------------------- /library/fonts/embosst1.ttf: -------------------------------------------------------------------------------- 1 | /usr/share/fonts/truetype/aenigma/embosst1.ttf -------------------------------------------------------------------------------- /library/fonts/embosst2.ttf: -------------------------------------------------------------------------------- 1 | /usr/share/fonts/truetype/aenigma/embosst2.ttf -------------------------------------------------------------------------------- /library/fonts/embosst3.ttf: -------------------------------------------------------------------------------- 1 | /usr/share/fonts/truetype/aenigma/embosst3.ttf -------------------------------------------------------------------------------- /library/fonts/encappln.ttf: -------------------------------------------------------------------------------- 1 | /usr/share/fonts/truetype/aenigma/encappln.ttf -------------------------------------------------------------------------------- /library/fonts/encapsul.ttf: -------------------------------------------------------------------------------- 1 | /usr/share/fonts/truetype/aenigma/encapsul.ttf -------------------------------------------------------------------------------- /library/fonts/entangle.ttf: -------------------------------------------------------------------------------- 1 | /usr/share/fonts/truetype/aenigma/entangle.ttf -------------------------------------------------------------------------------- /library/fonts/enthuse.ttf: -------------------------------------------------------------------------------- 1 | /usr/share/fonts/truetype/aenigma/enthuse.ttf -------------------------------------------------------------------------------- /library/fonts/enthuses.ttf: -------------------------------------------------------------------------------- 1 | /usr/share/fonts/truetype/aenigma/enthuses.ttf -------------------------------------------------------------------------------- /library/fonts/entlayra.ttf: -------------------------------------------------------------------------------- 1 | /usr/share/fonts/truetype/aenigma/entlayra.ttf -------------------------------------------------------------------------------- /library/fonts/entlayrb.ttf: -------------------------------------------------------------------------------- 1 | /usr/share/fonts/truetype/aenigma/entlayrb.ttf -------------------------------------------------------------------------------- /library/fonts/entplain.ttf: -------------------------------------------------------------------------------- 1 | /usr/share/fonts/truetype/aenigma/entplain.ttf -------------------------------------------------------------------------------- /library/fonts/euphor3d.ttf: -------------------------------------------------------------------------------- 1 | /usr/share/fonts/truetype/aenigma/euphor3d.ttf -------------------------------------------------------------------------------- /library/fonts/euphoric.ttf: -------------------------------------------------------------------------------- 1 | /usr/share/fonts/truetype/aenigma/euphoric.ttf -------------------------------------------------------------------------------- /library/fonts/exagger8.ttf: -------------------------------------------------------------------------------- 1 | /usr/share/fonts/truetype/aenigma/exagger8.ttf -------------------------------------------------------------------------------- /library/fonts/extracti.ttf: -------------------------------------------------------------------------------- 1 | /usr/share/fonts/truetype/aenigma/extracti.ttf -------------------------------------------------------------------------------- /library/fonts/falsepos.ttf: -------------------------------------------------------------------------------- 1 | /usr/share/fonts/truetype/aenigma/falsepos.ttf -------------------------------------------------------------------------------- /library/fonts/falsposr.ttf: -------------------------------------------------------------------------------- 1 | /usr/share/fonts/truetype/aenigma/falsposr.ttf -------------------------------------------------------------------------------- /library/fonts/fasciicr.ttf: -------------------------------------------------------------------------------- 1 | /usr/share/fonts/truetype/aenigma/fasciicr.ttf -------------------------------------------------------------------------------- /library/fonts/fasciisc.ttf: -------------------------------------------------------------------------------- 1 | /usr/share/fonts/truetype/aenigma/fasciisc.ttf -------------------------------------------------------------------------------- /library/fonts/fasciism.ttf: -------------------------------------------------------------------------------- 1 | /usr/share/fonts/truetype/aenigma/fasciism.ttf -------------------------------------------------------------------------------- /library/fonts/fasciitw.ttf: -------------------------------------------------------------------------------- 1 | /usr/share/fonts/truetype/aenigma/fasciitw.ttf -------------------------------------------------------------------------------- /library/fonts/fauxsnow.ttf: -------------------------------------------------------------------------------- 1 | /usr/share/fonts/truetype/aenigma/fauxsnow.ttf -------------------------------------------------------------------------------- /library/fonts/fbsbltc.ttf: -------------------------------------------------------------------------------- 1 | /usr/share/fonts/truetype/aenigma/fbsbltc.ttf -------------------------------------------------------------------------------- /library/fonts/fbsbltc2.ttf: -------------------------------------------------------------------------------- 1 | /usr/share/fonts/truetype/aenigma/fbsbltc2.ttf -------------------------------------------------------------------------------- /library/fonts/fidgety.ttf: -------------------------------------------------------------------------------- 1 | /usr/share/fonts/truetype/aenigma/fidgety.ttf -------------------------------------------------------------------------------- /library/fonts/flipside.ttf: -------------------------------------------------------------------------------- 1 | /usr/share/fonts/truetype/aenigma/flipside.ttf -------------------------------------------------------------------------------- /library/fonts/forcible.ttf: -------------------------------------------------------------------------------- 1 | /usr/share/fonts/truetype/aenigma/forcible.ttf -------------------------------------------------------------------------------- /library/fonts/freaktur.ttf: -------------------------------------------------------------------------------- 1 | /usr/share/fonts/truetype/aenigma/freaktur.ttf -------------------------------------------------------------------------------- /library/fonts/frizzed.ttf: -------------------------------------------------------------------------------- 1 | /usr/share/fonts/truetype/aenigma/frizzed.ttf -------------------------------------------------------------------------------- /library/fonts/fullcomp.ttf: -------------------------------------------------------------------------------- 1 | /usr/share/fonts/truetype/aenigma/fullcomp.ttf -------------------------------------------------------------------------------- /library/fonts/galapogo.ttf: -------------------------------------------------------------------------------- 1 | /usr/share/fonts/truetype/aenigma/galapogo.ttf -------------------------------------------------------------------------------- /library/fonts/galvaniz.ttf: -------------------------------------------------------------------------------- 1 | /usr/share/fonts/truetype/aenigma/galvaniz.ttf -------------------------------------------------------------------------------- /library/fonts/gaposiso.ttf: -------------------------------------------------------------------------------- 1 | /usr/share/fonts/truetype/aenigma/gaposiso.ttf -------------------------------------------------------------------------------- /library/fonts/gaposiss.ttf: -------------------------------------------------------------------------------- 1 | /usr/share/fonts/truetype/aenigma/gaposiss.ttf -------------------------------------------------------------------------------- /library/fonts/gasping.ttf: -------------------------------------------------------------------------------- 1 | /usr/share/fonts/truetype/aenigma/gasping.ttf -------------------------------------------------------------------------------- /library/fonts/gathrgap.ttf: -------------------------------------------------------------------------------- 1 | /usr/share/fonts/truetype/aenigma/gathrgap.ttf -------------------------------------------------------------------------------- /library/fonts/genotyph.ttf: -------------------------------------------------------------------------------- 1 | /usr/share/fonts/truetype/aenigma/genotyph.ttf -------------------------------------------------------------------------------- /library/fonts/genotyps.ttf: -------------------------------------------------------------------------------- 1 | /usr/share/fonts/truetype/aenigma/genotyps.ttf -------------------------------------------------------------------------------- /library/fonts/genotyrh.ttf: -------------------------------------------------------------------------------- 1 | /usr/share/fonts/truetype/aenigma/genotyrh.ttf -------------------------------------------------------------------------------- /library/fonts/genotyrs.ttf: -------------------------------------------------------------------------------- 1 | /usr/share/fonts/truetype/aenigma/genotyrs.ttf -------------------------------------------------------------------------------- /library/fonts/gesture.ttf: -------------------------------------------------------------------------------- 1 | /usr/share/fonts/truetype/aenigma/gesture.ttf -------------------------------------------------------------------------------- /library/fonts/gestures.ttf: -------------------------------------------------------------------------------- 1 | /usr/share/fonts/truetype/aenigma/gestures.ttf -------------------------------------------------------------------------------- /library/fonts/gesturet.ttf: -------------------------------------------------------------------------------- 1 | /usr/share/fonts/truetype/aenigma/gesturet.ttf -------------------------------------------------------------------------------- /library/fonts/gesturts.ttf: -------------------------------------------------------------------------------- 1 | /usr/share/fonts/truetype/aenigma/gesturts.ttf -------------------------------------------------------------------------------- /library/fonts/gosebmp2.ttf: -------------------------------------------------------------------------------- 1 | /usr/share/fonts/truetype/aenigma/gosebmp2.ttf -------------------------------------------------------------------------------- /library/fonts/gosebmps.ttf: -------------------------------------------------------------------------------- 1 | /usr/share/fonts/truetype/aenigma/gosebmps.ttf -------------------------------------------------------------------------------- /library/fonts/gr8higts.ttf: -------------------------------------------------------------------------------- 1 | /usr/share/fonts/truetype/aenigma/gr8higts.ttf -------------------------------------------------------------------------------- /library/fonts/granular.ttf: -------------------------------------------------------------------------------- 1 | /usr/share/fonts/truetype/aenigma/granular.ttf -------------------------------------------------------------------------------- /library/fonts/grapple.ttf: -------------------------------------------------------------------------------- 1 | /usr/share/fonts/truetype/aenigma/grapple.ttf -------------------------------------------------------------------------------- /library/fonts/graveyrd.ttf: -------------------------------------------------------------------------------- 1 | /usr/share/fonts/truetype/aenigma/graveyrd.ttf -------------------------------------------------------------------------------- /library/fonts/graviseg.ttf: -------------------------------------------------------------------------------- 1 | /usr/share/fonts/truetype/aenigma/graviseg.ttf -------------------------------------------------------------------------------- /library/fonts/gravitat.ttf: -------------------------------------------------------------------------------- 1 | /usr/share/fonts/truetype/aenigma/gravitat.ttf -------------------------------------------------------------------------------- /library/fonts/grotesq.ttf: -------------------------------------------------------------------------------- 1 | /usr/share/fonts/truetype/aenigma/grotesq.ttf -------------------------------------------------------------------------------- /library/fonts/grudge2.ttf: -------------------------------------------------------------------------------- 1 | /usr/share/fonts/truetype/aenigma/grudge2.ttf -------------------------------------------------------------------------------- /library/fonts/gyneric.ttf: -------------------------------------------------------------------------------- 1 | /usr/share/fonts/truetype/aenigma/gyneric.ttf -------------------------------------------------------------------------------- /library/fonts/gyneric3.ttf: -------------------------------------------------------------------------------- 1 | /usr/share/fonts/truetype/aenigma/gyneric3.ttf -------------------------------------------------------------------------------- /library/fonts/gyroresh.ttf: -------------------------------------------------------------------------------- 1 | /usr/share/fonts/truetype/aenigma/gyroresh.ttf -------------------------------------------------------------------------------- /library/fonts/gyrosesq.ttf: -------------------------------------------------------------------------------- 1 | /usr/share/fonts/truetype/aenigma/gyrosesq.ttf -------------------------------------------------------------------------------- /library/fonts/hackslsh.ttf: -------------------------------------------------------------------------------- 1 | /usr/share/fonts/truetype/aenigma/hackslsh.ttf -------------------------------------------------------------------------------- /library/fonts/hairball.ttf: -------------------------------------------------------------------------------- 1 | /usr/share/fonts/truetype/aenigma/hairball.ttf -------------------------------------------------------------------------------- /library/fonts/handmedo.ttf: -------------------------------------------------------------------------------- 1 | /usr/share/fonts/truetype/aenigma/handmedo.ttf -------------------------------------------------------------------------------- /library/fonts/handmeds.ttf: -------------------------------------------------------------------------------- 1 | /usr/share/fonts/truetype/aenigma/handmeds.ttf -------------------------------------------------------------------------------- /library/fonts/hdmaker.ttf: -------------------------------------------------------------------------------- 1 | /usr/share/fonts/truetype/aenigma/hdmaker.ttf -------------------------------------------------------------------------------- /library/fonts/hillock.ttf: -------------------------------------------------------------------------------- 1 | /usr/share/fonts/truetype/aenigma/hillock.ttf -------------------------------------------------------------------------------- /library/fonts/homespun.ttf: -------------------------------------------------------------------------------- 1 | /usr/share/fonts/truetype/aenigma/homespun.ttf -------------------------------------------------------------------------------- /library/fonts/hyperion.ttf: -------------------------------------------------------------------------------- 1 | /usr/share/fonts/truetype/aenigma/hyperion.ttf -------------------------------------------------------------------------------- /library/fonts/inertia.ttf: -------------------------------------------------------------------------------- 1 | /usr/share/fonts/truetype/aenigma/inertia.ttf -------------------------------------------------------------------------------- /library/fonts/inevitab.ttf: -------------------------------------------------------------------------------- 1 | /usr/share/fonts/truetype/aenigma/inevitab.ttf -------------------------------------------------------------------------------- /library/fonts/inkswipe.ttf: -------------------------------------------------------------------------------- 1 | /usr/share/fonts/truetype/aenigma/inkswipe.ttf -------------------------------------------------------------------------------- /library/fonts/inktank.ttf: -------------------------------------------------------------------------------- 1 | /usr/share/fonts/truetype/aenigma/inktank.ttf -------------------------------------------------------------------------------- /library/fonts/intersc.ttf: -------------------------------------------------------------------------------- 1 | /usr/share/fonts/truetype/aenigma/intersc.ttf -------------------------------------------------------------------------------- /library/fonts/intersec.ttf: -------------------------------------------------------------------------------- 1 | /usr/share/fonts/truetype/aenigma/intersec.ttf -------------------------------------------------------------------------------- /library/fonts/interso.ttf: -------------------------------------------------------------------------------- 1 | /usr/share/fonts/truetype/aenigma/interso.ttf -------------------------------------------------------------------------------- /library/fonts/irritate.ttf: -------------------------------------------------------------------------------- 1 | /usr/share/fonts/truetype/aenigma/irritate.ttf -------------------------------------------------------------------------------- /library/fonts/jaspers.ttf: -------------------------------------------------------------------------------- 1 | /usr/share/fonts/truetype/aenigma/jaspers.ttf -------------------------------------------------------------------------------- /library/fonts/jawbhard.ttf: -------------------------------------------------------------------------------- 1 | /usr/share/fonts/truetype/aenigma/jawbhard.ttf -------------------------------------------------------------------------------- /library/fonts/jawbreak.ttf: -------------------------------------------------------------------------------- 1 | /usr/share/fonts/truetype/aenigma/jawbreak.ttf -------------------------------------------------------------------------------- /library/fonts/jawbrko1.ttf: -------------------------------------------------------------------------------- 1 | /usr/share/fonts/truetype/aenigma/jawbrko1.ttf -------------------------------------------------------------------------------- /library/fonts/jawbrko2.ttf: -------------------------------------------------------------------------------- 1 | /usr/share/fonts/truetype/aenigma/jawbrko2.ttf -------------------------------------------------------------------------------- /library/fonts/jeopardi.ttf: -------------------------------------------------------------------------------- 1 | /usr/share/fonts/truetype/aenigma/jeopardi.ttf -------------------------------------------------------------------------------- /library/fonts/jeopardt.ttf: -------------------------------------------------------------------------------- 1 | /usr/share/fonts/truetype/aenigma/jeopardt.ttf -------------------------------------------------------------------------------- /library/fonts/jmacscrl.ttf: -------------------------------------------------------------------------------- 1 | /usr/share/fonts/truetype/aenigma/jmacscrl.ttf -------------------------------------------------------------------------------- /library/fonts/joltcaff.ttf: -------------------------------------------------------------------------------- 1 | /usr/share/fonts/truetype/aenigma/joltcaff.ttf -------------------------------------------------------------------------------- /library/fonts/jupiterc.ttf: -------------------------------------------------------------------------------- 1 | /usr/share/fonts/truetype/aenigma/jupiterc.ttf -------------------------------------------------------------------------------- /library/fonts/kaliberr.ttf: -------------------------------------------------------------------------------- 1 | /usr/share/fonts/truetype/aenigma/kaliberr.ttf -------------------------------------------------------------------------------- /library/fonts/kalibers.ttf: -------------------------------------------------------------------------------- 1 | /usr/share/fonts/truetype/aenigma/kalibers.ttf -------------------------------------------------------------------------------- /library/fonts/kaliberx.ttf: -------------------------------------------------------------------------------- 1 | /usr/share/fonts/truetype/aenigma/kaliberx.ttf -------------------------------------------------------------------------------- /library/fonts/kataacti.ttf: -------------------------------------------------------------------------------- 1 | /usr/share/fonts/truetype/aenigma/kataacti.ttf -------------------------------------------------------------------------------- /library/fonts/katainac.ttf: -------------------------------------------------------------------------------- 1 | /usr/share/fonts/truetype/aenigma/katainac.ttf -------------------------------------------------------------------------------- /library/fonts/keyrialt.ttf: -------------------------------------------------------------------------------- 1 | /usr/share/fonts/truetype/aenigma/keyrialt.ttf -------------------------------------------------------------------------------- /library/fonts/keyridge.ttf: -------------------------------------------------------------------------------- 1 | /usr/share/fonts/truetype/aenigma/keyridge.ttf -------------------------------------------------------------------------------- /library/fonts/kickflip.ttf: -------------------------------------------------------------------------------- 1 | /usr/share/fonts/truetype/aenigma/kickflip.ttf -------------------------------------------------------------------------------- /library/fonts/kinkaid.ttf: -------------------------------------------------------------------------------- 1 | /usr/share/fonts/truetype/aenigma/kinkaid.ttf -------------------------------------------------------------------------------- /library/fonts/kirbyss.ttf: -------------------------------------------------------------------------------- 1 | /usr/share/fonts/truetype/aenigma/kirbyss.ttf -------------------------------------------------------------------------------- /library/fonts/konecto1.ttf: -------------------------------------------------------------------------------- 1 | /usr/share/fonts/truetype/aenigma/konecto1.ttf -------------------------------------------------------------------------------- /library/fonts/konecto2.ttf: -------------------------------------------------------------------------------- 1 | /usr/share/fonts/truetype/aenigma/konecto2.ttf -------------------------------------------------------------------------------- /library/fonts/konector.ttf: -------------------------------------------------------------------------------- 1 | /usr/share/fonts/truetype/aenigma/konector.ttf -------------------------------------------------------------------------------- /library/fonts/koneerie.ttf: -------------------------------------------------------------------------------- 1 | /usr/share/fonts/truetype/aenigma/koneerie.ttf -------------------------------------------------------------------------------- /library/fonts/kurvatur.ttf: -------------------------------------------------------------------------------- 1 | /usr/share/fonts/truetype/aenigma/kurvatur.ttf -------------------------------------------------------------------------------- /library/fonts/lakeshor.ttf: -------------------------------------------------------------------------------- 1 | /usr/share/fonts/truetype/aenigma/lakeshor.ttf -------------------------------------------------------------------------------- /library/fonts/lamebrai.ttf: -------------------------------------------------------------------------------- 1 | /usr/share/fonts/truetype/aenigma/lamebrai.ttf -------------------------------------------------------------------------------- /library/fonts/larkspur.ttf: -------------------------------------------------------------------------------- 1 | /usr/share/fonts/truetype/aenigma/larkspur.ttf -------------------------------------------------------------------------------- /library/fonts/lethargi.ttf: -------------------------------------------------------------------------------- 1 | /usr/share/fonts/truetype/aenigma/lethargi.ttf -------------------------------------------------------------------------------- /library/fonts/licostrg.ttf: -------------------------------------------------------------------------------- 1 | /usr/share/fonts/truetype/aenigma/licostrg.ttf -------------------------------------------------------------------------------- /library/fonts/lightout.ttf: -------------------------------------------------------------------------------- 1 | /usr/share/fonts/truetype/aenigma/lightout.ttf -------------------------------------------------------------------------------- /library/fonts/lineding.ttf: -------------------------------------------------------------------------------- 1 | /usr/share/fonts/truetype/aenigma/lineding.ttf -------------------------------------------------------------------------------- /library/fonts/lowdown.ttf: -------------------------------------------------------------------------------- 1 | /usr/share/fonts/truetype/aenigma/lowdown.ttf -------------------------------------------------------------------------------- /library/fonts/lucid2o.ttf: -------------------------------------------------------------------------------- 1 | /usr/share/fonts/truetype/aenigma/lucid2o.ttf -------------------------------------------------------------------------------- /library/fonts/lyneous.ttf: -------------------------------------------------------------------------------- 1 | /usr/share/fonts/truetype/aenigma/lyneous.ttf -------------------------------------------------------------------------------- /library/fonts/lyneousl.ttf: -------------------------------------------------------------------------------- 1 | /usr/share/fonts/truetype/aenigma/lyneousl.ttf -------------------------------------------------------------------------------- /library/fonts/macropsi.ttf: -------------------------------------------------------------------------------- 1 | /usr/share/fonts/truetype/aenigma/macropsi.ttf -------------------------------------------------------------------------------- /library/fonts/madscrwl.ttf: -------------------------------------------------------------------------------- 1 | /usr/share/fonts/truetype/aenigma/madscrwl.ttf -------------------------------------------------------------------------------- /library/fonts/mima4x4i.ttf: -------------------------------------------------------------------------------- 1 | /usr/share/fonts/truetype/aenigma/mima4x4i.ttf -------------------------------------------------------------------------------- /library/fonts/mima4x4o.ttf: -------------------------------------------------------------------------------- 1 | /usr/share/fonts/truetype/aenigma/mima4x4o.ttf -------------------------------------------------------------------------------- /library/fonts/mimaalt1.ttf: -------------------------------------------------------------------------------- 1 | /usr/share/fonts/truetype/aenigma/mimaalt1.ttf -------------------------------------------------------------------------------- /library/fonts/mimaalt2.ttf: -------------------------------------------------------------------------------- 1 | /usr/share/fonts/truetype/aenigma/mimaalt2.ttf -------------------------------------------------------------------------------- /library/fonts/mimafuse.ttf: -------------------------------------------------------------------------------- 1 | /usr/share/fonts/truetype/aenigma/mimafuse.ttf -------------------------------------------------------------------------------- /library/fonts/minikott.ttf: -------------------------------------------------------------------------------- 1 | /usr/share/fonts/truetype/aenigma/minikott.ttf -------------------------------------------------------------------------------- /library/fonts/minikstt.ttf: -------------------------------------------------------------------------------- 1 | /usr/share/fonts/truetype/aenigma/minikstt.ttf -------------------------------------------------------------------------------- /library/fonts/mishmash.ttf: -------------------------------------------------------------------------------- 1 | /usr/share/fonts/truetype/aenigma/mishmash.ttf -------------------------------------------------------------------------------- /library/fonts/mobilize.ttf: -------------------------------------------------------------------------------- 1 | /usr/share/fonts/truetype/aenigma/mobilize.ttf -------------------------------------------------------------------------------- /library/fonts/monkphon.ttf: -------------------------------------------------------------------------------- 1 | /usr/share/fonts/truetype/aenigma/monkphon.ttf -------------------------------------------------------------------------------- /library/fonts/moronmis.ttf: -------------------------------------------------------------------------------- 1 | /usr/share/fonts/truetype/aenigma/moronmis.ttf -------------------------------------------------------------------------------- /library/fonts/mysteron.ttf: -------------------------------------------------------------------------------- 1 | /usr/share/fonts/truetype/aenigma/mysteron.ttf -------------------------------------------------------------------------------- /library/fonts/nanosecw.ttf: -------------------------------------------------------------------------------- 1 | /usr/share/fonts/truetype/aenigma/nanosecw.ttf -------------------------------------------------------------------------------- /library/fonts/naughts.ttf: -------------------------------------------------------------------------------- 1 | /usr/share/fonts/truetype/aenigma/naughts.ttf -------------------------------------------------------------------------------- /library/fonts/neuralol.ttf: -------------------------------------------------------------------------------- 1 | /usr/share/fonts/truetype/aenigma/neuralol.ttf -------------------------------------------------------------------------------- /library/fonts/nominal.ttf: -------------------------------------------------------------------------------- 1 | /usr/share/fonts/truetype/aenigma/nominal.ttf -------------------------------------------------------------------------------- /library/fonts/nostalgi.ttf: -------------------------------------------------------------------------------- 1 | /usr/share/fonts/truetype/aenigma/nostalgi.ttf -------------------------------------------------------------------------------- /library/fonts/nsecthck.ttf: -------------------------------------------------------------------------------- 1 | /usr/share/fonts/truetype/aenigma/nsecthck.ttf -------------------------------------------------------------------------------- /library/fonts/nsecthin.ttf: -------------------------------------------------------------------------------- 1 | /usr/share/fonts/truetype/aenigma/nsecthin.ttf -------------------------------------------------------------------------------- /library/fonts/nucleus.ttf: -------------------------------------------------------------------------------- 1 | /usr/share/fonts/truetype/aenigma/nucleus.ttf -------------------------------------------------------------------------------- /library/fonts/numskull.ttf: -------------------------------------------------------------------------------- 1 | /usr/share/fonts/truetype/aenigma/numskull.ttf -------------------------------------------------------------------------------- /library/fonts/nymonak.ttf: -------------------------------------------------------------------------------- 1 | /usr/share/fonts/truetype/aenigma/nymonak.ttf -------------------------------------------------------------------------------- /library/fonts/obloquyo.ttf: -------------------------------------------------------------------------------- 1 | /usr/share/fonts/truetype/aenigma/obloquyo.ttf -------------------------------------------------------------------------------- /library/fonts/obloquys.ttf: -------------------------------------------------------------------------------- 1 | /usr/share/fonts/truetype/aenigma/obloquys.ttf -------------------------------------------------------------------------------- /library/fonts/obstacle.ttf: -------------------------------------------------------------------------------- 1 | /usr/share/fonts/truetype/aenigma/obstacle.ttf -------------------------------------------------------------------------------- /library/fonts/obstacll.ttf: -------------------------------------------------------------------------------- 1 | /usr/share/fonts/truetype/aenigma/obstacll.ttf -------------------------------------------------------------------------------- /library/fonts/offkiltl.ttf: -------------------------------------------------------------------------------- 1 | /usr/share/fonts/truetype/aenigma/offkiltl.ttf -------------------------------------------------------------------------------- /library/fonts/offkiltr.ttf: -------------------------------------------------------------------------------- 1 | /usr/share/fonts/truetype/aenigma/offkiltr.ttf -------------------------------------------------------------------------------- /library/fonts/opiated.ttf: -------------------------------------------------------------------------------- 1 | /usr/share/fonts/truetype/aenigma/opiated.ttf -------------------------------------------------------------------------------- /library/fonts/orbicula.ttf: -------------------------------------------------------------------------------- 1 | /usr/share/fonts/truetype/aenigma/orbicula.ttf -------------------------------------------------------------------------------- /library/fonts/outersid.ttf: -------------------------------------------------------------------------------- 1 | /usr/share/fonts/truetype/aenigma/outersid.ttf -------------------------------------------------------------------------------- /library/fonts/overhead.ttf: -------------------------------------------------------------------------------- 1 | /usr/share/fonts/truetype/aenigma/overhead.ttf -------------------------------------------------------------------------------- /library/fonts/persuasi.ttf: -------------------------------------------------------------------------------- 1 | /usr/share/fonts/truetype/aenigma/persuasi.ttf -------------------------------------------------------------------------------- /library/fonts/phorfeir.ttf: -------------------------------------------------------------------------------- 1 | /usr/share/fonts/truetype/aenigma/phorfeir.ttf -------------------------------------------------------------------------------- /library/fonts/phorfeis.ttf: -------------------------------------------------------------------------------- 1 | /usr/share/fonts/truetype/aenigma/phorfeis.ttf -------------------------------------------------------------------------------- /library/fonts/pincers.ttf: -------------------------------------------------------------------------------- 1 | /usr/share/fonts/truetype/aenigma/pincers.ttf -------------------------------------------------------------------------------- /library/fonts/pindown.ttf: -------------------------------------------------------------------------------- 1 | /usr/share/fonts/truetype/aenigma/pindown.ttf -------------------------------------------------------------------------------- /library/fonts/pindownp.ttf: -------------------------------------------------------------------------------- 1 | /usr/share/fonts/truetype/aenigma/pindownp.ttf -------------------------------------------------------------------------------- /library/fonts/pindwnx.ttf: -------------------------------------------------------------------------------- 1 | /usr/share/fonts/truetype/aenigma/pindwnx.ttf -------------------------------------------------------------------------------- /library/fonts/pindwnxp.ttf: -------------------------------------------------------------------------------- 1 | /usr/share/fonts/truetype/aenigma/pindwnxp.ttf -------------------------------------------------------------------------------- /library/fonts/pixlkrud.ttf: -------------------------------------------------------------------------------- 1 | /usr/share/fonts/truetype/aenigma/pixlkrud.ttf -------------------------------------------------------------------------------- /library/fonts/plasdrip.ttf: -------------------------------------------------------------------------------- 1 | /usr/share/fonts/truetype/aenigma/plasdrip.ttf -------------------------------------------------------------------------------- /library/fonts/plasdrpe.ttf: -------------------------------------------------------------------------------- 1 | /usr/share/fonts/truetype/aenigma/plasdrpe.ttf -------------------------------------------------------------------------------- /library/fonts/pneumati.ttf: -------------------------------------------------------------------------------- 1 | /usr/share/fonts/truetype/aenigma/pneumati.ttf -------------------------------------------------------------------------------- /library/fonts/pneutall.ttf: -------------------------------------------------------------------------------- 1 | /usr/share/fonts/truetype/aenigma/pneutall.ttf -------------------------------------------------------------------------------- /library/fonts/pneuwide.ttf: -------------------------------------------------------------------------------- 1 | /usr/share/fonts/truetype/aenigma/pneuwide.ttf -------------------------------------------------------------------------------- /library/fonts/powdwrk5.ttf: -------------------------------------------------------------------------------- 1 | /usr/share/fonts/truetype/aenigma/powdwrk5.ttf -------------------------------------------------------------------------------- /library/fonts/qbicle1.ttf: -------------------------------------------------------------------------------- 1 | /usr/share/fonts/truetype/aenigma/qbicle1.ttf -------------------------------------------------------------------------------- /library/fonts/qbicle2.ttf: -------------------------------------------------------------------------------- 1 | /usr/share/fonts/truetype/aenigma/qbicle2.ttf -------------------------------------------------------------------------------- /library/fonts/qbicle3.ttf: -------------------------------------------------------------------------------- 1 | /usr/share/fonts/truetype/aenigma/qbicle3.ttf -------------------------------------------------------------------------------- /library/fonts/qbicle4.ttf: -------------------------------------------------------------------------------- 1 | /usr/share/fonts/truetype/aenigma/qbicle4.ttf -------------------------------------------------------------------------------- /library/fonts/qlumpysh.ttf: -------------------------------------------------------------------------------- 1 | /usr/share/fonts/truetype/aenigma/qlumpysh.ttf -------------------------------------------------------------------------------- /library/fonts/quacksal.ttf: -------------------------------------------------------------------------------- 1 | /usr/share/fonts/truetype/aenigma/quacksal.ttf -------------------------------------------------------------------------------- /library/fonts/quadrcal.ttf: -------------------------------------------------------------------------------- 1 | /usr/share/fonts/truetype/aenigma/quadrcal.ttf -------------------------------------------------------------------------------- /library/fonts/quadrtic.ttf: -------------------------------------------------------------------------------- 1 | /usr/share/fonts/truetype/aenigma/quadrtic.ttf -------------------------------------------------------------------------------- /library/fonts/quandary.ttf: -------------------------------------------------------------------------------- 1 | /usr/share/fonts/truetype/aenigma/quandary.ttf -------------------------------------------------------------------------------- /library/fonts/quantfh.ttf: -------------------------------------------------------------------------------- 1 | /usr/share/fonts/truetype/aenigma/quantfh.ttf -------------------------------------------------------------------------------- /library/fonts/quantflt.ttf: -------------------------------------------------------------------------------- 1 | /usr/share/fonts/truetype/aenigma/quantflt.ttf -------------------------------------------------------------------------------- /library/fonts/quantrh.ttf: -------------------------------------------------------------------------------- 1 | /usr/share/fonts/truetype/aenigma/quantrh.ttf -------------------------------------------------------------------------------- /library/fonts/quantrnd.ttf: -------------------------------------------------------------------------------- 1 | /usr/share/fonts/truetype/aenigma/quantrnd.ttf -------------------------------------------------------------------------------- /library/fonts/quanttap.ttf: -------------------------------------------------------------------------------- 1 | /usr/share/fonts/truetype/aenigma/quanttap.ttf -------------------------------------------------------------------------------- /library/fonts/quaranti.ttf: -------------------------------------------------------------------------------- 1 | /usr/share/fonts/truetype/aenigma/quaranti.ttf -------------------------------------------------------------------------------- /library/fonts/quarthck.ttf: -------------------------------------------------------------------------------- 1 | /usr/share/fonts/truetype/aenigma/quarthck.ttf -------------------------------------------------------------------------------- /library/fonts/quarthin.ttf: -------------------------------------------------------------------------------- 1 | /usr/share/fonts/truetype/aenigma/quarthin.ttf -------------------------------------------------------------------------------- /library/fonts/queasyol.ttf: -------------------------------------------------------------------------------- 1 | /usr/share/fonts/truetype/aenigma/queasyol.ttf -------------------------------------------------------------------------------- /library/fonts/quillexo.ttf: -------------------------------------------------------------------------------- 1 | /usr/share/fonts/truetype/aenigma/quillexo.ttf -------------------------------------------------------------------------------- /library/fonts/quillexs.ttf: -------------------------------------------------------------------------------- 1 | /usr/share/fonts/truetype/aenigma/quillexs.ttf -------------------------------------------------------------------------------- /library/fonts/rambling.ttf: -------------------------------------------------------------------------------- 1 | /usr/share/fonts/truetype/aenigma/rambling.ttf -------------------------------------------------------------------------------- /library/fonts/ravaged2.ttf: -------------------------------------------------------------------------------- 1 | /usr/share/fonts/truetype/aenigma/ravaged2.ttf -------------------------------------------------------------------------------- /library/fonts/ravcater.ttf: -------------------------------------------------------------------------------- 1 | /usr/share/fonts/truetype/aenigma/ravcater.ttf -------------------------------------------------------------------------------- /library/fonts/raydiat2.ttf: -------------------------------------------------------------------------------- 1 | /usr/share/fonts/truetype/aenigma/raydiat2.ttf -------------------------------------------------------------------------------- /library/fonts/reasonsh.ttf: -------------------------------------------------------------------------------- 1 | /usr/share/fonts/truetype/aenigma/reasonsh.ttf -------------------------------------------------------------------------------- /library/fonts/redundan.ttf: -------------------------------------------------------------------------------- 1 | /usr/share/fonts/truetype/aenigma/redundan.ttf -------------------------------------------------------------------------------- /library/fonts/regenera.ttf: -------------------------------------------------------------------------------- 1 | /usr/share/fonts/truetype/aenigma/regenera.ttf -------------------------------------------------------------------------------- /library/fonts/registry.ttf: -------------------------------------------------------------------------------- 1 | /usr/share/fonts/truetype/aenigma/registry.ttf -------------------------------------------------------------------------------- /library/fonts/rehearsc.ttf: -------------------------------------------------------------------------------- 1 | /usr/share/fonts/truetype/aenigma/rehearsc.ttf -------------------------------------------------------------------------------- /library/fonts/rehearso.ttf: -------------------------------------------------------------------------------- 1 | /usr/share/fonts/truetype/aenigma/rehearso.ttf -------------------------------------------------------------------------------- /library/fonts/rehearsp.ttf: -------------------------------------------------------------------------------- 1 | /usr/share/fonts/truetype/aenigma/rehearsp.ttf -------------------------------------------------------------------------------- /library/fonts/relapse.ttf: -------------------------------------------------------------------------------- 1 | /usr/share/fonts/truetype/aenigma/relapse.ttf -------------------------------------------------------------------------------- /library/fonts/revertro.ttf: -------------------------------------------------------------------------------- 1 | /usr/share/fonts/truetype/aenigma/revertro.ttf -------------------------------------------------------------------------------- /library/fonts/rotundo.ttf: -------------------------------------------------------------------------------- 1 | /usr/share/fonts/truetype/aenigma/rotundo.ttf -------------------------------------------------------------------------------- /library/fonts/roughday.ttf: -------------------------------------------------------------------------------- 1 | /usr/share/fonts/truetype/aenigma/roughday.ttf -------------------------------------------------------------------------------- /library/fonts/sarcasti.ttf: -------------------------------------------------------------------------------- 1 | /usr/share/fonts/truetype/aenigma/sarcasti.ttf -------------------------------------------------------------------------------- /library/fonts/saunder.ttf: -------------------------------------------------------------------------------- 1 | /usr/share/fonts/truetype/aenigma/saunder.ttf -------------------------------------------------------------------------------- /library/fonts/scalines.ttf: -------------------------------------------------------------------------------- 1 | /usr/share/fonts/truetype/aenigma/scalines.ttf -------------------------------------------------------------------------------- /library/fonts/sclnmaze.ttf: -------------------------------------------------------------------------------- 1 | /usr/share/fonts/truetype/aenigma/sclnmaze.ttf -------------------------------------------------------------------------------- /library/fonts/sequence.ttf: -------------------------------------------------------------------------------- 1 | /usr/share/fonts/truetype/aenigma/sequence.ttf -------------------------------------------------------------------------------- /library/fonts/setbackt.ttf: -------------------------------------------------------------------------------- 1 | /usr/share/fonts/truetype/aenigma/setbackt.ttf -------------------------------------------------------------------------------- /library/fonts/sideways.ttf: -------------------------------------------------------------------------------- 1 | /usr/share/fonts/truetype/aenigma/sideways.ttf -------------------------------------------------------------------------------- /library/fonts/simplto2.ttf: -------------------------------------------------------------------------------- 1 | /usr/share/fonts/truetype/aenigma/simplto2.ttf -------------------------------------------------------------------------------- /library/fonts/skullcap.ttf: -------------------------------------------------------------------------------- 1 | /usr/share/fonts/truetype/aenigma/skullcap.ttf -------------------------------------------------------------------------------- /library/fonts/slender.ttf: -------------------------------------------------------------------------------- 1 | /usr/share/fonts/truetype/aenigma/slender.ttf -------------------------------------------------------------------------------- /library/fonts/slenderw.ttf: -------------------------------------------------------------------------------- 1 | /usr/share/fonts/truetype/aenigma/slenderw.ttf -------------------------------------------------------------------------------- /library/fonts/slenmini.ttf: -------------------------------------------------------------------------------- 1 | /usr/share/fonts/truetype/aenigma/slenmini.ttf -------------------------------------------------------------------------------- /library/fonts/slenstub.ttf: -------------------------------------------------------------------------------- 1 | /usr/share/fonts/truetype/aenigma/slenstub.ttf -------------------------------------------------------------------------------- /library/fonts/snailets.ttf: -------------------------------------------------------------------------------- 1 | /usr/share/fonts/truetype/aenigma/snailets.ttf -------------------------------------------------------------------------------- /library/fonts/spaciouo.ttf: -------------------------------------------------------------------------------- 1 | /usr/share/fonts/truetype/aenigma/spaciouo.ttf -------------------------------------------------------------------------------- /library/fonts/spacious.ttf: -------------------------------------------------------------------------------- 1 | /usr/share/fonts/truetype/aenigma/spacious.ttf -------------------------------------------------------------------------------- /library/fonts/spastic2.ttf: -------------------------------------------------------------------------------- 1 | /usr/share/fonts/truetype/aenigma/spastic2.ttf -------------------------------------------------------------------------------- /library/fonts/spheroid.ttf: -------------------------------------------------------------------------------- 1 | /usr/share/fonts/truetype/aenigma/spheroid.ttf -------------------------------------------------------------------------------- /library/fonts/spheroix.ttf: -------------------------------------------------------------------------------- 1 | /usr/share/fonts/truetype/aenigma/spheroix.ttf -------------------------------------------------------------------------------- /library/fonts/sqroute.ttf: -------------------------------------------------------------------------------- 1 | /usr/share/fonts/truetype/aenigma/sqroute.ttf -------------------------------------------------------------------------------- /library/fonts/stagnati.ttf: -------------------------------------------------------------------------------- 1 | /usr/share/fonts/truetype/aenigma/stagnati.ttf -------------------------------------------------------------------------------- /library/fonts/supragc.ttf: -------------------------------------------------------------------------------- 1 | /usr/share/fonts/truetype/aenigma/supragc.ttf -------------------------------------------------------------------------------- /library/fonts/supragl.ttf: -------------------------------------------------------------------------------- 1 | /usr/share/fonts/truetype/aenigma/supragl.ttf -------------------------------------------------------------------------------- /library/fonts/symmetry.ttf: -------------------------------------------------------------------------------- 1 | /usr/share/fonts/truetype/aenigma/symmetry.ttf -------------------------------------------------------------------------------- /library/fonts/syndrome.ttf: -------------------------------------------------------------------------------- 1 | /usr/share/fonts/truetype/aenigma/syndrome.ttf -------------------------------------------------------------------------------- /library/fonts/syntheti.ttf: -------------------------------------------------------------------------------- 1 | /usr/share/fonts/truetype/aenigma/syntheti.ttf -------------------------------------------------------------------------------- /library/fonts/syracuse.ttf: -------------------------------------------------------------------------------- 1 | /usr/share/fonts/truetype/aenigma/syracuse.ttf -------------------------------------------------------------------------------- /library/fonts/tearful.ttf: -------------------------------------------------------------------------------- 1 | /usr/share/fonts/truetype/aenigma/tearful.ttf -------------------------------------------------------------------------------- /library/fonts/techniqo.ttf: -------------------------------------------------------------------------------- 1 | /usr/share/fonts/truetype/aenigma/techniqo.ttf -------------------------------------------------------------------------------- /library/fonts/techniqu.ttf: -------------------------------------------------------------------------------- 1 | /usr/share/fonts/truetype/aenigma/techniqu.ttf -------------------------------------------------------------------------------- /library/fonts/techover.ttf: -------------------------------------------------------------------------------- 1 | /usr/share/fonts/truetype/aenigma/techover.ttf -------------------------------------------------------------------------------- /library/fonts/telephas.ttf: -------------------------------------------------------------------------------- 1 | /usr/share/fonts/truetype/aenigma/telephas.ttf -------------------------------------------------------------------------------- /library/fonts/tsextolo.ttf: -------------------------------------------------------------------------------- 1 | /usr/share/fonts/truetype/aenigma/tsextolo.ttf -------------------------------------------------------------------------------- /library/fonts/tsextols.ttf: -------------------------------------------------------------------------------- 1 | /usr/share/fonts/truetype/aenigma/tsextols.ttf -------------------------------------------------------------------------------- /library/fonts/turmoil.ttf: -------------------------------------------------------------------------------- 1 | /usr/share/fonts/truetype/aenigma/turmoil.ttf -------------------------------------------------------------------------------- /library/fonts/ubiquity.ttf: -------------------------------------------------------------------------------- 1 | /usr/share/fonts/truetype/aenigma/ubiquity.ttf -------------------------------------------------------------------------------- /library/fonts/unanimo.ttf: -------------------------------------------------------------------------------- 1 | /usr/share/fonts/truetype/aenigma/unanimo.ttf -------------------------------------------------------------------------------- /library/fonts/unanimoi.ttf: -------------------------------------------------------------------------------- 1 | /usr/share/fonts/truetype/aenigma/unanimoi.ttf -------------------------------------------------------------------------------- /library/fonts/underscr.ttf: -------------------------------------------------------------------------------- 1 | /usr/share/fonts/truetype/aenigma/underscr.ttf -------------------------------------------------------------------------------- /library/fonts/underwhe.ttf: -------------------------------------------------------------------------------- 1 | /usr/share/fonts/truetype/aenigma/underwhe.ttf -------------------------------------------------------------------------------- /library/fonts/underwho.ttf: -------------------------------------------------------------------------------- 1 | /usr/share/fonts/truetype/aenigma/underwho.ttf -------------------------------------------------------------------------------- /library/fonts/undrscr2.ttf: -------------------------------------------------------------------------------- 1 | /usr/share/fonts/truetype/aenigma/undrscr2.ttf -------------------------------------------------------------------------------- /library/fonts/unlearn2.ttf: -------------------------------------------------------------------------------- 1 | /usr/share/fonts/truetype/aenigma/unlearn2.ttf -------------------------------------------------------------------------------- /library/fonts/unlearne.ttf: -------------------------------------------------------------------------------- 1 | /usr/share/fonts/truetype/aenigma/unlearne.ttf -------------------------------------------------------------------------------- /library/fonts/unrespon.ttf: -------------------------------------------------------------------------------- 1 | /usr/share/fonts/truetype/aenigma/unrespon.ttf -------------------------------------------------------------------------------- /library/fonts/upheavtt.ttf: -------------------------------------------------------------------------------- 1 | /usr/share/fonts/truetype/aenigma/upheavtt.ttf -------------------------------------------------------------------------------- /library/fonts/upraise.ttf: -------------------------------------------------------------------------------- 1 | /usr/share/fonts/truetype/aenigma/upraise.ttf -------------------------------------------------------------------------------- /library/fonts/urcompi.ttf: -------------------------------------------------------------------------------- 1 | /usr/share/fonts/truetype/aenigma/urcompi.ttf -------------------------------------------------------------------------------- /library/fonts/urcompo.ttf: -------------------------------------------------------------------------------- 1 | /usr/share/fonts/truetype/aenigma/urcompo.ttf -------------------------------------------------------------------------------- /library/fonts/vacantz.ttf: -------------------------------------------------------------------------------- 1 | /usr/share/fonts/truetype/aenigma/vacantz.ttf -------------------------------------------------------------------------------- /library/fonts/vanished.ttf: -------------------------------------------------------------------------------- 1 | /usr/share/fonts/truetype/aenigma/vanished.ttf -------------------------------------------------------------------------------- /library/fonts/vantage.ttf: -------------------------------------------------------------------------------- 1 | /usr/share/fonts/truetype/aenigma/vantage.ttf -------------------------------------------------------------------------------- /library/fonts/variance.ttf: -------------------------------------------------------------------------------- 1 | /usr/share/fonts/truetype/aenigma/variance.ttf -------------------------------------------------------------------------------- /library/fonts/vertigo.ttf: -------------------------------------------------------------------------------- 1 | /usr/share/fonts/truetype/aenigma/vertigo.ttf -------------------------------------------------------------------------------- /library/fonts/vertigo2.ttf: -------------------------------------------------------------------------------- 1 | /usr/share/fonts/truetype/aenigma/vertigo2.ttf -------------------------------------------------------------------------------- /library/fonts/vertigup.ttf: -------------------------------------------------------------------------------- 1 | /usr/share/fonts/truetype/aenigma/vertigup.ttf -------------------------------------------------------------------------------- /library/fonts/vertiup2.ttf: -------------------------------------------------------------------------------- 1 | /usr/share/fonts/truetype/aenigma/vertiup2.ttf -------------------------------------------------------------------------------- /library/fonts/vigilanc.ttf: -------------------------------------------------------------------------------- 1 | /usr/share/fonts/truetype/aenigma/vigilanc.ttf -------------------------------------------------------------------------------- /library/fonts/vindicti.ttf: -------------------------------------------------------------------------------- 1 | /usr/share/fonts/truetype/aenigma/vindicti.ttf -------------------------------------------------------------------------------- /library/fonts/visitor1.ttf: -------------------------------------------------------------------------------- 1 | /usr/share/fonts/truetype/aenigma/visitor1.ttf -------------------------------------------------------------------------------- /library/fonts/visitor2.ttf: -------------------------------------------------------------------------------- 1 | /usr/share/fonts/truetype/aenigma/visitor2.ttf -------------------------------------------------------------------------------- /library/fonts/volatil1.ttf: -------------------------------------------------------------------------------- 1 | /usr/share/fonts/truetype/aenigma/volatil1.ttf -------------------------------------------------------------------------------- /library/fonts/volatil2.ttf: -------------------------------------------------------------------------------- 1 | /usr/share/fonts/truetype/aenigma/volatil2.ttf -------------------------------------------------------------------------------- /library/fonts/wagerlos.ttf: -------------------------------------------------------------------------------- 1 | /usr/share/fonts/truetype/aenigma/wagerlos.ttf -------------------------------------------------------------------------------- /library/fonts/wagerwon.ttf: -------------------------------------------------------------------------------- 1 | /usr/share/fonts/truetype/aenigma/wagerwon.ttf -------------------------------------------------------------------------------- /library/fonts/wayward.ttf: -------------------------------------------------------------------------------- 1 | /usr/share/fonts/truetype/aenigma/wayward.ttf -------------------------------------------------------------------------------- /library/fonts/waywards.ttf: -------------------------------------------------------------------------------- 1 | /usr/share/fonts/truetype/aenigma/waywards.ttf -------------------------------------------------------------------------------- /library/fonts/weatherd.ttf: -------------------------------------------------------------------------------- 1 | /usr/share/fonts/truetype/aenigma/weatherd.ttf -------------------------------------------------------------------------------- /library/fonts/weathers.ttf: -------------------------------------------------------------------------------- 1 | /usr/share/fonts/truetype/aenigma/weathers.ttf -------------------------------------------------------------------------------- /library/fonts/whatever.ttf: -------------------------------------------------------------------------------- 1 | /usr/share/fonts/truetype/aenigma/whatever.ttf -------------------------------------------------------------------------------- /library/fonts/whipsnap.ttf: -------------------------------------------------------------------------------- 1 | /usr/share/fonts/truetype/aenigma/whipsnap.ttf -------------------------------------------------------------------------------- /library/fonts/wigsquig.ttf: -------------------------------------------------------------------------------- 1 | /usr/share/fonts/truetype/aenigma/wigsquig.ttf -------------------------------------------------------------------------------- /library/fonts/wincing.ttf: -------------------------------------------------------------------------------- 1 | /usr/share/fonts/truetype/aenigma/wincing.ttf -------------------------------------------------------------------------------- /library/fonts/withstan.ttf: -------------------------------------------------------------------------------- 1 | /usr/share/fonts/truetype/aenigma/withstan.ttf -------------------------------------------------------------------------------- /library/fonts/wyvernwi.ttf: -------------------------------------------------------------------------------- 1 | /usr/share/fonts/truetype/aenigma/wyvernwi.ttf -------------------------------------------------------------------------------- /library/fonts/wyvernww.ttf: -------------------------------------------------------------------------------- 1 | /usr/share/fonts/truetype/aenigma/wyvernww.ttf -------------------------------------------------------------------------------- /library/fonts/xeroxmal.ttf: -------------------------------------------------------------------------------- 1 | /usr/share/fonts/truetype/aenigma/xeroxmal.ttf -------------------------------------------------------------------------------- /library/fonts/xipital.ttf: -------------------------------------------------------------------------------- 1 | /usr/share/fonts/truetype/aenigma/xipital.ttf -------------------------------------------------------------------------------- /library/fonts/xmaslght.ttf: -------------------------------------------------------------------------------- 1 | /usr/share/fonts/truetype/aenigma/xmaslght.ttf -------------------------------------------------------------------------------- /library/fonts/xtrusion.ttf: -------------------------------------------------------------------------------- 1 | /usr/share/fonts/truetype/aenigma/xtrusion.ttf -------------------------------------------------------------------------------- /library/fonts/yearend.ttf: -------------------------------------------------------------------------------- 1 | /usr/share/fonts/truetype/aenigma/yearend.ttf -------------------------------------------------------------------------------- /library/fonts/yesterda.ttf: -------------------------------------------------------------------------------- 1 | /usr/share/fonts/truetype/aenigma/yesterda.ttf -------------------------------------------------------------------------------- /library/fonts/yielding.ttf: -------------------------------------------------------------------------------- 1 | /usr/share/fonts/truetype/aenigma/yielding.ttf -------------------------------------------------------------------------------- /library/fonts/yoshisst.ttf: -------------------------------------------------------------------------------- 1 | /usr/share/fonts/truetype/aenigma/yoshisst.ttf -------------------------------------------------------------------------------- /library/fonts/yourcomp.ttf: -------------------------------------------------------------------------------- 1 | /usr/share/fonts/truetype/aenigma/yourcomp.ttf -------------------------------------------------------------------------------- /library/fonts/zeldadxt.ttf: -------------------------------------------------------------------------------- 1 | /usr/share/fonts/truetype/aenigma/zeldadxt.ttf -------------------------------------------------------------------------------- /library/fonts/zephyrea.ttf: -------------------------------------------------------------------------------- 1 | /usr/share/fonts/truetype/aenigma/zephyrea.ttf -------------------------------------------------------------------------------- /library/fonts/zephyreg.ttf: -------------------------------------------------------------------------------- 1 | /usr/share/fonts/truetype/aenigma/zephyreg.ttf -------------------------------------------------------------------------------- /library/fonts/zerovelo.ttf: -------------------------------------------------------------------------------- 1 | /usr/share/fonts/truetype/aenigma/zerovelo.ttf -------------------------------------------------------------------------------- /library/fonts/zirccube.ttf: -------------------------------------------------------------------------------- 1 | /usr/share/fonts/truetype/aenigma/zirccube.ttf -------------------------------------------------------------------------------- /library/fonts/zirconia.ttf: -------------------------------------------------------------------------------- 1 | /usr/share/fonts/truetype/aenigma/zirconia.ttf -------------------------------------------------------------------------------- /library/fonts/zoetrope.ttf: -------------------------------------------------------------------------------- 1 | /usr/share/fonts/truetype/aenigma/zoetrope.ttf -------------------------------------------------------------------------------- /library/fonts/zurklezo.ttf: -------------------------------------------------------------------------------- 1 | /usr/share/fonts/truetype/aenigma/zurklezo.ttf -------------------------------------------------------------------------------- /library/fonts/zurklezs.ttf: -------------------------------------------------------------------------------- 1 | /usr/share/fonts/truetype/aenigma/zurklezs.ttf -------------------------------------------------------------------------------- /avio-legacy/avio-nogui: -------------------------------------------------------------------------------- 1 | #!/bin/sh 2 | 3 | export SDL_VIDEODRIVER=dummy 4 | 5 | ./avio 6 | -------------------------------------------------------------------------------- /images/startscreen.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ri0t/avio/HEAD/images/startscreen.png -------------------------------------------------------------------------------- /library/fonts/editundo.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ri0t/avio/HEAD/library/fonts/editundo.ttf -------------------------------------------------------------------------------- /images/startscreen_matelight.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ri0t/avio/HEAD/images/startscreen_matelight.png -------------------------------------------------------------------------------- /library/matelight/40x16/gif/34_5.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ri0t/avio/HEAD/library/matelight/40x16/gif/34_5.gif -------------------------------------------------------------------------------- /library/matelight/40x16/gif/6183.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ri0t/avio/HEAD/library/matelight/40x16/gif/6183.gif -------------------------------------------------------------------------------- /library/matelight/40x16/gif/Roots.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ri0t/avio/HEAD/library/matelight/40x16/gif/Roots.gif -------------------------------------------------------------------------------- /library/matelight/40x16/gif/Scene.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ri0t/avio/HEAD/library/matelight/40x16/gif/Scene.gif -------------------------------------------------------------------------------- /library/matelight/40x16/gif/laser2.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ri0t/avio/HEAD/library/matelight/40x16/gif/laser2.gif -------------------------------------------------------------------------------- /library/matelight/40x16/gif/ElectronSpin.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ri0t/avio/HEAD/library/matelight/40x16/gif/ElectronSpin.gif -------------------------------------------------------------------------------- /library/matelight/40x16/gif/OmegaPointWC.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ri0t/avio/HEAD/library/matelight/40x16/gif/OmegaPointWC.gif -------------------------------------------------------------------------------- /library/matelight/40x16/gif/Unbenannt-1.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ri0t/avio/HEAD/library/matelight/40x16/gif/Unbenannt-1.gif -------------------------------------------------------------------------------- /library/matelight/40x16/gif/FlowerOfLifeV2.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ri0t/avio/HEAD/library/matelight/40x16/gif/FlowerOfLifeV2.gif -------------------------------------------------------------------------------- /library/matelight/40x16/gif/RiemannFlower.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ri0t/avio/HEAD/library/matelight/40x16/gif/RiemannFlower.gif -------------------------------------------------------------------------------- /library/matelight/40x16/gif/SteinerChain2.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ri0t/avio/HEAD/library/matelight/40x16/gif/SteinerChain2.gif -------------------------------------------------------------------------------- /library/matelight/40x16/gif/SteinerOwl_oo.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ri0t/avio/HEAD/library/matelight/40x16/gif/SteinerOwl_oo.gif -------------------------------------------------------------------------------- /library/matelight/40x16/gif/Triangulation.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ri0t/avio/HEAD/library/matelight/40x16/gif/Triangulation.gif -------------------------------------------------------------------------------- /library/matelight/40x16/gif/Triangulation2.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ri0t/avio/HEAD/library/matelight/40x16/gif/Triangulation2.gif -------------------------------------------------------------------------------- /library/matelight/40x16/gif/QuantumTunnelv3_v23.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ri0t/avio/HEAD/library/matelight/40x16/gif/QuantumTunnelv3_v23.gif -------------------------------------------------------------------------------- /library/matelight/40x16/gif/RiemannRadio_I2_P+1.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ri0t/avio/HEAD/library/matelight/40x16/gif/RiemannRadio_I2_P+1.gif -------------------------------------------------------------------------------- /library/matelight/40x16/gif/EveryWallIsADoorFAniC.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ri0t/avio/HEAD/library/matelight/40x16/gif/EveryWallIsADoorFAniC.gif -------------------------------------------------------------------------------- /library/matelight/40x16/gif/FlowerOfLifeV2colalt.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ri0t/avio/HEAD/library/matelight/40x16/gif/FlowerOfLifeV2colalt.gif -------------------------------------------------------------------------------- /library/matelight/40x16/gif/IndrasNet_HiTech_gif1.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ri0t/avio/HEAD/library/matelight/40x16/gif/IndrasNet_HiTech_gif1.gif -------------------------------------------------------------------------------- /.idea/scopes/CORE.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | -------------------------------------------------------------------------------- /bitwig/00149_MusicForAGamepad/00149_MusicForAGamepad.bwproject: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ri0t/avio/HEAD/bitwig/00149_MusicForAGamepad/00149_MusicForAGamepad.bwproject -------------------------------------------------------------------------------- /library/matelight/40x16/gif/8a2bd6b580bc42799a6dd01c765acc8aed294516.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ri0t/avio/HEAD/library/matelight/40x16/gif/8a2bd6b580bc42799a6dd01c765acc8aed294516.gif -------------------------------------------------------------------------------- /.idea/vcs.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /requirements.txt: -------------------------------------------------------------------------------- 1 | # Basics 2 | #pygame==1.9.1release 3 | #screeninfo==0.3 4 | isomer>=1.0.10 5 | 6 | 7 | # Video & CV 8 | #cv2>=2.4.9 9 | imageio>=2.8.0 10 | 11 | 12 | # Audio 13 | -e git+https://github.com/belangeo/pyo.git#egg=pyo 14 | -------------------------------------------------------------------------------- /.idea/copyright/profiles_settings.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | # build data 2 | build 3 | dist 4 | docs/build 5 | __pycache__ 6 | *.egg* 7 | 8 | # cache 9 | *.pyc 10 | 11 | # Testing stuff 12 | .tox 13 | coverage 14 | .coverage 15 | 16 | # IntelliJ IDEA 17 | workspace.xml 18 | tasks.xml 19 | shelf 20 | -------------------------------------------------------------------------------- /.idea/modules.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /frontend/avio.config.js: -------------------------------------------------------------------------------- 1 | import icon from './assets/avio_menu_logo.svg'; 2 | 3 | export function routing($stateProvider) { 4 | 5 | $stateProvider 6 | .state('app.avio', { 7 | url: '/avio', 8 | template: '', 9 | label: 'AVIO', 10 | icon: icon 11 | }); 12 | } 13 | -------------------------------------------------------------------------------- /frontend/avio.module.js: -------------------------------------------------------------------------------- 1 | import angular from 'angular'; 2 | import uirouter from 'angular-ui-router'; 3 | 4 | import {routing} from './avio.config.js'; 5 | 6 | import './avio/avio.scss'; 7 | 8 | import aviocomponent from './avio/avio.js'; 9 | import template from './avio/avio.tpl.html'; 10 | 11 | export default angular 12 | .module('main.app.avio', [uirouter]) 13 | .config(routing) 14 | .component('avio', {controller: aviocomponent, template: template}) 15 | .name; 16 | -------------------------------------------------------------------------------- /.idea/misc.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 11 | -------------------------------------------------------------------------------- /.idea/pymidicontrol.iml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | -------------------------------------------------------------------------------- /.idea/compiler.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 22 | -------------------------------------------------------------------------------- /frontend/avio/avio.scss: -------------------------------------------------------------------------------- 1 | .avio-row { 2 | height:16px; 3 | min-height:16px; 4 | max-height:16px; 5 | margin: 0px; 6 | padding: 0px; 7 | } 8 | 9 | .avio-cell { 10 | width: 16px; 11 | min-width: 16px; 12 | max-width: 16px; 13 | display: inline-block; 14 | background: black; 15 | margin: 0px; 16 | padding: 0px; 17 | } 18 | 19 | .avio-small-row { 20 | height:12px; 21 | min-height:12px; 22 | max-height:12px; 23 | margin: 0px; 24 | padding: 0px; 25 | } 26 | 27 | .avio-small-cell { 28 | width: 12px; 29 | min-width: 12px; 30 | max-width: 12px; 31 | display: inline-block; 32 | background: black; 33 | margin: 0px; 34 | padding: 0px; 35 | } 36 | 37 | .avio-thumbnail img { 38 | width: 100%; 39 | image-rendering: pixelated; 40 | } 41 | 42 | .avio-mode_active { 43 | color: black; 44 | } 45 | 46 | .avio-modes span { 47 | color: gray; 48 | } 49 | -------------------------------------------------------------------------------- /.idea/copyright/GPLv3.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 6 | -------------------------------------------------------------------------------- /avio-legacy/splash.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env python 2 | 3 | import time 4 | import pygame 5 | import os 6 | import screeninfo 7 | 8 | splash_width = 555 9 | splash_height = 542 10 | duration = 10.0 11 | 12 | 13 | def splash_screen(): 14 | m = screeninfo.get_monitors() 15 | 16 | if len(m) > 1: 17 | # Find first screen and center splash there 18 | for screen in m: 19 | if screen.x == 0: 20 | x = (screen.width / 2) - (splash_width / 2.0) 21 | y = (screen.height / 2) - (splash_height / 2.0) 22 | os.environ['SDL_VIDEO_WINDOW_POS'] = str((x, y)) 23 | else: 24 | os.environ['SDL_VIDEO_CENTERED'] = '1' 25 | 26 | pygame.init() 27 | 28 | pygame.display.set_caption('AVIO Splashscreen') 29 | 30 | screen = pygame.display.set_mode((splash_width, splash_height), pygame.NOFRAME) 31 | # TODO: Get correct image path 32 | background_image = pygame.image.load('images/startscreen.png') 33 | screen.blit(background_image, (0, 0)) 34 | 35 | start = time.time() 36 | waited = 0 37 | clicked = False 38 | 39 | while waited < duration and not clicked: 40 | pygame.display.update() 41 | 42 | if pygame.event.peek(): 43 | for event in pygame.event.get(): 44 | if event.type in (pygame.KEYUP, pygame.MOUSEBUTTONDOWN): 45 | clicked = True 46 | waited = time.time() - start 47 | 48 | 49 | if __name__ == '__main__': 50 | splash_screen() 51 | -------------------------------------------------------------------------------- /avio-legacy/component.py: -------------------------------------------------------------------------------- 1 | from random import randint 2 | from circuits import Component 3 | from avio_core.logger import hfoslog 4 | import inspect 5 | import traceback 6 | from sys import exc_info 7 | 8 | 9 | class AVIOComponent(Component): 10 | debug = False 11 | 12 | names = [] 13 | 14 | def __init__(self, uniquename=None, *args, **kwargs): 15 | super(AVIOComponent, self).__init__(*args, **kwargs) 16 | 17 | if not uniquename: 18 | uniquename = self.name 19 | 20 | if uniquename in self.names: 21 | new_uniquename = uniquename 22 | while new_uniquename in self.names: 23 | new_uniquename = uniquename + str(randint(2 ** 16)) 24 | uniquename = new_uniquename 25 | 26 | self.uniquename = uniquename 27 | 28 | def log(self, *args, **kwargs): 29 | """Log a statement from this component""" 30 | 31 | func = inspect.currentframe().f_back.f_code 32 | # Dump the message + the name of this function to the log. 33 | 34 | if 'exc' in kwargs and kwargs['exc'] is True: 35 | exc_type, exc_obj, exc_tb = exc_info() 36 | line_no = exc_tb.tb_lineno 37 | # print('EXCEPTION DATA:', line_no, exc_type, exc_obj, exc_tb) 38 | args += traceback.extract_tb(exc_tb), 39 | else: 40 | line_no = func.co_firstlineno 41 | 42 | sourceloc = "[%.10s@%s:%i]" % ( 43 | func.co_name, 44 | func.co_filename, 45 | line_no 46 | ) 47 | hfoslog(sourceloc=sourceloc, emitter=self.uniquename, *args, **kwargs) 48 | -------------------------------------------------------------------------------- /avio-legacy/install: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | 3 | set -e 4 | 5 | DEBIAN_PKGS="python3.5 python3-pip virtualenv python3-pygame \ 6 | python3-numpy python3-opencv" 7 | 8 | if [ ${1^^} == "-Y" ] 9 | then 10 | AUTO=1 11 | else 12 | AUTO=0 13 | fi 14 | 15 | 16 | # Check if root 17 | if [ "$EUID" -ne 0 ] 18 | then 19 | echo "You need root privileges to install AVIO. Use su or sudo." 20 | exit 21 | fi 22 | 23 | echo "If you run into any trouble, please read the documentation at" 24 | echo -e "\nhttps://avio.readthedocs.io/en/latest/start/index.html\n" 25 | 26 | # Find our package manager 27 | if VERB="$( which apt-get )" 2> /dev/null; then 28 | echo "Proceeding with autodetected Debian based installation. Please be patient." 29 | 30 | if [ -n $AUTO ] 31 | then 32 | echo -e "\nAbout to install Debian packages: $DEBIAN_PKGS" 33 | echo -n "Ok? [Y/N] " 34 | read confirmation 35 | 36 | if [ ! ${confirmation^^} == 'Y' ] 37 | then 38 | exit 39 | fi 40 | echo "Installing" 41 | fi 42 | 43 | apt-get install -y $DEBIAN_PKGS &>> output.log 44 | 45 | virtualenv -p /usr/bin/python3.5 --system-site-packages venv &>> output.log 46 | source venv/bin/activate &>> output.log 47 | pip install -Ur requirements.txt &>> output.log 48 | python setup.py develop &>> output.log 49 | 50 | echo "All Done!" 51 | 52 | elif VERB="$( which yum )" 2> /dev/null; then 53 | echo "Modern Red Hat-based - NOT SUPPORTED YET" 54 | elif VERB="$( which portage )" 2> /dev/null; then 55 | echo "Gentoo-based - NOT SUPPORTED YET" 56 | elif VERB="$( which pacman )" 2> /dev/null; then 57 | echo "Arch-based - NOT SUPPORTED YET" 58 | else 59 | echo "Your distribution is not yet supported." >&2 60 | exit 1 61 | fi 62 | 63 | 64 | -------------------------------------------------------------------------------- /avio-legacy/avio_standalone: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env python 2 | 3 | __author__ = 'riot' 4 | 5 | from os import environ 6 | 7 | import argparse 8 | 9 | if __name__ == "__main__": 10 | parser = argparse.ArgumentParser() 11 | parser.add_argument("--debug", help="Show debug outout", 12 | action="store_true") 13 | parser.add_argument("--io", help="Show io options", action="store_true") 14 | parser.add_argument("--gui", help="Activate GUI (EXPERIMENTAL!)", 15 | action="store_true") 16 | parser.add_argument("--cam", help="Activate Camera", 17 | action="store_true") 18 | parser.add_argument("--nosplash", help="Disable splash screen", 19 | action="store_true") 20 | parser.add_argument("--midiout", help="Select MIDI output device id", 21 | type=int, default=None) 22 | parser.add_argument("--midiin", help="Select MIDI input device id", 23 | type=int, default=None) 24 | parser.add_argument("--width", help="Output renderer width", 25 | type=int, default=1920) 26 | parser.add_argument("--height", help="Output renderer height", 27 | type=int, default=1200) 28 | parser.add_argument("--host", help="Output matelight host(name)", 29 | type=str, default="matelight") 30 | parser.add_argument("--port", help="Output matelight port", 31 | type=int, default=1337) 32 | parser.add_argument("--program", 33 | help="Load named router program from " 34 | "~/.avio/router_*.json", 35 | type=str, 36 | default='default') 37 | 38 | 39 | args = parser.parse_args() 40 | 41 | if not args.gui: 42 | environ['SDL_VIDEODRIVER'] = 'dummy' 43 | print("Headless mode. To exit, hit CTRL-C.") 44 | 45 | from avio_core.app import Launch 46 | 47 | Launch(args) 48 | -------------------------------------------------------------------------------- /avio-legacy/camera.py: -------------------------------------------------------------------------------- 1 | import pygame 2 | import cv2 3 | import numpy 4 | 5 | from circuits import Timer, Event, handler, Worker, task 6 | 7 | from avio_core.component import AVIOComponent 8 | from avio_core.gui import GUIComponent, paintrequest 9 | 10 | 11 | # Camera events 12 | 13 | class cameraframe(Event): 14 | def __init__(self, frame, *args): 15 | super(cameraframe, self).__init__(*args) 16 | self.frame = frame 17 | 18 | def take_picture(cam): 19 | err, frame = cam.read() 20 | 21 | return frame 22 | 23 | 24 | class CVCamera(AVIOComponent): 25 | def __init__(self, device_id=0, targetresolution=(40, 16), *args, 26 | **kwargs): 27 | super(CVCamera, self).__init__(*args, **kwargs) 28 | self.targetresolution = targetresolution 29 | self.cam = cv2.VideoCapture(device_id) 30 | self.cam.set(3, 320) 31 | self.cam.set(4, 240) 32 | 33 | self.framerate = 20 / 1000.0 34 | 35 | self.recording = True 36 | 37 | self.worker = Worker(process=False, workers=1, 38 | channel="camera").register(self) 39 | 40 | self.cam_timer = Timer(2, Event.create('takepicture')).register( 41 | self) 42 | 43 | self.surface = pygame.Surface(targetresolution) 44 | self.log('Camera started') 45 | 46 | def takepicture(self): 47 | if self.recording: 48 | self.log('Taking a pic') 49 | self.fireEvent(task(take_picture, self.cam), 'camera') 50 | 51 | 52 | @handler('task_success', channel='camera') 53 | def task_success(self, event, call, result): 54 | frame = result 55 | 56 | if frame is None: 57 | self.log("Oh, no camera attached! Change this and rerun!") 58 | self.cam_timer.unregister() 59 | 60 | return 61 | 62 | newframe = numpy.rot90(frame) 63 | #newframe = cv2.resize(frame, self.targetresolution) 64 | surfarr = pygame.surfarray.make_surface(newframe) 65 | srf = pygame.transform.scale(surfarr, self.targetresolution) 66 | 67 | self.fireEvent(cameraframe(srf)) 68 | self.fireEvent(Event.create('takepicture')) 69 | 70 | 71 | class CameraDisplay(GUIComponent): 72 | def cameraframe(self, event): 73 | #self.log('New camera frame received:', event) 74 | self.fireEvent(paintrequest(event.frame, self.x, self.y), 'gui') 75 | -------------------------------------------------------------------------------- /avio/trigger.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env python 2 | # -*- coding: UTF-8 -*- 3 | 4 | # AVIO - The Python Audio Video Input Output Suite 5 | # ================================================ 6 | # Copyright (C) 2015-2020 riot 7 | # 8 | # This program is free software: you can redistribute it and/or modify 9 | # it under the terms of the GNU General Public License as published by 10 | # the Free Software Foundation, either version 3 of the License, or 11 | # (at your option) any later version. 12 | # 13 | # This program is distributed in the hope that it will be useful, 14 | # but WITHOUT ANY WARRANTY; without even the implied warranty of 15 | # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 16 | # GNU General Public License for more details. 17 | # 18 | # You should have received a copy of the GNU General Public License 19 | # along with this program. If not, see . 20 | 21 | import pygame 22 | 23 | from circuits import Timer, Event 24 | from isomer.component import ConfigurableComponent, handler 25 | from isomer.logger import debug 26 | 27 | 28 | class Trigger(ConfigurableComponent): 29 | """Listens for configurable joystick/gamepad button combos and triggers 30 | preconfigured events""" 31 | 32 | channel = "AVIO" 33 | 34 | configprops = { 35 | 'triggers': { 36 | 'type': 'array', 37 | 'default': [{'button': 'X', 'event': 'tap'}], 38 | 'items': { 39 | 'type': 'object', 40 | 'properties': { 41 | 'button': { 42 | 'type': 'string', 43 | 'maxLength': 1, 44 | 'minLength': 1, 45 | 'description': 46 | 'X = X key, O = O key, A = Triangle key, S = Square key'}, 47 | 'event': {'type': 'string'} 48 | } 49 | } 50 | } 51 | } 52 | 53 | def __init__(self, *args): 54 | super(Trigger, self).__init__("TRIGGER", args) 55 | self.log("Initializing Trigger controller") 56 | 57 | self.triggers = {} 58 | self._build_combo_lookup() 59 | 60 | @handler("reload_configuration", channel="isomer-web") 61 | def reload_configuration(self, event): 62 | """Reload the current configuration and set up everything depending on it""" 63 | 64 | super(Trigger, self).reload_configuration(event) 65 | if event.target != self.uniquename: 66 | return 67 | 68 | self._build_combo_lookup() 69 | 70 | def _build_combo_lookup(self): 71 | self.log("Updating trigger lookup") 72 | self.triggers = {} 73 | for item in self.config.triggers: 74 | self.triggers[item['button']] = item['event'] 75 | 76 | @handler("joystickchange") 77 | def joystickchange(self, event): 78 | if event.input.type != pygame.JOYBUTTONDOWN: 79 | return 80 | 81 | button = event.input.button 82 | key = "" 83 | 84 | if button == 0: 85 | key = "X" 86 | elif button == 1: 87 | key = "O" 88 | elif button == 2: 89 | key = "A" 90 | elif button == 3: 91 | key = "S" 92 | 93 | if key in self.triggers: 94 | self.log("Firing trigger:", key, lvl=debug) 95 | self.fireEvent(Event.create(self.triggers[key])) 96 | -------------------------------------------------------------------------------- /README.rst: -------------------------------------------------------------------------------- 1 | AVIO 2 | ==== 3 | 4 | The AVIO Suite is an experimental approach to the concept of a live stage 5 | performance. AVIO stands for "Audio Visual Input Output" and the suite is 6 | a component (event) based agglomeration of tools to work with Controller, 7 | Midi, Audio and Visual data. 8 | 9 | 10 | Installation 11 | ============ 12 | 13 | Since, AVIO is a plugin collection for Isomer, you'll need a working Isomer 14 | instance first. 15 | 16 | Isomer 17 | ------ 18 | 19 | To install Isomer and create an instance to work with AVIO, follow the 20 | `quick start tutorial `_. 21 | 22 | The quickest way to get AVIO is through Isomer's builtin store system, but that 23 | is not yet completely done, so right now, you'll have to do that manually: 24 | 25 | Dependencies 26 | ------------ 27 | 28 | Before installing AVIO, you should furthermore have these packages installed: 29 | 30 | * liblo-dev 31 | * libportmidi-dev 32 | * libsndfile1-dev 33 | * python3-pygame 34 | * python3-numpy 35 | * python3-opencv 36 | 37 | Install AVIO 38 | ------------ 39 | 40 | Once you have set up Isomer correctly use this command line to install it into your 41 | default instance/environment: 42 | 43 | .. code-block:: bash 44 | 45 | iso -e current instance install-module -i -s github https://github.com/ri0t/avio 46 | 47 | This will (currently) require a frontend rebuild: 48 | 49 | .. code-block:: bash 50 | 51 | iso -e current environment install-frontend 52 | 53 | You can use `-i INSTANCENAME` and `-e ENVIRONMENTNAME` to specify which instance should 54 | be used. 55 | 56 | Running 57 | ======= 58 | 59 | Restart your Isomer instance and log in to it, to access the AVIO modules. 60 | 61 | Controlling 62 | =========== 63 | 64 | MIDI 65 | ---- 66 | 67 | To actually use MIDI data e.g. in Bitwig Studio, you may need to 68 | load the alsa midi loopback module: 69 | 70 | .. code-block:: bash 71 | 72 | sudo modprobe snd_virmidi 73 | 74 | This should enable four virtual loopback devices. With a tool like 75 | patchage, you can now route AVIO's output midi channel to a loopback 76 | device, which you can select as MIDI input in BWS. 77 | 78 | Joysticks & Gamepads 79 | -------------------- 80 | 81 | tbd 82 | 83 | User Interface 84 | -------------- 85 | 86 | tbd 87 | 88 | Development 89 | =========== 90 | 91 | First, you'll need `Isomer set up for development 92 | `_. 93 | 94 | Then, manually grab AVIO: 95 | 96 | .. code-block:: bash 97 | 98 | git clone https://github.com/ri0t/avio avio 99 | 100 | Then run (probably best done in your Isomer virtual environment): 101 | 102 | .. code-block:: bash 103 | 104 | cd avio 105 | python setup.py develop 106 | 107 | 108 | 109 | License 110 | ======= 111 | 112 | Copyright (C) 2015-2020 riot 113 | 114 | This program is free software: you can redistribute it and/or modify 115 | it under the terms of the GNU General Public License as published by 116 | the Free Software Foundation, either version 3 of the License, or 117 | (at your option) any later version. 118 | 119 | This program is distributed in the hope that it will be useful, 120 | but WITHOUT ANY WARRANTY; without even the implied warranty of 121 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 122 | GNU General Public License for more details. 123 | 124 | You should have received a copy of the GNU General Public License 125 | along with this program. If not, see . 126 | 127 | 3rd Party Licenses 128 | ================== 129 | 130 | Includes a few fonts from the ttf-aenigma pack, a great font pack 131 | sporting 465 free TrueType fonts by Brian Ken. 132 | -------------------------------------------------------------------------------- /avio/events.py: -------------------------------------------------------------------------------- 1 | # AVIO - The Python Audio Video Input Output Suite 2 | # ================================================ 3 | # Copyright (C) 2015 riot 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 | __author__ = 'riot' 19 | 20 | import pygame 21 | from circuits import Event 22 | 23 | 24 | # App/GUI management events 25 | 26 | class guiresize(Event): 27 | def __init__(self, width, height, *args): 28 | super(guiresize, self).__init__(*args) 29 | self.height = height 30 | self.width = width 31 | 32 | 33 | class guiquit(Event): 34 | def __init__(self, reason, *args): 35 | super(guiquit, self).__init__(*args) 36 | self.reason = reason 37 | 38 | 39 | # Control events 40 | 41 | class controlinput(Event): 42 | def __init__(self, inputevent, *args): 43 | super(controlinput, self).__init__(*args) 44 | self.input = inputevent 45 | 46 | 47 | class joystickchange(controlinput): 48 | def __init__(self, *args): 49 | super(joystickchange, self).__init__(*args) 50 | 51 | 52 | # Midi events 53 | 54 | class resetcclock(Event): 55 | pass 56 | 57 | 58 | class midicc(Event): 59 | def __init__(self, cc, data=None, force=False, *args): 60 | super(midicc, self).__init__(*args) 61 | 62 | self.cc = cc 63 | self.data = data 64 | self.force = force 65 | 66 | 67 | class midiinput(Event): 68 | def __init__(self, data, *args): 69 | super(midiinput, self).__init__(*args) 70 | self.code = data[0][0] 71 | self.data = data 72 | 73 | 74 | class midinote(Event): 75 | def __init__(self, note, velocity, midi_channel, length=None, *args): 76 | super(midinote, self).__init__(*args) 77 | self.note = note 78 | self.velocity = velocity 79 | self.midi_channel = midi_channel 80 | self.length = length 81 | self.start = 0 82 | 83 | 84 | # Router events 85 | 86 | class loadscene(Event): 87 | def __init__(self, scene, *args): 88 | super(loadscene, self).__init__(*args) 89 | self.scene = scene 90 | 91 | 92 | class loadprogram(Event): 93 | def __init__(self, program, *args): 94 | super(loadprogram, self).__init__(*args) 95 | self.program = program 96 | 97 | 98 | class saveprogram(loadprogram): 99 | pass 100 | 101 | 102 | # Keyboard 103 | 104 | class keypress(Event): 105 | def __init__(self, ev, *args): 106 | super(keypress, self).__init__(*args) 107 | self.ev = ev 108 | 109 | def __repr__(self): 110 | 111 | if len(self.channels) > 1: 112 | channels = repr(self.channels) 113 | elif len(self.channels) == 1: 114 | channels = str(self.channels[0]) 115 | else: 116 | channels = "" 117 | 118 | data = "%s %s" % ( 119 | ", ".join(repr(arg) for arg in self.args), 120 | ", ".join("%s=%s" % (k, repr(v)) for k, v in self.kwargs.items()) 121 | ) 122 | 123 | key = pygame.key.name(self.ev.key) 124 | ev = self.ev 125 | 126 | return "<%s_%s_%s[%s] (%s)>" % (self.name, key, ev, channels, data) 127 | -------------------------------------------------------------------------------- /avio/bpm.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env python 2 | # -*- coding: UTF-8 -*- 3 | 4 | # AVIO - The Python Audio Video Input Output Suite 5 | # ================================================ 6 | # Copyright (C) 2015-2020 riot 7 | # 8 | # This program is free software: you can redistribute it and/or modify 9 | # it under the terms of the GNU General Public License as published by 10 | # the Free Software Foundation, either version 3 of the License, or 11 | # (at your option) any later version. 12 | # 13 | # This program is distributed in the hope that it will be useful, 14 | # but WITHOUT ANY WARRANTY; without even the implied warranty of 15 | # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 16 | # GNU General Public License for more details. 17 | # 18 | # You should have received a copy of the GNU General Public License 19 | # along with this program. If not, see . 20 | 21 | from datetime import datetime 22 | 23 | from circuits import Event 24 | from isomer.component import ConfigurableComponent 25 | 26 | 27 | class bpm_tap(Event): 28 | pass 29 | 30 | 31 | class BPM(ConfigurableComponent): 32 | """Listens for configurable joystick/gamepad button combos and triggers 33 | preconfigured events""" 34 | 35 | channel = "AVIO" 36 | 37 | configprops = { 38 | } 39 | 40 | def __init__(self, *args): 41 | super(BPM, self).__init__("BPM", args) 42 | self.log("Initializing BPM controller") 43 | 44 | self.timer = None 45 | 46 | self.offset = 0 47 | self.bpm = 0 48 | # Historic reference over taps 49 | self.taps = [] 50 | # Minimum tap count 51 | self.tapcount = 2 52 | # Factor oldtaptimeout gets multiplied with, when we're still accurate 53 | self.approximationprecision = 2 54 | self.oldtaptimeout = 5 55 | 56 | def tap(self, event): 57 | self.log("TAP") 58 | 59 | bpm = 0 60 | 61 | self.taps.append(datetime.now()) 62 | 63 | # first: Weed out old data and analyze precision of last taps 64 | latest = self.taps[-1] 65 | if len(self.taps) > 1: # we have enough keys for a better approximation 66 | secondlatest = self.taps[-2] 67 | 68 | delta = latest - secondlatest 69 | deltamicroseconds = delta.seconds * 1000000 + delta.microseconds 70 | 71 | proposedbpm = 60000000.0 / deltamicroseconds 72 | 73 | if (proposedbpm - (proposedbpm * 0.1) < bpm) and \ 74 | (proposedbpm + (proposedbpm * 0.1) > bpm): 75 | # we're in range (+- 10%) 76 | self.oldtaptimeout *= self.approximationprecision 77 | 78 | # second: weed out those old keytaps. They sure do not form the beat anymore. 79 | while ((latest - self.taps[0]).seconds > self.oldtaptimeout) and len( 80 | self.taps) > 0: 81 | del self.taps[0] 82 | 83 | # if we still have enough of them keytaps: go on, get some bpm 84 | if len(self.taps) > self.tapcount: 85 | 86 | # third: calculate average time-delta 87 | count = 0 88 | oldtap = self.taps[0] 89 | deltasum = 0 90 | for tap in self.taps[1:]: 91 | delta = tap - oldtap 92 | deltamicrosecs = delta.seconds * 1000000 + delta.microseconds 93 | deltasum += deltamicrosecs 94 | oldtap = tap 95 | count += 1 96 | 97 | avgdelta = deltasum / count 98 | 99 | # third: calculate the current bpm and set a reasonable oldtaptimeout 100 | bpm = 60000000.0 / avgdelta 101 | 102 | oldtaptimeout = pow((60 / bpm) + 1, 2) 103 | 104 | self.log("BPM:", bpm, len(self.taps)) 105 | else: 106 | self.log("TAP SOME MORE!") 107 | -------------------------------------------------------------------------------- /avio/combotrigger.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env python 2 | # -*- coding: UTF-8 -*- 3 | 4 | # AVIO - The Python Audio Video Input Output Suite 5 | # ================================================ 6 | # Copyright (C) 2015-2020 riot 7 | # 8 | # This program is free software: you can redistribute it and/or modify 9 | # it under the terms of the GNU General Public License as published by 10 | # the Free Software Foundation, either version 3 of the License, or 11 | # (at your option) any later version. 12 | # 13 | # This program is distributed in the hope that it will be useful, 14 | # but WITHOUT ANY WARRANTY; without even the implied warranty of 15 | # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 16 | # GNU General Public License for more details. 17 | # 18 | # You should have received a copy of the GNU General Public License 19 | # along with this program. If not, see . 20 | 21 | import pygame 22 | 23 | from circuits import Timer, Event 24 | from isomer.component import ConfigurableComponent, handler 25 | from isomer.logger import debug 26 | 27 | 28 | class reset_combo_trigger(Event): 29 | pass 30 | 31 | 32 | class ComboTrigger(ConfigurableComponent): 33 | """Listens for configurable joystick/gamepad button combos and triggers 34 | preconfigured events""" 35 | 36 | channel = "AVIO" 37 | 38 | configprops = { 39 | 'combos': { 40 | 'type': 'array', 41 | 'default': [], 42 | 'items': { 43 | 'type': 'object', 44 | 'properties': { 45 | 'combo': { 46 | 'type': 'string', 47 | 'description': 48 | 'X = X key, O = O key, A = Triangle key, S = Square key'}, 49 | 'event': {'type': 'string'} 50 | } 51 | } 52 | }, 53 | 'timeout': {'type': 'number', 'default': 1.5} 54 | } 55 | 56 | def __init__(self, *args): 57 | super(ComboTrigger, self).__init__("COMBOTRIGGER", args) 58 | self.log("Initializing ComboTrigger controller") 59 | 60 | self.timer = None 61 | self.input = "" 62 | 63 | self._build_combo_lookup() 64 | 65 | @handler("reload_configuration", channel="isomer-web") 66 | def reload_configuration(self, event): 67 | """Reload the current configuration and set up everything depending on it""" 68 | 69 | super(ComboTrigger, self).reload_configuration(event) 70 | if event.target != self.uniquename: 71 | return 72 | 73 | self._build_combo_lookup() 74 | 75 | def _build_combo_lookup(self): 76 | self.log("Updating trigger lookup") 77 | self.combos = {} 78 | for item in self.config.combos: 79 | self.combos[item['combo']] = item['event'] 80 | 81 | @handler("reset_combo_trigger") 82 | def reset(self, event): 83 | self.log("Resetting combo trigger. Input so far:", self.input, lvl=debug) 84 | self.input = "" 85 | 86 | @handler("joystickchange") 87 | def joystickchange(self, event): 88 | if event.input.type != pygame.JOYBUTTONUP: 89 | return 90 | # self.log(event.input, pretty=True) 91 | 92 | button = event.input.button 93 | key = "" 94 | 95 | if button == 0: 96 | key = "X" 97 | elif button == 1: 98 | key = "O" 99 | elif button == 2: 100 | key = "A" 101 | elif button == 3: 102 | key = "S" 103 | self.input += key 104 | 105 | if self.timer is not None: 106 | self.timer.unregister() 107 | 108 | if self.input in self.combos: 109 | self.log("Firing combo event for combo", self.input, lvl=debug) 110 | self.fireEvent(Event.create(self.combos[self.input])) 111 | self.input = "" 112 | else: 113 | self.timer = Timer(self.config.timeout, reset_combo_trigger()).register(self) 114 | -------------------------------------------------------------------------------- /setup.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env python 2 | # -*- coding: UTF-8 -*- 3 | 4 | # Isomer - The distributed application framework 5 | # ============================================== 6 | # Copyright (C) 2011-2019 Heiko 'riot' Weinen and others. 7 | # 8 | # This program is free software: you can redistribute it and/or modify 9 | # it under the terms of the GNU Affero General Public License as published by 10 | # the Free Software Foundation, either version 3 of the License, or 11 | # (at your option) any later version. 12 | # 13 | # This program is distributed in the hope that it will be useful, 14 | # but WITHOUT ANY WARRANTY; without even the implied warranty of 15 | # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 16 | # GNU Affero General Public License for more details. 17 | # 18 | # You should have received a copy of the GNU Affero General Public License 19 | # along with this program. If not, see . 20 | 21 | __author__ = "Heiko 'riot' Weinen" 22 | __license__ = "AGPLv3" 23 | 24 | from setuptools import setup, find_packages 25 | 26 | setup( 27 | name="avio", 28 | version="2.0.0", 29 | description="AVIO is a collection of general purpose audio/video/midi/controller " 30 | "components for Isomer", 31 | author="Heiko 'riot' Weinen", 32 | author_email="riot@c-base.org", 33 | url="https://github.com/ri0t/avio", 34 | license="GNU Affero General Public License v3", 35 | classifiers=[ 36 | 'Development Status :: 2 - Pre-Alpha', 37 | 'Environment :: Web Environment', 38 | # 'Framework :: Isomer :: 1', 39 | 'License :: OSI Approved :: GNU Affero General Public License v3 or later (AGPLv3+)', 40 | 'Operating System :: POSIX :: Linux', 41 | 'Programming Language :: Python :: 3', 42 | 'Programming Language :: Python :: 3 :: Only', 43 | 'Programming Language :: Python :: 3.5', 44 | 'Programming Language :: Python :: 3.6', 45 | 'Programming Language :: Python :: 3.7', 46 | 'Programming Language :: Python :: 3.8', 47 | 'Programming Language :: Python :: Implementation :: PyPy', 48 | 'Programming Language :: Python :: Implementation :: CPython', 49 | 'Topic :: Multimedia', 50 | 'Topic :: Multimedia :: Graphics', 51 | 'Topic :: Multimedia :: Graphics :: Capture', 52 | 'Topic :: Multimedia :: Graphics :: Graphics Conversion', 53 | 'Topic :: Multimedia :: Sound/Audio', 54 | 'Topic :: Multimedia :: Sound/Audio :: Analysis', 55 | 'Topic :: Multimedia :: Sound/Audio :: Capture/Recording', 56 | 'Topic :: Multimedia :: Sound/Audio :: Conversion', 57 | 'Topic :: Multimedia :: Sound/Audio :: MIDI', 58 | 'Topic :: Multimedia :: Sound/Audio :: Mixers', 59 | 'Topic :: Multimedia :: Sound/Audio :: Players', 60 | 'Topic :: Multimedia :: Sound/Audio :: Sound Synthesis', 61 | 'Topic :: Multimedia :: Video', 62 | 'Topic :: Multimedia :: Video :: Capture', 63 | 'Topic :: Multimedia :: Video :: Conversion', 64 | 'Topic :: Multimedia :: Video :: Display' 65 | ], 66 | packages=find_packages(), 67 | package_data={'avio': ['../docs/*', '../frontend/*']}, 68 | include_package_data=True, 69 | long_description=""""AVIO 70 | ==== 71 | 72 | AVIO stands for Audio Video Input Output. 73 | 74 | This software package contains general purpose modules for working (and playing!) 75 | with mixed media data. It strives to cover most of the available dataformats and their 76 | various input and output methods. 77 | For example, there is a HID (Joysticks, Gamepads, etc) input component that you can wire 78 | up to transmit its data to a MIDI output to generate general MIDI modulation data or 79 | even notes. Other components work with image or video data. 80 | 81 | Read the paper online: https://riot.crew.c-base.org/avio.pdf 82 | 83 | This software package is a plugin module for Isomer. 84 | """, 85 | dependency_links=[], 86 | install_requires=[ 87 | 'pygame>=1.9.1release', 88 | 'isomer>=1.0', 89 | 'isomer-camera>=0.0.1', 90 | 'isomer-audio>=0.0.1', 91 | 'isomer-protocols>=0.0.1', 92 | 'imageio>=2.8.0' 93 | ], 94 | entry_points="""[isomer.schemata] 95 | [isomer.components] 96 | midiinput=avio.midi:MidiInput 97 | midioutput=avio.midi:MidiOutput 98 | hidcontroller=avio.controller:HIDController 99 | trigger=avio.trigger:Trigger 100 | combotrigger=avio.combotrigger:ComboTrigger 101 | bpm=avio.bpm:BPM 102 | videomixer=avio.videomixer:VideoMixer 103 | library=avio.library:Library 104 | gifmaster=avio.gifplayer:GIFMaster 105 | [isomer.management] 106 | [isomer.provisions] 107 | """, 108 | test_suite="tests.main.main", 109 | ) 110 | -------------------------------------------------------------------------------- /frontend/assets/avio_menu_logo.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 19 | 21 | 40 | 42 | 43 | 45 | image/svg+xml 46 | 48 | 49 | 50 | 51 | 52 | 57 | 66 | 71 | 76 | 81 | 86 | 91 | 92 | 93 | 94 | -------------------------------------------------------------------------------- /avio-legacy/matelight.py: -------------------------------------------------------------------------------- 1 | # AVIO - The Python Audio Video Input Output Suite 2 | # ================================================ 3 | # Copyright (C) 2015 riot 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 | __author__ = 'riot' 19 | 20 | import pygame 21 | import cv2 as cv 22 | import socket 23 | import os 24 | import numpy as np 25 | 26 | from circuits import Event, Timer, handler 27 | 28 | from avio_core.component import AVIOComponent 29 | from avio_core.logger import verbose 30 | 31 | 32 | class clear_ml(Event): 33 | """Send a black frame""" 34 | pass 35 | 36 | 37 | class fade_out_ml(Event): 38 | """Initiate hard fading out because of content loss or similar.""" 39 | pass 40 | 41 | 42 | class refresh_ml(Event): 43 | """Periodically sent last frame, so there's no idle-mode when there are no updated frames""" 44 | pass 45 | 46 | 47 | class transmit_ml(Event): 48 | """Transmit a frame to the display""" 49 | 50 | def __init__(self, frame, *args, **kwargs): 51 | super(transmit_ml, self).__init__(*args, **kwargs) 52 | self.frame = frame 53 | 54 | 55 | class Matelight(AVIOComponent): 56 | """Matelight connector with some minimal extra facilities""" 57 | 58 | channel = "matelight" 59 | 60 | def __init__(self, host="matelight", port=1337, *args): 61 | super(Matelight, self).__init__(*args) 62 | self.log("Initializing matelight output") 63 | 64 | self.host = host 65 | self.port = port 66 | 67 | self.size = (40, 16) 68 | self.gamma = 0.5 69 | 70 | self.fading = None 71 | 72 | self.auto_restart = True 73 | self.output_broken = False 74 | 75 | self.last_frame = np.zeros(self.size, np.uint8) 76 | 77 | path = os.path.abspath("./images/startscreen_matelight.png") 78 | boot_image = cv.imread(path) 79 | 80 | self.boot_image = cv.cvtColor(boot_image, cv.COLOR_BGR2RGB) 81 | self._transmit(self.boot_image) 82 | 83 | self.fade_timer = None 84 | self.init_timer = Timer(5, fade_out_ml()).register(self) 85 | self.refresh_timer = Timer(1, refresh_ml(), persist=True).register(self) 86 | 87 | def started(self, *args): 88 | self.log("Starting matelight output on device %s:%i" % (self.host, self.port)) 89 | 90 | def fade_out_ml(self, event): 91 | if self.fading is None: 92 | self.fading = 20 93 | self.fade_timer = Timer(1 / 60.0, fade_out_ml(), persist=True).register(self) 94 | elif self.fading > 0: 95 | new_frame = (self.last_frame * 0.9).astype(np.uint8) 96 | self._transmit(new_frame) 97 | self.fading -= 1 98 | elif self.fading <= 0: 99 | self._clear() 100 | self.fade_timer.unregister() 101 | self.fading = None 102 | 103 | def _clear(self): 104 | self.log('Clearing') 105 | img = np.zeros((40, 16, 3), np.uint8) 106 | self._transmit(img) 107 | 108 | def clear_ml(self, event): 109 | self._clear() 110 | 111 | @handler('refresh_ml') 112 | def refresh_ml(self, event): 113 | self._transmit(self.last_frame) 114 | 115 | def _transmit(self, image): 116 | if self.output_broken and not self.auto_restart: 117 | return 118 | 119 | self.log('Transmitting image, shape:', image.shape, lvl=verbose) 120 | 121 | self.last_frame = image 122 | 123 | if self.gamma != 1: 124 | image = (image * self.gamma).astype(np.uint8) 125 | 126 | ml_data = bytearray(image) + b"\00\00\00\00" 127 | 128 | try: 129 | sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) 130 | sock.sendto(ml_data, (self.host, self.port)) 131 | except Exception as e: 132 | self.log("Error during matelight transmission: ", e) 133 | self.output_broken = True 134 | 135 | def transmit_ml(self, event): 136 | if self.fade_timer is not None: 137 | self.fade_timer.unregister() 138 | self.fade_timer = None 139 | 140 | self._transmit(event.frame) 141 | 142 | @handler('keypress') 143 | def keypress(self, event): 144 | if event.ev.key == 223 and event.ev.mod == 1: 145 | self._transmit(self.boot_image) 146 | Timer(2, fade_out_ml()).register(self) 147 | if event.ev.mod & pygame.KMOD_LCTRL and event.ev.mod & pygame.KMOD_LSHIFT: 148 | if event.ev.key == pygame.K_MINUS: 149 | self.gamma = max(0.1, self.gamma - 0.1) 150 | elif event.ev.key == pygame.K_PLUS: 151 | self.gamma = min(1, self.gamma + 0.1) 152 | self.log(self.gamma) 153 | -------------------------------------------------------------------------------- /avio/library.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env python 2 | # -*- coding: UTF-8 -*- 3 | 4 | # AVIO - The Python Audio Video Input Output Suite 5 | # ================================================ 6 | # Copyright (C) 2015-2020 riot 7 | # 8 | # This program is free software: you can redistribute it and/or modify 9 | # it under the terms of the GNU General Public License as published by 10 | # the Free Software Foundation, either version 3 of the License, or 11 | # (at your option) any later version. 12 | # 13 | # This program is distributed in the hope that it will be useful, 14 | # but WITHOUT ANY WARRANTY; without even the implied warranty of 15 | # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 16 | # GNU General Public License for more details. 17 | # 18 | # You should have received a copy of the GNU General Public License 19 | # along with this program. If not, see . 20 | 21 | import os 22 | from base64 import b64encode 23 | 24 | import pygame 25 | from PIL import Image 26 | from isomer.component import ConfigurableComponent, handler, authorized_event 27 | from isomer.events.client import send 28 | from isomer.logger import verbose 29 | 30 | 31 | class unsubscribe(authorized_event): 32 | pass 33 | 34 | 35 | class subscribe(authorized_event): 36 | pass 37 | 38 | 39 | class Library(ConfigurableComponent): 40 | """""" 41 | 42 | channel = "AVIO" 43 | 44 | configprops = { 45 | 'cache_directory': {'type': 'string', 'default': '../../cache'} 46 | } 47 | 48 | def __init__(self, *args): 49 | super(Library, self).__init__("LIBRARY", args) 50 | self.log("Initializing Simple Library") 51 | 52 | pygame.font.init() 53 | 54 | self.clients = [] 55 | 56 | self.storage_path = os.path.abspath(os.path.join(__file__, "../../library")) 57 | 58 | self.files = { 59 | 'gif': {}, 60 | 'ttf': {}, 61 | } 62 | 63 | for location in self.files: 64 | os.makedirs( 65 | os.path.abspath( 66 | os.path.join(__file__, self.config.cache_directory, location) 67 | ), 68 | exist_ok=True 69 | ) 70 | 71 | for root, dirs, files in os.walk(self.storage_path): 72 | for file in files: 73 | extension = str(os.path.splitext(file)[1]).lstrip('.') 74 | self.log(extension, os.path.splitext(file), lvl=verbose) 75 | self.log(root, file, lvl=verbose) 76 | self.files[extension][os.path.join(root, file)] = {'image': ''} 77 | 78 | for filename, item in self.files['gif'].items(): 79 | self.log("Scanning:", filename) 80 | 81 | with open(filename, "rb") as f: 82 | image = b64encode(f.read()) 83 | base64 = image.decode('utf-8') 84 | 85 | item['image'] = base64 86 | item['name'] = os.path.basename(filename) 87 | 88 | for filename, item in self.files['ttf'].items(): 89 | self.log("Scanning:", filename) 90 | preview_file = os.path.abspath( 91 | os.path.join( 92 | __file__, self.config.cache_directory, 'ttf', 93 | os.path.basename(filename) + ".jpg" 94 | ) 95 | ) 96 | 97 | try: 98 | with open(preview_file, "rb") as f: 99 | preview = b64encode(f.read()) 100 | 101 | except FileNotFoundError: 102 | font = pygame.font.Font(filename, 12) 103 | rendered = font.render("AaBbCc", True, (255, 255, 255)) 104 | surface = pygame.Surface((40, 16)) 105 | surface.blit(rendered, (2, 2)) 106 | data = pygame.image.tostring(surface, 'RGB') 107 | img = Image.frombytes('RGB', (40, 16), data) 108 | 109 | with open(preview_file, "wb") as f: 110 | img.save(f, 'JPEG') 111 | 112 | preview = b64encode(img.tobytes()) 113 | 114 | base64 = preview.decode('utf-8') 115 | item['image'] = base64 116 | item['name'] = os.path.basename(filename) 117 | 118 | @handler(subscribe, channel="isomer-web") 119 | def subscribe(self, event): 120 | self.log("Subscription Event:", event.client) 121 | if event.client.uuid not in self.clients: 122 | self.clients.append(event.client.uuid) 123 | packet = { 124 | 'component': 'avio.library', 125 | 'action': 'library', 126 | 'data': self.files 127 | } 128 | self.fireEvent(send(event.client.uuid, packet), "isomer-web") 129 | 130 | @handler(unsubscribe, channel="isomer-web") 131 | def unsubscribe(self, event): 132 | self.log("Unsubscription Event:", event.client) 133 | if event.client.uuid in self.clients: 134 | self.clients.remove(event.client.uuid) 135 | 136 | @handler("userlogout", channel="isomer-web") 137 | def userlogout(self, event): 138 | self.stop_client(event) 139 | 140 | @handler("clientdisconnect", channel="isomer-web") 141 | def clientdisconnect(self, event): 142 | """Handler to deal with a possibly disconnected simulation frontend 143 | 144 | :param event: ClientDisconnect Event 145 | """ 146 | 147 | self.stop_client(event) 148 | 149 | def stop_client(self, event): 150 | try: 151 | if event.clientuuid in self.clients: 152 | self.clients.remove(event.clientuuid) 153 | 154 | self.log("Remote simulator disconnected") 155 | else: 156 | self.log("Client not subscribed") 157 | except Exception as e: 158 | self.log("Strange thing while client disconnected", e, type(e)) 159 | -------------------------------------------------------------------------------- /avio/videomixer.py: -------------------------------------------------------------------------------- 1 | # AVIO - The Python Audio Video Input Output Suite 2 | # ================================================ 3 | # Copyright (C) 2015 riot 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 | __author__ = 'riot' 19 | 20 | import numpy as np 21 | import cv2 as cv 22 | 23 | from circuits import Timer, Event 24 | 25 | from isomer.component import ConfigurableComponent, handler, authorized_event 26 | from isomer.events.client import broadcast, send 27 | from isomer.logger import verbose, hilight 28 | 29 | # from avio.gui import mouseevent 30 | from isomer.matelight import transmit_ml 31 | 32 | 33 | class mix_image(Event): 34 | pass 35 | 36 | 37 | class unsubscribe(authorized_event): 38 | pass 39 | 40 | 41 | class get_data(authorized_event): 42 | pass 43 | 44 | 45 | class subscribe(authorized_event): 46 | pass 47 | 48 | 49 | class update_channel(authorized_event): 50 | pass 51 | 52 | 53 | class VideoMixer(ConfigurableComponent): 54 | configprops = { 55 | 'channels': { 56 | 'type': 'array', 57 | 'default': [], 58 | 'items': { 59 | 'type': 'object', 60 | 'properties': { 61 | 'no': {'type': 'integer'}, 62 | 'alpha': {'type': 'number', 'default': 0.5}, 63 | 'gamma': {'type': 'number', 'default': 0.5}, 64 | 65 | } 66 | } 67 | }, 68 | 'fps': {'type': 'integer', 'default': 30} 69 | } 70 | 71 | channel = "AVIO" 72 | 73 | def __init__(self, delay=0.010, *args): 74 | 75 | super(VideoMixer, self).__init__("VIDEOMIXER", args) 76 | self.log("Initializing Videomixer") 77 | 78 | self.channels = {} 79 | self.images = {} 80 | 81 | self.clients = [] 82 | 83 | self.timer = Timer(1.0 / self.config.fps, Event.create("mix"), 84 | persist=True).register(self) 85 | 86 | @handler(subscribe, channel="isomer-web") 87 | def subscribe(self, event): 88 | self.log("Subscription Event:", event.client) 89 | if event.client.uuid not in self.clients: 90 | self.clients.append(event.client.uuid) 91 | 92 | @handler(unsubscribe, channel="isomer-web") 93 | def unsubscribe(self, event): 94 | self.log("Unsubscription Event:", event.client) 95 | if event.client.uuid in self.clients: 96 | self.clients.remove(event.client.uuid) 97 | 98 | @handler("userlogout", channel="isomer-web") 99 | def userlogout(self, event): 100 | self.stop_client(event) 101 | 102 | @handler("clientdisconnect", channel="isomer-web") 103 | def clientdisconnect(self, event): 104 | """Handler to deal with a possibly disconnected simulation frontend 105 | 106 | :param event: ClientDisconnect Event 107 | """ 108 | 109 | self.stop_client(event) 110 | 111 | @handler("reload_configuration", channel="isomer-web") 112 | def reload_configuration(self, event): 113 | """Reload the current configuration and set up everything depending on it""" 114 | 115 | super().reload_configuration(event) 116 | 117 | @handler(get_data, channel="isomer-web") 118 | def get_data(self, event): 119 | self.log("Providing mixer config:", event.client, pretty=True) 120 | response = { 121 | 'component': 'avio.videomixer', 122 | 'action': 'get_data', 123 | 'data': self.config.serializablefields() 124 | } 125 | self.fireEvent(send(event.client.uuid, response), "isomer-web") 126 | 127 | @handler(update_channel, channel="isomer-web") 128 | def update_channel(self, event): 129 | self.log('Updating channel:', event.data) 130 | self.channels[event.data['no']] = event.data['settings'] 131 | 132 | def stop_client(self, event): 133 | try: 134 | if event.clientuuid in self.clients: 135 | self.clients.remove(event.clientuuid) 136 | 137 | self.log("Remote simulator disconnected") 138 | else: 139 | self.log("Client not subscribed") 140 | except Exception as e: 141 | self.log("Strange thing while client disconnected", e, type(e)) 142 | 143 | def _notify_clients(self, event): 144 | if len(self.clients) == 0: 145 | return 146 | 147 | message = { 148 | 'component': 'avio.mixer', 149 | 'action': 'update', 150 | 'data': None 151 | } 152 | self.fireEvent( 153 | broadcast("clientgroup", message, group=self.clients), 154 | "isomer-web" 155 | ) 156 | 157 | def mix_image(self, channel, frame): 158 | self.images[channel] = frame 159 | 160 | def mix(self): 161 | self.log('Mixing down', lvl=verbose) 162 | output = np.zeros((16, 40, 3), np.uint8) 163 | 164 | for channel in self.config.channels: 165 | try: 166 | frame = self.images[channel['no']] 167 | alpha = channel['alpha'] 168 | gamma = channel['gamma'] 169 | beta = 0.5 170 | 171 | output = cv.addWeighted(output, alpha, frame, beta, gamma) 172 | except KeyError: 173 | pass 174 | 175 | self.fireEvent(transmit_ml(output), 'matelight') 176 | -------------------------------------------------------------------------------- /avio/midi.py: -------------------------------------------------------------------------------- 1 | # AVIO - The Python Audio Video Input Output Suite 2 | # ================================================ 3 | # Copyright (C) 2015 riot 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 | __author__ = 'riot' 19 | 20 | import pygame 21 | import pygame.midi 22 | 23 | from circuits import Event, Timer 24 | 25 | from isomer.logger import verbose, warn 26 | from isomer.component import ConfigurableComponent, handler 27 | 28 | from avio.events import midiinput 29 | 30 | 31 | class MidiOutput(ConfigurableComponent): 32 | configprops = { 33 | 'deviceid': { 34 | 'type': 'number', 35 | 'default': 0 36 | }, 37 | 'latency': { 38 | 'type': 'number', 39 | 'default': 0 40 | }, 41 | 'buffer_size': { 42 | 'type': 'number', 43 | 'default': 4096 44 | } 45 | } 46 | 47 | def __init__(self, *args): 48 | super(MidiOutput, self).__init__("MIDIOUT", *args) 49 | self.log("Initializing midi output") 50 | 51 | pygame.init() 52 | pygame.midi.init() 53 | 54 | self.output = None 55 | 56 | self.total_ppn = 0 57 | self.ppn = 0 58 | 59 | self.deviceid = self.config.deviceid 60 | self.lastcc = {} 61 | 62 | self.notes_playing = [] 63 | 64 | def started(self, *args): 65 | self.log("Starting midi output on device " + str(self.deviceid)) 66 | 67 | self.output = pygame.midi.Output( 68 | self.config.deviceid, self.config.latency, self.config.buffer_size 69 | ) 70 | self.output.set_instrument(0, 0) 71 | 72 | def midicc(self, event): 73 | # if not event.force and event.cc in self.lastcc: 74 | # if abs(self.lastcc[event.cc] - event.data) > 20: 75 | # #self.log("Not sending, due to too contrasting change") 76 | # return 77 | 78 | if event.cc in self.lastcc and self.lastcc[event.cc] == event.data: 79 | return 80 | 81 | self.log("Midi cc signal received: %i -> %i (%s) " % ( 82 | event.cc, event.data, event.force)) 83 | 84 | self.lastcc[event.cc] = event.data 85 | self.output.write_short(0xb0, event.cc, event.data) 86 | 87 | def midinote(self, event): 88 | event.start = self.total_ppn 89 | self.notes_playing.append(event) 90 | self.log('Playing note:', event.note, 'on', event.midi_channel, lvl=verbose) 91 | # self.output.note_on(event.note, event.velocity, event.midi_channel) 92 | self.output.write_short(0x90, event.note, event.velocity) 93 | 94 | def midiinput(self, event): 95 | if event.code == 248: 96 | self.total_ppn += 1 97 | self.ppn += 1 98 | self.ppn %= 24 99 | removable = [] 100 | for note in self.notes_playing: 101 | self.log('PPN:', note.start + note.length, self.total_ppn, note.start, 102 | note.length) 103 | if note.start + note.length <= self.total_ppn: 104 | self.log('Note off again:', note.note, note.midi_channel) 105 | self.output.write_short(0x80, note.note, note.velocity) 106 | removable.append(note) 107 | 108 | for item in removable: 109 | self.notes_playing.remove(item) 110 | 111 | def resetcclock(self, event): 112 | self.log("Midi cc lock resetting") 113 | self.lastcc = {} 114 | 115 | 116 | class MidiInput(ConfigurableComponent): 117 | configprops = { 118 | 'deviceid': { 119 | 'type': 'number', 120 | 'default': 0 121 | }, 122 | 'latency': { 123 | 'type': 'number', 124 | 'default': 0 125 | }, 126 | 'delay': { 127 | 'type': 'number', 128 | 'default': 0.01 129 | } 130 | } 131 | 132 | def __init__(self, *args): 133 | super(MidiInput, self).__init__("MIDIIN", *args) 134 | self.log("Initializing midi input") 135 | 136 | pygame.init() 137 | 138 | self.input = None 139 | 140 | self.lastcc = {} 141 | 142 | self.deviceid = self.config.deviceid 143 | self.delay = self.config.delay 144 | self.ppn = 0 145 | 146 | @handler("ready", channel="*") 147 | def ready(self, *args): 148 | self.log( 149 | "Starting midi input on device " + str(self.deviceid) + " at %i Hz" % int( 150 | 1 / self.delay)) 151 | 152 | try: 153 | self.input = pygame.midi.Input(self.config.deviceid, self.config.latency) 154 | 155 | Timer(self.delay, Event.create('peek'), self.channel, persist=True).register( 156 | self) 157 | except pygame.midi.MidiException: 158 | self.log("Could not open configured midi port:", self.config.deviceid, 159 | lvl=warn) 160 | 161 | def peek(self, event): 162 | if self.input and self.input.poll(): 163 | while self.input.poll(): 164 | 165 | mididata = self.input.read(1) 166 | if len(mididata) > 1: 167 | mididata = mididata[-1] 168 | else: 169 | mididata = mididata[0] 170 | 171 | if self.debug: 172 | self.log(mididata, pretty=True) 173 | 174 | self.fireEvent(midiinput(mididata)) 175 | -------------------------------------------------------------------------------- /avio/sequencer.py: -------------------------------------------------------------------------------- 1 | # AVIO - The Python Audio Video Input Output Suite 2 | # ================================================ 3 | # Copyright (C) 2015 riot 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 | __author__ = 'riot' 19 | 20 | import pygame 21 | import cv2 as cv 22 | import socket 23 | import os 24 | import numpy as np 25 | 26 | from circuits import Event, Timer, handler 27 | 28 | from avio_core.component import AVIOComponent 29 | from avio_core.matelight import transmit_ml 30 | from avio_core.logger import verbose 31 | from avio_core.events import midinote 32 | 33 | 34 | def to_rgb1(im): 35 | """Convert grayscale image to RGB""" 36 | w, h = im.shape 37 | ret = np.empty((w, h, 3), dtype=np.uint8) 38 | ret[:, :, 0] = im 39 | ret[:, :, 1] = im 40 | ret[:, :, 2] = im 41 | return ret 42 | 43 | 44 | class Sequencer(AVIOComponent): 45 | def __init__(self, channel="matelight", *args): 46 | """Step sequencer""" 47 | 48 | super(Sequencer, self).__init__(*args) 49 | self.log("Initializing Sequencer component") 50 | 51 | self.channel = channel 52 | self.midi_channel = 0 53 | 54 | self.size = (16, 40, 3) 55 | self.matrix = self.frame = np.zeros(self.size, np.uint8) 56 | 57 | self.last_frame = None 58 | 59 | self.step = 0 60 | self.playing_row = 0 61 | self.ppn = 0 62 | 63 | self.mode = self.column = self.row = 0 64 | 65 | self.steps = np.zeros(self.size, np.uint8) 66 | 67 | self.default_note = 64 68 | 69 | self.last_note = None 70 | 71 | self.routing = { 72 | 0: 'note', 73 | 1: 'velocity', 74 | 2: 'channel' 75 | } 76 | 77 | def started(self, *args): 78 | self.log("Starting Sequencer. Output to:", self.channel) 79 | 80 | def _transmit(self): 81 | self.log('Transmitting frame', lvl=verbose) 82 | self.last_frame = self.frame 83 | self.fireEvent(transmit_ml(self.frame), self.channel) 84 | self.frame = np.zeros(self.size, np.uint8) 85 | 86 | def _send_step(self): 87 | step = self.steps[self.playing_row][self.step] 88 | if step[0] > 0: 89 | self.fireEvent(midinote(step[0], step[1], self.midi_channel, step[2])) 90 | 91 | @handler("midiinput") 92 | def midi_input(self, event): 93 | """Handles incoming midi data like clock""" 94 | 95 | if event.code == 248: 96 | self.ppn = self.ppn + 1 97 | self.ppn %= 24 98 | if self.debug: 99 | print("#" if self.ppn == 0 else ".", end="", flush=True) 100 | if self.ppn == 0: 101 | self.step = (self.step + 1) % self.size[1] 102 | self._send_step() 103 | self._render() 104 | 105 | def _render(self): 106 | self.frame = to_rgb1(self.steps[:, :, self.mode]) 107 | self.frame[self.row][self.column] = [64, 196, 255] 108 | self.frame[self.playing_row][self.step] = [196, 64, 64] 109 | self._transmit() 110 | 111 | @handler("keypress") 112 | def keypress(self, event): 113 | 114 | step = self.steps[self.row][self.column][self.mode] 115 | mod = event.ev.mod 116 | 117 | move = 1 118 | 119 | matrix_changed = False 120 | old_row = self.row 121 | old_col = self.column 122 | 123 | alt = mod & pygame.KMOD_LALT 124 | lshift = mod & pygame.KMOD_LSHIFT 125 | ctrl = mod & pygame.KMOD_LCTRL 126 | 127 | # self.log('MODS:', alt, lshift, ctrl) 128 | 129 | if alt: 130 | move = 4 131 | if ctrl: 132 | move = move * 2 133 | 134 | if event.ev.key == pygame.K_RIGHT: 135 | self.column += move 136 | elif event.ev.key == pygame.K_LEFT: 137 | self.column -= move 138 | elif event.ev.key == pygame.K_DOWN: 139 | self.row += move 140 | elif event.ev.key == pygame.K_UP: 141 | self.row -= move 142 | elif event.ev.key == pygame.K_TAB: 143 | self.mode += 1 144 | self.mode = self.mode % 3 145 | matrix_changed = True 146 | elif event.ev.key == pygame.K_SPACE: 147 | if self.mode == 0: 148 | value = self.default_note 149 | elif self.mode == 1: 150 | value = 127 151 | elif self.mode == 2: 152 | value = 16 153 | 154 | self.steps[self.row][self.column][self.mode] = value 155 | matrix_changed = True 156 | elif event.ev.key == pygame.K_PLUS and mod == 0: 157 | value = step + 5 * ((1 + mod) * 5) 158 | self.steps[self.row][self.column][self.mode] = min(value, 127) 159 | matrix_changed = True 160 | elif event.ev.key == pygame.K_MINUS and mod == 0: 161 | value = step - 5 * ((1 + mod) * 5) 162 | self.steps[self.row][self.column][self.mode] = max(value, 0) 163 | matrix_changed = True 164 | elif event.ev.key == pygame.K_PRINT: 165 | for i in range(self.size[1]): 166 | line = "" 167 | for j in range(self.size[0]): 168 | data = self.steps[j][i][self.mode] 169 | line += "%s" % ("#" if data else "-") 170 | print(line) 171 | 172 | self.row = self.row % self.size[0] 173 | self.column = self.column % self.size[1] 174 | 175 | 176 | if matrix_changed or (self.row != old_row or self.column != old_col): 177 | self._render() 178 | -------------------------------------------------------------------------------- /avio/controller.py: -------------------------------------------------------------------------------- 1 | # AVIO - The Python Audio Video Input Output Suite 2 | # ================================================ 3 | # Copyright (C) 2015 riot 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 | __author__ = 'riot' 19 | 20 | import pygame 21 | import json 22 | 23 | from circuits import Timer, Event 24 | 25 | from isomer.component import ConfigurableComponent, handler, authorized_event 26 | from isomer.events.client import broadcast 27 | from avio.events import joystickchange, guiquit, guiresize, keypress 28 | 29 | # from avio.gui import mouseevent 30 | 31 | 32 | class unsubscribe(authorized_event): 33 | pass 34 | 35 | 36 | class subscribe(authorized_event): 37 | pass 38 | 39 | 40 | def getJoystick(no): 41 | joystick = pygame.joystick.Joystick(no) 42 | joystick.init() 43 | 44 | # Get the name from the OS for the controller/joystick 45 | name = joystick.get_name() 46 | axes = {} 47 | buttons = {} 48 | hats = {} 49 | 50 | # Usually axis run in pairs, up/down for one, and left/right for 51 | # the other. 52 | axesCount = joystick.get_numaxes() 53 | 54 | for i in range(axesCount): 55 | axis = joystick.get_axis(i) 56 | axes[i] = axis 57 | 58 | buttonsCount = joystick.get_numbuttons() 59 | 60 | for i in range(buttonsCount): 61 | button = joystick.get_button(i) 62 | buttons[i] = button 63 | 64 | # Hat switch. All or nothing for direction, not like joysticks. 65 | # Value comes back in an array. 66 | hatsCount = joystick.get_numhats() 67 | 68 | for i in range(hatsCount): 69 | hat = joystick.get_hat(i) 70 | hats[i] = hat 71 | 72 | return {'name': name, 'axes': axes, 'buttons': buttons, 'hats': hats} 73 | 74 | 75 | class HIDController(ConfigurableComponent): 76 | 77 | configprops = { 78 | 'dead_center': {'type': 'number', 'default': 0.1}, 79 | } 80 | 81 | channel = "AVIO" 82 | 83 | def __init__(self, delay=0.010, *args): 84 | 85 | super(HIDController, self).__init__("HIDCONTROLLER", args) 86 | self.log("Initializing HID controller") 87 | 88 | self.delay = delay 89 | self.acting = True 90 | 91 | self.clients = [] 92 | 93 | pygame.init() 94 | pygame.joystick.init() 95 | 96 | self.joystick_count = pygame.joystick.get_count() 97 | self.joysticks = {} 98 | 99 | # Initialize each joystick: 100 | for no in range(self.joystick_count): 101 | self.joysticks[no] = getJoystick(no) 102 | 103 | self.log("%i HID devices found" % self.joystick_count) 104 | 105 | @handler(subscribe, channel="isomer-web") 106 | def subscribe(self, event): 107 | self.log("Subscription Event:", event.client) 108 | if event.client.uuid not in self.clients: 109 | self.clients.append(event.client.uuid) 110 | 111 | @handler(unsubscribe, channel="isomer-web") 112 | def unsubscribe(self, event): 113 | self.log("Unsubscription Event:", event.client) 114 | if event.client.uuid in self.clients: 115 | self.clients.remove(event.client.uuid) 116 | 117 | @handler("userlogout", channel="isomer-web") 118 | def userlogout(self, event): 119 | self.stop_client(event) 120 | 121 | @handler("clientdisconnect", channel="isomer-web") 122 | def clientdisconnect(self, event): 123 | """Handler to deal with a possibly disconnected simulation frontend 124 | 125 | :param event: ClientDisconnect Event 126 | """ 127 | 128 | self.stop_client(event) 129 | 130 | def stop_client(self, event): 131 | try: 132 | if event.clientuuid in self.clients: 133 | self.clients.remove(event.clientuuid) 134 | 135 | self.log("Remote simulator disconnected") 136 | else: 137 | self.log("Client not subscribed") 138 | except Exception as e: 139 | self.log("Strange thing while client disconnected", e, type(e)) 140 | 141 | def _notify_clients(self, event): 142 | if len(self.clients) == 0: 143 | return 144 | # TODO: DIRTY HACK! DIIIIIRTY! REALLY DIRTY! 145 | # "} 146 | data = json.loads("{" + str(event).split("{")[1].rstrip(")>").replace("'", '"')) 147 | data['action'] = str(event).split("-")[1].split(" ")[0] 148 | message = { 149 | 'component': 'avio.controller', 150 | 'action': 'update', 151 | 'data': data 152 | } 153 | self.fireEvent( 154 | broadcast("clientgroup", message, group=self.clients), 155 | "isomer-web" 156 | ) 157 | 158 | @handler("ready", channel="*") 159 | def ready(self, *args): 160 | self.log("Starting controller input loop at %i Hz" % int(1 / self.delay)) 161 | Timer(self.delay, Event.create('peek'), self.channel, persist=True).register(self) 162 | 163 | @handler("peek") 164 | def peek(self, event): 165 | if pygame.event.peek(): 166 | for event in pygame.event.get(): 167 | #self.log("EVENT: " + str(event)) 168 | 169 | if event.type in (pygame.JOYAXISMOTION, 170 | pygame.JOYHATMOTION, 171 | pygame.JOYBUTTONDOWN, 172 | pygame.JOYBUTTONUP, 173 | pygame.JOYBALLMOTION): 174 | if event.type in (pygame.JOYAXISMOTION, 175 | pygame.JOYBALLMOTION): 176 | if abs(event.value) < self.config.dead_center: 177 | return 178 | self.fireEvent(joystickchange(event)) 179 | self._notify_clients(event) 180 | 181 | 182 | -------------------------------------------------------------------------------- /avio-legacy/logo.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 19 | 21 | 27 | 32 | 37 | 42 | 43 | 49 | 54 | 59 | 65 | 70 | 75 | 76 | 77 | 102 | 104 | 105 | 107 | image/svg+xml 108 | 110 | 111 | 112 | 113 | 114 | 119 | AVIO AVIO 146 | 147 | -------------------------------------------------------------------------------- /avio-legacy/app.py: -------------------------------------------------------------------------------- 1 | # AVIO - The Python Audio Video Input Output Suite 2 | # ================================================ 3 | # Copyright (C) 2015 riot 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 | __author__ = 'riot' 19 | 20 | import subprocess 21 | import os 22 | import sys 23 | 24 | import pygame 25 | 26 | from circuits import Timer 27 | from avio_core.component import AVIOComponent 28 | 29 | from avio_core.controller import Controller, getJoystick 30 | 31 | from avio_core.camera import CVCamera, CameraDisplay 32 | from avio_core.gif import GIFImage 33 | from avio_core.midi import MidiOutput, MidiInput 34 | from avio_core.router import Router 35 | from avio_core.matelight import Matelight 36 | from avio_core.sequencer import Sequencer 37 | from avio_core.gui import GUI, Button, ButtonGrid, Label, Meter, setvalue 38 | 39 | from pprint import pprint 40 | 41 | from avio_core.events import guiquit, saveprogram 42 | 43 | 44 | class App(AVIOComponent): 45 | def __init__(self, sysargs, *args): 46 | super(App, self).__init__(args) 47 | self.log("Initializing core") 48 | self.sysargs = sysargs 49 | if sysargs.debug: 50 | AVIOComponent.debug = True 51 | 52 | def started(self, *args): 53 | self.log("Starting core") 54 | 55 | # Timer(0.5, setvalue('testmeter', 76), persist=True).register(self) 56 | 57 | configpath = os.path.abspath(os.path.expanduser("~/.avio")) 58 | if not os.path.exists(configpath): 59 | self.log("Creating configuration folder " + configpath) 60 | os.mkdir(configpath) 61 | if not os.path.exists(os.path.join(configpath, "router_default.json")): 62 | self.fireEvent(saveprogram('default')) 63 | 64 | def guiquit(self, *args): 65 | self.log("Quitting by request: " + str(args)) 66 | sys.exit() 67 | 68 | def keypress(self, event): 69 | if event.ev.key == pygame.K_v: 70 | GIFImage('testgif5', 'test5.gif', immediately=True).register(self) 71 | 72 | 73 | def get_io(): 74 | midicount = pygame.midi.get_count() 75 | joystickcount = pygame.joystick.get_count() 76 | 77 | mididevices = {} 78 | joystickdevices = {} 79 | 80 | for i in range(midicount): 81 | mididevice = pygame.midi.get_device_info(i) 82 | info = { 83 | 'type': mididevice[0], 84 | 'name': mididevice[1], 85 | } 86 | if mididevice[2] == 1: 87 | info['dir'] = 'input' 88 | else: 89 | info['dir'] = 'output' 90 | mididevices[i] = info 91 | 92 | for i in range(joystickcount): 93 | joystickdevice = getJoystick(i) 94 | joystickdevices[i] = joystickdevice 95 | 96 | return mididevices, joystickdevices 97 | 98 | 99 | def Launch(args): 100 | if not args.nosplash: 101 | # TODO: Get correct script path 102 | try: 103 | splash = subprocess.Popen([sys.executable, './avio_core/splash.py']) 104 | except: 105 | pass 106 | 107 | pygame.init() 108 | pygame.midi.init() 109 | pygame.joystick.init() 110 | 111 | mididevices, joystickdevices = get_io() 112 | 113 | if args.io: 114 | print("MIDI Devices:") 115 | pprint(mididevices) 116 | print("Joystick-like Devices:") 117 | pprint(joystickdevices) 118 | sys.exit() 119 | 120 | default_midiin = default_midiout = -1 121 | 122 | for key, item in mididevices.items(): 123 | if item['name'] == b'Midi Through Port-0': 124 | if item['dir'] == 'output': 125 | default_midiout = key 126 | continue 127 | if item['dir'] == 'input': 128 | default_midiin = key 129 | continue 130 | else: 131 | continue 132 | 133 | if args.midiin is None: 134 | print('Using default midi input: %i' % default_midiin) 135 | args.midiin = default_midiin 136 | if args.midiout is None: 137 | print('Using default midi output: %i' % default_midiout) 138 | args.midiout = default_midiout 139 | 140 | fullscreen = args.width, args.height 141 | args.screensize = fullscreen 142 | 143 | app = App(args) 144 | 145 | if args.debug: 146 | from circuits import Debugger 147 | dbg = Debugger().register(app) 148 | dbg.IgnoreEvents.extend(["peek", "repaint", "paintrequest", 149 | "task_success", 150 | "read", "_read", 151 | "write", "_write", 152 | "stream_success", "stream_complete", 153 | "stream", "refresh_ml"]) 154 | 155 | input = Controller().register(app) 156 | router = Router(program=args.program).register(app) 157 | midiout = MidiOutput(deviceid=args.midiout).register(app) 158 | midiin = MidiInput(deviceid=args.midiin).register(app) 159 | matelight = Matelight(host=args.host, port=args.port).register(app) 160 | sequencer = Sequencer().register(app) 161 | if args.cam: 162 | camera = CVCamera(targetresolution=fullscreen).register(app) 163 | camdisp = CameraDisplay().register(app) 164 | 165 | gui = GUI(fullscreen=fullscreen).register(app) 166 | 167 | if args.gui: 168 | pass 169 | # This is only a test setup. 170 | #hellobutton = Button('btnHello', 'Hello World!', (10, 10, 150, 20), 171 | # True).register(gui) 172 | #quitbutton = Button('btnQuit', 'Quit', (10, 32, 150, 42), False, 173 | # False).register(gui) 174 | #grid = ButtonGrid('beatGrid', 25, 100, 2, 2).register(gui) 175 | # qqqgrid2 = ButtonGrid('synthGrid', 285, 100, 3, 3).register(gui) 176 | #meter = Meter('testmeter', 'dB', 5, 100, max=100).register(gui) 177 | #gif = GIFImage('testgif1', 'test.gif').register(gui) 178 | #gif2 = GIFImage('testgif2', 'test2.gif').register(gui) 179 | #gif3 = GIFImage('testgif3', 'test3.gif').register(gui) 180 | #gif4 = GIFImage('testgif4', 'test4.gif').register(gui) 181 | # gif5 = GIFImage('testgif5', 'test5.gif').register(gui) 182 | 183 | app.run() 184 | -------------------------------------------------------------------------------- /avio-legacy/logger.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env python 2 | # -*- coding: UTF-8 -*- 3 | 4 | # AVIO 5 | # ==== 6 | # Copyright (C) 2011-2017 Heiko 'riot' Weinen and others. 7 | # 8 | # This program is free software: you can redistribute it and/or modify 9 | # it under the terms of the GNU General Public License as published by 10 | # the Free Software Foundation, either version 3 of the License, or 11 | # (at your option) any later version. 12 | # 13 | # This program is distributed in the hope that it will be useful, 14 | # but WITHOUT ANY WARRANTY; without even the implied warranty of 15 | # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 16 | # GNU General Public License for more details. 17 | # 18 | # You should have received a copy of the GNU General Public License 19 | # along with this program. If not, see . 20 | 21 | __author__ = "Heiko 'riot' Weinen" 22 | __license__ = "GPLv3" 23 | 24 | """ 25 | Module: Logger 26 | ============== 27 | 28 | AVIO logger to avoid namespace clashes etc. Comes with some fancy 29 | functions. Copied from Hackerfleet Operating System. 30 | 31 | Log Levels 32 | ---------- 33 | 34 | verbose = 5 35 | debug = 10 36 | info = 20 37 | warn = 30 38 | error = 40 39 | critical = 50 40 | off = 100 41 | 42 | 43 | """ 44 | 45 | from circuits.core import Event 46 | import pprint 47 | # from circuits import Component, handler 48 | # from uuid import uuid4 49 | # import json 50 | 51 | 52 | import time 53 | import sys 54 | import inspect 55 | import six 56 | 57 | # import os 58 | 59 | root = None 60 | 61 | events = 2 62 | network = 4 63 | verbose = 5 64 | debug = 10 65 | info = 20 66 | warn = 30 67 | error = 40 68 | critical = 50 69 | hilight = 60 70 | off = 100 71 | 72 | # https://en.wikipedia.org/wiki/ANSI_escape_code#Colors 73 | lvldata = { 74 | events: ['EVENT', '\033[1:36m'], 75 | verbose: ['VERB', '\033[1;30m'], 76 | network: ['NET', '\033[1;34m'], 77 | debug: ['DEBUG', '\033[1;97m'], 78 | info: ['INFO', '\033[1;92m'], 79 | warn: ['WARN', '\033[1;93m'], 80 | error: ['ERROR', '\033[1;31;43m'], 81 | critical: ['CRIT', '\033[1;33;41m'], 82 | hilight: ['HILIGHT', '\033[1;4;30;106m'] 83 | } 84 | 85 | terminator = '\033[0m' 86 | 87 | count = 0 88 | 89 | logfile = "/var/log/hfos/service.log" 90 | 91 | console = verbose 92 | live = False 93 | 94 | verbosity = {'global': console, 95 | 'file': off, 96 | 'system': info, 97 | 'console': console 98 | } 99 | 100 | uncut = True 101 | color = True # TODO: Make this switchable via args 102 | 103 | mute = [] 104 | solo = [] 105 | 106 | LiveLog = [] 107 | 108 | start = time.time() 109 | 110 | 111 | def set_logfile(path): 112 | global logfile 113 | logfile = path 114 | 115 | 116 | def ismuted(what): 117 | """ 118 | Checks if a logged event is to be muted for debugging purposes. 119 | 120 | Also goes through the solo list - only items in there will be logged! 121 | 122 | :param what: 123 | :return: 124 | """ 125 | 126 | state = False 127 | 128 | for item in solo: 129 | if item not in what: 130 | state = True 131 | else: 132 | state = False 133 | break 134 | 135 | for item in mute: 136 | if item in what: 137 | state = True 138 | break 139 | 140 | return state 141 | 142 | 143 | def setup_root(newroot): 144 | """ 145 | Sets up the root component, so the logger knows where to send logging 146 | signals. 147 | 148 | :param newroot: 149 | """ 150 | global root 151 | 152 | root = newroot 153 | 154 | 155 | def hfoslog(*what, **kwargs): 156 | """Logs all *what arguments. 157 | 158 | :param *what: Loggable objects (i.e. they have a string representation) 159 | :param lvl: Debug message level 160 | :param exc: Switch to better handle exceptions, use if logging in an 161 | except clause 162 | :param emitter: Optional log source, where this can't be determined 163 | automatically 164 | :param sourceloc: Give specific source code location hints, used internally 165 | """ 166 | 167 | # Count all messages (missing numbers give a hint at too high log level) 168 | global count 169 | count += 1 170 | 171 | if 'lvl' in kwargs: 172 | lvl = kwargs['lvl'] 173 | if lvl < verbosity['global']: 174 | return 175 | else: 176 | lvl = info 177 | 178 | if 'emitter' in kwargs: 179 | emitter = kwargs['emitter'] 180 | else: 181 | emitter = 'UNKNOWN' 182 | 183 | if 'exc' in kwargs: 184 | exception = True 185 | else: 186 | exception = False 187 | 188 | output = None 189 | 190 | timestamp = time.time() 191 | runtime = timestamp - start 192 | 193 | callee = None 194 | 195 | if verbosity['global'] <= debug: 196 | # Automatically log the current function details. 197 | 198 | if 'sourceloc' not in kwargs: 199 | 200 | # Get the previous frame in the stack, otherwise it would 201 | # be this function 202 | func = inspect.currentframe().f_back.f_code 203 | # Dump the message + the name of this function to the log. 204 | 205 | if exception: 206 | exc_type, exc_obj, exc_tb = sys.exc_info() # NOQA 207 | line_no = exc_tb.tb_lineno 208 | lvl = error 209 | else: 210 | line_no = func.co_firstlineno 211 | 212 | callee = "[%.10s@%s:%i]" % ( 213 | func.co_name, 214 | func.co_filename, 215 | line_no 216 | ) 217 | else: 218 | callee = kwargs['sourceloc'] 219 | 220 | msg = "[%s] : %5s : %.5f : %3i : [%5s]" % (time.asctime(), 221 | lvldata[lvl][0], 222 | runtime, 223 | count, 224 | emitter) 225 | 226 | content = "" 227 | 228 | if callee: 229 | if not uncut and lvl > 10: 230 | msg += "%-60s" % callee 231 | else: 232 | msg += "%s" % callee 233 | 234 | for thing in what: 235 | content += " " 236 | if kwargs.get('pretty', False): 237 | content += pprint.pformat(thing) 238 | else: 239 | content += str(thing) 240 | 241 | msg += content 242 | 243 | if ismuted(msg): 244 | return 245 | 246 | if not uncut and lvl > 10 and len(msg) > 1000: 247 | msg = msg[:1000] 248 | 249 | if lvl >= verbosity['file']: 250 | try: 251 | f = open(logfile, "a") 252 | f.write(msg + '\n') 253 | f.flush() 254 | f.close() 255 | except IOError: 256 | print("Can't open logfile %s for writing!" % logfile) 257 | # sys.exit(23) 258 | 259 | if lvl >= verbosity['console']: 260 | output = str(msg) 261 | if six.PY3 and color: 262 | output = lvldata[lvl][1] + output + terminator 263 | try: 264 | print(output) 265 | except UnicodeEncodeError as e: 266 | print(output.encode("utf-8")) 267 | hfoslog("Bad encoding encountered on previous message:", e, 268 | lvl=error) 269 | except BlockingIOError: 270 | hfoslog("Too long log line encountered:", output[:20], lvl=error) 271 | 272 | if live: 273 | LiveLog.append(output) 274 | -------------------------------------------------------------------------------- /avio/router.py: -------------------------------------------------------------------------------- 1 | # AVIO - The Python Audio Video Input Output Suite 2 | # ================================================ 3 | # Copyright (C) 2015 riot 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 | __author__ = 'riot' 19 | 20 | import pygame 21 | import json 22 | import os.path 23 | 24 | from avio_core.component import AVIOComponent 25 | 26 | from avio_core.events import midicc, resetcclock, loadscene 27 | 28 | from circuits import Timer, Event 29 | 30 | from pprint import pprint 31 | 32 | routerevents = { 33 | 'midicc': midicc, 34 | 'loadscene': loadscene, 35 | 'resetcclock': resetcclock 36 | } 37 | 38 | 39 | class Router(AVIOComponent): 40 | def __init__(self, program='default', *args): 41 | super(Router, self).__init__(*args) 42 | self.log("Initializing router") 43 | 44 | self.scenes = { 45 | 'default': { 46 | 'axis': { 47 | '0': {'event': 'midicc', 'args': 20}, 48 | '1': {'event': 'midicc', 'args': 21}, 49 | '2': {'event': 'midicc', 'args': 22}, 50 | '3': {'event': 'midicc', 'args': 23}, 51 | '12': {'event': 'midicc', 'args': 24}, 52 | '13': {'event': 'midicc', 'args': 25}, 53 | '14': {'event': 'midicc', 'args': 26}, 54 | '15': {'event': 'midicc', 'args': 27}, 55 | '23': {'event': 'midicc', 'args': 28}, 56 | '24': {'event': 'midicc', 'args': 29}, 57 | '25': {'event': 'midicc', 'args': 30}, 58 | '17': {'event': 'midicc', 'args': 31}, 59 | }, 60 | 'buttons': { 61 | '0': {'shiftcc': 4}, 62 | '1': {'mute': True}, 63 | '2': {'event': 'loadscene', 'args': 'second', 'mode': 'down'}, 64 | '3': {'nop': None}, 65 | '4': {'nop': None}, 66 | '5': {'nop': None}, 67 | '6': {'nop': None}, 68 | '7': {'nop': None}, 69 | '8': {'nop': None}, 70 | '9': {'nop': None}, 71 | '10': {'nop': None}, 72 | '11': {'nop': None} 73 | }, 74 | 'hat': { 75 | } 76 | }, 77 | 'second': { 78 | 'buttons': { 79 | '7': {'event': 'loadscene', 'args': 'default'}, 80 | '8': {'event': 'loadscene', 'args': 'third'} 81 | } 82 | }, 83 | 'third': { 84 | 'buttons': { 85 | '0': {'event': 'loadscene', 'args': 'default'} 86 | } 87 | 88 | } 89 | } 90 | self.routes = self.scenes['default'] 91 | 92 | self._saveprogram('default') 93 | 94 | if program: 95 | self._loadprogram(program) 96 | 97 | try: 98 | self.routes = self.scenes['default'] 99 | except KeyError: 100 | self.log("Router has no valid default program!") 101 | 102 | self.shiftcc = {} 103 | self.warned = [] 104 | self.muted = False 105 | 106 | self.warningtimer = Timer(5, Event.create('reset_warnings'), persistent=True).register(self) 107 | 108 | def started(self, *args): 109 | self.log("Starting router") 110 | 111 | def getshift(self): 112 | shift = 0 113 | for item in self.shiftcc.values(): 114 | shift += item 115 | 116 | return shift 117 | 118 | def reset_warnings(self): 119 | self.warned = [] 120 | 121 | def _saveprogram(self, programname): 122 | realname = os.path.abspath(os.path.expanduser("~/.avio/router_" + programname + ".json")) 123 | self.log("Router storing program " + programname + " to " + realname) 124 | try: 125 | with open(realname, "w") as fp: 126 | json.dump(self.scenes, fp, indent=4) 127 | # except IOError as e: 128 | 129 | except Exception as e: 130 | self.log("Program save failed for %s: %s (%s)" % (programname, e, type(e))) 131 | 132 | def _loadprogram(self, programname): 133 | backup = (self.scenes, self.routes) 134 | realname = os.path.abspath(os.path.expanduser("~/.avio/router_" + programname + ".json")) 135 | self.log("Router loading program " + programname + " from " + realname) 136 | try: 137 | with open(realname, 'r') as fp: 138 | self.scenes = json.load(fp) 139 | self.routes = self.scenes['default'] 140 | except Exception as e: 141 | self.log("Program load failed for %s: %s (%s)" % (programname, e, type(e))) 142 | self.scenes, self.routes = backup 143 | 144 | def saveprogram(self, event): 145 | self._saveprogram(event.program) 146 | 147 | def loadprogram(self, event): 148 | self._loadprogram(event.program) 149 | 150 | def loadscene(self, event): 151 | self.log("Loading new scene: " + str(event.scene)) 152 | self.routes = self.scenes[event.scene] 153 | 154 | def joystickchange(self, event): 155 | # self.log("Router change received: " + str(event.input)) 156 | 157 | key = None 158 | identity = None 159 | 160 | if event.input.type == pygame.JOYAXISMOTION: 161 | key = 'axis' 162 | identity = event.input.axis 163 | elif event.input.type in (pygame.JOYBUTTONDOWN, pygame.JOYBUTTONUP): 164 | # self.log("Button action") 165 | key = 'buttons' 166 | identity = event.input.button 167 | 168 | # self.log(key, identity) 169 | if key != None and identity != None: 170 | cat = self.routes.get(key, None) 171 | str_id = str(identity) 172 | 173 | if not cat: 174 | self.log('Unknown category!', key, str_id) 175 | return 176 | 177 | if not str_id in cat: 178 | if str_id not in self.warned: 179 | self.log("No routing rule for %s - %s" % (key, str_id)) 180 | self.warned.append(str_id) 181 | return 182 | route = cat[str(identity)] 183 | 184 | evtype = event.input.type 185 | 186 | if 'mute' in route: 187 | self.log("Muted control") 188 | self.muted = evtype == pygame.JOYBUTTONDOWN 189 | 190 | if 'shiftcc' in route: 191 | self.log("Shifting CC") 192 | if evtype == pygame.JOYBUTTONDOWN: 193 | self.shiftcc[identity] = route['shiftcc'] 194 | else: 195 | del (self.shiftcc[identity]) 196 | 197 | if not self.muted and 'event' in route: 198 | signal = routerevents[route['event']](route['args']) 199 | if 'mode' in route: 200 | if (route['mode'] == 'down' and evtype == pygame.JOYBUTTONUP) or ( 201 | route['mode'] == 'up' and evtype == pygame.JOYBUTTONDOWN): 202 | self.log("Wrong mode for route: " + str(route)) 203 | return 204 | if type(signal) == midicc: 205 | if len(self.shiftcc) > 0: 206 | signal.cc += self.getshift() 207 | signal.data = int(127 * abs((event.input.value + 1) / 2)) 208 | 209 | self.fireEvent(signal) 210 | --------------------------------------------------------------------------------