Export Hoot memory dumps to VOPM instruments
Vous ne pouvez pas sélectionner plus de 25 sujets Les noms de sujets doivent commencer par une lettre ou un nombre, peuvent contenir des tirets ('-') et peuvent comporter jusqu'à 35 caractères.

154 lignes
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)