diff --git a/functions/data_bytes.py b/functions/data_bytes.py index 339c7368..9497c5d1 100644 --- a/functions/data_bytes.py +++ b/functions/data_bytes.py @@ -1,10 +1,6 @@ # SPDX-FileCopyrightText: 2024 SatyrDiamond # SPDX-License-Identifier: GPL-3.0-or-later -from io import BytesIO -import numpy as np -import struct - # ----- Bytes ----- def splitbyte(value): @@ -12,53 +8,6 @@ def splitbyte(value): second = value & 0x0F return (first, second) -def to_bin(value, length): - return [int(d) for d in bin(value)[2:].zfill(length)] - -def crc16(data: bytes): - table = [ - 0x0000, 0x1021, 0x2042, 0x3063, 0x4084, 0x50A5, 0x60C6, 0x70E7, 0x8108, 0x9129, 0xA14A, 0xB16B, 0xC18C, 0xD1AD, 0xE1CE, 0xF1EF, - 0x1231, 0x0210, 0x3273, 0x2252, 0x52B5, 0x4294, 0x72F7, 0x62D6, 0x9339, 0x8318, 0xB37B, 0xA35A, 0xD3BD, 0xC39C, 0xF3FF, 0xE3DE, - 0x2462, 0x3443, 0x0420, 0x1401, 0x64E6, 0x74C7, 0x44A4, 0x5485, 0xA56A, 0xB54B, 0x8528, 0x9509, 0xE5EE, 0xF5CF, 0xC5AC, 0xD58D, - 0x3653, 0x2672, 0x1611, 0x0630, 0x76D7, 0x66F6, 0x5695, 0x46B4, 0xB75B, 0xA77A, 0x9719, 0x8738, 0xF7DF, 0xE7FE, 0xD79D, 0xC7BC, - 0x48C4, 0x58E5, 0x6886, 0x78A7, 0x0840, 0x1861, 0x2802, 0x3823, 0xC9CC, 0xD9ED, 0xE98E, 0xF9AF, 0x8948, 0x9969, 0xA90A, 0xB92B, - 0x5AF5, 0x4AD4, 0x7AB7, 0x6A96, 0x1A71, 0x0A50, 0x3A33, 0x2A12, 0xDBFD, 0xCBDC, 0xFBBF, 0xEB9E, 0x9B79, 0x8B58, 0xBB3B, 0xAB1A, - 0x6CA6, 0x7C87, 0x4CE4, 0x5CC5, 0x2C22, 0x3C03, 0x0C60, 0x1C41, 0xEDAE, 0xFD8F, 0xCDEC, 0xDDCD, 0xAD2A, 0xBD0B, 0x8D68, 0x9D49, - 0x7E97, 0x6EB6, 0x5ED5, 0x4EF4, 0x3E13, 0x2E32, 0x1E51, 0x0E70, 0xFF9F, 0xEFBE, 0xDFDD, 0xCFFC, 0xBF1B, 0xAF3A, 0x9F59, 0x8F78, - 0x9188, 0x81A9, 0xB1CA, 0xA1EB, 0xD10C, 0xC12D, 0xF14E, 0xE16F, 0x1080, 0x00A1, 0x30C2, 0x20E3, 0x5004, 0x4025, 0x7046, 0x6067, - 0x83B9, 0x9398, 0xA3FB, 0xB3DA, 0xC33D, 0xD31C, 0xE37F, 0xF35E, 0x02B1, 0x1290, 0x22F3, 0x32D2, 0x4235, 0x5214, 0x6277, 0x7256, - 0xB5EA, 0xA5CB, 0x95A8, 0x8589, 0xF56E, 0xE54F, 0xD52C, 0xC50D, 0x34E2, 0x24C3, 0x14A0, 0x0481, 0x7466, 0x6447, 0x5424, 0x4405, - 0xA7DB, 0xB7FA, 0x8799, 0x97B8, 0xE75F, 0xF77E, 0xC71D, 0xD73C, 0x26D3, 0x36F2, 0x0691, 0x16B0, 0x6657, 0x7676, 0x4615, 0x5634, - 0xD94C, 0xC96D, 0xF90E, 0xE92F, 0x99C8, 0x89E9, 0xB98A, 0xA9AB, 0x5844, 0x4865, 0x7806, 0x6827, 0x18C0, 0x08E1, 0x3882, 0x28A3, - 0xCB7D, 0xDB5C, 0xEB3F, 0xFB1E, 0x8BF9, 0x9BD8, 0xABBB, 0xBB9A, 0x4A75, 0x5A54, 0x6A37, 0x7A16, 0x0AF1, 0x1AD0, 0x2AB3, 0x3A92, - 0xFD2E, 0xED0F, 0xDD6C, 0xCD4D, 0xBDAA, 0xAD8B, 0x9DE8, 0x8DC9, 0x7C26, 0x6C07, 0x5C64, 0x4C45, 0x3CA2, 0x2C83, 0x1CE0, 0x0CC1, - 0xEF1F, 0xFF3E, 0xCF5D, 0xDF7C, 0xAF9B, 0xBFBA, 0x8FD9, 0x9FF8, 0x6E17, 0x7E36, 0x4E55, 0x5E74, 0x2E93, 0x3EB2, 0x0ED1, 0x1EF0 - ] - - crc = 0xFFFF - for byte in data: - crc = (crc << 8) ^ table[(crc >> 8) ^ byte] - crc &= 0xFFFF - return crc - -def swap32(x): - return (((x << 24) & 0xFF000000) | - ((x << 8) & 0x00FF0000) | - ((x >> 8) & 0x0000FF00) | - ((x >> 24) & 0x000000FF)) - -def swap16(x): - return (((x << 8) & 0xFF00) | - ((x >> 8) & 0x00FF)) - -def reverse_mask(x): - x = ((x & 0x55555555) << 1) | ((x & 0xAAAAAAAA) >> 1) - x = ((x & 0x33333333) << 2) | ((x & 0xCCCCCCCC) >> 2) - x = ((x & 0x0F0F0F0F) << 4) | ((x & 0xF0F0F0F0) >> 4) - x = ((x & 0x00FF00FF) << 8) | ((x & 0xFF00FF00) >> 8) - x = ((x & 0x0000FFFF) << 16) | ((x & 0xFFFF0000) >> 16) - return x - def get_bitnums_int(x): return [i for i in range(x.bit_length()) if ((1 << i) & x)] @@ -69,27 +18,4 @@ def get_bitnums(x): def set_bitnums(x, n): outvals = 0 for v in x: outvals += (1 << v) - return outvals.to_bytes(n, 'little') - - -# ----- audio ----- - -def unsign_8(sampledata): - sampledatabytes = np.frombuffer(sampledata, dtype='uint8') - sampledatabytes = np.array(sampledatabytes) + 128 - return sampledatabytes.tobytes('C') - -def unsign_16(sampledata): - sampledatabytes = np.frombuffer(sampledata, dtype='uint16') - sampledatabytes = np.array(sampledatabytes) + 32768 - return sampledatabytes.tobytes('C') - -def mono2stereo(leftdata, rightdata, samplebytes): - leftdata_stream = BytesIO(leftdata) - rightdata_stream = BytesIO(rightdata) - output_stream = BytesIO() - for _ in range(int(len(leftdata)/samplebytes)): - output_stream.write(leftdata_stream.read(samplebytes)) - output_stream.write(rightdata_stream.read(samplebytes)) - output_stream.seek(0) - return output_stream.read() + return outvals.to_bytes(n, 'little') \ No newline at end of file diff --git a/functions_plugin_cvpj/params_fm.py b/functions_plugin_cvpj/params_fm.py deleted file mode 100644 index 4d9318cd..00000000 --- a/functions_plugin_cvpj/params_fm.py +++ /dev/null @@ -1,175 +0,0 @@ -# SPDX-FileCopyrightText: 2024 SatyrDiamond -# SPDX-License-Identifier: GPL-3.0-or-later - -from functions import data_bytes - -g_paramnames = {} -g_paramnames['opl2'] = [ - ['perctype','tremolo_depth','vibrato_depth','fm','feedback'], - 2, - ['env_attack','env_decay','env_release','env_sustain','freqmul','ksr','level','ksl','tremolo','vibrato','waveform','sustained', 'perc_env'] ] - -g_paramnames['opl3'] = [ - ['perctype','tremolo_depth','vibrato_depth','con_12','con_34','feedback_12','feedback_34'], - 4, - ['env_attack','env_decay','env_release','env_sustain','freqmul','ksr','level','ksl','tremolo','vibrato','waveform','sustained', 'perc_env'] ] - -g_paramnames['opn2'] = [ - ['algorithm','feedback','fms','ams','lfo_enable','lfo_frequency'], - 4, - ['am','env_attack','env_decay','freqmul','env_release','env_sustain','level','detune2','ratescale','detune','env_decay2','ssg_enable','ssg_mode'] ] - -g_paramnames['opm'] = [ - ['alg','ams','fb','lfo_amd','lfo_frq','lfo_pmd','nfrq','noise','opmsk','pms'], - 4, - ['tl','ar','d1r','d1l','d2r','rr','ks','ml','dt1','dt2','ams-en'] ] - -g_paramnames['vrc7'] = [ - ['feedback'], - 2, - ['env_attack','env_decay','env_release','env_sustain','freqmul','ksr','level','ksl','tremolo','vibrato','waveform','sustained'] ] - -vrc7patch = {} -vrc7patch[1] = [3,33,5,6,232,129,66,39] -vrc7patch[2] = [19,65,20,13,216,246,35,18] -vrc7patch[3] = [17,17,8,8,250,178,32,18] -vrc7patch[4] = [49,97,12,7,168,100,97,39] -vrc7patch[5] = [50,33,30,6,225,118,1,40] -vrc7patch[6] = [2,1,6,0,163,226,244,244] -vrc7patch[7] = [33,97,29,7,130,129,17,7] -vrc7patch[8] = [35,33,34,23,162,114,1,23] -vrc7patch[9] = [53,17,37,0,64,115,114,1] -vrc7patch[10] = [181,1,15,15,168,165,81,2] -vrc7patch[11] = [23,193,36,7,248,248,34,18] -vrc7patch[12] = [113,35,17,6,101,116,24,22] -vrc7patch[13] = [1,2,211,5,201,149,3,2] -vrc7patch[14] = [97,99,12,0,148,192,51,246] -vrc7patch[15] = [33,114,13,0,193,213,86,6] - -class fm_data: - def __init__(self, fmtype): - self.params = {} - self.operator = [] - self.fmtype = fmtype - self.fm_paramnames = g_paramnames[fmtype] - - for paramname in self.fm_paramnames[0]: self.params[paramname] = 0 - - for opnum in range(self.fm_paramnames[1]): - op_data = {} - for opparamname in self.fm_paramnames[2]: op_data[opparamname] = 0 - self.operator.append(op_data) - - def set_param(self, name, value): - self.params[name] = value - - def set_op_param(self, opnum, name, value): - self.operator[opnum][name] = value - - def to_cvpj(self, convproj_obj, pluginid): - plugin_obj = convproj_obj.add_plugin(pluginid, 'chip', 'fm', self.fmtype) - for paramname in self.fm_paramnames[0]: - param_obj = plugin_obj.params.add(paramname, self.params[paramname], 'int') - param_obj.visual.name = paramname - - for opnum in range(self.fm_paramnames[1]): - for opparamname in self.fm_paramnames[2]: - cvpj_opparamname = 'op'+str(opnum+1)+'/'+opparamname - param_obj = plugin_obj.params.add(cvpj_opparamname, self.operator[opnum][opparamname], 'int') - param_obj.visual.name = 'OP '+str(opnum+1)+': '+opparamname - - - - - - - - def opl_sbi_part_op(self, opnum, i_input, isreversed): - ixChar, ixScale, ixAttack, ixSustain, ixWaveSel = i_input - - opl_out_flags, opl_out_mul = data_bytes.splitbyte(ixChar) - opl_out_trem, opl_out_vib, opl_out_sust, opl_out_krs = data_bytes.to_bin(opl_out_flags, 4) - opl_out_kls = ixScale >> 6 - opl_out_out = ixScale & 0x3F - opl_out_wave = ixWaveSel - opl_out_att, opl_out_dec = data_bytes.splitbyte(ixAttack) - opl_out_sus, opl_out_rel = data_bytes.splitbyte(ixSustain) - - if isreversed == False: - self.set_op_param(opnum, 'env_attack', opl_out_att) - self.set_op_param(opnum, 'env_decay', opl_out_dec) - self.set_op_param(opnum, 'env_release', opl_out_rel) - else: - self.set_op_param(opnum, 'env_attack', (opl_out_att*-1)+15) - self.set_op_param(opnum, 'env_decay', (opl_out_dec*-1)+15) - self.set_op_param(opnum, 'env_release', (opl_out_rel*-1)+15) - - self.set_op_param(opnum, 'ksl', opl_out_kls) - self.set_op_param(opnum, 'freqmul', opl_out_mul) - self.set_op_param(opnum, 'env_sustain', opl_out_sus) - self.set_op_param(opnum, 'sustained', opl_out_sust) - self.set_op_param(opnum, 'level', opl_out_out) - self.set_op_param(opnum, 'tremolo', opl_out_trem) - self.set_op_param(opnum, 'vibrato', opl_out_vib) - self.set_op_param(opnum, 'ksr', opl_out_krs) - self.set_op_param(opnum, 'waveform', opl_out_wave) - - def opl_sbi_part_fbcon(self, iFeedback, txt_feedback, txt_fm): - opl_fb = (iFeedback) >> 1 - opl_con = iFeedback & 0x01 - - self.set_param(txt_feedback, opl_fb) - self.set_param(txt_fm, opl_con) - - - - - - - - - - def vrc7_regs(self, inregs, use_patch, patch_num): - if use_patch == True: vrcregs = vrc7patch[patch_num] - else: vrcregs = inregs - - vrc_mod_flags, vrc_mod_mul = data_bytes.splitbyte(vrcregs[0]) - vrc_mod_trem, vrc_mod_vib, vrc_mod_sust, vrc_mod_krs = data_bytes.to_bin(vrc_mod_flags, 4) - vrc_car_flags, vrc_car_mul = data_bytes.splitbyte(vrcregs[1]) - vrc_car_trem, vrc_car_vib, vrc_car_sust, vrc_car_krs = data_bytes.to_bin(vrc_car_flags, 4) - vrc_mod_kls = vrcregs[2] >> 6 - vrc_mod_out = vrcregs[2] & 0x3F - vrc_car_kls = vrcregs[3] >> 6 - vrc_fb = vrcregs[3] & 0x07 - vrc_mod_wave = int(bool(vrcregs[3] & 0x08)) - vrc_car_wave = int(bool(vrcregs[3] & 0x10)) - vrc_mod_att, vrc_mod_dec = data_bytes.splitbyte(vrcregs[4]) - vrc_car_att, vrc_car_dec = data_bytes.splitbyte(vrcregs[5]) - vrc_mod_sus, vrc_mod_rel = data_bytes.splitbyte(vrcregs[6]) - vrc_car_sus, vrc_car_rel = data_bytes.splitbyte(vrcregs[7]) - - self.set_param("feedback", vrc_fb) - - self.set_op_param(0, "scale", vrc_mod_kls) - self.set_op_param(0, "freqmul", vrc_mod_mul) - self.set_op_param(0, "env_attack", (vrc_mod_att*-1)+15) - self.set_op_param(0, "env_sustain", (vrc_mod_sus*-1)+15) - self.set_op_param(0, "env_decay", (vrc_mod_dec*-1)+15) - self.set_op_param(0, "env_release", vrc_mod_rel) - self.set_op_param(0, "level", (vrc_mod_out*-1)+63) - self.set_op_param(0, "tremolo", vrc_mod_trem) - self.set_op_param(0, "vibrato", vrc_mod_vib) - self.set_op_param(0, "ksr", vrc_mod_krs) - self.set_op_param(0, "waveform", vrc_mod_wave) - - self.set_op_param(1, "scale", vrc_car_kls) - self.set_op_param(1, "freqmul", vrc_car_mul) - self.set_op_param(1, "env_attack", (vrc_car_att*-1)+15) - self.set_op_param(1, "env_sustain", (vrc_car_sus*-1)+15) - self.set_op_param(1, "env_decay", (vrc_car_dec*-1)+15) - self.set_op_param(1, "env_release", vrc_car_rel) - self.set_op_param(1, "level", 63) - self.set_op_param(1, "tremolo", vrc_car_trem) - self.set_op_param(1, "vibrato", vrc_car_vib) - self.set_op_param(1, "ksr", vrc_car_krs) - self.set_op_param(1, "waveform", vrc_car_wave) \ No newline at end of file