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