aboutsummaryrefslogtreecommitdiff
path: root/dump_patches.py
blob: 22416c84923a148614bbb74732aa7b38945b2973 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
# Part of the Fifteen-Thieves Project
# Chris Xiong 2020
# License: Expat (MIT)

import time
import math
import sys
import xv.model
import xv.amap
import xv.util

inst_sets=[(96,"classical"),(97,"contemporary"),(98,"solo"),(99,"enhanced"),(80,"special_1"),(81,"special_2")]
rhyt_sets=[(104,"classical"),(105,"contemporary"),(106,"solo"),(107,"enhanced")]

if __name__ == "__main__":
    print("loading address mapping...", flush=True)
    m = xv.amap.AddrMapTemplate("amaps/sd-80.amap")
    t = xv.amap.create_addr_map_tree(m)
    print("creating device...", flush=True)
    x = xv.model.Model("SD-80 Part A",[0x00, 0x48],0x10,t)
    print("initializing device...", flush=True)
    x.write_locations("sd_root.setup.native_on", 0)
    time.sleep(0.05)

    gm2pcb=[]
    gm2rhy=[]
    with open("data/gm2pcbanks","r") as f:
        gm2pcb = [int(x.strip(), 16) for x in f.readline().split(',')]
        gm2rhy = [int(x.strip()) for x in f.readline().split(',')]

    for iset in inst_sets:
        for pc in range(0, 128):
            for bk in range(0, 1 if iset[0] < 96 else gm2pcb[pc]):
                x.midio.send_message([0xb0,0x00,iset[0]])
                x.midio.send_message([0xb0,0x20,bk])
                x.midio.send_message([0xc0,pc])
                mr = x.read_locations("sd_root.part[0]", 1)
                pcn = x.aroot.value("sd_root.part[0].patch.pc_common.name")
                pcn = pcn.decode().strip().replace('/','∕')
                print(f"{bk:02d}:{pc:03d} {pcn}")
                fn = f"data/patchparam/{iset[1]}/{bk:02d}-{pc:03d}-{pcn}.memoryregion"
                xv.util.write_memoryregion(fn, mr)

    for rset in rhyt_sets:
        for pc in gm2rhy:
            x.midio.send_message([0xb0,0x00,rset[0]])
            x.midio.send_message([0xb0,0x20,0])
            x.midio.send_message([0xc0,pc])
            mr = x.read_locations("sd_root.part[0]", 2)
            pcn = x.aroot.value("sd_root.part[0].rhythm.ry_common.name")
            pcn = pcn.decode().strip().replace('/','∕')
            print(f"{pc:02d} {pcn}")
            fn = f"data/rhythmparam/{rset[1]}/{pc:02d}-{pcn}.memoryregion"
            xv.util.write_memoryregion(fn, mr)