loads and saves!!!

This commit is contained in:
Alex Janka 2021-07-10 12:00:46 +10:00
parent 797799ae2d
commit e2641154d2
6 changed files with 734 additions and 56 deletions

67
Cargo.lock generated
View file

@ -7,8 +7,7 @@ name = "ableton-rack-converter"
version = "0.1.0" version = "0.1.0"
dependencies = [ dependencies = [
"flate2", "flate2",
"minidom", "xml_dom",
"quick-xml 0.22.0",
] ]
[[package]] [[package]]
@ -17,6 +16,15 @@ version = "1.0.2"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "f26201604c87b1e01bd3d98f8d5d9a8fcbb815e8cedb41ffccbeb4bf593a35fe" checksum = "f26201604c87b1e01bd3d98f8d5d9a8fcbb815e8cedb41ffccbeb4bf593a35fe"
[[package]]
name = "aho-corasick"
version = "0.7.18"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "1e37cfd5e7657ada45f742d6e99ca5788580b5c529dc78faf11ece6dc702656f"
dependencies = [
"memchr",
]
[[package]] [[package]]
name = "autocfg" name = "autocfg"
version = "1.0.1" version = "1.0.1"
@ -56,21 +64,21 @@ version = "0.2.98"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "320cfe77175da3a483efed4bc0adc1968ca050b098ce4f2f1c13a56626128790" checksum = "320cfe77175da3a483efed4bc0adc1968ca050b098ce4f2f1c13a56626128790"
[[package]]
name = "log"
version = "0.4.14"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "51b9bbe6c47d51fc3e1a9b945965946b4c44142ab8792c50835a980d362c2710"
dependencies = [
"cfg-if",
]
[[package]] [[package]]
name = "memchr" name = "memchr"
version = "2.4.0" version = "2.4.0"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "b16bd47d9e329435e309c58469fe0791c2d0d1ba96ec0954152a5ae2b04387dc" checksum = "b16bd47d9e329435e309c58469fe0791c2d0d1ba96ec0954152a5ae2b04387dc"
[[package]]
name = "minidom"
version = "0.13.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "332592c2149fc7dd40a64fc9ef6f0d65607284b474cef9817d1fc8c7e7b3608e"
dependencies = [
"quick-xml 0.20.0",
]
[[package]] [[package]]
name = "miniz_oxide" name = "miniz_oxide"
version = "0.4.4" version = "0.4.4"
@ -81,15 +89,6 @@ dependencies = [
"autocfg", "autocfg",
] ]
[[package]]
name = "quick-xml"
version = "0.20.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "26aab6b48e2590e4a64d1ed808749ba06257882b461d01ca71baeb747074a6dd"
dependencies = [
"memchr",
]
[[package]] [[package]]
name = "quick-xml" name = "quick-xml"
version = "0.22.0" version = "0.22.0"
@ -98,3 +97,31 @@ checksum = "8533f14c8382aaad0d592c812ac3b826162128b65662331e1127b45c3d18536b"
dependencies = [ dependencies = [
"memchr", "memchr",
] ]
[[package]]
name = "regex"
version = "1.5.4"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "d07a8629359eb56f1e2fb1652bb04212c072a87ba68546a04065d525673ac461"
dependencies = [
"aho-corasick",
"memchr",
"regex-syntax",
]
[[package]]
name = "regex-syntax"
version = "0.6.25"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "f497285884f3fcff424ffc933e56d7cbca511def0c9831a7f9b5f6153e3cc89b"
[[package]]
name = "xml_dom"
version = "0.2.5"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "9d785025af9dcb8f8b8ce48c4f5405b8469833802a3432b04838b392c2d97287"
dependencies = [
"log",
"quick-xml",
"regex",
]

View file

@ -7,5 +7,4 @@ edition = "2018"
[dependencies] [dependencies]
flate2 = "1.0" flate2 = "1.0"
quick-xml = "0.22.0" xml_dom = "0.2.5"
minidom = "0.13.0"

View file

