Showing preview only (8,360K chars total). Download the full file or copy to clipboard to get everything.
Repository: Wohlstand/OPL3BankEditor
Branch: master
Commit: 0155632a5958
Files: 921
Total size: 7.9 MB
Directory structure:
gitextract_zr1nehnw/
├── .devcontainer/
│ ├── Dockerfile
│ ├── devcontainer.json
│ └── reinstall-cmake.sh
├── .gitattributes
├── .github/
│ └── workflows/
│ ├── macos-ci.yml
│ ├── ubuntu-ci.yml
│ └── windows-ci.yml
├── .gitignore
├── .gitmodules
├── Bank_Examples/
│ ├── 2x2.op3
│ ├── AdlibTracker2/
│ │ ├── $at2demo.a2w
│ │ ├── $gmopl.ibk
│ │ ├── $mlfbank.bnk
│ │ ├── $mt32.ibk
│ │ ├── 3klang1.sgi
│ │ ├── 3klang2.sgi
│ │ ├── aalto.sbi
│ │ ├── accordn.sbi
│ │ ├── acid.cif
│ │ ├── acidbas4.sgi
│ │ ├── acidbass.sgi
│ │ ├── alien.cif
│ │ ├── alien.sbi
│ │ ├── alien2.sbi
│ │ ├── altovio2.sbi
│ │ ├── altoviol.sbi
│ │ ├── asbass.fin
│ │ ├── astring.sbi
│ │ ├── atari.sgi
│ │ ├── bagpipe1.sbi
│ │ ├── bagpipe2.sbi
│ │ ├── banjo.sbi
│ │ ├── banjo1.sbi
│ │ ├── basdr3.sbi
│ │ ├── base.cif
│ │ ├── base.sgi
│ │ ├── base2.cif
│ │ ├── base3.cif
│ │ ├── base3.sgi
│ │ ├── basedrum.sgi
│ │ ├── basemax.sgi
│ │ ├── basemed.sgi
│ │ ├── basesyn.cif
│ │ ├── bass.fin
│ │ ├── bass.ins
│ │ ├── bass1.sbi
│ │ ├── bass2.cif
│ │ ├── bass2.ins
│ │ ├── bass2.sbi
│ │ ├── bass295.fin
│ │ ├── bass3.cif
│ │ ├── bass4.cif
│ │ ├── bass5.cif
│ │ ├── bass5.fin
│ │ ├── bass6.cif
│ │ ├── bassdrm1.sgi
│ │ ├── bassdrum.fin
│ │ ├── bassdrum.sgi
│ │ ├── bassharp.sbi
│ │ ├── bassnew.fin
│ │ ├── bassoon.sbi
│ │ ├── bassoon1.sbi
│ │ ├── basstrlg.sbi
│ │ ├── battle.sgi
│ │ ├── bbass.sbi
│ │ ├── bcymbal.sbi
│ │ ├── bdrum.ins
│ │ ├── bdrum.sbi
│ │ ├── bdrum1.sbi
│ │ ├── bdrum2.sbi
│ │ ├── bdrum3.sbi
│ │ ├── beep.cif
│ │ ├── belguit2.sbi
│ │ ├── bell#2.ins
│ │ ├── bell.ins
│ │ ├── bell.sgi
│ │ ├── bellong.sbi
│ │ ├── bells.cif
│ │ ├── bells.sbi
│ │ ├── bellsngr.sgi
│ │ ├── belpiano.sbi
│ │ ├── belshort.sbi
│ │ ├── beverly.sgi
│ │ ├── bguit.sbi
│ │ ├── bim.cif
│ │ ├── blast.sbi
│ │ ├── blip.cif
│ │ ├── blob.sgi
│ │ ├── bncebass.sbi
│ │ ├── bpiano.sbi
│ │ ├── brass.sgi
│ │ ├── brass1.sbi
│ │ ├── brass2.sbi
│ │ ├── briss4.sgi
│ │ ├── briss5.sgi
│ │ ├── briss6.sgi
│ │ ├── broguit.fin
│ │ ├── brush2.sbi
│ │ ├── bstacc.sbi
│ │ ├── bsynth.sbi
│ │ ├── btgo.sbi
│ │ ├── cbanjo.sbi
│ │ ├── cbassoon.sbi
│ │ ├── celesta.sbi
│ │ ├── celguit.sbi
│ │ ├── cello.sbi
│ │ ├── cello2.sbi
│ │ ├── celpiano.sbi
│ │ ├── celpno2.sbi
│ │ ├── chirp.sbi
│ │ ├── chord.ins
│ │ ├── chorn.sbi
│ │ ├── church.sgi
│ │ ├── claps1.sbi
│ │ ├── clar1.sbi
│ │ ├── clar2.sbi
│ │ ├── clarinet.sbi
│ │ ├── clavecin.sbi
│ │ ├── claves.sbi
│ │ ├── contra2.sbi
│ │ ├── contrab.sbi
│ │ ├── cool.cif
│ │ ├── cool.sgi
│ │ ├── coolbass.sgi
│ │ ├── cromorne.sbi
│ │ ├── crystal.sbi
│ │ ├── cstacc.sbi
│ │ ├── csynth.sbi
│ │ ├── cviolin.sbi
│ │ ├── cymbal.sbi
│ │ ├── cymbal1.sbi
│ │ ├── cymbal2.sbi
│ │ ├── dan.sgi
│ │ ├── dapbass.cif
│ │ ├── deadbass.cif
│ │ ├── deep.sgi
│ │ ├── deepbell.cif
│ │ ├── deepdapb.cif
│ │ ├── deepstri.cif
│ │ ├── dipp2.cif
│ │ ├── dot.sgi
│ │ ├── dot2.sgi
│ │ ├── dot3.sgi
│ │ ├── dragbass.sgi
│ │ ├── drum1.ins
│ │ ├── drum2.ins
│ │ ├── drum2.sgi
│ │ ├── drum3.ins
│ │ ├── drum4.ins
│ │ ├── drum5.ins
│ │ ├── drumdown.sgi
│ │ ├── dshrtbas.cif
│ │ ├── dune.sgi
│ │ ├── dungeon.sgi
│ │ ├── easybass.cif
│ │ ├── ebass-l.sgi
│ │ ├── ebass.sgi
│ │ ├── eguhigh.sgi
│ │ ├── eguitar.sgi
│ │ ├── eguitar3.sgi
│ │ ├── eguitar4.sgi
│ │ ├── eguitar5.sgi
│ │ ├── eguitarl.sgi
│ │ ├── eguittar.cif
│ │ ├── eklavie.cif
│ │ ├── elclav1.sbi
│ │ ├── elclav2.sbi
│ │ ├── elecfl.sbi
│ │ ├── elecvibe.sbi
│ │ ├── elguit1.sbi
│ │ ├── elguit2.sbi
│ │ ├── elguit3.sbi
│ │ ├── elguit4.sbi
│ │ ├── elguitar.sbi
│ │ ├── elorgan1.sbi
│ │ ├── elorgan4.sgi
│ │ ├── elpiano1.sbi
│ │ ├── elpiano2.sbi
│ │ ├── englhrn1.sbi
│ │ ├── englhrn2.sbi
│ │ ├── epiano.sbi
│ │ ├── epiano1a.sbi
│ │ ├── epiano1b.sbi
│ │ ├── epicbell.cif
│ │ ├── fantapan.sbi
│ │ ├── fantpan2.sbi
│ │ ├── fifth.fin
│ │ ├── fifths.fin
│ │ ├── fight.sgi
│ │ ├── flapbas.sbi
│ │ ├── floete.sgi
│ │ ├── flute.cif
│ │ ├── flute.sbi
│ │ ├── flute1.sbi
│ │ ├── flute2.sbi
│ │ ├── frhorn1.sbi
│ │ ├── frhorn2.sbi
│ │ ├── fstrp1.sbi
│ │ ├── fstrp2.sbi
│ │ ├── funny.sgi
│ │ ├── funnybas.sbi
│ │ ├── fupp.cif
│ │ ├── future.sgi
│ │ ├── fuzguit1.sbi
│ │ ├── fuzguit2.sbi
│ │ ├── galaxi.sgi
│ │ ├── galaxy3.sgi
│ │ ├── galaxy3v.sgi
│ │ ├── geige.sgi
│ │ ├── ghost.sgi
│ │ ├── gpb.sgi
│ │ ├── guit2.fin
│ │ ├── guitar1.sbi
│ │ ├── gun.sgi
│ │ ├── gun2.sgi
│ │ ├── hack.cif
│ │ ├── hammer.sgi
│ │ ├── hardsynt.cif
│ │ ├── harmonca.sbi
│ │ ├── harp.sbi
│ │ ├── harp1.sbi
│ │ ├── harp2.sbi
│ │ ├── harp3.sbi
│ │ ├── harpe1.sbi
│ │ ├── harpsi1.sbi
│ │ ├── harpsi2.sbi
│ │ ├── harpsi3.sbi
│ │ ├── harpsi4.sbi
│ │ ├── harpsi5.sbi
│ │ ├── helicptr.sbi
│ │ ├── highlow.sgi
│ │ ├── hihat.cif
│ │ ├── hihat.ins
│ │ ├── hihat.sgi
│ │ ├── hihat2.cif
│ │ ├── hihat2.sgi
│ │ ├── hihathi.sgi
│ │ ├── horn.cif
│ │ ├── horror1.sgi
│ │ ├── horror2.sgi
│ │ ├── horror3.sgi
│ │ ├── icerain.sgi
│ │ ├── javaican.sbi
│ │ ├── jazzbas2.sbi
│ │ ├── jazzbass.sbi
│ │ ├── jazzguit.sbi
│ │ ├── jet.cif
│ │ ├── jewsharp.sbi
│ │ ├── jump.sgi
│ │ ├── jump2.sgi
│ │ ├── jungdrum.sgi
│ │ ├── jungle.sgi
│ │ ├── key2.sgi
│ │ ├── keybrd1.sbi
│ │ ├── keybrd2.sbi
│ │ ├── keybrd3.sbi
│ │ ├── klarinet.cif
│ │ ├── knarbass.cif
│ │ ├── knock.cif
│ │ ├── koto.sgi
│ │ ├── koto1.sbi
│ │ ├── kuorsau2.sbi
│ │ ├── kuorsaus.sbi
│ │ ├── kupfer.cif
│ │ ├── kupfer2.cif
│ │ ├── laser.sbi
│ │ ├── laser.sgi
│ │ ├── leed.cif
│ │ ├── leed2.cif
│ │ ├── leed3.cif
│ │ ├── leen4.cif
│ │ ├── ligtbell.cif
│ │ ├── logdrum.sgi
│ │ ├── logdrum1.sbi
│ │ ├── long-hi.sgi
│ │ ├── long2.sgi
│ │ ├── loop.cif
│ │ ├── lostinsp.sgi
│ │ ├── lullbass.sbi
│ │ ├── luola.sbi
│ │ ├── marimba.sbi
│ │ ├── marimba.sgi
│ │ ├── marimba1.sbi
│ │ ├── marimba2.sbi
│ │ ├── mars.sbi
│ │ ├── master.sgi
│ │ ├── mdrnphon.sbi
│ │ ├── melody.cif
│ │ ├── meri.sbi
│ │ ├── mhihat.fin
│ │ ├── minebass.sgi
│ │ ├── mltrdrum.sbi
│ │ ├── modacid.sgi
│ │ ├── moogsynt.sbi
│ │ ├── moon.sbi
│ │ ├── muteclav.sgi
│ │ ├── nice2.sgi
│ │ ├── nicebass.sgi
│ │ ├── noise1.sbi
│ │ ├── notbig.sbi
│ │ ├── oboe.sbi
│ │ ├── oboe1.sbi
│ │ ├── organ1.sbi
│ │ ├── organ2.sbi
│ │ ├── organ3.sbi
│ │ ├── organ3a.sbi
│ │ ├── organ3b.sbi
│ │ ├── organ4.sbi
│ │ ├── orgel.cif
│ │ ├── orgnperc.sbi
│ │ ├── pan.cif
│ │ ├── panic.sgi
│ │ ├── phone1.sbi
│ │ ├── phone2.sbi
│ │ ├── pian1a.sbi
│ │ ├── pian1b.sbi
│ │ ├── pian1c.sbi
│ │ ├── piano.ins
│ │ ├── piano.sbi
│ │ ├── piano.sgi
│ │ ├── piano1.sbi
│ │ ├── piano2.sbi
│ │ ├── piano3.sbi
│ │ ├── piano4.sbi
│ │ ├── pianobel.sbi
│ │ ├── pianof.sbi
│ │ ├── piccolo.sbi
│ │ ├── piffclap.sgi
│ │ ├── pipes.sbi
│ │ ├── pling.cif
│ │ ├── popbass1.sbi
│ │ ├── popcorn.sbi
│ │ ├── powerbas.sgi
│ │ ├── powersn.sgi
│ │ ├── pzzicato.sgi
│ │ ├── reverb2.sbi
│ │ ├── rksnare1.sbi
│ │ ├── rlog.sbi
│ │ ├── roehr.cif
│ │ ├── sachso2.sgi
│ │ ├── sax.ins
│ │ ├── sax1.sbi
│ │ ├── saxafone.sbi
│ │ ├── scratch.sbi
│ │ ├── scratch4.sbi
│ │ ├── sdrum2.sbi
│ │ ├── seashore.sbi
│ │ ├── sftbrss1.sbi
│ │ ├── sftfl2.sbi
│ │ ├── shaker.cif
│ │ ├── shaker.sbi
│ │ ├── shppizz.sbi
│ │ ├── shrtbass.cif
│ │ ├── shrttne2.sbi
│ │ ├── shrtvibe.sbi
│ │ ├── shrtviol.cif
│ │ ├── silly.sgi
│ │ ├── sitar.sbi
│ │ ├── sitar1.sbi
│ │ ├── sitar2.sbi
│ │ ├── slapbs1.sbi
│ │ ├── snakefl.sbi
│ │ ├── snare.ins
│ │ ├── snare.sbi
│ │ ├── snare1.fin
│ │ ├── snare1.sbi
│ │ ├── snare2.cif
│ │ ├── snare2.sbi
│ │ ├── snare7.sbi
│ │ ├── snrsust.sbi
│ │ ├── softpizz.sbi
│ │ ├── softsax.sbi
│ │ ├── softtrom.cif
│ │ ├── solovln.sbi
│ │ ├── space.cif
│ │ ├── spring.cif
│ │ ├── st1.sbi
│ │ ├── start.fin
│ │ ├── steelgt1.sbi
│ │ ├── steelgt2.sbi
│ │ ├── string0.cif
│ │ ├── string1.cif
│ │ ├── string2.cif
│ │ ├── string3.cif
│ │ ├── string4.cif
│ │ ├── string5.cif
│ │ ├── string6.cif
│ │ ├── strings1.sbi
│ │ ├── strings2.sgi
│ │ ├── strings3.sgi
│ │ ├── strloop.fin
│ │ ├── strnlong.sbi
│ │ ├── strom.sgi
│ │ ├── strom2.sgi
│ │ ├── sunrise.sgi
│ │ ├── sunrise2.sgi
│ │ ├── sunrise4.sgi
│ │ ├── sweep.sbi
│ │ ├── syn1.sbi
│ │ ├── syn2.cif
│ │ ├── syn2.sbi
│ │ ├── syn3.cif
│ │ ├── syn3.sbi
│ │ ├── syn4.cif
│ │ ├── syn4.sbi
│ │ ├── syn5.sbi
│ │ ├── syn6.sbi
│ │ ├── syn9.sbi
│ │ ├── synbal1.sbi
│ │ ├── synbal2.sbi
│ │ ├── synbass.sbi
│ │ ├── synbass1.sbi
│ │ ├── synbass2.sbi
│ │ ├── synbass4.sbi
│ │ ├── synbuz.sbi
│ │ ├── syncrsh.cif
│ │ ├── synmllet.sgi
│ │ ├── synsnr1.sbi
│ │ ├── synsnr2.sbi
│ │ ├── syntbell.cif
│ │ ├── synth.ins
│ │ ├── synth1.sbi
│ │ ├── syntom.cif
│ │ ├── tamb_g.cif
│ │ ├── tech.sgi
│ │ ├── tech2.sgi
│ │ ├── techno.sgi
│ │ ├── technol.sgi
│ │ ├── tensax.sbi
│ │ ├── tensax2.sbi
│ │ ├── tensax3.sbi
│ │ ├── tensax4.sbi
│ │ ├── terz.sgi
│ │ ├── terzm.sgi
│ │ ├── tincan1.sbi
│ │ ├── tom.cif
│ │ ├── tom.sbi
│ │ ├── tom1.sbi
│ │ ├── tom2.cif
│ │ ├── tom2.sbi
│ │ ├── tomtom.sgi
│ │ ├── tone.cif
│ │ ├── topcbl.sgi
│ │ ├── topcbl2.sgi
│ │ ├── trainbel.sbi
│ │ ├── triangle.sbi
│ │ ├── triangle.sgi
│ │ ├── trible.sgi
│ │ ├── troll.sgi
│ │ ├── tromb1.sbi
│ │ ├── tromb2.sbi
│ │ ├── trombone.sbi
│ │ ├── trompet.cif
│ │ ├── trpcup1.sbi
│ │ ├── trumpet.sbi
│ │ ├── trumpet1.sbi
│ │ ├── trumpet2.sbi
│ │ ├── trumpet3.sbi
│ │ ├── trumpet4.sbi
│ │ ├── tuba.cif
│ │ ├── tuba1.sbi
│ │ ├── tuba2.sbi
│ │ ├── tuba2.sgi
│ │ ├── tuba3.sbi
│ │ ├── ultra.sgi
│ │ ├── ultra2.sgi
│ │ ├── upswing.sgi
│ │ ├── v42-2.sgi
│ │ ├── v42.sgi
│ │ ├── verplant.cif
│ │ ├── vibra1.sbi
│ │ ├── vibra2.sbi
│ │ ├── vibra3.sbi
│ │ ├── viol.sgi
│ │ ├── violin.ins
│ │ ├── violin.sbi
│ │ ├── violin1.sbi
│ │ ├── violin2.sbi
│ │ ├── violin3.sbi
│ │ ├── vlnpizz.sbi
│ │ ├── vlnpizz1.sbi
│ │ ├── vol.sgi
│ │ ├── wamm.cif
│ │ ├── warp.sgi
│ │ ├── water.sgi
│ │ ├── wave.sbi
│ │ ├── wave1.sbi
│ │ ├── whistle.cif
│ │ ├── woodbloc.fin
│ │ ├── xylo.cif
│ │ ├── xylo1.sbi
│ │ ├── xylo2.sbi
│ │ ├── xylo3.sbi
│ │ ├── xylofone.sbi
│ │ ├── ykabass1.sbi
│ │ └── zong.cif
│ ├── DOSBox/
│ │ ├── doofus.dro
│ │ ├── dro_v2.dro
│ │ └── samurai.dro
│ ├── DRUMOPL.IBK
│ ├── DRUMOPL.tmb
│ ├── Earthsieg.wopl
│ ├── FingerBass.sbi
│ ├── Hammond.sbi
│ ├── Info.txt
│ ├── Mobilnik-v2.wopl
│ ├── Mobilnik.wopl
│ ├── Piano.4op
│ ├── Reality AdLib tracker/
│ │ ├── cybernet.ins
│ │ ├── midi.ins
│ │ └── pulsebass.ins
│ ├── Sci/
│ │ ├── pq2.bnk
│ │ ├── pq2.pat
│ │ ├── sci.patch.format.txt
│ │ ├── sq4.bnk
│ │ └── sq4.pat
│ ├── StellDrums.sbi
│ ├── Wolfinstein.OP2
│ ├── cyberpuck.tmb
│ ├── d3dtimbr-modded.wopl
│ ├── d3dtimbr.op2
│ ├── d3dtimbr.tmb
│ ├── default.tmb
│ ├── dmx_dmx.op2
│ ├── dmx_doom1.op2
│ ├── dmx_doom2.op2
│ ├── dmx_raptor.op2
│ ├── dmx_strife.op2
│ ├── drums.o3
│ ├── drums.sb
│ ├── earthsieg.ad
│ ├── example.wopl
│ ├── fat-drums.o3
│ ├── fat-drums.sb
│ ├── fat-melodic.o3
│ ├── fat-melodic.sb
│ ├── fat2.op3
│ ├── fat4.op3
│ ├── file49.opl
│ ├── file53.opl
│ ├── glockenspielprealpha.opli
│ ├── gmoconel.tmb
│ ├── gmopl-2.ibk
│ ├── gmopl-3.ibk
│ ├── gmopl.ibk
│ ├── gmoplmod.tmb
│ ├── hmi-drums-144.bnk
│ ├── hmi-melodic-144.bnk
│ ├── insmaker_standard.bnk
│ ├── jv_2op.op3
│ ├── nemesis.opl
│ ├── rock-organ-1.opli
│ ├── rock-organ-doom.opli
│ ├── std.o3
│ ├── std.sb
│ ├── swtimbr.tmb
│ ├── synth.pat
│ ├── test-2.wopl
│ ├── test.wopl
│ ├── tim.snd
│ ├── tim.tim
│ ├── tumubar-bell-dmx.sbi
│ ├── wallace.op3
│ ├── wallence.tmb
│ └── warcraft.ad
├── CMakeLists.txt
├── FMBankEdit.pro
├── LICENSE
├── README.md
├── Specifications/
│ ├── AILBANK.TXT
│ ├── DMX OP2 Bank Format.txt
│ ├── HMI BNK Format.txt
│ ├── Opl3Bank.fbs
│ ├── RIFF FM4 PAT specification.txt
│ ├── Reality ADlib Tracker format.cp437.txt.utf-8.txt
│ ├── TMB Format.txt
│ ├── UNIX SoundBlaster Patch.txt
│ ├── WOPL-and-OPLI-Specification.odt
│ ├── WOPL-and-OPLI-Specification.txt
│ ├── WOPLX-Specification.txt
│ └── YMF262 chip specification.odt
├── _Misc/
│ ├── GMOPL2.IBK
│ ├── GMOPL4.IBK
│ ├── bisqwit-2.adlraw
│ ├── bisqwit.adlraw
│ ├── bnk1.bnk
│ ├── bnk2.bnk
│ ├── bytecmp_adlraw.c
│ ├── bytecmp_bnk.c
│ ├── bytecmp_dmx.c
│ ├── bytecmp_ibk.c
│ ├── bytecmp_ibk2.c
│ ├── bytecmp_ibk3.c
│ ├── bytecmp_op3.c
│ ├── bytecmp_silly.c
│ ├── bytecmp_tim.c
│ ├── bytecmp_tmb.c
│ ├── cmp1.op3
│ ├── cmp2.op3
│ ├── compare_banks.sh
│ ├── dmx_doom2.op2
│ ├── dmx_doom2_modded.op2
│ ├── duke1.tmb
│ ├── duke2.tmb
│ ├── dumb_bnk.c
│ ├── file144-2.bnk
│ ├── file144.bnk
│ ├── file53.opl
│ ├── file53_dupe.opl
│ ├── grassman.txt
│ ├── grassman1.bnk
│ ├── grassman2.bnk
│ ├── grassman2.txt
│ ├── ibk1.ibk
│ ├── ibk2.ibk
│ ├── insmaker_standard.bnk
│ ├── lostvik1.ad
│ ├── lostvik1.opl
│ ├── lostvik2.ad
│ ├── lostvik2.opl
│ ├── perk1.ibk
│ ├── perk2.ibk
│ ├── qt-4-4-3-build/
│ │ ├── Readme.txt
│ │ └── make-qt-4-4-3.bat
│ ├── sbnk1.bnk
│ ├── sbnk2.bnk
│ ├── std-2.o3
│ ├── std-2.sb
│ ├── std.o3
│ ├── std.sb
│ ├── tim.snd
│ └── tim.tim
├── build.bat
├── changelog.txt
├── cmake/
│ ├── FindQwt.cmake
│ ├── ci_linux_gcc_toolchain_arm64.cmake
│ ├── ci_linux_gcc_toolchain_armhf.cmake
│ ├── ci_linux_gcc_toolchain_x32.cmake
│ ├── ci_windows_mingw_toolchain_x32.cmake
│ ├── ci_windows_mingw_toolchain_x64.cmake
│ ├── ci_windows_winmm_mingw_toolchain_vanilla.cmake
│ ├── ci_windows_winmm_mingw_toolchain_x32.cmake
│ ├── ci_windows_winmm_mingw_toolchain_x64.cmake
│ ├── deploy.cmake
│ ├── library_qt.cmake
│ └── static_qt.cmake
├── formats_info.htm
├── license.txt
├── opl_proxy/
│ ├── dummy-non-windows/
│ │ └── oplproxy.c
│ ├── modern/
│ │ ├── .gitignore
│ │ ├── InpOut32Helper.c
│ │ ├── InpOut32Helper.h
│ │ ├── Readme.txt
│ │ ├── build32.bat
│ │ ├── build32.sh
│ │ ├── build64.bat
│ │ ├── build64.sh
│ │ ├── liboplproxy.def
│ │ ├── liboplproxy.tgt
│ │ ├── liboplproxy_exports.txt
│ │ ├── oplproxy.c
│ │ ├── oplproxy.wpj
│ │ └── update_exports.bat
│ └── win9x/
│ ├── .gitignore
│ ├── Readme.txt
│ ├── liboplproxy.tgt
│ ├── liboplproxy_exports.txt
│ ├── oplproxy.c
│ ├── oplproxy.wpj
│ ├── update_exports.bat
│ └── update_exports.sh
├── src/
│ ├── FileFormats/
│ │ ├── Opl3Bank_generated.h
│ │ ├── ffmt_base.cpp
│ │ ├── ffmt_base.h
│ │ ├── ffmt_enums.cpp
│ │ ├── ffmt_enums.h
│ │ ├── ffmt_factory.cpp
│ │ ├── ffmt_factory.h
│ │ ├── format_adlib_bnk.cpp
│ │ ├── format_adlib_bnk.h
│ │ ├── format_adlib_tim.cpp
│ │ ├── format_adlib_tim.h
│ │ ├── format_adlibgold_bnk2.cpp
│ │ ├── format_adlibgold_bnk2.h
│ │ ├── format_ail2_gtl.cpp
│ │ ├── format_ail2_gtl.h
│ │ ├── format_apogeetmb.cpp
│ │ ├── format_apogeetmb.h
│ │ ├── format_bisqwit.cpp
│ │ ├── format_bisqwit.h
│ │ ├── format_cmf_importer.cpp
│ │ ├── format_cmf_importer.h
│ │ ├── format_dmxopl2.cpp
│ │ ├── format_dmxopl2.h
│ │ ├── format_dro_importer.cpp
│ │ ├── format_dro_importer.h
│ │ ├── format_ea_importer.cpp
│ │ ├── format_ea_importer.h
│ │ ├── format_flatbuffer_opl3.cpp
│ │ ├── format_flatbuffer_opl3.h
│ │ ├── format_imf_importer.cpp
│ │ ├── format_imf_importer.h
│ │ ├── format_junlevizion.cpp
│ │ ├── format_junlevizion.h
│ │ ├── format_klm_importer.cpp
│ │ ├── format_klm_importer.h
│ │ ├── format_misc_cif.cpp
│ │ ├── format_misc_cif.h
│ │ ├── format_misc_hsc.cpp
│ │ ├── format_misc_hsc.h
│ │ ├── format_misc_sgi.cpp
│ │ ├── format_misc_sgi.h
│ │ ├── format_patch_fm4.cpp
│ │ ├── format_patch_fm4.h
│ │ ├── format_rad_importer.cpp
│ │ ├── format_rad_importer.h
│ │ ├── format_sb_ibk.cpp
│ │ ├── format_sb_ibk.h
│ │ ├── format_smaf_importer.cpp
│ │ ├── format_smaf_importer.h
│ │ ├── format_vgm_import.cpp
│ │ ├── format_vgm_import.h
│ │ ├── format_wohlstand_opl3.cpp
│ │ ├── format_wohlstand_opl3.h
│ │ ├── format_wohlstand_opl3_text.cpp
│ │ ├── format_wohlstand_opl3_text.h
│ │ ├── wopl/
│ │ │ ├── wopl_file.c
│ │ │ └── wopl_file.h
│ │ ├── ymf262_to_wopi.cpp
│ │ └── ymf262_to_wopi.h
│ ├── audio/
│ │ ├── ao_rtaudio.cpp
│ │ ├── ao_rtaudio.h
│ │ ├── ao_rtaudio.pri
│ │ └── for-mingw-9x/
│ │ └── dsound.h
│ ├── audio.cpp
│ ├── audio_config.cpp
│ ├── audio_config.h
│ ├── audio_config.ui
│ ├── bank.cpp
│ ├── bank.h
│ ├── bank_comparison.cpp
│ ├── bank_comparison.h
│ ├── bank_comparison.ui
│ ├── bank_editor.cpp
│ ├── bank_editor.h
│ ├── bank_editor.ui
│ ├── bank_type_dlg.cpp
│ ├── bank_type_dlg.h
│ ├── common.cpp
│ ├── common.h
│ ├── controlls.cpp
│ ├── delay_analysis.cpp
│ ├── delay_analysis.h
│ ├── delay_analysis.ui
│ ├── flatbuffers/
│ │ ├── base.h
│ │ ├── flatbuffers.h
│ │ └── stl_emulation.h
│ ├── formats_sup.cpp
│ ├── formats_sup.h
│ ├── formats_sup.ui
│ ├── hardware.cpp
│ ├── hardware.h
│ ├── hardware.ui
│ ├── importer.cpp
│ ├── importer.h
│ ├── importer.ui
│ ├── ins_names.cpp
│ ├── ins_names.h
│ ├── ins_names_data.h
│ ├── main.cpp
│ ├── main.h
│ ├── metaparameter.h
│ ├── midi/
│ │ ├── midi_rtmidi.cpp
│ │ ├── midi_rtmidi.h
│ │ └── midi_rtmidi.pri
│ ├── operator_editor.cpp
│ ├── operator_editor.h
│ ├── operator_editor.ui
│ ├── opl/
│ │ ├── generator.cpp
│ │ ├── generator.h
│ │ ├── generator_realtime.cpp
│ │ ├── generator_realtime.h
│ │ ├── measurer.cpp
│ │ ├── measurer.h
│ │ ├── models/
│ │ │ ├── LICENSE.txt
│ │ │ ├── model_ail.c
│ │ │ ├── model_apogee.c
│ │ │ ├── model_dmx.c
│ │ │ ├── model_generic.c
│ │ │ ├── model_hmi_sos.c
│ │ │ ├── model_msadlib.c
│ │ │ ├── model_oconnell.c
│ │ │ ├── model_win9x.c
│ │ │ ├── opl_models.cmake
│ │ │ ├── opl_models.h
│ │ │ └── util/
│ │ │ ├── README.txt
│ │ │ ├── freq-opl.c
│ │ │ └── oplbrightness.c
│ │ ├── nukedopl3.h
│ │ └── realtime/
│ │ ├── ring_buffer.cpp
│ │ ├── ring_buffer.h
│ │ └── ring_buffer.tcc
│ ├── piano.cpp
│ ├── piano.h
│ ├── proxystyle.cpp
│ ├── proxystyle.h
│ ├── resources/
│ │ ├── file_adbnk/
│ │ │ ├── file_adbnk_128x128.xcf
│ │ │ ├── file_adbnk_16x16.xcf
│ │ │ ├── file_adbnk_256x256.xcf
│ │ │ ├── file_adbnk_32x32.xcf
│ │ │ ├── file_adbnk_48x48.xcf
│ │ │ └── make_icns.sh
│ │ ├── file_adbnk.icns
│ │ ├── file_adins/
│ │ │ ├── file_adins_16x16.xcf
│ │ │ ├── file_adins_256x256.xcf
│ │ │ ├── file_adins_32x32.xcf
│ │ │ ├── file_adins_48x48.xcf
│ │ │ └── make_icns.sh
│ │ ├── file_adins.icns
│ │ ├── file_dmx/
│ │ │ ├── file_dmx_128x128.xcf
│ │ │ ├── file_dmx_16x16.xcf
│ │ │ ├── file_dmx_256x256.xcf
│ │ │ ├── file_dmx_32x32.xcf
│ │ │ ├── file_dmx_48x48.xcf
│ │ │ └── make_icns.sh
│ │ ├── file_dmx.icns
│ │ ├── file_fm4/
│ │ │ ├── file_fm4_128x128.xcf
│ │ │ ├── file_fm4_16x16.xcf
│ │ │ ├── file_fm4_256x256.xcf
│ │ │ ├── file_fm4_32x32.xcf
│ │ │ ├── file_fm4_48x48.xcf
│ │ │ └── make_icns.sh
│ │ ├── file_fm4.icns
│ │ ├── file_hmi/
│ │ │ ├── file_hmi_128x128.xcf
│ │ │ ├── file_hmi_16x16.xcf
│ │ │ ├── file_hmi_256x256.xcf
│ │ │ ├── file_hmi_32x32.xcf
│ │ │ ├── file_hmi_48x48.xcf
│ │ │ └── make_icns.sh
│ │ ├── file_hmi.icns
│ │ ├── file_ibk/
│ │ │ ├── file_ibk_16x16.xcf
│ │ │ ├── file_ibk_256x256.xcf
│ │ │ ├── file_ibk_32x32.xcf
│ │ │ ├── file_ibk_48x48.xcf
│ │ │ └── make_icns.sh
│ │ ├── file_ibk.icns
│ │ ├── file_jv/
│ │ │ ├── file_jv_128x128.xcf
│ │ │ ├── file_jv_16x16.xcf
│ │ │ ├── file_jv_256x256.xcf
│ │ │ ├── file_jv_32x32.xcf
│ │ │ ├── file_jv_48x48.xcf
│ │ │ └── make_icns.sh
│ │ ├── file_jv.icns
│ │ ├── file_miles/
│ │ │ ├── file_miles_128x128.xcf
│ │ │ ├── file_miles_16x16.xcf
│ │ │ ├── file_miles_256x256.xcf
│ │ │ ├── file_miles_32x32.xcf
│ │ │ ├── file_miles_48x48.xcf
│ │ │ └── make_icns.sh
│ │ ├── file_miles.icns
│ │ ├── file_opli/
│ │ │ ├── file_opli_128x128.xcf
│ │ │ ├── file_opli_16x16.xcf
│ │ │ ├── file_opli_256x256.xcf
│ │ │ ├── file_opli_32x32.xcf
│ │ │ ├── file_opli_48x48.xcf
│ │ │ └── make_icns.sh
│ │ ├── file_opli.icns
│ │ ├── file_sbi/
│ │ │ ├── file_sbi_16x16.xcf
│ │ │ ├── file_sbi_256x256.xcf
│ │ │ ├── file_sbi_32x32.xcf
│ │ │ ├── file_sbi_48x48.xcf
│ │ │ └── make_icns.sh
│ │ ├── file_sbi.icns
│ │ ├── file_tmb/
│ │ │ ├── file_tmb_128x128.xcf
│ │ │ ├── file_tmb_16x16.xcf
│ │ │ ├── file_tmb_256x256.xcf
│ │ │ ├── file_tmb_32x32.xcf
│ │ │ ├── file_tmb_48x48.xcf
│ │ │ └── make_icns.sh
│ │ ├── file_tmb.icns
│ │ ├── file_wopl/
│ │ │ ├── file_wopl_128x128.xcf
│ │ │ ├── file_wopl_16x16.xcf
│ │ │ ├── file_wopl_256x256.xcf
│ │ │ ├── file_wopl_32x32.xcf
│ │ │ ├── file_wopl_48x48.xcf
│ │ │ └── make_icns.sh
│ │ ├── file_wopl.icns
│ │ ├── info.plist.in
│ │ ├── make_icns.sh
│ │ ├── mime/
│ │ │ ├── opl3-banks.xml
│ │ │ └── opl3-instruments.xml
│ │ ├── opl3.icns
│ │ ├── opl3_bank_editor.desktop
│ │ ├── res.rc
│ │ ├── resources.qrc
│ │ ├── tpl_file_bank/
│ │ │ ├── file_wopl_16x16.xcf
│ │ │ ├── file_wopl_256x256.xcf
│ │ │ ├── file_wopl_32x32.xcf
│ │ │ ├── file_wopl_48x48.xcf
│ │ │ └── make_icns.sh
│ │ └── tpl_file_inst/
│ │ ├── file_opli_16x16.xcf
│ │ ├── file_opli_256x256.xcf
│ │ ├── file_opli_32x32.xcf
│ │ ├── file_opli_48x48.xcf
│ │ └── make_icns.sh
│ ├── translations/
│ │ ├── opl3bankeditor_fr_FR.ts
│ │ ├── opl3bankeditor_pl_PL.ts
│ │ └── opl3bankeditor_ru_RU.ts
│ └── version.h
├── test/
│ ├── build_deb.sh
│ └── wopl_rw/
│ ├── test.wopl
│ ├── test_data.qrc
│ ├── tst_wopl_rwtest.cpp
│ └── wopl_rw.pro
├── upd_submodules.sh
└── utils/
├── create-dmg/
│ ├── create-dmg.sh
│ └── support/
│ ├── dmg-license.py
│ ├── dmg-license3.py
│ └── template.applescript
├── ftp-upload.sh
└── measurer/
└── measurer-tool.cpp
================================================
FILE CONTENTS
================================================
================================================
FILE: .devcontainer/Dockerfile
================================================
FROM mcr.microsoft.com/devcontainers/cpp:1-debian-12
ARG REINSTALL_CMAKE_VERSION_FROM_SOURCE="3.21.5"
# Optionally install the cmake for vcpkg
COPY ./reinstall-cmake.sh /tmp/
RUN if [ "${REINSTALL_CMAKE_VERSION_FROM_SOURCE}" != "none" ]; then \
chmod +x /tmp/reinstall-cmake.sh && /tmp/reinstall-cmake.sh ${REINSTALL_CMAKE_VERSION_FROM_SOURCE}; \
fi \
&& rm -f /tmp/reinstall-cmake.sh
# [Optional] Uncomment this section to install additional vcpkg ports.
# RUN su vscode -c "${VCPKG_ROOT}/vcpkg install <your-port-name-here>"
# [Optional] Uncomment this section to install additional packages.
RUN apt-get update && export DEBIAN_FRONTEND=noninteractive \
&& apt-get -y install --no-install-recommends qtbase5-dev qttools5-dev qttools5-dev-tools libasound2-dev
================================================
FILE: .devcontainer/devcontainer.json
================================================
// For format details, see https://aka.ms/devcontainer.json. For config options, see the
// README at: https://github.com/devcontainers/templates/tree/main/src/cpp
{
"name": "C++",
"build": {
"dockerfile": "Dockerfile"
}
// Features to add to the dev container. More info: https://containers.dev/features.
// "features": {},
// Use 'forwardPorts' to make a list of ports inside the container available locally.
// "forwardPorts": [],
// Use 'postCreateCommand' to run commands after the container is created.
// "postCreateCommand": "gcc -v",
// Configure tool-specific properties.
// "customizations": {},
// Uncomment to connect as root instead. More info: https://aka.ms/dev-containers-non-root.
// "remoteUser": "root"
}
================================================
FILE: .devcontainer/reinstall-cmake.sh
================================================
#!/usr/bin/env bash
#-------------------------------------------------------------------------------------------------------------
# Copyright (c) Microsoft Corporation. All rights reserved.
# Licensed under the MIT License. See https://go.microsoft.com/fwlink/?linkid=2090316 for license information.
#-------------------------------------------------------------------------------------------------------------
#
set -e
CMAKE_VERSION=${1:-"none"}
if [ "${CMAKE_VERSION}" = "none" ]; then
echo "No CMake version specified, skipping CMake reinstallation"
exit 0
fi
# Cleanup temporary directory and associated files when exiting the script.
cleanup() {
EXIT_CODE=$?
set +e
if [[ -n "${TMP_DIR}" ]]; then
echo "Executing cleanup of tmp files"
rm -Rf "${TMP_DIR}"
fi
exit $EXIT_CODE
}
trap cleanup EXIT
echo "Installing CMake..."
apt-get -y purge --auto-remove cmake
mkdir -p /opt/cmake
architecture=$(dpkg --print-architecture)
case "${architecture}" in
arm64)
ARCH=aarch64 ;;
amd64)
ARCH=x86_64 ;;
*)
echo "Unsupported architecture ${architecture}."
exit 1
;;
esac
CMAKE_BINARY_NAME="cmake-${CMAKE_VERSION}-linux-${ARCH}.sh"
CMAKE_CHECKSUM_NAME="cmake-${CMAKE_VERSION}-SHA-256.txt"
TMP_DIR=$(mktemp -d -t cmake-XXXXXXXXXX)
echo "${TMP_DIR}"
cd "${TMP_DIR}"
curl -sSL "https://github.com/Kitware/CMake/releases/download/v${CMAKE_VERSION}/${CMAKE_BINARY_NAME}" -O
curl -sSL "https://github.com/Kitware/CMake/releases/download/v${CMAKE_VERSION}/${CMAKE_CHECKSUM_NAME}" -O
sha256sum -c --ignore-missing "${CMAKE_CHECKSUM_NAME}"
sh "${TMP_DIR}/${CMAKE_BINARY_NAME}" --prefix=/opt/cmake --skip-license
ln -s /opt/cmake/bin/cmake /usr/local/bin/cmake
ln -s /opt/cmake/bin/ctest /usr/local/bin/ctest
================================================
FILE: .gitattributes
================================================
_Misc/* linguist-vendored
Bank_Examples/* linguist-vendored
*.h linguist-language=cpp
*.bat linguist-vendored text eol=crlf
*.pro linguist-vendored
*.sh linguist-vendored
*.htm linguist-vendored
*.txt text eol=crlf
*.def text eol=crlf
*.ts linguist-vendored
# Watcom's project files
*.wpj text eol=crlf
*.tgt text eol=crlf
================================================
FILE: .github/workflows/macos-ci.yml
================================================
name: macOS CI
on:
push:
branches:
- master
pull_request:
branches:
- master
workflow_dispatch:
concurrency:
group: ${{ github.workflow }}-${{ github.ref }}
cancel-in-progress: true
jobs:
build:
name: "${{ matrix.config.name }} | ${{ matrix.config.build_type }}"
runs-on: ${{ matrix.config.os }}
strategy:
fail-fast: true
matrix:
config:
- {
name: "Intel x64",
arch: "x86_64",
os: macos-15-intel,
osx_target: "10.12",
extra_path: "/Users/StaticQt/5.14.2/bin",
build_type: "Release",
upload_directory: "www/macosx/opl3-bank-editor/",
qt_download: "https://wohlsoft.ru/docs/Software/QtBuilds/qt-5-14-2-static-macosx-10-14-6.tar.bz2", qt_install_dir: "/Users/StaticQt/",
qt_ver: "5.14.2",
qt_dir: "/Users/StaticQt/5.14.2/bin",
qt_lib_dir: "/Users/StaticQt/5.14.2/lib"
}
- {
name: "Apple Silicon",
arch: "arm64",
os: macos-15,
osx_target: "10.13",
extra_path: "/Users/StaticQt/5.15.16/bin",
build_type: "Release",
upload_directory: "www/macosx/opl3-bank-editor/",
# FIXME: When switching to Xcode 26, use the "no-agl" edition of Qt build, otherwise build will fail
qt_download: "https://wohlsoft.ru/docs/Software/QtBuilds/qt-5-15-16-static-macosx-15-3-1.tar.bz2", qt_install_dir: "/Users/StaticQt/",
qt_ver: "5.15.16",
qt_dir: "/Users/StaticQt/5.15.16/bin",
qt_lib_dir: "/Users/StaticQt/5.15.16/lib"
}
steps:
- name: Check for the upload support
id: upload-check
shell: bash
run: |
if [[ "${{ secrets.builds_login }}" != '' && \
"${{ secrets.builds_password }}" != '' && \
"${{ secrets.builds_host }}" != '' ]]; then
echo "available=true" >> $GITHUB_OUTPUT;
else
echo "available=false" >> $GITHUB_OUTPUT;
fi
- uses: actions/checkout@v3
with:
fetch-depth: 3
submodules: recursive
- uses: Wohlstand/branch-name@v1.0.1-wohl
- name: Check if a pull request
id: event-check
shell: bash
run: |
if [[ "${BRANCH_NAME}" == *"merge"* ]]; then
echo "--- This build is a pull-request ---"
echo "is_pull_request=true" >> $GITHUB_OUTPUT;
else
echo "--- This build is a normal branch build ---"
echo "is_pull_request=false" >> $GITHUB_OUTPUT;
fi
- name: Install dependencies
shell: bash
run: |
brew install coreutils binutils gnu-sed lftp axel
# cmake wget p7zip ninja
git submodule init
git submodule update
mkdir build-temp
- name: Download Qt
if: matrix.config.qt_download
uses: carlosperate/download-file-action@v2
with:
file-url: "${{ matrix.config.qt_download }}"
file-name: build-temp/qt.tar.bz2
- name: Extract Qt
if: matrix.config.qt_install_dir
shell: bash
run: |
sudo mkdir -p "${{ matrix.config.qt_install_dir }}"
sudo tar -xf build-temp/qt.tar.bz2 -C "${{ matrix.config.qt_install_dir }}"
- name: Configure
shell: bash
run: |
if [[ ! -z "${{ matrix.config.extra_path }}" ]]; then
export PATH=${{ matrix.config.extra_path }}:${PATH}
fi
if [[ "${BRANCH_NAME}" == *"merge"* ]]; then
BRANCH_NAME_RES="pull-request"
echo "-- Pull-request detected!"
else
BRANCH_NAME_RES=${BRANCH_NAME}
fi
echo "====================================="
clang --version
echo "====================================="
git --version
echo "====================================="
cmake --version
echo "====================================="
cmake -B build -G Ninja -DCMAKE_BUILD_TYPE=${{ matrix.config.build_type }} \
-DCMAKE_PREFIX_PATH=/Users/StaticQt/${{ matrix.config.qt_ver }} \
-DCMAKE_INSTALL_PREFIX=$PWD/build/inst ${{ matrix.config.extra_options }} \
-DUSE_STATIC_QT=ON \
-DCPACK_GENERATOR="DragNDrop;ZIP" \
-DCPACK_PACKAGE_FILE_NAME="opl3-bank-editor-${{ matrix.config.arch }}-${BRANCH_NAME_RES}" \
.
- name: Build
shell: bash
run: |
cmake --build build --target all --config ${{ matrix.config.build_type }} --parallel 3
- name: Create DMG package
shell: bash
id: create_package
if: success()
run: |
if [[ ! -z "${{ matrix.config.extra_path }}" ]]; then
export PATH=${{ matrix.config.extra_path }}:${PATH}
fi
cd build
cpack .
cd ..
- name: Upload DMG artifact
if: success() && steps.upload-check.outputs.available == 'true'
uses: actions/upload-artifact@v4
continue-on-error: true
with:
path: build/*.dmg
name: ${{ matrix.config.name }} ${{ matrix.config.build_type }} DMG
- name: Upload ZIP artifact
if: success() && steps.upload-check.outputs.available == 'true'
uses: actions/upload-artifact@v4
continue-on-error: true
with:
path: build/*.zip
name: ${{ matrix.config.name }} ${{ matrix.config.build_type }} ZIP
- name: Deploy to builds.wohlsoft.ru
if: success() && github.event_name != 'pull_request' && github.event_name != 'workflow_dispatch' && steps.event-check.outputs.is_pull_request == 'false' && steps.upload-check.outputs.available == 'true'
shell: bash
run: |
if [[ ! -z "${{ matrix.config.extra_path }}" ]]; then
export PATH=${{ matrix.config.extra_path }}:${PATH}
fi
if [[ "${BRANCH_NAME}" == *"merge"* ]]; then
BRANCH_NAME_RES="pull-request"
echo "-- Pull-request detected!"
else
BRANCH_NAME_RES=${BRANCH_NAME}
fi
UPLOAD_LIST="set ssl:verify-certificate no;"
for q in ./build/*.dmg; do
UPLOAD_LIST="${UPLOAD_LIST} put -O ${{ matrix.config.upload_directory }} $q;"
done
for q in ./build/*.zip; do
UPLOAD_LIST="${UPLOAD_LIST} put -O ${{ matrix.config.upload_directory }} $q;"
done
# for q in ./bin-cmake-release/*.pkg; do
# UPLOAD_LIST="${UPLOAD_LIST} put -O ${{ matrix.config.upload_directory }} $q;"
# done
lftp -e "${UPLOAD_LIST} exit" -u ${{ secrets.builds_login }},${{ secrets.builds_password }} ${{ secrets.builds_host }}
- name: List Build Directory
if: always()
shell: bash
run: |
git status
if [[ -d build ]]; then
ls -lR build
fi
================================================
FILE: .github/workflows/ubuntu-ci.yml
================================================
name: Ubuntu CI
on:
push:
branches:
- master
pull_request:
branches:
- master
workflow_dispatch:
concurrency:
group: ${{ github.workflow }}-${{ github.ref }}
cancel-in-progress: true
jobs:
build:
name: "${{ matrix.config.name }} | ${{ matrix.config.build_type }}"
runs-on: ${{ matrix.config.os }}
container: ${{ matrix.config.container }}
strategy:
fail-fast: true
matrix:
config:
- {
name: "Ubuntu 14.04 x86_64",
os: ubuntu-latest,
container: "ubuntu:14.04",
generator: "Ninja",
build_type: "Release",
upload_directory: "www/ubuntu-14-04/",
package_name_suffix: "ubuntu-14-04-amd64",
lftp_gz_download: "https://wohlsoft.ru/docs/Software/lftp-4.9.3-ubuntu14.04.tar.gz",
gcc_cc: "gcc-8",
gcc_cxx: "g++-8",
lrelease_exec: "/usr/lib/x86_64-linux-gnu/qt5/bin/lrelease",
extra_options: "-DFORCE_EXEC_NO_PIE=OFF",
deb_deps: "libqt5core5a (>= 5.2.1), libqt5gui5 (>= 5.2.1), libqt5widgets5 (>= 5.2.1), libqt5concurrent5 (>= 5.2.1), libqt5serialport5 (>= 5.2.1), libasound2 (>= 1.0.27), libpulse0, libfreetype6 (>= 2.5.2)",
deps_cmdline: "echo 'Ubuntu 14' \
&& apt-get update --fix-missing -qq \
&& apt-get install -y software-properties-common \
&& add-apt-repository -y \"ppa:git-core/ppa\" \
&& add-apt-repository -y \"ppa:ubuntu-toolchain-r/test\" \
&& apt-get update --fix-missing -qq \
&& apt-get install -f -qq \
&& apt-get install -qq \
sudo git p7zip-full ninja-build wget lftp dpkg-dev \
qt5-default qtbase5-dev qt5-qmake qttools5-dev qttools5-dev-tools libqt5concurrent5 \
qt5-image-formats-plugins libqt5serialport5-dev \
libasound2-dev libpulse-dev libudev-dev \
gcc-8 g++-8 libc6 libstdc++6 \
libexpat1 readline-common libreadline6 libgnutls28 libtinfo5 zlib1g \
&& wget https://github.com/Kitware/CMake/releases/download/v3.27.1/cmake-3.27.1-linux-x86_64.tar.gz -O cmake.tar.gz \
&& tar -xf cmake.tar.gz \
&& cp -a cmake-3.27.1-linux-x86_64/bin/* /usr/local/bin \
&& cp -a cmake-3.27.1-linux-x86_64/share/* /usr/local/share \
&& rm -vrf cmake.tar.gz cmake-3.27.1-linux-x86_64 \
&& git config --global --add safe.directory '*'"
}
- {
name: "Ubuntu 16.04 x86_64",
os: ubuntu-latest,
container: "ubuntu:16.04",
generator: "Ninja",
build_type: "Release",
upload_directory: "www/ubuntu-16-04/",
package_name_suffix: "ubuntu-16-04-amd64",
readline6_download: "https://wohlsoft.ru/docs/Software/libreadline6_6.3-8_amd64-ubuntu1804.deb",
lftp_download: "https://wohlsoft.ru/docs/Software/lftp_4.9.1-1_amd64-ubuntu1604.deb",
gcc_cc: "gcc-8",
gcc_cxx: "g++-8",
lrelease_exec: "/usr/bin/lrelease",
deb_deps: "libqt5core5a (>= 5.5.0), libqt5gui5 (>= 5.5.0), libqt5widgets5 (>= 5.5.0), libqt5concurrent5 (>= 5.5.0), libqt5serialport5 (>= 5.5.0), libqwt-qt5-6 (>= 6.1.2), libasound2 (>= 1.1.0), libpulse0, libfreetype6 (>= 2.6.1)",
deps_cmdline: "echo 'Ubuntu 16' \
&& apt-get update --fix-missing -qq \
&& apt-get install -y software-properties-common \
&& add-apt-repository -y \"ppa:git-core/ppa\" \
&& add-apt-repository -y \"ppa:ubuntu-toolchain-r/test\" \
&& apt-get update --fix-missing -qq \
&& apt-get install -f -qq \
&& apt-get install -qq \
sudo git p7zip-full ninja-build wget lftp dpkg-dev \
qt5-default qtbase5-dev qt5-qmake qttools5-dev qttools5-dev-tools libqt5concurrent5 \
qt5-image-formats-plugins libqt5serialport5-dev \
libasound2-dev libpulse-dev libudev-dev \
gcc-8 g++-8 libc6 libstdc++6 libqwt-qt5-dev \
libexpat1 readline-common libgnutls30 libtinfo5 zlib1g \
&& wget https://github.com/Kitware/CMake/releases/download/v3.27.1/cmake-3.27.1-linux-x86_64.tar.gz -O cmake.tar.gz \
&& tar -xf cmake.tar.gz \
&& cp -a cmake-3.27.1-linux-x86_64/bin/* /usr/local/bin \
&& cp -a cmake-3.27.1-linux-x86_64/share/* /usr/local/share \
&& rm -vrf cmake.tar.gz cmake-3.27.1-linux-x86_64 \
&& git config --global --add safe.directory '*'"
}
- {
name: "Ubuntu 18.04 x86_64",
os: ubuntu-latest,
container: "ubuntu:18.04",
generator: "Ninja",
build_type: "Release",
upload_directory: "www/ubuntu-18-04/",
package_name_suffix: "ubuntu-18-04-amd64",
readline6_download: "https://wohlsoft.ru/docs/Software/libreadline6_6.3-8_amd64-ubuntu1804.deb",
lftp_download: "https://wohlsoft.ru/docs/Software/lftp_4.9.1-1_amd64-ubuntu1604.deb",
gcc_cc: "gcc-8",
gcc_cxx: "g++-8",
lrelease_exec: "/usr/lib/qt5/bin/lrelease",
deb_deps: "libqt5core5a (>= 5.9.0), libqt5gui5 (>= 5.9.0), libqt5widgets5 (>= 5.9.0), libqt5concurrent5 (>= 5.9.0), libqt5serialport5 (>= 5.9.0), libqwt-qt5-6 (>= 6.1.3), libasound2 (>= 1.1.3), libpulse0, libfreetype6 (>= 2.8.0)",
deps_cmdline: "echo 'Ubuntu 18' \
&& apt-get update --fix-missing -qq \
&& apt-get install -y software-properties-common \
&& add-apt-repository -y \"ppa:git-core/ppa\" \
&& add-apt-repository -y \"ppa:ubuntu-toolchain-r/test\" \
&& apt-get update --fix-missing -qq \
&& apt-get install -f -qq \
&& apt-get install -qq \
sudo git p7zip-full ninja-build wget lftp dpkg-dev \
qt5-default qtbase5-dev qt5-qmake qttools5-dev qttools5-dev-tools libqt5concurrent5 \
qt5-image-formats-plugins libqt5serialport5-dev \
libasound2-dev libpulse-dev libudev-dev \
gcc-8 g++-8 libc6 libstdc++6 libqwt-qt5-dev \
libexpat1 readline-common libgnutls30 libtinfo5 zlib1g \
&& wget https://github.com/Kitware/CMake/releases/download/v3.27.1/cmake-3.27.1-linux-x86_64.tar.gz -O cmake.tar.gz \
&& tar -xf cmake.tar.gz \
&& cp -a cmake-3.27.1-linux-x86_64/bin/* /usr/local/bin \
&& cp -a cmake-3.27.1-linux-x86_64/share/* /usr/local/share \
&& rm -vrf cmake.tar.gz cmake-3.27.1-linux-x86_64 \
&& git config --global --add safe.directory '*'"
}
- {
name: "Ubuntu 20.04 x86_64",
os: ubuntu-latest,
container: "ubuntu:20.04",
generator: "Ninja",
build_type: "Release",
upload_directory: "www/ubuntu-20-04/",
package_name_suffix: "ubuntu-20-04-amd64",
gcc_cc: "gcc",
gcc_cxx: "g++",
lrelease_exec: "/usr/lib/qt5/bin/lrelease",
deb_deps: "libqt5core5a (>= 5.12.0), libqt5gui5 (>= 5.12.0), libqt5widgets5 (>= 5.12.0), libqt5concurrent5 (>= 5.12.0), libqt5serialport5 (>= 5.12.0), libqwt-qt5-6 (>= 6.1.4), libasound2 (>= 1.2.2), libpulse0, libfreetype6 (>= 2.10.0)",
deps_cmdline: "echo 'Ubuntu 20' \
&& apt-get update --fix-missing -qq \
&& apt-get install -y software-properties-common \
&& add-apt-repository -y \"ppa:git-core/ppa\" \
&& apt-get update --fix-missing -qq \
&& apt-get install -f -qq \
&& apt-get install -qq \
sudo git p7zip-full ninja-build cmake wget lftp dpkg-dev \
qtbase5-dev qt5-qmake qttools5-dev qttools5-dev-tools libqt5concurrent5 \
qt5-image-formats-plugins libqt5serialport5-dev \
libasound2-dev libpulse-dev libudev-dev \
build-essential gcc g++ libc6 libstdc++6 libqwt-qt5-dev \
&& git config --global --add safe.directory '*'"
}
- {
name: "Ubuntu 22.04 x86_64",
os: ubuntu-latest,
container: "ubuntu:22.04",
generator: "Ninja",
build_type: "Release",
upload_directory: "www/ubuntu-22-04/",
package_name_suffix: "ubuntu-22-04-amd64",
gcc_cc: "gcc",
gcc_cxx: "g++",
lrelease_exec: "/usr/lib/qt5/bin/lrelease",
deb_deps: "libqt5core5a (>= 5.15.0), libqt5gui5 (>= 5.15.0), libqt5widgets5 (>= 5.15.0), libqt5concurrent5 (>= 5.15.0), libqt5serialport5 (>= 5.15.0), libqwt-qt5-6 (>= 6.1.4), libasound2 (>= 1.2.6), libpulse0, libfreetype6 (>= 2.11.0)",
deps_cmdline: "echo 'Ubuntu 22' \
&& apt-get update --fix-missing -qq \
&& apt-get install -y software-properties-common \
&& apt-get update --fix-missing -qq \
&& apt-get install -f -qq \
&& apt-get install -qq \
sudo git p7zip-full ninja-build cmake wget lftp dpkg-dev \
qtbase5-dev qt5-qmake qttools5-dev qttools5-dev-tools libqt5concurrent5 \
qt5-image-formats-plugins libqt5serialport5-dev \
libasound2-dev libpulse-dev libudev-dev \
build-essential gcc g++ libc6 libstdc++6 libqwt-qt5-dev \
&& git config --global --add safe.directory '*'"
}
- {
name: "Ubuntu 24.04 (Qt5) x86_64",
os: ubuntu-latest,
container: "ubuntu:24.04",
generator: "Ninja",
build_type: "Release",
upload_directory: "www/ubuntu-24-04/",
package_name_suffix: "qt5-ubuntu-24-04-amd64",
gcc_cc: "gcc",
gcc_cxx: "g++",
lrelease_exec: "/usr/lib/qt5/bin/lrelease",
deb_deps: "libqt5core5a (>= 5.15.12), libqt5gui5 (>= 5.15.12), libqt5widgets5 (>= 5.15.12), libqt5concurrent5 (>= 5.15.12), libqt5serialport5 (>= 5.15.12), libqwt-qt5-6 (>= 6.1.4), libasound2 (>= 1.2.10), libpulse0, libfreetype6 (>= 2.13.2)",
deps_cmdline: "echo 'Ubuntu 24' \
&& apt-get update --fix-missing -qq \
&& apt-get install -y software-properties-common \
&& apt-get update --fix-missing -qq \
&& apt-get install -f -qq \
&& apt-get install -qq \
sudo git p7zip-full ninja-build cmake wget lftp dpkg-dev \
qtbase5-dev qt5-qmake qttools5-dev qttools5-dev-tools libqt5concurrent5 \
qt5-image-formats-plugins libqt5serialport5-dev \
libasound2-dev libpulse-dev libudev-dev \
build-essential gcc g++ libc6 libstdc++6 libqwt-qt5-dev \
&& git config --global --add safe.directory '*'"
}
- {
name: "Ubuntu 24.04 (Qt6) x86_64",
os: ubuntu-latest,
container: "ubuntu:24.04",
generator: "Ninja",
build_type: "Release",
upload_directory: "www/ubuntu-24-04/",
package_name_suffix: "qt6-ubuntu-24-04-amd64",
gcc_cc: "gcc",
gcc_cxx: "g++",
lrelease_exec: "/usr/lib/qt6/bin/lrelease",
extra_options: "-DBUILD_MAJOR_QT=6",
deb_deps: "libqt6core6 (>= 6.4.2), libqt6gui6 (>= 6.4.2), libqt6widgets6 (>= 6.4.2), libqt6concurrent6 (>= 6.4.2), libqt6serialport6 (>= 6.4.2), libasound2 (>= 1.2.10), libpulse0, libfreetype6 (>= 2.13.2)",
deps_cmdline: "echo 'Ubuntu 24' \
&& apt-get update --fix-missing -qq \
&& apt-get install -y software-properties-common \
&& apt-get update --fix-missing -qq \
&& apt-get install -f -qq \
&& apt-get install -qq \
sudo git p7zip-full ninja-build cmake wget lftp dpkg-dev \
qt6-base-dev qt6-5compat-dev qt6-serialport-dev \
qt6-tools-dev qt6-tools-dev-tools qt6-gtk-platformtheme \
qt6-xdgdesktopportal-platformtheme libqt6nfc6 qt6-scxml-dev \
qt6-image-formats-plugins qt6-l10n-tools \
libasound2-dev libpulse-dev libudev-dev \
build-essential gcc g++ libc6 libstdc++6 \
&& git config --global --add safe.directory '*'"
}
steps:
- name: Check for the upload support
id: upload-check
shell: bash
run: |
if [[ "${{ secrets.builds_login }}" != '' && \
"${{ secrets.builds_password }}" != '' && \
"${{ secrets.builds_host }}" != '' ]]; then
echo "available=true" >> $GITHUB_OUTPUT;
else
echo "available=false" >> $GITHUB_OUTPUT;
fi
- name: Install Dependencies
shell: bash
run: |
apt-get update --fix-missing -qq
apt-get install -qq debconf-utils
echo "keyboard-configuration keyboard-configuration/toggle select Control+Shift" > selects.conf
debconf-set-selections < selects.conf
rm -f selects.conf
echo "XKBMODEL=\"pc105\"" > /etc/default/keyboard
echo "XKBLAYOUT=\"pl,ru\"" >> /etc/default/keyboard
echo "XKBVARIANT=\",\"" >> /etc/default/keyboard
echo "XKBOPTIONS=\"grp:ctrl_shift_toggle,grp_led:scroll\"" >> /etc/default/keyboard
echo "BACKSPACE=\"guess\"" >> /etc/default/keyboard
ln -snf /etc/default/keyboard /etc/vconsole.conf
echo "Europe/Moscow" > /etc/timezone
ln -snf /usr/share/zoneinfo/Europe/Moscow /etc/localtime
if [[ ! -z "${{ matrix.config.deps_cmdline }}" ]]; then
eval ${{ matrix.config.deps_cmdline }}
fi
${{ matrix.config.gcc_cxx }} --version
cmake --version
- uses: WohlSoft/checkout@v0.1
- uses: WohlSoft/branch-name@v0.1
- name: Pull submodules
shell: bash
run: |
git submodule init
git submodule update
- name: Check if a pull request
id: event-check
shell: bash
run: |
if [[ "${BRANCH_NAME}" == *"merge"* ]]; then
echo "--- This build is a pull-request ---"
echo "is_pull_request=true" >> $GITHUB_OUTPUT;
else
echo "--- This build is a normal branch build ---"
echo "is_pull_request=false" >> $GITHUB_OUTPUT;
fi
- name: Download libtinfo5
if: matrix.config.libtinfo5_download
shell: bash
run: wget -d -nv -t 5 -O libtinfo5.deb "${{ matrix.config.libtinfo5_download }}"
- name: Install libtinfo5
if: matrix.config.libtinfo5_download
shell: bash
run: |
sudo dpkg -i ./libtinfo5.deb
rm -f libtinfo5.deb
- name: Download libreadline6
if: matrix.config.readline6_download
shell: bash
run: wget -d -nv -t 5 -O libreadline6.deb "${{ matrix.config.readline6_download }}"
- name: Install libreadline6
if: matrix.config.readline6_download
shell: bash
run: |
sudo dpkg -i ./libreadline6.deb
rm -f libreadline6.deb
- name: Download libgnutls30
if: matrix.config.libgnutls30_download
shell: bash
run: wget -d -nv -t 5 -O libgnutls30.deb "${{ matrix.config.libgnutls30_download }}"
- name: Install libgnutls30
if: matrix.config.libgnutls30_download
shell: bash
run: |
apt-get remove libhogweed2 libnettle4 -y
sudo dpkg -i ./libgnutls30.deb
rm -f libgnutls30.deb
- name: Download LFTP (DEB)
if: matrix.config.lftp_download
shell: bash
run: wget -d -nv -t 5 -O lftp.deb "${{ matrix.config.lftp_download }}"
- name: Install LFTP (DEB)
if: matrix.config.lftp_download
shell: bash
run: |
sudo dpkg -i ./lftp.deb
rm -f lftp.deb
- name: Download LFTP (TAR-GZ)
if: matrix.config.lftp_gz_download
shell: bash
run: wget -d -nv -t 5 -O lftp.tar.gz "${{ matrix.config.lftp_gz_download }}"
- name: Install LFTP (TAR-GZ)
if: matrix.config.lftp_gz_download
shell: bash
run: |
sudo tar -xvf lftp.tar.gz -C /
rm -f lftp.tar.gz
- name: Build translations
shell: bash
run: |
${{ matrix.config.lrelease_exec }} src/translations/*.ts
- name: Configure
shell: bash
run: |
if [[ "${BRANCH_NAME}" == *"merge"* ]]; then
BRANCH_NAME_RES="pull-request"
echo "-- Pull-request detected!"
else
BRANCH_NAME_RES=${BRANCH_NAME}
fi
export CC=${{ matrix.config.gcc_cc }}
export CXX=${{ matrix.config.gcc_cxx }}
echo "====================================="
${{ matrix.config.gcc_cc }} --version
echo "====================================="
git --version
echo "====================================="
cmake --version
echo "====================================="
cmake -B build -G Ninja -DCMAKE_BUILD_TYPE=${{ matrix.config.build_type }} -DCMAKE_INSTALL_PREFIX=/usr ${{ matrix.config.extra_options }} \
-DCPACK_GENERATOR=DEB \
-DCPACK_PACKAGE_FILE_NAME="opl3-bank-editor-${{ matrix.config.package_name_suffix }}-${BRANCH_NAME_RES}"\
-DCPACK_DEBIAN_PACKAGE_HOMEPAGE="https://wohlsoft.ru" \
-DCPACK_DEBIAN_PACKAGE_RELEASE=${GITHUB_RUN_NUMBER} \
-DCPACK_DEBIAN_PACKAGE_ARCHITECTURE=amd64 \
-DCPACK_DEBIAN_PACKAGE_DEPENDS="${{ matrix.config.deb_deps }}" \
-DCPACK_DEBIAN_PACKAGE_DESCRIPTION="OPL3 Bank Editor - A tone bank editor for OPL2/OPL3 chips" \
.
- name: Build
shell: bash
run: |
cmake --build build --target all --config ${{ matrix.config.build_type }} --parallel 3
- name: Create DEB packages
shell: bash
id: create_package
if: success()
run: |
if [[ ! -z "${{ matrix.config.extra_path }}" ]]; then
export PATH=${{ matrix.config.extra_path }}:${PATH}
fi
cd build
cpack .
cd ..
- name: Deploy to builds.wohlsoft.ru
if: success() && github.event_name != 'pull_request' && steps.event-check.outputs.is_pull_request == 'false' && steps.upload-check.outputs.available == 'true'
shell: bash
run: |
UPLOAD_LIST="set ssl:verify-certificate no;"
for q in ./build/*.deb; do
UPLOAD_LIST="${UPLOAD_LIST} put -O ${{ matrix.config.upload_directory }} $q;"
done
lftp -e "${UPLOAD_LIST} exit" -u ${{ secrets.builds_login }},${{ secrets.builds_password }} ${{ secrets.builds_host }}
- name: List Build Directory
if: always()
shell: bash
run: |
git status
if [[ -d build ]]; then
ls -lR build
fi
================================================
FILE: .github/workflows/windows-ci.yml
================================================
name: Windows CI
on:
push:
branches:
- master
pull_request:
branches:
- master
workflow_dispatch:
concurrency:
group: ${{ github.workflow }}-${{ github.ref }}
cancel-in-progress: true
jobs:
build:
name: "${{ matrix.config.name }} | ${{ matrix.config.build_type }}"
runs-on: ${{ matrix.config.os }}
strategy:
fail-fast: false
matrix:
config:
- {
name: "64-bit",
os: windows-latest,
PLATFORM: x64,
WINXX_ARCH: win64,
extra_path: "/c/Qt/5.15.10-x64/bin:/c/MinGW-w64/mingw64/bin",
extra_options: "-DCMAKE_PREFIX_PATH=\"C:/Qt/5.15.10-x64/\" -DCMAKE_TOOLCHAIN_FILE=`pwd`/cmake/ci_windows_mingw_toolchain_x64.cmake",
build_type: "Release",
upload_directory: "www/win32/opl3-bank-editor/",
mingw_download: "https://wohlsoft.ru/docs/Software/MinGW/x86_64-13.1.0-release-posix-seh-msvcrt-rt_v11-rev1.7z", mingw_install_dir: "C:/MinGW-w64/",
qt_download: "https://wohlsoft.ru/docs/Software/QtBuilds/Qt-5.15.10-x64-mingw-w64-13.1.0-shared-release.7z", qt_install_dir: "C:/Qt/",
qt_dir: "C:/Qt/5.15.10-x64/bin",
ninja_download: "https://wohlsoft.ru/docs/Software/Ninja-Build/ninja-win.zip", ninja_install_dir: "C:/MinGW-w64/mingw64/bin",
lftp_download: "https://wohlsoft.ru/docs/Software/lftp-4.4.15.win64-openssl-1.0.1g.7z", lftp_install_dir: "C:/MinGW-w64/mingw64/"
}
- {
name: "32-bit",
os: windows-latest,
PLATFORM: Win32,
WINXX_ARCH: win32,
extra_path: "/c/Qt/5.6.3-i686/bin:/c/MinGW-w64/mingw32/bin",
extra_options: "-DCMAKE_PREFIX_PATH=\"C:/Qt/5.6.3-i686/\" -DCMAKE_TOOLCHAIN_FILE=`pwd`/cmake/ci_windows_mingw_toolchain_x32.cmake",
build_type: "Release",
upload_directory: "www/win32/opl3-bank-editor/",
mingw_download: "https://wohlsoft.ru/docs/Software/MinGW/i686-12.2.0-release-posix-dwarf-rt_v10-rev1.7z", mingw_install_dir: "C:/MinGW-w64/",
qt_download: "https://wohlsoft.ru/docs/Software/QtBuilds/Qt-5.6.3-i686-mingw-w64-12.2.0-shared-release.7z", qt_install_dir: "C:/Qt/",
qt_dir: "C:/Qt/5.6.3-i686/bin",
ninja_download: "https://wohlsoft.ru/docs/Software/Ninja-Build/ninja-win.zip", ninja_install_dir: "C:/MinGW-w64/mingw32/bin",
lftp_download: "https://wohlsoft.ru/docs/Software/lftp-4.4.15.win64-openssl-1.0.1g.7z", lftp_install_dir: "C:/MinGW-w64/mingw32/"
}
- {
name: "Win9x",
os: windows-latest,
PLATFORM: Win32,
WINXX_ARCH: win9x,
extra_path: "/c/Qt/4.4.3/bin:/c/MinGW-w64/mingw6/bin",
extra_options: "-DCMAKE_PREFIX_PATH=\"C:/Qt/5.6.3-i686/\" -DCMAKE_TOOLCHAIN_FILE=`pwd`/cmake/ci_windows_winmm_mingw_toolchain_vanilla.cmake",
build_type: "Release",
upload_directory: "www/win32/opl3-bank-editor/",
mingw_download: "https://wohlsoft.ru/docs/Software/MinGW/MinGW-6-3-x86-dw2.7z", mingw_install_dir: "C:/MinGW-w64/",
qt_download: "https://wohlsoft.ru/docs/Software/QtBuilds/qt-4.4.3-mingw-6.3-win32-static-mini-release.7z", qt_install_dir: "C:/Qt/",
qt_dir: "C:/Qt/5.6.3-i686/bin",
ninja_download: "https://wohlsoft.ru/docs/Software/Ninja-Build/ninja-win.zip", ninja_install_dir: "C:/MinGW-w64/mingw6/bin",
lftp_download: "https://wohlsoft.ru/docs/Software/lftp-4.4.15.win64-openssl-1.0.1g.7z", lftp_install_dir: "C:/MinGW-w64/mingw6/"
}
steps:
- name: Check for the upload support
id: upload-check
shell: bash
run: |
if [[ "${{ secrets.builds_login }}" != '' && \
"${{ secrets.builds_password }}" != '' && \
"${{ secrets.builds_host }}" != '' ]]; then
echo "available=true" >> $GITHUB_OUTPUT;
else
echo "available=false" >> $GITHUB_OUTPUT;
fi
- uses: actions/checkout@v3
with:
fetch-depth: 3
submodules: recursive
- uses: Wohlstand/branch-name@v1.0.1-wohl
- name: Check if a pull request
id: event-check
shell: bash
run: |
if [[ "${BRANCH_NAME}" == *"merge"* ]]; then
echo "--- This build is a pull-request ---"
echo "is_pull_request=true" >> $GITHUB_OUTPUT;
else
echo "--- This build is a normal branch build ---"
echo "is_pull_request=false" >> $GITHUB_OUTPUT;
fi
- name: Download MinGW
if: matrix.config.mingw_download
uses: carlosperate/download-file-action@v2
with:
file-url: "${{ matrix.config.mingw_download }}"
file-name: mingw.7z
- name: Extract MinGW
if: matrix.config.mingw_install_dir
shell: bash
run: |
mkdir -p "${{ matrix.config.mingw_install_dir }}"
7z x mingw.7z -o"${{ matrix.config.mingw_install_dir }}"
- name: Download Qt
if: matrix.config.qt_download
uses: carlosperate/download-file-action@v2
with:
file-url: "${{ matrix.config.qt_download }}"
file-name: qt.7z
- name: Extract Qt
if: matrix.config.qt_install_dir
shell: bash
run: |
7z x qt.7z -o"${{ matrix.config.qt_install_dir }}"
- name: Download Ninja
if: matrix.config.ninja_download
uses: carlosperate/download-file-action@v2
with:
file-url: "${{ matrix.config.ninja_download }}"
file-name: ninja.zip
- name: Extract Ninja
if: matrix.config.ninja_install_dir
shell: bash
run: |
7z x ninja.zip -o"${{ matrix.config.ninja_install_dir }}"
- name: Download LFTP
if: matrix.config.lftp_download
uses: carlosperate/download-file-action@v2
with:
file-url: "${{ matrix.config.lftp_download }}"
file-name: lftp.7z
- name: Extract LFTP
if: matrix.config.lftp_install_dir
shell: bash
run: |
7z x lftp.7z bin etc -o"${{ matrix.config.lftp_install_dir }}"
- name: Build translations
shell: bash
run: |
if [[ ! -z "${{ matrix.config.extra_path }}" ]]; then
export PATH=${{ matrix.config.extra_path }}:${PATH}
export QT_DIR="${{ matrix.config.qt_dir }}"
export QtDir="${{ matrix.config.qt_dir }}"
echo "PATH environment: ${PATH}"
fi
lrelease src/translations/*.ts
- name: Configure
shell: bash
run: |
if [[ ! -z "${{ matrix.config.extra_path }}" ]]; then
export PATH=${{ matrix.config.extra_path }}:${PATH}
export QT_DIR="${{ matrix.config.qt_dir }}"
export QtDir="${{ matrix.config.qt_dir }}"
echo "PATH environment: ${PATH}"
fi
echo "====================================="
qmake --version
echo "====================================="
gcc --version
echo "====================================="
git --version
echo "====================================="
cmake --version
echo "====================================="
qmake FMBankEdit.pro CONFIG+=release CONFIG-=debug
# cmake -B build -G Ninja -DCMAKE_BUILD_TYPE=${{ matrix.config.build_type }} -DCMAKE_INSTALL_PREFIX="`pwd`/bin-cmake-release" -DPGE_INSTALL_DIRECTORY="PGE_Project" ${{ matrix.config.extra_options }} .
- name: Build
shell: bash
run: |
if [[ ! -z "${{ matrix.config.extra_path }}" ]]; then
export PATH=${{ matrix.config.extra_path }}:${PATH}
export QT_DIR="${{ matrix.config.qt_dir }}"
export QtDir="${{ matrix.config.qt_dir }}"
fi
export MAKEFLAGS=--keep-going
mingw32-make -j 3
# cmake --build build --target all --config ${{ matrix.config.build_type }} --parallel 3
- name: Install
shell: bash
run: |
if [[ ! -z "${{ matrix.config.extra_path }}" ]]; then
export PATH=${{ matrix.config.extra_path }}:${PATH}
export QT_DIR="${{ matrix.config.qt_dir }}"
export QtDir="${{ matrix.config.qt_dir }}"
fi
export MAKEFLAGS=--keep-going
# cmake --build build --target install --config ${{ matrix.config.build_type }}
- name: Deploy
shell: bash
run: |
if [[ ! -z "${{ matrix.config.extra_path }}" ]]; then
export PATH=${{ matrix.config.extra_path }}:${PATH}
export QT_DIR="${{ matrix.config.qt_dir }}"
export QtDir="${{ matrix.config.qt_dir }}"
fi
mkdir _packed
cd bin-release
mkdir translations
cp -v ../src/translations/*.qm translations/
if [[ "${{ matrix.config.WINXX_ARCH }}" == "win64" ]]; then
windeployqt --force --ignore-library-errors --no-quick-import --no-system-d3d-compiler --no-angle --no-opengl-sw opl3_bank_editor.exe
elif [[ "${{ matrix.config.WINXX_ARCH }}" == "win32" ]]; then
windeployqt --force --no-quick-import --no-system-d3d-compiler --no-angle --no-opengl-sw opl3_bank_editor.exe
fi
cd ..
DEST_ARCHIVE=opl3-bank-editor-dev-${{ matrix.config.WINXX_ARCH }}.zip
DEPLOY_FILES="./bin-release/*"
if [[ "${{ matrix.config.WINXX_ARCH }}" == "win9x" ]]; then
DEPLOY_FILES="$DEPLOY_FILES ./opl_proxy/win9x/liboplproxy.dll"
elif [[ "${{ matrix.config.WINXX_ARCH }}" == "win64" ]]; then
DEPLOY_FILES="$DEPLOY_FILES ./opl_proxy/modern/liboplproxy64.dll ./opl_proxy/modern/inpoutx64.dll"
else
DEPLOY_FILES="$DEPLOY_FILES ./opl_proxy/modern/liboplproxy.dll ./opl_proxy/modern/inpout32.dll"
fi
DEPLOY_FILES="$DEPLOY_FILES Bank_Examples"
DEPLOY_FILES="$DEPLOY_FILES ./formats_info.htm ./license.txt ./changelog.txt"
7z a -tzip "_packed/$DEST_ARCHIVE" $DEPLOY_FILES
- name: Deploy to builds.wohlsoft.ru
if: success() && github.event_name != 'pull_request' && steps.event-check.outputs.is_pull_request == 'false' && steps.upload-check.outputs.available == 'true'
shell: bash
run: |
if [[ ! -z "${{ matrix.config.extra_path }}" ]]; then
export PATH=${{ matrix.config.extra_path }}:${PATH}
fi
UPLOAD_LIST="set ssl:verify-certificate no;"
for q in ./_packed/*.zip; do
UPLOAD_LIST="${UPLOAD_LIST} put -O ${{ matrix.config.upload_directory }} $q;"
done
lftp -e "${UPLOAD_LIST} exit" -u ${{ secrets.builds_login }},${{ secrets.builds_password }} ${{ secrets.builds_host }}
- name: List Build Directory
if: always()
shell: bash
run: |
git status
ls -lR bin-release
ls -lR _packed
ls -lR src/translations
================================================
FILE: .gitignore
================================================
# C++ objects and libs
*.slo
*.lo
*.o
*.a
*.la
*.lai
*.so
*.dll
*.dylib
# Qt-es
/.qmake.cache
/.qmake.stash
*.user*
*.moc
*.qm
moc_*.cpp
qrc_*.cpp
ui_*.h
Makefile*
.qmake.stash
*build-*
/_build_data/*
/bin-*/*
# QtCreator
*.autosave
#QtCtreator Qml
*.qmlproject.user
*.qmlproject.user.*
/_Misc/res*.txt
/_Misc/byte*
!/_Misc/byte*.c
/build/*
.DS_Store
================================================
FILE: .gitmodules
================================================
[submodule "src/midi/external/rtmidi"]
path = src/midi/external/rtmidi
url = https://github.com/Wohlstand/rtmidi.git
branch = master
[submodule "src/audio/external/rtaudio"]
path = src/audio/external/rtaudio
url = https://github.com/Wohlstand/rtaudio.git
branch = master
[submodule "src/opl/chips"]
path = src/opl/chips
url = https://github.com/Wohlstand/OPL_ChipSet.git
branch = main
================================================
FILE: Bank_Examples/Info.txt
================================================
==============================================================================
Most of those FM banks are imported from various PC games without permission
from their respective authors. The question of copyright, when it comes
to sets of 11 numeric bytes, is somewhat vague, especially considering that
most of those sets are simply descendants of the patch sets originally
published by AdLib Inc. for everyone's free use.
==============================================================================
==============================================================================
Info about banks
==============================================================================
------------------------------------------------------------------------------
Banks for DMX Audio library used in DOOM, DOOM II, Heretic, Hexen, Raptor
------------------------------------------------------------------------------
----------dmx_dmx.op2-----------
Standard unmodified DMX bank
---------dmx_doom1.op2----------
Bank used in the "DOOM" game by Id Software
---------dmx_doom2.op2----------
Bank used in the "DOOM II: Hell on the Eath" game by Id Software
--------dmx_raptor.op2----------
Bank used in the "Raptor: Call of the Shadows" game by Apogee Software
(later known as 3D Realms)
--------dmx_strife.op2----------
Bank used in the "Strife: Quest for the Sigil" game by Rogue Entertainment
------------------------------------------------------------------------------
Banks for Apogee Sound System audio library used in Duke Nukem 3D etc.
------------------------------------------------------------------------------
----------default.tmb-----------
Standard unmodified bank, hardcoded into the audio library,
licensed under GNU GPL
---------d3dtimbr.tmb-----------
Bank used in Duke Nukem 3D by 3D Realms
---------swtimbr.tmb-----------
Bank used in Shadow Warrior by 3D Realms
------------------------------------------------------------------------------
Banks gotten from "Junlevision Sound Drive" demo by Junglevision Software
company which presents a payd audio library for MS-DOS
------------------------------------------------------------------------------
-----------JV_2OP.OP3-----------
General MIDI timbres for Yamaha OPL-2 and OPL-3 based sound cards were
developed by Junglevision Software.
(Has no drumsets. Reason is: Jungevision Sound Drive demo player is uses
comination of FM synthesis and playing set of PCM files as percussion)
------------FAT2.OP3------------
------------FAT4.OP3------------
General MIDI timbres for Yamaha OPL-2 and OPL-3 based sound cards were
produced by The Fat Man (TM) company and developed by K. Weston Phelan and
George Alistair Sanger in 1993
FAT2.OP3 is widely used in Windows drivers for Sound Blaster and other sound
cards with Yamaha OPL2/OPL3 chip.
-----------WALLACE.OP3----------
General MIDI timbres for Yamaha OPL-2 and OPL-3 based sound cards were
developed by Rob Wallace of Wallace Music & Sound, Inc.
(Has no created drumsets by same reason as JV_2OP.OP3)
================================================
FILE: Bank_Examples/Sci/sci.patch.format.txt
================================================
Adlib Patch Resource Format Specification
Revision 1
Ravi I.
Mar. 11, 2002
Preface
The Adlib patch resource defines instruments for the Yamaha OPL2 FM synthesis chip. Other cards, including the original SoundBlasters, that had the same or compatible chips also used the Adlib patch. The patch is traditionally numbered PATCH.003 or 3.PAT.
Sierra does not seem to have changed the format of its Adlib patch resource through the entire life of SCI. This file format applies to all IBM games.
You can contact me personally at ravi.i@softhome.net, but I would prefer that SCI messages be posted on the webboard so everyone can see them.
File Format
The first two bytes of an extracted patch file contain the bytes 89h 00h identifying a patch resource. These are not actually part of the resource data.
Patch files contain a block of 48 instrument definitions followed optionally by the magic number ABh CDh (CDABh when read into a little endian machine) and 48 more definitions. Each instrument definition is 28 bytes containing data for an Adlib channel composed of two operators.
Instrument Definitions
An instrument definition has the following fields, each 1 byte long:
offset description values
0h op 1 key scaling 0 - 3
1h op 1 frequency modulation 0 - 15
2h channel feedback 0 - 7
3h op 1 attack rate 0 - 15
4h op 1 sustain level 0 - 15
5h op 1 envelope generator true, false
6h op 1 decay rate 0 - 15
7h op 1 release rate 0 - 15
8h op 1 amplitude 0 - 63
9h op 1 amplitude modulation true, false
Ah op 1 vibrato true. false
Bh op 1 keyboard scale rate true, false
Ch algorithm (reversed) 0, 1
Dh op 2 key scaling 0 - 3
Eh op 2 frequency modulation 0 - 15
Fh unused
10h op 2 attack rate 0 - 15
11h op 2 sustain level 0 - 15
12h op 2 envelope generator true, false
13h op 2 decay rate 0 - 15
14h op 2 release rate 0 - 15
15h op 2 amplitude 0 - 63
16h op 2 amplitude modulation true, false
17h op 2 vibrato true. false
18h op 2 keyboard scale rate true, false
19h unused
1Ah op 1 waveform 0 - 3
1Bh op 2 waveform 0 - 3
Note that the sense of the algorithm field is switched. A value of 0 means that the two operators are in synthesis while a value of 1 means that operator 1 modulates operator 2.
Revision history
Revision 1 - Mar. 11, 2002
First release of the specification
================================================
FILE: CMakeLists.txt
================================================
cmake_minimum_required(VERSION 3.2...3.10)
project(OPL3BankEditor LANGUAGES C CXX)
include(CheckCXXCompilerFlag)
include(GNUInstallDirs)
list(APPEND CMAKE_MODULE_PATH "${PROJECT_SOURCE_DIR}/cmake")
set(OPL3_BANK_EDITOR_VERSION_STRING "1.5.2")
set(CMAKE_CXX_STANDARD 11)
set(CMAKE_INCLUDE_CURRENT_DIR ON)
set(CMAKE_AUTOMOC ON)
if(MSVC)
check_cxx_compiler_flag("/std:c++14" COMPILER_SUPPORTS_CXX14)
if(COMPILER_SUPPORTS_CXX14)
set(FLAG_CPP14 "/std:c++14")
endif()
else()
check_cxx_compiler_flag("-std=c++14" COMPILER_SUPPORTS_CXX14)
if(COMPILER_SUPPORTS_CXX14)
set(FLAG_CPP14 "-std=c++14")
endif()
endif()
if(COMPILER_SUPPORTS_CXX14)
message("== Your C++ compiler supports C++14, YMFM emulator will be ENABLED")
else()
message("== Your C++ compiler does NOT supports C++14, YMFM emulator will be DISABLED")
endif()
if(CMAKE_C_COMPILER_ID MATCHES "^(GNU|Clang)$")
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wall")
endif()
if(CMAKE_CXX_COMPILER_ID MATCHES "^(GNU|Clang)$")
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wall")
endif()
if(CMAKE_SYSTEM_NAME STREQUAL "Windows")
add_definitions("-D_USE_MATH_DEFINES")
# Enforce the Windows XP compatibility
add_definitions(-DWINVER=0x0501 -D_WIN32_WINNT=0x0501)
endif()
option(USE_RTMIDI "Use RtMidi" ON)
option(USE_VENDORED_RTMIDI "Use vendored RtMidi instead of system-installed one" OFF)
option(USE_RTAUDIO "Use RtAudio" ON)
option(USE_VENDORED_RTAUDIO "Use vendored RtAudio instead of system-installed one" OFF)
option(FORCE_EXEC_NO_PIE "Disable Position-Independent code on executables (default ON)" ON)
option(USE_STATIC_QT "Enable linking of extra libraries required to link the static Qt" OFF)
if(CMAKE_SYSTEM_NAME STREQUAL "Linux" OR CMAKE_SYSTEM_NAME STREQUAL "Darwin")
option(USE_VENDORED_RTAUDIO_JACK "Enable JACK suport at RtAudio if possible" ON)
endif()
OPTION(DEBUG_WRITE_AMPLITUDE_PLOT "Write the captured result of sounding measurer into the apmplitudes plot" OFF)
option(ENABLE_ADDRESS_SANITIZER "Enable the Address Sanitizer GCC feature" OFF)
if(WIN32)
OPTION(USE_RTAUDIO_WASAPI "Enable WASAPI support on RtAudio (breaks Windows XP compatibility)" ON)
endif()
include(FindPkgConfig)
include(CheckCXXCompilerFlag)
include(cmake/library_qt.cmake)
find_package(Qwt)
find_package(ZLIB REQUIRED)
find_package(Threads REQUIRED)
include(cmake/static_qt.cmake)
if(NOT WIN32 AND (CMAKE_COMPILER_IS_GNUCC OR CMAKE_COMPILER_IS_GNUCXX))
check_cxx_compiler_flag("-no-pie" HAS_NO_PIE)
endif()
function(pge_set_nopie _target)
set_target_properties(${_target} PROPERTIES
POSITION_INDEPENDENT_CODE False
)
if(HAS_NO_PIE AND (CMAKE_COMPILER_IS_GNUCC OR CMAKE_COMPILER_IS_GNUCXX))
set_property(TARGET ${_target} APPEND_STRING PROPERTY LINK_FLAGS " -no-pie")
endif()
endfunction()
if(QWT_FOUND)
set(ENABLE_PLOTS ON)
else()
set(ENABLE_PLOTS OFF)
endif()
if(TARGET ${QT_SerialPort_TARGET})
set(ENABLE_SERIAL_PORT ON)
else()
set(ENABLE_SERIAL_PORT OFF)
endif()
message("!! Optional feature summary:")
message("!! RtMidi: ${USE_RTMIDI}")
message("!! - Forced vendored version: ${USE_VENDORED_RTMIDI}")
message("!! RtAudio: ${USE_RTAUDIO}")
message("!! - Forced vendored version: ${USE_VENDORED_RTAUDIO}")
if(ENABLE_PLOTS)
message("!! Qwt: ${QWT_LIBRARY}")
endif()
message("!! Plots: ${ENABLE_PLOTS}")
message("!! Serial port: ${ENABLE_SERIAL_PORT}")
include_directories("src")
set(COMMON_SOURCES
"src/bank.cpp"
"src/bank.h"
"src/common.cpp"
"src/common.h"
)
add_library(Common STATIC ${COMMON_SOURCES})
target_include_directories(Common PUBLIC "src")
if(BUILD_MAJOR_QT GREATER_EQUAL 5)
target_link_libraries(Common PUBLIC ${QT_Widgets_TARGET})
endif()
if(ENABLE_ADDRESS_SANITIZER)
target_compile_options(Common PUBLIC -fsanitize=address)
target_link_options(Common PUBLIC -fsanitize=address)
endif()
set(FILEFORMATS_SOURCES
"src/FileFormats/ffmt_base.cpp"
"src/FileFormats/ffmt_base.h"
"src/FileFormats/ffmt_enums.cpp"
"src/FileFormats/ffmt_enums.h"
"src/FileFormats/ffmt_factory.cpp"
"src/FileFormats/ffmt_factory.h"
"src/FileFormats/format_adlib_bnk.cpp"
"src/FileFormats/format_adlib_bnk.h"
"src/FileFormats/format_adlib_tim.cpp"
"src/FileFormats/format_adlib_tim.h"
"src/FileFormats/format_adlibgold_bnk2.cpp"
"src/FileFormats/format_adlibgold_bnk2.h"
"src/FileFormats/format_ail2_gtl.cpp"
"src/FileFormats/format_ail2_gtl.h"
"src/FileFormats/format_apogeetmb.cpp"
"src/FileFormats/format_apogeetmb.h"
"src/FileFormats/format_bisqwit.cpp"
"src/FileFormats/format_bisqwit.h"
"src/FileFormats/format_cmf_importer.cpp"
"src/FileFormats/format_cmf_importer.h"
"src/FileFormats/format_dmxopl2.cpp"
"src/FileFormats/format_dmxopl2.h"
"src/FileFormats/format_ea_importer.cpp"
"src/FileFormats/format_ea_importer.h"
"src/FileFormats/format_imf_importer.cpp"
"src/FileFormats/format_imf_importer.h"
"src/FileFormats/format_junlevizion.cpp"
"src/FileFormats/format_junlevizion.h"
"src/FileFormats/format_rad_importer.cpp"
"src/FileFormats/format_rad_importer.h"
"src/FileFormats/format_sb_ibk.cpp"
"src/FileFormats/format_sb_ibk.h"
"src/FileFormats/format_dro_importer.cpp"
"src/FileFormats/format_dro_importer.h"
"src/FileFormats/format_vgm_import.cpp"
"src/FileFormats/format_vgm_import.h"
"src/FileFormats/format_smaf_importer.cpp"
"src/FileFormats/format_smaf_importer.h"
"src/FileFormats/format_klm_importer.cpp"
"src/FileFormats/format_klm_importer.h"
"src/FileFormats/format_misc_sgi.cpp"
"src/FileFormats/format_misc_sgi.h"
"src/FileFormats/format_misc_cif.cpp"
"src/FileFormats/format_misc_cif.h"
"src/FileFormats/format_misc_hsc.cpp"
"src/FileFormats/format_misc_hsc.h"
"src/FileFormats/format_wohlstand_opl3.cpp"
"src/FileFormats/format_wohlstand_opl3.h"
"src/FileFormats/format_wohlstand_opl3_text.cpp"
"src/FileFormats/format_wohlstand_opl3_text.h"
"src/FileFormats/format_flatbuffer_opl3.cpp"
"src/FileFormats/format_flatbuffer_opl3.h"
"src/FileFormats/Opl3Bank_generated.h"
"src/FileFormats/format_patch_fm4.h"
"src/FileFormats/format_patch_fm4.cpp"
"src/FileFormats/ymf262_to_wopi.cpp"
"src/FileFormats/ymf262_to_wopi.h"
"src/FileFormats/wopl/wopl_file.c"
"src/FileFormats/wopl/wopl_file.h"
)
add_library(FileFormats STATIC ${FILEFORMATS_SOURCES})
target_include_directories(FileFormats PUBLIC "src" PRIVATE ${ZLIB_INCLUDE_DIRS})
target_link_libraries(FileFormats PUBLIC Common PRIVATE ${ZLIB_LIBRARIES})
if(CMAKE_SYSTEM_NAME STREQUAL "Windows")
set(OPL3_PROXY_DEFAULT ON)
OPTION(ENABLE_Win9X_OPL3_PROXY "Enable Win9x variant of the OPL3 proxy support through 'liboplproxy' plugin" OFF)
else()
set(OPL3_PROXY_DEFAULT OFF)
endif()
OPTION(ENABLE_OPL3_PROXY "Enable OPL3 proxy support through 'liboplproxy' plugin" ${OPL3_PROXY_DEFAULT})
include(src/opl/chips/chipset.cmake)
if(ENABLE_Win9X_OPL3_PROXY)
include(src/opl/chips/win9x_opl_proxy.cmake)
endif()
add_library(Chips STATIC ${CHIPS_SOURCES})
target_include_directories(Chips PUBLIC "src")
if(COMPILER_SUPPORTS_CXX14)
target_compile_definitions(Chips PUBLIC "-DENABLE_YMFM_EMULATOR")
endif()
if(ENABLE_OPL3_PROXY)
if(BUILD_MAJOR_QT GREATER_EQUAL 5)
target_link_libraries(Chips PUBLIC ${QT_Widgets_TARGET})
endif()
target_compile_definitions(Chips PUBLIC "-DENABLE_HW_OPL_PROXY")
if(ENABLE_Win9X_OPL3_PROXY)
target_compile_definitions(Chips PUBLIC "-DENABLE_WIN9X_OPL_PROXY")
endif()
if(CMAKE_SYSTEM_NAME STREQUAL "Linux")
target_link_libraries(Chips PUBLIC dl)
endif()
endif()
if(ENABLE_SERIAL_PORT)
target_link_libraries(Chips PUBLIC ${QT_SerialPort_TARGET})
target_compile_definitions(Chips PUBLIC "-DENABLE_HW_OPL_SERIAL_PORT")
endif()
if(ENABLE_ADDRESS_SANITIZER)
target_compile_options(Chips PUBLIC -fsanitize=address)
target_link_options(Chips PUBLIC -fsanitize=address)
endif()
set(MEASURER_SOURCES "src/opl/measurer.cpp" "src/opl/measurer.h")
add_library(Measurer STATIC ${MEASURER_SOURCES})
target_include_directories(Measurer PUBLIC "src")
target_link_libraries(Measurer PUBLIC Common ${QT_Concurrent_TARGET})
if(NOT MSVC AND NOT APPLE)
target_compile_options(Measurer PRIVATE "-fopenmp")
endif()
if(ENABLE_PLOTS)
target_compile_definitions(Measurer PUBLIC "-DENABLE_PLOTS")
endif()
set(SOURCES
"src/audio.cpp"
"src/bank_editor.cpp"
"src/bank_editor.h"
"src/bank_type_dlg.cpp"
"src/bank_type_dlg.h"
"src/operator_editor.cpp"
"src/operator_editor.h"
"src/bank_comparison.cpp"
"src/bank_comparison.h"
"src/controlls.cpp"
"src/proxystyle.cpp"
"src/proxystyle.h"
"src/formats_sup.cpp"
"src/formats_sup.h"
"src/importer.cpp"
"src/importer.h"
"src/audio_config.cpp"
"src/audio_config.h"
"src/hardware.cpp"
"src/hardware.h"
"src/ins_names.cpp"
"src/ins_names.h"
"src/main.cpp"
"src/opl/generator.cpp"
"src/opl/generator.h"
"src/opl/generator_realtime.cpp"
"src/opl/generator_realtime.h"
"src/opl/realtime/ring_buffer.cpp"
"src/opl/realtime/ring_buffer.h"
"src/opl/realtime/ring_buffer.tcc"
"src/piano.cpp"
"src/piano.h"
)
if(ENABLE_PLOTS)
list(APPEND SOURCES "src/delay_analysis.cpp" "src/delay_analysis.h")
endif()
include(src/opl/models/opl_models.cmake)
list(APPEND SOURCES ${OPL_MODELS_SOURCES})
set(UIS
"src/bank_editor.ui"
"src/operator_editor.ui"
"src/bank_comparison.ui"
"src/formats_sup.ui"
"src/importer.ui"
"src/audio_config.ui"
"src/hardware.ui"
)
if(ENABLE_PLOTS)
list(APPEND UIS "src/delay_analysis.ui")
endif()
pge_qt_wrap_ui(FORMS ${UIS})
pge_qt_add_resources(RESOURCES "src/resources/resources.qrc")
pge_qt_add_translation(TRANSLATIONS
"src/translations/opl3bankeditor_fr_FR.ts"
"src/translations/opl3bankeditor_pl_PL.ts"
"src/translations/opl3bankeditor_ru_RU.ts"
)
add_custom_target(OPL3BankEditor_translations ALL DEPENDS ${TRANSLATIONS})
if(NOT APPLE)
install(FILES ${TRANSLATIONS} DESTINATION "share/opl3_bank_editor/translations")
endif()
if(NOT CMAKE_SYSTEM_NAME STREQUAL "Windows" AND NOT CMAKE_SYSTEM_NAME STREQUAL "Darwin")
install(FILES "src/resources/opl3_bank_editor.desktop"
DESTINATION "share/applications")
foreach(format banks instruments)
install(FILES "src/resources/mime/opl3-${format}.xml"
DESTINATION "share/mime/packages")
endforeach()
foreach(size 16;32;48)
install(FILES "src/resources/opl3_${size}.png"
DESTINATION "share/icons/hicolor/${size}x${size}/apps"
RENAME "opl3_bank_editor.png")
endforeach()
foreach(size 16;32;48;128;256)
install(FILES "src/resources/file_wopl/file_wopl_${size}x${size}.png"
DESTINATION "share/icons/hicolor/${size}x${size}/mimetypes"
RENAME "x-application-wopl-bank.png")
endforeach()
foreach(size 16;32;48;128;256)
install(FILES "src/resources/file_opli/file_opli_${size}x${size}.png"
DESTINATION "share/icons/hicolor/${size}x${size}/mimetypes"
RENAME "x-application-opli-instrument.png")
endforeach()
foreach(size 16;32;48;128;256)
install(FILES "src/resources/file_dmx/file_dmx_${size}x${size}.png"
DESTINATION "share/icons/hicolor/${size}x${size}/mimetypes"
RENAME "x-application-dmx-op2-bank.png")
endforeach()
foreach(size 16;32;48;128;256)
install(FILES "src/resources/file_ibk/file_ibk_${size}x${size}.png"
DESTINATION "share/icons/hicolor/${size}x${size}/mimetypes"
RENAME "x-application-sb-ibk-bank.png")
endforeach()
foreach(size 16;32;48;128;256)
install(FILES "src/resources/file_sbi/file_sbi_${size}x${size}.png"
DESTINATION "share/icons/hicolor/${size}x${size}/mimetypes"
RENAME "x-application-sb-sbi.png")
endforeach()
foreach(size 16;32;48;128;256)
install(FILES "src/resources/file_adbnk/file_adbnk_${size}x${size}.png"
DESTINATION "share/icons/hicolor/${size}x${size}/mimetypes"
RENAME "x-application-adlib-bnk.png")
endforeach()
foreach(size 16;32;48;128;256)
install(FILES "src/resources/file_adins/file_adins_${size}x${size}.png"
DESTINATION "share/icons/hicolor/${size}x${size}/mimetypes"
RENAME "x-application-adlib-ins.png")
endforeach()
foreach(size 16;32;48;128;256)
install(FILES "src/resources/file_hmi/file_hmi_${size}x${size}.png"
DESTINATION "share/icons/hicolor/${size}x${size}/mimetypes"
RENAME "x-application-hmi-bnk.png")
endforeach()
foreach(size 16;32;48;128;256)
install(FILES "src/resources/file_tmb/file_tmb_${size}x${size}.png"
DESTINATION "share/icons/hicolor/${size}x${size}/mimetypes"
RENAME "x-application-apogee-tmb.png")
endforeach()
foreach(size 16;32;48;128;256)
install(FILES "src/resources/file_miles/file_miles_${size}x${size}.png"
DESTINATION "share/icons/hicolor/${size}x${size}/mimetypes"
RENAME "x-application-miles-gtl.png")
endforeach()
foreach(size 16;32;48;128;256)
install(FILES "src/resources/file_jv/file_jv_${size}x${size}.png"
DESTINATION "share/icons/hicolor/${size}x${size}/mimetypes"
RENAME "x-application-junglevision-op3.png")
endforeach()
foreach(size 16;32;48;128;256)
install(FILES "src/resources/file_fm4/file_fm4_${size}x${size}.png"
DESTINATION "share/icons/hicolor/${size}x${size}/mimetypes"
RENAME "x-application-ms-fm4.png")
endforeach()
endif()
add_executable(OPL3BankEditor WIN32 MACOSX_BUNDLE
${SOURCES} ${FORMS} ${RESOURCES}
)
set_target_properties(OPL3BankEditor PROPERTIES OUTPUT_NAME "opl3_bank_editor")
if(ENABLE_PLOTS)
target_include_directories(OPL3BankEditor PRIVATE ${QWT_INCLUDE_DIRS})
endif()
if(DEBUG_WRITE_AMPLITUDE_PLOT)
target_compile_definitions(OPL3BankEditor PRIVATE "-DDEBUG_WRITE_AMPLITUDE_PLOT")
endif()
target_link_libraries(OPL3BankEditor PRIVATE ${QT_EXTRA_LIBS_PRE} FileFormats Measurer Chips)
if(BUILD_MAJOR_QT GREATER_EQUAL 5)
target_link_libraries(OPL3BankEditor PRIVATE ${QT_Widgets_TARGET} ${QT_EXTRA_LIBS} ${CMAKE_THREAD_LIBS_INIT})
else()
target_link_libraries(OPL3BankEditor PRIVATE ${CMAKE_THREAD_LIBS_INIT})
endif()
if(ENABLE_PLOTS)
target_link_libraries(OPL3BankEditor PRIVATE ${QWT_LIBRARIES})
endif()
if(FORCE_EXEC_NO_PIE)
pge_set_nopie(OPL3BankEditor)
endif()
include(cmake/deploy.cmake)
if(APPLE)
install(TARGETS OPL3BankEditor DESTINATION .)
install(FILES changelog.txt DESTINATION .)
install(FILES README.md DESTINATION . RENAME ReadMe.txt)
install(FILES license.txt DESTINATION . RENAME License.txt)
install(DIRECTORY Bank_Examples DESTINATION .)
set_source_files_properties(${TRANSLATIONS} PROPERTIES GENERATED TRUE) # WORKAROUND
target_sources(OPL3BankEditor PRIVATE ${TRANSLATIONS})
set_source_files_properties(${TRANSLATIONS} PROPERTIES MACOSX_PACKAGE_LOCATION "Resources/translations")
file(GLOB BANKEDIT_FILE_ICONS "${CMAKE_CURRENT_SOURCE_DIR}/src/resources/file_*.icns")
target_sources(OPL3BankEditor PRIVATE ${BANKEDIT_FILE_ICONS})
set_source_files_properties(${BANKEDIT_FILE_ICONS} PROPERTIES MACOSX_PACKAGE_LOCATION "Resources")
else()
install(TARGETS OPL3BankEditor DESTINATION "bin" RENAME "opl3_bank_editor")
install(FILES changelog.txt DESTINATION ${CMAKE_INSTALL_DATAROOTDIR}/doc/opl3_bank_editor)
install(DIRECTORY Bank_Examples DESTINATION ${CMAKE_INSTALL_DATAROOTDIR}/doc/opl3_bank_editor)
install(FILES README.md DESTINATION ${CMAKE_INSTALL_DATAROOTDIR}/doc/opl3_bank_editor RENAME ReadMe.txt)
install(FILES license.txt DESTINATION ${CMAKE_INSTALL_DATAROOTDIR}/doc/opl3_bank_editor RENAME License.OPL3-Bank-Editor.txt)
endif()
if(CMAKE_SYSTEM_NAME STREQUAL "Windows")
set(ICON "${CMAKE_SOURCE_DIR}/src/resources/res.rc")
target_sources(OPL3BankEditor PRIVATE "${ICON}")
elseif(CMAKE_SYSTEM_NAME STREQUAL "Darwin")
set(MACOSX_BUNDLE_ICON_FILE "opl3.icns")
set(ICON "${CMAKE_SOURCE_DIR}/src/resources/opl3.icns")
set_source_files_properties("${ICON}" PROPERTIES MACOSX_PACKAGE_LOCATION "Resources")
target_sources(OPL3BankEditor PRIVATE "${ICON}")
set_target_properties(OPL3BankEditor PROPERTIES
OUTPUT_NAME "OPL3 Bank Editor"
MACOSX_BUNDLE TRUE
MACOSX_BUNDLE_INFO_PLIST "${CMAKE_CURRENT_SOURCE_DIR}/src/resources/info.plist.in"
MACOSX_BUNDLE_EXECUTABLE_NAME "opl3_bank_editor"
MACOSX_BUNDLE_BUNDLE_NAME "OPL3 Bank Editor"
MACOSX_BUNDLE_GUI_IDENTIFIER "ru.wohlsoft.opl3-bank-editor"
MACOSX_BUNDLE_SHORT_VERSION_STRING "${OPL3_BANK_EDITOR_VERSION_STRING}"
MACOSX_BUNDLE_LONG_VERSION_STRING "${OPL3_BANK_EDITOR_VERSION_STRING}"
MACOSX_BUNDLE_ICON_FILE "opl3.icns"
CPACK_BUNDLE_NAME "OPL3 Bank Editor"
MACOSX_BUNDLE_INFO_STRING "Editor for OPL2/OPL3 tone banks and instruments"
)
endif()
if(USE_RTMIDI)
if(NOT USE_VENDORED_RTMIDI)
if(PKG_CONFIG_FOUND)
pkg_check_modules(RTMIDI rtmidi)
if(RTMIDI_FOUND)
message("!! Using system-installed RtMidi found by pkg-config")
target_compile_options(OPL3BankEditor PUBLIC ${RTMIDI_CFLAGS})
target_include_directories(OPL3BankEditor PUBLIC ${RTMIDI_INCLUDE_DIRS})
target_link_libraries(OPL3BankEditor PUBLIC ${RTMIDI_LDFLAGS})
endif()
endif()
if(NOT RTMIDI_FOUND)
find_library(RTMIDI_LIBRARY rtmidi)
message("!! RtMidi library: ${RTMIDI_LIBRARY}")
find_path(RTMIDI_INCLUDE_DIRS NAMES "RtMidi.h" PATH_SUFFIXES "include/rtmidi")
message("!! RtMidi header directory: ${RTMIDI_INCLUDE_DIRS}")
if(RTMIDI_LIBRARY AND RTMIDI_INCLUDE_DIRS)
message("!! Using system-installed RtMidi")
set(RTMIDI_FOUND TRUE)
target_include_directories(OPL3BankEditor PUBLIC ${RTMIDI_INCLUDE_DIRS})
target_link_libraries(OPL3BankEditor PUBLIC ${RTMIDI_LIBRARY})
endif()
endif()
endif()
if(NOT RTMIDI_FOUND OR USE_VENDORED_RTMIDI)
message("!! Using bundled RtMidi")
add_library(RtMidi STATIC "src/midi/external/rtmidi/RtMidi.cpp")
target_include_directories(RtMidi PUBLIC "src/midi/external/rtmidi")
if(CMAKE_SYSTEM_NAME STREQUAL "Linux")
target_compile_definitions(RtMidi PUBLIC "__LINUX_ALSA__")
target_link_libraries(RtMidi PUBLIC "asound")
elseif(CMAKE_SYSTEM_NAME STREQUAL "Windows")
target_compile_definitions(RtMidi PUBLIC "__WINDOWS_MM__")
target_link_libraries(RtMidi PUBLIC "winmm")
elseif(CMAKE_SYSTEM_NAME STREQUAL "Darwin")
target_compile_definitions(RtMidi PUBLIC "__MACOSX_CORE__")
find_library(COREMIDI_LIBRARY "CoreMIDI")
target_link_libraries(RtMidi PUBLIC "${COREMIDI_LIBRARY}")
endif()
target_link_libraries(OPL3BankEditor PRIVATE RtMidi)
endif()
target_sources(OPL3BankEditor PRIVATE "src/midi/midi_rtmidi.cpp")
target_compile_definitions(OPL3BankEditor PRIVATE "ENABLE_MIDI")
endif()
if(USE_RTAUDIO)
if(NOT USE_VENDORED_RTAUDIO)
include(CheckCXXSymbolExists)
if(PKG_CONFIG_FOUND)
pkg_check_modules(RTAUDIO rtaudio>=5.1)
if(RTAUDIO_FOUND)
message("!! Using system-installed RtAudio found by pkg-config")
target_compile_options(OPL3BankEditor PUBLIC ${RTAUDIO_CFLAGS})
target_include_directories(OPL3BankEditor PUBLIC ${RTAUDIO_INCLUDE_DIRS})
target_link_libraries(OPL3BankEditor PUBLIC ${RTAUDIO_LDFLAGS})
else()
set(RTAUDIO_FOUND FALSE)
endif()
endif()
if(NOT RTAUDIO_FOUND)
find_library(RTAUDIO_MANUAL_LIBRARY rtaudio)
message("!! RtAudio library: ${RTAUDIO_MANUAL_LIBRARY}")
find_path(RTAUDIO_MANUAL_INCLUDE_DIRS NAMES "RtAudio.h" PATH_SUFFIXES "include/rtaudio")
message("!! RtAudio header directory: ${RTAUDIO_MANUAL_INCLUDE_DIRS}")
set(CMAKE_REQUIRED_INCLUDES ${RTAUDIO_MANUAL_INCLUDE_DIRS})
set(CMAKE_REQUIRED_LIBRARIES ${RTAUDIO_MANUAL_LIBRARY})
check_cxx_symbol_exists(RtAudio::getCompiledApiName "RtAudio.h" RTAUDIO_MANUAL_SUFFICIENT)
if(RTAUDIO_MANUAL_LIBRARY AND RTAUDIO_MANUAL_INCLUDE_DIRS AND RTAUDIO_MANUAL_SUFFICIENT)
message("!! Using system-installed RtAudio")
set(RTAUDIO_FOUND TRUE)
target_include_directories(OPL3BankEditor PUBLIC ${RTAUDIO_MANUAL_INCLUDE_DIRS})
target_link_libraries(OPL3BankEditor PUBLIC ${RTAUDIO_MANUAL_LIBRARY})
endif()
endif()
endif()
if(NOT RTAUDIO_FOUND OR USE_VENDORED_RTAUDIO)
message("!! Using bundled RtAudio.")
add_library(RtAudio STATIC "src/audio/external/rtaudio/RtAudio.cpp")
target_include_directories(RtAudio PUBLIC "src/audio/external/rtaudio")
if(USE_VENDORED_RTAUDIO_JACK AND (CMAKE_SYSTEM_NAME STREQUAL "Linux" OR CMAKE_SYSTEM_NAME STREQUAL "Darwin"))
if(PKG_CONFIG_FOUND)
pkg_check_modules(JACK jack)
if(JACK_FOUND)
message("!! Using system-installed JACK found by pkg-config")
endif()
endif()
if(NOT JACK_FOUND)
find_library(JACK_LIBRARY jack)
message("!! JACK library: ${JACK_LIBRARY}")
find_path(JACK_INCLUDE_DIRS NAMES "jack.h" PATH_SUFFIXES "include/jack")
message("!! JACK header directory: ${JACK_INCLUDE_DIRS}")
if(JACK_LIBRARY AND JACK_INCLUDE_DIRS)
message("!! Using system-installed JACK")
set(JACK_FOUND TRUE)
set(JACK_LDFLAGS ${JACK_LIBRARY})
endif()
endif()
if(JACK_FOUND)
target_compile_definitions(RtAudio PUBLIC "__UNIX_JACK__")
target_compile_options(RtAudio PUBLIC ${JACK_CFLAGS})
target_include_directories(RtAudio PUBLIC ${JACK_INCLUDE_DIRS})
target_link_libraries(RtAudio PUBLIC ${JACK_LDFLAGS})
endif()
endif()
if(CMAKE_SYSTEM_NAME STREQUAL "Linux")
target_compile_definitions(RtAudio PUBLIC "__LINUX_ALSA__")
target_link_libraries(RtAudio PUBLIC "asound")
if(PKG_CONFIG_FOUND)
pkg_check_modules(PULSEAUDIO libpulse-simple)
if(PULSEAUDIO_FOUND)
message("!! Using system-installed PulseAudio found by pkg-config")
endif()
endif()
if(NOT PULSEAUDIO_FOUND)
find_library(PULSEAUDIO_SIMPLE pulse-simple)
find_library(PULSEAUDIO_COMMON pulse)
message("!! PulseAudio libraries: ${PULSEAUDIO_SIMPLE} ${PULSEAUDIO_COMMON}")
find_path(PULSEAUDIO_INCLUDE_DIRS NAMES "simple.h" PATH_SUFFIXES "include/pulse")
message("!! PulseAudio header directory: ${PULSEAUDIO_INCLUDE_DIRS}")
if(PULSEAUDIO_SIMPLE AND PULSEAUDIO_INCLUDE_DIRS)
message("!! Using system-installed PulseAudio")
set(PULSEAUDIO_FOUND TRUE)
set(PULSEAUDIO_CFLAGS "-D_REENTRANT")
set(PULSEAUDIO_LDFLAGS ${PULSEAUDIO_SIMPLE} ${PULSEAUDIO_COMMON})
endif()
endif()
if(PULSEAUDIO_FOUND)
target_compile_definitions(RtAudio PUBLIC "__LINUX_PULSE__")
target_compile_options(RtAudio PUBLIC ${PULSEAUDIO_CFLAGS})
target_include_directories(RtAudio PUBLIC ${PULSEAUDIO_INCLUDE_DIRS})
target_link_libraries(RtAudio PUBLIC ${PULSEAUDIO_LDFLAGS})
endif()
elseif(CMAKE_SYSTEM_NAME STREQUAL "Windows")
target_compile_definitions(RtAudio PUBLIC "__WINDOWS_DS__")
target_link_libraries(RtAudio PUBLIC "dsound" "ole32")
if(USE_RTAUDIO_WASAPI)
target_compile_definitions(RtAudio PUBLIC "__WINDOWS_WASAPI__")
target_link_libraries(RtAudio PUBLIC "mfplat" "mfuuid" "wmcodecdspuuid")
endif()
target_link_libraries(RtAudio PUBLIC "ksguid")
# target_compile_definitions(RtAudio PUBLIC "__WINDOWS_ASIO__")
target_include_directories(RtAudio PRIVATE "src/audio/external/rtaudio/include")
# target_sources(RtAudio PRIVATE
# "src/audio/external/rtaudio/include/asio.cpp"
# "src/audio/external/rtaudio/include/asiodrivers.cpp"
# "src/audio/external/rtaudio/include/asiolist.cpp"
# "src/audio/external/rtaudio/include/iasiothiscallresolver.cpp")
elseif(CMAKE_SYSTEM_NAME STREQUAL "Darwin")
target_compile_definitions(RtAudio PUBLIC "__MACOSX_CORE__")
find_library(COREAUDIO_LIBRARY "CoreAudio")
target_link_libraries(RtAudio PUBLIC "${COREAUDIO_LIBRARY}")
find_library(COREFOUNDATION_LIBRARY "CoreFoundation")
target_link_libraries(RtAudio PUBLIC "${COREFOUNDATION_LIBRARY}")
endif()
target_link_libraries(OPL3BankEditor PRIVATE RtAudio)
endif()
target_sources(OPL3BankEditor PRIVATE "src/audio/ao_rtaudio.cpp")
target_compile_definitions(OPL3BankEditor PRIVATE "ENABLE_AUDIO_TESTING")
endif()
add_executable(measurer_tool "utils/measurer/measurer-tool.cpp")
set_target_properties(measurer_tool PROPERTIES OUTPUT_NAME "measurer")
target_link_libraries(measurer_tool PRIVATE ${QT_EXTRA_LIBS} FileFormats Measurer Chips ${QT_EXTRA_LIBS_PRE})
if(FORCE_EXEC_NO_PIE)
pge_set_nopie(measurer_tool)
endif()
================================================
FILE: FMBankEdit.pro
================================================
#----------------------------------------------------------------------------
# OPL Bank Editor by Wohlstand, a free tool for music bank editing
# Copyright (c) 2016-2026 Vitaly Novichkov <admin@wohlnet.ru>
#
# This program is free software: you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation, either version 3 of the License, or
# any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program. If not, see <http://www.gnu.org/licenses/>.
#----------------------------------------------------------------------------
#-------------------------------------------------
#
# Project created by QtCreator 2016-06-07T13:26:28
#
#-------------------------------------------------
QT += core gui
greaterThan(QT_MAJOR_VERSION, 4):{
QT += widgets concurrent
DEFINES += ENABLE_AUDIO_TESTING
load(configure)
if(qtCompileTest(cpp14)) {
CONFIG += c++14
CONFIG += enable_ymfm
message("TEST: С++14 support presented, YMFM will be ENABLED!")
} else {
CONFIG += c++11
message("TEST: С++14 was not found, YMFM will be DISABLED!")
}
} else {
QMAKE_CXXFLAGS += -std=c++11
DEFINES += IS_QT_4
win32: {
CONFIG += static
QMAKE_LFLAGS += -static-libgcc -static-libstdc++ -static
#DEFINES += snprintf=_snprintf
DEFINES += NO_NATIVE_OPEN_DIALOGS
INCLUDEPATH += $$PWD/src/audio/for-mingw-9x
}
unix: !macx {
CONFIG+=linux
}
}
win32 {
DEFINES += _USE_MATH_DEFINES
greaterThan(QT_MAJOR_VERSION, 4):{
# Enforce the Windows XP compatibility
DEFINES += WINVER=0x0501 _WIN32_WINNT=0x0501
} else {
# Enforce the Windows 98 compatibility
DEFINES += WINVER=0x0500 _WIN32_WINNT=0x0500
}
}
CONFIG += rtmidi
CONFIG += rtaudio
#CONFIG += plots
LIBS += -lz
!macx:{
QMAKE_CXXFLAGS += -fopenmp
}
TEMPLATE = app
TARGET = opl3_bank_editor
INCLUDEPATH += $$PWD/src
# Better name look for an app bundle
macx: TARGET = "OPL3 Bank Editor"
android:{
ARCH=android_arm
} else {
!contains(QMAKE_TARGET.arch, x86_64) {
ARCH=x32
} else {
ARCH=x64
}
}
debug: {
BUILDTP=debug
DEFINES += DEBUG_BUILD=1
DESTDIR = $$PWD/bin-debug/
} else: release: {
BUILDTP=release
DESTDIR = $$PWD/bin-release/
}
BUILD_OBJ_DIR = $$PWD/_build_data
OBJECTS_DIR = $$BUILD_OBJ_DIR/_build_$$ARCH/$$TARGET/_$$BUILDTP/.obj
MOC_DIR = $$BUILD_OBJ_DIR/_build_$$ARCH/$$TARGET/_$$BUILDTP/.moc
RCC_DIR = $$BUILD_OBJ_DIR/_build_$$ARCH/$$TARGET/_$$BUILDTP/.rcc
UI_DIR = $$BUILD_OBJ_DIR/_build_$$ARCH/$$TARGET/_$$BUILDTP/.ui
win32: RC_FILE = $$PWD/src/resources/res.rc
macx: ICON = $$PWD/src/resources/opl3.icns
rtaudio {
include("src/audio/ao_rtaudio.pri")
}
rtmidi {
DEFINES += ENABLE_MIDI
include("src/midi/midi_rtmidi.pri")
}
win32||oplproxy: {
include("src/opl/chips/win9x_opl_proxy.pri")
DEFINES += ENABLE_HW_OPL_PROXY
LIBS += -lpthread
}
greaterThan(QT_MAJOR_VERSION, 4):lessThan(QT_MAJOR_VERSION, 6) {
include("src/opl/chips/opl_serial_port.pri")
DEFINES += ENABLE_HW_OPL_SERIAL_PORT
}
win32 {
lessThan(QT_MAJOR_VERSION, 4):{
DEFINES += ENABLE_WIN9X_OPL_PROXY
}
}
include(src/opl/chips/chipset.pri)
SOURCES += \
src/audio.cpp \
src/bank.cpp \
src/bank_editor.cpp \
src/bank_type_dlg.cpp \
src/operator_editor.cpp \
src/bank_comparison.cpp \
src/common.cpp \
src/controlls.cpp \
src/proxystyle.cpp \
src/FileFormats/ffmt_base.cpp \
src/FileFormats/ffmt_enums.cpp \
src/FileFormats/ffmt_factory.cpp \
src/FileFormats/format_adlib_bnk.cpp \
src/FileFormats/format_adlib_tim.cpp \
src/FileFormats/format_adlibgold_bnk2.cpp \
src/FileFormats/format_ail2_gtl.cpp \
src/FileFormats/format_apogeetmb.cpp \
src/FileFormats/format_bisqwit.cpp \
src/FileFormats/format_cmf_importer.cpp \
src/FileFormats/format_dmxopl2.cpp \
src/FileFormats/format_ea_importer.cpp \
src/FileFormats/format_imf_importer.cpp \
src/FileFormats/format_junlevizion.cpp \
src/FileFormats/format_rad_importer.cpp \
src/FileFormats/format_sb_ibk.cpp \
src/FileFormats/format_dro_importer.cpp \
src/FileFormats/format_vgm_import.cpp \
src/FileFormats/format_smaf_importer.cpp \
src/FileFormats/format_klm_importer.cpp \
src/FileFormats/format_misc_sgi.cpp \
src/FileFormats/format_misc_cif.cpp \
src/FileFormats/format_misc_hsc.cpp \
src/FileFormats/format_wohlstand_opl3.cpp \
src/FileFormats/format_wohlstand_opl3_text.cpp \
src/FileFormats/format_flatbuffer_opl3.cpp \
src/FileFormats/format_patch_fm4.cpp \
src/FileFormats/ymf262_to_wopi.cpp \
src/formats_sup.cpp \
src/importer.cpp \
src/audio_config.cpp \
src/hardware.cpp \
src/ins_names.cpp \
src/main.cpp \
src/opl/generator.cpp \
src/opl/generator_realtime.cpp \
src/opl/realtime/ring_buffer.cpp \
src/opl/models/model_ail.c \
src/opl/models/model_apogee.c \
src/opl/models/model_dmx.c \
src/opl/models/model_generic.c \
src/opl/models/model_hmi_sos.c \
src/opl/models/model_msadlib.c \
src/opl/models/model_oconnell.c \
src/opl/models/model_win9x.c \
src/piano.cpp \
src/opl/measurer.cpp \
src/FileFormats/wopl/wopl_file.c
HEADERS += \
src/bank_editor.h \
src/bank_type_dlg.h \
src/operator_editor.h \
src/bank_comparison.h \
src/bank.h \
src/common.h \
src/proxystyle.h \
src/FileFormats/ffmt_base.h \
src/FileFormats/ffmt_enums.h \
src/FileFormats/ffmt_factory.h \
src/FileFormats/format_adlib_bnk.h \
src/FileFormats/format_adlib_tim.h \
src/FileFormats/format_adlibgold_bnk2.h \
src/FileFormats/format_ail2_gtl.h \
src/FileFormats/format_apogeetmb.h \
src/FileFormats/format_bisqwit.h \
src/FileFormats/format_cmf_importer.h \
src/FileFormats/format_dmxopl2.h \
src/FileFormats/format_ea_importer.h \
src/FileFormats/format_imf_importer.h \
src/FileFormats/format_junlevizion.h \
src/FileFormats/format_rad_importer.h \
src/FileFormats/format_sb_ibk.h \
src/FileFormats/format_dro_importer.h \
src/FileFormats/format_vgm_import.h \
src/FileFormats/format_smaf_importer.h \
src/FileFormats/format_klm_importer.h \
src/FileFormats/format_misc_sgi.h \
src/FileFormats/format_misc_cif.h \
src/FileFormats/format_misc_hsc.h \
src/FileFormats/format_wohlstand_opl3.h \
src/FileFormats/format_wohlstand_opl3_text.h \
src/FileFormats/format_flatbuffer_opl3.h \
src/FileFormats/format_patch_fm4.h \
src/FileFormats/ymf262_to_wopi.h \
src/formats_sup.h \
src/importer.h \
src/audio_config.h \
src/hardware.h \
src/ins_names.h \
src/ins_names_data.h \
src/main.h \
src/opl/generator.h \
src/opl/generator_realtime.h \
src/opl/nukedopl3.h \
src/opl/realtime/ring_buffer.h \
src/opl/realtime/ring_buffer.tcc \
src/opl/models/opl_models.h \
src/piano.h \
src/version.h \
src/opl/measurer.h \
src/FileFormats/wopl/wopl_file.h
FORMS += \
src/bank_editor.ui \
src/operator_editor.ui \
src/bank_comparison.ui \
src/formats_sup.ui \
src/importer.ui \
src/audio_config.ui \
src/hardware.ui
RESOURCES += \
src/resources/resources.qrc
TRANSLATIONS += \
src/translations/opl3bankeditor_fr_FR.ts \
src/translations/opl3bankeditor_ru_RU.ts \
src/translations/opl3bankeditor_pl_PL.ts
plots {
SOURCES += src/delay_analysis.cpp
HEADERS += src/delay_analysis.h
FORMS += src/delay_analysis.ui
CONFIG += qwt
DEFINES += ENABLE_PLOTS
}
================================================
FILE: LICENSE
================================================
GNU GENERAL PUBLIC LICENSE
Version 3, 29 June 2007
Copyright (C) 2007 Free Software Foundation, Inc. <http://fsf.org/>
Everyone is permitted to copy and distribute verbatim copies
of this license document, but changing it is not allowed.
Preamble
The GNU General Public License is a free, copyleft license for
software and other kinds of works.
The licenses for most software and other practical works are designed
to take away your freedom to share and change the works. By contrast,
the GNU General Public License is intended to guarantee your freedom to
share and change all versions of a program--to make sure it remains free
software for all its users. We, the Free Software Foundation, use the
GNU General Public License for most of our software; it applies also to
any other work released this way by its authors. You can apply it to
your programs, too.
When we speak of free software, we are referring to freedom, not
price. Our General Public Licenses are designed to make sure that you
have the freedom to distribute copies of free software (and charge for
them if you wish), that you receive source code or can get it if you
want it, that you can change the software or use pieces of it in new
free programs, and that you know you can do these things.
To protect your rights, we need to prevent others from denying you
these rights or asking you to surrender the rights. Therefore, you have
certain responsibilities if you distribute copies of the software, or if
you modify it: responsibilities to respect the freedom of others.
For example, if you distribute copies of such a program, whether
gratis or for a fee, you must pass on to the recipients the same
freedoms that you received. You must make sure that they, too, receive
or can get the source code. And you must show them these terms so they
know their rights.
Developers that use the GNU GPL protect your rights with two steps:
(1) assert copyright on the software, and (2) offer you this License
giving you legal permission to copy, distribute and/or modify it.
For the developers' and authors' protection, the GPL clearly explains
that there is no warranty for this free software. For both users' and
authors' sake, the GPL requires that modified versions be marked as
changed, so that their problems will not be attributed erroneously to
authors of previous versions.
Some devices are designed to deny users access to install or run
modified versions of the software inside them, although the manufacturer
can do so. This is fundamentally incompatible with the aim of
protecting users' freedom to change the software. The systematic
pattern of such abuse occurs in the area of products for individuals to
use, which is precisely where it is most unacceptable. Therefore, we
have designed this version of the GPL to prohibit the practice for those
products. If such problems arise substantially in other domains, we
stand ready to extend this provision to those domains in future versions
of the GPL, as needed to protect the freedom of users.
Finally, every program is threatened constantly by software patents.
States should not allow patents to restrict development and use of
software on general-purpose computers, but in those that do, we wish to
avoid the special danger that patents applied to a free program could
make it effectively proprietary. To prevent this, the GPL assures that
patents cannot be used to render the program non-free.
The precise terms and conditions for copying, distribution and
modification follow.
TERMS AND CONDITIONS
0. Definitions.
"This License" refers to version 3 of the GNU General Public License.
"Copyright" also means copyright-like laws that apply to other kinds of
works, such as semiconductor masks.
"The Program" refers to any copyrightable work licensed under this
License. Each licensee is addressed as "you". "Licensees" and
"recipients" may be individuals or organizations.
To "modify" a work means to copy from or adapt all or part of the work
in a fashion requiring copyright permission, other than the making of an
exact copy. The resulting work is called a "modified version" of the
earlier work or a work "based on" the earlier work.
A "covered work" means either the unmodified Program or a work based
on the Program.
To "propagate" a work means to do anything with it that, without
permission, would make you directly or secondarily liable for
infringement under applicable copyright law, except executing it on a
computer or modifying a private copy. Propagation includes copying,
distribution (with or without modification), making available to the
public, and in some countries other activities as well.
To "convey" a work means any kind of propagation that enables other
parties to make or receive copies. Mere interaction with a user through
a computer network, with no transfer of a copy, is not conveying.
An interactive user interface displays "Appropriate Legal Notices"
to the extent that it includes a convenient and prominently visible
feature that (1) displays an appropriate copyright notice, and (2)
tells the user that there is no warranty for the work (except to the
extent that warranties are provided), that licensees may convey the
work under this License, and how to view a copy of this License. If
the interface presents a list of user commands or options, such as a
menu, a prominent item in the list meets this criterion.
1. Source Code.
The "source code" for a work means the preferred form of the work
for making modifications to it. "Object code" means any non-source
form of a work.
A "Standard Interface" means an interface that either is an official
standard defined by a recognized standards body, or, in the case of
interfaces specified for a particular programming language, one that
is widely used among developers working in that language.
The "System Libraries" of an executable work include anything, other
than the work as a whole, that (a) is included in the normal form of
packaging a Major Component, but which is not part of that Major
Component, and (b) serves only to enable use of the work with that
Major Component, or to implement a Standard Interface for which an
implementation is available to the public in source code form. A
"Major Component", in this context, means a major essential component
(kernel, window system, and so on) of the specific operating system
(if any) on which the executable work runs, or a compiler used to
produce the work, or an object code interpreter used to run it.
The "Corresponding Source" for a work in object code form means all
the source code needed to generate, install, and (for an executable
work) run the object code and to modify the work, including scripts to
control those activities. However, it does not include the work's
System Libraries, or general-purpose tools or generally available free
programs which are used unmodified in performing those activities but
which are not part of the work. For example, Corresponding Source
includes interface definition files associated with source files for
the work, and the source code for shared libraries and dynamically
linked subprograms that the work is specifically designed to require,
such as by intimate data communication or control flow between those
subprograms and other parts of the work.
The Corresponding Source need not include anything that users
can regenerate automatically from other parts of the Corresponding
Source.
The Corresponding Source for a work in source code form is that
same work.
2. Basic Permissions.
All rights granted under this License are granted for the term of
copyright on the Program, and are irrevocable provided the stated
conditions are met. This License explicitly affirms your unlimited
permission to run the unmodified Program. The output from running a
covered work is covered by this License only if the output, given its
content, constitutes a covered work. This License acknowledges your
rights of fair use or other equivalent, as provided by copyright law.
You may make, run and propagate covered works that you do not
convey, without conditions so long as your license otherwise remains
in force. You may convey covered works to others for the sole purpose
of having them make modifications exclusively for you, or provide you
with facilities for running those works, provided that you comply with
the terms of this License in conveying all material for which you do
not control copyright. Those thus making or running the covered works
for you must do so exclusively on your behalf, under your direction
and control, on terms that prohibit them from making any copies of
your copyrighted material outside their relationship with you.
Conveying under any other circumstances is permitted solely under
the conditions stated below. Sublicensing is not allowed; section 10
makes it unnecessary.
3. Protecting Users' Legal Rights From Anti-Circumvention Law.
No covered work shall be deemed part of an effective technological
measure under any applicable law fulfilling obligations under article
11 of the WIPO copyright treaty adopted on 20 December 1996, or
similar laws prohibiting or restricting circumvention of such
measures.
When you convey a covered work, you waive any legal power to forbid
circumvention of technological measures to the extent such circumvention
is effected by exercising rights under this License with respect to
the covered work, and you disclaim any intention to limit operation or
modification of the work as a means of enforcing, against the work's
users, your or third parties' legal rights to forbid circumvention of
technological measures.
4. Conveying Verbatim Copies.
You may convey verbatim copies of the Program's source code as you
receive it, in any medium, provided that you conspicuously and
appropriately publish on each copy an appropriate copyright notice;
keep intact all notices stating that this License and any
non-permissive terms added in accord with section 7 apply to the code;
keep intact all notices of the absence of any warranty; and give all
recipients a copy of this License along with the Program.
You may charge any price or no price for each copy that you convey,
and you may offer support or warranty protection for a fee.
5. Conveying Modified Source Versions.
You may convey a work based on the Program, or the modifications to
produce it from the Program, in the form of source code under the
terms of section 4, provided that you also meet all of these conditions:
a) The work must carry prominent notices stating that you modified
it, and giving a relevant date.
b) The work must carry prominent notices stating that it is
released under this License and any conditions added under section
7. This requirement modifies the requirement in section 4 to
"keep intact all notices".
c) You must license the entire work, as a whole, under this
License to anyone who comes into possession of a copy. This
License will therefore apply, along with any applicable section 7
additional terms, to the whole of the work, and all its parts,
regardless of how they are packaged. This License gives no
permission to license the work in any other way, but it does not
invalidate such permission if you have separately received it.
d) If the work has interactive user interfaces, each must display
Appropriate Legal Notices; however, if the Program has interactive
interfaces that do not display Appropriate Legal Notices, your
work need not make them do so.
A compilation of a covered work with other separate and independent
works, which are not by their nature extensions of the covered work,
and which are not combined with it such as to form a larger program,
in or on a volume of a storage or distribution medium, is called an
"aggregate" if the compilation and its resulting copyright are not
used to limit the access or legal rights of the compilation's users
beyond what the individual works permit. Inclusion of a covered work
in an aggregate does not cause this License to apply to the other
parts of the aggregate.
6. Conveying Non-Source Forms.
You may convey a covered work in object code form under the terms
of sections 4 and 5, provided that you also convey the
machine-readable Corresponding Source under the terms of this License,
in one of these ways:
a) Convey the object code in, or embodied in, a physical product
(including a physical distribution medium), accompanied by the
Corresponding Source fixed on a durable physical medium
customarily used for software interchange.
b) Convey the object code in, or embodied in, a physical product
(including a physical distribution medium), accompanied by a
written offer, valid for at least three years and valid for as
long as you offer spare parts or customer support for that product
model, to give anyone who possesses the object code either (1) a
copy of the Corresponding Source for all the software in the
product that is covered by this License, on a durable physical
medium customarily used for software interchange, for a price no
more than your reasonable cost of physically performing this
conveying of source, or (2) access to copy the
Corresponding Source from a network server at no charge.
c) Convey individual copies of the object code with a copy of the
written offer to provide the Corresponding Source. This
alternative is allowed only occasionally and noncommercially, and
only if you received the object code with such an offer, in accord
with subsection 6b.
d) Convey the object code by offering access from a designated
place (gratis or for a charge), and offer equivalent access to the
Corresponding Source in the same way through the same place at no
further charge. You need not require recipients to copy the
Corresponding Source along with the object code. If the place to
copy the object code is a network server, the Corresponding Source
may be on a different server (operated by you or a third party)
that supports equivalent copying facilities, provided you maintain
clear directions next to the object code saying where to find the
Corresponding Source. Regardless of what server hosts the
Corresponding Source, you remain obligated to ensure that it is
available for as long as needed to satisfy these requirements.
e) Convey the object code using peer-to-peer transmission, provided
you inform other peers where the object code and Corresponding
Source of the work are being offered to the general public at no
charge under subsection 6d.
A separable portion of the object code, whose source code is excluded
from the Corresponding Source as a System Library, need not be
included in conveying the object code work.
A "User Product" is either (1) a "consumer product", which means any
tangible personal property which is normally used for personal, family,
or household purposes, or (2) anything designed or sold for incorporation
into a dwelling. In determining whether a product is a consumer product,
doubtful cases shall be resolved in favor of coverage. For a particular
product received by a particular user, "normally used" refers to a
typical or common use of that class of product, regardless of the status
of the particular user or of the way in which the particular user
actually uses, or expects or is expected to use, the product. A product
is a consumer product regardless of whether the product has substantial
commercial, industrial or non-consumer uses, unless such uses represent
the only significant mode of use of the product.
"Installation Information" for a User Product means any methods,
procedures, authorization keys, or other information required to install
and execute modified versions of a covered work in that User Product from
a modified version of its Corresponding Source. The information must
suffice to ensure that the continued functioning of the modified object
code is in no case prevented or interfered with solely because
modification has been made.
If you convey an object code work under this section in, or with, or
specifically for use in, a User Product, and the conveying occurs as
part of a transaction in which the right of possession and use of the
User Product is transferred to the recipient in perpetuity or for a
fixed term (regardless of how the transaction is characterized), the
Corresponding Source conveyed under this section must be accompanied
by the Installation Information. But this requirement does not apply
if neither you nor any third party retains the ability to install
modified object code on the User Product (for example, the work has
been installed in ROM).
The requirement to provide Installation Information does not include a
requirement to continue to provide support service, warranty, or updates
for a work that has been modified or installed by the recipient, or for
the User Product in which it has been modified or installed. Access to a
network may be denied when the modification itself materially and
adversely affects the operation of the network or violates the rules and
protocols for communication across the network.
Corresponding Source conveyed, and Installation Information provided,
in accord with this section must be in a format that is publicly
documented (and with an implementation available to the public in
source code form), and must require no special password or key for
unpacking, reading or copying.
7. Additional Terms.
"Additional permissions" are terms that supplement the terms of this
License by making exceptions from one or more of its conditions.
Additional permissions that are applicable to the entire Program shall
be treated as though they were included in this License, to the extent
that they are valid under applicable law. If additional permissions
apply only to part of the Program, that part may be used separately
under those permissions, but the entire Program remains governed by
this License without regard to the additional permissions.
When you convey a copy of a covered work, you may at your option
remove any additional permissions from that copy, or from any part of
it. (Additional permissions may be written to require their own
removal in certain cases when you modify the work.) You may place
additional permissions on material, added by you to a covered work,
for which you have or can give appropriate copyright permission.
Notwithstanding any other provision of this License, for material you
add to a covered work, you may (if authorized by the copyright holders of
that material) supplement the terms of this License with terms:
a) Disclaiming warranty or limiting liability differently from the
terms of sections 15 and 16 of this License; or
b) Requiring preservation of specified reasonable legal notices or
author attributions in that material or in the Appropriate Legal
Notices displayed by works containing it; or
c) Prohibiting misrepresentation of the origin of that material, or
requiring that modified versions of such material be marked in
reasonable ways as different from the original version; or
d) Limiting the use for publicity purposes of names of licensors or
authors of the material; or
e) Declining to grant rights under trademark law for use of some
trade names, trademarks, or service marks; or
f) Requiring indemnification of licensors and authors of that
material by anyone who conveys the material (or modified versions of
it) with contractual assumptions of liability to the recipient, for
any liability that these contractual assumptions directly impose on
those licensors and authors.
All other non-permissive additional terms are considered "further
restrictions" within the meaning of section 10. If the Program as you
received it, or any part of it, contains a notice stating that it is
governed by this License along with a term that is a further
restriction, you may remove that term. If a license document contains
a further restriction but permits relicensing or conveying under this
License, you may add to a covered work material governed by the terms
of that license document, provided that the further restriction does
not survive such relicensing or conveying.
If you add terms to a covered work in accord with this section, you
must place, in the relevant source files, a statement of the
additional terms that apply to those files, or a notice indicating
where to find the applicable terms.
Additional terms, permissive or non-permissive, may be stated in the
form of a separately written license, or stated as exceptions;
the above requirements apply either way.
8. Termination.
You may not propagate or modify a covered work except as expressly
provided under this License. Any attempt otherwise to propagate or
modify it is void, and will automatically terminate your rights under
this License (including any patent licenses granted under the third
paragraph of section 11).
However, if you cease all violation of this License, then your
license from a particular copyright holder is reinstated (a)
provisionally, unless and until the copyright holder explicitly and
finally terminates your license, and (b) permanently, if the copyright
holder fails to notify you of the violation by some reasonable means
prior to 60 days after the cessation.
Moreover, your license from a particular copyright holder is
reinstated permanently if the copyright holder notifies you of the
violation by some reasonable means, this is the first time you have
received notice of violation of this License (for any work) from that
copyright holder, and you cure the violation prior to 30 days after
your receipt of the notice.
Termination of your rights under this section does not terminate the
licenses of parties who have received copies or rights from you under
this License. If your rights have been terminated and not permanently
reinstated, you do not qualify to receive new licenses for the same
material under section 10.
9. Acceptance Not Required for Having Copies.
You are not required to accept this License in order to receive or
run a copy of the Program. Ancillary propagation of a covered work
occurring solely as a consequence of using peer-to-peer transmission
to receive a copy likewise does not require acceptance. However,
nothing other than this License grants you permission to propagate or
modify any covered work. These actions infringe copyright if you do
not accept this License. Therefore, by modifying or propagating a
covered work, you indicate your acceptance of this License to do so.
10. Automatic Licensing of Downstream Recipients.
Each time you convey a covered work, the recipient automatically
receives a license from the original licensors, to run, modify and
propagate that work, subject to this License. You are not responsible
for enforcing compliance by third parties with this License.
An "entity transaction" is a transaction transferring control of an
organization, or substantially all assets of one, or subdividing an
organization, or merging organizations. If propagation of a covered
work results from an entity transaction, each party to that
transaction who receives a copy of the work also receives whatever
licenses to the work the party's predecessor in interest had or could
give under the previous paragraph, plus a right to possession of the
Corresponding Source of the work from the predecessor in interest, if
the predecessor has it or can get it with reasonable efforts.
You may not impose any further restrictions on the exercise of the
rights granted or affirmed under this License. For example, you may
not impose a license fee, royalty, or other charge for exercise of
rights granted under this License, and you may not initiate litigation
(including a cross-claim or counterclaim in a lawsuit) alleging that
any patent claim is infringed by making, using, selling, offering for
sale, or importing the Program or any portion of it.
11. Patents.
A "contributor" is a copyright holder who authorizes use under this
License of the Program or a work on which the Program is based. The
work thus licensed is called the contributor's "contributor version".
A contributor's "essential patent claims" are all patent claims
owned or controlled by the contributor, whether already acquired or
hereafter acquired, that would be infringed by some manner, permitted
by this License, of making, using, or selling its contributor version,
but do not include claims that would be infringed only as a
consequence of further modification of the contributor version. For
purposes of this definition, "control" includes the right to grant
patent sublicenses in a manner consistent with the requirements of
this License.
Each contributor grants you a non-exclusive, worldwide, royalty-free
patent license under the contributor's essential patent claims, to
make, use, sell, offer for sale, import and otherwise run, modify and
propagate the contents of its contributor version.
In the following three paragraphs, a "patent license" is any express
agreement or commitment, however denominated, not to enforce a patent
(such as an express permission to practice a patent or covenant not to
sue for patent infringement). To "grant" such a patent license to a
party means to make such an agreement or commitment not to enforce a
patent against the party.
If you convey a covered work, knowingly relying on a patent license,
and the Corresponding Source of the work is not available for anyone
to copy, free of charge and under the terms of this License, through a
publicly available network server or other readily accessible means,
then you must either (1) cause the Corresponding Source to be so
available, or (2) arrange to deprive yourself of the benefit of the
patent license for this particular work, or (3) arrange, in a manner
consistent with the requirements of this License, to extend the patent
license to downstream recipients. "Knowingly relying" means you have
actual knowledge that, but for the patent license, your conveying the
covered work in a country, or your recipient's use of the covered work
in a country, would infringe one or more identifiable patents in that
country that you have reason to believe are valid.
If, pursuant to or in connection with a single transaction or
arrangement, you convey, or propagate by procuring conveyance of, a
covered work, and grant a patent license to some of the parties
receiving the covered work authorizing them to use, propagate, modify
or convey a specific copy of the covered work, then the patent license
you grant is automatically extended to all recipients of the covered
work and works based on it.
A patent license is "discriminatory" if it does not include within
the scope of its coverage, prohibits the exercise of, or is
conditioned on the non-exercise of one or more of the rights that are
specifically granted under this License. You may not convey a covered
work if you are a party to an arrangement with a third party that is
in the business of distributing software, under which you make payment
to the third party based on the extent of your activity of conveying
the work, and under which the third party grants, to any of the
parties who would receive the covered work from you, a discriminatory
patent license (a) in connection with copies of the covered work
conveyed by you (or copies made from those copies), or (b) primarily
for and in connection with specific products or compilations that
contain the covered work, unless you entered into that arrangement,
or that patent license was granted, prior to 28 March 2007.
Nothing in this License shall be construed as excluding or limiting
any implied license or other defenses to infringement that may
otherwise be available to you under applicable patent law.
12. No Surrender of Others' Freedom.
If conditions are imposed on you (whether by court order, agreement or
otherwise) that contradict the conditions of this License, they do not
excuse you from the conditions of this License. If you cannot convey a
covered work so as to satisfy simultaneously your obligations under this
License and any other pertinent obligations, then as a consequence you may
not convey it at all. For example, if you agree to terms that obligate you
to collect a royalty for further conveying from those to whom you convey
the Program, the only way you could satisfy both those terms and this
License would be to refrain entirely from conveying the Program.
13. Use with the GNU Affero General Public License.
Notwithstanding any other provision of this License, you have
permission to link or combine any covered work with a work licensed
under version 3 of the GNU Affero General Public License into a single
combined work, and to convey the resulting work. The terms of this
License will continue to apply to the part which is the covered work,
but the special requirements of the GNU Affero General Public License,
section 13, concerning interaction through a network will apply to the
combination as such.
14. Revised Versions of this License.
The Free Software Foundation may publish revised and/or new versions of
the GNU General Public License from time to time. Such new versions will
be similar in spirit to the present version, but may differ in detail to
address new problems or concerns.
Each version is given a distinguishing version number. If the
Program specifies that a certain numbered version of the GNU General
Public License "or any later version" applies to it, you have the
option of following the terms and conditions either of that numbered
version or of any later version published by the Free Software
Foundation. If the Program does not specify a version number of the
GNU General Public License, you may choose any version ever published
by the Free Software Foundation.
If the Program specifies that a proxy can decide which future
versions of the GNU General Public License can be used, that proxy's
public statement of acceptance of a version permanently authorizes you
to choose that version for the Program.
Later license versions may give you additional or different
permissions. However, no additional obligations are imposed on any
author or copyright holder as a result of your choosing to follow a
later version.
15. Disclaimer of Warranty.
THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY
APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT
HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY
OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO,
THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM
IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF
ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
16. Limitation of Liability.
IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS
THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY
GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE
USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF
DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD
PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS),
EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF
SUCH DAMAGES.
17. Interpretation of Sections 15 and 16.
If the disclaimer of warranty and limitation of liability provided
above cannot be given local legal effect according to their terms,
reviewing courts shall apply local law that most closely approximates
an absolute waiver of all civil liability in connection with the
Program, unless a warranty or assumption of liability accompanies a
copy of the Program in return for a fee.
END OF TERMS AND CONDITIONS
How to Apply These Terms to Your New Programs
If you develop a new program, and you want it to be of the greatest
possible use to the public, the best way to achieve this is to make it
free software which everyone can redistribute and change under these terms.
To do so, attach the following notices to the program. It is safest
to attach them to the start of each source file to most effectively
state the exclusion of warranty; and each file should have at least
the "copyright" line and a pointer to where the full notice is found.
{one line to give the program's name and a brief idea of what it does.}
Copyright (C) {year} {name of author}
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>.
Also add information on how to contact you by electronic and paper mail.
If the program does terminal interaction, make it output a short
notice like this when it starts in an interactive mode:
{project} Copyright (C) {year} {fullname}
This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
This is free software, and you are welcome to redistribute it
under certain conditions; type `show c' for details.
The hypothetical commands `show w' and `show c' should show the appropriate
parts of the General Public License. Of course, your program's commands
might be different; for a GUI interface, you would use an "about box".
You should also get your employer (if you work as a programmer) or school,
if any, to sign a "copyright disclaimer" for the program, if necessary.
For more information on this, and how to apply and follow the GNU GPL, see
<http://www.gnu.org/licenses/>.
The GNU General Public License does not permit incorporating your program
into proprietary programs. If your program is a subroutine library, you
may consider it more useful to permit linking proprietary applications with
the library. If this is what you want to do, use the GNU Lesser General
Public License instead of this License. But first, please read
<http://www.gnu.org/philosophy/why-not-lgpl.html>.
================================================
FILE: README.md
================================================
# OPL3BankEditor

A small cross-platform editor of the OPL3 FM banks of different formats
# CI Build status
Linux | Windows | macOS
------------ | ------------- | -------------
[](https://github.com/Wohlstand/OPL3BankEditor/actions/workflows/ubuntu-ci.yml) | [](https://github.com/Wohlstand/OPL3BankEditor/actions/workflows/windows-ci.yml) | [](https://github.com/Wohlstand/OPL3BankEditor/actions/workflows/macos-ci.yml)
## Currently supported bank formats
* Own bank format (.WOPL) (Specification in the **WOPL-and-OPLI-Specification.txt** file)
* Junglevision patch (.OP3)
* DMX OPL-2 (.OP2) ([Specification](http://www.shikadi.net/moddingwiki/OP2_Bank_Format))
* Apogee Sound System timbre formats (.TMB) ([Specification](http://www.shikadi.net/moddingwiki/Apogee_Sound_System_Timbre_Format))
* SoundBlaster IBK files (.IBK) ([Specification](http://www.shikadi.net/moddingwiki/IBK_Format))
* AdLib/HMI BNK files (.BNK) ([Specification](http://www.shikadi.net/moddingwiki/AdLib_Instrument_Bank_Format))
* Adlib Gold files (.BNK) (specification is informal and can only be retrieved from source code)
* AdLib Timbre bank files (.SND, .TIM) ([Specification](http://www.shikadi.net/moddingwiki/AdLib_Timbre_Bank_Format))
* Global Timbre Library files for Audio Interface Library (.AD, .OPL) ([Specification](http://www.shikadi.net/moddingwiki/Global_Timbre_Library))
* SB and O3 bank formats (a set of the concatenated SBI files) used with Linux drivers
* Bisqwit's ADLMIDI bank (.ADLRAW)
## Currently supported instrument formats
* Own 2/4-operator instrument format (.OPLI) (Specification in the **WOPL-and-OPLI-Specification.txt** file)
* 2-operator Sound Blaster instruments for DOS and UNIX (.SBI) ([Specification](http://www.shikadi.net/moddingwiki/SBI_Format))
* 4-operator Sound Blaster instruments for UNIX (.SBI)
* Legacy AdLib instruments (.INS) ([Specification](http://www.shikadi.net/moddingwiki/AdLib_Instrument_Bank_Format))
## Currently supported music formats to import instruments
* Id-Software Music Format (.IMF) ([Specification](http://www.shikadi.net/moddingwiki/IMF_Format))
* Creative Music Format (.CMF) ([Specification](http://www.shikadi.net/moddingwiki/CMF_Format))
* Reality ADlib Tracker Music Format (.RAD) ([Specification](http://hackipedia.org/File%20formats/Music/Sample%20based/text/Reality%20ADlib%20Tracker%20format.cp437.txt.utf-8.txt))
## Download
* **Stable builds:** https://github.com/Wohlstand/OPL3BankEditor/releases
* **Fresh dev auto-builds:**
* **Windows**:
* [Download for Windows x86_64 (7/8/8.1/10 with OPL2/OPL3 emulators)](https://wohlsoft.ru/docs/_laboratory/_Builds/win32/opl3-bank-editor/opl3-bank-editor-dev-win64.zip) (built by [GitHub Actions](https://github.com/Wohlstand/OPL3BankEditor/actions/workflows/windows-ci.yml))
* [Download for Windows x86 (XP/Vista/7/8/8.1/10 with OPL2/OPL3 emulators)](https://wohlsoft.ru/docs/_laboratory/_Builds/win32/opl3-bank-editor/opl3-bank-editor-dev-win32.zip) (built by [GitHub Actions](https://github.com/Wohlstand/OPL3BankEditor/actions/workflows/windows-ci.yml))
* [Download for Windows x86 (98/ME with a proxy to real OPL3 chip)](https://wohlsoft.ru/docs/_laboratory/_Builds/win32/opl3-bank-editor/opl3-bank-editor-dev-win9x.zip) (built by [GitHub Actions](https://github.com/Wohlstand/OPL3BankEditor/actions/workflows/windows-ci.yml))
* **macOS**:
* [Download for macOS x64 (DMG)](https://wohlsoft.ru/docs/_laboratory/_Builds/macosx/opl3-bank-editor/opl3-bank-editor-x86_64-master.dmg) (built by [GitHub Actions](https://github.com/Wohlstand/OPL3BankEditor/actions/workflows/macos-ci.yml))
* [Download for macOS x64 (ZIP)](https://wohlsoft.ru/docs/_laboratory/_Builds/macosx/opl3-bank-editor/opl3-bank-editor-x86_64-master.zip) (built by [GitHub Actions](https://github.com/Wohlstand/OPL3BankEditor/actions/workflows/macos-ci.yml))
* [Download for macOS ARM64 (DMG)](https://wohlsoft.ru/docs/_laboratory/_Builds/macosx/opl3-bank-editor/opl3-bank-editor-arm64-master.dmg) (built by [GitHub Actions](https://github.com/Wohlstand/OPL3BankEditor/actions/workflows/macos-ci.yml))
* [Download for macOS ARM64 (ZIP)](https://wohlsoft.ru/docs/_laboratory/_Builds/macosx/opl3-bank-editor/opl3-bank-editor-arm64-master.zip) (built by [GitHub Actions](https://github.com/Wohlstand/OPL3BankEditor/actions/workflows/macos-ci.yml))
* **Ubuntu**:
* [Download for Ubuntu 24.04 for Qt5 x64 (DEB)](https://builds.wohlsoft.ru/ubuntu-24-04/opl3-bank-editor-qt5-ubuntu-24-04-amd64-master.deb) (built by [GitHub Actions](https://github.com/Wohlstand/OPL3BankEditor/actions/workflows/ubuntu-ci.yml))
* [Download for Ubuntu 24.04 for Qt6 x64 (DEB) (Plots unsupported)](https://builds.wohlsoft.ru/ubuntu-24-04/opl3-bank-editor-qt6-ubuntu-24-04-amd64-master.deb) (built by [GitHub Actions](https://github.com/Wohlstand/OPL3BankEditor/actions/workflows/ubuntu-ci.yml))
* [Download for Ubuntu 22.04 x64 (DEB)](https://builds.wohlsoft.ru/ubuntu-22-04/opl3-bank-editor-ubuntu-22-04-amd64-master.deb) (built by [GitHub Actions](https://github.com/Wohlstand/OPL3BankEditor/actions/workflows/ubuntu-ci.yml))
* [Download for Ubuntu 20.04 x64 (DEB)](https://builds.wohlsoft.ru/ubuntu-20-04/opl3-bank-editor-ubuntu-20-04-amd64-master.deb) (built by [GitHub Actions](https://github.com/Wohlstand/OPL3BankEditor/actions/workflows/ubuntu-ci.yml))
* [Download for Ubuntu 18.04 x64 (DEB)](https://builds.wohlsoft.ru/ubuntu-18-04/opl3-bank-editor-ubuntu-18-04-amd64-master.deb) (built by [GitHub Actions](https://github.com/Wohlstand/OPL3BankEditor/actions/workflows/ubuntu-ci.yml))
* [Download for Ubuntu 16.04 x64 (DEB)](https://builds.wohlsoft.ru/ubuntu-16-04/opl3-bank-editor-ubuntu-16-04-amd64-master.deb) (built by [GitHub Actions](https://github.com/Wohlstand/OPL3BankEditor/actions/workflows/ubuntu-ci.yml))
* [Download for Ubuntu 14.04 x64 (DEB) (Plots unsupported)](https://builds.wohlsoft.ru/ubuntu-14-04/opl3-bank-editor-ubuntu-14-04-amd64-master.deb) (built by [GitHub Actions](https://github.com/Wohlstand/OPL3BankEditor/actions/workflows/ubuntu-ci.yml))
# How to build
Please, see [the wiki](https://github.com/Wohlstand/OPL3BankEditor/wiki).
As alternate way you can open FMBankEdit.pro in the Qt Creator and build it.
# Folders
* ***Bank_Examples*** - example bank files which you can edit and preview them
* ***src*** - source code of this tool
* ***_Misc*** - Various stuff (test scripts, dummy banks, documents, etc.) which was been used in development of this tool
================================================
FILE: Specifications/AILBANK.TXT
================================================
Miles Design AIL 2.0 Global Timbre Library Format (.AD/.OPL)
------------------------------------------------------------
Every instrument has a bank number and a patch number. The patch number is
selected via MIDI Program Change messages, the bank number via controller
number 114.
Bank number 127 is special: It represents Rhythm channel instruments.
The patch number on bank 127 is selected via the key number on MIDI channel 0x09
OPL2 uses a bank file with the .AD extension, OPL3 with the .OPL extension.
.AD files will only contain 2-OP instruments; .OPL files can contain
both 2-OP and 4-OP instruments. The bank file starts with the index of
the following format:
For every instrument in the file:
byte programNumber;
byte bankNumber;
dword fileOffset;
The end of the index is marked by the programNumber and bankNumber being both 0xFF.
Format of a 2-OP instrument:
word size; // including itself, value 0x0E denotes 2-OP instrument
byte transpose;
byte op0_misc; // register 0x20
byte op0_scaleLevel; // register 0x40
byte op0_attackDecay; // register 0x60
byte op0_sustainRelease; // register 0x80
byte op0_waveform; // register 0xE0
byte feedbackConnection; // register 0xC0
byte op1_misc; // register 0x23
byte op1_scaleLevel; // register 0x43
byte op1_attackDecay; // register 0x63
byte op1_sustainRelease; // register 0x83
byte op1_waveform; // register 0xE3
Format of a 4-OP instrument:
word size; // including itself, value 0x19 denotes 2-OP instrument
byte transpose;
byte op0_misc; // register 0x20
byte op0_scaleLevel; // register 0x40
byte op0_attackDecay; // register 0x60
byte op0_sustainRelease; // register 0x80
byte op0_waveform; // register 0xE0
byte feedbackConnection1; // bits 0-6 go into register 0xC0 bits 0-6, bit 7 goes into register 0xC3 bit 0
byte op1_misc; // register 0x23
byte op1_scaleLevel; // register 0x43
byte op1_attackDecay; // register 0x63
byte op1_sustainRelease; // register 0x83
byte op1_waveform; // register 0xE3
byte op2_misc; // register 0x28
byte op2_scaleLevel; // register 0x48
byte op2_attackDecay; // register 0x68
byte op2_sustainRelease; // register 0x88
byte op2_waveform; // register 0xE8
byte unused; // unused, as feedback1's bit 7 is used instead for register 0xC3
byte op3_misc; // register 0x2B
byte op3_scaleLevel; // register 0x4B
byte op3_attackDecay; // register 0x6B
byte op3_sustainRelease; // register 0x8B
byte op3_waveform; // register 0xEB
================================================
FILE: Specifications/DMX OP2 Bank Format.txt
================================================
------------------------- DMX OP2 Bank Format -------------------------
The OP2 Bank Format is an instrument bank format used by the DMX sound library
developed by Paul Radek of Digital Expressions, Inc. The 128 melodic and
47 percussion instrument limit was most likely chosen so that a single OP2 file
could store all the instruments for a General MIDI song. This bank has support
for two-voice instruments to provide support for pseudo four-operator
instruments. File of this format usually has GENMIDI name without extension as
embedded WAD resource, but also can have .OP2 extension.
== File format ==
Data type | Name | Description
===============================================================================
char[8] | magic | #OPL_II# signature, doesn't null terminated
BYTE[175][36] | instrument | Set of 175 instrument entry
char[175][32] | names | Instrument names per every instrument entry,
| | must be null terminated
== Instrument ==
Each bank contains 128 melodic and 47 percussion instruments.
Data type | Name | OPL base register | Description
===============================================================================
UINT16LE | flags | N/A | Instrument flags:
| | | 0x01 - Fixed pitch,
| | | 0x02 - Delayed vibrato (Unused),
| | | 0x04 - Double-voice mode
-------------------------------------------------------------------------------
UINT8 | fineTune | N/A | Second voice detune level
-------------------------------------------------------------------------------
UINT8 | noteNum | N/A | Percussion note number
| | | (between 0 and 128)
======= First voice ===========================================================
UINT8 | iModChar1 | 0x20 | Modulator characteristic
| | | (Mult, KSR, EG, VIB, AM)
-------------------------------------------------------------------------------
UINT8 | iModAttack1 | 0x60 | Modulator attack/decay level
-------------------------------------------------------------------------------
UINT8 | iModSustain1 | 0x80 | Modulator sustain/release
-------------------------------------------------------------------------------
UINT8 | iModWaveSel1 | 0xE0 | Modulator wave select
-------------------------------------------------------------------------------
UINT8 | iModScale1 | 0x40 | Modulator key scaling
| | | (first two bits)
-------------------------------------------------------------------------------
UINT8 | iModLevel1 | 0x40 | Modulator output level
| | | (last six bits)
-------------------------------------------------------------------------------
UINT8 | iFeedback1 | 0xC0 | Feedback/connection
-------------------------------------------------------------------------------
UINT8 | iCarChar1 | 0x23 | Carrier characteristic
| | | (Mult, KSR, EG, VIB, AM)
-------------------------------------------------------------------------------
UINT8 | iCarAttack1 | 0x63 | Carrier attack/decay level
-------------------------------------------------------------------------------
UINT8 | iCarSustain1 | 0x83 | Carrier sustain/release level
-------------------------------------------------------------------------------
UINT8 | iCarWaveSel1 | 0xE3 | Carrier wave select
-------------------------------------------------------------------------------
UINT8 | iCarScale1 | 0x43 | Carrier key scaling
| | | (first two bits)
-------------------------------------------------------------------------------
UINT8 | iCarLevel1 | 0x43 | Carrier output level
| | | (last six bits)
-------------------------------------------------------------------------------
UINT8 | reserved1 | N/A | Unused byte
-------------------------------------------------------------------------------
INT16LE | noteOffset1 | N/A | MIDI note offset
| | | for a first voice
======= Second voice ==========================================================
UINT8 | iModChar2 | 0x20 | Modulator characteristic
| | | (Mult, KSR, EG, VIB, AM)
-------------------------------------------------------------------------------
UINT8 | iModAttack2 | 0x60 | Modulator attack/decay level
-------------------------------------------------------------------------------
UINT8 | iModSustain2 | 0x80 | Modulator sustain/release
-------------------------------------------------------------------------------
UINT8 | iModWaveSel2 | 0xE0 | Modulator wave select
-------------------------------------------------------------------------------
UINT8 | iModScale2 | 0x40 | Modulator key scaling
| | | (first two bits)
-------------------------------------------------------------------------------
UINT8 | iModLevel2 | 0x40 | Modulator output level
| | | (last six bits)
-------------------------------------------------------------------------------
UINT8 | iFeedback2 | 0xC0 | Feedback/connection
-------------------------------------------------------------------------------
UINT8 | iCarChar2 | 0x23 | Carrier characteristic
| | | (Mult, KSR, EG, VIB, AM)
-------------------------------------------------------------------------------
UINT8 | iCarAttack2 | 0x63 | Carrier attack/decay level
-------------------------------------------------------------------------------
UINT8 | iCarSustain2 | 0x83 | Carrier sustain/release level
-------------------------------------------------------------------------------
UINT8 | iCarWaveSel2 | 0xE3 | Carrier wave select
-------------------------------------------------------------------------------
UINT8 | iCarScale2 | 0x43 | Carrier key scaling
| | | (first two bits)
-------------------------------------------------------------------------------
UINT8 | iCarLevel2 | 0x43 | Carrier output level
| | | (last six bits)
-------------------------------------------------------------------------------
UINT8 | reserved2 | N/A | Unused byte
-------------------------------------------------------------------------------
INT16LE | noteOffset2 | N/A | MIDI note offset
| | | for a second voice
===============================================================================
== Instrument names ==
After 175'th instrument is folowing an array of 32-byte null-terminated
instrument names
== Fine tune ==
Fine tune value is an index offset of frequencies table. 128 is a center,
i.e. don't detune. Formula of index offset is: (fine_tune / 2) - 64. Each unit
of fine tune field is approximately equal to 1/0.015625 of tone.
== Percussion instruments ==
Percussion instruments are in range between 35 (Bass drum 1)
and 81 (Open Triangle) MIDI indeces.
================================================
FILE: Specifications/HMI BNK Format.txt
================================================
HMI Sound Operating System FM bank
--------------------------------------------------------------------------------
This bank format is directly based on AdLib BNK format, however, it's different
and incompatible. HMI does use a separate files for melodic and for percussion.
--------------------------------------------------------------------------------
Quote from the ModdingWiki
--------------------------------------------------------------------------------
The version of this format associated with HMP/HMI files is altered and
incompatible with most tools that work with BNK files.
Known differences include:
- The major and minor version numbers in the header are both zero.
- The flags byte in the instrument names list may have values other than 0 or 1,
and a null flags byte might not be indicative of an unused sample.
The header and names list otherwise appear to follow the format spec. The
instrument data itself has not yet been inspected for differences.
Known examples of games that include files of this version include two possibly
standardized file names: DRUMS.BNK and MELODIC.BNK. Dark Legions also includes
a BNKDRUM.BNK. All of the known "version 0.0" files are 5,404 bytes in length,
with 128 instrument records reported in the header, but have differing contents.
--------------------------------------------------------------------------------
Notes:
- offsets marked with "+" - relative offsets for each array entry
- fields, marked as [????] may have different meaning than known
--------------------------------------------------------------------------------
--------------------------------------------------------------------------------
Offset | Length | Data type | Description
--------------------------------------------------------------------------------
Header
--------------------------------------------------------------------------------
0 | 1 | uint8_t | Major version, always 0
1 | 1 | uint8_t | Minor version, always 0
2 | 6 | char | Magic word, 6 ASCII-letters "ADLIB-"
--------------------------------------------------------------------------------
8 | 2 | uint16_t LE | Number of used instruments, always 128
10 | 2 | uint16_t LE | Number of stored instruments in a bank,
| | | always 128
12 | 4 | uint32_t LE | Offset of names list, always 28
16 | 4 | uint32_t LE | Offset of instruments data, always 1564
| | | [28+(12*128)]
20 | 8 | uint8_t | Padding
--------------------------------------------------------------------------------
Instrument names list (12-bytes each entry)
===[Repeat-128-times]===========================================================
+0 | 2 | uint16_t LE | Index of instrument
+2 | 1 | uint8_t | Percussion note number
+3 | 9 | char | Null-terminated 8-symbol name of instrument
================================================================================
Instrument data (30-bytes each entry)
===[Repeat-128-times]===========================================================
+0 | 1 | uint8_t | unused
+1 | 1 | uint8_t | unused
+2 | 1 | uint8_t | Modulator's KSL
+3 | 1 | uint8_t | Modulator's frequency multiplicator
+4 | 1 | uint8_t | Feedback
+5 | 1 | uint8_t | Modulator's attack
+6 | 1 | uint8_t | Modulator's sustain
+7 | 1 | uint8_t | Modulator's "sustaing voice" flag
+8 | 1 | uint8_t | Modulator's decay
+9 | 1 | uint8_t | Modulator's release
+10 | 1 | uint8_t | Modulator's total-level
+11 | 1 | uint8_t | Modulator's Tremolo flag
+12 | 1 | uint8_t | Modulator's Vibrato flag
+13 | 1 | uint8_t | Modulator's KSR
+14 | 1 | uint8_t | Instrument's connection: 0 - AM, 1 - FM
+15 | 1 | uint8_t | Carrier's KSL
+16 | 1 | uint8_t | Carrier's frequency multiplicator
+17 | 1 | uint8_t | unused
+18 | 1 | uint8_t | Carrier's attack
+19 | 1 | uint8_t | Carrier's sustain
+20 | 1 | uint8_t | Carrier's "sustaing voice" flag
+21 | 1 | uint8_t | Carrier's decay
+22 | 1 | uint8_t | Carrier's relase
+23 | 1 | uint8_t | Carrier's total-level
+24 | 1 | uint8_t | Carrier's Tremolo flag
+25 | 1 | uint8_t | Carrier's Vibrato flag
+26 | 1 | uint8_t | Carrier's KSR
+27 | 1 | uint8_t | unused
+28 | 1 | uint8_t | Modulator's waveform
+29 | 1 | uint8_t | Carrier's's waveform
================================================================================
================================================
FILE: Specifications/Opl3Bank.fbs
================================================
file_identifier "FOP3";
//Data of operator are stored in raw OPL format, so, there are ready-to-send
struct Operator {
//AM/Vib/Env/Ksr/FMult characteristics
AVEKM:ubyte;
//Key Scale Level / Total level register data
KSLL:ubyte;
//Attack / Decay
AtDec:ubyte;
//Systain and Release register data
SusRel:ubyte;
//Wave form
WaveForm:ubyte;
}
enum Mode: byte { TwoOp = 0, FourOp, Pseudo }
table Instrument {
program:uint8;
name:string;
keyOffset1:int16;
keyOffset2:int16;
velocityOffset:int8;
secondVoiceTuning:int8;
percussionKey:uint8;
mode:Mode;
// Feedback / SynthType for 1'st and 2'nd operators
fb_conn1:ubyte;
// Feedback / SynthType for 3'rd and 4'th operators
fb_conn2:ubyte;
modulator1:Operator;
carrier1:Operator;
modulator2:Operator;
carrier2:Operator;
konMs:uint16;
koffMs:uint16;
}
enum BankType: byte { Melodic = 0, Percussion }
table Bank {
name:string;
type:BankType;
bankLSB:ubyte;
bankMSB:ubyte;
instruments:[Instrument];
}
enum VolumeModel: uint8 {
Auto = 0,
Generic,
Native,
DMX,
Apogee,
Win9x
}
table Opl3Bank {
//As this thing will be safe, the version field is an informative only to recognize version of editor which have created this file
internalVersion:uint16;
//Deep tremolo and Deep Vibrato register data (until to use, AND it with 0x03)
oplTV:uint8;
//Volume scaling model
volumeModel:VolumeModel;
banks:[Bank];
}
root_type Opl3Bank;
================================================
FILE: Specifications/RIFF FM4 PAT specification.txt
================================================
------------------------- RIFF FM4 PATCH bank format ---------------------------
This is the format for the .PAT file used by the Windows NT4 for it's OPL3
driver (you may find the "synth.pat" file at the C:\Windows\system32 of NT4: so,
it's that file which is described here).
This bank file is able to store 128 melodic and 128 percussion instruments.
The used volume mode: Generic Windows FM model.
Supported instrument types:
- Two-operator
- Four-operator
- Dual two-operator (pseudo-four-operator)
== File format ==
File has the 20-byte of header that starts with the "RIFF" magic number,
then 4-bytes little-endian file size without 8 after it, then two magic values,
and then, the file size without 20 (total size of the header):
Offset bytes | Type | Content/explanation
==============================================================================
0 | CHAR[4] | "RIFF" magic
4 | Uint32-LE | The size of the file with subtracted 8
| | (I.e. without the size of RIFF header)
8 | CHAR[4] | "Ptch" magic
12 | CHAR[4] | "fm4 " magic
16 | Uint32-LE | The size of the file data with subtracted 20
| | (I.e. without the size of entire header)
==============================================================================
After the header, the sequence of 256 instruments is followed
(total size of every instrument entry is 28 bytes):
Instruments were defined by these C structures:
--------------------------------------------------------
struct Fm4Op
{
uint8_t reg20;
uint8_t reg40;
uint8_t reg60;
uint8_t reg80;
uint8_t regE0;
};
struct Fm4Inst
{
Fm4Op op[4]; /* 5 x 4 = 20 */
uint8_t regA0[2];
uint8_t regB0[2];
uint8_t regC0[2];
uint8_t opType;
uint8_t reserved;
}; /* 28 bytes */
--------------------------------------------------------
The full specification for every byte of every single instrument entry:
Data type | Name | OPL base register | Description
==============================================================================
Operator 1:
==============================================================================
UINT8 | reg20 | 0x20 | Modulator characteristic
| | | (Mult, KSR, EG, VIB and AM flags)
------------------------------------------------------------------------------
UINT8 | reg40 | 0x40 | Modulator key scaling/output level
------------------------------------------------------------------------------
UINT8 | reg60 | 0x60 | Modulator attack/decay level
------------------------------------------------------------------------------
UINT8 | reg80 | 0x80 | Modulator sustain/release level
------------------------------------------------------------------------------
UINT8 | regE0 | 0xE0 | Modulator wave select
==============================================================================
Operator 2:
==============================================================================
UINT8 | reg20 | 0x23 | Carrier characteristic
| | | (Mult, KSR, EG, VIB and AM flags)
------------------------------------------------------------------------------
UINT8 | reg40 | 0x43 | Carrier key scaling/output level
------------------------------------------------------------------------------
UINT8 | reg60 | 0x63 | Carrier attack/decay level
------------------------------------------------------------------------------
UINT8 | reg80 | 0x83 | Carrier sustain/release level
------------------------------------------------------------------------------
UINT8 | regE0 | 0xE3 | Carrier wave select
==============================================================================
Operator 3: (Operator 1 of second voice)
==============================================================================
UINT8 | reg20 | 0x20 | Modulator characteristic
| | | (Mult, KSR, EG, VIB and AM flags)
------------------------------------------------------------------------------
UINT8 | reg40 | 0x40 | Modulator key scaling/output level
------------------------------------------------------------------------------
UINT8 | reg60 | 0x60 | Modulator attack/decay level
------------------------------------------------------------------------------
UINT8 | reg80 | 0x80 | Modulator sustain/release level
------------------------------------------------------------------------------
UINT8 | regE0 | 0xE0 | Modulator wave select
==============================================================================
Operator 4: (Operator 2 of second voice)
==============================================================================
UINT8 | reg20 | 0x23 | Carrier characteristic
| | | (Mult, KSR, EG, VIB and AM flags)
------------------------------------------------------------------------------
UINT8 | reg40 | 0x43 | Carrier key scaling/output level
------------------------------------------------------------------------------
UINT8 | reg60 | 0x63 | Carrier attack/decay level
------------------------------------------------------------------------------
UINT8 | reg80 | 0x83 | Carrier sustain/release level
------------------------------------------------------------------------------
UINT8 | regE0 | 0xE3 | Carrier wave select
==============================================================================
------------------------------------------------------------------------------
UINT8 | regA0 | 0xA0 | Frequency number (De-Facto unused)
UINT8 | regA0 | 0xA0 | Frequency number (De-Facto unused)
------------------------------------------------------------------------------
UINT8 | regB0 | 0xB0 | The note offset for 1'st pair
UINT8 | regB0 | 0xB0 | The note offset for 2'st pair
| | | (See below how to decode)
------------------------------------------------------------------------------
UINT8 | Feedback | 0xC0 | Feedback/connection for 1'st op pair
UINT8 | Feedback | 0xC0 | Feedback/connection for 2'nd op pair
------------------------------------------------------------------------------
UINT8 | opType | N/A | Type of the voice:
| | | 0 - Two-op voice (second pair unused)
| | | 1 - Pair of two-operator voices
| | | 2 - Four-operator voice
------------------------------------------------------------------------------
UINT8 | reserved | N/A | Unused byte
==============================================================================
* regB0 explanation:
This byte contains the note offset for one of operator pairs.
Content of this byte has an equivalent format for the
"KeyOn/Block Number / FreqNumber-HI" OPL3 register. However, here it's used for
the 3-bit signed octave offset (other bits around are unused):
## Getting note offset:
- Shift to right by 2 bytes
- Mask by & 0x07
- Convert to signed integer and subtract 4
- Multiply by 12
The full formula:
N = 12 * (((regB0 >> 2) & 0x07) - 4)
## Writing value back:
- Divide the note offset by 12
- Add 4
- Clamp it to 0...7 range
- Mask by & 0x07
- Shift to right by 2 bytes
-------------------------
================================================
FILE: Specifications/Reality ADlib Tracker format.cp437.txt.utf-8.txt
================================================
Extension: .RAD
Version: 1.0
Created by: Reality
Tracker: Reality ADlib Tracker
Players: -
Description by: Shayde / Reality
Taken from: RAD Tracker 1.1a
Note: Adlib music format
TECHNICAL SPECIFICATIONS
▀ ▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀ ▀
RAD file format is as follows: (values in hex)
█▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀█
█ HEADER █
█────────────────────────────────────────────────────────────────────────█
█ Offset 00..0F:"RAD by REALiTY!!" - Use this to recognize a RAD tune. █
█ Just detecting the initial "RAD" █
█ should be sufficient though! ;-) █
█ █
█ Offset 10:BCD - Version of RAD file. █
█ Currently 10h for v1.0. █
█ █
█ Offset 11:Bit 7 - Set if a description follows. █
█ Bit 6 - Set if it's a "slow-timer" tune. █
█ Bits 4..0 - The initial speed of the tune. █
█ █
█▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀█
█ DESCRIPTION █
█────────────────────────────────────────────────────────────────────────█
█ The description follows the header if Bit 7 of Offset 11h is set. The █
█ description is a null-terminated string. To save some space in the █
█ tune file, the characters mean: █
█ █
█ Char 00 - End of description (null-terminator) █
█ Char 01 - Move to start of next line (Carriage return) █
█ Char 02..1F - Output this many spaces █
█ Char 20..FF - Output this character █
█ █
█▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀█
█ INSTRUMENTS █
█────────────────────────────────────────────────────────────────────────█
█ Next come the instruments: █
█ █
█ Offset 00:Instrument Number that follows (or 0 for end of list) █
█ █
█ Offset 01..0B:The instrument definition in HSC .INS format: █
█ █
█ ╔══════╦═══════════════════╦═══════════════════════╗ █
█ ║ ║ ║ Adlib Register ║ █
█ ║ Byte ║ Carrier/Modulator ║ (Relative to Chan. 0) ║ █
█ ╠══════╩═══════════════════╩═══════════════════════╣ █
█ ║ 00 │ Carrier │ 23h ║ █
█ ║ 01 │ Modulator │ 20h ║ █
█ ║ 02 │ Carrier │ 43h - Instr. Volume ║ █
█ ║ 03 │ Modulator │ 40h ║ █
█ ║ 04 │ Carrier │ 63h ║ █
█ ║ 05 │ Modulator │ 60h ║ █
█ ║ 06 │ Carrier │ 83h ║ █
█ ║ 07 │ Modulator │ 80h ║ █
█ ║ 08 │ Both │ C0h ║ █
█ ║ 09 │ Carrier │ E3h ║ █
█ ║ 0A │ Modulator │ E0h ║ █
█ ╚══════════════════════════════════════════════════╝ █
█ █
█▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀█
█ ORDER LIST █
█────────────────────────────────────────────────────────────────────────█
█ The Order List follows the instruments: █
█ █
█ Offset 00:Length of Order List (up to 128) █
█ █
█ Offset 01..nn:List of orders, one byte for each line: █
█ █
█ 00..1F:The pattern to play. █
█ 80..FF:The line to jump to minus 80h (Jump Marker) █
█ █
█▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀█
█ PATTERN OFFSET TABLE █
█────────────────────────────────────────────────────────────────────────█
█ For all 32 patterns there is a word in this table which gives the █
█ offset from the start of the file of the pattern data. █
█ If a pattern is empty then the offset is zero. █
█ █
█▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀█
█ PATTERNS █
█────────────────────────────────────────────────────────────────────────█
█ Offset 00:Line number whose notes follow. Bit 7 set means that █
█ this is the last line. Note, lines that have no notes █
█ or effects on do not appear. █
█ █
█ Offset 01....:List of notes for that line: █
█ █
█ Offset 00:Channel no. note appears in (0 to 8). █
█ Bit 7 set means this is the last note for █
█ this line. █
█ Offset 01..02:The note/effect for this channel. █
█ If the effect nibble is non-zero then █
█ Offset 03 contains the parameter, otherwise █
█ the next channel starts at Offset 03. █
█ █
█▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀█
█ NOTES █
█────────────────────────────────────────────────────────────────────────█
█ Notes occupy three bytes (two if the effect nibble is zero): █
█ █
█ Byte 00:Bit 7: Bit 4 of the instrument number. █
█ Bit 6..4: Octave of note. █
█ Bit 3..0: Note (1-12) in this order: █
█ C#, D, D#, E, F, F#, G, G#, A, A#, B, C █
█ A zero denotes no note and 15 denotes a █
█ KEY-OFF. █
█ █
█ Byte 01:Bit 7..4: Bits 3 to 0 of the instrument number. █
█ Bit 3..0: The effect nibble (the effect column █
█ in RAD is the hex equivalent of this █
█ nibble). █
█ █
█ Byte 02:The parameter to the effect (if any). █
█ Because parameters only go from 0 to 99, bit 7 is █
█ not used, but may be used in a later version of RAD. █
█ █
█▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄█
- Shayde / Reality, Feb95
================================================
FILE: Specifications/TMB Format.txt
================================================
---------------------- Apogee Sound System Timbre Format ----------------------
The Apogee Sound System Timbre Format is an instrument bank format used by
the Apogee Sound System library developed by 3D Realms. The 128 melodic and
128 percussion instrument limit was most likely chosen so that a single
TMB file could store all the instruments for a General MIDI song.
Files of this format are has .tmb extension.
== File format ==
TMB files have no header and signature.
The file contains 256 13-byte instrument entries (first 128 are melodic,
and next 128 are percussion).
Data type | Name | OPL base register | Description
==============================================================================
UINT8 | SAVEK[0] | 0x20 | Modulator characteristic
| | | (Mult, KSR, EG, VIB and AM flags)
------------------------------------------------------------------------------
UINT8 | SAVEK[1] | 0x23 | Carrier characteristic
| | | (Mult, KSR, EG, VIB and AM flags)
------------------------------------------------------------------------------
UINT8 | Level[0] | 0x40 | Modulator key scaling/output level
------------------------------------------------------------------------------
UINT8 | Level[1] | 0x43 | Carrier key scaling/output level
------------------------------------------------------------------------------
UINT8 | Env1[0] | 0x60 | Modulator attack/decay level
------------------------------------------------------------------------------
UINT8 | Env1[1] | 0x63 | Carrier attack/decay level
------------------------------------------------------------------------------
UINT8 | Env2[0] | 0x80 | Modulator sustain/release level
------------------------------------------------------------------------------
UINT8 | Env2[1] | 0x83 | Carrier sustain/release level
------------------------------------------------------------------------------
UINT8 | Wave[0] | 0xE0 | Modulator wave select
------------------------------------------------------------------------------
UINT8 | Wave[1] | 0xE3 | Carrier wave select
------------------------------------------------------------------------------
UINT8 | Feedback | 0xC0 | Feedback/connection
------------------------------------------------------------------------------
INT8 | Transpose| N/A | Note offset for melodic instruments,
| | | and key number for percussion
------------------------------------------------------------------------------
INT8 | Velocity | N/A | Velocity offset
==============================================================================
The TMB format is directly based on IBK Format, and has first 12 bytes be same
as in the IBK Format. Official MAKETMB.EXE utility (Can be found with the
source code of 3D Realms games in the Audio Library public folder) generates
TMB files from the set of IBK files.
================================================
FILE: Specifications/UNIX SoundBlaster Patch.txt
================================================
Here is the layout of a SoundBlaster patch (as I suppose it to be):
offset:
0-3: "SBI", 0x1a
4-19: voice name
20-28: unused
29: echo delay
30: echo attenuation
31: chorus spread
32: transpose
33: fixed duration
34: extra voice
35: fixed key
36,37: 0x24 (modulator) & 0x25 (carrier)
b7: am vibrato
b6: frequency vibrato
b5: sustain
b4: duration varies with frequency
b3-b0: frequency multiplier
38,39: 0x26 (modulator) & 0x27 (carrier)
b7-b6: amplitude = frequency factor
b5-b0: loudness
40,41: 0x28 (modulator) & 0x29 (carrier)
b7-b4: attack rate
b3-b0: decay rate
42,43: 0x2a (modulator) & 0x2b (carrier)
b7-b4: sustain level
b3-b0: release rate
44,45: 0x2c (modulator) & 0x2d (carrier)
b7-b2: unused
b1-b0: modulator/carrier distortion
46: 0x2e:
b7-b4: unused
b3-b1: phase shift by modulator
b0: 1 = parallel (additive)
0 = frequency modulation
47-: 0x2f-... unused
The layout of an opl3 patch is similar, except that
bytes at offset 0-2 are "4OP", 47-48 are like the
bytes at 36-37 except they are for operators 3 and 4,
49-50 are like 38-39, 51-52 are like 40-41, 53-54 are
like 42-43, and 55-56 are like 44-45. 57 is like
46, except there is no phase shift for operator 3.
58-59 are unused.
53-54
--gl
================================================
FILE: Specifications/WOPL-and-OPLI-Specification.txt
================================================
===============================================================================
MIDI playing bank for Yamaha OPL2 (YMF262) chip
file format specification (WOPL and OPLI)
===============================================================================
Created in 23'rd of July, 2017
Updated in 24'th of November, 2025
===============================================================================
Author: Vitaliy Novichkov "Wohlstand"
Contacts emails: admin@wohlnet.ru, nvd339@yandex.ru
===============================================================================
===============================================================================
Contents:
0. Changelog
1. Single-instrument entry
2. Instrument file (OPLI)
3. MIDI playing bank file (WOPL)
===============================================================================
===============================================================================
0. Changelog
===============================================================================
Version | What's new
-------------------------------------------------------------------------------
1 | First version (23'rd of July, 2017)
-------------------------------------------------------------------------------
2 | Added banks meta-data arrays into bank format (August, 1, 2017)
-------------------------------------------------------------------------------
3 | Added two delay coefficients are needed for ADLMIDI's channel busy
| (19'th of November, 2017)
| Change: Added 'blank instrument' flag into existing variable
| (26'th of March, 2018)
| Change: Added rhythm-mode drum type three-bit number
| (29'th of May, 2018)
| Change: Added two new volume scaling models: DMX and Apogee with
| fixed AM voices
| (31'st of August, 2020)
| Change: Added three new volume scaling models: Audio Interfaces
| Library, Win9x Generic FM, and HMI Sound Operating System
| (6'th of September, 2020)
| Change: Added three new volume scaling models: Old variant of HMI
| with defected FM voices, MS AdLib driver for Windows 3.x, IMF Creator,
| and Jammie O'Connell's FM Synth driver for Windowx 3.x
| (14'th of November, 2025)
| Change: Formerly unused bit at the instrument bitwise flags,
| now became the "Fixed note" flag. Also clarified other bits.
| (24'th of November, 2025)
-------------------------------------------------------------------------------
===============================================================================
1. Single-instrument entry
===============================================================================
Each instrument file contains a set of data for single
channel of YMF262 chip to setup the timbre
Lenght of each instrument entry is 62 bytes (up to version 2 and in OPLI files)
Any non-ASCII string data must be encoded with UTF-8 and fit to 32 bytes
including the NULL terminator.
Operators in the list below has the next roles:
- Operator 1 - the Carrier1 (Operator 2 for 4-operators mode)
- Operator 2 - the Modulator1 (Operator 1 for 4-operators mode)
- Operator 3 - the Carrier2 (Operator 4 for 4-operators mode)
- Operator 4 - the Modulator2 (Operator 3 for 4-operators mode)
Since version 3, in WOPL banks each instrument has extra 4 bytes for
a two extra fields
Bytes-Lenght | Description
-------------------------------------------
32 | Name of instrument null-terminated string
2 | Big-Endian 16-bit signed integer, MIDI key offset value
| (master instrument, or first voice in pseudo 4-operators mode)
2 | Big-Endian 16-bit signed integer, MIDI key offset value
| (second voice in pseudo 4-operators mode)
1 | 8-bit signed integer, MIDI Velocity offset
1 | 8-bit signed integer, Second voice detune in double-voice mode.
| It's 1/64 cent of the tone. Formula to compute valid half-tone
| value as a float:
| (float) ( ( (int) X + 128 ) >> 1) - 64 / 32.0f
| Where X is the detune value from the file.
1 | 8-bit unsigned integer, Percussion instrument key number
1 | 8-bit unsigned integer, Bitwise flags:
| [0EDDDCBA]
| A) 0x00 - 2-operator mode
| 0x01 - 4-operator mode
| B) 0x02 - pseudo-4-operator (two 2-operator voices) mode
| C) 0x04 - is 'blank' instrument (instrument which has no sound)
| D) 0x38 - Reserved for rhythm-mode percussion type number (three bits number)
| -> 0x08 - is Bass drum
| -> 0x10 - is Snare
| -> 0x18 - is Tom-tom
| -> 0x20 - is Cymbal
| -> 0x28 - is Hi-hat
| E) 0x40 - Fixed note
| 0) Reserved / Unused
1 | 8-bit unsigned integer, Feedback / Connection
| for 1'st and 2'nd operators or first voice
1 | 8-bit unsigned integer, Feedback / Connection
| for 3'st and 4'nd operators or second voice
--- Operators 1/2/3/4 (repeats 4 times) ---
1 | AM/Vib/Env/Ksr/FMult characteristics
1 | Key Scale Level / Total level register data
1 | Attack / Decay
1 | Systain and Release register data
1 | Wave form
-------------------------------------------
--VERSION >= 3---WOPL-Bank-only, OPLI must don't have those fields---
2 | Big-Endian 16-bit unsigned integer, Millisecond delay of sound
| while key is on
2 | Big-Endian 16-bit unsigned integer, Millisecond delay of sound
| after key off
-------------------------------------------
===============================================================================
2. Instrument file (OPLI)
===============================================================================
Each instrument file contains a set of data for single
channel of YMF262 chip to setup the timbre on it.
Total data lenght: 76 bytes
Bytes-Lenght | Description
---------------Header--------------------
11 | Magic number "WOPL3-INST\0". Where '\0' is a zero byte which
| termiates the string
2 | Version. Little endian Unsigned 16-bit integer.
| Latest version is 2 (no difference between 2 and 1)
1 | Is this instrument a percussion. 0 - melodic, or 1 - percussion
----------------Data---------------------
62 | [Single-instrument entry], look at top of this text file
===============================================================================
3. MIDI playing bank file (WOPL)
===============================================================================
Bank format designed to store instrument bank for playing MIDI
in multiple standards like GM, GS and XG. Format allows to save
multiple sets with 128-instruments which is needed to store
GS and XG instrument sets which are have more than standard 128
instruments with a single bank.
Any non-ASCII string data must be encoded with UTF-8 and fit to 32 bytes
including the NULL terminator.
Total data length is sum of: 19 + (62*128*MBanks) + (62*128*PBanks) bytes
Bytes-Lenght | Description
---------------Header-----------------------
--Header--
11 | Magic number "WOPL3-BANK\0". Where '\0' is a zero byte
| which termiates the string
2 | Version. Little endian Unsigned 16-bit integer.
| Latest version is 2
2 | [MBanks] Unsigned 16-bit BE integer, count of melodic
| MIDI banks (every bank contains 128 instruments)
2 | [PBanks] Unsigned 16-bit BE integer, count of percussion
| MIDI banks (every bank contains 128 instruments)
1 | 8-bit unsigned integer, Global bank bitwise flags:
| [000000BA]
| A) Deep-Tremolo flag
| B) Deep-Vibrato flag
| 0) Unused / Reserved
1 | 8-bit unsigned integer, ADLMIDI's volume scaling model
| enumeration, default is 0:
| 0 - Generic, linearized
| 1 - Native OPL3's logariphmic volume model
| 2 - DMX volume model
| 3 - Apogee Sound System's volume model
| 4 - Windows 9x SB16 driver volume model
| 5 - DMX volume model with fixed AM voices
| 6 - Apogee Sound System volume model with fixed AM voc.
| 7 - Audio Interfaces Library volume model
| 8 - Windows 9x Generic FM driver volume model
| 9 - HMI Sound Operating System (Ver. 4.0) volume model
| 10 - HMI Sound Operating System (Ver. 3.0 and below)
| 11 - MS AdLib Driver for Windows 9x volume model
| 12 - IMF Creator volume model
| 13 - Jammie O'Connell's FM Synth volume model
--VERSION >= 2---Melodic bank meta-data-----
(repeat MBanks times)
32 | Name of melodic bank null-terminated string
1 | LSB index of bank (unsigned char)
1 | MSB index of bank (unsigned char)
--VERSION >= 2---Percussion bank meta-data--
(repeat PBanks times)
32 | Name of melodic bank null-terminated string
1 | LSB index of bank (unsigned char)
1 | MSB index of bank (unsigned char)
InsSize:
--62 bytes in up to version 2
--66 bytes since version 3 and later
-----------Melodic Instruments--------------
InsSize * 128 * MBanks | 128 [Single-instrument entries] per each bank,
| look at top of this text file
---------Percussion Instruments-------------
InsSize * 128 * PBanks | 128 [Single-instrument entries] per each bank,
| look at top of this text file
--------------------------------------------
================================================
FILE: Specifications/WOPLX-Specification.txt
================================================
===============================================================================
MIDI playing bank for Yamaha OPL2 (YMF262) chip
text-based file format specification (WOPLX)
===============================================================================
Created in 5'th of December, 2025
Updated in 7'th of December, 2025
===============================================================================
Author: Vitaliy Novichkov "Wohlstand"
Contacts emails: admin@wohlnet.ru, nvd339@yandex.ru
===============================================================================
===============================================================================
Contents:
0. Changelog
1. Instrument data block
2. Structure of the instrument file (OPLIX)
3. Structure of the MIDI playing bank file (WOPLX)
3.1. Bank settings
3.2. Instrument entry
4. Example bank file
5. Example instrument file
===============================================================================
===============================================================================
Changelog:
===============================================================================
--------------------------
5'th of December, 2025
--------------------------
Initial version.
--------------------------
7'th of December, 2025
--------------------------
Added commentary lines, IS_MT32 flag, and individual instrument files.
===============================================================================
This is a text-based bank format that can store instruments in the similar way
as binary WOPL can. These banks supposed to be readable and editable by human
via plain text editors, and to be friendly with the version control systems
to easier track changes that is complicated and just impossible for binary-based
formats.
There are next requirements for files:
- All keywords in the file are CASE SENSITIVE.
- File MUST be saved as UTF-8 without BOM.
- There are only LF or CRLF line breaks allowed.
- It's allowed to have commentary lines that begins with "#" or with "//".
- Commentaries should take whole empty line, not continuation of the data line.
===============================================================================
Instrument data block:
===============================================================================
There are parameters shared between individual instrument file (OPLIX) and the
bank file (WOPLX). Instrumets allowed to have next fields:
NAME=<str> <---- Name of the the instrument (optional)
FLAGS: <flags-list> <---- Instrument's flags (list below)
ATTRS: <attributes-list> <---- Instrument's attributes (list below)
FBCONN: <fb-conn-list> <---- Feedback/connection setup (list below)
OPx: <operator setup> <---- Per-operator setup. Where "x" is a number
from 0 to 4 to specify the number of operator.
------------- Flags -------------
Instrument flags are written as a sequence of "LABEL;" lines without values.
Every label MUST end with the seicolon.
FN; <--- Fixed tone. Always enabled on percussion voices. If enable on the
melodic voice, the voice will always play the same note with no
matter to the pressed MIDI key.
2OP; <--- The instrument uses 2-operator mode of the chip.
DV; <--- The instrument is a double-voice of two 2-operator tones.
4OP; <--- The instrument uses 4-operator mode of the chip.
IMPOORTANT: It's requred to have one of flags: 2OP;, DV;, or 4OP;, and it's not
allowed to have two or all three of them: they are conflicting.
EXAMPLE lists of flags:
FLAGS: 2OP;
FLAGS: FN;2OP;
FLAGS: DV;
---------- Attributes -----------
Instrument attributes are written as a sequence of "LABEL=VALUE;" lines.
Every label MUST end with the seicolon.
DRUM_KEY=<0...127>; <--- Drum key or key for the fixed note mode.
NOTE_OFF_1=<-127...+127>; <--- MIDI note offset (in double-voice mode,
offset of the first voice)
NOTE_OFF_2=<-127...+127>; <--- MIDI note offset for the second voice
(Only for double-voice mode)
VEL_OFF=<-127...+127>; <--- MIDI velocity offset
FINE_TUNE=<-127...+127>; <--- Detune for the second voice. It's offset of
1/64'th cent of the tone. Full formula how to
get correct floating value of half-tone offset:
(float) ( ( (int) X + 128 ) >> 1) - 64 / 32.0f
Where X is the fine tune value from the file.
RHYTHM=<0, 6,7,8,9,10> <--- Rhythm mode instrument:
0 - Disable (Regular instrument)
6 - Bass drum
7 - Snare
8 - Tom
9 - Cymbal
10 - Hi-Hat
DUR_K_ON=<0...40000>; <--- Sounding duration in milliseconds for key-on
(Used by libADLMIDI's default channel
allocation algorithm)
DUR_K_OFF=<0...40000>; <--- Sounding duration in milliseconds for
releasing instrument (Used by libADLMIDI's
default channel allocation algorithm)
---------- Feedback/Connection -----------
The same format as for attributes above. They written as a sequence of
the "LABEL=VALUE;" lines. Every label MUST end with the seicolon.
For everything:
FB1=<0...7>; <--- Feedback value for the first pair of operators.
CONN1:=<0 or 1>; <--- First pair of operators connection mode:
0 - Frequency modulation, 1 - Additive synth.
For 4-operator or double-voice instruments:
FB2=<0...7>; <--- Feedback value for the second pair of operators.
CONN2:=<0 or 1>; <--- Second pair of operators connection mode:
0 - Frequency modulation, 1 - Additive synth.
---------- Per-operator settings -----------
There are four different operators can be declared. When 2OP mode is used, it's
enough to declare only two of them. Every operator begins with the "OPx: "
label. It's allowed to have "OP0: ", "OP1: ", "OP2: ", or "OP3: ". Role of every
operator described below. Per-operator values are written in same manner as
attributes above: They written as a sequence of the "LABEL=VALUE;" lines. Every
label MUST end with the seicolon.
AT=<0...15>; <--- Attack rate
DC=<0...15>; <--- Decay rate
ST=<15...0>; <--- Sustain rate in chip native format (15 lowest, 0 highest)
RL=<0...15>; <--- Release rate
WF=<0...7>; <--- Wave form: 0 - Sine, 1 - Half-Sine,
2 - Abs-Sine, 3 - Pulse-Sine,
OPL3-only:
4 - Sine (even period only),
5 - Abs-Sine (even period only),
6 - Square wave,
7 - Derived square wave
ML=<0..15>; <--- Multiplication factor
TL=<63...0>; <--- Total level in chip native format (63 lowest, 0 highest)
KL=<0..3>; <--- Key-scale level
VB=<0 or 1>; <--- Sensitive to frequency modulating LFO (vibrato)
AM=<0 or 1>; <--- Sensitive to amplitude moduulating LFO (tremolo)
EG=<0 or 1>; <--- Envelope generator (enable sustain keeping)
KR=<0 or 1>; <--- Key-scale rate (Enable envelope scaling depending by pitch)
-------------------------------------------------------------------------------
Operators in the list below has the next roles:
- Operator 0 - the Carrier1 (Operator 2 for 4-operators mode)
- Operator 1 - the Modulator1 (Operator 1 for 4-operators mode)
- Operator 2 - the Carrier2 (Operator 4 for 4-operators mode)
- Operator 3 - the Modulator2 (Operator 3 for 4-operators mode)
===============================================================================
Structure of the instrument file (OPLIX):
===============================================================================
WOPLX-INST\n <---- Magic number, it MUST be in begin of the file
and it MUST NOT contain trailing spaces after.
It should just be always trimmed and contain
a new-line character. It's allowed to have LF (\n)
or CRLF (\r\n) as well.
IS_DRUM=<0 or 1> <---- Is this a percussion instrument?
<--- Parameters of the "Instrument data block" ---->
===============================================================================
Structure of the MIDI playing bank file (WOPLX):
===============================================================================
WOPLX-BANK\n <---- Magic number, it MUST be in begin of the file
and it MUST NOT contain trailing spaces after.
It should just be always trimmed and contain
a new-line character. It's allowed to have LF (\n)
or CRLF (\r\n) as well.
BANK_INFO: <---- Begin of the OPTIONAL info block that describes
the bank and might include license information too.
<---- Here you can include just any plain text data in free format ---->
BANK_INFO_END <---- Bank info end block.
<------- Bank file-wide flags and settings: -------->
DEEP_VIBRATO=<vib> <---- 0 or 1 - Enable the Deep-Vibrato of OPL2/OPL3 chip
DEEP_TREMOLO=<am> <---- 0 or 1 - Enable the Deep-Tremolo of OPL2/OPL3 chip
IS_MT32=<mt> <---- 0 or 1 - This bank uses MIDI defaults of the MT-32
VOLUME_MODEL=<v> <---- From 0 to 13 - Choose one of libADLMIDI's volume
and frequency models.
<--------------
List of supported volume and frequency models:
0 - Own libADLMIDI's model.
1 - Native OPL3 model (direct binding without any formulas).
2 - DMX model (AM voices will glitch in some conditions).
3 - Apogee Sound System's model (Second operator will be silent with AM conn.).
4 - Model of the Sound Blaster 16 driver for Windows 9x.
5 - Fixed DMX model (AM voices will sound correctly).
6 - Fixed Apogee Sound System's model (AM voices will sound correctly).
7 - Miles' AIL model.
8 - Model of the generic FM Synth based sound cards for Windows 9x.
9 - Model of HMI Sound Operating System.
10 - Model of legacy HMI Sound Operating System (Some FM conn. voices will sound incorrectly).
11 - Model of the AdLib driver for Windows 3.x.
12 - Model of the IMF Creator utility (Partially based on the DMX).
13 - Model of Jamie O'Connell's FM Synth driver for Windows 3.x.
The default channel allocation algorithm will also depend on the selected model:
- Sounding delay based allocation will be used with models from 0 to 8, and 13.
- Any-released allocation algorithm will be used with models 9 and 10.
- Same-instrument allocation algorithm will be used with models 11 and 12.
-------------->
<-----------------------------------------------------------------------
List of banks. Any bank beings with the "MELODIC_BANK:" or
"PERCUSSION_BANK:" and ends with "MELODIC_BANK_END" or
"PERCUSSION_BANK_END". It's allowed to have multiple melodic
and multiple percussion banks to fufill the set of instruments for
the GS or XG, or store the content of AIL banks.
Below are two examples: one melodic bank and one percussion.
------------------------------------------------------------------------>
MELODIC_BANK:
<--- Melodic bank's settings --->
<--- List of bank's instruments --->
MELODIC_BANK_END
PERCUSSION_BANK:
<--- Percussion bank's settings --->
<--- List of bank's instruments --->
PERCUSSION_BANK_END
-------------------------------------------------------------------------------
Bank settings:
-------------------------------------------------------------------------------
At the begin of every bank entry there are next allowed options are going before
any instrument entry begins:
NAME=<str> <---- Name of the bank (optional)
MIDI_BANK_MSB=<0...127> <---- The MSB value of the MIDI bank number
MIDI_BANK_LSB=<0...127> <---- The LSB value of the MIDI bank number
And once next field appears:
INSTRUMENT=<0...127> <---- Instrument entry with MIDI patch number
from 0 to 127
Then no fields but instrument specific are allowed.
-------------------------------------------------------------------------------
Instrument entry:
-------------------------------------------------------------------------------
Every instrument begins with the header field:
INSTRUMENT=<0...127> <---- Instrument entry with MIDI patch number
from 0 to 127
and ends once another instrument header declares an another one.
<--- Parameters of the "Instrument data block" ---->
===============================================================================
===============================================================================
Example bank file:
===============================================================================
WOPLX-BANK
BANK_INFO:
This is a sample bank developed by Vitaliy Novichkov for this specification
article. Everything can be re-used, redone and redistributed freely!
There are few insrtuments placed to simplify the example.
BANK_INFO_END
// Bank flags
DEEP_VIBRATO=1
DEEP_TREMOLO=0
VOLUME_MODEL=12
# General-MIDI melodic bank
MELODIC_BANK:
MIDI_BANK_MSB=0
MIDI_BANK_LSB=0
INSTRUMENT=21:
NAME=Accordn
FLAGS: 2OP;
ATTRS: DUR_K_ON=40000;DUR_K_OFF=146;
FBCONN: FB1=1;CONN1=0;
OP0: AT=7;DC=0;ST=8;RL=7;WF=0;ML=1;TL=0;KL=0;VB=1;AM=0;EG=1;KR=0;
OP1: AT=11;DC=0;ST=0;RL=1;WF=0;ML=4;TL=9;KL=3;VB=1;AM=0;EG=1;KR=0;
INSTRUMENT=27:
FLAGS: 4OP;
ATTRS: DUR_K_ON=2006;DUR_K_OFF=2006;
FBCONN: FB1=4;CONN1=0;FB2=0;CONN2=0;
OP0: AT=15;DC=3;ST=15;RL=3;WF=0;ML=1;TL=23;KL=2;VB=0;AM=0;EG=0;KR=0;
OP1: AT=15;DC=10;ST=2;RL=2;WF=0;ML=2;TL=12;KL=1;VB=0;AM=0;EG=0;KR=0;
OP2: AT=12;DC=1;ST=15;RL=7;WF=0;ML=1;TL=0;KL=0;VB=0;AM=0;EG=0;KR=1;
OP3: AT=12;DC=2;ST=15;RL=3;WF=1;ML=4;TL=29;KL=2;VB=0;AM=0;EG=0;KR=0;
INSTRUMENT=94:
NAME=Pad 7 (halo)
FLAGS: DV;
ATTRS: NOTE_OFF_1=12;NOTE_OFF_2=12;FINE_TUNE=-2;DUR_K_ON=40000;DUR_K_OFF=566;
FBCONN: FB1=0;CONN1=0;FB2=0;CONN2=0;
OP0: AT=9;DC=1;ST=4;RL=6;WF=1;ML=0;TL=0;KL=0;VB=0;AM=1;EG=1;KR=0;
OP1: AT=5;DC=1;ST=4;RL=5;WF=1;ML=1;TL=13;KL=1;VB=1;AM=1;EG=1;KR=0;
OP2: AT=8;DC=1;ST=4;RL=6;WF=1;ML=0;TL=0;KL=0;VB=0;AM=1;EG=1;KR=0;
OP3: AT=5;DC=1;ST=4;RL=5;WF=1;ML=1;TL=13;KL=1;VB=0;AM=1;EG=1;KR=0;
// Here should be more instruments, but I placed only these above
MELODIC_BANK_END
// Now, it's a percussion bank!
PERCUSSION_BANK:
MIDI_BANK_MSB=0
MIDI_BANK_LSB=0
INSTRUMENT=35:
FLAGS: 2OP;
ATTRS: DRUM_KEY=35;DUR_K_ON=26;DUR_K_OFF=26;
FBCONN: FB1=4;CONN1=0;
OP0: AT=15;DC=3;ST=0;RL=6;WF=0;ML=1;TL=0;KL=0;VB=0;AM=0;EG=0;KR=1;
OP1: AT=15;DC=8;ST=7;RL=7;WF=2;ML=0;TL=4;KL=1;VB=0;AM=0;EG=0;KR=1;
INSTRUMENT=36:
FLAGS: 4OP;
ATTRS: DRUM_KEY=35;DUR_K_ON=20;DUR_K_OFF=20;
FBCONN: FB1=0;CONN1=0;FB2=0;CONN2=1;
OP0: AT=13;DC=6;ST=3;RL=12;WF=0;ML=0;TL=0;KL=0;VB=0;AM=0;EG=0;KR=0;
OP1: AT=15;DC=13;ST=0;RL=12;WF=0;ML=1;TL=7;KL=0;VB=0;AM=0;EG=0;KR=0;
OP2: AT=15;DC=6;ST=0;RL=12;WF=0;ML=0;TL=0;KL=0;VB=0;AM=0;EG=0;KR=0;
OP3: AT=15;DC=6;ST=0;RL=12;WF=0;ML=0;TL=0;KL=0;VB=0;AM=0;EG=0;KR=0;
PERCUSSION_BANK_END
===============================================================================
===============================================================================
Example instrument file:
===============================================================================
WOPLX-INST
IS_DRUM=0
NAME=Pad 7 (halo)
FLAGS: DV;
ATTRS: NOTE_OFF_1=12;NOTE_OFF_2=12;FINE_TUNE=-2;DUR_K_ON=40000;DUR_K_OFF=566;
FBCONN: FB1=0;CONN1=0;FB2=0;CONN2=0;
OP0: AT=9;DC=1;ST=4;RL=6;WF=1;ML=0;TL=0;KL=0;VB=0;AM=1;EG=1;KR=0;
OP1: AT=5;DC=1;ST=4;RL=5;WF=1;ML=1;TL=13;KL=1;VB=1;AM=1;EG=1;KR=0;
OP2: AT=8;DC=1;ST=4;RL=6;WF=1;ML=0;TL=0;KL=0;VB=0;AM=1;EG=1;KR=0;
OP3: AT=5;DC=1;ST=4;RL=5;WF=1;ML=1;TL=13;KL=1;VB=0;AM=1;EG=1;KR=0;
===============================================================================
================================================
FILE: _Misc/bytecmp_adlraw.c
================================================
#include <stdio.h>
int main()
{
FILE* f1 = fopen("bisqwit.adlraw", "rb");
FILE* f2 = fopen("bisqwit-2.adlraw", "rb");
unsigned char byte1=0, byte2=0;
int count=0;
int insCount=0;
int dataPos = 0;
int valid1 = 1;
int valid2 = 1;
int drumMode = 0;
while( valid1 && valid2 )
{
valid1 = (fread(&byte1, 1, 1, f1) != 0);
valid2 = (fread(&byte2, 1, 1, f2) != 0);
if(!valid1 && !valid2)
break;
/*
if(count==0)
{
printf("Header\n");
}
if(count==8)
{
printf("Header END\n");
}
*/
if(count >= dataPos)
{
if( (count - dataPos) % 25 == 0 )
{
if(drumMode)
printf("DRUM!!! %d\n", (insCount++)-128);
else
printf("INSTRUMENT!!! %d\n", insCount++);
if( insCount == 128 )
drumMode = 1;
}
}
printf("%03X: {0x%02x == 0x%02x}%s\n", count, byte1, byte2, (byte1==byte2) ? "" : " <- NOT SAME!!!");
count++;
}
}
================================================
FILE: _Misc/bytecmp_bnk.c
================================================
#include <stdio.h>
int main()
{
FILE* f1 = fopen("bnk1.bnk", "rb");
FILE* f2 = fopen("bnk2.bnk", "rb");
unsigned char byte1=0, byte2=0;
int count=0;
int insCount=0;
int dataPos = 4;
int valid1 = 1;
int valid2 = 1;
int drumMode = 0;
while( valid1 && valid2 )
{
valid1 = (fread(&byte1, 1, 1, f1)!=0);
valid2 = (fread(&byte2, 1, 1, f2)!=0);
if(!valid1 && !valid2)
break;
/*
if(count==0)
{
printf("Header\n");
}
if(count==4)
{
printf("Header END\n");
}
if(count>=dataPos)
{
if((count-dataPos)%16==0)
{
if(drumMode)
printf("DRUM!!! %d\n", (insCount++)-128);
else
printf("INSTRUMENT!!! %d\n", insCount++);
if(insCount==128)
drumMode = 1;
}
}*/
printf("%03X: {0x%02x == 0x%02x}%s\n", count, byte1, byte2, (byte1==byte2)?"":" <- NOT SAME!!!");
count++;
}
}
================================================
FILE: _Misc/bytecmp_dmx.c
================================================
#include <stdio.h>
int main()
{
FILE* f1 = fopen("dmx_doom2.op2", "rb");
FILE* f2 = fopen("dmx_doom2_modded.op2", "rb");
unsigned char byte1=0, byte2=0;
int count=0;
int insCount=0;
int dataPos = 8;
int valid1 = 1;
int valid2 = 1;
int drumMode = 0;
while( valid1 && valid2 )
{
valid1 = (fread(&byte1, 1, 1, f1)!=0);
valid2 = (fread(&byte2, 1, 1, f2)!=0);
if(!valid1 && !valid2)
break;
if(count==0)
{
printf("Header\n");
}
if(count==8)
{
printf("Header END\n");
}
if(count>=dataPos)
{
if((count-dataPos)%36==0)
{
if(drumMode)
printf("DRUM!!! %d\n", (insCount++)-128);
else
printf("INSTRUMENT!!! %d\n", insCount++);
if(insCount==128)
drumMode = 1;
}
}
printf("%03X: {0x%02x == 0x%02x}%s\n", count, byte1, byte2, (byte1==byte2)?"":" <- NOT SAME!!!");
count++;
}
}
================================================
FILE: _Misc/bytecmp_ibk.c
================================================
#include <stdio.h>
int main()
{
FILE* f1 = fopen("ibk1.ibk", "rb");
FILE* f2 = fopen("ibk2.ibk", "rb");
unsigned char byte1=0, byte2=0;
int count=0;
int insCount=0;
int dataPos = 4;
int valid1 = 1;
int valid2 = 1;
int drumMode = 0;
while( valid1 && valid2 )
{
valid1 = (fread(&byte1, 1, 1, f1)!=0);
valid2 = (fread(&byte2, 1, 1, f2)!=0);
if(!valid1 && !valid2)
break;
if(count==0)
{
printf("Header\n");
}
if(count==4)
{
printf("Header END\n");
}
if(count>=dataPos)
{
if((count-dataPos)%16==0)
{
if(drumMode)
printf("DRUM!!! %d\n", (insCount++)-128);
else
printf("INSTRUMENT!!! %d\n", insCount++);
if(insCount==128)
drumMode = 1;
}
}
printf("%03X: {0x%02x == 0x%02x}%s\n", count, byte1, byte2, (byte1==byte2)?"":" <- NOT SAME!!!");
count++;
}
}
================================================
FILE: _Misc/bytecmp_ibk2.c
================================================
#include <stdio.h>
int main()
{
FILE* f1 = fopen("perk1.ibk", "rb");
FILE* f2 = fopen("perk2.ibk", "rb");
unsigned char byte1=0, byte2=0;
int count=0;
int insCount=0;
int dataPos = 4;
int valid1 = 1;
int valid2 = 1;
int drumMode = 0;
while( valid1 && valid2 )
{
valid1 = (fread(&byte1, 1, 1, f1)!=0);
valid2 = (fread(&byte2, 1, 1, f2)!=0);
if(!valid1 && !valid2)
break;
if(count==0)
{
printf("Header\n");
}
if(count==4)
{
printf("Header END\n");
}
if(count>=dataPos)
{
if((count-dataPos)%16==0)
{
if(drumMode)
printf("DRUM!!! %d\n", (insCount++)-128);
else
printf("INSTRUMENT!!! %d\n", insCount++);
if(insCount==128)
drumMode = 1;
gitextract_zr1nehnw/
├── .devcontainer/
│ ├── Dockerfile
│ ├── devcontainer.json
│ └── reinstall-cmake.sh
├── .gitattributes
├── .github/
│ └── workflows/
│ ├── macos-ci.yml
│ ├── ubuntu-ci.yml
│ └── windows-ci.yml
├── .gitignore
├── .gitmodules
├── Bank_Examples/
│ ├── 2x2.op3
│ ├── AdlibTracker2/
│ │ ├── $at2demo.a2w
│ │ ├── $gmopl.ibk
│ │ ├── $mlfbank.bnk
│ │ ├── $mt32.ibk
│ │ ├── 3klang1.sgi
│ │ ├── 3klang2.sgi
│ │ ├── aalto.sbi
│ │ ├── accordn.sbi
│ │ ├── acid.cif
│ │ ├── acidbas4.sgi
│ │ ├── acidbass.sgi
│ │ ├── alien.cif
│ │ ├── alien.sbi
│ │ ├── alien2.sbi
│ │ ├── altovio2.sbi
│ │ ├── altoviol.sbi
│ │ ├── asbass.fin
│ │ ├── astring.sbi
│ │ ├── atari.sgi
│ │ ├── bagpipe1.sbi
│ │ ├── bagpipe2.sbi
│ │ ├── banjo.sbi
│ │ ├── banjo1.sbi
│ │ ├── basdr3.sbi
│ │ ├── base.cif
│ │ ├── base.sgi
│ │ ├── base2.cif
│ │ ├── base3.cif
│ │ ├── base3.sgi
│ │ ├── basedrum.sgi
│ │ ├── basemax.sgi
│ │ ├── basemed.sgi
│ │ ├── basesyn.cif
│ │ ├── bass.fin
│ │ ├── bass.ins
│ │ ├── bass1.sbi
│ │ ├── bass2.cif
│ │ ├── bass2.ins
│ │ ├── bass2.sbi
│ │ ├── bass295.fin
│ │ ├── bass3.cif
│ │ ├── bass4.cif
│ │ ├── bass5.cif
│ │ ├── bass5.fin
│ │ ├── bass6.cif
│ │ ├── bassdrm1.sgi
│ │ ├── bassdrum.fin
│ │ ├── bassdrum.sgi
│ │ ├── bassharp.sbi
│ │ ├── bassnew.fin
│ │ ├── bassoon.sbi
│ │ ├── bassoon1.sbi
│ │ ├── basstrlg.sbi
│ │ ├── battle.sgi
│ │ ├── bbass.sbi
│ │ ├── bcymbal.sbi
│ │ ├── bdrum.ins
│ │ ├── bdrum.sbi
│ │ ├── bdrum1.sbi
│ │ ├── bdrum2.sbi
│ │ ├── bdrum3.sbi
│ │ ├── beep.cif
│ │ ├── belguit2.sbi
│ │ ├── bell#2.ins
│ │ ├── bell.ins
│ │ ├── bell.sgi
│ │ ├── bellong.sbi
│ │ ├── bells.cif
│ │ ├── bells.sbi
│ │ ├── bellsngr.sgi
│ │ ├── belpiano.sbi
│ │ ├── belshort.sbi
│ │ ├── beverly.sgi
│ │ ├── bguit.sbi
│ │ ├── bim.cif
│ │ ├── blast.sbi
│ │ ├── blip.cif
│ │ ├── blob.sgi
│ │ ├── bncebass.sbi
│ │ ├── bpiano.sbi
│ │ ├── brass.sgi
│ │ ├── brass1.sbi
│ │ ├── brass2.sbi
│ │ ├── briss4.sgi
│ │ ├── briss5.sgi
│ │ ├── briss6.sgi
│ │ ├── broguit.fin
│ │ ├── brush2.sbi
│ │ ├── bstacc.sbi
│ │ ├── bsynth.sbi
│ │ ├── btgo.sbi
│ │ ├── cbanjo.sbi
│ │ ├── cbassoon.sbi
│ │ ├── celesta.sbi
│ │ ├── celguit.sbi
│ │ ├── cello.sbi
│ │ ├── cello2.sbi
│ │ ├── celpiano.sbi
│ │ ├── celpno2.sbi
│ │ ├── chirp.sbi
│ │ ├── chord.ins
│ │ ├── chorn.sbi
│ │ ├── church.sgi
│ │ ├── claps1.sbi
│ │ ├── clar1.sbi
│ │ ├── clar2.sbi
│ │ ├── clarinet.sbi
│ │ ├── clavecin.sbi
│ │ ├── claves.sbi
│ │ ├── contra2.sbi
│ │ ├── contrab.sbi
│ │ ├── cool.cif
│ │ ├── cool.sgi
│ │ ├── coolbass.sgi
│ │ ├── cromorne.sbi
│ │ ├── crystal.sbi
│ │ ├── cstacc.sbi
│ │ ├── csynth.sbi
│ │ ├── cviolin.sbi
│ │ ├── cymbal.sbi
│ │ ├── cymbal1.sbi
│ │ ├── cymbal2.sbi
│ │ ├── dan.sgi
│ │ ├── dapbass.cif
│ │ ├── deadbass.cif
│ │ ├── deep.sgi
│ │ ├── deepbell.cif
│ │ ├── deepdapb.cif
│ │ ├── deepstri.cif
│ │ ├── dipp2.cif
│ │ ├── dot.sgi
│ │ ├── dot2.sgi
│ │ ├── dot3.sgi
│ │ ├── dragbass.sgi
│ │ ├── drum1.ins
│ │ ├── drum2.ins
│ │ ├── drum2.sgi
│ │ ├── drum3.ins
│ │ ├── drum4.ins
│ │ ├── drum5.ins
│ │ ├── drumdown.sgi
│ │ ├── dshrtbas.cif
│ │ ├── dune.sgi
│ │ ├── dungeon.sgi
│ │ ├── easybass.cif
│ │ ├── ebass-l.sgi
│ │ ├── ebass.sgi
│ │ ├── eguhigh.sgi
│ │ ├── eguitar.sgi
│ │ ├── eguitar3.sgi
│ │ ├── eguitar4.sgi
│ │ ├── eguitar5.sgi
│ │ ├── eguitarl.sgi
│ │ ├── eguittar.cif
│ │ ├── eklavie.cif
│ │ ├── elclav1.sbi
│ │ ├── elclav2.sbi
│ │ ├── elecfl.sbi
│ │ ├── elecvibe.sbi
│ │ ├── elguit1.sbi
│ │ ├── elguit2.sbi
│ │ ├── elguit3.sbi
│ │ ├── elguit4.sbi
│ │ ├── elguitar.sbi
│ │ ├── elorgan1.sbi
│ │ ├── elorgan4.sgi
│ │ ├── elpiano1.sbi
│ │ ├── elpiano2.sbi
│ │ ├── englhrn1.sbi
│ │ ├── englhrn2.sbi
│ │ ├── epiano.sbi
│ │ ├── epiano1a.sbi
│ │ ├── epiano1b.sbi
│ │ ├── epicbell.cif
│ │ ├── fantapan.sbi
│ │ ├── fantpan2.sbi
│ │ ├── fifth.fin
│ │ ├── fifths.fin
│ │ ├── fight.sgi
│ │ ├── flapbas.sbi
│ │ ├── floete.sgi
│ │ ├── flute.cif
│ │ ├── flute.sbi
│ │ ├── flute1.sbi
│ │ ├── flute2.sbi
│ │ ├── frhorn1.sbi
│ │ ├── frhorn2.sbi
│ │ ├── fstrp1.sbi
│ │ ├── fstrp2.sbi
│ │ ├── funny.sgi
│ │ ├── funnybas.sbi
│ │ ├── fupp.cif
│ │ ├── future.sgi
│ │ ├── fuzguit1.sbi
│ │ ├── fuzguit2.sbi
│ │ ├── galaxi.sgi
│ │ ├── galaxy3.sgi
│ │ ├── galaxy3v.sgi
│ │ ├── geige.sgi
│ │ ├── ghost.sgi
│ │ ├── gpb.sgi
│ │ ├── guit2.fin
│ │ ├── guitar1.sbi
│ │ ├── gun.sgi
│ │ ├── gun2.sgi
│ │ ├── hack.cif
│ │ ├── hammer.sgi
│ │ ├── hardsynt.cif
│ │ ├── harmonca.sbi
│ │ ├── harp.sbi
│ │ ├── harp1.sbi
│ │ ├── harp2.sbi
│ │ ├── harp3.sbi
│ │ ├── harpe1.sbi
│ │ ├── harpsi1.sbi
│ │ ├── harpsi2.sbi
│ │ ├── harpsi3.sbi
│ │ ├── harpsi4.sbi
│ │ ├── harpsi5.sbi
│ │ ├── helicptr.sbi
│ │ ├── highlow.sgi
│ │ ├── hihat.cif
│ │ ├── hihat.ins
│ │ ├── hihat.sgi
│ │ ├── hihat2.cif
│ │ ├── hihat2.sgi
│ │ ├── hihathi.sgi
│ │ ├── horn.cif
│ │ ├── horror1.sgi
│ │ ├── horror2.sgi
│ │ ├── horror3.sgi
│ │ ├── icerain.sgi
│ │ ├── javaican.sbi
│ │ ├── jazzbas2.sbi
│ │ ├── jazzbass.sbi
│ │ ├── jazzguit.sbi
│ │ ├── jet.cif
│ │ ├── jewsharp.sbi
│ │ ├── jump.sgi
│ │ ├── jump2.sgi
│ │ ├── jungdrum.sgi
│ │ ├── jungle.sgi
│ │ ├── key2.sgi
│ │ ├── keybrd1.sbi
│ │ ├── keybrd2.sbi
│ │ ├── keybrd3.sbi
│ │ ├── klarinet.cif
│ │ ├── knarbass.cif
│ │ ├── knock.cif
│ │ ├── koto.sgi
│ │ ├── koto1.sbi
│ │ ├── kuorsau2.sbi
│ │ ├── kuorsaus.sbi
│ │ ├── kupfer.cif
│ │ ├── kupfer2.cif
│ │ ├── laser.sbi
│ │ ├── laser.sgi
│ │ ├── leed.cif
│ │ ├── leed2.cif
│ │ ├── leed3.cif
│ │ ├── leen4.cif
│ │ ├── ligtbell.cif
│ │ ├── logdrum.sgi
│ │ ├── logdrum1.sbi
│ │ ├── long-hi.sgi
│ │ ├── long2.sgi
│ │ ├── loop.cif
│ │ ├── lostinsp.sgi
│ │ ├── lullbass.sbi
│ │ ├── luola.sbi
│ │ ├── marimba.sbi
│ │ ├── marimba.sgi
│ │ ├── marimba1.sbi
│ │ ├── marimba2.sbi
│ │ ├── mars.sbi
│ │ ├── master.sgi
│ │ ├── mdrnphon.sbi
│ │ ├── melody.cif
│ │ ├── meri.sbi
│ │ ├── mhihat.fin
│ │ ├── minebass.sgi
│ │ ├── mltrdrum.sbi
│ │ ├── modacid.sgi
│ │ ├── moogsynt.sbi
│ │ ├── moon.sbi
│ │ ├── muteclav.sgi
│ │ ├── nice2.sgi
│ │ ├── nicebass.sgi
│ │ ├── noise1.sbi
│ │ ├── notbig.sbi
│ │ ├── oboe.sbi
│ │ ├── oboe1.sbi
│ │ ├── organ1.sbi
│ │ ├── organ2.sbi
│ │ ├── organ3.sbi
│ │ ├── organ3a.sbi
│ │ ├── organ3b.sbi
│ │ ├── organ4.sbi
│ │ ├── orgel.cif
│ │ ├── orgnperc.sbi
│ │ ├── pan.cif
│ │ ├── panic.sgi
│ │ ├── phone1.sbi
│ │ ├── phone2.sbi
│ │ ├── pian1a.sbi
│ │ ├── pian1b.sbi
│ │ ├── pian1c.sbi
│ │ ├── piano.ins
│ │ ├── piano.sbi
│ │ ├── piano.sgi
│ │ ├── piano1.sbi
│ │ ├── piano2.sbi
│ │ ├── piano3.sbi
│ │ ├── piano4.sbi
│ │ ├── pianobel.sbi
│ │ ├── pianof.sbi
│ │ ├── piccolo.sbi
│ │ ├── piffclap.sgi
│ │ ├── pipes.sbi
│ │ ├── pling.cif
│ │ ├── popbass1.sbi
│ │ ├── popcorn.sbi
│ │ ├── powerbas.sgi
│ │ ├── powersn.sgi
│ │ ├── pzzicato.sgi
│ │ ├── reverb2.sbi
│ │ ├── rksnare1.sbi
│ │ ├── rlog.sbi
│ │ ├── roehr.cif
│ │ ├── sachso2.sgi
│ │ ├── sax.ins
│ │ ├── sax1.sbi
│ │ ├── saxafone.sbi
│ │ ├── scratch.sbi
│ │ ├── scratch4.sbi
│ │ ├── sdrum2.sbi
│ │ ├── seashore.sbi
│ │ ├── sftbrss1.sbi
│ │ ├── sftfl2.sbi
│ │ ├── shaker.cif
│ │ ├── shaker.sbi
│ │ ├── shppizz.sbi
│ │ ├── shrtbass.cif
│ │ ├── shrttne2.sbi
│ │ ├── shrtvibe.sbi
│ │ ├── shrtviol.cif
│ │ ├── silly.sgi
│ │ ├── sitar.sbi
│ │ ├── sitar1.sbi
│ │ ├── sitar2.sbi
│ │ ├── slapbs1.sbi
│ │ ├── snakefl.sbi
│ │ ├── snare.ins
│ │ ├── snare.sbi
│ │ ├── snare1.fin
│ │ ├── snare1.sbi
│ │ ├── snare2.cif
│ │ ├── snare2.sbi
│ │ ├── snare7.sbi
│ │ ├── snrsust.sbi
│ │ ├── softpizz.sbi
│ │ ├── softsax.sbi
│ │ ├── softtrom.cif
│ │ ├── solovln.sbi
│ │ ├── space.cif
│ │ ├── spring.cif
│ │ ├── st1.sbi
│ │ ├── start.fin
│ │ ├── steelgt1.sbi
│ │ ├── steelgt2.sbi
│ │ ├── string0.cif
│ │ ├── string1.cif
│ │ ├── string2.cif
│ │ ├── string3.cif
│ │ ├── string4.cif
│ │ ├── string5.cif
│ │ ├── string6.cif
│ │ ├── strings1.sbi
│ │ ├── strings2.sgi
│ │ ├── strings3.sgi
│ │ ├── strloop.fin
│ │ ├── strnlong.sbi
│ │ ├── strom.sgi
│ │ ├── strom2.sgi
│ │ ├── sunrise.sgi
│ │ ├── sunrise2.sgi
│ │ ├── sunrise4.sgi
│ │ ├── sweep.sbi
│ │ ├── syn1.sbi
│ │ ├── syn2.cif
│ │ ├── syn2.sbi
│ │ ├── syn3.cif
│ │ ├── syn3.sbi
│ │ ├── syn4.cif
│ │ ├── syn4.sbi
│ │ ├── syn5.sbi
│ │ ├── syn6.sbi
│ │ ├── syn9.sbi
│ │ ├── synbal1.sbi
│ │ ├── synbal2.sbi
│ │ ├── synbass.sbi
│ │ ├── synbass1.sbi
│ │ ├── synbass2.sbi
│ │ ├── synbass4.sbi
│ │ ├── synbuz.sbi
│ │ ├── syncrsh.cif
│ │ ├── synmllet.sgi
│ │ ├── synsnr1.sbi
│ │ ├── synsnr2.sbi
│ │ ├── syntbell.cif
│ │ ├── synth.ins
│ │ ├── synth1.sbi
│ │ ├── syntom.cif
│ │ ├── tamb_g.cif
│ │ ├── tech.sgi
│ │ ├── tech2.sgi
│ │ ├── techno.sgi
│ │ ├── technol.sgi
│ │ ├── tensax.sbi
│ │ ├── tensax2.sbi
│ │ ├── tensax3.sbi
│ │ ├── tensax4.sbi
│ │ ├── terz.sgi
│ │ ├── terzm.sgi
│ │ ├── tincan1.sbi
│ │ ├── tom.cif
│ │ ├── tom.sbi
│ │ ├── tom1.sbi
│ │ ├── tom2.cif
│ │ ├── tom2.sbi
│ │ ├── tomtom.sgi
│ │ ├── tone.cif
│ │ ├── topcbl.sgi
│ │ ├── topcbl2.sgi
│ │ ├── trainbel.sbi
│ │ ├── triangle.sbi
│ │ ├── triangle.sgi
│ │ ├── trible.sgi
│ │ ├── troll.sgi
│ │ ├── tromb1.sbi
│ │ ├── tromb2.sbi
│ │ ├── trombone.sbi
│ │ ├── trompet.cif
│ │ ├── trpcup1.sbi
│ │ ├── trumpet.sbi
│ │ ├── trumpet1.sbi
│ │ ├── trumpet2.sbi
│ │ ├── trumpet3.sbi
│ │ ├── trumpet4.sbi
│ │ ├── tuba.cif
│ │ ├── tuba1.sbi
│ │ ├── tuba2.sbi
│ │ ├── tuba2.sgi
│ │ ├── tuba3.sbi
│ │ ├── ultra.sgi
│ │ ├── ultra2.sgi
│ │ ├── upswing.sgi
│ │ ├── v42-2.sgi
│ │ ├── v42.sgi
│ │ ├── verplant.cif
│ │ ├── vibra1.sbi
│ │ ├── vibra2.sbi
│ │ ├── vibra3.sbi
│ │ ├── viol.sgi
│ │ ├── violin.ins
│ │ ├── violin.sbi
│ │ ├── violin1.sbi
│ │ ├── violin2.sbi
│ │ ├── violin3.sbi
│ │ ├── vlnpizz.sbi
│ │ ├── vlnpizz1.sbi
│ │ ├── vol.sgi
│ │ ├── wamm.cif
│ │ ├── warp.sgi
│ │ ├── water.sgi
│ │ ├── wave.sbi
│ │ ├── wave1.sbi
│ │ ├── whistle.cif
│ │ ├── woodbloc.fin
│ │ ├── xylo.cif
│ │ ├── xylo1.sbi
│ │ ├── xylo2.sbi
│ │ ├── xylo3.sbi
│ │ ├── xylofone.sbi
│ │ ├── ykabass1.sbi
│ │ └── zong.cif
│ ├── DOSBox/
│ │ ├── doofus.dro
│ │ ├── dro_v2.dro
│ │ └── samurai.dro
│ ├── DRUMOPL.IBK
│ ├── DRUMOPL.tmb
│ ├── Earthsieg.wopl
│ ├── FingerBass.sbi
│ ├── Hammond.sbi
│ ├── Info.txt
│ ├── Mobilnik-v2.wopl
│ ├── Mobilnik.wopl
│ ├── Piano.4op
│ ├── Reality AdLib tracker/
│ │ ├── cybernet.ins
│ │ ├── midi.ins
│ │ └── pulsebass.ins
│ ├── Sci/
│ │ ├── pq2.bnk
│ │ ├── pq2.pat
│ │ ├── sci.patch.format.txt
│ │ ├── sq4.bnk
│ │ └── sq4.pat
│ ├── StellDrums.sbi
│ ├── Wolfinstein.OP2
│ ├── cyberpuck.tmb
│ ├── d3dtimbr-modded.wopl
│ ├── d3dtimbr.op2
│ ├── d3dtimbr.tmb
│ ├── default.tmb
│ ├── dmx_dmx.op2
│ ├── dmx_doom1.op2
│ ├── dmx_doom2.op2
│ ├── dmx_raptor.op2
│ ├── dmx_strife.op2
│ ├── drums.o3
│ ├── drums.sb
│ ├── earthsieg.ad
│ ├── example.wopl
│ ├── fat-drums.o3
│ ├── fat-drums.sb
│ ├── fat-melodic.o3
│ ├── fat-melodic.sb
│ ├── fat2.op3
│ ├── fat4.op3
│ ├── file49.opl
│ ├── file53.opl
│ ├── glockenspielprealpha.opli
│ ├── gmoconel.tmb
│ ├── gmopl-2.ibk
│ ├── gmopl-3.ibk
│ ├── gmopl.ibk
│ ├── gmoplmod.tmb
│ ├── hmi-drums-144.bnk
│ ├── hmi-melodic-144.bnk
│ ├── insmaker_standard.bnk
│ ├── jv_2op.op3
│ ├── nemesis.opl
│ ├── rock-organ-1.opli
│ ├── rock-organ-doom.opli
│ ├── std.o3
│ ├── std.sb
│ ├── swtimbr.tmb
│ ├── synth.pat
│ ├── test-2.wopl
│ ├── test.wopl
│ ├── tim.snd
│ ├── tim.tim
│ ├── tumubar-bell-dmx.sbi
│ ├── wallace.op3
│ ├── wallence.tmb
│ └── warcraft.ad
├── CMakeLists.txt
├── FMBankEdit.pro
├── LICENSE
├── README.md
├── Specifications/
│ ├── AILBANK.TXT
│ ├── DMX OP2 Bank Format.txt
│ ├── HMI BNK Format.txt
│ ├── Opl3Bank.fbs
│ ├── RIFF FM4 PAT specification.txt
│ ├── Reality ADlib Tracker format.cp437.txt.utf-8.txt
│ ├── TMB Format.txt
│ ├── UNIX SoundBlaster Patch.txt
│ ├── WOPL-and-OPLI-Specification.odt
│ ├── WOPL-and-OPLI-Specification.txt
│ ├── WOPLX-Specification.txt
│ └── YMF262 chip specification.odt
├── _Misc/
│ ├── GMOPL2.IBK
│ ├── GMOPL4.IBK
│ ├── bisqwit-2.adlraw
│ ├── bisqwit.adlraw
│ ├── bnk1.bnk
│ ├── bnk2.bnk
│ ├── bytecmp_adlraw.c
│ ├── bytecmp_bnk.c
│ ├── bytecmp_dmx.c
│ ├── bytecmp_ibk.c
│ ├── bytecmp_ibk2.c
│ ├── bytecmp_ibk3.c
│ ├── bytecmp_op3.c
│ ├── bytecmp_silly.c
│ ├── bytecmp_tim.c
│ ├── bytecmp_tmb.c
│ ├── cmp1.op3
│ ├── cmp2.op3
│ ├── compare_banks.sh
│ ├── dmx_doom2.op2
│ ├── dmx_doom2_modded.op2
│ ├── duke1.tmb
│ ├── duke2.tmb
│ ├── dumb_bnk.c
│ ├── file144-2.bnk
│ ├── file144.bnk
│ ├── file53.opl
│ ├── file53_dupe.opl
│ ├── grassman.txt
│ ├── grassman1.bnk
│ ├── grassman2.bnk
│ ├── grassman2.txt
│ ├── ibk1.ibk
│ ├── ibk2.ibk
│ ├── insmaker_standard.bnk
│ ├── lostvik1.ad
│ ├── lostvik1.opl
│ ├── lostvik2.ad
│ ├── lostvik2.opl
│ ├── perk1.ibk
│ ├── perk2.ibk
│ ├── qt-4-4-3-build/
│ │ ├── Readme.txt
│ │ └── make-qt-4-4-3.bat
│ ├── sbnk1.bnk
│ ├── sbnk2.bnk
│ ├── std-2.o3
│ ├── std-2.sb
│ ├── std.o3
│ ├── std.sb
│ ├── tim.snd
│ └── tim.tim
├── build.bat
├── changelog.txt
├── cmake/
│ ├── FindQwt.cmake
│ ├── ci_linux_gcc_toolchain_arm64.cmake
│ ├── ci_linux_gcc_toolchain_armhf.cmake
│ ├── ci_linux_gcc_toolchain_x32.cmake
│ ├── ci_windows_mingw_toolchain_x32.cmake
│ ├── ci_windows_mingw_toolchain_x64.cmake
│ ├── ci_windows_winmm_mingw_toolchain_vanilla.cmake
│ ├── ci_windows_winmm_mingw_toolchain_x32.cmake
│ ├── ci_windows_winmm_mingw_toolchain_x64.cmake
│ ├── deploy.cmake
│ ├── library_qt.cmake
│ └── static_qt.cmake
├── formats_info.htm
├── license.txt
├── opl_proxy/
│ ├── dummy-non-windows/
│ │ └── oplproxy.c
│ ├── modern/
│ │ ├── .gitignore
│ │ ├── InpOut32Helper.c
│ │ ├── InpOut32Helper.h
│ │ ├── Readme.txt
│ │ ├── build32.bat
│ │ ├── build32.sh
│ │ ├── build64.bat
│ │ ├── build64.sh
│ │ ├── liboplproxy.def
│ │ ├── liboplproxy.tgt
│ │ ├── liboplproxy_exports.txt
│ │ ├── oplproxy.c
│ │ ├── oplproxy.wpj
│ │ └── update_exports.bat
│ └── win9x/
│ ├── .gitignore
│ ├── Readme.txt
│ ├── liboplproxy.tgt
│ ├── liboplproxy_exports.txt
│ ├── oplproxy.c
│ ├── oplproxy.wpj
│ ├── update_exports.bat
│ └── update_exports.sh
├── src/
│ ├── FileFormats/
│ │ ├── Opl3Bank_generated.h
│ │ ├── ffmt_base.cpp
│ │ ├── ffmt_base.h
│ │ ├── ffmt_enums.cpp
│ │ ├── ffmt_enums.h
│ │ ├── ffmt_factory.cpp
│ │ ├── ffmt_factory.h
│ │ ├── format_adlib_bnk.cpp
│ │ ├── format_adlib_bnk.h
│ │ ├── format_adlib_tim.cpp
│ │ ├── format_adlib_tim.h
│ │ ├── format_adlibgold_bnk2.cpp
│ │ ├── format_adlibgold_bnk2.h
│ │ ├── format_ail2_gtl.cpp
│ │ ├── format_ail2_gtl.h
│ │ ├── format_apogeetmb.cpp
│ │ ├── format_apogeetmb.h
│ │ ├── format_bisqwit.cpp
│ │ ├── format_bisqwit.h
│ │ ├── format_cmf_importer.cpp
│ │ ├── format_cmf_importer.h
│ │ ├── format_dmxopl2.cpp
│ │ ├── format_dmxopl2.h
│ │ ├── format_dro_importer.cpp
│ │ ├── format_dro_importer.h
│ │ ├── format_ea_importer.cpp
│ │ ├── format_ea_importer.h
│ │ ├── format_flatbuffer_opl3.cpp
│ │ ├── format_flatbuffer_opl3.h
│ │ ├── format_imf_importer.cpp
│ │ ├── format_imf_importer.h
│ │ ├── format_junlevizion.cpp
│ │ ├── format_junlevizion.h
│ │ ├── format_klm_importer.cpp
│ │ ├── format_klm_importer.h
│ │ ├── format_misc_cif.cpp
│ │ ├── format_misc_cif.h
│ │ ├── format_misc_hsc.cpp
│ │ ├── format_misc_hsc.h
│ │ ├── format_misc_sgi.cpp
│ │ ├── format_misc_sgi.h
│ │ ├── format_patch_fm4.cpp
│ │ ├── format_patch_fm4.h
│ │ ├── format_rad_importer.cpp
│ │ ├── format_rad_importer.h
│ │ ├── format_sb_ibk.cpp
│ │ ├── format_sb_ibk.h
│ │ ├── format_smaf_importer.cpp
│ │ ├── format_smaf_importer.h
│ │ ├── format_vgm_import.cpp
│ │ ├── format_vgm_import.h
│ │ ├── format_wohlstand_opl3.cpp
│ │ ├── format_wohlstand_opl3.h
│ │ ├── format_wohlstand_opl3_text.cpp
│ │ ├── format_wohlstand_opl3_text.h
│ │ ├── wopl/
│ │ │ ├── wopl_file.c
│ │ │ └── wopl_file.h
│ │ ├── ymf262_to_wopi.cpp
│ │ └── ymf262_to_wopi.h
│ ├── audio/
│ │ ├── ao_rtaudio.cpp
│ │ ├── ao_rtaudio.h
│ │ ├── ao_rtaudio.pri
│ │ └── for-mingw-9x/
│ │ └── dsound.h
│ ├── audio.cpp
│ ├── audio_config.cpp
│ ├── audio_config.h
│ ├── audio_config.ui
│ ├── bank.cpp
│ ├── bank.h
│ ├── bank_comparison.cpp
│ ├── bank_comparison.h
│ ├── bank_comparison.ui
│ ├── bank_editor.cpp
│ ├── bank_editor.h
│ ├── bank_editor.ui
│ ├── bank_type_dlg.cpp
│ ├── bank_type_dlg.h
│ ├── common.cpp
│ ├── common.h
│ ├── controlls.cpp
│ ├── delay_analysis.cpp
│ ├── delay_analysis.h
│ ├── delay_analysis.ui
│ ├── flatbuffers/
│ │ ├── base.h
│ │ ├── flatbuffers.h
│ │ └── stl_emulation.h
│ ├── formats_sup.cpp
│ ├── formats_sup.h
│ ├── formats_sup.ui
│ ├── hardware.cpp
│ ├── hardware.h
│ ├── hardware.ui
│ ├── importer.cpp
│ ├── importer.h
│ ├── importer.ui
│ ├── ins_names.cpp
│ ├── ins_names.h
│ ├── ins_names_data.h
│ ├── main.cpp
│ ├── main.h
│ ├── metaparameter.h
│ ├── midi/
│ │ ├── midi_rtmidi.cpp
│ │ ├── midi_rtmidi.h
│ │ └── midi_rtmidi.pri
│ ├── operator_editor.cpp
│ ├── operator_editor.h
│ ├── operator_editor.ui
│ ├── opl/
│ │ ├── generator.cpp
│ │ ├── generator.h
│ │ ├── generator_realtime.cpp
│ │ ├── generator_realtime.h
│ │ ├── measurer.cpp
│ │ ├── measurer.h
│ │ ├── models/
│ │ │ ├── LICENSE.txt
│ │ │ ├── model_ail.c
│ │ │ ├── model_apogee.c
│ │ │ ├── model_dmx.c
│ │ │ ├── model_generic.c
│ │ │ ├── model_hmi_sos.c
│ │ │ ├── model_msadlib.c
│ │ │ ├── model_oconnell.c
│ │ │ ├── model_win9x.c
│ │ │ ├── opl_models.cmake
│ │ │ ├── opl_models.h
│ │ │ └── util/
│ │ │ ├── README.txt
│ │ │ ├── freq-opl.c
│ │ │ └── oplbrightness.c
│ │ ├── nukedopl3.h
│ │ └── realtime/
│ │ ├── ring_buffer.cpp
│ │ ├── ring_buffer.h
│ │ └── ring_buffer.tcc
│ ├── piano.cpp
│ ├── piano.h
│ ├── proxystyle.cpp
│ ├── proxystyle.h
│ ├── resources/
│ │ ├── file_adbnk/
│ │ │ ├── file_adbnk_128x128.xcf
│ │ │ ├── file_adbnk_16x16.xcf
│ │ │ ├── file_adbnk_256x256.xcf
│ │ │ ├── file_adbnk_32x32.xcf
│ │ │ ├── file_adbnk_48x48.xcf
│ │ │ └── make_icns.sh
│ │ ├── file_adbnk.icns
│ │ ├── file_adins/
│ │ │ ├── file_adins_16x16.xcf
│ │ │ ├── file_adins_256x256.xcf
│ │ │ ├── file_adins_32x32.xcf
│ │ │ ├── file_adins_48x48.xcf
│ │ │ └── make_icns.sh
│ │ ├── file_adins.icns
│ │ ├── file_dmx/
│ │ │ ├── file_dmx_128x128.xcf
│ │ │ ├── file_dmx_16x16.xcf
│ │ │ ├── file_dmx_256x256.xcf
│ │ │ ├── file_dmx_32x32.xcf
│ │ │ ├── file_dmx_48x48.xcf
│ │ │ └── make_icns.sh
│ │ ├── file_dmx.icns
│ │ ├── file_fm4/
│ │ │ ├── file_fm4_128x128.xcf
│ │ │ ├── file_fm4_16x16.xcf
│ │ │ ├── file_fm4_256x256.xcf
│ │ │ ├── file_fm4_32x32.xcf
│ │ │ ├── file_fm4_48x48.xcf
│ │ │ └── make_icns.sh
│ │ ├── file_fm4.icns
│ │ ├── file_hmi/
│ │ │ ├── file_hmi_128x128.xcf
│ │ │ ├── file_hmi_16x16.xcf
│ │ │ ├── file_hmi_256x256.xcf
│ │ │ ├── file_hmi_32x32.xcf
│ │ │ ├── file_hmi_48x48.xcf
│ │ │ └── make_icns.sh
│ │ ├── file_hmi.icns
│ │ ├── file_ibk/
│ │ │ ├── file_ibk_16x16.xcf
│ │ │ ├── file_ibk_256x256.xcf
│ │ │ ├── file_ibk_32x32.xcf
│ │ │ ├── file_ibk_48x48.xcf
│ │ │ └── make_icns.sh
│ │ ├── file_ibk.icns
│ │ ├── file_jv/
│ │ │ ├── file_jv_128x128.xcf
│ │ │ ├── file_jv_16x16.xcf
│ │ │ ├── file_jv_256x256.xcf
│ │ │ ├── file_jv_32x32.xcf
│ │ │ ├── file_jv_48x48.xcf
│ │ │ └── make_icns.sh
│ │ ├── file_jv.icns
│ │ ├── file_miles/
│ │ │ ├── file_miles_128x128.xcf
│ │ │ ├── file_miles_16x16.xcf
│ │ │ ├── file_miles_256x256.xcf
│ │ │ ├── file_miles_32x32.xcf
│ │ │ ├── file_miles_48x48.xcf
│ │ │ └── make_icns.sh
│ │ ├── file_miles.icns
│ │ ├── file_opli/
│ │ │ ├── file_opli_128x128.xcf
│ │ │ ├── file_opli_16x16.xcf
│ │ │ ├── file_opli_256x256.xcf
│ │ │ ├── file_opli_32x32.xcf
│ │ │ ├── file_opli_48x48.xcf
│ │ │ └── make_icns.sh
│ │ ├── file_opli.icns
│ │ ├── file_sbi/
│ │ │ ├── file_sbi_16x16.xcf
│ │ │ ├── file_sbi_256x256.xcf
│ │ │ ├── file_sbi_32x32.xcf
│ │ │ ├── file_sbi_48x48.xcf
│ │ │ └── make_icns.sh
│ │ ├── file_sbi.icns
│ │ ├── file_tmb/
│ │ │ ├── file_tmb_128x128.xcf
│ │ │ ├── file_tmb_16x16.xcf
│ │ │ ├── file_tmb_256x256.xcf
│ │ │ ├── file_tmb_32x32.xcf
│ │ │ ├── file_tmb_48x48.xcf
│ │ │ └── make_icns.sh
│ │ ├── file_tmb.icns
│ │ ├── file_wopl/
│ │ │ ├── file_wopl_128x128.xcf
│ │ │ ├── file_wopl_16x16.xcf
│ │ │ ├── file_wopl_256x256.xcf
│ │ │ ├── file_wopl_32x32.xcf
│ │ │ ├── file_wopl_48x48.xcf
│ │ │ └── make_icns.sh
│ │ ├── file_wopl.icns
│ │ ├── info.plist.in
│ │ ├── make_icns.sh
│ │ ├── mime/
│ │ │ ├── opl3-banks.xml
│ │ │ └── opl3-instruments.xml
│ │ ├── opl3.icns
│ │ ├── opl3_bank_editor.desktop
│ │ ├── res.rc
│ │ ├── resources.qrc
│ │ ├── tpl_file_bank/
│ │ │ ├── file_wopl_16x16.xcf
│ │ │ ├── file_wopl_256x256.xcf
│ │ │ ├── file_wopl_32x32.xcf
│ │ │ ├── file_wopl_48x48.xcf
│ │ │ └── make_icns.sh
│ │ └── tpl_file_inst/
│ │ ├── file_opli_16x16.xcf
│ │ ├── file_opli_256x256.xcf
│ │ ├── file_opli_32x32.xcf
│ │ ├── file_opli_48x48.xcf
│ │ └── make_icns.sh
│ ├── translations/
│ │ ├── opl3bankeditor_fr_FR.ts
│ │ ├── opl3bankeditor_pl_PL.ts
│ │ └── opl3bankeditor_ru_RU.ts
│ └── version.h
├── test/
│ ├── build_deb.sh
│ └── wopl_rw/
│ ├── test.wopl
│ ├── test_data.qrc
│ ├── tst_wopl_rwtest.cpp
│ └── wopl_rw.pro
├── upd_submodules.sh
└── utils/
├── create-dmg/
│ ├── create-dmg.sh
│ └── support/
│ ├── dmg-license.py
│ ├── dmg-license3.py
│ └── template.applescript
├── ftp-upload.sh
└── measurer/
└── measurer-tool.cpp
SYMBOL INDEX (813 symbols across 118 files)
FILE: _Misc/bytecmp_adlraw.c
function main (line 3) | int main()
FILE: _Misc/bytecmp_bnk.c
function main (line 3) | int main()
FILE: _Misc/bytecmp_dmx.c
function main (line 3) | int main()
FILE: _Misc/bytecmp_ibk.c
function main (line 3) | int main()
FILE: _Misc/bytecmp_ibk2.c
function main (line 3) | int main()
FILE: _Misc/bytecmp_ibk3.c
function main (line 3) | int main()
FILE: _Misc/bytecmp_op3.c
function main (line 3) | int main()
FILE: _Misc/bytecmp_silly.c
function main (line 3) | int main()
FILE: _Misc/bytecmp_tim.c
function main (line 3) | int main()
FILE: _Misc/bytecmp_tmb.c
function main (line 3) | int main()
FILE: _Misc/dumb_bnk.c
function read16LE (line 10) | int read16LE(FILE *f, unsigned short *target)
function read32LE (line 19) | int read32LE(FILE *f, unsigned int *target)
function main (line 30) | int main(int arvc, char**argv)
FILE: opl_proxy/dummy-non-windows/oplproxy.c
function STDCall (line 32) | STDCall chipType()
function STDCall (line 41) | STDCall chipInit(void)
function STDCall (line 44) | STDCall chipUnInit(void)
function STDCall (line 47) | STDCall chipPoke(uint16_t index, uint16_t value)
function STDCall (line 52) | STDCall chipSetPort(uint16_t port)
FILE: opl_proxy/modern/InpOut32Helper.c
type BOOL (line 14) | typedef BOOL (__stdcall *lpIsInpOutDriverOpen)(void);
type BOOL (line 15) | typedef BOOL (__stdcall *lpIsXP64Bit)(void);
function BOOL (line 30) | BOOL OpenInpOut32(void)
function CloseInpOut32 (line 63) | void CloseInpOut32(void)
function outportb (line 76) | void outportb(unsigned short PortAddress, unsigned short Data)
function inportb (line 95) | unsigned char inportb(unsigned short PortAddress)
FILE: opl_proxy/modern/oplproxy.c
function WINAPI (line 33) | WINAPI DllMain(HINSTANCE const instance, DWORD const reason, LPVOID cons...
function STDCall (line 38) | STDCall chipInit(void)
function STDCall (line 41) | STDCall chipSetPort(uint16_t port)
function STDCall (line 44) | STDCall chipUnInit(void)
function STDCall (line 47) | STDCall chipPoke(uint16_t index, uint16_t value)
FILE: opl_proxy/win9x/oplproxy.c
type BOOL (line 30) | typedef int BOOL;
type PVOID (line 33) | typedef PVOID HANDLE;
type HANDLE (line 34) | typedef HANDLE HINSTANCE;
type DWORD (line 35) | typedef unsigned long DWORD;
function STDCall (line 41) | STDCall DllMain(HINSTANCE const instance, DWORD const reason, LPVOID con...
function STDCall (line 49) | STDCall chipInit(void)
function STDCall (line 52) | STDCall chipSetPort(uint16_t port)
function STDCall (line 57) | STDCall chipUnInit(void)
function STDCall (line 60) | STDCall chipPoke(uint16_t index, uint16_t value)
FILE: src/FileFormats/Opl3Bank_generated.h
type Operator (line 9) | struct Operator
type Instrument (line 11) | struct Instrument
type Bank (line 13) | struct Bank
type Opl3Bank (line 15) | struct Opl3Bank
type Mode (line 17) | enum Mode {
type BankType (line 49) | enum BankType {
type VolumeModel (line 78) | enum VolumeModel {
function Operator (line 119) | Operator FLATBUFFERS_FINAL_CLASS {
function KSLL (line 141) | uint8_t KSLL() const {
function SusRel (line 147) | uint8_t SusRel() const {
function FLATBUFFERS_FINAL_CLASS (line 156) | struct Instrument FLATBUFFERS_FINAL_CLASS : private flatbuffers::Table {
function add_name (line 246) | struct InstrumentBuilder {
function add_keyOffset1 (line 255) | void add_keyOffset1(int16_t keyOffset1) {
function add_keyOffset2 (line 258) | void add_keyOffset2(int16_t keyOffset2) {
function add_velocityOffset (line 261) | void add_velocityOffset(int8_t velocityOffset) {
function add_secondVoiceTuning (line 264) | void add_secondVoiceTuning(int8_t secondVoiceTuning) {
function add_percussionKey (line 267) | void add_percussionKey(uint8_t percussionKey) {
function add_mode (line 270) | void add_mode(Mode mode) {
function add_fb_conn1 (line 273) | void add_fb_conn1(uint8_t fb_conn1) {
function add_fb_conn2 (line 276) | void add_fb_conn2(uint8_t fb_conn2) {
function add_modulator1 (line 279) | void add_modulator1(const Operator *modulator1) {
function add_carrier1 (line 282) | void add_carrier1(const Operator *carrier1) {
function add_modulator2 (line 285) | void add_modulator2(const Operator *modulator2) {
function add_carrier2 (line 288) | void add_carrier2(const Operator *carrier2) {
function add_konMs (line 291) | void add_konMs(uint16_t konMs) {
function add_koffMs (line 294) | void add_koffMs(uint16_t koffMs) {
function explicit (line 297) | explicit InstrumentBuilder(flatbuffers::FlatBufferBuilder &_fbb)
function FLATBUFFERS_FINAL_CLASS (line 385) | struct Bank FLATBUFFERS_FINAL_CLASS : private flatbuffers::Table {
function add_type (line 422) | struct BankBuilder {
function add_bankLSB (line 431) | void add_bankLSB(uint8_t bankLSB) {
function add_bankMSB (line 434) | void add_bankMSB(uint8_t bankMSB) {
function add_instruments (line 437) | void add_instruments(flatbuffers::Offset<flatbuffers::Vector<flatbuffers...
function explicit (line 440) | explicit BankBuilder(flatbuffers::FlatBufferBuilder &_fbb)
function FLATBUFFERS_FINAL_CLASS (line 484) | struct Opl3Bank FLATBUFFERS_FINAL_CLASS : private flatbuffers::Table {
function add_oplTV (line 515) | struct Opl3BankBuilder {
function add_volumeModel (line 524) | void add_volumeModel(VolumeModel volumeModel) {
function add_banks (line 527) | void add_banks(flatbuffers::Offset<flatbuffers::Vector<flatbuffers::Offs...
function explicit (line 530) | explicit Opl3BankBuilder(flatbuffers::FlatBufferBuilder &_fbb)
function Opl3Bank (line 570) | inline const Opl3Bank *GetOpl3Bank(const void *buf) {
function Opl3Bank (line 574) | inline const Opl3Bank *GetSizePrefixedOpl3Bank(const void *buf) {
function Opl3BankBufferHasIdentifier (line 582) | inline bool Opl3BankBufferHasIdentifier(const void *buf) {
function VerifyOpl3BankBuffer (line 587) | inline bool VerifyOpl3BankBuffer(
function VerifySizePrefixedOpl3BankBuffer (line 592) | inline bool VerifySizePrefixedOpl3BankBuffer(
function FinishOpl3BankBuffer (line 597) | inline void FinishOpl3BankBuffer(
function FinishSizePrefixedOpl3BankBuffer (line 603) | inline void FinishSizePrefixedOpl3BankBuffer(
FILE: src/FileFormats/ffmt_base.cpp
function FfmtErrCode (line 43) | FfmtErrCode FmBankFormatBase::loadFile(QString, FmBank &)
function FfmtErrCode (line 48) | FfmtErrCode FmBankFormatBase::saveFile(QString, FmBank &)
function FfmtErrCode (line 53) | FfmtErrCode FmBankFormatBase::loadFileInst(QString, FmBank::Instrument &...
function FfmtErrCode (line 58) | FfmtErrCode FmBankFormatBase::saveFileInst(QString, FmBank::Instrument &...
function QString (line 73) | QString FmBankFormatBase::formatInstName() const
function QString (line 78) | QString FmBankFormatBase::formatInstModuleName() const
function QString (line 83) | QString FmBankFormatBase::formatInstExtensionMask() const
function QString (line 88) | QString FmBankFormatBase::formatInstDefaultExtension() const
function QString (line 93) | QString FmBankFormatBase::formatName() const
function QString (line 98) | QString FmBankFormatBase::formatModuleName() const
function QString (line 103) | QString FmBankFormatBase::formatExtensionMask() const
function QString (line 108) | QString FmBankFormatBase::formatDefaultExtension() const
function BankFormats (line 113) | BankFormats FmBankFormatBase::formatId() const
function InstFormats (line 118) | InstFormats FmBankFormatBase::formatInstId() const
function QString (line 123) | QString FmBankFormatBase::formatExtensionMaskCase() const
function QString (line 129) | QString FmBankFormatBase::formatInstExtensionMaskCase() const
FILE: src/FileFormats/ffmt_base.h
function class (line 32) | class FmBankFormatBase
FILE: src/FileFormats/ffmt_enums.cpp
function QString (line 23) | QString FileFormats::getErrorText(FfmtErrCode err)
FILE: src/FileFormats/ffmt_enums.h
type class (line 25) | enum class
type class (line 65) | enum class
type class (line 78) | enum class
type class (line 108) | enum class
function namespace (line 127) | namespace FileFormats
FILE: src/FileFormats/ffmt_factory.cpp
function registerBankFormat (line 62) | static void registerBankFormat(FmBankFormatBase *format)
function registerInstFormat (line 72) | static void registerInstFormat(FmBankFormatBase *format)
function QString (line 157) | QString FmBankFormatFactory::getSaveFiltersList()
function QString (line 175) | QString FmBankFormatFactory::getOpenFiltersList(bool import)
function QString (line 211) | QString FmBankFormatFactory::getInstOpenFiltersList(bool import)
function QString (line 244) | QString FmBankFormatFactory::getInstSaveFiltersList()
function fillBankFmtList (line 260) | static void fillBankFmtList(QList<const FmBankFormatBase *> &dest, FmBan...
function BankFormats (line 280) | BankFormats FmBankFormatFactory::getFormatFromFilter(QString filter)
function QString (line 293) | QString FmBankFormatFactory::getFilterFromFormat(BankFormats format, int...
function InstFormats (line 305) | InstFormats FmBankFormatFactory::getInstFormatFromFilter(QString filter)
function QString (line 318) | QString FmBankFormatFactory::getInstFilterFromFormat(InstFormats format,...
function QString (line 352) | QString FmBankFormatFactory::formatName(BankFormats format)
function FfmtErrCode (line 365) | FfmtErrCode FmBankFormatFactory::OpenBankFile(QString filePath, FmBank &...
function FfmtErrCode (line 398) | FfmtErrCode FmBankFormatFactory::ImportBankFile(QString filePath, FmBank...
function FfmtErrCode (line 431) | FfmtErrCode FmBankFormatFactory::SaveBankFile(QString &filePath, FmBank ...
function FfmtErrCode (line 453) | FfmtErrCode FmBankFormatFactory::OpenInstrumentFile(QString filePath,
function FfmtErrCode (line 483) | FfmtErrCode FmBankFormatFactory::SaveInstrumentFile(QString &filePath, F...
FILE: src/FileFormats/ffmt_factory.h
function class (line 31) | class FmBankFormatFactory
FILE: src/FileFormats/format_adlib_bnk.cpp
function VERIFY_BYTE (line 33) | inline void VERIFY_BYTE(uint8_t ¶m, uint8_t mask)
class AdLibBnk_impl (line 55) | class AdLibBnk_impl
type BnkType (line 58) | enum BnkType
function FfmtErrCode (line 98) | FfmtErrCode AdLibBnk_impl::loadBankFile(QString filePath, FmBank &bank, ...
function FfmtErrCode (line 352) | FfmtErrCode AdLibBnk_impl::saveBankFile(QString filePath, FmBank &bank, ...
function FfmtErrCode (line 649) | FfmtErrCode AdLibAndHmiBnk_reader::loadFile(QString filePath, FmBank &bank)
function QString (line 665) | QString AdLibAndHmiBnk_reader::formatName() const
function QString (line 670) | QString AdLibAndHmiBnk_reader::formatModuleName() const
function QString (line 675) | QString AdLibAndHmiBnk_reader::formatExtensionMask() const
function BankFormats (line 680) | BankFormats AdLibAndHmiBnk_reader::formatId() const
function adlib_ins_insRawToOp (line 699) | bool adlib_ins_insRawToOp(FmBank::Instrument &inst, const int opType, co...
function adlib_ins_opToRawIns (line 725) | void adlib_ins_opToRawIns(const FmBank::Instrument &inst, const int opTy...
function FfmtErrCode (line 744) | FfmtErrCode AdLibAndHmiBnk_reader::loadFileInst(QString filePath, FmBank...
function FfmtErrCode (line 809) | FfmtErrCode AdLibAndHmiBnk_reader::saveFileInst(QString filePath, FmBank...
function QString (line 845) | QString AdLibAndHmiBnk_reader::formatInstName() const
function QString (line 850) | QString AdLibAndHmiBnk_reader::formatInstModuleName() const
function QString (line 855) | QString AdLibAndHmiBnk_reader::formatInstExtensionMask() const
function QString (line 860) | QString AdLibAndHmiBnk_reader::formatInstDefaultExtension() const
function InstFormats (line 865) | InstFormats AdLibAndHmiBnk_reader::formatInstId() const
function FfmtErrCode (line 874) | FfmtErrCode AdLibBnk_writer::saveFile(QString filePath, FmBank &bank)
function QString (line 884) | QString AdLibBnk_writer::formatName() const
function QString (line 889) | QString AdLibBnk_writer::formatModuleName() const
function QString (line 894) | QString AdLibBnk_writer::formatExtensionMask() const
function QString (line 899) | QString AdLibBnk_writer::formatDefaultExtension() const
function BankFormats (line 904) | BankFormats AdLibBnk_writer::formatId() const
function FfmtErrCode (line 913) | FfmtErrCode HmiBnk_writer::saveFile(QString filePath, FmBank &bank)
function QString (line 925) | QString HmiBnk_writer::formatName() const
function QString (line 930) | QString HmiBnk_writer::formatModuleName() const
function QString (line 935) | QString HmiBnk_writer::formatExtensionMask() const
function QString (line 940) | QString HmiBnk_writer::formatDefaultExtension() const
function BankFormats (line 945) | BankFormats HmiBnk_writer::formatId() const
function FfmtErrCode (line 952) | FfmtErrCode HmiBnk_Drums_writer::saveFile(QString filePath, FmBank &bank)
function QString (line 964) | QString HmiBnk_Drums_writer::formatName() const
function QString (line 969) | QString HmiBnk_Drums_writer::formatModuleName() const
function QString (line 974) | QString HmiBnk_Drums_writer::formatExtensionMask() const
function QString (line 979) | QString HmiBnk_Drums_writer::formatDefaultExtension() const
function BankFormats (line 984) | BankFormats HmiBnk_Drums_writer::formatId() const
FILE: src/FileFormats/format_adlib_tim.cpp
function FfmtErrCode (line 75) | FfmtErrCode AdLibTimbre::loadFile(QString filePath, FmBank &bank)
function FfmtErrCode (line 161) | FfmtErrCode AdLibTimbre::saveFile(QString filePath, FmBank &bank)
function QString (line 213) | QString AdLibTimbre::formatName() const
function QString (line 218) | QString AdLibTimbre::formatModuleName() const
function QString (line 223) | QString AdLibTimbre::formatExtensionMask() const
function QString (line 228) | QString AdLibTimbre::formatDefaultExtension() const
function BankFormats (line 233) | BankFormats AdLibTimbre::formatId() const
FILE: src/FileFormats/format_adlibgold_bnk2.cpp
function convertInstrument (line 31) | static void convertInstrument(
function FfmtErrCode (line 86) | FfmtErrCode AdLibGoldBnk2_reader::loadFile(QString filePath, FmBank &bank)
function QString (line 259) | QString AdLibGoldBnk2_reader::formatName() const
function QString (line 264) | QString AdLibGoldBnk2_reader::formatModuleName() const
function QString (line 269) | QString AdLibGoldBnk2_reader::formatExtensionMask() const
function QString (line 274) | QString AdLibGoldBnk2_reader::formatDefaultExtension() const
function BankFormats (line 279) | BankFormats AdLibGoldBnk2_reader::formatId() const
FILE: src/FileFormats/format_ail2_gtl.cpp
type GTL_Head (line 93) | struct GTL_Head // GTL file header entry structure
function FfmtErrCode (line 100) | FfmtErrCode AIL_GTL::loadFile(QString filePath, FmBank &bank)
function FfmtErrCode (line 245) | FfmtErrCode AIL_GTL::saveFile(QString filePath, FmBank &bank)
function QString (line 374) | QString AIL_GTL::formatName() const
function QString (line 379) | QString AIL_GTL::formatExtensionMask() const
function QString (line 384) | QString AIL_GTL::formatDefaultExtension() const
function BankFormats (line 389) | BankFormats AIL_GTL::formatId() const
FILE: src/FileFormats/format_apogeetmb.cpp
function FfmtErrCode (line 34) | FfmtErrCode ApogeeTMB::loadFile(QString filePath, FmBank &bank)
function FfmtErrCode (line 84) | FfmtErrCode ApogeeTMB::saveFile(QString filePath, FmBank &bank)
function QString (line 135) | QString ApogeeTMB::formatName() const
function QString (line 140) | QString ApogeeTMB::formatExtensionMask() const
function QString (line 145) | QString ApogeeTMB::formatDefaultExtension() const
function BankFormats (line 150) | BankFormats ApogeeTMB::formatId() const
FILE: src/FileFormats/format_bisqwit.cpp
function FfmtErrCode (line 34) | FfmtErrCode BisqwitBank::loadFile(QString filePath, FmBank &bank)
function FfmtErrCode (line 93) | FfmtErrCode BisqwitBank::saveFile(QString filePath, FmBank &bank)
function QString (line 162) | QString BisqwitBank::formatName() const
function QString (line 167) | QString BisqwitBank::formatExtensionMask() const
function QString (line 172) | QString BisqwitBank::formatDefaultExtension() const
function BankFormats (line 177) | BankFormats BisqwitBank::formatId() const
FILE: src/FileFormats/format_cmf_importer.cpp
function FfmtErrCode (line 29) | FfmtErrCode CMF_Importer::loadFile(QString filePath, FmBank &bank)
function QString (line 128) | QString CMF_Importer::formatName() const
function QString (line 133) | QString CMF_Importer::formatModuleName() const
function QString (line 138) | QString CMF_Importer::formatExtensionMask() const
function BankFormats (line 143) | BankFormats CMF_Importer::formatId() const
FILE: src/FileFormats/format_cmf_importer.h
function class (line 27) | class CMF_Importer : public FmBankFormatBase
FILE: src/FileFormats/format_dmxopl2.cpp
function FfmtErrCode (line 29) | FfmtErrCode DmxOPL2::loadFile(QString filePath, FmBank &bank)
function FfmtErrCode (line 142) | FfmtErrCode DmxOPL2::saveFile(QString filePath, FmBank &bank)
function QString (line 259) | QString DmxOPL2::formatName() const
function QString (line 264) | QString DmxOPL2::formatExtensionMask() const
function QString (line 269) | QString DmxOPL2::formatDefaultExtension() const
function BankFormats (line 274) | BankFormats DmxOPL2::formatId() const
FILE: src/FileFormats/format_dmxopl2.h
type DmxFlags (line 30) | enum DmxFlags
FILE: src/FileFormats/format_dro_importer.cpp
function readUIntLE (line 24) | static bool readUIntLE(QIODevice &in, T *p)
function FfmtErrCode (line 42) | FfmtErrCode DRO_Importer::loadFile(QString filePath, FmBank &bank)
function QString (line 71) | QString DRO_Importer::formatName() const
function QString (line 76) | QString DRO_Importer::formatModuleName() const
function QString (line 81) | QString DRO_Importer::formatExtensionMask() const
function BankFormats (line 86) | BankFormats DRO_Importer::formatId() const
type OplModeV1 (line 91) | enum OplModeV1
type OplModeV2 (line 98) | enum OplModeV2
function FfmtErrCode (line 105) | FfmtErrCode DRO_Importer::loadFileV1(QFile &file, FmBank &bank)
function FfmtErrCode (line 194) | FfmtErrCode DRO_Importer::loadFileV2(QFile &file, FmBank &bank)
FILE: src/FileFormats/format_dro_importer.h
function class (line 28) | class DRO_Importer : public FmBankFormatBase
FILE: src/FileFormats/format_ea_importer.cpp
function FfmtErrCode (line 47) | FfmtErrCode EaAdLib_Importer::loadFile(QString filePath, FmBank &bank)
function QString (line 176) | QString EaAdLib_Importer::formatName() const
function QString (line 181) | QString EaAdLib_Importer::formatModuleName() const
function QString (line 186) | QString EaAdLib_Importer::formatExtensionMask() const
function BankFormats (line 191) | BankFormats EaAdLib_Importer::formatId() const
FILE: src/FileFormats/format_ea_importer.h
function class (line 24) | class EaAdLib_Importer : public FmBankFormatBase
FILE: src/FileFormats/format_flatbuffer_opl3.cpp
function FfmtErrCode (line 38) | FfmtErrCode FlatbufferOpl3::loadFile(QString filePath, FmBank& bank)
function FfmtErrCode (line 185) | FfmtErrCode FlatbufferOpl3::saveFile(QString filePath, FmBank& bank)
function QString (line 327) | QString FlatbufferOpl3::formatName() const
function QString (line 332) | QString FlatbufferOpl3::formatExtensionMask() const
function QString (line 337) | QString FlatbufferOpl3::formatDefaultExtension() const
function BankFormats (line 342) | BankFormats FlatbufferOpl3::formatId() const
FILE: src/FileFormats/format_imf_importer.cpp
function FfmtErrCode (line 59) | FfmtErrCode IMF_Importer::loadFile(QString filePath, FmBank &bank)
function QString (line 178) | QString IMF_Importer::formatName() const
function QString (line 183) | QString IMF_Importer::formatModuleName() const
function QString (line 188) | QString IMF_Importer::formatExtensionMask() const
function BankFormats (line 193) | BankFormats IMF_Importer::formatId() const
FILE: src/FileFormats/format_imf_importer.h
function class (line 27) | class IMF_Importer : public FmBankFormatBase
FILE: src/FileFormats/format_junlevizion.cpp
function FfmtErrCode (line 29) | FfmtErrCode JunleVizion::loadFile(QString filePath, FmBank &bank)
function FfmtErrCode (line 122) | FfmtErrCode JunleVizion::saveFile(QString filePath, FmBank &bank)
function QString (line 230) | QString JunleVizion::formatName() const
function QString (line 235) | QString JunleVizion::formatExtensionMask() const
function QString (line 240) | QString JunleVizion::formatDefaultExtension() const
function BankFormats (line 245) | BankFormats JunleVizion::formatId() const
FILE: src/FileFormats/format_klm_importer.cpp
function FfmtErrCode (line 47) | FfmtErrCode KLM_Importer::loadFile(QString filePath, FmBank &bank)
function QString (line 263) | QString KLM_Importer::formatName() const
function QString (line 268) | QString KLM_Importer::formatModuleName() const
function QString (line 273) | QString KLM_Importer::formatExtensionMask() const
function BankFormats (line 278) | BankFormats KLM_Importer::formatId() const
FILE: src/FileFormats/format_klm_importer.h
function class (line 27) | class KLM_Importer : public FmBankFormatBase
FILE: src/FileFormats/format_misc_cif.cpp
function FfmtErrCode (line 31) | FfmtErrCode Misc_CIF::loadFileInst(QString filePath, FmBank::Instrument&...
function QString (line 71) | QString Misc_CIF::formatInstName() const
function QString (line 76) | QString Misc_CIF::formatInstExtensionMask() const
function InstFormats (line 81) | InstFormats Misc_CIF::formatInstId() const
FILE: src/FileFormats/format_misc_hsc.cpp
function FfmtErrCode (line 29) | FfmtErrCode Misc_HSC::loadFileInst(QString filePath, FmBank::Instrument&...
function FfmtErrCode (line 56) | FfmtErrCode Misc_HSC::saveFileInst(QString filePath, FmBank::Instrument&...
function QString (line 88) | QString Misc_HSC::formatInstName() const
function QString (line 93) | QString Misc_HSC::formatInstExtensionMask() const
function QString (line 98) | QString Misc_HSC::formatInstDefaultExtension() const
function InstFormats (line 103) | InstFormats Misc_HSC::formatInstId() const
FILE: src/FileFormats/format_misc_sgi.cpp
function FfmtErrCode (line 41) | FfmtErrCode Misc_SGI::loadFileInst(QString filePath, FmBank::Instrument&...
function QString (line 83) | QString Misc_SGI::formatInstName() const
function QString (line 88) | QString Misc_SGI::formatInstExtensionMask() const
function InstFormats (line 93) | InstFormats Misc_SGI::formatInstId() const
FILE: src/FileFormats/format_patch_fm4.cpp
type Fm4Op (line 39) | struct Fm4Op
type Fm4Inst (line 48) | struct Fm4Inst
function FfmtErrCode (line 82) | FfmtErrCode PatchFm4::loadFile(QString filePath, FmBank& bank)
function FfmtErrCode (line 172) | FfmtErrCode PatchFm4::saveFile(QString filePath, FmBank& bank)
function QString (line 291) | QString PatchFm4::formatName() const
function QString (line 296) | QString PatchFm4::formatExtensionMask() const
function QString (line 301) | QString PatchFm4::formatDefaultExtension() const
function BankFormats (line 306) | BankFormats PatchFm4::formatId() const
FILE: src/FileFormats/format_patch_fm4.h
function class (line 24) | class PatchFm4 : public FmBankFormatBase
FILE: src/FileFormats/format_rad_importer.cpp
function FfmtErrCode (line 29) | FfmtErrCode RAD_Importer::loadFile(QString filePath, FmBank &bank)
function QString (line 131) | QString RAD_Importer::formatName() const
function QString (line 136) | QString RAD_Importer::formatModuleName() const
function QString (line 141) | QString RAD_Importer::formatExtensionMask() const
function BankFormats (line 146) | BankFormats RAD_Importer::formatId() const
FILE: src/FileFormats/format_rad_importer.h
function class (line 27) | class RAD_Importer : public FmBankFormatBase
FILE: src/FileFormats/format_sb_ibk.cpp
class SbIBK_impl (line 26) | class SbIBK_impl : public FmBankFormatBase
function raw2sbi (line 106) | static void raw2sbi(FmBank::Instrument &ins, uint8_t *idata, bool fourOp...
function sbi2raw (line 154) | static void sbi2raw(uint8_t *odata, FmBank::Instrument &ins, bool fourOp...
function FfmtErrCode (line 189) | FfmtErrCode SbIBK_impl::loadFileIBK(QString filePath, FmBank &bank, Bank...
function FfmtErrCode (line 289) | FfmtErrCode SbIBK_impl::saveFileIBK(QString filePath, FmBank &bank, bool...
function FfmtErrCode (line 337) | FfmtErrCode SbIBK_impl::loadFileSBI(QString filePath, FmBank::Instrument...
function FfmtErrCode (line 406) | FfmtErrCode SbIBK_impl::saveFileSBI(QString filePath, FmBank::Instrument...
function FfmtErrCode (line 432) | FfmtErrCode SbIBK_impl::loadFileSBOP(QString filePath, FmBank &bank, Ban...
function FfmtErrCode (line 529) | FfmtErrCode SbIBK_impl::saveFileSBOP(QString filePath, FmBank &bank, boo...
function FfmtErrCode (line 586) | FfmtErrCode SbIBK_DOS_READ::loadFile(QString filePath, FmBank &bank)
function QString (line 597) | QString SbIBK_DOS_READ::formatName() const
function QString (line 602) | QString SbIBK_DOS_READ::formatModuleName() const
function QString (line 607) | QString SbIBK_DOS_READ::formatExtensionMask() const
function QString (line 612) | QString SbIBK_DOS_READ::formatDefaultExtension() const
function BankFormats (line 617) | BankFormats SbIBK_DOS_READ::formatId() const
function FfmtErrCode (line 627) | FfmtErrCode SbIBK_DOS_READ::loadFileInst(QString filePath, FmBank::Instr...
function FfmtErrCode (line 632) | FfmtErrCode SbIBK_DOS_READ::saveFileInst(QString filePath, FmBank::Instr...
function QString (line 642) | QString SbIBK_DOS_READ::formatInstName() const
function QString (line 647) | QString SbIBK_DOS_READ::formatInstModuleName() const
function QString (line 652) | QString SbIBK_DOS_READ::formatInstExtensionMask() const
function QString (line 657) | QString SbIBK_DOS_READ::formatInstDefaultExtension() const
function InstFormats (line 662) | InstFormats SbIBK_DOS_READ::formatInstId() const
function FfmtErrCode (line 670) | FfmtErrCode SbIBK_DOS_WRITE::saveFile(QString filePath, FmBank &bank)
function QString (line 680) | QString SbIBK_DOS_WRITE::formatName() const
function QString (line 685) | QString SbIBK_DOS_WRITE::formatModuleName() const
function QString (line 690) | QString SbIBK_DOS_WRITE::formatExtensionMask() const
function QString (line 695) | QString SbIBK_DOS_WRITE::formatDefaultExtension() const
function BankFormats (line 700) | BankFormats SbIBK_DOS_WRITE::formatId() const
function FfmtErrCode (line 707) | FfmtErrCode SbIBK_DOS_DRUMS_WRITE::saveFile(QString filePath, FmBank &bank)
function QString (line 717) | QString SbIBK_DOS_DRUMS_WRITE::formatName() const
function QString (line 722) | QString SbIBK_DOS_DRUMS_WRITE::formatModuleName() const
function QString (line 727) | QString SbIBK_DOS_DRUMS_WRITE::formatExtensionMask() const
function QString (line 732) | QString SbIBK_DOS_DRUMS_WRITE::formatDefaultExtension() const
function BankFormats (line 737) | BankFormats SbIBK_DOS_DRUMS_WRITE::formatId() const
function FfmtErrCode (line 754) | FfmtErrCode SbIBK_UNIX_READ::loadFile(QString filePath, FmBank &bank)
function QString (line 764) | QString SbIBK_UNIX_READ::formatName() const
function QString (line 769) | QString SbIBK_UNIX_READ::formatModuleName() const
function QString (line 774) | QString SbIBK_UNIX_READ::formatExtensionMask() const
function BankFormats (line 779) | BankFormats SbIBK_UNIX_READ::formatId() const
function FfmtErrCode (line 789) | FfmtErrCode SbIBK_UNIX_READ::loadFileInst(QString filePath, FmBank::Inst...
function FfmtErrCode (line 849) | FfmtErrCode SbIBK_UNIX_READ::saveFileInst(QString filePath, FmBank::Inst...
function QString (line 891) | QString SbIBK_UNIX_READ::formatInstName() const
function QString (line 896) | QString SbIBK_UNIX_READ::formatInstModuleName() const
function QString (line 901) | QString SbIBK_UNIX_READ::formatInstExtensionMask() const
function QString (line 906) | QString SbIBK_UNIX_READ::formatInstDefaultExtension() const
function InstFormats (line 911) | InstFormats SbIBK_UNIX_READ::formatInstId() const
function FfmtErrCode (line 919) | FfmtErrCode SbIBK_UNIX2OP_SAVE::saveFile(QString filePath, FmBank &bank)
function QString (line 931) | QString SbIBK_UNIX2OP_SAVE::formatName() const
function QString (line 936) | QString SbIBK_UNIX2OP_SAVE::formatModuleName() const
function QString (line 941) | QString SbIBK_UNIX2OP_SAVE::formatExtensionMask() const
function QString (line 946) | QString SbIBK_UNIX2OP_SAVE::formatDefaultExtension() const
function BankFormats (line 951) | BankFormats SbIBK_UNIX2OP_SAVE::formatId() const
function FfmtErrCode (line 958) | FfmtErrCode SbIBK_UNIX2OP_DRUMS_SAVE::saveFile(QString filePath, FmBank ...
function QString (line 970) | QString SbIBK_UNIX2OP_DRUMS_SAVE::formatName() const
function QString (line 975) | QString SbIBK_UNIX2OP_DRUMS_SAVE::formatModuleName() const
function QString (line 980) | QString SbIBK_UNIX2OP_DRUMS_SAVE::formatExtensionMask() const
function QString (line 985) | QString SbIBK_UNIX2OP_DRUMS_SAVE::formatDefaultExtension() const
function BankFormats (line 990) | BankFormats SbIBK_UNIX2OP_DRUMS_SAVE::formatId() const
function FfmtErrCode (line 998) | FfmtErrCode SbIBK_UNIX4OP_SAVE::saveFile(QString filePath, FmBank &bank)
function QString (line 1010) | QString SbIBK_UNIX4OP_SAVE::formatName() const
function QString (line 1015) | QString SbIBK_UNIX4OP_SAVE::formatModuleName() const
function QString (line 1020) | QString SbIBK_UNIX4OP_SAVE::formatExtensionMask() const
function QString (line 1025) | QString SbIBK_UNIX4OP_SAVE::formatDefaultExtension() const
function BankFormats (line 1030) | BankFormats SbIBK_UNIX4OP_SAVE::formatId() const
function FfmtErrCode (line 1036) | FfmtErrCode SbIBK_UNIX4OP_DRUMS_SAVE::saveFile(QString filePath, FmBank ...
function QString (line 1048) | QString SbIBK_UNIX4OP_DRUMS_SAVE::formatName() const
function QString (line 1053) | QString SbIBK_UNIX4OP_DRUMS_SAVE::formatModuleName() const
function QString (line 1058) | QString SbIBK_UNIX4OP_DRUMS_SAVE::formatExtensionMask() const
function QString (line 1063) | QString SbIBK_UNIX4OP_DRUMS_SAVE::formatDefaultExtension() const
function BankFormats (line 1068) | BankFormats SbIBK_UNIX4OP_DRUMS_SAVE::formatId() const
FILE: src/FileFormats/format_smaf_importer.cpp
function s_readInstrumentMA1 (line 36) | static bool s_readInstrumentMA1(uint8_t *pBuf, FmBank::Instrument &inst)
function s_readInstrumentMA2 (line 129) | static bool s_readInstrumentMA2(uint8_t *pBuf, FmBank::Instrument &inst)
function FfmtErrCode (line 246) | FfmtErrCode SMAF_Importer::loadFile(QString filePath, FmBank &bank)
function QString (line 360) | QString SMAF_Importer::formatName() const
function QString (line 365) | QString SMAF_Importer::formatModuleName() const
function QString (line 370) | QString SMAF_Importer::formatExtensionMask() const
function BankFormats (line 375) | BankFormats SMAF_Importer::formatId() const
FILE: src/FileFormats/format_vgm_import.cpp
function FfmtErrCode (line 58) | FfmtErrCode VGM_Importer::loadFile(QString filePath, FmBank &bank)
function FfmtErrCode (line 101) | FfmtErrCode VGM_Importer::load(QIODevice &file, FmBank &bank)
function QString (line 230) | QString VGM_Importer::formatName() const
function QString (line 235) | QString VGM_Importer::formatModuleName() const
function QString (line 240) | QString VGM_Importer::formatExtensionMask() const
function BankFormats (line 245) | BankFormats VGM_Importer::formatId() const
function make_size_table (line 250) | static void make_size_table(uint8_t *table, unsigned version)
function gzFile (line 346) | static gzFile gzopen_q(const QString &path, const char *mode)
FILE: src/FileFormats/format_wohlstand_opl3.cpp
function readInstrument (line 51) | static bool readInstrument(QFile &file, FmBank::Instrument &ins, uint16_...
function cvt_WOPLI_to_FMIns (line 121) | static void cvt_WOPLI_to_FMIns(FmBank::Instrument &out, WOPLInstrument &in)
function cvt_FMIns_to_WOPLI (line 172) | static void cvt_FMIns_to_WOPLI(FmBank::Instrument &in, WOPLInstrument &o...
function writeInstrument (line 220) | static bool writeInstrument(QFile &file, FmBank::Instrument &ins, bool h...
function FfmtErrCode (line 277) | FfmtErrCode WohlstandOPL3::loadFile(QString filePath, FmBank &bank)
function FfmtErrCode (line 338) | FfmtErrCode WohlstandOPL3::saveFile(QString filePath, FmBank &bank)
function QString (line 405) | QString WohlstandOPL3::formatName() const
function QString (line 410) | QString WohlstandOPL3::formatExtensionMask() const
function QString (line 415) | QString WohlstandOPL3::formatDefaultExtension() const
function BankFormats (line 420) | BankFormats WohlstandOPL3::formatId() const
function FfmtErrCode (line 425) | FfmtErrCode WohlstandOPL3::loadFileInst(QString filePath, FmBank::Instru...
function FfmtErrCode (line 454) | FfmtErrCode WohlstandOPL3::saveFileInst(QString filePath, FmBank::Instru...
function QString (line 478) | QString WohlstandOPL3::formatInstName() const
function QString (line 483) | QString WohlstandOPL3::formatInstExtensionMask() const
function QString (line 488) | QString WohlstandOPL3::formatInstDefaultExtension() const
function InstFormats (line 493) | InstFormats WohlstandOPL3::formatInstId() const
function FfmtErrCode (line 501) | FfmtErrCode WohlstandOPL3_GM::saveFile(QString filePath, FmBank &bank)
function QString (line 523) | QString WohlstandOPL3_GM::formatName() const
function QString (line 528) | QString WohlstandOPL3_GM::formatModuleName() const
function QString (line 533) | QString WohlstandOPL3_GM::formatExtensionMask() const
function QString (line 538) | QString WohlstandOPL3_GM::formatDefaultExtension() const
function BankFormats (line 543) | BankFormats WohlstandOPL3_GM::formatId() const
FILE: src/FileFormats/format_wohlstand_opl3_text.cpp
function FILE (line 31) | static FILE *qfopen(const QString &file, const QString &mode)
function str_starts_with (line 48) | static bool str_starts_with(const char *line, size_t line_len, const cha...
function woplx_read_inst_line (line 68) | static bool woplx_read_inst_line(const char *line, size_t line_len, FmBa...
function woplx_write_inst (line 345) | static void woplx_write_inst(FILE *out, const FmBank::Instrument &ins, b...
function FfmtErrCode (line 431) | FfmtErrCode WohlstandOPL3TeXt::loadFile(QString filePath, FmBank &bank)
function FfmtErrCode (line 690) | FfmtErrCode WohlstandOPL3TeXt::saveFile(QString filePath, FmBank &bank)
function QString (line 779) | QString WohlstandOPL3TeXt::formatName() const
function QString (line 785) | QString WohlstandOPL3TeXt::formatExtensionMask() const
function QString (line 791) | QString WohlstandOPL3TeXt::formatDefaultExtension() const
function BankFormats (line 797) | BankFormats WohlstandOPL3TeXt::formatId() const
function FfmtErrCode (line 802) | FfmtErrCode WohlstandOPL3TeXt::loadFileInst(QString filePath, FmBank::In...
function FfmtErrCode (line 849) | FfmtErrCode WohlstandOPL3TeXt::saveFileInst(QString filePath, FmBank::In...
function QString (line 870) | QString WohlstandOPL3TeXt::formatInstName() const
function QString (line 875) | QString WohlstandOPL3TeXt::formatInstExtensionMask() const
function QString (line 880) | QString WohlstandOPL3TeXt::formatInstDefaultExtension() const
function InstFormats (line 885) | InstFormats WohlstandOPL3TeXt::formatInstId() const
FILE: src/FileFormats/format_wohlstand_opl3_text.h
function class (line 25) | class WohlstandOPL3TeXt : public FmBankFormatBase
FILE: src/FileFormats/wopl/wopl_file.c
function toUint16LE (line 37) | static uint16_t toUint16LE(const uint8_t *arr)
function toUint16BE (line 44) | static uint16_t toUint16BE(const uint8_t *arr)
function toSint16BE (line 51) | static int16_t toSint16BE(const uint8_t *arr)
function fromUint16LE (line 59) | static void fromUint16LE(uint16_t in, uint8_t *arr)
function fromUint16BE (line 65) | static void fromUint16BE(uint16_t in, uint8_t *arr)
function fromSint16BE (line 71) | static void fromSint16BE(int16_t in, uint8_t *arr)
function WOPLFile (line 78) | WOPLFile *WOPL_Init(uint16_t melodic_banks, uint16_t percussive_banks)
function WOPL_Free (line 107) | void WOPL_Free(WOPLFile *file)
function WOPL_BanksCmp (line 119) | int WOPL_BanksCmp(const WOPLFile *bank1, const WOPLFile *bank2)
function WOPL_parseInstrument (line 144) | static void WOPL_parseInstrument(WOPLInstrument *ins, uint8_t *cursor, u...
function WOPL_writeInstrument (line 173) | static void WOPL_writeInstrument(WOPLInstrument *ins, uint8_t *cursor, u...
function WOPLFile (line 202) | WOPLFile *WOPL_LoadBankFromMem(void *mem, size_t length, int *error)
function WOPL_LoadInstFromMem (line 341) | int WOPL_LoadInstFromMem(WOPIFile *file, void *mem, size_t length)
function WOPL_CalculateBankFileSize (line 395) | size_t WOPL_CalculateBankFileSize(WOPLFile *file, uint16_t version)
function WOPL_CalculateInstFileSize (line 435) | size_t WOPL_CalculateInstFileSize(WOPIFile *file, uint16_t version)
function WOPL_SaveBankToMem (line 463) | int WOPL_SaveBankToMem(WOPLFile *file, void *dest_mem, size_t length, ui...
function WOPL_SaveInstToMem (line 552) | int WOPL_SaveInstToMem(WOPIFile *file, void *dest_mem, size_t length, ui...
FILE: src/FileFormats/wopl/wopl_file.h
type WOPLFileFlags (line 58) | typedef enum WOPLFileFlags
type WOPL_VolumeModel (line 69) | typedef enum WOPL_VolumeModel
type WOPL_InstrumentFlags (line 83) | typedef enum WOPL_InstrumentFlags
type WOPL_RhythmMode (line 103) | typedef enum WOPL_RhythmMode
type WOPL_RhythmMode (line 118) | typedef WOPL_RhythmMode WOPL_RythmMode;
type WOPL_ErrorCodes (line 121) | typedef enum WOPL_ErrorCodes
type WOPLOperator (line 145) | typedef struct WOPLOperator
type WOPLInstrument (line 160) | typedef struct WOPLInstrument
type WOPLBank (line 189) | typedef struct WOPLBank
type WOPIFile (line 202) | typedef struct WOPIFile
type WOPLFile (line 213) | typedef struct WOPLFile
FILE: src/FileFormats/ymf262_to_wopi.cpp
function operatorOfRegister (line 83) | static unsigned operatorOfRegister(unsigned reg)
function operatorRole (line 177) | static bool operatorRole(unsigned opno, bool en_4op, bool con1, bool con2)
FILE: src/FileFormats/ymf262_to_wopi.h
function class (line 30) | class RawYmf262ToWopi
FILE: src/audio.cpp
function keyToNote (line 122) | static int keyToNote(int k)
FILE: src/audio/ao_rtaudio.cpp
function QString (line 38) | QString AudioOutRt::errorString() const
function catch (line 74) | catch(RtAudioError& error)
FILE: src/audio/ao_rtaudio.h
function class (line 29) | class AudioOutRt : public QObject
FILE: src/audio/for-mingw-9x/dsound.h
type D3DVALUE (line 37) | typedef float D3DVALUE, *LPD3DVALUE;
type DWORD (line 40) | typedef DWORD D3DCOLOR, *LPD3DCOLOR;
type D3DVECTOR (line 45) | typedef struct _D3DVECTOR {
type D3DVECTOR (line 54) | typedef D3DVECTOR *LPD3DVECTOR;
type IDirectSound (line 71) | struct IDirectSound
type IDirectSound8 (line 74) | struct IDirectSound8
type IDirectSoundBuffer (line 77) | struct IDirectSoundBuffer
type IDirectSoundBuffer8 (line 80) | struct IDirectSoundBuffer8
type IDirectSoundNotify (line 83) | struct IDirectSoundNotify
type IDirectSound3DListener (line 87) | struct IDirectSound3DListener
type IDirectSound3DBuffer (line 90) | struct IDirectSound3DBuffer
type IDirectSoundCapture (line 93) | struct IDirectSoundCapture
type IDirectSoundCapture8 (line 95) | typedef struct IDirectSoundCapture IDirectSoundCapture8,*LPDIRECTSOUNDCA...
type IDirectSoundCaptureBuffer (line 98) | struct IDirectSoundCaptureBuffer
type IDirectSoundCaptureBuffer8 (line 101) | struct IDirectSoundCaptureBuffer8
type IDirectSoundFullDuplex (line 104) | struct IDirectSoundFullDuplex
type DSCAPS (line 175) | typedef struct _DSCAPS
type DSCAPS (line 202) | typedef const DSCAPS *LPCDSCAPS;
type DSBCAPS (line 257) | typedef struct _DSBCAPS
type DSBCAPS (line 265) | typedef const DSBCAPS *LPCDSBCAPS;
type DSEFFECTDESC (line 272) | typedef struct _DSEFFECTDESC
type DSEFFECTDESC (line 280) | typedef const DSEFFECTDESC *LPCDSEFFECTDESC;
type DSBUFFERDESC1 (line 296) | typedef struct _DSBUFFERDESC1
type DSBUFFERDESC1 (line 304) | typedef const DSBUFFERDESC1 *LPCDSBUFFERDESC1;
type DSBUFFERDESC (line 306) | typedef struct _DSBUFFERDESC
type DSBUFFERDESC (line 317) | typedef const DSBUFFERDESC *LPCDSBUFFERDESC;
type DSBPOSITIONNOTIFY (line 319) | typedef struct _DSBPOSITIONNOTIFY
type DSBPOSITIONNOTIFY (line 324) | typedef const DSBPOSITIONNOTIFY *LPCDSBPOSITIONNOTIFY;
type DSCEFFECTDESC (line 353) | typedef struct _DSCEFFECTDESC
type DSCEFFECTDESC (line 362) | typedef const DSCEFFECTDESC *LPCDSCEFFECTDESC;
type DSCBUFFERDESC1 (line 370) | typedef struct _DSCBUFFERDESC1
type DSCBUFFERDESC (line 379) | typedef struct _DSCBUFFERDESC
type DSCBUFFERDESC (line 391) | typedef const DSCBUFFERDESC *LPCDSCBUFFERDESC;
type DSCCAPS (line 393) | typedef struct _DSCCAPS
type DSCCAPS (line 400) | typedef const DSCCAPS *LPCDSCCAPS;
type DSCBCAPS (line 402) | typedef struct _DSCBCAPS
type DSCBCAPS (line 409) | typedef const DSCBCAPS *LPCDSCBCAPS;
type GUID (line 427) | typedef const GUID *LPCGUID;
type LPCWSTR (line 430) | typedef WINBOOL (CALLBACK *LPDSENUMCALLBACKW)(LPGUID,LPCWSTR,LPCWSTR,LPV...
type LPCSTR (line 431) | typedef WINBOOL (CALLBACK *LPDSENUMCALLBACKA)(LPGUID,LPCSTR,LPCSTR,LPVOID);
type LPDSENUMCALLBACKW (line 433) | typedef LPDSENUMCALLBACKW LPDSENUMCALLBACK;
type LPDSENUMCALLBACKA (line 435) | typedef LPDSENUMCALLBACKA LPDSENUMCALLBACK;
type DS3DLISTENER (line 977) | typedef struct _DS3DLISTENER {
type DS3DLISTENER (line 988) | typedef const DS3DLISTENER *LPCDS3DLISTENER;
type IKsPropertySet (line 1165) | struct IKsPropertySet
FILE: src/audio_config.cpp
function QString (line 56) | QString AudioConfigDialog::deviceName() const
function QString (line 66) | QString AudioConfigDialog::driverName() const
FILE: src/audio_config.h
function namespace (line 24) | namespace Ui { class AudioConfigDialog; }
function class (line 27) | class AudioConfigDialog : public QDialog
FILE: src/bank.cpp
function FmBank (line 46) | FmBank &FmBank::operator=(const FmBank &fb)
FILE: src/bank.h
function class (line 36) | class FmBank
function class (line 418) | class TmpBank
FILE: src/bank_comparison.cpp
type Qt (line 26) | namespace Qt {
function QString (line 27) | static inline QString escape(const QString &s) { return s.toHtmlEscape...
function QString (line 119) | QString BankCompareDialog::checkOnlyIn(unsigned spec, const QString &nam...
function QString (line 164) | QString BankCompareDialog::checkDifferences(unsigned spec, uint32_t id, ...
function QString (line 300) | QString BankCompareDialog::tabulateDiffElements(const std::vector<DiffEl...
function QString (line 319) | QString BankCompareDialog::stringOfId(uint32_t id)
function QString (line 341) | QString BankCompareDialog::nameOfInstrument(unsigned spec, const FmBank:...
function QString (line 357) | QString BankCompareDialog::nameOfMidiBank(unsigned spec, const FmBank::M...
FILE: src/bank_comparison.h
function namespace (line 30) | namespace Ui { class BankCompareDialog; }
function class (line 32) | class BankCompareDialog : public QDialog
FILE: src/bank_editor.cpp
function setInstrumentMetaInfo (line 64) | static void setInstrumentMetaInfo(QListWidgetItem *item, int index)
function QIcon (line 72) | static QIcon makeWindowIcon()
function foreach (line 446) | foreach(const QUrl &url, e->mimeData()->urls())
function QString (line 841) | QString BankEditor::getInstrumentName(int instrument, bool isAuto, bool ...
function QString (line 861) | QString BankEditor::getBankName(int bank, bool isAuto, bool isPerc)
function instrumentFromClipboard (line 990) | static bool instrumentFromClipboard(FmBank::Instrument &inst)
function foreach (line 1533) | foreach(const QString &entry, dir.entryList())
function foreach (line 1545) | foreach(const QString &lang, languages)
FILE: src/bank_editor.h
function namespace (line 41) | namespace Ui
function class (line 53) | class BankEditor : public QMainWindow
FILE: src/bank_type_dlg.h
function class (line 9) | class BankType : public QDialog
FILE: src/common.cpp
function qint64 (line 28) | qint64 readLE(QFile &file, uint16_t &out)
function qint64 (line 38) | qint64 readLE(QFile &file, uint32_t &out)
function qint64 (line 49) | qint64 writeLE(QFile &file, const uint16_t &in)
function qint64 (line 57) | qint64 writeLE(QFile &file, const uint32_t &in)
function qint64 (line 69) | qint64 readBE(QFile &file, uint16_t &out)
function qint64 (line 78) | qint64 writeBE(QFile &file, const uint16_t &in)
function toSint16LE (line 85) | int16_t toSint16LE(const uint8_t *arr)
function toUint16LE (line 93) | uint16_t toUint16LE(const uint8_t *arr)
function toUint16BE (line 100) | uint16_t toUint16BE(const uint8_t *arr)
function toSint16BE (line 108) | int16_t toSint16BE(const uint8_t *arr)
function toUint32LE (line 116) | uint32_t toUint32LE(const uint8_t *arr)
function toUint32BE (line 125) | uint32_t toUint32BE(const uint8_t *arr)
function fromSint16LE (line 135) | void fromSint16LE(int16_t in, uint8_t *arr)
function fromUint16LE (line 141) | void fromUint16LE(uint16_t in, uint8_t *arr)
function fromUint16BE (line 147) | void fromUint16BE(uint16_t in, uint8_t *arr)
function fromSint16BE (line 153) | void fromSint16BE(int16_t in, uint8_t *arr)
function fromUint32LE (line 159) | void fromUint32LE(uint32_t in, uint8_t *arr)
function getMagic (line 168) | void getMagic(QString filePath, char *bytes, int count)
function hasExt (line 180) | bool hasExt(const QString &file, const char *ext)
function clip_u8 (line 185) | uint8_t clip_u8(int i, int min, int max)
function ErrMessageO (line 196) | void ErrMessageO(QWidget *parent, QString errStr, bool isBank)
function ErrMessageS (line 205) | void ErrMessageS(QWidget *parent, QString errStr, bool isBank)
FILE: src/delay_analysis.cpp
class DelayAnalysisDialog::PlotData (line 53) | class DelayAnalysisDialog::PlotData : public QwtSyntheticPointData
FILE: src/delay_analysis.h
function namespace (line 29) | namespace Ui { class DelayAnalysis; }
function class (line 34) | class DelayAnalysisDialog : public QDialog
FILE: src/flatbuffers/base.h
function class (line 66) | const class nullptr_t {
FILE: src/flatbuffers/flatbuffers.h
function namespace (line 22) | namespace flatbuffers {
type T (line 79) | typedef T *mutable_return_type;
function return_type (line 81) | static return_type Read(const uint8_t *p, uoffset_t i) {
type std (line 90) | typedef std::random_access_iterator_tag iterator_category;
type IT (line 91) | typedef IT value_type;
type uoffset_t (line 92) | typedef uoffset_t difference_type;
type IT (line 93) | typedef IT *pointer;
type IT (line 94) | typedef IT &reference;
function data_ (line 98) | VectorIterator(const VectorIterator &other) : data_(other.data_) {}
function IT (line 126) | IT operator *() const {
function IT (line 130) | IT operator->() const {
type String (line 178) | struct String
type VectorIterator (line 186) | typedef VectorIterator<T, typename
type typename (line 194) | typedef typename IndirectHelper<T>::return_type return_type;
type typename (line 195) | typedef typename IndirectHelper<T>::mutable_return_type mutable_return_t...
function return_type (line 197) | return_type Get(uoffset_t i) const {
function return_type (line 202) | return_type operator[](uoffset_t i) const { return Get(i); }
function U (line 213) | U *GetAs(uoffset_t i) const {
function String (line 219) | const String *GetAsString(uoffset_t i) const {
function iterator (line 227) | iterator begin() { return iterator(Data(), 0); }
function iterator (line 230) | iterator end() { return iterator(Data(), size()); }
function Mutate (line 235) | void Mutate(uoffset_t i, const T& val) {
function MutateOffset (line 243) | void MutateOffset(uoffset_t i, const uint8_t *val) {
function mutable_return_type (line 251) | mutable_return_type GetMutableObject(uoffset_t i) const {
function T (line 266) | const T *data() const { return reinterpret_cast<const T *>(Data()); }
function T (line 267) | T *data() { return reinterpret_cast<T *>(Data()); }
function KeyCompare (line 294) | int KeyCompare(const void *ap, const void *bp) {
function class (line 307) | class VectorOfAny {
function VectorLength (line 342) | inline size_t VectorLength(const Vector<T> *v) {
type String (line 346) | struct String
function operator (line 350) | bool operator <(const String &o) const {
function class (line 357) | class Allocator {
function class (line 381) | class DefaultAllocator : public Allocator {
function virtual (line 387) | virtual void deallocate(uint8_t *p, size_t) FLATBUFFERS_OVERRIDE {
function DefaultAllocator (line 391) | static DefaultAllocator &instance() {
function class (line 400) | class DetachedBuffer {
function class (line 506) | class vector_downward {
function reset (line 527) | void reset() {
function clear (line 537) | void clear() {
function DetachedBuffer (line 548) | DetachedBuffer release() {
function growth_policy (line 559) | size_t growth_policy(size_t bytes) {
function push (line 598) | void push(const uint8_t *bytes, size_t num) {
function fill (line 611) | void fill(size_t zero_pad_bytes) {
function fill_big (line 617) | void fill_big(size_t zero_pad_bytes) {
function pop (line 622) | void pop(size_t bytes_to_remove) { cur_ += bytes_to_remove; }
function reallocate (line 636) | void reallocate(size_t len) {
function voffset_t (line 653) | inline voffset_t FieldIndexToOffset(voffset_t field_id) {
function T (line 659) | T* data(const std::vector<T> &v) {
function class (line 677) | class FlatBufferBuilder
function Reset (line 702) | void Reset() {
function Clear (line 709) | void Clear() {
function DetachedBuffer (line 740) | DetachedBuffer ReleaseBufferPointer() {
function DetachedBuffer (line 747) | DetachedBuffer Release() {
function GetBufferMinAlignment (line 757) | size_t GetBufferMinAlignment() {
function ForceDefaults (line 776) | void ForceDefaults(bool fd) { force_defaults_ = fd; }
function DedupVtables (line 780) | void DedupVtables(bool dedup) { dedup_vtables_ = dedup; }
function Pad (line 783) | void Pad(size_t num_bytes) { buf_.fill(num_bytes); }
function Align (line 785) | void Align(size_t elem_size) {
function PushFlatBuffer (line 790) | void PushFlatBuffer(const uint8_t *bytes, size_t size) {
function PushBytes (line 795) | void PushBytes(const uint8_t *bytes, size_t size) {
function PopBytes (line 799) | void PopBytes(size_t amount) { buf_.pop(amount); }
function TrackField (line 822) | void TrackField(voffset_t field, uoffset_t off) {
function AddStructOffset (line 848) | void AddStructOffset(voffset_t field, uoffset_t off) {
function uoffset_t (line 855) | uoffset_t ReferTo(uoffset_t off) {
function NotNested (line 863) | void NotNested() {
function uoffset_t (line 877) | uoffset_t StartTable() {
function uoffset_t (line 886) | uoffset_t EndTable(uoffset_t start) {
function uoffset_t (line 949) | uoffset_t EndTable(uoffset_t start, voffset_t /*numfields*/) {
function uoffset_t (line 964) | uoffset_t StartStruct(size_t alignment) {
function uoffset_t (line 969) | uoffset_t EndStruct() { return GetSize(); }
function ClearOffsets (line 971) | void ClearOffsets() {
function PreAlign (line 978) | void PreAlign(size_t len, size_t alignment) {
function uoffset_t (line 1083) | uoffset_t EndVector(size_t len) {
function StartVector (line 1089) | void StartVector(size_t len, size_t elemsize) {
function ForceVectorAlignment (line 1101) | void ForceVectorAlignment(size_t len, size_t elemsize, size_t alignment) {
type T (line 1235) | typedef T (*Pack_t)(const S&);
function const (line 1307) | bool operator()(const T &a, const T &b) const {
type T (line 1367) | typedef T (*Pack_t)(const S&);
function buf_ (line 1376) | buf_(buf) {}
function const (line 1377) | bool operator()(const Offset<T> &a, const Offset<T> &b) const {
function uoffset_t (line 1422) | uoffset_t CreateUninitializedVector(size_t len, size_t elemsize,
function Finish (line 1483) | void Finish(uoffset_t root, const char *file_identifier, bool size_prefi...
type FieldLoc (line 1502) | struct FieldLoc {
type StringOffsetCompare (line 1529) | struct StringOffsetCompare {
type std (line 1541) | typedef std::set<Offset<String>, StringOffsetCompare> StringOffsetMap;
function T (line 1569) | T *GetRoot(const void *buf) {
function T (line 1573) | T *GetSizePrefixedRoot(const void *buf) {
function BufferHasIdentifier (line 1604) | inline bool BufferHasIdentifier(const void *buf, const char *identifier) {
function class (line 1610) | class Verifier FLATBUFFERS_FINAL_CLASS {
function Verify (line 1634) | bool Verify(const void *elem, size_t elem_len) const {
function Verify (line 1669) | bool Verify(const String *str) const {
function VerifyVector (line 1678) | bool VerifyVector(const uint8_t *vec, size_t elem_size,
function VerifyVectorOfStrings (line 1694) | bool VerifyVectorOfStrings(const Vector<Offset<String>> *vec) const {
function uoffset_t (line 1747) | uoffset_t VerifyOffset(const uint8_t *start) const {
function VerifyComplexity (line 1758) | bool VerifyComplexity() {
function EndTable (line 1765) | bool EndTable() {
function GetComputedSize (line 1772) | size_t GetComputedSize() const {
function class (line 1819) | class Struct FLATBUFFERS_FINAL_CLASS {
function class (line 1838) | class Table {
type NativeTable (line 1998) | struct NativeTable {
type hash_value_t (line 2009) | typedef uint64_t hash_value_t;
type hash_value_t (line 2012) | typedef hash_value_t (*rehasher_function_t)(void *pointer);
type std (line 2014) | typedef std::function<void (void **pointer_adr, hash_value_t hash)>
type std (line 2016) | typedef std::function<hash_value_t (void *pointer)> rehasher_function_t;
function LookupEnum (line 2034) | inline int LookupEnum(const char **names, const char *name) {
type SequenceType (line 2079) | enum SequenceType { ST_TABLE, ST_STRUCT, ST_UNION, ST_ENUM }
type ElementaryType (line 2098) | enum ElementaryType {
type TypeCode (line 2114) | struct TypeCode {
type TypeTable (line 2122) | struct TypeTable
type TypeTable (line 2125) | typedef TypeTable *(*TypeFunction)();
type TypeTable (line 2127) | struct TypeTable {
FILE: src/flatbuffers/stl_emulation.h
function namespace (line 35) | namespace flatbuffers {
FILE: src/formats_sup.cpp
function QString (line 32) | static QString caps2string(int formatCaps)
function QTableWidgetItem (line 60) | static QTableWidgetItem *makeItem(const QString &label)
FILE: src/formats_sup.h
function namespace (line 27) | namespace Ui {
function class (line 31) | class formats_sup : public QDialog
FILE: src/hardware.cpp
function QString (line 75) | QString HardwareDialog::serialPortName() const
FILE: src/hardware.h
function namespace (line 25) | namespace Ui { class HardwareDialog; }
function class (line 27) | class HardwareDialog : public QDialog
FILE: src/importer.cpp
function foreach (line 229) | foreach(const QUrl &url, e->mimeData()->urls())
function QString (line 479) | QString Importer::getInstrumentName(int instrument, bool isAuto, bool is...
FILE: src/importer.h
function namespace (line 31) | namespace Ui {
function class (line 37) | class Importer : public QDialog
FILE: src/ins_names.cpp
function fillInstMap (line 31) | static void fillInstMap(InstrumentMap &map, const MidiProgram *pgms, uns...
function MidiProgram (line 53) | const MidiProgram *getMidiProgram(MidiProgramId id, unsigned spec, unsig...
function MidiProgram (line 103) | const MidiProgram *getFallbackProgram(MidiProgramId id, unsigned spec, u...
function MidiProgram (line 117) | const MidiProgram *getMidiBank(MidiProgramId id, unsigned spec, unsigned...
function QString (line 126) | static QString getMidiInsName(bool percussive, unsigned index)
function QString (line 149) | QString getMidiInsNameM(unsigned index)
function QString (line 154) | QString getMidiInsNameP(unsigned index)
FILE: src/ins_names.h
type MidiProgram (line 35) | struct MidiProgram
type MidiSpec (line 51) | enum MidiSpec
function MidiProgramId (line 71) | struct MidiProgramId
FILE: src/main.cpp
function main (line 33) | int main(int argc, char *argv[])
function QString (line 92) | QString Application::getQtTranslationDir() const
function QString (line 107) | QString Application::getAppTranslationDir() const
function QStringList (line 159) | QStringList Application::getOpenFileChain()
FILE: src/main.h
function class (line 33) | class Application : public QApplication
FILE: src/metaparameter.h
type MetaParameter (line 24) | struct MetaParameter
type MetaParameterFlag (line 39) | enum MetaParameterFlag
FILE: src/midi/midi_rtmidi.cpp
function QString (line 106) | QString MidiInRt::defaultClientName()
function QString (line 110) | QString MidiInRt::defaultPortName()
function RtMidiIn (line 115) | RtMidiIn *MidiInRt::lazyInstance()
FILE: src/midi/midi_rtmidi.h
function class (line 29) | class MidiInRt : public QObject
FILE: src/operator_editor.h
function namespace (line 25) | namespace Ui { class OperatorEditor; }
function class (line 27) | class OperatorEditor : public QWidget
FILE: src/opl/generator.cpp
function QString (line 174) | QString GeneratorDebugInfo::toStr()
function Win9x_OPL_Proxy (line 292) | Win9x_OPL_Proxy &Generator::oplProxy()
function OPL_SerialPort (line 300) | OPL_SerialPort &Generator::serialPortOpl()
FILE: src/opl/generator.h
type OPL_Operator (line 41) | struct OPL_Operator
type OPL_PatchSetup (line 55) | struct OPL_PatchSetup
type GeneratorDebugInfo (line 73) | struct GeneratorDebugInfo
function class (line 81) | class Generator
FILE: src/opl/generator_realtime.cpp
type MessageTag (line 24) | enum MessageTag
type MessageHeader (line 43) | struct MessageHeader
type ChordType (line 50) | enum class ChordType
type ChordMessage (line 57) | struct ChordMessage
type PatchChangeMessage (line 63) | struct PatchChangeMessage
function wait_for_fifo_write_space (line 72) | static void wait_for_fifo_write_space(Ring_Buffer &rb, unsigned size)
function GeneratorDebugInfo (line 568) | const GeneratorDebugInfo &RealtimeGenerator::generatorDebugInfo() const
FILE: src/opl/generator_realtime.h
type GeneratorDebugInfo (line 37) | struct GeneratorDebugInfo
function class (line 42) | class IRealtimeControl : public QObject
function class (line 94) | class IRealtimeMIDI
function class (line 104) | class IRealtimeProcess
function ctl_initChip (line 126) | void ctl_initChip() override;
type QStdMutex (line 190) | typedef QStdMutex mutex_type;
type std (line 193) | typedef std::mutex mutex_type;
function class (line 195) | class WindowsMutex
type WindowsMutex (line 211) | typedef WindowsMutex mutex_type;
FILE: src/opl/measurer.cpp
class AudioHistory (line 65) | class AudioHistory
method size (line 73) | size_t size() const { return m_length; }
method capacity (line 74) | size_t capacity() const { return m_capacity; }
method T (line 75) | const T *data() const { return &m_data[m_index + m_capacity - m_length...
method reset (line 77) | void reset(size_t capacity)
method clear (line 85) | void clear()
method add (line 90) | void add(const T &item)
function HannWindow (line 103) | static void HannWindow(double *w, unsigned n)
function MeasureRMS (line 109) | static double MeasureRMS(const double *signal, const double *window, uns...
function WriteAmplitudePlot (line 130) | static bool WriteAmplitudePlot(
type TinySynth (line 201) | struct TinySynth
method resetChip (line 210) | void resetChip()
method setInstrument (line 225) | void setInstrument(const FmBank::Instrument *in_p)
method noteOn (line 287) | void noteOn()
method noteOff (line 313) | void noteOff()
method generate (line 320) | void generate(int16_t *output, size_t frames)
function BenchmarkChip (line 326) | static void BenchmarkChip(FmBank::Instrument *in_p, OPLChipBase *chip)
function ComputeDurations (line 370) | static void ComputeDurations(const FmBank::Instrument *in_p, DurationInf...
function ComputeDurationsDefault (line 661) | static void ComputeDurationsDefault(const FmBank::Instrument *in, Durati...
function MeasureDurations (line 667) | static void MeasureDurations(FmBank::Instrument *in_p, OPLChipBase *chip)
function MeasureDurationsDefault (line 687) | static void MeasureDurationsDefault(FmBank::Instrument *in_p)
function MeasureDurationsBenchmark (line 693) | static void MeasureDurationsBenchmark(FmBank::Instrument *in_p, OPLChipB...
function MeasureDurationsBenchmarkRunner (line 718) | static void MeasureDurationsBenchmarkRunner(FmBank::Instrument *in_p, QV...
function insertOrBlank (line 751) | static void insertOrBlank(FmBank::Instrument &ins, const FmBank::Instrum...
function foreach (line 840) | foreach(FmBank::Instrument *ins, tasks)
FILE: src/opl/measurer.h
function class (line 28) | class Measurer : public QObject
FILE: src/opl/models/model_ail.c
function oplModel_ailFreq (line 91) | uint16_t oplModel_ailFreq(double tone, uint32_t *mul_offset)
function oplModel_ailVolume (line 172) | void oplModel_ailVolume(struct OPLVolume_t *v)
FILE: src/opl/models/model_apogee.c
function oplModel_apogeeFreq (line 67) | uint16_t oplModel_apogeeFreq(double tone, uint32_t *mul_offset)
function oplModel_apogeeOrigVolume (line 108) | void oplModel_apogeeOrigVolume(struct OPLVolume_t *v)
function oplModel_apogeeFixedVolume (line 149) | void oplModel_apogeeFixedVolume(struct OPLVolume_t *v)
FILE: src/opl/models/model_dmx.c
function oplModel_dmxFreq (line 142) | uint16_t oplModel_dmxFreq(double tone, uint32_t *mul_offset)
function oplModel_dmxOrigVolume (line 217) | void oplModel_dmxOrigVolume(struct OPLVolume_t *v)
function oplModel_dmxFixedVolume (line 252) | void oplModel_dmxFixedVolume(struct OPLVolume_t *v)
FILE: src/opl/models/model_generic.c
function oplModel_genericFreq (line 238) | uint16_t oplModel_genericFreq(double tone, uint32_t *mul_offset)
function oplModel_genericVolume (line 276) | void oplModel_genericVolume(struct OPLVolume_t *v)
function oplModel_nativeVolume (line 304) | void oplModel_nativeVolume(struct OPLVolume_t *v)
function oplModel_rsxxVolume (line 322) | void oplModel_rsxxVolume(struct OPLVolume_t *v)
function uint_fast16_t (line 367) | uint_fast16_t oplModels_xgBrightnessToOPL(uint_fast16_t brightness)
FILE: src/opl/models/model_hmi_sos.c
function uint_fast32_t (line 63) | static uint_fast32_t s_hmi_bend_calc(uint_fast32_t bend, int_fast32_t note)
function oplModel_hmiFreq (line 122) | uint16_t oplModel_hmiFreq(double tone, uint32_t *mul_offset)
function oplModel_sosOldVolume (line 191) | void oplModel_sosOldVolume(struct OPLVolume_t *v)
function oplModel_sosNewVolume (line 223) | void oplModel_sosNewVolume(struct OPLVolume_t *v)
FILE: src/opl/models/model_msadlib.c
function oplModel_msAdLibFreq (line 68) | uint16_t oplModel_msAdLibFreq(double tone, uint32_t *mul_offset)
function oplModel_msAdLibVolume (line 148) | void oplModel_msAdLibVolume(struct OPLVolume_t *v)
FILE: src/opl/models/model_oconnell.c
function oplModel_OConnellFreq (line 57) | uint16_t oplModel_OConnellFreq(double tone, uint32_t *mul_offset)
function oplModel_OConnellVolume (line 142) | void oplModel_OConnellVolume(struct OPLVolume_t *v)
FILE: src/opl/models/model_win9x.c
function uint_fast32_t (line 41) | static uint_fast32_t s_9x_opl_applypitch(uint_fast32_t freq, int_fast32_...
function oplModel_9xFreq (line 59) | uint16_t oplModel_9xFreq(double tone, uint32_t *mul_offset)
function oplModel_9xGenericVolume (line 131) | void oplModel_9xGenericVolume(struct OPLVolume_t *v)
function oplModel_9xSB16Volume (line 159) | void oplModel_9xSB16Volume(struct OPLVolume_t *v)
FILE: src/opl/models/opl_models.h
type OPLVoiceModes (line 112) | enum OPLVoiceModes
type OPLVolume_t (line 129) | struct OPLVolume_t
type OPLVolume_t (line 159) | struct OPLVolume_t
type OPLVolume_t (line 165) | struct OPLVolume_t
type OPLVolume_t (line 171) | struct OPLVolume_t
type OPLVolume_t (line 178) | struct OPLVolume_t
type OPLVolume_t (line 184) | struct OPLVolume_t
type OPLVolume_t (line 191) | struct OPLVolume_t
type OPLVolume_t (line 197) | struct OPLVolume_t
type OPLVolume_t (line 204) | struct OPLVolume_t
type OPLVolume_t (line 210) | struct OPLVolume_t
type OPLVolume_t (line 217) | struct OPLVolume_t
type OPLVolume_t (line 224) | struct OPLVolume_t
type OPLVolume_t (line 230) | struct OPLVolume_t
type OPLVolume_t (line 237) | struct OPLVolume_t
type OPLVolume_t (line 245) | struct OPLVolume_t
FILE: src/opl/models/util/freq-opl.c
function toneToHerz (line 7) | static double toneToHerz(double tone)
function main (line 14) | int main()
FILE: src/opl/models/util/oplbrightness.c
function uint_fast32_t (line 6) | static inline uint_fast32_t brightnessToOPL(uint_fast32_t brightness)
function main (line 13) | int main()
FILE: src/opl/nukedopl3.h
type Bitu (line 43) | typedef uintptr_t Bitu;
type Bits (line 44) | typedef intptr_t Bits;
type Bit64u (line 45) | typedef uint64_t Bit64u;
type Bit64s (line 46) | typedef int64_t Bit64s;
type Bit32u (line 47) | typedef uint32_t Bit32u;
type Bit32s (line 48) | typedef int32_t Bit32s;
type Bit16u (line 49) | typedef uint16_t Bit16u;
type Bit16s (line 50) | typedef int16_t Bit16s;
type Bit8u (line 51) | typedef uint8_t Bit8u;
type Bit8s (line 52) | typedef int8_t Bit8s;
type opl3_slot (line 54) | typedef struct _opl3_slot opl3_slot;
type opl3_channel (line 55) | typedef struct _opl3_channel opl3_channel;
type opl3_chip (line 56) | typedef struct _opl3_chip opl3_chip;
type _opl3_slot (line 58) | struct _opl3_slot {
type _opl3_channel (line 93) | struct _opl3_channel {
type opl3_writebuf (line 112) | typedef struct _opl3_writebuf {
type _opl3_chip (line 119) | struct _opl3_chip {
FILE: src/opl/realtime/ring_buffer.cpp
class Ring_Buffer_Ex<true> (line 104) | class Ring_Buffer_Ex<true>
class Ring_Buffer_Ex<false> (line 105) | class Ring_Buffer_Ex<false>
FILE: src/opl/realtime/ring_buffer.h
function capacity (line 47) | size_t capacity() const;
FILE: src/piano.h
function class (line 28) | class Piano : public QFrame
FILE: src/proxystyle.h
function class (line 31) | class BankEditor_ProxyStyle : public QProxyStyle
FILE: test/wopl_rw/tst_wopl_rwtest.cpp
function compareResults (line 9) | class Wopl_rwTest : public QObject
function saveFileTest (line 119) | void saveFileTest()
function benchmarkWrite (line 129) | void benchmarkWrite()
function stabilityOverInputShit (line 138) | void stabilityOverInputShit()
function randomizedBankDataTest (line 159) | void randomizedBankDataTest()
FILE: utils/create-dmg/support/dmg-license.py
class Path (line 33) | class Path(str):
method __enter__ (line 34) | def __enter__(self):
method __exit__ (line 37) | def __exit__(self, in_type, value, traceback):
function mktemp (line 41) | def mktemp(dir=None, suffix=''):
function main (line 47) | def main(in_options, in_args):
FILE: utils/create-dmg/support/dmg-license3.py
class Path (line 33) | class Path(str):
method __enter__ (line 34) | def __enter__(self):
method __exit__ (line 37) | def __exit__(self, in_type, value, traceback):
function mktemp (line 41) | def mktemp(dirname=None, suffix=''):
function main (line 47) | def main(in_options, in_args):
FILE: utils/measurer/measurer-tool.cpp
function main (line 26) | int main(int argc, char *argv[])
Condensed preview — 921 files, each showing path, character count, and a content snippet. Download the .json file or copy for the full structured content (8,492K chars).
[
{
"path": ".devcontainer/Dockerfile",
"chars": 783,
"preview": "FROM mcr.microsoft.com/devcontainers/cpp:1-debian-12\n\nARG REINSTALL_CMAKE_VERSION_FROM_SOURCE=\"3.21.5\"\n\n# Optionally ins"
},
{
"path": ".devcontainer/devcontainer.json",
"chars": 745,
"preview": "// For format details, see https://aka.ms/devcontainer.json. For config options, see the\n// README at: https://github.co"
},
{
"path": ".devcontainer/reinstall-cmake.sh",
"chars": 1799,
"preview": "#!/usr/bin/env bash\n#---------------------------------------------------------------------------------------------------"
},
{
"path": ".gitattributes",
"chars": 396,
"preview": "_Misc/* linguist-vendored\nBank_Examples/* linguist-vendored\n*.h linguist-language=cpp\n*.bat "
},
{
"path": ".github/workflows/macos-ci.yml",
"chars": 6866,
"preview": "name: macOS CI\n\non:\n push:\n branches:\n - master\n pull_request:\n branches:\n - master\n workflow_dispatc"
},
{
"path": ".github/workflows/ubuntu-ci.yml",
"chars": 18885,
"preview": "name: Ubuntu CI\n\non:\n push:\n branches:\n - master\n pull_request:\n branches:\n - master\n workflow_dispat"
},
{
"path": ".github/workflows/windows-ci.yml",
"chars": 10848,
"preview": "name: Windows CI\n\non:\n push:\n branches:\n - master\n pull_request:\n branches:\n - master\n workflow_dispa"
},
{
"path": ".gitignore",
"chars": 360,
"preview": "# C++ objects and libs\n\n*.slo\n*.lo\n*.o\n*.a\n*.la\n*.lai\n*.so\n*.dll\n*.dylib\n\n# Qt-es\n\n/.qmake.cache\n/.qmake.stash\n*.user*\n*"
},
{
"path": ".gitmodules",
"chars": 394,
"preview": "[submodule \"src/midi/external/rtmidi\"]\n\tpath = src/midi/external/rtmidi\n\turl = https://github.com/Wohlstand/rtmidi.git\n\t"
},
{
"path": "Bank_Examples/Info.txt",
"chars": 3160,
"preview": "==============================================================================\r\nMost of those FM banks are imported from"
},
{
"path": "Bank_Examples/Sci/sci.patch.format.txt",
"chars": 2536,
"preview": "Adlib Patch Resource Format Specification\r\n\r\nRevision 1\r\nRavi I.\r\nMar. 11, 2002\r\n\r\n\r\nPreface\r\n\r\nThe Adlib patch resource"
},
{
"path": "CMakeLists.txt",
"chars": 27153,
"preview": "cmake_minimum_required(VERSION 3.2...3.10)\r\nproject(OPL3BankEditor LANGUAGES C CXX)\r\n\r\ninclude(CheckCXXCompilerFlag)\r\nin"
},
{
"path": "FMBankEdit.pro",
"chars": 8052,
"preview": "#----------------------------------------------------------------------------\n# OPL Bank Editor by Wohlstand, a free too"
},
{
"path": "LICENSE",
"chars": 35141,
"preview": " GNU GENERAL PUBLIC LICENSE\n Version 3, 29 June 2007\n\n Copyright (C) 2007 Free "
},
{
"path": "README.md",
"chars": 6868,
"preview": "# OPL3BankEditor\n\n\nA small cross-platform editor of the OPL3 FM banks of d"
},
{
"path": "Specifications/AILBANK.TXT",
"chars": 2491,
"preview": "Miles Design AIL 2.0 Global Timbre Library Format (.AD/.OPL)\n-----------------------------------------------------------"
},
{
"path": "Specifications/DMX OP2 Bank Format.txt",
"chars": 8129,
"preview": "------------------------- DMX OP2 Bank Format -------------------------\r\n\r\nThe OP2 Bank Format is an instrument bank for"
},
{
"path": "Specifications/HMI BNK Format.txt",
"chars": 5185,
"preview": " HMI Sound Operating System FM bank\r\n----------------------------------------------------------------"
},
{
"path": "Specifications/Opl3Bank.fbs",
"chars": 1559,
"preview": "file_identifier \"FOP3\";\n\n//Data of operator are stored in raw OPL format, so, there are ready-to-send\nstruct Operator {\n"
},
{
"path": "Specifications/RIFF FM4 PAT specification.txt",
"chars": 8031,
"preview": "------------------------- RIFF FM4 PATCH bank format ---------------------------\r\nThis is the format for the .PAT file u"
},
{
"path": "Specifications/Reality ADlib Tracker format.cp437.txt.utf-8.txt",
"chars": 9209,
"preview": "\r\nExtension:\t.RAD\r\nVersion:\t1.0\r\nCreated by:\tReality\r\nTracker:\tReality ADlib Tracker\r\nPlayers:\t-\r\nDescription by: Shayd"
},
{
"path": "Specifications/TMB Format.txt",
"chars": 3197,
"preview": "---------------------- Apogee Sound System Timbre Format ----------------------\r\nThe Apogee Sound System Timbre Format i"
},
{
"path": "Specifications/UNIX SoundBlaster Patch.txt",
"chars": 1317,
"preview": "Here is the layout of a SoundBlaster patch (as I suppose it to be):\r\n\r\noffset:\r\n 0-3: \"SBI\", 0x1a\r\n 4-19: voice name\r\n 2"
},
{
"path": "Specifications/WOPL-and-OPLI-Specification.txt",
"chars": 10695,
"preview": "===============================================================================\r\n MIDI playing bank for Yam"
},
{
"path": "Specifications/WOPLX-Specification.txt",
"chars": 16822,
"preview": "===============================================================================\r\n MIDI playing bank for Yam"
},
{
"path": "_Misc/bytecmp_adlraw.c",
"chars": 1130,
"preview": "#include <stdio.h>\n\nint main()\n{\n FILE* f1 = fopen(\"bisqwit.adlraw\", \"rb\");\n FILE* f2 = fopen(\"bisqwit-2.adlraw\", "
},
{
"path": "_Misc/bytecmp_bnk.c",
"chars": 1100,
"preview": "#include <stdio.h>\n\nint main()\n{\n FILE* f1 = fopen(\"bnk1.bnk\", \"rb\");\n FILE* f2 = fopen(\"bnk2.bnk\", \"rb\");\n\n un"
},
{
"path": "_Misc/bytecmp_dmx.c",
"chars": 1105,
"preview": "#include <stdio.h>\n\nint main()\n{\n FILE* f1 = fopen(\"dmx_doom2.op2\", \"rb\");\n FILE* f2 = fopen(\"dmx_doom2_modded.op2"
},
{
"path": "_Misc/bytecmp_ibk.c",
"chars": 1089,
"preview": "#include <stdio.h>\n\nint main()\n{\n FILE* f1 = fopen(\"ibk1.ibk\", \"rb\");\n FILE* f2 = fopen(\"ibk2.ibk\", \"rb\");\n\n un"
},
{
"path": "_Misc/bytecmp_ibk2.c",
"chars": 1091,
"preview": "#include <stdio.h>\n\nint main()\n{\n FILE* f1 = fopen(\"perk1.ibk\", \"rb\");\n FILE* f2 = fopen(\"perk2.ibk\", \"rb\");\n\n "
},
{
"path": "_Misc/bytecmp_ibk3.c",
"chars": 1093,
"preview": "#include <stdio.h>\n\nint main()\n{\n FILE* f1 = fopen(\"GMOPL2.IBK\", \"rb\");\n FILE* f2 = fopen(\"GMOPL4.IBK\", \"rb\");\n\n "
},
{
"path": "_Misc/bytecmp_op3.c",
"chars": 1104,
"preview": "#include <stdio.h>\n\nint main()\n{\n FILE* f1 = fopen(\"cmp1.op3\", \"rb\");\n FILE* f2 = fopen(\"cmp2.op3\", \"rb\");\n\n un"
},
{
"path": "_Misc/bytecmp_silly.c",
"chars": 592,
"preview": "#include <stdio.h>\n\nint main()\n{\n FILE* f1 = fopen(\"file144.bnk\", \"rb\");\n FILE* f2 = fopen(\"file144-2.bnk\", \"rb\");"
},
{
"path": "_Misc/bytecmp_tim.c",
"chars": 1494,
"preview": "#include <stdio.h>\n\nint main()\n{\n FILE* f1 = fopen(\"tim.snd\", \"rb\");\n FILE* f2 = fopen(\"tim.tim\", \"rb\");\n\n unsi"
},
{
"path": "_Misc/bytecmp_tmb.c",
"chars": 1108,
"preview": "#include <stdio.h>\n\nint main()\n{\n FILE* f1 = fopen(\"duke1.tmb\", \"rb\");\n FILE* f2 = fopen(\"duke2.tmb\", \"rb\");\n\n "
},
{
"path": "_Misc/compare_banks.sh",
"chars": 201,
"preview": "#!/bin/bash\n\nDoSome()\n{\n gcc bytecmp_$1.c -o byte$1\n ./byte$1 > res$1.txt\n}\n\nDoSome dmx\nDoSome op3\nDoSome tmb\nDoSo"
},
{
"path": "_Misc/dumb_bnk.c",
"chars": 3273,
"preview": "\n#include <stdio.h>\n\n#define BNK_HEAD_OFFSET 8\n\n#define SIZEOF_NAME 12\n#define SIZEOF_INST 30\n\n\nint read16LE(FIL"
},
{
"path": "_Misc/grassman.txt",
"chars": 4204755,
"preview": "[????????] FLAGS: 0x01, IDX: 00000 => P=0x4F VN=0x067 {OP1 L=0x47 M=0x55 F=0x049 A=0x54 S=0x39 E=0x00 D=0x51 r=0x13 l=0x"
},
{
"path": "_Misc/grassman2.txt",
"chars": 1196740,
"preview": "[!???????] FLAGS: 0x01, IDX: 00000 => P=0x00 VN=0x000 {OP1 L=0x00 M=0x00 F=0x005 A=0x07 S=0x0A E=0x01 D=0x01 r=0x06 l=0x"
},
{
"path": "_Misc/qt-4-4-3-build/Readme.txt",
"chars": 2361,
"preview": "This is a toolset to build Qt 4.4.3 under MinGW 5.3.\r\n\r\nIt's required to build Windows 98-compatible assembly of OPL3 Ba"
},
{
"path": "_Misc/qt-4-4-3-build/make-qt-4-4-3.bat",
"chars": 579,
"preview": "PATH=C:\\MinGW\\bin;%PATH%\r\n\r\nIF -%1-==-make- goto DoMake\r\nIF -%1-==-makeone- goto DoMakeOne\r\n\r\nconfigure.exe ^\r\n -platfor"
},
{
"path": "build.bat",
"chars": 1517,
"preview": "@echo off\r\ncall _paths.bat\r\n\r\nPATH=%QtDir%;%MinGW%;%GitDir%;%PATH%\r\nSET SEVENZIP=C:\\Program Files\\7-Zip\r\n\r\nIF NOT EXIST "
},
{
"path": "changelog.txt",
"chars": 6869,
"preview": "Version 1.5.2\r\n- Fixed a small bug at the importer.\r\n- Added voice importing from SMAF v1 and v2 (they are partially com"
},
{
"path": "cmake/FindQwt.cmake",
"chars": 4539,
"preview": "# Qt Widgets for Technical Applications\n# available at http://www.http://qwt.sourceforge.net/\n#\n# The module defines the"
},
{
"path": "cmake/ci_linux_gcc_toolchain_arm64.cmake",
"chars": 565,
"preview": "set(CMAKE_SYSTEM_NAME Linux)\n\nset(CMAKE_C_COMPILER /usr/bin/aarch64-linux-gnu-gcc)\nset(CMAKE_CXX_COMPILER /usr/bin/aarch"
},
{
"path": "cmake/ci_linux_gcc_toolchain_armhf.cmake",
"chars": 574,
"preview": "set(CMAKE_SYSTEM_NAME Linux)\n\nset(CMAKE_C_COMPILER /usr/bin/arm-linux-gnueabihf-gcc)\nset(CMAKE_CXX_COMPILER /usr/bin/arm"
},
{
"path": "cmake/ci_linux_gcc_toolchain_x32.cmake",
"chars": 413,
"preview": "set(CMAKE_SYSTEM_NAME Linux)\n\nset(CMAKE_C_COMPILER gcc)\nset(CMAKE_C_FLAGS -m32)\nset(CMAKE_CXX_COMPILER g++)\nset(CMAKE_CX"
},
{
"path": "cmake/ci_windows_mingw_toolchain_x32.cmake",
"chars": 392,
"preview": "set(CMAKE_SYSROOT \"C:/MinGW-w64/mingw32/\")\n\nset(CMAKE_SYSTEM_PREFIX_PATH \"C:/MinGW-w64/mingw32/\")\n\nset(CMAKE_C_COMPILER "
},
{
"path": "cmake/ci_windows_mingw_toolchain_x64.cmake",
"chars": 392,
"preview": "set(CMAKE_SYSROOT \"C:/MinGW-w64/mingw64/\")\n\nset(CMAKE_SYSTEM_PREFIX_PATH \"C:/MinGW-w64/mingw64/\")\n\nset(CMAKE_C_COMPILER "
},
{
"path": "cmake/ci_windows_winmm_mingw_toolchain_vanilla.cmake",
"chars": 392,
"preview": "set(CMAKE_SYSROOT \"C:/MinGW-Kit/Vanilla/\")\n\nset(CMAKE_SYSTEM_PREFIX_PATH \"C:/MinGW-Kit/Vanilla/\")\n\nset(CMAKE_C_COMPILER "
},
{
"path": "cmake/ci_windows_winmm_mingw_toolchain_x32.cmake",
"chars": 408,
"preview": "set(CMAKE_SYSROOT \"C:/MinGW-Kit/w32/mingw32/\")\n\nset(CMAKE_SYSTEM_PREFIX_PATH \"C:/MinGW-Kit/w32/mingw32/\")\n\nset(CMAKE_C_C"
},
{
"path": "cmake/ci_windows_winmm_mingw_toolchain_x64.cmake",
"chars": 408,
"preview": "set(CMAKE_SYSROOT \"C:/MinGW-Kit/w64/mingw64/\")\n\nset(CMAKE_SYSTEM_PREFIX_PATH \"C:/MinGW-Kit/w64/mingw64/\")\n\nset(CMAKE_C_C"
},
{
"path": "cmake/deploy.cmake",
"chars": 2068,
"preview": "set(CPACK_PACKAGE_VENDOR \"Wohlstand\")\nset(CPACK_PACKAGE_CONTACT \"admin@wohlnet.ru\")\nset(CPACK_PACKAGE_VERSION \"${OPL3_BA"
},
{
"path": "cmake/library_qt.cmake",
"chars": 5208,
"preview": "set(BUILD_MAJOR_QT 5 CACHE STRING \"Major version of Qt to prefer (Supported 4, 5, and 6)\")\n\nset(FIND_QT_MAJOR ${BUILD_MA"
},
{
"path": "cmake/static_qt.cmake",
"chars": 22146,
"preview": "set(QT_EXTRA_LIBS)\nset(QT_EXTRA_LIBS_PRE)\n\nset(QT_FOUND_EXTRA_LIBS)\nset(QT_FOUND_EXTRA_LIBS_PRE)\n\n# TODO: Make more accu"
},
{
"path": "formats_info.htm",
"chars": 7111,
"preview": "<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\">\n<html><head>\n <meta http-equiv=\"content-type\" content=\""
},
{
"path": "license.txt",
"chars": 35795,
"preview": "GNU GENERAL PUBLIC LICENSE\r\n Version 3, 29 June 2007\r\n\r\n Copyright (C) 2007 Free Software Foundati"
},
{
"path": "opl_proxy/dummy-non-windows/oplproxy.c",
"chars": 1414,
"preview": "/*\n * OPL3 chip interface proxy for OPL Bank Editor by Wohlstand,\n * a part of free tool for music bank editing\n *\n * Co"
},
{
"path": "opl_proxy/modern/.gitignore",
"chars": 106,
"preview": "*.lib\n!liboplproxy.dll\n!liboplproxy64.dll\n!inpout32.dll\n!inpoutx64.dll\n*.map\n*.lk1\n*.mk1\n*.sym\n*.mk\n*.obj\n"
},
{
"path": "opl_proxy/modern/InpOut32Helper.c",
"chars": 3154,
"preview": "/*\r\n* inpout32.dll helper functions\r\n* 2013 James Alan Nguyen\r\n* http://www.codingchords.com\r\n*\r\n* Do whatever you want "
},
{
"path": "opl_proxy/modern/InpOut32Helper.h",
"chars": 327,
"preview": "\r\n#ifndef INPOUT32_HELPER_H\r\n#define INPOUT32_HELPER_H\r\n\r\n#ifdef _DEBUG\r\n#include <stdio.h>\r\n#endif\r\n#include <windows.h"
},
{
"path": "opl_proxy/modern/Readme.txt",
"chars": 262,
"preview": "OPL Proxy - a small backend tool created for OPL Bank Editor by Wohlstand\r\nto provide ability to test instruments on rea"
},
{
"path": "opl_proxy/modern/build32.bat",
"chars": 234,
"preview": "PATH=C:\\Qt\\Tools\\mingw810_32\\bin\\;%PATH%\r\ni686-w64-mingw32-gcc -m32 oplproxy.c InpOut32Helper.c liboplproxy.def -nostdli"
},
{
"path": "opl_proxy/modern/build32.sh",
"chars": 157,
"preview": "#!/bin/bash\n\ni686-w64-mingw32-gcc -m32 oplproxy.c InpOut32Helper.c -nostdlib -nodefaultlibs -shared -s -o liboplproxy.dl"
},
{
"path": "opl_proxy/modern/build64.bat",
"chars": 237,
"preview": "PATH=C:\\Qt\\Tools\\mingw810_64\\bin\\;%PATH%\r\nx86_64-w64-mingw32-gcc -m64 oplproxy.c InpOut32Helper.c liboplproxy.def -nostd"
},
{
"path": "opl_proxy/modern/build64.sh",
"chars": 160,
"preview": "#!/bin/bash\n\nx86_64-w64-mingw32-gcc -m64 oplproxy.c InpOut32Helper.c -nostdlib -nodefaultlibs -shared -s -o liboplproxy6"
},
{
"path": "opl_proxy/modern/liboplproxy.def",
"chars": 82,
"preview": "LIBRARY liboplproxy\r\nEXPORTS\r\n\tchipInit\r\n\tchipSetPort\r\n\tchipUnInit\r\n\tchipPoke"
},
{
"path": "opl_proxy/modern/liboplproxy.tgt",
"chars": 880,
"preview": "40\r\ntargetIdent\r\n0\r\nMProject\r\n1\r\nMComponent\r\n0\r\n2\r\nWString\r\n4\r\nNDLL\r\n3\r\nWString\r\n5\r\nn_2d9\r\n1\r\n0\r\n1\r\n4\r\nMCommand\r\n0\r\n5\r\nM"
},
{
"path": "opl_proxy/modern/liboplproxy_exports.txt",
"chars": 159,
"preview": "\r\nDllMain@12.'LIBOPLPROXY.DLL'.1\r\nchipInit.'LIBOPLPROXY.DLL'.2\r\nchipPoke.'LIBOPLPROXY.DLL'.3\r\nchipSetPort.'LIBOPLPROXY.D"
},
{
"path": "opl_proxy/modern/oplproxy.c",
"chars": 1669,
"preview": "/*\r\n * OPL3 chip interface proxy for OPL Bank Editor by Wohlstand,\r\n * a part of free tool for music bank editing\r\n *\r\n "
},
{
"path": "opl_proxy/modern/oplproxy.wpj",
"chars": 256,
"preview": "40\r\nprojectIdent\r\n0\r\nVpeMain\r\n1\r\nWRect\r\n232\r\n110\r\n7872\r\n8400\r\n2\r\nMProject\r\n3\r\nMCommand\r\n0\r\n4\r\nMCommand\r\n0\r\n1\r\n5\r\nWFileNa"
},
{
"path": "opl_proxy/modern/update_exports.bat",
"chars": 76,
"preview": "\"C:\\WATCOM\\binnt64\\wdump.exe\" -i liboplproxy.dll > liboplproxy_exports.txt\r\n"
},
{
"path": "opl_proxy/win9x/.gitignore",
"chars": 58,
"preview": "*.lib\n!liboplproxy.dll\n*.map\n*.lk1\n*.mk1\n*.sym\n*.mk\n*.obj\n"
},
{
"path": "opl_proxy/win9x/Readme.txt",
"chars": 262,
"preview": "OPL Proxy - a small backend tool created for OPL Bank Editor by Wohlstand\r\nto provide ability to test instruments on rea"
},
{
"path": "opl_proxy/win9x/liboplproxy.tgt",
"chars": 1028,
"preview": "40\r\ntargetIdent\r\n0\r\nMProject\r\n1\r\nMComponent\r\n0\r\n2\r\nWString\r\n4\r\nNDLL\r\n3\r\nWString\r\n5\r\nn_2dn\r\n1\r\n0\r\n1\r\n4\r\nMCommand\r\n0\r\n5\r\nM"
},
{
"path": "opl_proxy/win9x/liboplproxy_exports.txt",
"chars": 156,
"preview": "\r\nDllMain.'LIBOPLPROXY.DLL'.1\r\nchipInit.'LIBOPLPROXY.DLL'.2\r\nchipPoke.'LIBOPLPROXY.DLL'.5\r\nchipSetPort.'LIBOPLPROXY.DLL'"
},
{
"path": "opl_proxy/win9x/oplproxy.c",
"chars": 1885,
"preview": "/*\r\n * OPL3 chip interface proxy for OPL Bank Editor by Wohlstand,\r\n * a part of free tool for music bank editing\r\n *\r\n "
},
{
"path": "opl_proxy/win9x/oplproxy.wpj",
"chars": 256,
"preview": "40\r\nprojectIdent\r\n0\r\nVpeMain\r\n1\r\nWRect\r\n280\r\n310\r\n7680\r\n9210\r\n2\r\nMProject\r\n3\r\nMCommand\r\n0\r\n4\r\nMCommand\r\n0\r\n1\r\n5\r\nWFileNa"
},
{
"path": "opl_proxy/win9x/update_exports.bat",
"chars": 76,
"preview": "\"C:\\WATCOM\\binnt64\\wdump.exe\" -i liboplproxy.dll > liboplproxy_exports.txt\r\n"
},
{
"path": "opl_proxy/win9x/update_exports.sh",
"chars": 83,
"preview": "#!/bin/bash\n\n/opt/watcom/binl64/wdump -i liboplproxy.dll > liboplproxy_exports.txt\n"
},
{
"path": "src/FileFormats/Opl3Bank_generated.h",
"chars": 18189,
"preview": "// automatically generated by the FlatBuffers compiler, do not modify\n\n\n#ifndef FLATBUFFERS_GENERATED_OPL3BANK_H_\n#defin"
},
{
"path": "src/FileFormats/ffmt_base.cpp",
"chars": 3295,
"preview": "/*\n * OPL Bank Editor by Wohlstand, a free tool for music bank editing\n * Copyright (c) 2016-2026 Vitaly Novichkov <admi"
},
{
"path": "src/FileFormats/ffmt_base.h",
"chars": 2786,
"preview": "/*\n * OPL Bank Editor by Wohlstand, a free tool for music bank editing\n * Copyright (c) 2016-2026 Vitaly Novichkov <admi"
},
{
"path": "src/FileFormats/ffmt_enums.cpp",
"chars": 1834,
"preview": "/*\n * OPL Bank Editor by Wohlstand, a free tool for music bank editing\n * Copyright (c) 2016-2026 Vitaly Novichkov <admi"
},
{
"path": "src/FileFormats/ffmt_enums.h",
"chars": 3697,
"preview": "/*\n * OPL Bank Editor by Wohlstand, a free tool for music bank editing\n * Copyright (c) 2016-2026 Vitaly Novichkov <admi"
},
{
"path": "src/FileFormats/ffmt_factory.cpp",
"chars": 15426,
"preview": "/*\n * OPL Bank Editor by Wohlstand, a free tool for music bank editing\n * Copyright (c) 2016-2026 Vitaly Novichkov <admi"
},
{
"path": "src/FileFormats/ffmt_factory.h",
"chars": 3005,
"preview": "/*\n * OPL Bank Editor by Wohlstand, a free tool for music bank editing\n * Copyright (c) 2016-2026 Vitaly Novichkov <admi"
},
{
"path": "src/FileFormats/format_adlib_bnk.cpp",
"chars": 30387,
"preview": "/*\n * OPL Bank Editor by Wohlstand, a free tool for music bank editing\n * Copyright (c) 2016-2026 Vitaly Novichkov <admi"
},
{
"path": "src/FileFormats/format_adlib_bnk.h",
"chars": 3167,
"preview": "/*\n * OPL Bank Editor by Wohlstand, a free tool for music bank editing\n * Copyright (c) 2016-2026 Vitaly Novichkov <admi"
},
{
"path": "src/FileFormats/format_adlib_tim.cpp",
"chars": 7055,
"preview": "/*\n * OPL Bank Editor by Wohlstand, a free tool for music bank editing\n * Copyright (c) 2016-2026 Vitaly Novichkov <admi"
},
{
"path": "src/FileFormats/format_adlib_tim.h",
"chars": 1482,
"preview": "/*\n * OPL Bank Editor by Wohlstand, a free tool for music bank editing\n * Copyright (c) 2016-2026 Vitaly Novichkov <admi"
},
{
"path": "src/FileFormats/format_adlibgold_bnk2.cpp",
"chars": 9119,
"preview": "/*\n * OPL Bank Editor by Wohlstand, a free tool for music bank editing\n * Copyright (c) 2018-2026 Vitaly Novichkov <admi"
},
{
"path": "src/FileFormats/format_adlibgold_bnk2.h",
"chars": 1345,
"preview": "/*\n * OPL Bank Editor by Wohlstand, a free tool for music bank editing\n * Copyright (c) 2018-2026 Vitaly Novichkov <admi"
},
{
"path": "src/FileFormats/format_ail2_gtl.cpp",
"chars": 11966,
"preview": "/*\n * OPL Bank Editor by Wohlstand, a free tool for music bank editing\n * Copyright (c) 2016-2026 Vitaly Novichkov <admi"
},
{
"path": "src/FileFormats/format_ail2_gtl.h",
"chars": 1435,
"preview": "/*\n * OPL Bank Editor by Wohlstand, a free tool for music bank editing\n * Copyright (c) 2016-2026 Vitaly Novichkov <admi"
},
{
"path": "src/FileFormats/format_apogeetmb.cpp",
"chars": 4479,
"preview": "/*\n * OPL Bank Editor by Wohlstand, a free tool for music bank editing\n * Copyright (c) 2016-2026 Vitaly Novichkov <admi"
},
{
"path": "src/FileFormats/format_apogeetmb.h",
"chars": 1437,
"preview": "/*\n * OPL Bank Editor by Wohlstand, a free tool for music bank editing\n * Copyright (c) 2016-2026 Vitaly Novichkov <admi"
},
{
"path": "src/FileFormats/format_bisqwit.cpp",
"chars": 5805,
"preview": "/*\n * OPL Bank Editor by Wohlstand, a free tool for music bank editing\n * Copyright (c) 2016-2026 Vitaly Novichkov <admi"
},
{
"path": "src/FileFormats/format_bisqwit.h",
"chars": 1396,
"preview": "/*\n * OPL Bank Editor by Wohlstand, a free tool for music bank editing\n * Copyright (c) 2016-2026 Vitaly Novichkov <admi"
},
{
"path": "src/FileFormats/format_cmf_importer.cpp",
"chars": 3990,
"preview": "/*\n * OPL Bank Editor by Wohlstand, a free tool for music bank editing\n * Copyright (c) 2016-2026 Vitaly Novichkov <admi"
},
{
"path": "src/FileFormats/format_cmf_importer.h",
"chars": 1390,
"preview": "/*\n * OPL Bank Editor by Wohlstand, a free tool for music bank editing\n * Copyright (c) 2016-2026 Vitaly Novichkov <admi"
},
{
"path": "src/FileFormats/format_dmxopl2.cpp",
"chars": 8963,
"preview": "/*\n * OPL Bank Editor by Wohlstand, a free tool for music bank editing\n * Copyright (c) 2016-2026 Vitaly Novichkov <admi"
},
{
"path": "src/FileFormats/format_dmxopl2.h",
"chars": 1530,
"preview": "/*\n * OPL Bank Editor by Wohlstand, a free tool for music bank editing\n * Copyright (c) 2016-2026 Vitaly Novichkov <admi"
},
{
"path": "src/FileFormats/format_dro_importer.cpp",
"chars": 7361,
"preview": "/*\n * OPL Bank Editor by Wohlstand, a free tool for music bank editing\n * Copyright (c) 2016-2026 Vitaly Novichkov <admi"
},
{
"path": "src/FileFormats/format_dro_importer.h",
"chars": 1523,
"preview": "/*\n * OPL Bank Editor by Wohlstand, a free tool for music bank editing\n * Copyright (c) 2016-2026 Vitaly Novichkov <admi"
},
{
"path": "src/FileFormats/format_ea_importer.cpp",
"chars": 4711,
"preview": "/*\n * OPL Bank Editor by Wohlstand, a free tool for music bank editing\n * Copyright (c) 2016-2026 Vitaly Novichkov <admi"
},
{
"path": "src/FileFormats/format_ea_importer.h",
"chars": 1324,
"preview": "/*\n * OPL Bank Editor by Wohlstand, a free tool for music bank editing\n * Copyright (c) 2016-2026 Vitaly Novichkov <admi"
},
{
"path": "src/FileFormats/format_flatbuffer_opl3.cpp",
"chars": 13694,
"preview": "/*\n * OPL Bank Editor by Wohlstand, a free tool for music bank editing\n * Copyright (c) 2016-2026 Vitaly Novichkov <admi"
},
{
"path": "src/FileFormats/format_flatbuffer_opl3.h",
"chars": 1437,
"preview": "/*\n * OPL Bank Editor by Wohlstand, a free tool for music bank editing\n * Copyright (c) 2016-2026 Vitaly Novichkov <admi"
},
{
"path": "src/FileFormats/format_imf_importer.cpp",
"chars": 6385,
"preview": "/*\n * OPL Bank Editor by Wohlstand, a free tool for music bank editing\n * Copyright (c) 2016-2026 Vitaly Novichkov <admi"
},
{
"path": "src/FileFormats/format_imf_importer.h",
"chars": 1398,
"preview": "/*\n * OPL Bank Editor by Wohlstand, a free tool for music bank editing\n * Copyright (c) 2016-2026 Vitaly Novichkov <admi"
},
{
"path": "src/FileFormats/format_junlevizion.cpp",
"chars": 7982,
"preview": "/*\n * OPL Bank Editor by Wohlstand, a free tool for music bank editing\n * Copyright (c) 2016-2026 Vitaly Novichkov <admi"
},
{
"path": "src/FileFormats/format_junlevizion.h",
"chars": 1425,
"preview": "/*\n * OPL Bank Editor by Wohlstand, a free tool for music bank editing\n * Copyright (c) 2016-2026 Vitaly Novichkov <admi"
},
{
"path": "src/FileFormats/format_klm_importer.cpp",
"chars": 8148,
"preview": "/*\n * OPL Bank Editor by Wohlstand, a free tool for music bank editing\n * Copyright (c) 2016-2026 Vitaly Novichkov <admi"
},
{
"path": "src/FileFormats/format_klm_importer.h",
"chars": 1423,
"preview": "/*\n * OPL Bank Editor by Wohlstand, a free tool for music bank editing\n * Copyright (c) 2016-2026 Vitaly Novichkov <admi"
},
{
"path": "src/FileFormats/format_misc_cif.cpp",
"chars": 2255,
"preview": "/*\n * OPL Bank Editor by Wohlstand, a free tool for music bank editing\n * Copyright (c) 2016-2026 Vitaly Novichkov <admi"
},
{
"path": "src/FileFormats/format_misc_cif.h",
"chars": 1401,
"preview": "/*\n * OPL Bank Editor by Wohlstand, a free tool for music bank editing\n * Copyright (c) 2016-2026 Vitaly Novichkov <admi"
},
{
"path": "src/FileFormats/format_misc_hsc.cpp",
"chars": 2772,
"preview": "/*\n * OPL Bank Editor by Wohlstand, a free tool for music bank editing\n * Copyright (c) 2016-2026 Vitaly Novichkov <admi"
},
{
"path": "src/FileFormats/format_misc_hsc.h",
"chars": 1582,
"preview": "/*\n * OPL Bank Editor by Wohlstand, a free tool for music bank editing\n * Copyright (c) 2016-2026 Vitaly Novichkov <admi"
},
{
"path": "src/FileFormats/format_misc_sgi.cpp",
"chars": 2809,
"preview": "/*\n * OPL Bank Editor by Wohlstand, a free tool for music bank editing\n * Copyright (c) 2016-2026 Vitaly Novichkov <admi"
},
{
"path": "src/FileFormats/format_misc_sgi.h",
"chars": 1401,
"preview": "/*\n * OPL Bank Editor by Wohlstand, a free tool for music bank editing\n * Copyright (c) 2016-2026 Vitaly Novichkov <admi"
},
{
"path": "src/FileFormats/format_patch_fm4.cpp",
"chars": 8376,
"preview": "/*\n * OPL Bank Editor by Wohlstand, a free tool for music bank editing\n * Copyright (c) 2016-2026 Vitaly Novichkov <admi"
},
{
"path": "src/FileFormats/format_patch_fm4.h",
"chars": 1333,
"preview": "/*\n * OPL Bank Editor by Wohlstand, a free tool for music bank editing\n * Copyright (c) 2016-2026 Vitaly Novichkov <admi"
},
{
"path": "src/FileFormats/format_rad_importer.cpp",
"chars": 5042,
"preview": "/*\n * OPL Bank Editor by Wohlstand, a free tool for music bank editing\n * Copyright (c) 2016-2026 Vitaly Novichkov <admi"
},
{
"path": "src/FileFormats/format_rad_importer.h",
"chars": 1410,
"preview": "/*\n * OPL Bank Editor by Wohlstand, a free tool for music bank editing\n * Copyright (c) 2016-2026 Vitaly Novichkov <admi"
},
{
"path": "src/FileFormats/format_sb_ibk.cpp",
"chars": 28451,
"preview": "/*\n * OPL Bank Editor by Wohlstand, a free tool for music bank editing\n * Copyright (c) 2016-2026 Vitaly Novichkov <admi"
},
{
"path": "src/FileFormats/format_sb_ibk.h",
"chars": 5556,
"preview": "/*\n * OPL Bank Editor by Wohlstand, a free tool for music bank editing\n * Copyright (c) 2016-2026 Vitaly Novichkov <admi"
},
{
"path": "src/FileFormats/format_smaf_importer.cpp",
"chars": 9114,
"preview": "/*\n * OPL Bank Editor by Wohlstand, a free tool for music bank editing\n * Copyright (c) 2016-2026 Vitaly Novichkov <admi"
},
{
"path": "src/FileFormats/format_smaf_importer.h",
"chars": 1309,
"preview": "/*\n * OPL Bank Editor by Wohlstand, a free tool for music bank editing\n * Copyright (c) 2016-2026 Vitaly Novichkov <admi"
},
{
"path": "src/FileFormats/format_vgm_import.cpp",
"chars": 12333,
"preview": "/*\n * OPL Bank Editor by Wohlstand, a free tool for music bank editing\n * Copyright (c) 2016-2026 Vitaly Novichkov <admi"
},
{
"path": "src/FileFormats/format_vgm_import.h",
"chars": 1423,
"preview": "/*\n * OPL Bank Editor by Wohlstand, a free tool for music bank editing\n * Copyright (c) 2016-2026 Vitaly Novichkov <admi"
},
{
"path": "src/FileFormats/format_wohlstand_opl3.cpp",
"chars": 17780,
"preview": "/*\n * OPL Bank Editor by Wohlstand, a free tool for music bank editing\n * Copyright (c) 2016-2026 Vitaly Novichkov <admi"
},
{
"path": "src/FileFormats/format_wohlstand_opl3.h",
"chars": 2484,
"preview": "/*\n * OPL Bank Editor by Wohlstand, a free tool for music bank editing\n * Copyright (c) 2016-2026 Vitaly Novichkov <admi"
},
{
"path": "src/FileFormats/format_wohlstand_opl3_text.cpp",
"chars": 25535,
"preview": "/*\n * OPL Bank Editor by Wohlstand, a free tool for music bank editing\n * Copyright (c) 2016-2026 Vitaly Novichkov <admi"
},
{
"path": "src/FileFormats/format_wohlstand_opl3_text.h",
"chars": 1910,
"preview": "/*\n * OPL Bank Editor by Wohlstand, a free tool for music bank editing\n * Copyright (c) 2016-2026 Vitaly Novichkov <admi"
},
{
"path": "src/FileFormats/wopl/wopl_file.c",
"chars": 16814,
"preview": "/*\n * Wohlstand's OPL3 Bank File - a bank format to store OPL3 timbre data and setup\n *\n * Copyright (c) 2015-2026 Vital"
},
{
"path": "src/FileFormats/wopl/wopl_file.h",
"chars": 10422,
"preview": "/*\n * Wohlstand's OPL3 Bank File - a bank format to store OPL3 timbre data and setup\n *\n * Copyright (c) 2015-2026 Vital"
},
{
"path": "src/FileFormats/ymf262_to_wopi.cpp",
"chars": 9777,
"preview": "/*\n * OPL Bank Editor by Wohlstand, a free tool for music bank editing\n * Copyright (c) 2016-2026 Vitaly Novichkov <admi"
},
{
"path": "src/FileFormats/ymf262_to_wopi.h",
"chars": 2135,
"preview": "/*\n * OPL Bank Editor by Wohlstand, a free tool for music bank editing\n * Copyright (c) 2016-2026 Vitaly Novichkov <admi"
},
{
"path": "src/audio/ao_rtaudio.cpp",
"chars": 7833,
"preview": "/*\n * OPL Bank Editor by Wohlstand, a free tool for music bank editing\n * Copyright (c) 2018-2026 Vitaly Novichkov <admi"
},
{
"path": "src/audio/ao_rtaudio.h",
"chars": 2132,
"preview": "/*\n * OPL Bank Editor by Wohlstand, a free tool for music bank editing\n * Copyright (c) 2018-2026 Vitaly Novichkov <admi"
},
{
"path": "src/audio/ao_rtaudio.pri",
"chars": 1097,
"preview": "SOURCES += \\\n $$PWD/ao_rtaudio.cpp \\\n $$PWD/external/rtaudio/RtAudio.cpp\n\nHEADERS += \\\n $$PWD/ao_rtaudio.h \\\n "
},
{
"path": "src/audio/for-mingw-9x/dsound.h",
"chars": 63299,
"preview": "#undef INTERFACE\n/*\n * Copyright (C) the Wine project\n *\n * This library is free software; you can redistribute it and/o"
},
{
"path": "src/audio.cpp",
"chars": 9388,
"preview": "/*\n * OPL Bank Editor by Wohlstand, a free tool for music bank editing\n * Copyright (c) 2016-2026 Vitaly Novichkov <admi"
},
{
"path": "src/audio_config.cpp",
"chars": 3926,
"preview": "/*\n * OPL Bank Editor by Wohlstand, a free tool for music bank editing\n * Copyright (c) 2018-2026 Vitaly Novichkov <admi"
},
{
"path": "src/audio_config.h",
"chars": 1627,
"preview": "/*\n * OPL Bank Editor by Wohlstand, a free tool for music bank editing\n * Copyright (c) 2018-2026 Vitaly Novichkov <admi"
},
{
"path": "src/audio_config.ui",
"chars": 7230,
"preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<ui version=\"4.0\">\n <class>AudioConfigDialog</class>\n <widget class=\"QDialog\" nam"
},
{
"path": "src/bank.cpp",
"chars": 14829,
"preview": "/*\n * OPL Bank Editor by Wohlstand, a free tool for music bank editing\n * Copyright (c) 2016-2026 Vitaly Novichkov <admi"
},
{
"path": "src/bank.h",
"chars": 14116,
"preview": "/*\n * OPL Bank Editor by Wohlstand, a free tool for music bank editing\n * Copyright (c) 2016-2026 Vitaly Novichkov <admi"
},
{
"path": "src/bank_comparison.cpp",
"chars": 11176,
"preview": "/*\n * OPL Bank Editor by Wohlstand, a free tool for music bank editing\n * Copyright (c) 2016-2026 Vitaly Novichkov <admi"
},
{
"path": "src/bank_comparison.h",
"chars": 2922,
"preview": "/*\n * OPL Bank Editor by Wohlstand, a free tool for music bank editing\n * Copyright (c) 2016-2026 Vitaly Novichkov <admi"
},
{
"path": "src/bank_comparison.ui",
"chars": 2120,
"preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<ui version=\"4.0\">\n <class>BankCompareDialog</class>\n <widget class=\"QDialog\" nam"
},
{
"path": "src/bank_editor.cpp",
"chars": 76716,
"preview": "/*\n * OPL Bank Editor by Wohlstand, a free tool for music bank editing\n * Copyright (c) 2016-2026 Vitaly Novichkov <admi"
},
{
"path": "src/bank_editor.h",
"chars": 17436,
"preview": "/*\n * OPL Bank Editor by Wohlstand, a free tool for music bank editing\n * Copyright (c) 2016-2026 Vitaly Novichkov <admi"
},
{
"path": "src/bank_editor.ui",
"chars": 110958,
"preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<ui version=\"4.0\">\n <class>BankEditor</class>\n <widget class=\"QMainWindow\" name=\""
},
{
"path": "src/bank_type_dlg.cpp",
"chars": 1866,
"preview": "#include <QFileInfo>\n#include <QGridLayout>\n#include <QLabel>\n#include <QPushButton>\n#include <QCheckBox>\n\n#include \"ban"
},
{
"path": "src/bank_type_dlg.h",
"chars": 573,
"preview": "#ifndef BANK_TYPE_DLG_H\n#define BANK_TYPE_DLG_H\n\n#include <QDialog>\n#include <QObject>\n\nclass FmBankFormatBase;\n\nclass B"
},
{
"path": "src/common.cpp",
"chars": 5673,
"preview": "/*\n * OPL Bank Editor by Wohlstand, a free tool for music bank editing\n * Copyright (c) 2016-2026 Vitaly Novichkov <admi"
},
{
"path": "src/common.h",
"chars": 5135,
"preview": "/*\n * OPL Bank Editor by Wohlstand, a free tool for music bank editing\n * Copyright (c) 2016-2026 Vitaly Novichkov <admi"
},
{
"path": "src/controlls.cpp",
"chars": 6420,
"preview": "/*\n * OPL Bank Editor by Wohlstand, a free tool for music bank editing\n * Copyright (c) 2016-2026 Vitaly Novichkov <admi"
},
{
"path": "src/delay_analysis.cpp",
"chars": 7861,
"preview": "/*\n * OPL Bank Editor by Wohlstand, a free tool for music bank editing\n * Copyright (c) 2016-2026 Vitaly Novichkov <admi"
},
{
"path": "src/delay_analysis.h",
"chars": 2222,
"preview": "/*\n * OPL Bank Editor by Wohlstand, a free tool for music bank editing\n * Copyright (c) 2016-2026 Vitaly Novichkov <admi"
},
{
"path": "src/delay_analysis.ui",
"chars": 2856,
"preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<ui version=\"4.0\">\n <class>DelayAnalysis</class>\n <widget class=\"QDialog\" name=\"D"
},
{
"path": "src/flatbuffers/base.h",
"chars": 6768,
"preview": "#ifndef FLATBUFFERS_BASE_H_\n#define FLATBUFFERS_BASE_H_\n\n#if defined(FLATBUFFERS_MEMORY_LEAK_TRACKING) && \\\n defined("
},
{
"path": "src/flatbuffers/flatbuffers.h",
"chars": 79605,
"preview": "/*\n * Copyright 2014 Google Inc. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License"
},
{
"path": "src/flatbuffers/stl_emulation.h",
"chars": 7446,
"preview": "/*\n * Copyright 2017 Google Inc. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License"
},
{
"path": "src/formats_sup.cpp",
"chars": 4157,
"preview": "/*\n * OPL Bank Editor by Wohlstand, a free tool for music bank editing\n * Copyright (c) 2016-2026 Vitaly Novichkov <admi"
},
{
"path": "src/formats_sup.h",
"chars": 1197,
"preview": "/*\n * OPL Bank Editor by Wohlstand, a free tool for music bank editing\n * Copyright (c) 2016-2026 Vitaly Novichkov <admi"
},
{
"path": "src/formats_sup.ui",
"chars": 2190,
"preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<ui version=\"4.0\">\n <class>formats_sup</class>\n <widget class=\"QDialog\" name=\"for"
},
{
"path": "src/hardware.cpp",
"chars": 5233,
"preview": "/*\n * OPL Bank Editor by Wohlstand, a free tool for music bank editing\n * Copyright (c) 2018-2026 Vitaly Novichkov <admi"
},
{
"path": "src/hardware.h",
"chars": 1769,
"preview": "/*\n * OPL Bank Editor by Wohlstand, a free tool for music bank editing\n * Copyright (c) 2018-2026 Vitaly Novichkov <admi"
},
{
"path": "src/hardware.ui",
"chars": 5071,
"preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<ui version=\"4.0\">\n <class>HardwareDialog</class>\n <widget class=\"QDialog\" name=\""
},
{
"path": "src/importer.cpp",
"chars": 18492,
"preview": "/*\n * OPL Bank Editor by Wohlstand, a free tool for music bank editing\n * Copyright (c) 2016-2026 Vitaly Novichkov <admi"
},
{
"path": "src/importer.h",
"chars": 2461,
"preview": "/*\n * OPL Bank Editor by Wohlstand, a free tool for music bank editing\n * Copyright (c) 2016-2026 Vitaly Novichkov <admi"
},
{
"path": "src/importer.ui",
"chars": 8866,
"preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<ui version=\"4.0\">\n <class>Importer</class>\n <widget class=\"QDialog\" name=\"Import"
},
{
"path": "src/ins_names.cpp",
"chars": 4456,
"preview": "/*\n * OPL Bank Editor by Wohlstand, a free tool for music bank editing\n * Copyright (c) 2016-2026 Vitaly Novichkov <admi"
},
{
"path": "src/ins_names.h",
"chars": 3034,
"preview": "/*\n * OPL Bank Editor by Wohlstand, a free tool for music bank editing\n * Copyright (c) 2016-2026 Vitaly Novichkov <admi"
},
{
"path": "src/ins_names_data.h",
"chars": 951591,
"preview": "/*\n * OPN2 Bank Editor by Wohlstand, a free tool for music bank editing\n * Copyright (c) 2017-2026 Vitaly Novichkov <adm"
},
{
"path": "src/main.cpp",
"chars": 4612,
"preview": "/*\n * OPL Bank Editor by Wohlstand, a free tool for music bank editing\n * Copyright (c) 2016-2026 Vitaly Novichkov <admi"
},
{
"path": "src/main.h",
"chars": 2394,
"preview": "/*\n * OPL Bank Editor by Wohlstand, a free tool for music bank editing\n * Copyright (c) 2018-2026 Vitaly Novichkov <admi"
},
{
"path": "src/metaparameter.h",
"chars": 3419,
"preview": "/*\n * OPL Bank Editor by Wohlstand, a free tool for music bank editing\n * Copyright (c) 2016-2026 Vitaly Novichkov <admi"
},
{
"path": "src/midi/midi_rtmidi.cpp",
"chars": 3804,
"preview": "/*\n * OPL Bank Editor by Wohlstand, a free tool for music bank editing\n * Copyright (c) 2016-2026 Vitaly Novichkov <admi"
},
{
"path": "src/midi/midi_rtmidi.h",
"chars": 1781,
"preview": "/*\n * OPL Bank Editor by Wohlstand, a free tool for music bank editing\n * Copyright (c) 2016-2026 Vitaly Novichkov <admi"
},
{
"path": "src/midi/midi_rtmidi.pri",
"chars": 385,
"preview": "SOURCES += \\\n $$PWD/midi_rtmidi.cpp \\\n $$PWD/external/rtmidi/RtMidi.cpp\n\nHEADERS += \\\n $$PWD/midi_rtmidi.h \\\n "
},
{
"path": "src/operator_editor.cpp",
"chars": 3644,
"preview": "/*\n * OPL Bank Editor by Wohlstand, a free tool for music bank editing\n * Copyright (c) 2017-2026 Vitaly Novichkov <admi"
},
{
"path": "src/operator_editor.h",
"chars": 1462,
"preview": "/*\n * OPL Bank Editor by Wohlstand, a free tool for music bank editing\n * Copyright (c) 2017-2026 Vitaly Novichkov <admi"
},
{
"path": "src/operator_editor.ui",
"chars": 31879,
"preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<ui version=\"4.0\">\n <class>OperatorEditor</class>\n <widget class=\"QWidget\" name=\""
},
{
"path": "src/opl/generator.cpp",
"chars": 40761,
"preview": "/*\n * OPL Bank Editor by Wohlstand, a free tool for music bank editing\n * Copyright (c) 2016-2026 Vitaly Novichkov <admi"
},
{
"path": "src/opl/generator.h",
"chars": 9895,
"preview": "/*\n * OPL Bank Editor by Wohlstand, a free tool for music bank editing\n * Copyright (c) 2016-2026 Vitaly Novichkov <admi"
},
{
"path": "src/opl/generator_realtime.cpp",
"chars": 15106,
"preview": "/*\n * OPL Bank Editor by Wohlstand, a free tool for music bank editing\n * Copyright (c) 2018-2026 Vitaly Novichkov <admi"
},
{
"path": "src/opl/generator_realtime.h",
"chars": 6264,
"preview": "/*\n * OPL Bank Editor by Wohlstand, a free tool for music bank editing\n * Copyright (c) 2018-2026 Vitaly Novichkov <admi"
},
{
"path": "src/opl/measurer.cpp",
"chars": 30639,
"preview": "/*\n * OPL Bank Editor by Wohlstand, a free tool for music bank editing\n * Copyright (c) 2016-2026 Vitaly Novichkov <admi"
},
{
"path": "src/opl/measurer.h",
"chars": 1989,
"preview": "/*\n * OPL Bank Editor by Wohlstand, a free tool for music bank editing\n * Copyright (c) 2016-2026 Vitaly Novichkov <admi"
},
{
"path": "src/opl/models/LICENSE.txt",
"chars": 1104,
"preview": "Copyright (c) 2025-2026 Vitaly Novichkov <admin@wohlnet.ru>\r\n\r\nPermission is hereby granted, free of charge, to any pers"
},
{
"path": "src/opl/models/model_ail.c",
"chars": 6924,
"preview": "/*\n * OPL2/OPL3 models library - a set of various conversion models for OPL-family chips\n *\n * Copyright (c) 2025-2026 V"
},
{
"path": "src/opl/models/model_apogee.c",
"chars": 6946,
"preview": "/*\n * OPL2/OPL3 models library - a set of various conversion models for OPL-family chips\n *\n * Copyright (c) 2025-2026 V"
},
{
"path": "src/opl/models/model_dmx.c",
"chars": 10368,
"preview": "/*\n * OPL2/OPL3 models library - a set of various conversion models for OPL-family chips\n *\n * Copyright (c) 2025-2026 V"
},
{
"path": "src/opl/models/model_generic.c",
"chars": 19198,
"preview": "/*\n * OPL2/OPL3 models library - a set of various conversion models for OPL-family chips\n *\n * Copyright (c) 2025-2026 V"
},
{
"path": "src/opl/models/model_hmi_sos.c",
"chars": 7459,
"preview": "/*\n * OPL2/OPL3 models library - a set of various conversion models for OPL-family chips\n *\n * Copyright (c) 2025-2026 V"
},
{
"path": "src/opl/models/model_msadlib.c",
"chars": 7243,
"preview": "/*\n * OPL2/OPL3 models library - a set of various conversion models for OPL-family chips\n *\n * Copyright (c) 2025-2026 V"
}
]
// ... and 721 more files (download for full content)
About this extraction
This page contains the full source code of the Wohlstand/OPL3BankEditor GitHub repository, extracted and formatted as plain text for AI agents and large language models (LLMs). The extraction includes 921 files (7.9 MB), approximately 2.1M tokens, and a symbol index with 813 extracted functions, classes, methods, constants, and types. Use this with OpenClaw, Claude, ChatGPT, Cursor, Windsurf, or any other AI tool that accepts text input. You can copy the full output to your clipboard or download it as a .txt file.
Extracted by GitExtract — free GitHub repo to text converter for AI. Built by Nikandr Surkov.