|
- #!/usr/bin/python3
- import sys, getopt
-
- def Error(*args):
- print(sys.argv[0]+":", *args, file=sys.stderr)
- sys.exit(1)
-
- if len(sys.argv) > 1:
- Filename = sys.argv[1]
-
- Options, Args = getopt.getopt(sys.argv[1:], "ot:")
-
- def OptionExist(opt):
- global Options
- f = list(filter(lambda x: x[0] == opt, Options))
- return len(f) >= 1
-
- def GetOption(opt):
- global Options
- f = list(filter(lambda x: x[0] == opt, Options))
- if len(f) == 0: return None
- else: return f[0][1]
-
- if len(Args) >= 1:
- Filename = Args[0]
- else:
- Error("need a file, genius")
-
-
- DataFile = open(Filename,"r")
- # MiOPMdrv sound bank Paramer Ver2002.04.22
- # LFO: LFRQ AMD PMD WF NFRQ
- # @:[Num] [Name]
- # CH: PAN FL CON AMS PMS SLOT NE
- # [OPname]: AR D1R D2R RR D1L TL KS MUL DT1 DT2 AMS-EN
- Data = []
- OpNames = ["M1","C1","M2","C2"]
- OpIdx = [0,2,1,3]
-
- for line in DataFile.readlines():
- for byte in line.strip().split(",")[:16]:
- Data.append(int(byte,16))
-
- def PrintOPM(data):
- ne = (data[0xf] & 0b10000000) >> 7
- slot = 120
- pan = 64
- for i in range(8):
- print("@:%d Ins%d" % (i, i))
-
- print("LFO: 0 0 0 0 0") # no way to get this data... at least for now
-
- meta = data[0x20 + i : 0x3f + i : 8]
-
- fl = (meta[0] & 0b00111000) >> 3
- con = (meta[0] & 0b00000111)
-
- pms = (meta[3] & 0b01110000) >> 4
- ams = (meta[3] & 0b00000011)
-
- print("CH:", pan, fl, con, ams, pms, slot, ne)
-
- for op in range(4):
- get = lambda x: data[x + i + OpIdx[op]*8]
-
- b = get(0x40)
- dt1 = (b & 0b01110000) >> 4
- mul = (b & 0b00001111)
-
- tl = get(0x60)
-
- b = get(0x80)
- ks = (b & 0b11000000) >> 6
- ar = (b & 0b00011111)
-
- b = get(0xa0)
- amsen = (b & 0b10000000) >> 7
- d1r = (b & 0b00011111)
-
- b = get(0xc0)
- dt2 = (b & 0b11000000) >> 6
- d2r = (b & 0b00011111)
-
- b = get(0xe0)
- d1l = (b & 0b11110000) >> 4
- rr = (b & 0b00001111)
-
- print(OpNames[op] + ":", ar, d1r, d2r, rr, d1l, tl, ks, mul, dt1, dt2, amsen)
-
- print()
-
- def PrintOPN(data):
- slot = 120
- pan = 64
- ne = 0 # either i'm blind or opn has no noise enable bit (not that i care either way)
- # SR in opn parlance is equivalent to D2R in opm, thanks yamaha
- # likewise, SL -> D1L and DR -> D1R
- for i in range(3):
- print("@:%d Ins%d" % (i, i))
- print("LFO: 0 0 0 0 0") # no way to get this data... at least for now
-
- fbcon = data[0xb0 + i]
- fl = (fbcon & 0b00111000) >> 3
- con = (fbcon & 0b00000111)
-
- sens = data[0xb4 + i]
- ams = (sens & 0b00110000) >> 4
- pms = (sens & 0b00000111)
-
- print("CH:", pan, fl, con, ams, pms, slot, ne)
-
- for op in range(4):
- get = lambda x: data[x + i + OpIdx[op]*4]
-
- b = get(0x30)
- dt1 = (b & 0b01110000) >> 4
- mul = (b & 0b00001111)
-
- tl = get(0x40)
-
- b = get(0x50)
- ks = (b & 0b11000000) >> 6
- ar = (b & 0b00011111)
-
- b = get(0x60)
- amsen = (b & 0b10000000) >> 7
- d1r = (b & 0b00011111)
-
- b = get(0x70)
- dt2 = (b & 0b11000000) >> 6
- d2r = (b & 0b00011111)
-
- b = get(0x80)
- d1l = (b & 0b11110000) >> 4
- rr = (b & 0b00001111)
-
- print(OpNames[op] + ":", ar, d1r, d2r, rr, d1l, tl, ks, mul, dt1, dt2, amsen)
-
- TypeFuncs = {
- "opn": PrintOPN,
- "opna": PrintOPN, # fm portion of opn and opna are functionally equivalent
- "opm": PrintOPM
- }
-
- Type = GetOption("-t").lower()
- if Type==None:
- Error("no chip type specified")
- if Type not in TypeFuncs:
- Error(Type+":","unknown chip type")
-
- print("// Exported by hootvopm : https://gitlab.com/whutt/hootvopm")
- print("// Chip type:",Type)
- TypeFuncs[Type](Data)
|