@ -1,6 +1,9 @@
use ableton_rack_converter::load_adg; use ableton_rack_converter;
use xml_dom::level2::RefNode;
fn main() { fn main() {
let filename = String::from("C:\\Users\\janka\\Documents\\Projects\\Programming\\ableton-rack-converter\\validation\\Utility10.adg"); let file_load = String::from("C:\\Users\\janka\\Documents\\Projects\\Programming\\ableton-rack-converter\\validation\\Utility10.adg");
let device = load_adg(&filename); let file_save = String::from("C:\\Users\\janka\\Documents\\Projects\\Programming\\ableton-rack-converter\\validation\\Utility10_save.adg");
let device: RefNode = ableton_rack_converter::load_adg(&file_load);
ableton_rack_converter::save_adg(&device, &file_save);
} }

View file

@ -1,50 +1,46 @@
use flate2::read::GzDecoder; use flate2::{read::GzDecoder, write::GzEncoder, Compression};
use minidom::Element; use std::{
use std::{fs::File, io::Read, str}; fs::{self, File},
io::{Read, Write},
str,
};
use xml_dom::{level2::RefNode, parser};
pub fn load_adg(filename: &str) -> AbletonDeviceGroup { pub fn load_adg(filename: &str) -> RefNode {
let contents = File::open(filename).unwrap(); let contents = File::open(filename).expect("failed to load file");
let xml = decompress(contents); let xml = decompress(contents);
let stripped = strip_first_line(&xml); decode(&xml)
// println!("{}", stripped);
decode(&stripped);
AbletonDeviceGroup::new(xml)
} }
fn decompress(loaded_file: File) -> String { fn decompress(loaded_file: File) -> String {
let mut decoder = GzDecoder::new(loaded_file); let mut decoder = GzDecoder::new(loaded_file);
let mut decompressed = String::new(); let mut decompressed = String::new();
decoder.read_to_string(&mut decompressed).unwrap(); decoder
.read_to_string(&mut decompressed)
.expect("could not decompress file");
decompressed decompressed
} }
fn decode(xml: &str) { fn decode(xml: &str) -> RefNode {
let root: Result<Element, _> = xml.parse(); parser::read_xml(xml).expect("failed to parse xml")
println!("{:?}", root);
// let root2 = root.unwrap();
} }
fn strip_first_line(text: &str) -> &str { pub fn save_adg(dom: &RefNode, filename: &str) {
let bytes = text.trim().as_bytes(); let xml = encode(dom);
for (i, &val) in bytes.iter().enumerate() { let compressed = compress(&xml);
if val == b'\n' { fs::write(filename, compressed).expect("could not write file");
return &text[i + 1..bytes.len()];
}
}
&text
} }
pub struct AbletonDeviceGroup { fn compress(xml: &str) -> Vec<u8> {
body: String, let mut encoder = GzEncoder::new(Vec::new(), Compression::default());
encoder
.write_all(xml.as_bytes())
.expect("could not compress");
encoder.finish().unwrap()
} }
impl AbletonDeviceGroup { fn encode(dom: &RefNode) -> String {
pub fn new(body: String) -> AbletonDeviceGroup { dom.to_string()
AbletonDeviceGroup { body }
}
pub fn get_body(&self) -> &str {
&self.body
}
} }
#[cfg(test)] #[cfg(test)]

653
validation/Utility10_save Normal file
View file

