Spaces:
Sleeping
Sleeping
File size: 5,629 Bytes
86694c3 |
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 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 |
import csv;
import xml.etree.ElementTree as ET
def convert_csv_to_preset(path: str, output_path: str):
daw_to_preset_og = {
'Master Volume': 'volume',
'Filter Type': 'filtertype',
'Filter Cutoff': 'cutoff',
'Filter Resonance': 'resonance',
'Filter Keyfollow': 'keyfollow',
'Filter Contour': 'filtercontour',
'Filter Attack': 'filterattack',
'Filter Decay': 'filterdecay',
'Filter Sustain': 'filtersustain',
'Filter Release': 'filterrelease',
'Amp Attack': 'ampattack',
'Amp Decay': 'ampdecay',
'Amp Sustain': 'ampsustain',
'Amp Release': 'amprelease',
'Osc 1 Volume': 'osc1volume',
'Osc 2 Volume': 'osc2volume',
'Osc 3 Volume': 'osc3volume',
'Osc Mastertune': 'oscmastertune',
'Osc 1 Tune': 'osc1tune',
'Osc 2 Tune': 'osc2tune',
'Osc 1 Fine Tune': 'osc1finetune',
'Osc 2 Fine Tune': 'osc2finetune',
'Osc 1 Waveform': 'osc1waveform',
'Osc 2 Waveform': 'osc2waveform',
'Osc Sync': 'oscsync',
'Lfo 1 Waveform': 'lfo1waveform',
'Lfo 2 Waveform': 'lfo2waveform',
'Lfo 1 Rate': 'lfo1rate',
'Lfo 2 Rate': 'lfo2rate',
'Lfo 1 Amount': 'lfo1amount',
'Lfo 2 Amount': 'lfo2amount',
'Lfo 1 Destination': 'lfo1destination',
'Lfo 2 Destination': 'lfo2destination',
'Lfo 1 Phase': 'lfo1phase',
'Lfo 2 Phase': 'lfo2phase',
'Osc 2 FM': 'osc2fm',
'Osc 2 Phase': 'osc2phase',
'Osc 1 PW': 'osc1pw',
'Osc 1 Phase': 'osc1phase',
'Transpose': 'transpose',
'Free Ad Attack': 'freeadattack',
'Free Ad Decay': 'freeaddecay',
'Free Ad Amount': 'freeadamount',
'Free Ad Destination': 'freeaddestination',
'Lfo 1 Sync': 'lfo1sync',
'Lfo 1 Keytrigger': 'lfo1keytrigger',
'Lfo 2 Sync': 'lfo2sync',
'Lfo 2 Keytrigger': 'lfo2keytrigger',
'Portamento Amount': 'portamento',
'Portamento Mode': 'portamentomode',
'Voices': 'voices',
'Velocity Volume': 'velocityvolume',
'Velocity Contour': 'velocitycontour',
'Velocity Filter': 'velocitycutoff',
'Pitchwheel Cutoff': 'pitchwheelcutoff',
'Pitchwheel Pitch': 'pitchwheelpitch',
'Ringmodulation': 'ringmodulation',
'Chorus 1 Enable': 'chorus1enable',
'Chorus 2 Enable': 'chorus2enable',
'Reverb Wet': 'reverbwet',
'Reverb Decay': 'reverbdecay',
'Reverb Pre Delay': 'reverbpredelay',
'Reverb High Cut': 'reverbhighcut',
'Reverb Low Cut': 'reverblowcut',
'Osc Bitcrusher': 'oscbitcrusher',
'Master High Pass': 'highpass',
'Master Detune': 'detune',
'Vintage Noise': 'vintagenoise',
'Envelope Destination': 'envelopeeditordest1',
'Envelope Speed': 'envelopeeditorspeed',
'Envelope Amount': 'envelopeeditoramount',
'Envelope One Shot Mode': 'envelopeoneshot',
'Envelope Fix Tempo': 'envelopefixtempo',
'Filter Drive': 'filterdrive',
'Delay Wet': 'delaywet',
'Delay Time': 'delaytime',
'Delay Sync': 'delaysync',
'Delay x2 L': 'delayfactorl',
'Delay x2 R': 'delayfactorr',
'Delay High Shelf': 'delayhighshelf',
'Delay Low Shelf': 'delaylowshelf',
'Delay Feedback': 'delayfeedback',
}
daw_to_preset = {v: k for k, v in daw_to_preset_og.items()}
# Read CSV data from file
with open(path, 'r') as csv_file:
csv_reader = csv.DictReader(csv_file)
csv_data = list(csv_reader)
for entry in csv_data:
parameter_name = entry['name']
parameter_value_str = entry['value']
# Check if the name needs mapping
if parameter_name in daw_to_preset_og:
xml_key = daw_to_preset_og[parameter_name]
# Check if the value is numeric
try:
parameter_value = float(parameter_value_str)
except ValueError:
print(f"Skipping non-numeric value for parameter {parameter_name}: {parameter_value_str}")
continue
if xml_key in daw_to_preset:
# Update the corresponding value in the XML dictionary
daw_to_preset[xml_key] = parameter_value
print(daw_to_preset)
# Check for invalid float values and remove them from the dictionary
invalid_values = [key for key, value in daw_to_preset.items() if not isinstance(value, float)]
for key in invalid_values:
print(f"Removing attribute {key} from daw_to_preset due to invalid float value.")
daw_to_preset[key] = 0.0
# Print the updated XML dictionary
print(daw_to_preset)
# Generate XML
root = ET.Element('tal', curprogram="0", version="1.7", presetName="CH Chordionator III FN",
path="Factory Presets/CHORD/CH Chordionator III FN.noisemakerpreset")
programs = ET.SubElement(root, 'programs')
program = ET.SubElement(programs, 'program', programname="CH Chordionator III FN", unknown="0.5", volume="0.5")
# Add parameters to the XML inside the single <program> element
for param_name, param_value in daw_to_preset.items():
program.set(param_name, str(param_value))
ET.SubElement(root, 'midimap')
# Create an ElementTree object
tree = ET.ElementTree(root)
# Save the XML to a file
output_xml_path = output_path
tree.write(output_xml_path)
print(f"XML file written to {output_xml_path}")
return output_xml_path
|