Export Hoot memory dumps to VOPM instruments
Nevar pievienot vairāk kā 25 tēmas Tēmai ir jāsākas ar burtu vai ciparu, tā var saturēt domu zīmes ('-') un var būt līdz 35 simboliem gara.

154 rindas
4.2KB

  1. #!/usr/bin/python3
  2. import sys, getopt
  3. def Error(*args):
  4. print(sys.argv[0]+":", *args, file=sys.stderr)
  5. sys.exit(1)
  6. if len(sys.argv) > 1:
  7. Filename = sys.argv[1]
  8. Options, Args = getopt.getopt(sys.argv[1:], "ot:")
  9. def OptionExist(opt):
  10. global Options
  11. f = list(filter(lambda x: x[0] == opt, Options))
  12. return len(f) >= 1
  13. def GetOption(opt):
  14. global Options
  15. f = list(filter(lambda x: x[0] == opt, Options))
  16. if len(f) == 0: return None
  17. else: return f[0][1]
  18. if len(Args) >= 1:
  19. Filename = Args[0]
  20. else:
  21. Error("need a file, genius")
  22. DataFile = open(Filename,"r")
  23. # MiOPMdrv sound bank Paramer Ver2002.04.22
  24. # LFO: LFRQ AMD PMD WF NFRQ
  25. # @:[Num] [Name]
  26. # CH: PAN FL CON AMS PMS SLOT NE
  27. # [OPname]: AR D1R D2R RR D1L TL KS MUL DT1 DT2 AMS-EN
  28. Data = []
  29. OpNames = ["M1","C1","M2","C2"]
  30. OpIdx = [0,2,1,3]
  31. for line in DataFile.readlines():
  32. for byte in line.strip().split(",")[:16]:
  33. Data.append(int(byte,16))
  34. def PrintOPM(data):
  35. ne = (data[0xf] & 0b10000000) >> 7
  36. slot = 120
  37. pan = 64
  38. for i in range(8):
  39. print("@:%d Ins%d" % (i, i))
  40. print("LFO: 0 0 0 0 0") # no way to get this data... at least for now
  41. meta = data[0x20 + i : 0x3f + i : 8]
  42. fl = (meta[0] & 0b00111000) >> 3
  43. con = (meta[0] & 0b00000111)
  44. pms = (meta[3] & 0b01110000) >> 4
  45. ams = (meta[3] & 0b00000011)
  46. print("CH:", pan, fl, con, ams, pms, slot, ne)
  47. for op in range(4):
  48. get = lambda x: data[x + i + OpIdx[op]*8]
  49. b = get(0x40)
  50. dt1 = (b & 0b01110000) >> 4
  51. mul = (b & 0b00001111)
  52. tl = get(0x60)
  53. b = get(0x80)
  54. ks = (b & 0b11000000) >> 6
  55. ar = (b & 0b00011111)
  56. b = get(0xa0)
  57. amsen = (b & 0b10000000) >> 7
  58. d1r = (b & 0b00011111)
  59. b = get(0xc0)
  60. dt2 = (b & 0b11000000) >> 6
  61. d2r = (b & 0b00011111)
  62. b = get(0xe0)
  63. d1l = (b & 0b11110000) >> 4
  64. rr = (b & 0b00001111)
  65. print(OpNames[op] + ":", ar, d1r, d2r, rr, d1l, tl, ks, mul, dt1, dt2, amsen)
  66. print()
  67. def PrintOPN(data):
  68. slot = 120
  69. pan = 64
  70. ne = 0 # either i'm blind or opn has no noise enable bit (not that i care either way)
  71. # SR in opn parlance is equivalent to D2R in opm, thanks yamaha
  72. # likewise, SL -> D1L and DR -> D1R
  73. for i in range(3):
  74. print("@:%d Ins%d" % (i, i))
  75. print("LFO: 0 0 0 0 0") # no way to get this data... at least for now
  76. fbcon = data[0xb0 + i]
  77. fl = (fbcon & 0b00111000) >> 3
  78. con = (fbcon & 0b00000111)
  79. sens = data[0xb4 + i]
  80. ams = (sens & 0b00110000) >> 4
  81. pms = (sens & 0b00000111)
  82. print("CH:", pan, fl, con, ams, pms, slot, ne)
  83. for op in range(4):
  84. get = lambda x: data[x + i + OpIdx[op]*4]
  85. b = get(0x30)
  86. dt1 = (b & 0b01110000) >> 4
  87. mul = (b & 0b00001111)
  88. tl = get(0x40)
  89. b = get(0x50)
  90. ks = (b & 0b11000000) >> 6
  91. ar = (b & 0b00011111)
  92. b = get(0x60)
  93. amsen = (b & 0b10000000) >> 7
  94. d1r = (b & 0b00011111)
  95. b = get(0x70)
  96. dt2 = (b & 0b11000000) >> 6
  97. d2r = (b & 0b00011111)
  98. b = get(0x80)
  99. d1l = (b & 0b11110000) >> 4
  100. rr = (b & 0b00001111)
  101. print(OpNames[op] + ":", ar, d1r, d2r, rr, d1l, tl, ks, mul, dt1, dt2, amsen)
  102. TypeFuncs = {
  103. "opn": PrintOPN,
  104. "opna": PrintOPN, # fm portion of opn and opna are functionally equivalent
  105. "opm": PrintOPM
  106. }
  107. Type = GetOption("-t").lower()
  108. if Type==None:
  109. Error("no chip type specified")
  110. if Type not in TypeFuncs:
  111. Error(Type+":","unknown chip type")
  112. print("// Exported by hootvopm : https://gitlab.com/whutt/hootvopm")
  113. print("// Chip type:",Type)
  114. TypeFuncs[Type](Data)