def format(self, patch, data): bitstream = BitStream(data) write_bits = bitstream.write_bits bitstream.write_bitsa([8, 4, 10, 10], [ NVARIATIONS, NMORPHS, 0, 0]) # variations seem to be 9 bytes with first nibble variation # from 0 ~ 8 # number of morph parameters starts at byte 7-bit 0 for 5-bits morphs = patch.settings.morphs for variation in xrange(NVARIATIONS): write_bits(4, variation) bitstream.seek_bit(4 + (6 * 8) + 4, 1) # collect all morph_maps of this variation into 1 array morph_maps = [] for morph in morphs: morph_maps.extend(morph.maps[variation]) def mod_param_index_cmp(a, b): return cmp(a.param.module.index, b.param.module.index) morph_maps.sort(mod_param_index_cmp) write_bits(8, len(morph_maps)) for morph_map in morph_maps: values = [ morph_map.param.module.area.index, morph_map.param.module.index, morph_map.param.index, morph_map.morph.index, morph_map.range, ] # range is signed bitstream.write_bitsa([2, 8, 7, 4, 8], values) write_bits(4, 0) # always 0 bitstream.seek_bit(-4, 1) # remove last 4-bits return bitstream.tell_bit()
def parse(self, patch, data): bitstream = BitStream(data) read_bits = bitstream.read_bits nvariations, nmorphs, _, _ = bitstream.read_bitsa([8, 4, 10, 10]) # variations seem to be 9 bytes with first nibble variation # from 0 ~ 8 # number of morph parameters starts at byte 7-bit 0 for 5-bits morphs = patch.settings.morphs morphmaps = patch.settings.morphmaps for i in xrange(nvariations): variation = read_bits(4) bitstream.seek_bit(4 + (6*8) + 4, 1) # zeros nmorphs = read_bits(8) for j in xrange(nmorphs): morph_map = MorphMap() area, index, param, morph = bitstream.read_bitsa([2, 8, 7, 4]) morph_map.range = read_bits(8, 1) module = get_patch_area(patch, area).find_module(index) morph_map.param = module.params[param] morph_map.variation = variation morph_map.morph = morphs[morph-1] morph_map.morph.maps[variation].append(morph_map) morphmaps[variation].append(morph_map) reserved = read_bits(4) # always 0
def parse(self, patch, data): bitstream = BitStream(data) read_bits = bitstream.read_bits nvariations, nmorphs, _, _ = bitstream.read_bitsa([8, 4, 10, 10]) # variations seem to be 9 bytes with first nibble variation # from 0 ~ 8 # number of morph parameters starts at byte 7-bit 0 for 5-bits morphs = patch.settings.morphs morphmaps = patch.settings.morphmaps for i in xrange(nvariations): variation = read_bits(4) bitstream.seek_bit(4 + (6 * 8) + 4, 1) # zeros nmorphs = read_bits(8) for j in xrange(nmorphs): morph_map = MorphMap() area, index, param, morph = bitstream.read_bitsa([2, 8, 7, 4]) morph_map.range = read_bits(8, 1) module = get_patch_area(patch, area).find_module(index) morph_map.param = module.params[param] morph_map.variation = variation morph_map.morph = morphs[morph - 1] morph_map.morph.maps[variation].append(morph_map) morphmaps[variation].append(morph_map) reserved = read_bits(4) # always 0
def cmd_settings(command): g2usb.send_message([CMD_SYS, 0x41, 0x35, 0x04]) syst = g2usb.send_message([CMD_SYS, 0x41, 0x02]) synthname, syst = parse_name(syst[4:]) printf('%s:\n', synthname) bitstream = BitStream(syst) mode = bitstream.read_bits(1) bitstream.seek_bit(8*5) midis = bitstream.read_bitsa([8]*5) sysex, local, _, prgch = bitstream.read_bitsa([8, 1, 7, 8]) _, clkse, clkre, _ = bitstream.read_bitsa([1, 1, 1, 5]) _, tune_cent, _, tune_semi = bitstream.read_bitsa([8, 8, 16, 8]) _, pedal_polarity, _, pedal_gain = bitstream.read_bitsa([8, 1, 7, 8]) printf(' mode: %s\n', ['Patch', 'Performance'][mode]) printf(' midi:\n') printf(' slots: a:%d b:%d c:%d d:%d glob:%d\n', *midis) printf(' sysex: %d\n', sysex+1) printf(' local: %s\n', ['off','on'][local]) printf(' prgch: %s\n', ['off','send','recv','send/recv'][prgch]) printf(' clkse: %s\n', ['on','off'][clkse]) printf(' clkre: %s\n', ['on','off'][clkre]) printf(' tune semi: %d\n', struct.unpack('b',chr(tune_semi))[0]) printf(' tune cent: %d\n', struct.unpack('b',chr(tune_cent))[0]) printf(' pedal polarity: %s\n', ['open','closed'][pedal_polarity]) printf(' pedal gain: %.2f\n', 1.0 + 0.5*pedal_gain/32) sels = g2usb.send_message([CMD_SYS, 0x41, 0x81]) data = g2usb.send_message([CMD_SYS, sels[2], 0x10]) perfname, data = parse_name(data[4:]) bitstream = BitStream(data, 8*4) if mode: printf('Performance: %s\n', perfname) else: printf('Patches: %s\n', perfname) _, focus, _ = bitstream.read_bitsa([4, 2, 2]) range_enable, bpm, split, clock = bitstream.read_bitsa([8, 8, 8, 8]) printf(' focus: %s\n', 'abcd'[focus]) printf(' range enable: %s\n', ['off','on'][range_enable]) printf(' master clock: %d BPM: %s\n', bpm, ['stop','run'][clock]) printf(' kb split: %s\n', ['off','on'][split]) data = data[11:] for slot in range(4): name, data = parse_name(data) active, key, hold, bank, patch, low, high = data[:7] printf(' slot %s: %d:%d "%-16s"\n', 'abcd'[slot], bank+1, patch+1, name) printf(' active: %-3s, ', ['off','on'][active]) printf('key: %-3s, ', ['off','on'][key]) printf('hold: %-3s, ', ['off','on'][hold]) printf('range: %d-%d\n', low, high) data = data[10:] return 0
def format(self, patch, data): bitstream = BitStream(data) write_bits = bitstream.write_bits bitstream.write_bitsa([8, 4, 10, 10], [NVARIATIONS, NMORPHS, 0, 0]) # variations seem to be 9 bytes with first nibble variation # from 0 ~ 8 # number of morph parameters starts at byte 7-bit 0 for 5-bits morphs = patch.settings.morphs for variation in xrange(NVARIATIONS): write_bits(4, variation) bitstream.seek_bit(4 + (6 * 8) + 4, 1) # collect all morph_maps of this variation into 1 array morph_maps = [] for morph in morphs: morph_maps.extend(morph.maps[variation]) def mod_param_index_cmp(a, b): return cmp(a.param.module.index, b.param.module.index) morph_maps.sort(mod_param_index_cmp) write_bits(8, len(morph_maps)) for morph_map in morph_maps: values = [ morph_map.param.module.area.index, morph_map.param.module.index, morph_map.param.index, morph_map.morph.index, morph_map.range, ] # range is signed bitstream.write_bitsa([2, 8, 7, 4, 8], values) write_bits(4, 0) # always 0 bitstream.seek_bit(-4, 1) # remove last 4-bits return bitstream.tell_bit()