@ -0,0 +1,653 @@
<?xml version="1.0" encoding="UTF-8"?>
<Ableton SchemaChangeCount="5" Revision="a4cc5da58a12b2430753133883a25ad12aa979b7" Creator="Ableton Live 10.1.35" MajorVersion="5" MinorVersion="10.0_377">
<GroupDevicePreset>
<OverwriteProtectionNumber Value="2561"></OverwriteProtectionNumber>
<Device>
<AudioEffectGroupDevice Id="0">
<LomId Value="0"></LomId>
<LomIdView Value="0"></LomIdView>
<IsExpanded Value="true"></IsExpanded>
<On>
<LomId Value="0"></LomId>
<Manual Value="true"></Manual>
<AutomationTarget Id="0">
<LockEnvelope Value="0"></LockEnvelope>
</AutomationTarget>
<MidiCCOnOffThresholds>
<Min Value="64"></Min>
<Max Value="127"></Max>
</MidiCCOnOffThresholds>
</On>
<ParametersListWrapper LomId="0"></ParametersListWrapper>
<LastSelectedTimeableIndex Value="0"></LastSelectedTimeableIndex>
<LastSelectedClipEnvelopeIndex Value="0"></LastSelectedClipEnvelopeIndex>
<LastPresetRef>
<Value>
<AbletonDefaultPresetRef Id="0">
<FileRef>
<HasRelativePath Value="true"></HasRelativePath>
<RelativePathType Value="5"></RelativePathType>
<RelativePath>
<RelativePathElement Id="0" Dir="Devices"></RelativePathElement>
<RelativePathElement Dir="Audio Effects" Id="1"></RelativePathElement>
<RelativePathElement Dir="Audio Effect Rack" Id="2"></RelativePathElement>
</RelativePath>
<Name Value=""></Name>
<Type Value="1"></Type>
<Data>43003A005C00500072006F006700720061006D0044006100740061005C00410062006C0065007400
6F006E005C004C006900760065002000310030002000530075006900740065005C00520065007300
6F00750072006300650073005C0043006F007200650020004C006900620072006100720079005C00
44006500760069006300650073005C0041007500640069006F002000450066006600650063007400
73005C0041007500640069006F00200045006600660065006300740020005200610063006B000000</Data>
<RefersToFolder Value="true"></RefersToFolder>
<SearchHint>
<PathHint></PathHint>
<FileSize Value="0"></FileSize>
<Crc Value="0"></Crc>
<MaxCrcSize Value="0"></MaxCrcSize>
<HasExtendedInfo Value="false"></HasExtendedInfo>
</SearchHint>
<LivePackName Value="Core Library"></LivePackName>
<LivePackId Value="www.ableton.com/0"></LivePackId>
</FileRef>
<DeviceId Name="AudioEffectGroupDevice"></DeviceId>
</AbletonDefaultPresetRef>
</Value>
</LastPresetRef>
<LockedScripts></LockedScripts>
<IsFolded Value="false"></IsFolded>
<ShouldShowPresetName Value="true"></ShouldShowPresetName>
<UserName Value=""></UserName>
<Annotation Value=""></Annotation>
<SourceContext>
<Value></Value>
</SourceContext>
<OverwriteProtectionNumber Value="2561"></OverwriteProtectionNumber>
<Branches></Branches>
<IsBranchesListVisible Value="true"></IsBranchesListVisible>
<IsReturnBranchesListVisible Value="false"></IsReturnBranchesListVisible>
<IsRangesEditorVisible Value="false"></IsRangesEditorVisible>
<AreDevicesVisible Value="false"></AreDevicesVisible>
<MacroControls.0>
<LomId Value="0"></LomId>
<Manual Value="0"></Manual>
<MidiControllerRange>
<Min Value="0"></Min>
<Max Value="127"></Max>
</MidiControllerRange>
<AutomationTarget Id="0">
<LockEnvelope Value="0"></LockEnvelope>
</AutomationTarget>
<ModulationTarget Id="0">
<LockEnvelope Value="0"></LockEnvelope>
</ModulationTarget>
</MacroControls.0>
<MacroControls.1>
<LomId Value="0"></LomId>
<Manual Value="0"></Manual>
<MidiControllerRange>
<Min Value="0"></Min>
<Max Value="127"></Max>
</MidiControllerRange>
<AutomationTarget Id="0">
<LockEnvelope Value="0"></LockEnvelope>
</AutomationTarget>
<ModulationTarget Id="0">
<LockEnvelope Value="0"></LockEnvelope>
</ModulationTarget>
</MacroControls.1>
<MacroControls.2>
<LomId Value="0"></LomId>
<Manual Value="0"></Manual>
<MidiControllerRange>
<Min Value="0"></Min>
<Max Value="127"></Max>
</MidiControllerRange>
<AutomationTarget Id="0">
<LockEnvelope Value="0"></LockEnvelope>
</AutomationTarget>
<ModulationTarget Id="0">
<LockEnvelope Value="0"></LockEnvelope>
</ModulationTarget>
</MacroControls.2>
<MacroControls.3>
<LomId Value="0"></LomId>
<Manual Value="0"></Manual>
<MidiControllerRange>
<Min Value="0"></Min>
<Max Value="127"></Max>
</MidiControllerRange>
<AutomationTarget Id="0">
<LockEnvelope Value="0"></LockEnvelope>
</AutomationTarget>
<ModulationTarget Id="0">
<LockEnvelope Value="0"></LockEnvelope>
</ModulationTarget>
</MacroControls.3>
<MacroControls.4>
<LomId Value="0"></LomId>
<Manual Value="0"></Manual>
<MidiControllerRange>
<Min Value="0"></Min>
<Max Value="127"></Max>
</MidiControllerRange>
<AutomationTarget Id="0">
<LockEnvelope Value="0"></LockEnvelope>
</AutomationTarget>
<ModulationTarget Id="0">
<LockEnvelope Value="0"></LockEnvelope>
</ModulationTarget>
</MacroControls.4>
<MacroControls.5>
<LomId Value="0"></LomId>
<Manual Value="0"></Manual>
<MidiControllerRange>
<Min Value="0"></Min>
<Max Value="127"></Max>
</MidiControllerRange>
<AutomationTarget Id="0">
<LockEnvelope Value="0"></LockEnvelope>
</AutomationTarget>
<ModulationTarget Id="0">
<LockEnvelope Value="0"></LockEnvelope>
</ModulationTarget>
</MacroControls.5>
<MacroControls.6>
<LomId Value="0"></LomId>
<Manual Value="0"></Manual>
<MidiControllerRange>
<Min Value="0"></Min>
<Max Value="127"></Max>
</MidiControllerRange>
<AutomationTarget Id="0">
<LockEnvelope Value="0"></LockEnvelope>
</AutomationTarget>
<ModulationTarget Id="0">
<LockEnvelope Value="0"></LockEnvelope>
</ModulationTarget>
</MacroControls.6>
<MacroControls.7>
<LomId Value="0"></LomId>
<Manual Value="0"></Manual>
<MidiControllerRange>
<Min Value="0"></Min>
<Max Value="127"></Max>
</MidiControllerRange>
<AutomationTarget Id="0">
<LockEnvelope Value="0"></LockEnvelope>
</AutomationTarget>
<ModulationTarget Id="0">
<LockEnvelope Value="0"></LockEnvelope>
</ModulationTarget>
</MacroControls.7>
<MacroDisplayNames.0 Value="Macro 1"></MacroDisplayNames.0>
<MacroDisplayNames.1 Value="Macro 2"></MacroDisplayNames.1>
<MacroDisplayNames.2 Value="Macro 3"></MacroDisplayNames.2>
<MacroDisplayNames.3 Value="Macro 4"></MacroDisplayNames.3>
<MacroDisplayNames.4 Value="Macro 5"></MacroDisplayNames.4>
<MacroDisplayNames.5 Value="Macro 6"></MacroDisplayNames.5>
<MacroDisplayNames.6 Value="Macro 7"></MacroDisplayNames.6>
<MacroDisplayNames.7 Value="Macro 8"></MacroDisplayNames.7>
<MacroDefaults.0 Value="-1"></MacroDefaults.0>
<MacroDefaults.1 Value="-1"></MacroDefaults.1>
<MacroDefaults.2 Value="-1"></MacroDefaults.2>
<MacroDefaults.3 Value="-1"></MacroDefaults.3>
<MacroDefaults.4 Value="-1"></MacroDefaults.4>
<MacroDefaults.5 Value="-1"></MacroDefaults.5>
<MacroDefaults.6 Value="-1"></MacroDefaults.6>
<MacroDefaults.7 Value="-1"></MacroDefaults.7>
<MacroAnnotations.0 Value=""></MacroAnnotations.0>
<MacroAnnotations.1 Value=""></MacroAnnotations.1>
<MacroAnnotations.2 Value=""></MacroAnnotations.2>
<MacroAnnotations.3 Value=""></MacroAnnotations.3>
<MacroAnnotations.4 Value=""></MacroAnnotations.4>
<MacroAnnotations.5 Value=""></MacroAnnotations.5>
<MacroAnnotations.6 Value=""></MacroAnnotations.6>
<MacroAnnotations.7 Value=""></MacroAnnotations.7>
<ForceDisplayGenericValue.0 Value="false"></ForceDisplayGenericValue.0>
<ForceDisplayGenericValue.1 Value="false"></ForceDisplayGenericValue.1>
<ForceDisplayGenericValue.2 Value="false"></ForceDisplayGenericValue.2>
<ForceDisplayGenericValue.3 Value="false"></ForceDisplayGenericValue.3>
<ForceDisplayGenericValue.4 Value="false"></ForceDisplayGenericValue.4>
<ForceDisplayGenericValue.5 Value="false"></ForceDisplayGenericValue.5>
<ForceDisplayGenericValue.6 Value="false"></ForceDisplayGenericValue.6>
<ForceDisplayGenericValue.7 Value="false"></ForceDisplayGenericValue.7>
<AreMacroControlsVisible Value="false"></AreMacroControlsVisible>
<IsAutoSelectEnabled Value="false"></IsAutoSelectEnabled>
<ChainSelector>
<LomId Value="0"></LomId>
<Manual Value="0"></Manual>
<MidiControllerRange>
<Min Value="0"></Min>
<Max Value="127"></Max>
</MidiControllerRange>
<AutomationTarget Id="0">
<LockEnvelope Value="0"></LockEnvelope>
</AutomationTarget>
<ModulationTarget Id="0">
<LockEnvelope Value="0"></LockEnvelope>
</ModulationTarget>
</ChainSelector>
<ChainSelectorRelativePosition Value="-1073741824"></ChainSelectorRelativePosition>
<ViewsToRestoreWhenUnfolding Value="2"></ViewsToRestoreWhenUnfolding>
<ReturnBranches></ReturnBranches>
<BranchesSplitterProportion Value="0.5"></BranchesSplitterProportion>
<ShowBranchesInSessionMixer Value="false"></ShowBranchesInSessionMixer>
<MacroColorIndex.0 Value="0"></MacroColorIndex.0>
<MacroColorIndex.1 Value="0"></MacroColorIndex.1>
<MacroColorIndex.2 Value="0"></MacroColorIndex.2>
<MacroColorIndex.3 Value="0"></MacroColorIndex.3>
<MacroColorIndex.4 Value="0"></MacroColorIndex.4>
<MacroColorIndex.5 Value="0"></MacroColorIndex.5>
<MacroColorIndex.6 Value="0"></MacroColorIndex.6>
<MacroColorIndex.7 Value="0"></MacroColorIndex.7>
<LockId Value="0"></LockId>
<LockSeal Value="0"></LockSeal>
<ChainsListWrapper LomId="0"></ChainsListWrapper>
<ReturnChainsListWrapper LomId="0"></ReturnChainsListWrapper>
</AudioEffectGroupDevice>
</Device>
<PresetRef>
<AbletonDefaultPresetRef Id="0">
<FileRef>
<HasRelativePath Value="true"></HasRelativePath>
<RelativePathType Value="5"></RelativePathType>
<RelativePath>
<RelativePathElement Id="0" Dir="Devices"></RelativePathElement>
<RelativePathElement Dir="Audio Effects" Id="1"></RelativePathElement>
<RelativePathElement Id="2" Dir="Audio Effect Rack"></RelativePathElement>
</RelativePath>
<Name Value=""></Name>
<Type Value="1"></Type>
<Data>43003A005C00500072006F006700720061006D0044006100740061005C00410062006C0065007400
6F006E005C004C006900760065002000310030002000530075006900740065005C00520065007300
6F00750072006300650073005C0043006F007200650020004C006900620072006100720079005C00
44006500760069006300650073005C0041007500640069006F002000450066006600650063007400
73005C0041007500640069006F00200045006600660065006300740020005200610063006B000000</Data>
<RefersToFolder Value="true"></RefersToFolder>
<SearchHint>
<PathHint></PathHint>
<FileSize Value="0"></FileSize>
<Crc Value="0"></Crc>
<MaxCrcSize Value="0"></MaxCrcSize>
<HasExtendedInfo Value="false"></HasExtendedInfo>
</SearchHint>
<LivePackName Value="Core Library"></LivePackName>
<LivePackId Value="www.ableton.com/0"></LivePackId>
</FileRef>
<DeviceId Name="AudioEffectGroupDevice"></DeviceId>
</AbletonDefaultPresetRef>
</PresetRef>
<BranchPresets>
<AudioEffectBranchPreset Id="0">
<Name Value=""></Name>
<IsSoloed Value="false"></IsSoloed>
<DevicePresets>
<AbletonDevicePreset Id="0">
<OverwriteProtectionNumber Value="2561"></OverwriteProtectionNumber>
<Device>
<StereoGain Id="0">
<LomId Value="0"></LomId>
<LomIdView Value="0"></LomIdView>
<IsExpanded Value="true"></IsExpanded>
<On>
<LomId Value="0"></LomId>
<Manual Value="true"></Manual>
<AutomationTarget Id="0">
<LockEnvelope Value="0"></LockEnvelope>
</AutomationTarget>
<MidiCCOnOffThresholds>
<Min Value="64"></Min>
<Max Value="127"></Max>
</MidiCCOnOffThresholds>
</On>
<ParametersListWrapper LomId="0"></ParametersListWrapper>
<LastSelectedTimeableIndex Value="0"></LastSelectedTimeableIndex>
<LastSelectedClipEnvelopeIndex Value="0"></LastSelectedClipEnvelopeIndex>
<LastPresetRef>
<Value>
<AbletonDefaultPresetRef Id="0">
<FileRef>
<HasRelativePath Value="false"></HasRelativePath>
<RelativePathType Value="0"></RelativePathType>
<RelativePath></RelativePath>
<Name Value=""></Name>
<Type Value="0"></Type>
<Data></Data>
<RefersToFolder Value="false"></RefersToFolder>
<SearchHint>
<PathHint></PathHint>
<FileSize Value="0"></FileSize>
<Crc Value="0"></Crc>
<MaxCrcSize Value="0"></MaxCrcSize>
<HasExtendedInfo Value="false"></HasExtendedInfo>
</SearchHint>
<LivePackName Value=""></LivePackName>
<LivePackId Value=""></LivePackId>
</FileRef>
<DeviceId Name="StereoGain"></DeviceId>
</AbletonDefaultPresetRef>
</Value>
</LastPresetRef>
<LockedScripts></LockedScripts>
<IsFolded Value="false"></IsFolded>
<ShouldShowPresetName Value="true"></ShouldShowPresetName>
<UserName Value=""></UserName>
<Annotation Value=""></Annotation>
<SourceContext>
<Value></Value>
</SourceContext>
<OverwriteProtectionNumber Value="2561"></OverwriteProtectionNumber>
<PhaseInvertL>
<LomId Value="0"></LomId>
<Manual Value="false"></Manual>
<AutomationTarget Id="0">
<LockEnvelope Value="0"></LockEnvelope>
</AutomationTarget>
<MidiCCOnOffThresholds>
<Min Value="64"></Min>
<Max Value="127"></Max>
</MidiCCOnOffThresholds>
</PhaseInvertL>
<PhaseInvertR>
<LomId Value="0"></LomId>
<Manual Value="false"></Manual>
<AutomationTarget Id="0">
<LockEnvelope Value="0"></LockEnvelope>
</AutomationTarget>
<MidiCCOnOffThresholds>
<Min Value="64"></Min>
<Max Value="127"></Max>
</MidiCCOnOffThresholds>
</PhaseInvertR>
<ChannelMode>
<LomId Value="0"></LomId>
<Manual Value="1"></Manual>
<AutomationTarget Id="0">
<LockEnvelope Value="0"></LockEnvelope>
</AutomationTarget>
</ChannelMode>
<StereoWidth>
<LomId Value="0"></LomId>
<Manual Value="1"></Manual>
<MidiControllerRange>
<Min Value="0"></Min>
<Max Value="4"></Max>
</MidiControllerRange>
<AutomationTarget Id="0">
<LockEnvelope Value="0"></LockEnvelope>
</AutomationTarget>
<ModulationTarget Id="0">
<LockEnvelope Value="0"></LockEnvelope>
</ModulationTarget>
</StereoWidth>
<MidSideBalance>
<LomId Value="0"></LomId>
<Manual Value="1"></Manual>
<MidiControllerRange>
<Min Value="0"></Min>
<Max Value="2"></Max>
</MidiControllerRange>
<AutomationTarget Id="0">
<LockEnvelope Value="0"></LockEnvelope>
</AutomationTarget>
<ModulationTarget Id="0">
<LockEnvelope Value="0"></LockEnvelope>
</ModulationTarget>
</MidSideBalance>
<MidSideBalanceOn Value="false"></MidSideBalanceOn>
<Mono>
<LomId Value="0"></LomId>
<Manual Value="false"></Manual>
<AutomationTarget Id="0">
<LockEnvelope Value="0"></LockEnvelope>
</AutomationTarget>
<MidiCCOnOffThresholds>
<Min Value="64"></Min>
<Max Value="127"></Max>
</MidiCCOnOffThresholds>
</Mono>
<BassMono>
<LomId Value="0"></LomId>
<Manual Value="false"></Manual>
<AutomationTarget Id="0">
<LockEnvelope Value="0"></LockEnvelope>
</AutomationTarget>
<MidiCCOnOffThresholds>
<Min Value="64"></Min>
<Max Value="127"></Max>
</MidiCCOnOffThresholds>
</BassMono>
<BassMonoAudition Value="false"></BassMonoAudition>
<BassMonoFrequency>
<LomId Value="0"></LomId>
<Manual Value="120"></Manual>
<MidiControllerRange>
<Min Value="50"></Min>
<Max Value="500"></Max>
</MidiControllerRange>
<AutomationTarget Id="0">
<LockEnvelope Value="0"></LockEnvelope>
</AutomationTarget>
<ModulationTarget Id="0">
<LockEnvelope Value="0"></LockEnvelope>
</ModulationTarget>
</BassMonoFrequency>
<Balance>
<LomId Value="0"></LomId>
<Manual Value="0"></Manual>
<MidiControllerRange>
<Min Value="-1"></Min>
<Max Value="1"></Max>
</MidiControllerRange>
<AutomationTarget Id="0">
<LockEnvelope Value="0"></LockEnvelope>
</AutomationTarget>
<ModulationTarget Id="0">
<LockEnvelope Value="0"></LockEnvelope>
</ModulationTarget>
</Balance>
<Gain>
<LomId Value="0"></LomId>
<Manual Value="1"></Manual>
<MidiControllerRange>
<Min Value="0"></Min>
<Max Value="56.2341309"></Max>
</MidiControllerRange>
<AutomationTarget Id="0">
<LockEnvelope Value="0"></LockEnvelope>
</AutomationTarget>
<ModulationTarget Id="0">
<LockEnvelope Value="0"></LockEnvelope>
</ModulationTarget>
</Gain>
<LegacyGain>
<LomId Value="0"></LomId>
<Manual Value="0"></Manual>
<MidiControllerRange>
<Min Value="-35"></Min>
<Max Value="35"></Max>
</MidiControllerRange>
<AutomationTarget Id="0">
<LockEnvelope Value="0"></LockEnvelope>
</AutomationTarget>
<ModulationTarget Id="0">
<LockEnvelope Value="0"></LockEnvelope>
</ModulationTarget>
</LegacyGain>
<Mute>
<LomId Value="0"></LomId>
<Manual Value="false"></Manual>
<AutomationTarget Id="0">
<LockEnvelope Value="0"></LockEnvelope>
</AutomationTarget>
<MidiCCOnOffThresholds>
<Min Value="64"></Min>
<Max Value="127"></Max>
</MidiCCOnOffThresholds>
</Mute>
<DcFilter>
<LomId Value="0"></LomId>
<Manual Value="false"></Manual>
<AutomationTarget Id="0">
<LockEnvelope Value="0"></LockEnvelope>
</AutomationTarget>
<MidiCCOnOffThresholds>
<Min Value="64"></Min>
<Max Value="127"></Max>
</MidiCCOnOffThresholds>
</DcFilter>
<LegacyMode Value="false"></LegacyMode>
</StereoGain>
</Device>
<PresetRef>
<AbletonDefaultPresetRef Id="0">
<FileRef>
<HasRelativePath Value="false"></HasRelativePath>
<RelativePathType Value="0"></RelativePathType>
<RelativePath></RelativePath>
<Name Value=""></Name>
<Type Value="0"></Type>
<Data></Data>
<RefersToFolder Value="false"></RefersToFolder>
<SearchHint>
<PathHint></PathHint>
<FileSize Value="0"></FileSize>
<Crc Value="0"></Crc>
<MaxCrcSize Value="0"></MaxCrcSize>
<HasExtendedInfo Value="false"></HasExtendedInfo>
</SearchHint>
<LivePackName Value=""></LivePackName>
<LivePackId Value=""></LivePackId>
</FileRef>
<DeviceId Name="StereoGain"></DeviceId>
</AbletonDefaultPresetRef>
</PresetRef>
</AbletonDevicePreset>
</DevicePresets>
<MixerPreset>
<AbletonDevicePreset Id="0">
<OverwriteProtectionNumber Value="2561"></OverwriteProtectionNumber>
<Device>
<AudioBranchMixerDevice Id="0">
<LomId Value="0"></LomId>
<LomIdView Value="0"></LomIdView>
<IsExpanded Value="true"></IsExpanded>
<On>
<LomId Value="0"></LomId>
<Manual Value="true"></Manual>
<AutomationTarget Id="0">
<LockEnvelope Value="0"></LockEnvelope>
</AutomationTarget>
<MidiCCOnOffThresholds>
<Min Value="64"></Min>
<Max Value="127"></Max>
</MidiCCOnOffThresholds>
</On>
<ParametersListWrapper LomId="0"></ParametersListWrapper>
<LastSelectedTimeableIndex Value="0"></LastSelectedTimeableIndex>
<LastSelectedClipEnvelopeIndex Value="0"></LastSelectedClipEnvelopeIndex>
<LastPresetRef>
<Value></Value>
</LastPresetRef>
<LockedScripts></LockedScripts>
<IsFolded Value="false"></IsFolded>
<ShouldShowPresetName Value="true"></ShouldShowPresetName>
<UserName Value=""></UserName>
<Annotation Value=""></Annotation>
<SourceContext>
<Value></Value>
</SourceContext>
<OverwriteProtectionNumber Value="2561"></OverwriteProtectionNumber>
<Speaker>
<LomId Value="0"></LomId>
<Manual Value="true"></Manual>
<AutomationTarget Id="0">
<LockEnvelope Value="0"></LockEnvelope>
</AutomationTarget>
<MidiCCOnOffThresholds>
<Min Value="64"></Min>
<Max Value="127"></Max>
</MidiCCOnOffThresholds>
</Speaker>
<Volume>
<LomId Value="0"></LomId>
<Manual Value="1"></Manual>
<MidiControllerRange>
<Min Value="0.0003162277571"></Min>
<Max Value="1.99526238"></Max>
</MidiControllerRange>
<AutomationTarget Id="0">
<LockEnvelope Value="0"></LockEnvelope>
</AutomationTarget>
<ModulationTarget Id="0">
<LockEnvelope Value="0"></LockEnvelope>
</ModulationTarget>
</Volume>
<Panorama>
<LomId Value="0"></LomId>
<Manual Value="0"></Manual>
<MidiControllerRange>
<Min Value="-1"></Min>
<Max Value="1"></Max>
</MidiControllerRange>
<AutomationTarget Id="0">
<LockEnvelope Value="0"></LockEnvelope>
</AutomationTarget>
<ModulationTarget Id="0">
<LockEnvelope Value="0"></LockEnvelope>
</ModulationTarget>
</Panorama>
<SendInfos></SendInfos>
<RoutingHelper>
<Routable>
<Target Value="AudioOut/None"></Target>
<UpperDisplayString Value="No Output"></UpperDisplayString>
<LowerDisplayString Value=""></LowerDisplayString>
</Routable>
<TargetEnum Value="0"></TargetEnum>
</RoutingHelper>
<SendsListWrapper LomId="0"></SendsListWrapper>
</AudioBranchMixerDevice>
</Device>
<PresetRef>
<AbletonDefaultPresetRef Id="0">
<FileRef>
<HasRelativePath Value="false"></HasRelativePath>
<RelativePathType Value="0"></RelativePathType>
<RelativePath></RelativePath>
<Name Value=""></Name>
<Type Value="0"></Type>
<Data></Data>
<RefersToFolder Value="false"></RefersToFolder>
<SearchHint>
<PathHint></PathHint>
<FileSize Value="0"></FileSize>
<Crc Value="0"></Crc>
<MaxCrcSize Value="0"></MaxCrcSize>
<HasExtendedInfo Value="false"></HasExtendedInfo>
</SearchHint>
<LivePackName Value=""></LivePackName>
<LivePackId Value=""></LivePackId>
</FileRef>
<DeviceId Name="AudioBranchMixerDevice"></DeviceId>
</AbletonDefaultPresetRef>
</PresetRef>
</AbletonDevicePreset>
</MixerPreset>
<BranchSelectorRange>
<Min Value="0"></Min>
<Max Value="0"></Max>
<CrossfadeMin Value="0"></CrossfadeMin>
<CrossfadeMax Value="0"></CrossfadeMax>
</BranchSelectorRange>
<SessionViewBranchWidth Value="55"></SessionViewBranchWidth>
<ColorIndex Value="163"></ColorIndex>
<AutoColored Value="true"></AutoColored>
<AutoColorScheme Value="0"></AutoColorScheme>
<SourceContext></SourceContext>
</AudioEffectBranchPreset>
</BranchPresets>
<ReturnBranchPresets></ReturnBranchPresets>
</GroupDevicePreset>
</Ableton>

Binary file not shown.