private static void SetZebraEnvelopeFromSylenth(Zebra2Preset z2, float storedSylenthValue, string timeBaseFieldName, string envelopeFieldName) {
			float displaySylenthValue = MathUtils.ConvertAndMainainRatio(storedSylenthValue, 0, 1, 0, 10);
			float sylenthEnvelopeMs = Sylenth1Preset.EnvelopePresetFileValueToMilliseconds(storedSylenthValue);
			
			Zebra2Preset.EnvelopeTimeBase timebase = Zebra2Preset.EnvelopeTimeBase.TIMEBASE_8sX;
			int envValue = (int) Zebra2Preset.MillisecondsToEnvValue(sylenthEnvelopeMs, timebase);
			
			ObjectUtils.SetField(z2, timeBaseFieldName, (int) timebase);
			ObjectUtils.SetField(z2, envelopeFieldName, (float) envValue);
		}
 public static double MillisecondsToEnvValue(float timeInMs, Zebra2Preset.EnvelopeTimeBase timeBase)
 {
     double envValue = 0.0;
     switch (timeBase) {
         case EnvelopeTimeBase.TIMEBASE_8sX:
             double envValue8sX = 50 * Math.Pow( (double) timeInMs/1000, (double) 1/3);
             envValue8sX = MathUtils.RoundToNearest(envValue8sX, 0.5f);
             envValue = envValue8sX;
             break;
         case EnvelopeTimeBase.TIMEBASE_16sX:
             double envValue16sX = 50 * Math.Pow( (double) timeInMs/2000, (double) 1/3);
             envValue16sX = MathUtils.RoundToNearest(envValue16sX, 0.5f);
             envValue = envValue16sX;
             break;
         case EnvelopeTimeBase.TIMEBASE_10s:
             double envValue10s = timeInMs / 100;
             envValue10s = MathUtils.RoundToNearest(envValue10s, 0.5f);
             envValue = envValue10s;
             break;
     }
     return envValue;
 }
		private void SetZebraModSourcesFromSylenth(Sylenth1Preset.Syl1PresetContent s1, Zebra2Preset z2, Sylenth1Preset.XMODSOURCE sylenthModSource, Sylenth1Preset.YMODDEST sylenthModDestination, float sylenthXModDestAm,
		                                           Dictionary<string,List<string>> processedModulationSourceAndDest) {
			
			if (sylenthModSource != Sylenth1Preset.XMODSOURCE.SOURCE_None && sylenthModDestination != Sylenth1Preset.YMODDEST.None) {
				Logger.DoDebug(String.Format("Processing Sylenth1 Modulation Source: {0}, Destination: {1}, Preset-file Depth: {2}", sylenthModSource, sylenthModDestination, sylenthXModDestAm));
				
				Zebra2Preset.ModulationSource zebraModSource = ConvertSylenthModSourceToZebra(sylenthModSource);
				
				string zebraModSourceFieldName = null;
				Object zebraModSourceFieldValue = null;
				string zebraModDepthFieldName = null;
				Object zebraModDepthFieldValue = null;
				
				// use List to store modulation pairs
				var modPairs = new List<ZebraModulationPair>();

				// Filters have real range is -150 to 150)
				// Increase the Cutoff modulation depth values slightly (20% seem to work better)
				//float CutoffModDepthValue = (float) (ConvertSylenthValueToZebra(sylenthXModDestAm, -10, 10, -150, 150) * 1.20);
				float CutoffModDepthValue = ConvertSylenthValueToZebra(sylenthXModDestAm, -10, 10, -150, 150);
				
				switch (sylenthModDestination) {
					case Sylenth1Preset.YMODDEST.None:
						// should never get here
						break;
						
						// Oscillators
					case Sylenth1Preset.YMODDEST.Volume_A:
						// Volume A:
						zebraModSourceFieldName = "OSC1_VolSc";
						zebraModSourceFieldValue = (int) zebraModSource;
						zebraModDepthFieldName = "OSC1_VolDt";
						zebraModDepthFieldValue = ConvertSylenthValueToZebra(sylenthXModDestAm, -10, 10, -100, 100);
						modPairs.Add(new ZebraModulationPair(zebraModSourceFieldName, zebraModSourceFieldValue, zebraModDepthFieldName, zebraModDepthFieldValue));

						zebraModSourceFieldName = "OSC2_VolSc";
						zebraModSourceFieldValue = (int) zebraModSource;
						zebraModDepthFieldName = "OSC2_VolDt";
						zebraModDepthFieldValue = ConvertSylenthValueToZebra(sylenthXModDestAm, -10, 10, -100, 100);
						modPairs.Add(new ZebraModulationPair(zebraModSourceFieldName, zebraModSourceFieldValue, zebraModDepthFieldName, zebraModDepthFieldValue));

						break;
					case Sylenth1Preset.YMODDEST.Volume_B:
						// Volume B:
						zebraModSourceFieldName = "OSC3_VolSc";
						zebraModSourceFieldValue = (int) zebraModSource;
						zebraModDepthFieldName = "OSC3_VolDt";
						zebraModDepthFieldValue = ConvertSylenthValueToZebra(sylenthXModDestAm, -10, 10, -100, 100);
						modPairs.Add(new ZebraModulationPair(zebraModSourceFieldName, zebraModSourceFieldValue, zebraModDepthFieldName, zebraModDepthFieldValue));

						zebraModSourceFieldName = "OSC4_VolSc";
						zebraModSourceFieldValue = (int) zebraModSource;
						zebraModDepthFieldName = "OSC4_VolDt";
						zebraModDepthFieldValue = ConvertSylenthValueToZebra(sylenthXModDestAm, -10, 10, -100, 100);
						modPairs.Add(new ZebraModulationPair(zebraModSourceFieldName, zebraModSourceFieldValue, zebraModDepthFieldName, zebraModDepthFieldValue));
						
						break;
					case Sylenth1Preset.YMODDEST.VolumeAB:
						// Volume A:
						zebraModSourceFieldName = "OSC1_VolSc";
						zebraModSourceFieldValue = (int) zebraModSource;
						zebraModDepthFieldName = "OSC1_VolDt";
						zebraModDepthFieldValue = ConvertSylenthValueToZebra(sylenthXModDestAm, -10, 10, -100, 100);
						modPairs.Add(new ZebraModulationPair(zebraModSourceFieldName, zebraModSourceFieldValue, zebraModDepthFieldName, zebraModDepthFieldValue));

						zebraModSourceFieldName = "OSC2_VolSc";
						zebraModSourceFieldValue = (int) zebraModSource;
						zebraModDepthFieldName = "OSC2_VolDt";
						zebraModDepthFieldValue = ConvertSylenthValueToZebra(sylenthXModDestAm, -10, 10, -100, 100);
						modPairs.Add(new ZebraModulationPair(zebraModSourceFieldName, zebraModSourceFieldValue, zebraModDepthFieldName, zebraModDepthFieldValue));

						// Volume B:
						zebraModSourceFieldName = "OSC3_VolSc";
						zebraModSourceFieldValue = (int) zebraModSource;
						zebraModDepthFieldName = "OSC3_VolDt";
						zebraModDepthFieldValue = ConvertSylenthValueToZebra(sylenthXModDestAm, -10, 10, -100, 100);
						modPairs.Add(new ZebraModulationPair(zebraModSourceFieldName, zebraModSourceFieldValue, zebraModDepthFieldName, zebraModDepthFieldValue));

						zebraModSourceFieldName = "OSC4_VolSc";
						zebraModSourceFieldValue = (int) zebraModSource;
						zebraModDepthFieldName = "OSC4_VolDt";
						zebraModDepthFieldValue = ConvertSylenthValueToZebra(sylenthXModDestAm, -10, 10, -100, 100);
						modPairs.Add(new ZebraModulationPair(zebraModSourceFieldName, zebraModSourceFieldValue, zebraModDepthFieldName, zebraModDepthFieldValue));

						break;
					case Sylenth1Preset.YMODDEST.Pitch_A:
						// TMSrc = Tune Modulation Source
						// TMDpt = Tune Modulation Depth
						zebraModSourceFieldValue = (int) zebraModSource;
						zebraModDepthFieldValue = ConvertSylenthModDepthPitchValueToZebra(sylenthXModDestAm);

						zebraModSourceFieldName = "OSC1_TMSrc";
						zebraModDepthFieldName = "OSC1_TMDpt";
						modPairs.Add(new ZebraModulationPair(zebraModSourceFieldName, zebraModSourceFieldValue, zebraModDepthFieldName, zebraModDepthFieldValue));

						zebraModSourceFieldName = "OSC2_TMSrc";
						zebraModDepthFieldName = "OSC2_TMDpt";
						modPairs.Add(new ZebraModulationPair(zebraModSourceFieldName, zebraModSourceFieldValue, zebraModDepthFieldName, zebraModDepthFieldValue));
						
						break;
					case Sylenth1Preset.YMODDEST.Pitch_B:
						// TMSrc = Tune Modulation Source
						// TMDpt = Tune Modulation Depth
						zebraModSourceFieldValue = (int) zebraModSource;
						zebraModDepthFieldValue = ConvertSylenthModDepthPitchValueToZebra(sylenthXModDestAm);

						zebraModSourceFieldName = "OSC3_TMSrc";
						zebraModDepthFieldName = "OSC3_TMDpt";
						modPairs.Add(new ZebraModulationPair(zebraModSourceFieldName, zebraModSourceFieldValue, zebraModDepthFieldName, zebraModDepthFieldValue));

						zebraModSourceFieldName = "OSC4_TMSrc";
						zebraModDepthFieldName = "OSC4_TMDpt";
						modPairs.Add(new ZebraModulationPair(zebraModSourceFieldName, zebraModSourceFieldValue, zebraModDepthFieldName, zebraModDepthFieldValue));
						
						break;
					case Sylenth1Preset.YMODDEST.Pitch_AB:
						zebraModSourceFieldValue = (int) zebraModSource;
						zebraModDepthFieldValue = ConvertSylenthModDepthPitchValueToZebra(sylenthXModDestAm);
						
						zebraModSourceFieldName = "OSC1_TMSrc";
						zebraModDepthFieldName = "OSC1_TMDpt";
						modPairs.Add(new ZebraModulationPair(zebraModSourceFieldName, zebraModSourceFieldValue, zebraModDepthFieldName, zebraModDepthFieldValue));

						zebraModSourceFieldName = "OSC2_TMSrc";
						zebraModDepthFieldName = "OSC2_TMDpt";
						modPairs.Add(new ZebraModulationPair(zebraModSourceFieldName, zebraModSourceFieldValue, zebraModDepthFieldName, zebraModDepthFieldValue));

						zebraModSourceFieldName = "OSC3_TMSrc";
						zebraModDepthFieldName = "OSC3_TMDpt";
						modPairs.Add(new ZebraModulationPair(zebraModSourceFieldName, zebraModSourceFieldValue, zebraModDepthFieldName, zebraModDepthFieldValue));

						zebraModSourceFieldName = "OSC4_TMSrc";
						zebraModDepthFieldName = "OSC4_TMDpt";
						modPairs.Add(new ZebraModulationPair(zebraModSourceFieldName, zebraModSourceFieldValue, zebraModDepthFieldName, zebraModDepthFieldValue));
						
						break;
					case Sylenth1Preset.YMODDEST.Phase_A:
						// PhsMSrc = PhaseModSrc
						// PhsMDpt = PhaseModDepth
						zebraModSourceFieldName = "OSC1_PhsMSrc";
						zebraModSourceFieldValue = (int) zebraModSource;
						zebraModDepthFieldName = "OSC1_PhsMDpt";
						zebraModDepthFieldValue = ConvertSylenthValueToZebra(sylenthXModDestAm, -10, 10, -50, 50);
						modPairs.Add(new ZebraModulationPair(zebraModSourceFieldName, zebraModSourceFieldValue, zebraModDepthFieldName, zebraModDepthFieldValue));

						zebraModSourceFieldName = "OSC2_PhsMSrc";
						zebraModSourceFieldValue = (int) zebraModSource;
						zebraModDepthFieldName = "OSC2_PhsMDpt";
						zebraModDepthFieldValue = ConvertSylenthValueToZebra(sylenthXModDestAm, -10, 10, -50, 50);
						modPairs.Add(new ZebraModulationPair(zebraModSourceFieldName, zebraModSourceFieldValue, zebraModDepthFieldName, zebraModDepthFieldValue));
						
						break;
					case Sylenth1Preset.YMODDEST.Phase_B:
						// PhsMSrc = PhaseModSrc
						// PhsMDpt = PhaseModDepth
						zebraModSourceFieldName = "OSC3_PhsMSrc";
						zebraModSourceFieldValue = (int) zebraModSource;
						zebraModDepthFieldName = "OSC3_PhsMDpt";
						zebraModDepthFieldValue = ConvertSylenthValueToZebra(sylenthXModDestAm, -10, 10, -50, 50);
						modPairs.Add(new ZebraModulationPair(zebraModSourceFieldName, zebraModSourceFieldValue, zebraModDepthFieldName, zebraModDepthFieldValue));

						zebraModSourceFieldName = "OSC4_PhsMSrc";
						zebraModSourceFieldValue = (int) zebraModSource;
						zebraModDepthFieldName = "OSC4_PhsMDpt";
						zebraModDepthFieldValue = ConvertSylenthValueToZebra(sylenthXModDestAm, -10, 10, -50, 50);
						modPairs.Add(new ZebraModulationPair(zebraModSourceFieldName, zebraModSourceFieldValue, zebraModDepthFieldName, zebraModDepthFieldValue));
						
						break;
					case Sylenth1Preset.YMODDEST.Phase_AB:
						// PhsMSrc = PhaseModSrc
						// PhsMDpt = PhaseModDepth
						zebraModSourceFieldName = "OSC1_PhsMSrc";
						zebraModSourceFieldValue = (int) zebraModSource;
						zebraModDepthFieldName = "OSC1_PhsMDpt";
						zebraModDepthFieldValue = ConvertSylenthValueToZebra(sylenthXModDestAm, -10, 10, -50, 50);
						modPairs.Add(new ZebraModulationPair(zebraModSourceFieldName, zebraModSourceFieldValue, zebraModDepthFieldName, zebraModDepthFieldValue));

						zebraModSourceFieldName = "OSC2_PhsMSrc";
						zebraModSourceFieldValue = (int) zebraModSource;
						zebraModDepthFieldName = "OSC2_PhsMDpt";
						zebraModDepthFieldValue = ConvertSylenthValueToZebra(sylenthXModDestAm, -10, 10, -50, 50);
						modPairs.Add(new ZebraModulationPair(zebraModSourceFieldName, zebraModSourceFieldValue, zebraModDepthFieldName, zebraModDepthFieldValue));

						zebraModSourceFieldName = "OSC3_PhsMSrc";
						zebraModSourceFieldValue = (int) zebraModSource;
						zebraModDepthFieldName = "OSC3_PhsMDpt";
						zebraModDepthFieldValue = ConvertSylenthValueToZebra(sylenthXModDestAm, -10, 10, -50, 50);
						modPairs.Add(new ZebraModulationPair(zebraModSourceFieldName, zebraModSourceFieldValue, zebraModDepthFieldName, zebraModDepthFieldValue));

						zebraModSourceFieldName = "OSC4_PhsMSrc";
						zebraModSourceFieldValue = (int) zebraModSource;
						zebraModDepthFieldName = "OSC4_PhsMDpt";
						zebraModDepthFieldValue = ConvertSylenthValueToZebra(sylenthXModDestAm, -10, 10, -50, 50);
						modPairs.Add(new ZebraModulationPair(zebraModSourceFieldName, zebraModSourceFieldValue, zebraModDepthFieldName, zebraModDepthFieldValue));
						
						break;
					case Sylenth1Preset.YMODDEST.Pan_A:
						// Pan A:
						zebraModSourceFieldName = "VCA1_PanMS1";
						zebraModSourceFieldValue = (int) zebraModSource;
						zebraModDepthFieldName = "VCA1_PanMD1";
						zebraModDepthFieldValue = ConvertSylenthValueToZebra(sylenthXModDestAm, -10, 10, -100, 100);			// Pan Mod Dpt1
						modPairs.Add(new ZebraModulationPair(zebraModSourceFieldName, zebraModSourceFieldValue, zebraModDepthFieldName, zebraModDepthFieldValue));
						
						break;
					case Sylenth1Preset.YMODDEST.Pan_B:
						// Pan B:
						zebraModSourceFieldName = "VCA1_PanMS2";
						zebraModSourceFieldValue = (int) zebraModSource;
						zebraModDepthFieldName = "VCA1_PanMD2";
						zebraModDepthFieldValue = ConvertSylenthValueToZebra(sylenthXModDestAm, -10, 10, -100, 100);			// Pan Mod Dpt2
						modPairs.Add(new ZebraModulationPair(zebraModSourceFieldName, zebraModSourceFieldValue, zebraModDepthFieldName, zebraModDepthFieldValue));
						
						break;
					case Sylenth1Preset.YMODDEST.Pan_AB:
						// Pan A and B:
						zebraModSourceFieldName = "VCA1_PanMS1";
						zebraModSourceFieldValue = (int) zebraModSource;
						zebraModDepthFieldName = "VCA1_PanMD1";
						zebraModDepthFieldValue = ConvertSylenthValueToZebra(sylenthXModDestAm, -10, 10, -100, 100);			// Pan Mod Dpt1
						modPairs.Add(new ZebraModulationPair(zebraModSourceFieldName, zebraModSourceFieldValue, zebraModDepthFieldName, zebraModDepthFieldValue));
						
						zebraModSourceFieldName = "VCA1_PanMS2";
						zebraModSourceFieldValue = (int) zebraModSource;
						zebraModDepthFieldName = "VCA1_PanMD2";
						zebraModDepthFieldValue = ConvertSylenthValueToZebra(sylenthXModDestAm, -10, 10, -100, 100);			// Pan Mod Dpt2
						modPairs.Add(new ZebraModulationPair(zebraModSourceFieldName, zebraModSourceFieldValue, zebraModDepthFieldName, zebraModDepthFieldValue));
						
						break;

						// Filters
						// The target for a '...' knob is usually the parameter to its immediate left.
						// The two filter modules (VCF and XMF) are exceptions to the above rule.
						// By all appearances, the two unlabeled knobs should affect Resonance
						// – in fact they both modulate Cutoff.
						// FS1 = Modsource1
						// FM1 = ModDepth1 (-150 - 150)
						// FS2 = Modsource2
						// FM2 = ModDepth2 (-150 - 150)
					case Sylenth1Preset.YMODDEST.Cutoff_A:
						zebraModSourceFieldName = "VCF1_FS1";
						zebraModDepthFieldName = "VCF1_FM1";
						if (_zebraUsedModSources.Contains(zebraModSourceFieldName)) {
							// already used the first cutoff knob
							zebraModSourceFieldName = "VCF1_FS2";
							zebraModDepthFieldName = "VCF1_FM2";
						}
						zebraModSourceFieldValue = (int) zebraModSource;
						zebraModDepthFieldValue = CutoffModDepthValue;
						modPairs.Add(new ZebraModulationPair(zebraModSourceFieldName, zebraModSourceFieldValue, zebraModDepthFieldName, zebraModDepthFieldValue));
						
						break;
					case Sylenth1Preset.YMODDEST.Cutoff_B:
						zebraModSourceFieldName = "VCF2_FS1";
						zebraModDepthFieldName = "VCF2_FM1";
						if (_zebraUsedModSources.Contains(zebraModSourceFieldName)) {
							// already used the first cutoff knob
							zebraModSourceFieldName = "VCF2_FS2";
							zebraModDepthFieldName = "VCF2_FM2";
						}
						zebraModSourceFieldValue = (int) zebraModSource;
						zebraModDepthFieldValue = CutoffModDepthValue;
						modPairs.Add(new ZebraModulationPair(zebraModSourceFieldName, zebraModSourceFieldValue, zebraModDepthFieldName, zebraModDepthFieldValue));
						
						break;
					case Sylenth1Preset.YMODDEST.CutoffAB:
						zebraModSourceFieldName = "VCF1_FS1";
						zebraModDepthFieldName = "VCF1_FM1";
						if (_zebraUsedModSources.Contains(zebraModSourceFieldName)) {
							// already used the first cutoff knob
							zebraModSourceFieldName = "VCF1_FS2";
							zebraModDepthFieldName = "VCF1_FM2";
						}
						zebraModSourceFieldValue = (int) zebraModSource;
						zebraModDepthFieldValue = CutoffModDepthValue;
						modPairs.Add(new ZebraModulationPair(zebraModSourceFieldName, zebraModSourceFieldValue, zebraModDepthFieldName, zebraModDepthFieldValue));

						zebraModSourceFieldName = "VCF2_FS1";
						zebraModDepthFieldName = "VCF2_FM1";
						if (_zebraUsedModSources.Contains(zebraModSourceFieldName)) {
							// already used the first cutoff knob
							zebraModSourceFieldName = "VCF2_FS2";
							zebraModDepthFieldName = "VCF2_FM2";
						}
						zebraModSourceFieldValue = (int) zebraModSource;
						zebraModDepthFieldValue = CutoffModDepthValue;
						modPairs.Add(new ZebraModulationPair(zebraModSourceFieldName, zebraModSourceFieldValue, zebraModDepthFieldName, zebraModDepthFieldValue));
						
						break;
					case Sylenth1Preset.YMODDEST.Reso_A:
						zebraModSourceFieldName = "VCF1_FS2";
						zebraModSourceFieldValue = (int) zebraModSource;
						zebraModDepthFieldName = "VCF1_FM2";
						zebraModDepthFieldValue = ConvertSylenthValueToZebra(sylenthXModDestAm, -10, 10, -150, 150);
						
						// Force using the Mod Matrix since resonance cannot be modulated by any other means
						modPairs.Add(new ZebraModulationPair(zebraModSourceFieldName, zebraModSourceFieldValue, zebraModDepthFieldName, zebraModDepthFieldValue, true));

						break;
					case Sylenth1Preset.YMODDEST.Reso_B:
						zebraModSourceFieldName = "VCF2_FS2";
						zebraModSourceFieldValue = (int) zebraModSource;
						zebraModDepthFieldName = "VCF2_FM2";
						zebraModDepthFieldValue = ConvertSylenthValueToZebra(sylenthXModDestAm, -10, 10, -150, 150);
						
						// Force using the Mod Matrix since resonance cannot be modulated by any other means
						modPairs.Add(new ZebraModulationPair(zebraModSourceFieldName, zebraModSourceFieldValue, zebraModDepthFieldName, zebraModDepthFieldValue, true));

						break;
					case Sylenth1Preset.YMODDEST.Reso_AB:
						zebraModSourceFieldName = "VCF1_FS2";
						zebraModSourceFieldValue = (int) zebraModSource;
						zebraModDepthFieldName = "VCF1_FM2";
						zebraModDepthFieldValue = ConvertSylenthValueToZebra(sylenthXModDestAm, -10, 10, -150, 150);
						
						// Force using the Mod Matrix since resonance cannot be modulated by any other means
						modPairs.Add(new ZebraModulationPair(zebraModSourceFieldName, zebraModSourceFieldValue, zebraModDepthFieldName, zebraModDepthFieldValue, true));

						zebraModSourceFieldName = "VCF2_FS2";
						zebraModSourceFieldValue = (int) zebraModSource;
						zebraModDepthFieldName = "VCF2_FM2";
						zebraModDepthFieldValue = ConvertSylenthValueToZebra(sylenthXModDestAm, -10, 10, -150, 150);

						// Force using the Mod Matrix since resonance cannot be modulated by any other means
						modPairs.Add(new ZebraModulationPair(zebraModSourceFieldName, zebraModSourceFieldValue, zebraModDepthFieldName, zebraModDepthFieldValue, true));

						break;
						
						// Misc
					case Sylenth1Preset.YMODDEST.PhsrFreq:
						zebraModSourceFieldName = "ModFX1_Sped";
						zebraModSourceFieldValue = (int) zebraModSource;
						zebraModDepthFieldName = "DUMMY";
						zebraModDepthFieldValue = ConvertSylenthValueToZebra(sylenthXModDestAm, -10, 10, -150, 150);

						// Force using the Mod Matrix since the phaser cannot be modulated by any other means
						modPairs.Add(new ZebraModulationPair(zebraModSourceFieldName, zebraModSourceFieldValue, zebraModDepthFieldName, zebraModDepthFieldValue, true));
						
						break;
						
					case Sylenth1Preset.YMODDEST.Mix_A:
						// Volume A:
						zebraModSourceFieldName = "VCA1_ModSrc1";
						zebraModSourceFieldValue = (int) zebraModSource;
						zebraModDepthFieldName = "VCA1_ModDpt1";
						zebraModDepthFieldValue = ConvertSylenthValueToZebra(sylenthXModDestAm, -10, 10, -100, 100);
						modPairs.Add(new ZebraModulationPair(zebraModSourceFieldName, zebraModSourceFieldValue, zebraModDepthFieldName, zebraModDepthFieldValue));

						// Force using the Mod Matrix since volume cannot be modulated by any other means
						_zebraUsedModSources.Add(zebraModSourceFieldName);
						
						break;
					case Sylenth1Preset.YMODDEST.Mix_B:
						// Volume B:
						zebraModSourceFieldName = "VCA1_ModSrc2";
						zebraModSourceFieldValue = (int) zebraModSource;
						zebraModDepthFieldName = "VCA1_ModDpt2";
						zebraModDepthFieldValue = ConvertSylenthValueToZebra(sylenthXModDestAm, -10, 10, -100, 100);			// Mod Depth2
						modPairs.Add(new ZebraModulationPair(zebraModSourceFieldName, zebraModSourceFieldValue, zebraModDepthFieldName, zebraModDepthFieldValue));
						
						// Force using the Mod Matrix since volume cannot be modulated by any other means
						_zebraUsedModSources.Add(zebraModSourceFieldName);
						
						break;
					case Sylenth1Preset.YMODDEST.Mix_AB:
						// Volume A and B:
						zebraModSourceFieldName = "VCA1_ModSrc1";
						zebraModSourceFieldValue = (int) zebraModSource;
						zebraModDepthFieldName = "VCA1_ModDpt1";
						zebraModDepthFieldValue = ConvertSylenthValueToZebra(sylenthXModDestAm, -10, 10, -100, 100);			// Mod Depth1
						modPairs.Add(new ZebraModulationPair(zebraModSourceFieldName, zebraModSourceFieldValue, zebraModDepthFieldName, zebraModDepthFieldValue));
						
						// Force using the Mod Matrix since volume cannot be modulated by any other means
						_zebraUsedModSources.Add(zebraModSourceFieldName);

						zebraModSourceFieldName = "VCA1_ModSrc2";
						zebraModSourceFieldValue = (int) zebraModSource;
						zebraModDepthFieldName = "VCA1_ModDpt2";
						zebraModDepthFieldValue = ConvertSylenthValueToZebra(sylenthXModDestAm, -10, 10, -100, 100);			// Mod Depth2
						modPairs.Add(new ZebraModulationPair(zebraModSourceFieldName, zebraModSourceFieldValue, zebraModDepthFieldName, zebraModDepthFieldValue));
						
						// Force using the Mod Matrix since volume cannot be modulated by any other means
						_zebraUsedModSources.Add(zebraModSourceFieldName);

						break;

					case Sylenth1Preset.YMODDEST.LFO1Rate:
						// FMS = FreqMod Src1=none
						// FMD = FreqMod Dpt (-100.00 - 100.00)
						zebraModSourceFieldName = "LFO1_FMS1";
						zebraModSourceFieldValue = (int) zebraModSource;
						zebraModDepthFieldName = "LFO1_FMD1";
						zebraModDepthFieldValue = ConvertSylenthValueToZebra(sylenthXModDestAm, -10, 10, -100, 100);
						
						// Force using the Mod Matrix since e.g. LFO1 rate or gain cannot be modulated by any other LFO
						modPairs.Add(new ZebraModulationPair(zebraModSourceFieldName, zebraModSourceFieldValue, zebraModDepthFieldName, zebraModDepthFieldValue, true));
						
						break;
					case Sylenth1Preset.YMODDEST.LFO1Gain:
						// DMS = DepthMod Src1=none
						// DMD = DepthMod Dpt1 (0.00 - 100.00)
						zebraModSourceFieldName = "LFO1_DMS1";
						zebraModSourceFieldValue = (int) zebraModSource;
						zebraModDepthFieldName = "LFO1_DMD1";
						zebraModDepthFieldValue = ConvertSylenthValueToZebra(sylenthXModDestAm, -10, 10, 0, 100);
						
						// Force using the Mod Matrix since e.g. LFO1 rate or gain cannot be modulated by any other LFO
						modPairs.Add(new ZebraModulationPair(zebraModSourceFieldName, zebraModSourceFieldValue, zebraModDepthFieldName, zebraModDepthFieldValue, true));
						
						break;
					case Sylenth1Preset.YMODDEST.LFO2Rate:
						// FMS = FreqMod Src1=none
						// FMD = FreqMod Dpt (-100.00 - 100.00)
						zebraModSourceFieldName = "LFO2_FMS1";
						zebraModSourceFieldValue = (int) zebraModSource;
						zebraModDepthFieldName = "LFO2_FMD1";
						zebraModDepthFieldValue = ConvertSylenthValueToZebra(sylenthXModDestAm, -10, 10, -100, 100);
						modPairs.Add(new ZebraModulationPair(zebraModSourceFieldName, zebraModSourceFieldValue, zebraModDepthFieldName, zebraModDepthFieldValue));
						
						break;
					case Sylenth1Preset.YMODDEST.LFO2Gain:
						// DMS = DepthMod Src1=none
						// DMD = DepthMod Dpt1 (0.00 - 100.00)
						zebraModSourceFieldName = "LFO2_DMS1";
						zebraModSourceFieldValue = (int) zebraModSource;
						zebraModDepthFieldName = "LFO2_DMD1";
						zebraModDepthFieldValue = ConvertSylenthValueToZebra(sylenthXModDestAm, -10, 10, 0, 100);
						modPairs.Add(new ZebraModulationPair(zebraModSourceFieldName, zebraModSourceFieldValue, zebraModDepthFieldName, zebraModDepthFieldValue));
						
						break;
					case Sylenth1Preset.YMODDEST.DistAmnt:
						// DMSrc = D_ModSrc=none
						// DMDpt = D_ModDepth
						zebraModSourceFieldName = "Dist3_DMSrc";
						zebraModSourceFieldValue = (int) zebraModSource;
						zebraModDepthFieldName = "Dist3_DMDpt";
						zebraModDepthFieldValue = ConvertSylenthValueToZebra(sylenthXModDestAm, -10, 10, -100, 100);
						
						// Force using the Mod Matrix since it's impossible to modulate distortion directly on the distortion channel
						modPairs.Add(new ZebraModulationPair(zebraModSourceFieldName, zebraModSourceFieldValue, zebraModDepthFieldName, zebraModDepthFieldValue, true));
						break;
				}

				// Use var keyword to enumerate dictionary
				foreach (ZebraModulationPair modElement in modPairs)
				{
					SetZebraModSourceFromSylenth(s1, z2, modElement.ZebraModSourceFieldName, modElement.ZebraModSourceFieldValue, modElement.ZebraModDepthFieldName, modElement.ZebraModDepthFieldValue, modElement.DoForceModMatrix, sylenthModSource, sylenthModDestination, sylenthXModDestAm, processedModulationSourceAndDest);
				}
			}
		}
		private static void SetZebraArpeggiatorNoteFromSylenth(Zebra2Preset z2, float storedSylenthArpGateValue, Sylenth1Preset.ONOFF arpHoldValue, float storedSylenthArpTransposeValue, float storedSylenthArpVelocityValue, int index) {
			
			// TODO: use storedSylenthArpGateValue for something?
			// range: 0% - 100%
			float arpGatePercentage = MathUtils.ConvertAndMainainRatio(storedSylenthArpGateValue, 0, 1, 0, 100);

			// TODO: use storedSylenthArpVelocityValue for something?
			// range = 0 - 127
			float arpGateVelocity = MathUtils.ConvertAndMainainRatio(storedSylenthArpVelocityValue, 0, 1, 0, 127);
			
			string arpGateFieldName = "VCC_Agte" + index;
			// Gate range: 0 - 5 (2 = Default)
			int arpGateFieldValue = 2;
			if (arpHoldValue == Sylenth1Preset.ONOFF.On) {
				arpGateFieldValue = 5;
			}
			// If the velocity is 0 - use the Sylenth1Preset.VOICES to "zero" this note
			// set Sylenth1Preset.VOICES to 0 as well
			if (arpGateVelocity == 0) {
				arpGateFieldValue = 0;
			}
			ObjectUtils.SetField(z2, arpGateFieldName, arpGateFieldValue);
			
			string arpTransposeFieldName = "VCC_Atrp" + index;
			// Transpose range: -12 - 0 - 12 (0 = Default)
			int arpTransposeFieldValue = 0;
			Sylenth1Preset.ARPTRANSPOSE transpose = Sylenth1Preset.ArpeggiatorTransposeFloatToEnum(storedSylenthArpTransposeValue);
			switch (transpose) {
				case Sylenth1Preset.ARPTRANSPOSE.MINUS_24:
					arpTransposeFieldValue = -12;
					break;
				case Sylenth1Preset.ARPTRANSPOSE.MINUS_23:
					arpTransposeFieldValue = -11;
					break;
				case Sylenth1Preset.ARPTRANSPOSE.MINUS_22:
					arpTransposeFieldValue = -10;
					break;
				case Sylenth1Preset.ARPTRANSPOSE.MINUS_21:
					arpTransposeFieldValue = -9;
					break;
				case Sylenth1Preset.ARPTRANSPOSE.MINUS_20:
					arpTransposeFieldValue = -8;
					break;
				case Sylenth1Preset.ARPTRANSPOSE.MINUS_19:
					arpTransposeFieldValue = -7;
					break;
				case Sylenth1Preset.ARPTRANSPOSE.MINUS_18:
					arpTransposeFieldValue = -6;
					break;
				case Sylenth1Preset.ARPTRANSPOSE.MINUS_17:
					arpTransposeFieldValue = -5;
					break;
				case Sylenth1Preset.ARPTRANSPOSE.MINUS_16:
					arpTransposeFieldValue = -4;
					break;
				case Sylenth1Preset.ARPTRANSPOSE.MINUS_15:
					arpTransposeFieldValue = -3;
					break;
				case Sylenth1Preset.ARPTRANSPOSE.MINUS_14:
					arpTransposeFieldValue = -2;
					break;
				case Sylenth1Preset.ARPTRANSPOSE.MINUS_13:
					arpTransposeFieldValue = -1;
					break;
				case Sylenth1Preset.ARPTRANSPOSE.MINUS_12:
					arpTransposeFieldValue = -12;
					break;
				case Sylenth1Preset.ARPTRANSPOSE.MINUS_11:
					arpTransposeFieldValue = -11;
					break;
				case Sylenth1Preset.ARPTRANSPOSE.MINUS_10:
					arpTransposeFieldValue = -10;
					break;
				case Sylenth1Preset.ARPTRANSPOSE.MINUS_9:
					arpTransposeFieldValue = -9;
					break;
				case Sylenth1Preset.ARPTRANSPOSE.MINUS_8:
					arpTransposeFieldValue = -8;
					break;
				case Sylenth1Preset.ARPTRANSPOSE.MINUS_7:
					arpTransposeFieldValue = -7;
					break;
				case Sylenth1Preset.ARPTRANSPOSE.MINUS_6:
					arpTransposeFieldValue = -6;
					break;
				case Sylenth1Preset.ARPTRANSPOSE.MINUS_5:
					arpTransposeFieldValue = -5;
					break;
				case Sylenth1Preset.ARPTRANSPOSE.MINUS_4:
					arpTransposeFieldValue = -4;
					break;
				case Sylenth1Preset.ARPTRANSPOSE.MINUS_3:
					arpTransposeFieldValue = -3;
					break;
				case Sylenth1Preset.ARPTRANSPOSE.MINUS_2:
					arpTransposeFieldValue = -2;
					break;
				case Sylenth1Preset.ARPTRANSPOSE.MINUS_1:
					arpTransposeFieldValue = -1;
					break;
				case Sylenth1Preset.ARPTRANSPOSE.ZERO:
					arpTransposeFieldValue = 0;
					break;
				case Sylenth1Preset.ARPTRANSPOSE.PLUSS_1:
					arpTransposeFieldValue = 1;
					break;
				case Sylenth1Preset.ARPTRANSPOSE.PLUSS_2:
					arpTransposeFieldValue = 2;
					break;
				case Sylenth1Preset.ARPTRANSPOSE.PLUSS_3:
					arpTransposeFieldValue = 3;
					break;
				case Sylenth1Preset.ARPTRANSPOSE.PLUSS_4:
					arpTransposeFieldValue = 4;
					break;
				case Sylenth1Preset.ARPTRANSPOSE.PLUSS_5:
					arpTransposeFieldValue = 5;
					break;
				case Sylenth1Preset.ARPTRANSPOSE.PLUSS_6:
					arpTransposeFieldValue = 6;
					break;
				case Sylenth1Preset.ARPTRANSPOSE.PLUSS_7:
					arpTransposeFieldValue = 7;
					break;
				case Sylenth1Preset.ARPTRANSPOSE.PLUSS_8:
					arpTransposeFieldValue = 8;
					break;
				case Sylenth1Preset.ARPTRANSPOSE.PLUSS_9:
					arpTransposeFieldValue = 9;
					break;
				case Sylenth1Preset.ARPTRANSPOSE.PLUSS_10:
					arpTransposeFieldValue = 10;
					break;
				case Sylenth1Preset.ARPTRANSPOSE.PLUSS_11:
					arpTransposeFieldValue = 11;
					break;
				case Sylenth1Preset.ARPTRANSPOSE.PLUSS_12:
					arpTransposeFieldValue = 12;
					break;
				case Sylenth1Preset.ARPTRANSPOSE.PLUSS_13:
					arpTransposeFieldValue = 1;
					break;
				case Sylenth1Preset.ARPTRANSPOSE.PLUSS_14:
					arpTransposeFieldValue = 2;
					break;
				case Sylenth1Preset.ARPTRANSPOSE.PLUSS_15:
					arpTransposeFieldValue = 3;
					break;
				case Sylenth1Preset.ARPTRANSPOSE.PLUSS_16:
					arpTransposeFieldValue = 4;
					break;
				case Sylenth1Preset.ARPTRANSPOSE.PLUSS_17:
					arpTransposeFieldValue = 5;
					break;
				case Sylenth1Preset.ARPTRANSPOSE.PLUSS_18:
					arpTransposeFieldValue = 6;
					break;
				case Sylenth1Preset.ARPTRANSPOSE.PLUSS_19:
					arpTransposeFieldValue = 7;
					break;
				case Sylenth1Preset.ARPTRANSPOSE.PLUSS_20:
					arpTransposeFieldValue = 8;
					break;
				case Sylenth1Preset.ARPTRANSPOSE.PLUSS_21:
					arpTransposeFieldValue = 9;
					break;
				case Sylenth1Preset.ARPTRANSPOSE.PLUSS_22:
					arpTransposeFieldValue = 10;
					break;
				case Sylenth1Preset.ARPTRANSPOSE.PLUSS_23:
					arpTransposeFieldValue = 11;
					break;
				case Sylenth1Preset.ARPTRANSPOSE.PLUSS_24:
					arpTransposeFieldValue = 12;
					break;
			}
			
			ObjectUtils.SetField(z2, arpTransposeFieldName, arpTransposeFieldValue);
			
			string arpVoicesFieldName = "VCC_Avoc" + index;
			// Sylenth1Preset.VOICES range: 0 - 6 (1 = Default)
			int arpVoicesFieldValue = 6;
			// If the velocity is 0 - use the Sylenth1Preset.VOICES to "zero" this note
			if (arpGateVelocity == 0) {
				arpVoicesFieldValue = 0;
			}
			ObjectUtils.SetField(z2, arpVoicesFieldName, arpVoicesFieldValue);
			
			string arpDurationFieldName = "VCC_Amul" + index;
			// Duration range: 1 - 4 (1 = Default)
			// 4 = quarter
			// 3 = eigth dotted
			// 2 = eigth
			// 1 = sixteenth
			const int arpDurationFieldValue = (int)Zebra2Preset.ArpNoteDuration.Sixteenth;
			ObjectUtils.SetField(z2, arpDurationFieldName, arpDurationFieldValue);
			
			string arpStepControlFieldName = "VCC_Amod" + index;
			// Step range:
			// Next = 0,
			// Same = 1,
			// First = 2,
			// Last = 3
			const int arpStepControlFieldValue = (int) Zebra2Preset.ArpNoteStep.Next;
			ObjectUtils.SetField(z2, arpStepControlFieldName, arpStepControlFieldValue);

			string arpStepModAFieldName = "VCC_AMDpt" + index;
			const float arpStepModAFieldValue = 00.00f;
			ObjectUtils.SetField(z2, arpStepModAFieldName, arpStepModAFieldValue);
			
			string arpStepModBFieldName = "VCC_AMDpB" + index;
			const float arpStepModBFieldValue = 00.00f;
			ObjectUtils.SetField(z2, arpStepModBFieldName, arpStepModBFieldValue);
		}
		private static void SetZebraLFOFromSylenth(Zebra2Preset z2, Sylenth1Preset.LFOWAVE sylenthLFOWave, Sylenth1Preset.ONOFF sylenthLFOFree, float sylenthLFORate, float sylenthLFOGain,
		                                           string LFOWaveFieldName,
		                                           string LFOSyncFieldName,
		                                           string LFORateFieldName,
		                                           string LFOTrigFieldName,
		                                           string LFOPhseFieldName,
		                                           string LFOAmpFieldName,
		                                           string LFOSlewFieldName,
		                                           int bpm=120) {

			Zebra2Preset.LFOWave zebraLFOWave = Zebra2Preset.LFOWave.sine;
			switch (sylenthLFOWave) {
				case Sylenth1Preset.LFOWAVE.LFO_HPulse:
					zebraLFOWave = Zebra2Preset.LFOWave.sqr_hi_lo;
					break;
				case Sylenth1Preset.LFOWAVE.LFO_Lorenz:
					zebraLFOWave = Zebra2Preset.LFOWave.sine;
					break;
				case Sylenth1Preset.LFOWAVE.LFO_Pulse:
					zebraLFOWave = Zebra2Preset.LFOWave.sqr_hi_lo;
					break;
				case Sylenth1Preset.LFOWAVE.LFO_QPulse:
					zebraLFOWave = Zebra2Preset.LFOWave.sqr_hi_lo;
					break;
				case Sylenth1Preset.LFOWAVE.LFO_Ramp:
					zebraLFOWave = Zebra2Preset.LFOWave.saw_down;
					break;
				case Sylenth1Preset.LFOWAVE.LFO_Random:
					zebraLFOWave = Zebra2Preset.LFOWave.rand_glide;
					break;
				case Sylenth1Preset.LFOWAVE.LFO_Saw:
					zebraLFOWave = Zebra2Preset.LFOWave.saw_down;
					break;
				case Sylenth1Preset.LFOWAVE.LFO_Sine:
					zebraLFOWave = Zebra2Preset.LFOWave.sine;
					break;
				case Sylenth1Preset.LFOWAVE.LFO_SmpHold:
					zebraLFOWave = Zebra2Preset.LFOWave.rand_hold;
					break;
				case Sylenth1Preset.LFOWAVE.LFO_Triangle:
					zebraLFOWave = Zebra2Preset.LFOWave.triangle;
					break;
				case Sylenth1Preset.LFOWAVE.LFO_TriSaw:
					zebraLFOWave = Zebra2Preset.LFOWave.saw_up;
					break;
			}
			ObjectUtils.SetField(z2, LFOWaveFieldName, (int) zebraLFOWave);
			
			if (sylenthLFOFree == Sylenth1Preset.ONOFF.On) {
				// use free LFO = hz (0.04 - 192 Hz)
				float lfo1RateHz = Sylenth1Preset.ValueToHz( sylenthLFORate, Sylenth1Preset.FloatToHz.LFORateFree);
				
				// hz = 1 / s
				float msValue = (float) 1 / lfo1RateHz * 1000;
				
				Zebra2Preset.LFOSync lfoSync = Zebra2Preset.LFOSync.SYNC_0_1s;
				int lfoValue = 0;
				Zebra2Preset.MillisecondsToLFOSyncAndValue(msValue, out lfoSync, out lfoValue);
				
				ObjectUtils.SetField(z2, LFOSyncFieldName, (int) lfoSync);
				ObjectUtils.SetField(z2, LFORateFieldName, lfoValue);
			} else {
				// use LFO preset
				Sylenth1Preset.LFOTIMING timing = Sylenth1Preset.LFOTimeFloatToEnum( sylenthLFORate );
				
				// Rate (0.00 - 200.00)
				const float rateNormal = 100.00f;
				const float rateDotted = 87.00f;  // =8*((50/I15)^3) (87 is the closest)
				const float rateTriple = 114.00f; // =8*((50/I13)^3) (114 is the closest)
				
				float zebraLFORate = rateNormal;
				double msValue = 0;
				int rate = 0;
				Zebra2Preset.LFOSync zebraLFOSync = Zebra2Preset.LFOSync.SYNC_1_4;
				switch (timing) {
					case Sylenth1Preset.LFOTIMING.LFO_UNKNOWN:
						zebraLFOSync = Zebra2Preset.LFOSync.SYNC_1_4;
						zebraLFORate = rateNormal;
						break;
					case Sylenth1Preset.LFOTIMING.LFO_8_1D:
						zebraLFOSync = Zebra2Preset.LFOSync.SYNC_8_1;
						zebraLFORate = rateDotted;
						break;
					case Sylenth1Preset.LFOTIMING.LFO_8_1:
						zebraLFOSync = Zebra2Preset.LFOSync.SYNC_8_1;
						zebraLFORate = rateNormal;
						break;
					case Sylenth1Preset.LFOTIMING.LFO_4_1D:
						zebraLFOSync = Zebra2Preset.LFOSync.SYNC_4_1;
						zebraLFORate = rateDotted;
						break;
					case Sylenth1Preset.LFOTIMING.LFO_8_1T:
						zebraLFOSync = Zebra2Preset.LFOSync.SYNC_8_1;
						zebraLFORate = rateTriple;
						break;
					case Sylenth1Preset.LFOTIMING.LFO_4_1:
						zebraLFOSync = Zebra2Preset.LFOSync.SYNC_4_1;
						zebraLFORate = rateNormal;
						break;
					case Sylenth1Preset.LFOTIMING.LFO_2_1D:
						zebraLFOSync = Zebra2Preset.LFOSync.SYNC_2_1;
						zebraLFORate = rateDotted;
						break;
					case Sylenth1Preset.LFOTIMING.LFO_4_1T:
						zebraLFOSync = Zebra2Preset.LFOSync.SYNC_4_1;
						zebraLFORate = rateTriple;
						break;
					case Sylenth1Preset.LFOTIMING.LFO_2_1:
						zebraLFOSync = Zebra2Preset.LFOSync.SYNC_2_1;
						zebraLFORate = rateNormal;
						break;
					case Sylenth1Preset.LFOTIMING.LFO_1_1D:
						zebraLFOSync = Zebra2Preset.LFOSync.SYNC_1_1;
						zebraLFORate = rateDotted;
						break;
					case Sylenth1Preset.LFOTIMING.LFO_2_1T:
						zebraLFOSync = Zebra2Preset.LFOSync.SYNC_2_1;
						zebraLFORate = rateTriple;
						break;
					case Sylenth1Preset.LFOTIMING.LFO_1_1:
						zebraLFOSync = Zebra2Preset.LFOSync.SYNC_1_1;
						zebraLFORate = rateNormal;
						break;
					case Sylenth1Preset.LFOTIMING.LFO_1_2D:
						zebraLFOSync = Zebra2Preset.LFOSync.SYNC_1_2_dot;
						zebraLFORate = rateNormal;
						break;
					case Sylenth1Preset.LFOTIMING.LFO_1_1T:
						zebraLFOSync = Zebra2Preset.LFOSync.SYNC_1_1_trip;
						zebraLFORate = rateNormal;
						break;
					case Sylenth1Preset.LFOTIMING.LFO_1_2:
						zebraLFOSync = Zebra2Preset.LFOSync.SYNC_1_2;
						zebraLFORate = rateNormal;
						break;
					case Sylenth1Preset.LFOTIMING.LFO_1_4D:
						zebraLFOSync = Zebra2Preset.LFOSync.SYNC_1_4_dot;
						zebraLFORate = rateNormal;
						break;
					case Sylenth1Preset.LFOTIMING.LFO_1_2T:
						zebraLFOSync = Zebra2Preset.LFOSync.SYNC_1_2_trip;
						zebraLFORate = rateNormal;
						break;
					case Sylenth1Preset.LFOTIMING.LFO_1_4:
						zebraLFOSync = Zebra2Preset.LFOSync.SYNC_1_4;
						zebraLFORate = rateNormal;
						break;
					case Sylenth1Preset.LFOTIMING.LFO_1_8D:
						zebraLFOSync = Zebra2Preset.LFOSync.SYNC_1_8_dot;
						zebraLFORate = rateNormal;
						break;
					case Sylenth1Preset.LFOTIMING.LFO_1_4T:
						zebraLFOSync = Zebra2Preset.LFOSync.SYNC_1_4_trip;
						zebraLFORate = rateNormal;
						break;
					case Sylenth1Preset.LFOTIMING.LFO_1_8:
						zebraLFOSync = Zebra2Preset.LFOSync.SYNC_1_8;
						zebraLFORate = rateNormal;
						break;
					case Sylenth1Preset.LFOTIMING.LFO_1_16D:
						zebraLFOSync = Zebra2Preset.LFOSync.SYNC_1_16_dot;
						zebraLFORate = rateNormal;
						break;
					case Sylenth1Preset.LFOTIMING.LFO_1_8T:
						zebraLFOSync = Zebra2Preset.LFOSync.SYNC_1_8_trip;
						zebraLFORate = rateNormal;
						break;
					case Sylenth1Preset.LFOTIMING.LFO_1_16:
						zebraLFOSync = Zebra2Preset.LFOSync.SYNC_1_16;
						zebraLFORate = rateNormal;
						break;
					case Sylenth1Preset.LFOTIMING.LFO_1_32D:
						zebraLFOSync = Zebra2Preset.LFOSync.SYNC_1_32_dot;
						zebraLFORate = rateNormal;
						break;
					case Sylenth1Preset.LFOTIMING.LFO_1_16T:
						zebraLFOSync = Zebra2Preset.LFOSync.SYNC_1_16_trip;
						zebraLFORate = rateNormal;
						break;
					case Sylenth1Preset.LFOTIMING.LFO_1_32:
						zebraLFOSync = Zebra2Preset.LFOSync.SYNC_1_32;
						zebraLFORate = rateNormal;
						break;
					case Sylenth1Preset.LFOTIMING.LFO_1_64D:
						zebraLFOSync = Zebra2Preset.LFOSync.SYNC_1_64;
						zebraLFORate = rateDotted;
						break;
					case Sylenth1Preset.LFOTIMING.LFO_1_32T:
						zebraLFOSync = Zebra2Preset.LFOSync.SYNC_1_32;
						zebraLFORate = rateTriple;
						break;
					case Sylenth1Preset.LFOTIMING.LFO_1_64:
						zebraLFOSync = Zebra2Preset.LFOSync.SYNC_1_64;
						zebraLFORate = rateNormal;
						break;
					case Sylenth1Preset.LFOTIMING.LFO_1_128D:
						msValue = AudioUtils.LFOOrDelayToMilliseconds(AudioUtils.LFOTIMING.LFO_1_128D, bpm);
						Zebra2Preset.MillisecondsToLFOSyncAndValue((float)msValue, out zebraLFOSync, out rate);
						zebraLFORate = rate;
						break;
					case Sylenth1Preset.LFOTIMING.LFO_1_64T:
						msValue = AudioUtils.LFOOrDelayToMilliseconds(AudioUtils.LFOTIMING.LFO_1_64T, bpm);
						Zebra2Preset.MillisecondsToLFOSyncAndValue((float)msValue, out zebraLFOSync, out rate);
						zebraLFORate = rate;
						break;
					case Sylenth1Preset.LFOTIMING.LFO_1_128:
						msValue = AudioUtils.LFOOrDelayToMilliseconds(AudioUtils.LFOTIMING.LFO_1_128, bpm);
						Zebra2Preset.MillisecondsToLFOSyncAndValue((float)msValue, out zebraLFOSync, out rate);
						zebraLFORate = rate;
						break;
						
						// Zebra 2 does not support values lower than 12.5 ms
					case Sylenth1Preset.LFOTIMING.LFO_1_256D:
						msValue = AudioUtils.LFOOrDelayToMilliseconds(AudioUtils.LFOTIMING.LFO_1_256D, bpm);
						Zebra2Preset.MillisecondsToLFOSyncAndValue((float)msValue, out zebraLFOSync, out rate);
						zebraLFORate = rate;
						break;
					case Sylenth1Preset.LFOTIMING.LFO_1_128T:
						msValue = AudioUtils.LFOOrDelayToMilliseconds(AudioUtils.LFOTIMING.LFO_1_128T, bpm);
						Zebra2Preset.MillisecondsToLFOSyncAndValue((float)msValue, out zebraLFOSync, out rate);
						zebraLFORate = rate;
						break;
					case Sylenth1Preset.LFOTIMING.LFO_1_256:
						msValue = AudioUtils.LFOOrDelayToMilliseconds(AudioUtils.LFOTIMING.LFO_1_256, bpm);
						Zebra2Preset.MillisecondsToLFOSyncAndValue((float)msValue, out zebraLFOSync, out rate);
						zebraLFORate = rate;
						break;
					case Sylenth1Preset.LFOTIMING.LFO_1_256T:
						msValue = AudioUtils.LFOOrDelayToMilliseconds(AudioUtils.LFOTIMING.LFO_1_256T, bpm);
						Zebra2Preset.MillisecondsToLFOSyncAndValue((float)msValue, out zebraLFOSync, out rate);
						zebraLFORate = rate;
						break;
				}
				
				ObjectUtils.SetField(z2, LFOSyncFieldName, (int) zebraLFOSync);
				ObjectUtils.SetField(z2, LFORateFieldName, zebraLFORate);
			}
			
			ObjectUtils.SetField(z2, LFOTrigFieldName, (int) Zebra2Preset.LFOGlobalTriggering.Trig_off);
			ObjectUtils.SetField(z2, LFOPhseFieldName, 0.0f);
			
			// Get LFO Amp/Gain
			float lfoAmpGain = ConvertSylenthValueToZebra(sylenthLFOGain, 0, 10, 0, 100);

			// TODO: Amp value can never be zero - add a little (2.5 seems best for some sounds like 006 Hardwell from 'Top 100 DJs Sylenth Presets.fxb')
			if (lfoAmpGain == 0) lfoAmpGain = 2.5f;
			
			ObjectUtils.SetField(z2, LFOAmpFieldName, lfoAmpGain);
			
			ObjectUtils.SetField(z2, LFOSlewFieldName, (int) Zebra2Preset.LFOSlew.fast);	// LFO Slew (Slew=1)
		}
		/// <summary>
		/// Convert a sylenth preset to zebra preset
		/// </summary>
		/// <param name="defaultZebra2PresetFile">default zebra 2 preset file</param>
		/// <param name="doProcessInitPresets">whether to process presets with name 'Init'</param>
		/// <param name="skipAfterCounter">if number is higher than 0, skip the rest</param>
		/// <returns>a list of zebra preset files</returns>
		public List<Zebra2Preset> ToZebra2Preset(string defaultZebra2PresetFile, bool doProcessInitPresets, int skipAfterCounter=-1) {
			var zebra2PresetList = new List<Zebra2Preset>();

			// TODO: problems that should be fixed
			// Using Adam Van Baker Sylenth1 Soundset Part 2:
			// BP freq problem : 64 FX Uprise 3, 135 Arp clean state
			// Reverb problem: 170 Key Stone Valley
			
			// Alot wrong:
			// 176 LD Arab flute (Top 100 DJs Sylenth Presets.fxb)
			
			int convertCounter = 0;
			foreach (Sylenth1Preset.Syl1PresetContent sylenthPresetContent in _sylenth1Preset.ContentArray) {
				_zebraNextFreeModMatrixSlot = 1; // reset the index that keeps track of the used matrix slots for a preset
				_zebraUsedModSources.Clear(); // reset the list that keeps track of the used mod sources for a preset
				convertCounter++;
				
				// break if the break counter is set (i.e. skip the rest)
				if (skipAfterCounter > 0) {
					if (convertCounter == skipAfterCounter) break;
				}
				
				// Skip if the Preset Name is Init
				if (!doProcessInitPresets && (sylenthPresetContent.PresetName == "Init" || sylenthPresetContent.PresetName == "Default")) { //  || !Content.PresetName.StartsWith("SEQ Afrodiseq"
					// skipping
					Console.Out.WriteLine("Skipping Sylenth preset number {0} - {1} ...", convertCounter, sylenthPresetContent.PresetName);
					Logger.DoDebug(String.Format("*** Skipping preset number {0} - {1}! ***", convertCounter, sylenthPresetContent.PresetName));
				} else {
					Console.Out.WriteLine("Converting Sylenth preset number {0} - {1} ...", convertCounter, sylenthPresetContent.PresetName);
					Logger.DoDebug(String.Format("**** Converting preset number {0} - {1} ***", convertCounter, sylenthPresetContent.PresetName));
					
					// Load a default preset file and modify this one
					var zebra2Preset = new Zebra2Preset();
					zebra2Preset.BankIndex = convertCounter;
					zebra2Preset.Read(defaultZebra2PresetFile, true);
					
					// add to list
					zebra2PresetList.Add(zebra2Preset);
					
					// set name
					zebra2Preset.PresetName = sylenthPresetContent.PresetName;
					
					// set master volume (50?)
					zebra2Preset.Main_CcOp = ConvertSylenthValueToZebra(sylenthPresetContent.MainVolume, 0, 10, 0, 80); // restrict the limit from 100 - x
					zebra2Preset.ZMas_Mast = 80;
					
					// set mix volume
					zebra2Preset.VCA1_Vol1 = ConvertSylenthValueToZebra(sylenthPresetContent.MixA, 0, 10, 0, 100); // the range is 0, 100, but using 0 - x i get a more correct conversion
					zebra2Preset.VCA1_Vol2 = ConvertSylenthValueToZebra(sylenthPresetContent.MixB, 0, 10, 0, 100); // the range is 0, 100, but using 0 - x i get a more correct conversion
					
					// set portamento
					zebra2Preset.VCC_Porta = ConvertSylenthValueToZebra(sylenthPresetContent.PortaTime, 0, 10, 0, 60); // the range is 0, 100, but using 0 - 40 i get a more correct conversion
					
					// set mode (mono legato etc)
					if (sylenthPresetContent.MonoLegato == Sylenth1Preset.ONOFF.On) {
						zebra2Preset.VCC_Mode = (int) Zebra2Preset.VoiceMode.legato;
					} else {
						zebra2Preset.VCC_Mode = (int) Zebra2Preset.VoiceMode.poly;
					}
					
					// set pitch bend up and down
					float pitchBendRange = ConvertSylenthValueToZebra(sylenthPresetContent.PitchBendRange, 1, 24, 1, 24);
					zebra2Preset.VCC_PB = (int) pitchBendRange;
					zebra2Preset.VCC_PBD = (int) pitchBendRange;
					
					#region Oscillators
					// OscA1
					if (sylenthPresetContent.OscA1Voices != Sylenth1Preset.VOICES.VOICES_0) {
						if (sylenthPresetContent.OscA1Wave != Sylenth1Preset.OSCWAVE.OSC_Noise) {
							zebra2Preset.OSC1_WNum = ConvertSylenthWaveToZebra(sylenthPresetContent.OscA1Wave, sylenthPresetContent.OscA1Invert);
							zebra2Preset.OSC1_Vol = ConvertSylenthValueToZebra(sylenthPresetContent.OscA1Volume, 0, 10, 0, 200);

							// cannot let the volume be 0?!
							if (zebra2Preset.OSC1_Vol == 0) zebra2Preset.OSC1_Vol = 100;

							// turn the volume on Noise1 down
							zebra2Preset.Noise1_Vol = 0;
						} else {
							// turn the volume on OSC1 all the way down
							zebra2Preset.OSC1_Vol = 0;
							
							// turn the volume on Noise1 up
							zebra2Preset.Noise1_Vol = ConvertSylenthValueToZebra(sylenthPresetContent.OscA1Volume, 0, 10, 0, 200);
							zebra2Preset.Noise1_PolW = ConvertSylenthValueToZebra(sylenthPresetContent.OscA1Stereo, 0, 10, 0, 100);
							zebra2Preset.Noise1_Pan = ConvertSylenthValueToZebra(sylenthPresetContent.OscA1Pan, -10, 10, -100, 100);
						}
						zebra2Preset.OSC1_Tune = ConvertSylenthTuneToZebra(sylenthPresetContent.OscA1Octave, sylenthPresetContent.OscA1Note, sylenthPresetContent.OscA1Fine);
						zebra2Preset.OSC1_Poly = ConvertSylenthVoicesToZebra(sylenthPresetContent.OscA1Voices);
						zebra2Preset.OSC1_Dtun = ConvertSylenthDetuneToZebra(sylenthPresetContent.OscA1Detune);
						zebra2Preset.OSC1_Pan = ConvertSylenthValueToZebra(sylenthPresetContent.OscA1Pan, -10, 10, -100, 100);
						zebra2Preset.OSC1_PolW = ConvertSylenthValueToZebra(sylenthPresetContent.OscA1Stereo, 0, 10, 0, 100);
						zebra2Preset.OSC1_RePhs = (sylenthPresetContent.OscA1Retrig == Sylenth1Preset.ONOFF.On ? 1 : 0);
						zebra2Preset.OSC1_Phse = ConvertSylenthValueToZebra(sylenthPresetContent.OscA1Phase, 0, 360, 0, 100);
					} else {
						// set volume to zero?
						zebra2Preset.OSC1_Vol = 0;
					}

					// OscA2
					if (sylenthPresetContent.OscA2Voices != Sylenth1Preset.VOICES.VOICES_0) {
						if (sylenthPresetContent.OscA2Wave != Sylenth1Preset.OSCWAVE.OSC_Noise) {
							zebra2Preset.OSC2_WNum = ConvertSylenthWaveToZebra(sylenthPresetContent.OscA2Wave, sylenthPresetContent.OscA2Invert);
							zebra2Preset.OSC2_Vol = ConvertSylenthValueToZebra(sylenthPresetContent.OscA2Volume, 0, 10, 0, 200);

							// cannot let the volume be 0?!
							if (zebra2Preset.OSC2_Vol == 0) zebra2Preset.OSC2_Vol = 100;

							// turn the volume on Noise1 down
							zebra2Preset.Noise1_Vol = 0;
						} else {
							// turn the volume on OSC1 all the way down
							zebra2Preset.OSC2_Vol = 0;
							
							// turn the volume on Noise1 up
							zebra2Preset.Noise1_Vol = ConvertSylenthValueToZebra(sylenthPresetContent.OscA2Volume, 0, 10, 0, 200);
							zebra2Preset.Noise1_PolW = ConvertSylenthValueToZebra(sylenthPresetContent.OscA2Stereo, 0, 10, 0, 100);
							zebra2Preset.Noise1_Pan = ConvertSylenthValueToZebra(sylenthPresetContent.OscA2Pan, -10, 10, -100, 100);
						}
						zebra2Preset.OSC2_Tune = ConvertSylenthTuneToZebra(sylenthPresetContent.OscA2Octave, sylenthPresetContent.OscA2Note, sylenthPresetContent.OscA2Fine);
						zebra2Preset.OSC2_Poly = ConvertSylenthVoicesToZebra(sylenthPresetContent.OscA2Voices);
						zebra2Preset.OSC2_Dtun = ConvertSylenthDetuneToZebra(sylenthPresetContent.OscA2Detune);
						zebra2Preset.OSC2_Pan = ConvertSylenthValueToZebra(sylenthPresetContent.OscA2Pan, -10, 10, -100, 100);
						zebra2Preset.OSC2_PolW = ConvertSylenthValueToZebra(sylenthPresetContent.OscA2Stereo, 0, 10, 0, 100);
						zebra2Preset.OSC2_RePhs = (sylenthPresetContent.OscA2Retrig == Sylenth1Preset.ONOFF.On ? 1 : 0);
						zebra2Preset.OSC2_Phse = ConvertSylenthValueToZebra(sylenthPresetContent.OscA2Phase, 0, 360, 0, 100);
					} else {
						// set volume to zero?
						zebra2Preset.OSC2_Vol = 0;
					}
					
					// OscB1
					if (sylenthPresetContent.OscB1Voices != Sylenth1Preset.VOICES.VOICES_0) {
						if (sylenthPresetContent.OscB1Wave != Sylenth1Preset.OSCWAVE.OSC_Noise) {
							zebra2Preset.OSC3_WNum = ConvertSylenthWaveToZebra(sylenthPresetContent.OscB1Wave, sylenthPresetContent.OscB1Invert);
							zebra2Preset.OSC3_Vol = ConvertSylenthValueToZebra(sylenthPresetContent.OscB1Volume, 0, 10, 0, 200);

							// cannot let the volume be 0?!
							if (zebra2Preset.OSC3_Vol == 0) zebra2Preset.OSC3_Vol = 100;

							// turn the volume on Noise2 down
							zebra2Preset.Noise2_Vol = 0;
						} else {
							// turn the volume on OSC1 all the way down
							zebra2Preset.OSC3_Vol = 0;
							
							// turn the volume on Noise2 up
							zebra2Preset.Noise2_Vol = ConvertSylenthValueToZebra(sylenthPresetContent.OscB1Volume, 0, 10, 0, 200);
							zebra2Preset.Noise2_PolW = ConvertSylenthValueToZebra(sylenthPresetContent.OscB1Stereo, 0, 10, 0, 100);
							zebra2Preset.Noise2_Pan = ConvertSylenthValueToZebra(sylenthPresetContent.OscB1Pan, -10, 10, -100, 100);
						}
						zebra2Preset.OSC3_Tune = ConvertSylenthTuneToZebra(sylenthPresetContent.OscB1Octave, sylenthPresetContent.OscB1Note, sylenthPresetContent.OscB1Fine);
						zebra2Preset.OSC3_Poly = ConvertSylenthVoicesToZebra(sylenthPresetContent.OscB1Voices);
						zebra2Preset.OSC3_Dtun = ConvertSylenthDetuneToZebra(sylenthPresetContent.OscB1Detune);
						zebra2Preset.OSC3_Pan = ConvertSylenthValueToZebra(sylenthPresetContent.OscB1Pan, -10, 10, -100, 100);
						zebra2Preset.OSC3_PolW = ConvertSylenthValueToZebra(sylenthPresetContent.OscB1Stereo, 0, 10, 0, 100);
						zebra2Preset.OSC3_RePhs = (sylenthPresetContent.OscB1Retrig == Sylenth1Preset.ONOFF.On ? 1 : 0);
						zebra2Preset.OSC3_Phse = ConvertSylenthValueToZebra(sylenthPresetContent.OscB1Phase, 0, 360, 0, 100);
					} else {
						// set volume to zero?
						zebra2Preset.OSC3_Vol = 0;
					}

					// OscB2
					if (sylenthPresetContent.OscB2Voices != Sylenth1Preset.VOICES.VOICES_0) {
						if (sylenthPresetContent.OscB2Wave != Sylenth1Preset.OSCWAVE.OSC_Noise) {
							zebra2Preset.OSC4_WNum = ConvertSylenthWaveToZebra(sylenthPresetContent.OscB2Wave, sylenthPresetContent.OscB2Invert);
							zebra2Preset.OSC4_Vol = ConvertSylenthValueToZebra(sylenthPresetContent.OscB2Volume, 0, 10, 0, 200);

							// cannot let the volume be 0?!
							if (zebra2Preset.OSC4_Vol == 0) zebra2Preset.OSC4_Vol = 100;

							// turn the volume on Noise2 down
							zebra2Preset.Noise2_Vol = 0;
						} else {
							// turn the volume on OSC1 all the way down
							zebra2Preset.OSC4_Vol = 0;
							
							// turn the volume on Noise2 up
							zebra2Preset.Noise2_Vol = ConvertSylenthValueToZebra(sylenthPresetContent.OscB2Volume, 0, 10, 0, 200);
							zebra2Preset.Noise2_PolW = ConvertSylenthValueToZebra(sylenthPresetContent.OscB2Stereo, 0, 10, 0, 100);
							zebra2Preset.Noise2_Pan = ConvertSylenthValueToZebra(sylenthPresetContent.OscB2Pan, -10, 10, -100, 100);
						}
						zebra2Preset.OSC4_Tune = ConvertSylenthTuneToZebra(sylenthPresetContent.OscB2Octave, sylenthPresetContent.OscB2Note, sylenthPresetContent.OscB2Fine);
						zebra2Preset.OSC4_Poly = ConvertSylenthVoicesToZebra(sylenthPresetContent.OscB2Voices);
						zebra2Preset.OSC4_Dtun = ConvertSylenthDetuneToZebra(sylenthPresetContent.OscB2Detune);
						zebra2Preset.OSC4_Pan = ConvertSylenthValueToZebra(sylenthPresetContent.OscB2Pan, -10, 10, -100, 100);
						zebra2Preset.OSC4_PolW = ConvertSylenthValueToZebra(sylenthPresetContent.OscB2Stereo, 0, 10, 0, 100);
						zebra2Preset.OSC4_RePhs = (sylenthPresetContent.OscB2Retrig == Sylenth1Preset.ONOFF.On ? 1 : 0);
						zebra2Preset.OSC4_Phse = ConvertSylenthValueToZebra(sylenthPresetContent.OscB2Phase, 0, 360, 0, 100);
					} else {
						// set volume to zero?
						zebra2Preset.OSC4_Vol = 0;
					}
					#endregion

					#region Filters
					// The filter control knob values are added to the knob values of both filter A and B.
					// The frequency scale is logarithmic though, so the cutoff values are added
					// on a logarithmic scale.

					// FilterA
					if (sylenthPresetContent.FilterAType != Sylenth1Preset.FILTERTYPE.Bypass) {
						if (sylenthPresetContent.FilterAInput == Sylenth1Preset.FILTERAINPUT.FILTER_A) {
							zebra2Preset.VCF1_Cut = ConvertSylenthFrequencyToZebra(sylenthPresetContent.FilterACutoff, sylenthPresetContent.FilterCtlCutoff, Sylenth1Preset.FloatToHz.FilterCutoff);
							zebra2Preset.VCF1_Drv = ConvertSylenthValueToZebra(sylenthPresetContent.FilterADrive, 0, 10, 0, 100);
							zebra2Preset.VCF1_Res = ConvertSylenthFrequencyToZebra(sylenthPresetContent.FilterAReso, sylenthPresetContent.FilterCtlReso, Sylenth1Preset.FloatToHz.FilterCutoff);
							zebra2Preset.VCF1_Typ = (int) ConvertSylenthFilterToZebra(sylenthPresetContent.FilterAType, sylenthPresetContent.FilterADB, sylenthPresetContent.FilterCtlWarmDrive);
						} else if (sylenthPresetContent.FilterAInput == Sylenth1Preset.FILTERAINPUT.FILTER_A_B) {
							zebra2Preset.VCF1_Cut = ConvertSylenthFrequencyToZebra(sylenthPresetContent.FilterACutoff, sylenthPresetContent.FilterCtlCutoff, Sylenth1Preset.FloatToHz.FilterCutoff);
							zebra2Preset.VCF1_Drv = ConvertSylenthValueToZebra(sylenthPresetContent.FilterADrive, 0, 10, 0, 100);
							zebra2Preset.VCF1_Res = ConvertSylenthFrequencyToZebra(sylenthPresetContent.FilterAReso, sylenthPresetContent.FilterCtlReso, Sylenth1Preset.FloatToHz.FilterCutoff);
							zebra2Preset.VCF1_Typ = (int) ConvertSylenthFilterToZebra(sylenthPresetContent.FilterAType, sylenthPresetContent.FilterADB, sylenthPresetContent.FilterCtlWarmDrive);
							
							zebra2Preset.VCF2_Cut = ConvertSylenthFrequencyToZebra(sylenthPresetContent.FilterACutoff, sylenthPresetContent.FilterCtlCutoff, Sylenth1Preset.FloatToHz.FilterCutoff);
							zebra2Preset.VCF2_Drv = ConvertSylenthValueToZebra(sylenthPresetContent.FilterADrive, 0, 10, 0, 100);
							zebra2Preset.VCF2_Res = ConvertSylenthFrequencyToZebra(sylenthPresetContent.FilterAReso, sylenthPresetContent.FilterCtlReso, Sylenth1Preset.FloatToHz.FilterCutoff);
							zebra2Preset.VCF2_Typ = (int) ConvertSylenthFilterToZebra(sylenthPresetContent.FilterAType, sylenthPresetContent.FilterADB, sylenthPresetContent.FilterCtlWarmDrive);
						}
					}

					// FilterB
					if (sylenthPresetContent.FilterBType != Sylenth1Preset.FILTERTYPE.Bypass) {
						if (sylenthPresetContent.FilterBInput == Sylenth1Preset.FILTERBINPUT.FILTER_B) {
							zebra2Preset.VCF2_Cut = ConvertSylenthFrequencyToZebra(sylenthPresetContent.FilterBCutoff, sylenthPresetContent.FilterCtlCutoff, Sylenth1Preset.FloatToHz.FilterCutoff);
							zebra2Preset.VCF2_Drv = ConvertSylenthValueToZebra(sylenthPresetContent.FilterBDrive, 0, 10, 0, 100);
							zebra2Preset.VCF2_Res = ConvertSylenthFrequencyToZebra(sylenthPresetContent.FilterBReso, sylenthPresetContent.FilterCtlReso, Sylenth1Preset.FloatToHz.FilterCutoff);
							zebra2Preset.VCF2_Typ = (int) ConvertSylenthFilterToZebra(sylenthPresetContent.FilterBType, sylenthPresetContent.FilterBDB, sylenthPresetContent.FilterCtlWarmDrive);
						} else if (sylenthPresetContent.FilterBInput == Sylenth1Preset.FILTERBINPUT.FILTER_B_A) {
							zebra2Preset.VCF2_Cut = ConvertSylenthFrequencyToZebra(sylenthPresetContent.FilterBCutoff, sylenthPresetContent.FilterCtlCutoff, Sylenth1Preset.FloatToHz.FilterCutoff);
							zebra2Preset.VCF2_Drv = ConvertSylenthValueToZebra(sylenthPresetContent.FilterBDrive, 0, 10, 0, 100);
							zebra2Preset.VCF2_Res = ConvertSylenthFrequencyToZebra(sylenthPresetContent.FilterBReso, sylenthPresetContent.FilterCtlReso, Sylenth1Preset.FloatToHz.FilterCutoff);
							zebra2Preset.VCF2_Typ = (int) ConvertSylenthFilterToZebra(sylenthPresetContent.FilterBType, sylenthPresetContent.FilterBDB, sylenthPresetContent.FilterCtlWarmDrive);

							zebra2Preset.VCF1_Cut = ConvertSylenthFrequencyToZebra(sylenthPresetContent.FilterBCutoff, sylenthPresetContent.FilterCtlCutoff, Sylenth1Preset.FloatToHz.FilterCutoff);
							zebra2Preset.VCF1_Drv = ConvertSylenthValueToZebra(sylenthPresetContent.FilterBDrive, 0, 10, 0, 100);
							zebra2Preset.VCF1_Res = ConvertSylenthFrequencyToZebra(sylenthPresetContent.FilterBReso, sylenthPresetContent.FilterCtlReso, Sylenth1Preset.FloatToHz.FilterCutoff);
							zebra2Preset.VCF1_Typ = (int) ConvertSylenthFilterToZebra(sylenthPresetContent.FilterBType, sylenthPresetContent.FilterBDB, sylenthPresetContent.FilterCtlWarmDrive);
						}
					}
					#endregion
					
					#region LFOs
					// LFO1 is used for something
					if (sylenthPresetContent.YModLFO1Dest1 != Sylenth1Preset.YMODDEST.None || sylenthPresetContent.YModLFO1Dest2 != Sylenth1Preset.YMODDEST.None ) {
						SetZebraLFOFromSylenth(zebra2Preset, sylenthPresetContent.LFO1Wave, sylenthPresetContent.LFO1Free, sylenthPresetContent.LFO1Rate, sylenthPresetContent.LFO1Gain,
						                       "LFO1_Wave",
						                       "LFO1_Sync",
						                       "LFO1_Rate",
						                       "LFO1_Trig",
						                       "LFO1_Phse",
						                       "LFO1_Amp",
						                       "LFO1_Slew");
					}

					// LFO2 is used for something
					if (sylenthPresetContent.YModLFO2Dest1 != Sylenth1Preset.YMODDEST.None || sylenthPresetContent.YModLFO2Dest2 != Sylenth1Preset.YMODDEST.None ) {
						SetZebraLFOFromSylenth(zebra2Preset, sylenthPresetContent.LFO2Wave, sylenthPresetContent.LFO2Free, sylenthPresetContent.LFO2Rate, sylenthPresetContent.LFO2Gain,
						                       "LFO2_Wave",
						                       "LFO2_Sync",
						                       "LFO2_Rate",
						                       "LFO2_Trig",
						                       "LFO2_Phse",
						                       "LFO2_Amp",
						                       "LFO2_Slew");
					}
					#endregion
					
					#region Effects
					
					#region Arpeggiator
					if (sylenthPresetContent.XSwArpOnOff == Sylenth1Preset.ONOFF.On) {
						
						// Set correct voice mode
						zebra2Preset.VCC_Mode = (int) Zebra2Preset.VoiceMode.arpeggiator;

						// ArpSync (0=1:64, 1=1:32, 2=1:16, 3=1:8, 4=1:4, 5=1:2, 6=1:1, 7=1:32 dot, 8=1:16 dot, 9=1:8 dot, 10=1:4 dot, 11=1:2 dot, 12=1:16 trip, 13=1:8 trip, 14=1:4 trip, 15=1:2 trip, 16=1:1 trip)
						zebra2Preset.VCC_ArSc = ConvertSylenthArpSyncTimingsToZebra(sylenthPresetContent.ArpTime);
						
						// ArpOrder (0 = By Note, 1 = As Played)
						zebra2Preset.VCC_ArOrd = (int) Zebra2Preset.ArpOrder.By_Note;
						
						// ArpLoop (0 = Forward F-->, 1 = Backward B <--, 2 = ForwardBackward FB <->, 3 = BackwardForward BF >-<)
						switch (sylenthPresetContent.ArpMode) {
							case Sylenth1Preset.ARPMODE.Up:
							case Sylenth1Preset.ARPMODE.Chord:
							case Sylenth1Preset.ARPMODE.Random:
							case Sylenth1Preset.ARPMODE.Ordered:
							case Sylenth1Preset.ARPMODE.Step:
								zebra2Preset.VCC_ArLp = (int) Zebra2Preset.ArpLoop.Forward;
								break;
							case Sylenth1Preset.ARPMODE.Down:
								zebra2Preset.VCC_ArLp = (int) Zebra2Preset.ArpLoop.Backward;
								break;
							case Sylenth1Preset.ARPMODE.Up_Down:
							case Sylenth1Preset.ARPMODE.Up_Down2:
								zebra2Preset.VCC_ArLp = (int) Zebra2Preset.ArpLoop.ForwardBackward;
								break;
							case Sylenth1Preset.ARPMODE.Down_Up:
							case Sylenth1Preset.ARPMODE.Down_Up2:
								zebra2Preset.VCC_ArLp = (int) Zebra2Preset.ArpLoop.BackwardForward;
								break;
						}

						// ArpOctave (0, 1, 2)
						switch (sylenthPresetContent.ArpOctave) {
							case Sylenth1Preset.ARPOCTAVE.OCTAVE_1:
								zebra2Preset.VCC_ArOct = 0;
								break;
							case Sylenth1Preset.ARPOCTAVE.OCTAVE_2:
								zebra2Preset.VCC_ArOct = 1;
								break;
							case Sylenth1Preset.ARPOCTAVE.OCTAVE_3:
							case Sylenth1Preset.ARPOCTAVE.OCTAVE_4:
								zebra2Preset.VCC_ArOct = 2;
								break;
						}

						// ArpLoopLength (1 - 16)
						switch (sylenthPresetContent.ArpWrap) {
							case Sylenth1Preset.ARPWRAP.WRAP_0:
								zebra2Preset.VCC_ArLL = 16;
								break;
							case Sylenth1Preset.ARPWRAP.WRAP_1:
								zebra2Preset.VCC_ArLL = 1;
								break;
							case Sylenth1Preset.ARPWRAP.WRAP_2:
								zebra2Preset.VCC_ArLL = 2;
								break;
							case Sylenth1Preset.ARPWRAP.WRAP_3:
								zebra2Preset.VCC_ArLL = 3;
								break;
							case Sylenth1Preset.ARPWRAP.WRAP_4:
								zebra2Preset.VCC_ArLL = 4;
								break;
							case Sylenth1Preset.ARPWRAP.WRAP_5:
								zebra2Preset.VCC_ArLL = 5;
								break;
							case Sylenth1Preset.ARPWRAP.WRAP_6:
								zebra2Preset.VCC_ArLL = 6;
								break;
							case Sylenth1Preset.ARPWRAP.WRAP_7:
								zebra2Preset.VCC_ArLL = 7;
								break;
							case Sylenth1Preset.ARPWRAP.WRAP_8:
								zebra2Preset.VCC_ArLL = 8;
								break;
							case Sylenth1Preset.ARPWRAP.WRAP_9:
								zebra2Preset.VCC_ArLL = 9;
								break;
							case Sylenth1Preset.ARPWRAP.WRAP_10:
								zebra2Preset.VCC_ArLL = 10;
								break;
							case Sylenth1Preset.ARPWRAP.WRAP_11:
								zebra2Preset.VCC_ArLL = 11;
								break;
							case Sylenth1Preset.ARPWRAP.WRAP_12:
								zebra2Preset.VCC_ArLL = 12;
								break;
							case Sylenth1Preset.ARPWRAP.WRAP_13:
								zebra2Preset.VCC_ArLL = 13;
								break;
							case Sylenth1Preset.ARPWRAP.WRAP_14:
								zebra2Preset.VCC_ArLL = 14;
								break;
							case Sylenth1Preset.ARPWRAP.WRAP_15:
								zebra2Preset.VCC_ArLL = 15;
								break;
							case Sylenth1Preset.ARPWRAP.WRAP_16:
								zebra2Preset.VCC_ArLL = 16;
								break;
						}
						
						// ArpPortamento ( 0 = Off, 1 = On)
						zebra2Preset.VCC_ArTr = (int) Zebra2Preset.ArpPortamento.On;
						
						// Set each of the 16 arp notes
						SetZebraArpeggiatorNoteFromSylenth(zebra2Preset, sylenthPresetContent.ArpGate, sylenthPresetContent.XArpHold01, sylenthPresetContent.XArpTransp01, sylenthPresetContent.XArpVelo01, 1);
						SetZebraArpeggiatorNoteFromSylenth(zebra2Preset, sylenthPresetContent.ArpGate, sylenthPresetContent.XArpHold02, sylenthPresetContent.XArpTransp02, sylenthPresetContent.XArpVelo02, 2);
						SetZebraArpeggiatorNoteFromSylenth(zebra2Preset, sylenthPresetContent.ArpGate, sylenthPresetContent.XArpHold03, sylenthPresetContent.XArpTransp03, sylenthPresetContent.XArpVelo03, 3);
						SetZebraArpeggiatorNoteFromSylenth(zebra2Preset, sylenthPresetContent.ArpGate, sylenthPresetContent.XArpHold04, sylenthPresetContent.XArpTransp04, sylenthPresetContent.XArpVelo04, 4);
						SetZebraArpeggiatorNoteFromSylenth(zebra2Preset, sylenthPresetContent.ArpGate, sylenthPresetContent.XArpHold05, sylenthPresetContent.XArpTransp05, sylenthPresetContent.XArpVelo05, 5);
						SetZebraArpeggiatorNoteFromSylenth(zebra2Preset, sylenthPresetContent.ArpGate, sylenthPresetContent.XArpHold06, sylenthPresetContent.XArpTransp06, sylenthPresetContent.XArpVelo06, 6);
						SetZebraArpeggiatorNoteFromSylenth(zebra2Preset, sylenthPresetContent.ArpGate, sylenthPresetContent.XArpHold07, sylenthPresetContent.XArpTransp07, sylenthPresetContent.XArpVelo07, 7);
						SetZebraArpeggiatorNoteFromSylenth(zebra2Preset, sylenthPresetContent.ArpGate, sylenthPresetContent.XArpHold08, sylenthPresetContent.XArpTransp08, sylenthPresetContent.XArpVelo08, 8);
						SetZebraArpeggiatorNoteFromSylenth(zebra2Preset, sylenthPresetContent.ArpGate, sylenthPresetContent.XArpHold09, sylenthPresetContent.XArpTransp09, sylenthPresetContent.XArpVelo09, 9);
						SetZebraArpeggiatorNoteFromSylenth(zebra2Preset, sylenthPresetContent.ArpGate, sylenthPresetContent.XArpHold10, sylenthPresetContent.XArpTransp10, sylenthPresetContent.XArpVelo10, 10);
						SetZebraArpeggiatorNoteFromSylenth(zebra2Preset, sylenthPresetContent.ArpGate, sylenthPresetContent.XArpHold11, sylenthPresetContent.XArpTransp11, sylenthPresetContent.XArpVelo11, 11);
						SetZebraArpeggiatorNoteFromSylenth(zebra2Preset, sylenthPresetContent.ArpGate, sylenthPresetContent.XArpHold12, sylenthPresetContent.XArpTransp12, sylenthPresetContent.XArpVelo12, 12);
						SetZebraArpeggiatorNoteFromSylenth(zebra2Preset, sylenthPresetContent.ArpGate, sylenthPresetContent.XArpHold13, sylenthPresetContent.XArpTransp13, sylenthPresetContent.XArpVelo13, 13);
						SetZebraArpeggiatorNoteFromSylenth(zebra2Preset, sylenthPresetContent.ArpGate, sylenthPresetContent.XArpHold14, sylenthPresetContent.XArpTransp14, sylenthPresetContent.XArpVelo14, 14);
						SetZebraArpeggiatorNoteFromSylenth(zebra2Preset, sylenthPresetContent.ArpGate, sylenthPresetContent.XArpHold15, sylenthPresetContent.XArpTransp15, sylenthPresetContent.XArpVelo15, 15);
						SetZebraArpeggiatorNoteFromSylenth(zebra2Preset, sylenthPresetContent.ArpGate, sylenthPresetContent.XArpHold16, sylenthPresetContent.XArpTransp16, sylenthPresetContent.XArpVelo16, 16);
					}
					#endregion
					
					#region Distortion = Distortion 3
					if (sylenthPresetContent.XSwDistOnOff == Sylenth1Preset.ONOFF.On) {
						// get how hard to distort
						float distortionAmount = ConvertSylenthValueToZebra(sylenthPresetContent.DistortAmount, 0, 10, -12, 48);
						
						// regulate using the dry / wet percentage
						float distortDryWet = ConvertSylenthValueToZebra(sylenthPresetContent.DistortDryWet, 0, 10, 0, 100);
						
						zebra2Preset.Dist3_Input = distortionAmount * distortDryWet / 100;
						zebra2Preset.Dist3_Output = 5;
						
						zebra2Preset.Dist3_PreTilt = 0.00f;			// Pre Tilt
						zebra2Preset.Dist3_PstTilt = 0.00f;			// Post Tilt
						zebra2Preset.Dist3_CntFreq = 100.00f;		// Center Freq
						zebra2Preset.Dist3_Low = 0.00f;				// Low
						zebra2Preset.Dist3_High = 18.00f;			// High
						zebra2Preset.Dist3_PostFlt = (int) Zebra2Preset.DistortionPostFilter.DualBandShelf;	// Post Filter=Dual-Band Shelf
						
						switch(sylenthPresetContent.DistortType) {
							case Sylenth1Preset.DISTORTTYPE.OverDrv:
								zebra2Preset.Dist3_Type = (int) Zebra2Preset.DistortionType.TubeClassAB;
								
								// increase output when using overdrive
								zebra2Preset.Dist3_Output = 10;
								break;
							case Sylenth1Preset.DISTORTTYPE.Clip:
								zebra2Preset.Dist3_Type = (int) Zebra2Preset.DistortionType.HardClip;
								break;
							case Sylenth1Preset.DISTORTTYPE.Decimate:
								zebra2Preset.Dist3_Type = (int) Zebra2Preset.DistortionType.Rectify;
								
								// increase output when using decimate
								zebra2Preset.Dist3_Output = 20;
								
								// and reduce highs
								zebra2Preset.Dist3_High = 0.00f;
								break;
							case Sylenth1Preset.DISTORTTYPE.BitCrush:
								zebra2Preset.Dist3_Type = (int)Zebra2Preset.DistortionType.Rectify;
								
								// increase output when using bitcrush
								zebra2Preset.Dist3_Output = 20;
								
								// and reduce highs
								zebra2Preset.Dist3_High = 0.00f;
								break;
							case Sylenth1Preset.DISTORTTYPE.FoldBack:
								zebra2Preset.Dist3_Type = (int) Zebra2Preset.DistortionType.Foldback;
								break;
						}
					} else {
						// set everything to zero?
						zebra2Preset.Shape3_Type = (int) Zebra2Preset.DistortionType.TubeClassA; // Type (Type=0)
						zebra2Preset.Dist3_Input = 0;
						zebra2Preset.Dist3_Output = 0;
						
						zebra2Preset.Dist3_PreTilt = 0.00f;			// Pre Tilt
						zebra2Preset.Dist3_PstTilt = 0.00f;			// Post Tilt
						zebra2Preset.Dist3_CntFreq = 100.00f;		// Center Freq
						zebra2Preset.Dist3_Low = 0.00f;				// Low
						zebra2Preset.Dist3_High = 0.00f;			// High
						zebra2Preset.Dist3_PostFlt = (int) Zebra2Preset.DistortionPostFilter.DualBandShelf;	// Post Filter=Dual-Band Shelf
					}
					#endregion
					
					#region Phaser
					if (sylenthPresetContent.XSwPhaserOnOff == Sylenth1Preset.ONOFF.On) {
						// Mode Phaser: classic phaser unit
						zebra2Preset.ModFX1_Mode = (int) Zebra2Preset.ModFXType.Phaser;
						// Center, Nominal delay time / allpass cutoff, i.e. before modulation.
						zebra2Preset.ModFX1_Cent = ConvertSylenthValueToZebra(sylenthPresetContent.PhaserCenterFreq, 0, 10, 0, 100);
						// Speed, The rate of the ModFX module’s own LFO (from 0.001Hz to 1Hz).
						zebra2Preset.ModFX1_Sped = ConvertSylenthValueToZebra(sylenthPresetContent.PhaserLFORate, 0, 10, 0, 100);
						// Depth, Amount of LFO modulation.
						zebra2Preset.ModFX1_Dpth = ConvertSylenthValueToZebra(sylenthPresetContent.PhaserLFOGain, 0, 10, 0, 100);
						// Feedbk, Bipolar feedback control for ‘flanger’ type resonances – especially at extreme values.
						zebra2Preset.ModFX2_FeeB = ConvertSylenthValueToZebra(sylenthPresetContent.PhaserLFOGain, 0, 100, -100, 100);
						// Mix, Balance between dry and wet signal.
						zebra2Preset.ModFX1_Mix = ConvertSylenthValueToZebra(sylenthPresetContent.PhaserDry_Wet, 0, 100, 0, 100);
						// Stereo, LFO phase offset between the two stereo channels. Note that 50% is often more ‘stereo’ than 100%.
						zebra2Preset.ModFX1_PhOff = ConvertSylenthValueToZebra(sylenthPresetContent.PhaserSpread, 0, 10, 0, 100);
						// Quad, The volume of an additional chorus effect, with independant LFO.
						zebra2Preset.ModFX1_Quad = 0.00f;			// Quad
						// Q-Phase, Modulation LFO phase offset (see Stereo above) for the Quad effect.
						zebra2Preset.ModFX1_Qphs = 25.00f;			// QuadPhase
						
						// Equalizer
						// This unique feature can e.g. preserve the stereo image of bass frequencies via low cut,
						// while at the same time making the chorus effect sound less harsh via high cut.
						// EQ: switches ModFX equalization on/off
						// LowFreq: low crossover frequency
						// HiFreq: high crossover frequency
						// Boost: cut/boost controls for the two frequencie ranges
						zebra2Preset.ModFX1_LCut = 0.00f;			// LowCut Freq
						zebra2Preset.ModFX1_Leq = 0.00f;			// Low Boost dB
						zebra2Preset.ModFX1_HCut = 100.00f;			// HiCut Freq
						zebra2Preset.ModFX1_Heq = 0.00f;			// High Boost dB
						zebra2Preset.ModFX1_Q1 = 0.00f;				// Q1
						zebra2Preset.ModFX1_Q2 = 0.00f;				// Q2
						zebra2Preset.ModFX1_EQon = 1;				// EQ
					} else {
						zebra2Preset.ModFX1_Mode = (int) Zebra2Preset.ModFXType.Phaser;	// Mode=Chorus
						zebra2Preset.ModFX1_Cent = 20.00f;			// Center
						zebra2Preset.ModFX1_Sped = 50.00f;			// Speed
						zebra2Preset.ModFX1_PhOff = 50.00f;			// Stereo
						zebra2Preset.ModFX1_Dpth = 50.00f;			// Depth
						zebra2Preset.ModFX1_FeeB = 0.00f;			// Feedback
						zebra2Preset.ModFX1_Mix = 0.00f;			// Mix
						zebra2Preset.ModFX1_Quad = 0.00f;			// Quad
						zebra2Preset.ModFX1_Qphs = 25.00f;			// QuadPhase
						zebra2Preset.ModFX1_LCut = 0.00f;			// LowCut Freq
						zebra2Preset.ModFX1_Leq = 0.00f;			// Low Boost dB
						zebra2Preset.ModFX1_HCut = 100.00f;			// HiCut Freq
						zebra2Preset.ModFX1_Heq = 0.00f;			// High Boost dB
						zebra2Preset.ModFX1_Q1 = 0.00f;				// Q1
						zebra2Preset.ModFX1_Q2 = 0.00f;				// Q2
						zebra2Preset.ModFX1_EQon = 1;				// EQ
					}
					#endregion
					
					#region Chorus
					if (sylenthPresetContent.XSwChorusOnOff == Sylenth1Preset.ONOFF.On) {
						// Mode Chorus: chorus / flanger using short delay lines
						zebra2Preset.ModFX2_Mode = (int) Zebra2Preset.ModFXType.Chorus;
						// Center, Nominal delay time / allpass cutoff, i.e. before modulation.
						zebra2Preset.ModFX2_Cent = ConvertSylenthValueToZebra(sylenthPresetContent.ChorusDelay, 1, 40, 0, 100);
						// Speed, The rate of the ModFX module’s own LFO (from 0.001Hz to 1Hz).
						zebra2Preset.ModFX2_Sped = ConvertSylenthValueToZebra(sylenthPresetContent.ChorusRate, 0.01f, 27.5f, 0, 100);
						// Stereo, LFO phase offset between the two stereo channels. Note that 50% is often more ‘stereo’ than 100%.
						zebra2Preset.ModFX2_PhOff = ConvertSylenthValueToZebra(sylenthPresetContent.ChorusWidth, 0, 100, 0, 100); // Stereo
						// Depth, Amount of LFO modulation.
						zebra2Preset.ModFX2_Dpth = ConvertSylenthValueToZebra(sylenthPresetContent.ChorusDepth, 0, 100, 0, 100);
						// Feedbk, Bipolar feedback control for ‘flanger’ type resonances – especially at extreme values.
						zebra2Preset.ModFX2_FeeB = ConvertSylenthValueToZebra(sylenthPresetContent.ChorusFeedback, 0, 100, 0, 100);
						// Mix, Balance between dry and wet signal.
						zebra2Preset.ModFX2_Mix = ConvertSylenthValueToZebra(sylenthPresetContent.ChorusDry_Wet, 0, 100, 0, 100);
						// Quad, The volume of an additional chorus effect, with independant LFO.
						if (sylenthPresetContent.ChorusMode == Sylenth1Preset.CHORUSMODE.Dual) {
							zebra2Preset.ModFX2_Quad = 100.00f;			// Quad
						} else {
							zebra2Preset.ModFX2_Quad = 0.00f;			// Quad
						}
						// Q-Phase, Modulation LFO phase offset (see Stereo above) for the Quad effect.
						zebra2Preset.ModFX2_Qphs = 25.00f;			// QuadPhase
						// Equalizer
						// This unique feature can e.g. preserve the stereo image of bass frequencies via low cut,
						// while at the same time making the chorus effect sound less harsh via high cut.
						// EQ: switches ModFX equalization on/off
						// LowFreq: low crossover frequency
						// HiFreq: high crossover frequency
						// Boost: cut/boost controls for the two frequencie ranges
						zebra2Preset.ModFX2_LCut = 0.00f;			// LowCut Freq
						zebra2Preset.ModFX2_Leq = 0.00f;			// Low Boost dB
						zebra2Preset.ModFX2_HCut = 100.00f;			// HiCut Freq
						zebra2Preset.ModFX2_Heq = 0.00f;			// High Boost dB
						zebra2Preset.ModFX2_Q1 = 0.00f;				// Q1
						zebra2Preset.ModFX2_Q2 = 0.00f;				// Q2
						zebra2Preset.ModFX2_EQon = 1;				// EQ
					} else {
						zebra2Preset.ModFX2_Mode = (int) Zebra2Preset.ModFXType.Chorus;	// Mode=Chorus
						zebra2Preset.ModFX2_Cent = 20.00f;			// Center
						zebra2Preset.ModFX2_Sped = 50.00f;			// Speed
						zebra2Preset.ModFX2_PhOff = 50.00f;			// Stereo
						zebra2Preset.ModFX2_Dpth = 50.00f;			// Depth
						zebra2Preset.ModFX2_FeeB = 0.00f;			// Feedback
						zebra2Preset.ModFX2_Mix = 0.00f;			// Mix
						zebra2Preset.ModFX2_Quad = 0.00f;			// Quad
						zebra2Preset.ModFX2_Qphs = 25.00f;			// QuadPhase
						zebra2Preset.ModFX2_LCut = 0.00f;			// LowCut Freq
						zebra2Preset.ModFX2_Leq = 0.00f;			// Low Boost dB
						zebra2Preset.ModFX2_HCut = 100.00f;			// HiCut Freq
						zebra2Preset.ModFX2_Heq = 0.00f;			// High Boost dB
						zebra2Preset.ModFX2_Q1 = 0.00f;				// Q1
						zebra2Preset.ModFX2_Q2 = 0.00f;				// Q2
						zebra2Preset.ModFX2_EQon = 1;				// EQ
					}
					#endregion
					
					#region Equaliser on MasterBus
					if (sylenthPresetContent.XSwEQOnOff == Sylenth1Preset.ONOFF.On) {
						float eqBassFreq = Sylenth1Preset.ValueToHz(sylenthPresetContent.EQBassFreq, Sylenth1Preset.FloatToHz.EQBassFreq); // 13.75f, 880.0f
						float eqTrebleFreq = Sylenth1Preset.ValueToHz(sylenthPresetContent.EQTrebleFreq, Sylenth1Preset.FloatToHz.EQTrebleFreq); // 440, 28160
						// the Sylenth eq only works upwards even though zebra has the range -24 -> 24
						zebra2Preset.EQ1_Fc1 = Zebra2Preset.EqualiserHzToFreqValue(eqBassFreq);
						zebra2Preset.EQ1_Gain1 = ConvertSylenthValueToZebra(sylenthPresetContent.EQBass, 0, 15, 0, 15);
						zebra2Preset.EQ1_Res1 = 25.00f;
						zebra2Preset.EQ1_Fc4 = Zebra2Preset.EqualiserHzToFreqValue(eqTrebleFreq);
						zebra2Preset.EQ1_Gain4 = ConvertSylenthValueToZebra(sylenthPresetContent.EQTreble, 0, 15, 0, 15);
						zebra2Preset.EQ1_Res4 = 25.00f;
					} else {
						zebra2Preset.EQ1_Fc1 = 20.00f;               // Freq LowShelf (fc1=20.00)
						zebra2Preset.EQ1_Res1 = 25.00f;              // Q LowShelf (res1=25.00)
						zebra2Preset.EQ1_Gain1 = 00.00f;             // Gain LowShelf (gain1=0.00)
						zebra2Preset.EQ1_Fc2 = 40.00f;               // Freq Mid1 (fc2=40.00)
						zebra2Preset.EQ1_Res2 = 25.00f;              // Q Mid1 (res2=25.00)
						zebra2Preset.EQ1_Gain2 = 00.00f;             // Gain Mid1 (gain2=0.00)
						zebra2Preset.EQ1_Fc3 = 60.00f;               // Freq Mid2 (fc3=60.00)
						zebra2Preset.EQ1_Res3 = 25.00f;              // Q Mid2 (res3=25.00)
						zebra2Preset.EQ1_Gain3 = 00.00f;             // Gain Mid2 (gain3=0.00)
						zebra2Preset.EQ1_Fc4 = 80.00f;               // Freq HiShelf (fc4=80.00)
						zebra2Preset.EQ1_Res4 = 25.00f;              // Q HiShelf (res4=25.00)
						zebra2Preset.EQ1_Gain4 = 00.00f;             // Gain HiShelf (gain4=0.00)
					}
					#endregion
					
					#region Delay
					if (sylenthPresetContent.XSwDelayOnOff == Sylenth1Preset.ONOFF.On) {

						zebra2Preset.Delay1_Mix = ConvertSylenthValueToZebra(sylenthPresetContent.DelayDry_Wet, 0, 100, 0, 50); // the range is 0, 100, but using 0 - x i get a more correct volume
						
						// Feedback
						//zebra2Preset.Delay1_FB = ConvertSylenthValueToZebra(Content.DelayFeedback, 0, 100, 0, 50);
						zebra2Preset.Delay1_CB = ConvertSylenthValueToZebra(sylenthPresetContent.DelayFeedback, 0, 100, 0, 50);
						zebra2Preset.Delay1_FB = 0;
						
						// If ping pong, use X-back and serial 2
						if (sylenthPresetContent.DelayPingPong == Sylenth1Preset.ONOFF.On) {
							zebra2Preset.Delay1_Mode = (int) Zebra2Preset.DelayMode.serial_2;
							zebra2Preset.Delay1_CB = 50;
							zebra2Preset.Delay1_FB = 0;
						} else {
							zebra2Preset.Delay1_Mode = (int) Zebra2Preset.DelayMode.stereo_2;
						}
						
						// high pass == low cut and low pass == high cut
						// these does not work since zebra delay freq has a range of 0 - 100 not 0 - 150 like the rest ?
						// ConvertSylenthFrequencyToZebra(Content.DelayLowCut, Sylenth1Preset.FloatToHz.DelayLowCut);
						// ConvertSylenthFrequencyToZebra(Content.DelayHighCut, Sylenth1Preset.FloatToHz.DelayHighCut);
						zebra2Preset.Delay1_HP = 0;
						zebra2Preset.Delay1_LP = 60; // 35 - 60 sounds more like the default sylenth delay settings
						
						zebra2Preset.Delay1_Sync1 = ConvertSylenthDelayTimingsToZebra(sylenthPresetContent.DelayTimeLeft);
						zebra2Preset.Delay1_Pan1 = -80;
						zebra2Preset.Delay1_Sync2 = ConvertSylenthDelayTimingsToZebra(sylenthPresetContent.DelayTimeRight);
						zebra2Preset.Delay1_Pan2 = 80;
					} else {
						// set volume to zero?
						zebra2Preset.Delay1_Mix = 0;
					}
					#endregion

					#region Reverb
					if (sylenthPresetContent.XSwReverbOnOff == Sylenth1Preset.ONOFF.On) {
						zebra2Preset.Rev1_Damp = ConvertSylenthValueToZebra(sylenthPresetContent.ReverbDamp, 0, 10, 0, 100);
						
						// sylenth dry/wet slider makes up two zebra2 sliders (dry and wet)
						zebra2Preset.Rev1_Dry = 80;
						// reduce the range to limit wetness (80 is better than 100)
						zebra2Preset.Rev1_Wet = ConvertSylenthValueToZebra(sylenthPresetContent.ReverbDry_Wet, 0, 100, 0, 80);
						
						// sylenth stores the predelay in ms (0 - 200)
						zebra2Preset.Rev1_Pre = ConvertSylenthValueToZebra(sylenthPresetContent.ReverbPredelay, 0, 200, 0, 100);
						
						zebra2Preset.Rev1_Size = ConvertSylenthValueToZebra(sylenthPresetContent.ReverbSize, 0, 10, 0, 100);
					} else {
						// set volume to zero?
						zebra2Preset.Rev1_Wet = 0;
						zebra2Preset.Rev1_Dry = 100;
					}
					#endregion
					
					#region Compression
					if (sylenthPresetContent.XSwCompOnOff == Sylenth1Preset.ONOFF.On) {
						zebra2Preset.Comp1_Att = ConvertSylenthValueToZebra(sylenthPresetContent.CompAttack, 0.1f, 300, 0, 100);
						zebra2Preset.Comp1_Rel = ConvertSylenthValueToZebra(sylenthPresetContent.CompRelease, 1, 500, 0, 100);
						zebra2Preset.Comp1_Thres = ConvertSylenthValueToZebra(sylenthPresetContent.CompThreshold, -30, 0, -96, 0);
						zebra2Preset.Comp1_Rat = MathUtils.ConvertAndMainainRatio(sylenthPresetContent.CompRatio, 0, 1, 0, 100);
					}
					#endregion
					#endregion
					
					#region Envelopes
					const float envelopeMin = 0;
					const float envelopeMax = 120;
					// Set correct Envelope Slope (v-slope)
					const int envelopeMode = (int) Zebra2Preset.EnvelopeMode.v_slope;
					const float envelopeSlope = -70.00f;
					// Envelope 1 - Used as Amp Envelope
					SetZebraEnvelopeFromSylenth(zebra2Preset, sylenthPresetContent.AmpEnvAAttack, "ENV1_TBase", "ENV1_Atk");
					SetZebraEnvelopeFromSylenth(zebra2Preset, sylenthPresetContent.AmpEnvADecay, "ENV1_TBase", "ENV1_Dec");
					SetZebraEnvelopeFromSylenth(zebra2Preset, sylenthPresetContent.AmpEnvARelease, "ENV1_TBase", "ENV1_Rel");
					zebra2Preset.ENV1_Sus = ConvertSylenthValueToZebra(sylenthPresetContent.AmpEnvASustain, 0, 10, envelopeMin, envelopeMax);
					zebra2Preset.ENV1_Vel = 70;
					zebra2Preset.ENV1_Mode = envelopeMode;
					zebra2Preset.ENV1_Slope = envelopeSlope;
					
					// Envelope 2 - Used as Amp Envelope
					SetZebraEnvelopeFromSylenth(zebra2Preset, sylenthPresetContent.AmpEnvBAttack, "ENV2_TBase", "ENV2_Atk");
					SetZebraEnvelopeFromSylenth(zebra2Preset, sylenthPresetContent.AmpEnvBDecay, "ENV2_TBase", "ENV2_Dec");
					SetZebraEnvelopeFromSylenth(zebra2Preset, sylenthPresetContent.AmpEnvBRelease, "ENV2_TBase", "ENV2_Rel");
					zebra2Preset.ENV2_Sus = ConvertSylenthValueToZebra(sylenthPresetContent.AmpEnvBSustain, 0, 10, envelopeMin, envelopeMax);
					zebra2Preset.ENV2_Vel = 70;
					zebra2Preset.ENV2_Mode = envelopeMode;
					zebra2Preset.ENV2_Slope = envelopeSlope;
					
					// Envelope 3 - Used as Mod Envelope
					SetZebraEnvelopeFromSylenth(zebra2Preset, sylenthPresetContent.ModEnv1Attack, "ENV3_TBase", "ENV3_Atk");
					SetZebraEnvelopeFromSylenth(zebra2Preset, sylenthPresetContent.ModEnv1Decay, "ENV3_TBase", "ENV3_Dec");
					SetZebraEnvelopeFromSylenth(zebra2Preset, sylenthPresetContent.ModEnv1Release, "ENV3_TBase", "ENV3_Rel");
					zebra2Preset.ENV3_Sus = ConvertSylenthValueToZebra(sylenthPresetContent.ModEnv1Sustain, 0, 10, envelopeMin, envelopeMax);
					zebra2Preset.ENV3_Vel = 70;
					zebra2Preset.ENV3_Mode = envelopeMode;
					zebra2Preset.ENV3_Slope = envelopeSlope;

					// Envelope 4 - Used as Mod Envelope
					SetZebraEnvelopeFromSylenth(zebra2Preset, sylenthPresetContent.ModEnv2Attack, "ENV4_TBase", "ENV4_Atk");
					SetZebraEnvelopeFromSylenth(zebra2Preset, sylenthPresetContent.ModEnv2Decay, "ENV4_TBase", "ENV4_Dec");
					SetZebraEnvelopeFromSylenth(zebra2Preset, sylenthPresetContent.ModEnv2Release, "ENV4_TBase", "ENV4_Rel");
					zebra2Preset.ENV4_Sus = ConvertSylenthValueToZebra(sylenthPresetContent.ModEnv2Sustain, 0, 10, envelopeMin, envelopeMax);
					zebra2Preset.ENV4_Vel = 70;
					zebra2Preset.ENV4_Mode = envelopeMode;
					zebra2Preset.ENV4_Slope = envelopeSlope;
					#endregion
					
					#region Modulation
					
					// keep track of the modulation sources that already has been processed
					var processedModulationSourceAndDest = new Dictionary<string, List<string>>();
					
					// See if the mod envelopes are used
					SetZebraModSourcesFromSylenth(sylenthPresetContent, zebra2Preset, Sylenth1Preset.XMODSOURCE.SOURCE_ModEnv_1, sylenthPresetContent.YModEnv1Dest1, sylenthPresetContent.XModEnv1Dest1Am, processedModulationSourceAndDest);
					SetZebraModSourcesFromSylenth(sylenthPresetContent, zebra2Preset, Sylenth1Preset.XMODSOURCE.SOURCE_ModEnv_1, sylenthPresetContent.YModEnv1Dest2, sylenthPresetContent.XModEnv1Dest2Am, processedModulationSourceAndDest);
					SetZebraModSourcesFromSylenth(sylenthPresetContent, zebra2Preset, Sylenth1Preset.XMODSOURCE.SOURCE_ModEnv_2, sylenthPresetContent.YModEnv2Dest1, sylenthPresetContent.XModEnv2Dest1Am, processedModulationSourceAndDest);
					SetZebraModSourcesFromSylenth(sylenthPresetContent, zebra2Preset, Sylenth1Preset.XMODSOURCE.SOURCE_ModEnv_2, sylenthPresetContent.YModEnv2Dest2, sylenthPresetContent.XModEnv2Dest2Am, processedModulationSourceAndDest);

					// See if the LFOs are used
					SetZebraModSourcesFromSylenth(sylenthPresetContent, zebra2Preset, Sylenth1Preset.XMODSOURCE.SOURCE_LFO_1, sylenthPresetContent.YModLFO1Dest1, sylenthPresetContent.XModLFO1Dest1Am, processedModulationSourceAndDest);
					SetZebraModSourcesFromSylenth(sylenthPresetContent, zebra2Preset, Sylenth1Preset.XMODSOURCE.SOURCE_LFO_1, sylenthPresetContent.YModLFO1Dest2, sylenthPresetContent.XModLFO1Dest2Am, processedModulationSourceAndDest);
					SetZebraModSourcesFromSylenth(sylenthPresetContent, zebra2Preset, Sylenth1Preset.XMODSOURCE.SOURCE_LFO_2, sylenthPresetContent.YModLFO2Dest1, sylenthPresetContent.XModLFO2Dest1Am, processedModulationSourceAndDest);
					SetZebraModSourcesFromSylenth(sylenthPresetContent, zebra2Preset, Sylenth1Preset.XMODSOURCE.SOURCE_LFO_2, sylenthPresetContent.YModLFO2Dest2, sylenthPresetContent.XModLFO2Dest2Am, processedModulationSourceAndDest);

					// Set the matrix slots
					SetZebraModSourcesFromSylenth(sylenthPresetContent, zebra2Preset, sylenthPresetContent.XModMisc1ASource, sylenthPresetContent.YModMisc1ADest1, sylenthPresetContent.XModMisc1ADest1Am, processedModulationSourceAndDest);
					SetZebraModSourcesFromSylenth(sylenthPresetContent, zebra2Preset, sylenthPresetContent.XModMisc1ASource, sylenthPresetContent.YModMisc1ADest2, sylenthPresetContent.XModMisc1ADest2Am, processedModulationSourceAndDest);
					SetZebraModSourcesFromSylenth(sylenthPresetContent, zebra2Preset, sylenthPresetContent.XModMisc1BSource, sylenthPresetContent.YModMisc1BDest1, sylenthPresetContent.XModMisc1BDest1Am, processedModulationSourceAndDest);
					SetZebraModSourcesFromSylenth(sylenthPresetContent, zebra2Preset, sylenthPresetContent.XModMisc1BSource, sylenthPresetContent.YModMisc1BDest2, sylenthPresetContent.XModMisc1BDest2Am, processedModulationSourceAndDest);
					SetZebraModSourcesFromSylenth(sylenthPresetContent, zebra2Preset, sylenthPresetContent.XModMisc2ASource, sylenthPresetContent.YModMisc2ADest1, sylenthPresetContent.XModMisc2ADest1Am, processedModulationSourceAndDest);
					SetZebraModSourcesFromSylenth(sylenthPresetContent, zebra2Preset, sylenthPresetContent.XModMisc2ASource, sylenthPresetContent.YModMisc2ADest2, sylenthPresetContent.XModMisc2ADest2Am, processedModulationSourceAndDest);
					SetZebraModSourcesFromSylenth(sylenthPresetContent, zebra2Preset, sylenthPresetContent.XModMisc2BSource, sylenthPresetContent.YModMisc2BDest1, sylenthPresetContent.XModMisc2BDest1Am, processedModulationSourceAndDest);
					SetZebraModSourcesFromSylenth(sylenthPresetContent, zebra2Preset, sylenthPresetContent.XModMisc2BSource, sylenthPresetContent.YModMisc2BDest2, sylenthPresetContent.XModMisc2BDest2Am, processedModulationSourceAndDest);
					#endregion
				}
			}
			return zebra2PresetList;
		}
		private void SetZebraModMatrixElementFromSylenth(Zebra2Preset z2, Sylenth1Preset.XMODSOURCE sylenthModSource, Sylenth1Preset.YMODDEST sylenthModDestination,
		                                                 string fieldNamePrefix, int startMatrixSlot, int slotIndex, Object fieldValue,
		                                                 List<string> zebraUsedModMatrixSlots) {
			
			int fieldIndex = startMatrixSlot + slotIndex -1;
			string fieldName = String.Format("{0}{1}", fieldNamePrefix,  fieldIndex);
			if (fieldIndex > 12) {
				Console.Out.WriteLine("Warning! Not enough matrix slots available. Discarding matrix slot: {0}={1} !", fieldName, fieldValue);
				Logger.DoDebug(String.Format("Warning! Not enough matrix slots available. Discarding matrix slot: {0}={1} !", fieldName, fieldValue));
				return;
			}
			Logger.DoDebug(String.Format("Setting Zebra2 Mod Matrix Element: {0}->{1} {2}={3}" , sylenthModSource, sylenthModDestination, fieldName, fieldValue));
			ObjectUtils.SetField(z2, fieldName, fieldValue);
			
			// store Zebra mod matrix field information
			zebraUsedModMatrixSlots.Add(fieldName);
		}
		private void SetZebraModMatrixFromSylenth(Sylenth1Preset.Syl1PresetContent s1,
		                                          Zebra2Preset z2,
		                                          Sylenth1Preset.XMODSOURCE sylenthModSource,
		                                          Sylenth1Preset.YMODDEST sylenthModDestination,
		                                          float sylenthXModDestAm,
		                                          IDictionary<string, List<string>> processedModulationSourceAndDest) {

			// check if we have already processed this exact Sylenth1Preset.XMODSOURCE and Sylenth1Preset.YMODDEST
			string currentSylenthModSourceAndDest = String.Format("{0}_{1}", sylenthModSource, sylenthModDestination);
			var zebraUsedModMatrixSlots = new List<string>();
			if (processedModulationSourceAndDest.ContainsKey(currentSylenthModSourceAndDest)) {
				// TODO: Sometimes "double booking" of source and destination is used to increase the effect of a destination
				// so increase the depth ?!
				// example: 4 BASS Fidget from "Adam Van Baker Sylenth1 Soundset Part 2.fxb"
				if ( (s1.YModLFO1Dest1 != Sylenth1Preset.YMODDEST.None && s1.YModLFO1Dest1 == s1.YModLFO1Dest2)
				    || (s1.YModLFO2Dest1 != Sylenth1Preset.YMODDEST.None && s1.YModLFO2Dest1 == s1.YModLFO2Dest2)
				    || (s1.YModEnv1Dest1 != Sylenth1Preset.YMODDEST.None && s1.YModEnv1Dest1 == s1.YModEnv1Dest2)
				    || (s1.YModEnv2Dest1 != Sylenth1Preset.YMODDEST.None && s1.YModEnv2Dest1 == s1.YModEnv2Dest2)
				   ) {
					Logger.DoDebug(String.Format("It seems like two modulation sources are duplicated. Increasing the zebra modulation depth to encompass this."));
					
					List<string> myList = processedModulationSourceAndDest[currentSylenthModSourceAndDest];
					foreach(string fieldName in myList)
					{
						if(fieldName.StartsWith("PCore_MMD"))
						{
							// increase the value
							ObjectUtils.SetField(z2, fieldName, ConvertSylenthValueToZebra(sylenthXModDestAm, -10, 10, 90, 90));
						}
					}
					return;
				} else {
					Logger.DoDebug(String.Format("Sylenth1 Modulation Source has already been set in the Mod Matrix. Skipping! {0}_{1}!", sylenthModSource, sylenthModDestination));
					return;
				}
			} else {
				processedModulationSourceAndDest.Add(currentSylenthModSourceAndDest, zebraUsedModMatrixSlots);
			}
			
			// use the _zebraNextFreeModMatrixSlot to keep track of the slot usage
			if (_zebraNextFreeModMatrixSlot > 12) return;
			
			int zebraNumberOfSlotsUsed = 0;
			if (sylenthModSource != Sylenth1Preset.XMODSOURCE.SOURCE_None && sylenthModDestination != Sylenth1Preset.YMODDEST.None) {
				const string zebraModMatrixDepthPrefix = "PCore_MMD";
				const string zebraModMatrixSourcePrefix = "PCore_MMS";
				const string zebraModMatrixTargetPrefix = "PCore_MMT";
				const string zebraModMatrixViaSourcePrefix = "PCore_MMVS"; // not used
				const string zebraModMatrixViaSourceDepthPrefix = "PCore_MMVD"; // not used

				switch (sylenthModDestination) {
					case Sylenth1Preset.YMODDEST.None:
						// should never get here
						break;
						
						// Oscillators
					case Sylenth1Preset.YMODDEST.Volume_A:
						SetZebraModMatrixElementFromSylenth(z2, sylenthModSource, sylenthModDestination, zebraModMatrixTargetPrefix, _zebraNextFreeModMatrixSlot, 1, "OSC1:Vol", zebraUsedModMatrixSlots);
						SetZebraModMatrixElementFromSylenth(z2, sylenthModSource, sylenthModDestination, zebraModMatrixTargetPrefix, _zebraNextFreeModMatrixSlot, 2, "OSC2:Vol", zebraUsedModMatrixSlots);
						zebraNumberOfSlotsUsed = 2;
						break;
					case Sylenth1Preset.YMODDEST.Volume_B:
						SetZebraModMatrixElementFromSylenth(z2, sylenthModSource, sylenthModDestination, zebraModMatrixTargetPrefix, _zebraNextFreeModMatrixSlot, 1, "OSC3:Vol", zebraUsedModMatrixSlots);
						SetZebraModMatrixElementFromSylenth(z2, sylenthModSource, sylenthModDestination, zebraModMatrixTargetPrefix, _zebraNextFreeModMatrixSlot, 2, "OSC4:Vol", zebraUsedModMatrixSlots);
						zebraNumberOfSlotsUsed = 2;
						break;
					case Sylenth1Preset.YMODDEST.VolumeAB:
						SetZebraModMatrixElementFromSylenth(z2, sylenthModSource, sylenthModDestination, zebraModMatrixTargetPrefix, _zebraNextFreeModMatrixSlot, 1, "OSC1:Vol", zebraUsedModMatrixSlots);
						SetZebraModMatrixElementFromSylenth(z2, sylenthModSource, sylenthModDestination, zebraModMatrixTargetPrefix, _zebraNextFreeModMatrixSlot, 2, "OSC2:Vol", zebraUsedModMatrixSlots);
						SetZebraModMatrixElementFromSylenth(z2, sylenthModSource, sylenthModDestination, zebraModMatrixTargetPrefix, _zebraNextFreeModMatrixSlot, 3, "OSC3:Vol", zebraUsedModMatrixSlots);
						SetZebraModMatrixElementFromSylenth(z2, sylenthModSource, sylenthModDestination, zebraModMatrixTargetPrefix, _zebraNextFreeModMatrixSlot, 4, "OSC4:Vol", zebraUsedModMatrixSlots);
						zebraNumberOfSlotsUsed = 4;
						break;
					case Sylenth1Preset.YMODDEST.Pitch_A:
						SetZebraModMatrixElementFromSylenth(z2, sylenthModSource, sylenthModDestination, zebraModMatrixTargetPrefix, _zebraNextFreeModMatrixSlot, 1, "OSC1:Tune", zebraUsedModMatrixSlots);
						SetZebraModMatrixElementFromSylenth(z2, sylenthModSource, sylenthModDestination, zebraModMatrixTargetPrefix, _zebraNextFreeModMatrixSlot, 2, "OSC2:Tune", zebraUsedModMatrixSlots);
						zebraNumberOfSlotsUsed = 2;
						break;
					case Sylenth1Preset.YMODDEST.Pitch_B:
						SetZebraModMatrixElementFromSylenth(z2, sylenthModSource, sylenthModDestination, zebraModMatrixTargetPrefix, _zebraNextFreeModMatrixSlot, 1, "OSC3:Tune", zebraUsedModMatrixSlots);
						SetZebraModMatrixElementFromSylenth(z2, sylenthModSource, sylenthModDestination, zebraModMatrixTargetPrefix, _zebraNextFreeModMatrixSlot, 2, "OSC4:Tune", zebraUsedModMatrixSlots);
						zebraNumberOfSlotsUsed = 2;
						break;
					case Sylenth1Preset.YMODDEST.Pitch_AB:
						SetZebraModMatrixElementFromSylenth(z2, sylenthModSource, sylenthModDestination, zebraModMatrixTargetPrefix, _zebraNextFreeModMatrixSlot, 1, "OSC1:Tune", zebraUsedModMatrixSlots);
						SetZebraModMatrixElementFromSylenth(z2, sylenthModSource, sylenthModDestination, zebraModMatrixTargetPrefix, _zebraNextFreeModMatrixSlot, 2, "OSC2:Tune", zebraUsedModMatrixSlots);
						SetZebraModMatrixElementFromSylenth(z2, sylenthModSource, sylenthModDestination, zebraModMatrixTargetPrefix, _zebraNextFreeModMatrixSlot, 3, "OSC3:Tune", zebraUsedModMatrixSlots);
						SetZebraModMatrixElementFromSylenth(z2, sylenthModSource, sylenthModDestination, zebraModMatrixTargetPrefix, _zebraNextFreeModMatrixSlot, 4, "OSC4:Tune", zebraUsedModMatrixSlots);
						zebraNumberOfSlotsUsed = 4;
						break;
					case Sylenth1Preset.YMODDEST.Phase_A:
						SetZebraModMatrixElementFromSylenth(z2, sylenthModSource, sylenthModDestination, zebraModMatrixTargetPrefix, _zebraNextFreeModMatrixSlot, 1, "OSC1:Phse", zebraUsedModMatrixSlots);
						SetZebraModMatrixElementFromSylenth(z2, sylenthModSource, sylenthModDestination, zebraModMatrixTargetPrefix, _zebraNextFreeModMatrixSlot, 2, "OSC2:Phse", zebraUsedModMatrixSlots);
						zebraNumberOfSlotsUsed = 2;
						break;
					case Sylenth1Preset.YMODDEST.Phase_B:
						SetZebraModMatrixElementFromSylenth(z2, sylenthModSource, sylenthModDestination, zebraModMatrixTargetPrefix, _zebraNextFreeModMatrixSlot, 1, "OSC3:Phse", zebraUsedModMatrixSlots);
						SetZebraModMatrixElementFromSylenth(z2, sylenthModSource, sylenthModDestination, zebraModMatrixTargetPrefix, _zebraNextFreeModMatrixSlot, 2, "OSC4:Phse", zebraUsedModMatrixSlots);
						zebraNumberOfSlotsUsed = 2;
						break;
					case Sylenth1Preset.YMODDEST.Phase_AB:
						SetZebraModMatrixElementFromSylenth(z2, sylenthModSource, sylenthModDestination, zebraModMatrixTargetPrefix, _zebraNextFreeModMatrixSlot, 1, "OSC1:Phse", zebraUsedModMatrixSlots);
						SetZebraModMatrixElementFromSylenth(z2, sylenthModSource, sylenthModDestination, zebraModMatrixTargetPrefix, _zebraNextFreeModMatrixSlot, 2, "OSC2:Phse", zebraUsedModMatrixSlots);
						SetZebraModMatrixElementFromSylenth(z2, sylenthModSource, sylenthModDestination, zebraModMatrixTargetPrefix, _zebraNextFreeModMatrixSlot, 3, "OSC3:Phse", zebraUsedModMatrixSlots);
						SetZebraModMatrixElementFromSylenth(z2, sylenthModSource, sylenthModDestination, zebraModMatrixTargetPrefix, _zebraNextFreeModMatrixSlot, 4, "OSC4:Phse", zebraUsedModMatrixSlots);
						zebraNumberOfSlotsUsed = 4;
						break;
					case Sylenth1Preset.YMODDEST.Pan_A:
						SetZebraModMatrixElementFromSylenth(z2, sylenthModSource, sylenthModDestination, zebraModMatrixTargetPrefix, _zebraNextFreeModMatrixSlot, 1, "VCA1:Pan1", zebraUsedModMatrixSlots);
						zebraNumberOfSlotsUsed = 1;
						break;
					case Sylenth1Preset.YMODDEST.Pan_B:
						SetZebraModMatrixElementFromSylenth(z2, sylenthModSource, sylenthModDestination, zebraModMatrixTargetPrefix, _zebraNextFreeModMatrixSlot, 1, "VCA1:Pan2", zebraUsedModMatrixSlots);
						zebraNumberOfSlotsUsed = 1;
						break;
					case Sylenth1Preset.YMODDEST.Pan_AB:
						SetZebraModMatrixElementFromSylenth(z2, sylenthModSource, sylenthModDestination, zebraModMatrixTargetPrefix, _zebraNextFreeModMatrixSlot, 1, "VCA1:Pan1", zebraUsedModMatrixSlots);
						SetZebraModMatrixElementFromSylenth(z2, sylenthModSource, sylenthModDestination, zebraModMatrixTargetPrefix, _zebraNextFreeModMatrixSlot, 2, "VCA1:Pan2", zebraUsedModMatrixSlots);
						zebraNumberOfSlotsUsed = 2;
						break;

						// Filters
					case Sylenth1Preset.YMODDEST.Cutoff_A:
						SetZebraModMatrixElementFromSylenth(z2, sylenthModSource, sylenthModDestination, zebraModMatrixTargetPrefix, _zebraNextFreeModMatrixSlot, 1, "VCF1:Cut", zebraUsedModMatrixSlots);
						zebraNumberOfSlotsUsed = 1;
						break;
					case Sylenth1Preset.YMODDEST.Cutoff_B:
						SetZebraModMatrixElementFromSylenth(z2, sylenthModSource, sylenthModDestination, zebraModMatrixTargetPrefix, _zebraNextFreeModMatrixSlot, 1, "VCF2:Cut", zebraUsedModMatrixSlots);
						zebraNumberOfSlotsUsed = 1;
						break;
					case Sylenth1Preset.YMODDEST.CutoffAB:
						SetZebraModMatrixElementFromSylenth(z2, sylenthModSource, sylenthModDestination, zebraModMatrixTargetPrefix, _zebraNextFreeModMatrixSlot, 1, "VCF1:Cut", zebraUsedModMatrixSlots);
						SetZebraModMatrixElementFromSylenth(z2, sylenthModSource, sylenthModDestination, zebraModMatrixTargetPrefix, _zebraNextFreeModMatrixSlot, 2, "VCF2:Cut", zebraUsedModMatrixSlots);
						zebraNumberOfSlotsUsed = 2;
						break;
					case Sylenth1Preset.YMODDEST.Reso_A:
						SetZebraModMatrixElementFromSylenth(z2, sylenthModSource, sylenthModDestination, zebraModMatrixTargetPrefix, _zebraNextFreeModMatrixSlot, 1, "VCF1:Res", zebraUsedModMatrixSlots);
						zebraNumberOfSlotsUsed = 1;
						break;
					case Sylenth1Preset.YMODDEST.Reso_B:
						SetZebraModMatrixElementFromSylenth(z2, sylenthModSource, sylenthModDestination, zebraModMatrixTargetPrefix, _zebraNextFreeModMatrixSlot, 1, "VCF2:Res", zebraUsedModMatrixSlots);
						zebraNumberOfSlotsUsed = 1;
						break;
					case Sylenth1Preset.YMODDEST.Reso_AB:
						SetZebraModMatrixElementFromSylenth(z2, sylenthModSource, sylenthModDestination, zebraModMatrixTargetPrefix, _zebraNextFreeModMatrixSlot, 1, "VCF1:Res", zebraUsedModMatrixSlots);
						SetZebraModMatrixElementFromSylenth(z2, sylenthModSource, sylenthModDestination, zebraModMatrixTargetPrefix, _zebraNextFreeModMatrixSlot, 2, "VCF2:Res", zebraUsedModMatrixSlots);
						zebraNumberOfSlotsUsed = 2;
						break;

						// Misc
					case Sylenth1Preset.YMODDEST.PhsrFreq:
						SetZebraModMatrixElementFromSylenth(z2, sylenthModSource, sylenthModDestination, zebraModMatrixTargetPrefix, _zebraNextFreeModMatrixSlot, 1, "ModFX1:Sped", zebraUsedModMatrixSlots);
						zebraNumberOfSlotsUsed = 1;
						break;

					case Sylenth1Preset.YMODDEST.Mix_A:
						SetZebraModMatrixElementFromSylenth(z2, sylenthModSource, sylenthModDestination, zebraModMatrixTargetPrefix, _zebraNextFreeModMatrixSlot, 1, "VCA1:Vol1", zebraUsedModMatrixSlots);
						zebraNumberOfSlotsUsed = 1;
						break;
					case Sylenth1Preset.YMODDEST.Mix_B:
						SetZebraModMatrixElementFromSylenth(z2, sylenthModSource, sylenthModDestination, zebraModMatrixTargetPrefix, _zebraNextFreeModMatrixSlot, 1, "VCA1:Vol2", zebraUsedModMatrixSlots);
						zebraNumberOfSlotsUsed = 1;
						break;
					case Sylenth1Preset.YMODDEST.Mix_AB:
						SetZebraModMatrixElementFromSylenth(z2, sylenthModSource, sylenthModDestination, zebraModMatrixTargetPrefix, _zebraNextFreeModMatrixSlot, 1, "VCA1:Vol1", zebraUsedModMatrixSlots);
						SetZebraModMatrixElementFromSylenth(z2, sylenthModSource, sylenthModDestination, zebraModMatrixTargetPrefix, _zebraNextFreeModMatrixSlot, 2, "VCA1:Vol2", zebraUsedModMatrixSlots);
						zebraNumberOfSlotsUsed = 2;
						break;

					case Sylenth1Preset.YMODDEST.LFO1Rate:
						SetZebraModMatrixElementFromSylenth(z2, sylenthModSource, sylenthModDestination, zebraModMatrixTargetPrefix, _zebraNextFreeModMatrixSlot, 1, "LFO1:Rate", zebraUsedModMatrixSlots);
						zebraNumberOfSlotsUsed = 1;
						break;
					case Sylenth1Preset.YMODDEST.LFO1Gain:
						SetZebraModMatrixElementFromSylenth(z2, sylenthModSource, sylenthModDestination, zebraModMatrixTargetPrefix, _zebraNextFreeModMatrixSlot, 1, "LFO1:Amp", zebraUsedModMatrixSlots);
						zebraNumberOfSlotsUsed = 1;
						break;
					case Sylenth1Preset.YMODDEST.LFO2Rate:
						SetZebraModMatrixElementFromSylenth(z2, sylenthModSource, sylenthModDestination, zebraModMatrixTargetPrefix, _zebraNextFreeModMatrixSlot, 1, "LFO2:Rate", zebraUsedModMatrixSlots);
						zebraNumberOfSlotsUsed = 1;
						break;
					case Sylenth1Preset.YMODDEST.LFO2Gain:
						SetZebraModMatrixElementFromSylenth(z2, sylenthModSource, sylenthModDestination, zebraModMatrixTargetPrefix, _zebraNextFreeModMatrixSlot, 1, "LFO2:Amp", zebraUsedModMatrixSlots);
						zebraNumberOfSlotsUsed = 1;
						break;
					case Sylenth1Preset.YMODDEST.DistAmnt:
						// TODO: should we use Dist3:Input or Dist3:Output ?
						SetZebraModMatrixElementFromSylenth(z2, sylenthModSource, sylenthModDestination, zebraModMatrixTargetPrefix, _zebraNextFreeModMatrixSlot, 1, "Dist3:Input", zebraUsedModMatrixSlots);
						zebraNumberOfSlotsUsed = 1;
						break;
				}

				
				for (int i = 1; i <= zebraNumberOfSlotsUsed; i++) {
					switch (sylenthModSource) {
						case Sylenth1Preset.XMODSOURCE.SOURCE_None:
							// should never get here
							break;
						case Sylenth1Preset.XMODSOURCE.SOURCE_Velocity:
							SetZebraModMatrixElementFromSylenth(z2, sylenthModSource, sylenthModDestination, zebraModMatrixSourcePrefix, _zebraNextFreeModMatrixSlot, i, (int) Zebra2Preset.ModulationSource.Velocity, zebraUsedModMatrixSlots);
							break;
						case Sylenth1Preset.XMODSOURCE.SOURCE_ModWheel:
							SetZebraModMatrixElementFromSylenth(z2, sylenthModSource, sylenthModDestination, zebraModMatrixSourcePrefix, _zebraNextFreeModMatrixSlot, i, (int) Zebra2Preset.ModulationSource.ModWhl, zebraUsedModMatrixSlots);
							break;
						case Sylenth1Preset.XMODSOURCE.SOURCE_KeyTrack:
							SetZebraModMatrixElementFromSylenth(z2, sylenthModSource, sylenthModDestination, zebraModMatrixSourcePrefix, _zebraNextFreeModMatrixSlot, i, (int) Zebra2Preset.ModulationSource.KeyFol, zebraUsedModMatrixSlots);
							break;
						case Sylenth1Preset.XMODSOURCE.SOURCE_AmpEnv_A:
							SetZebraModMatrixElementFromSylenth(z2, sylenthModSource, sylenthModDestination, zebraModMatrixSourcePrefix, _zebraNextFreeModMatrixSlot, i, (int) Zebra2Preset.ModulationSource.Env1, zebraUsedModMatrixSlots);
							break;
						case Sylenth1Preset.XMODSOURCE.SOURCE_AmpEnv_B:
							SetZebraModMatrixElementFromSylenth(z2, sylenthModSource, sylenthModDestination, zebraModMatrixSourcePrefix, _zebraNextFreeModMatrixSlot, i, (int) Zebra2Preset.ModulationSource.Env2, zebraUsedModMatrixSlots);
							break;
						case Sylenth1Preset.XMODSOURCE.SOURCE_ModEnv_1:
							SetZebraModMatrixElementFromSylenth(z2, sylenthModSource, sylenthModDestination, zebraModMatrixSourcePrefix, _zebraNextFreeModMatrixSlot, i, (int) Zebra2Preset.ModulationSource.Env3, zebraUsedModMatrixSlots);
							break;
						case Sylenth1Preset.XMODSOURCE.SOURCE_ModEnv_2:
							SetZebraModMatrixElementFromSylenth(z2, sylenthModSource, sylenthModDestination, zebraModMatrixSourcePrefix, _zebraNextFreeModMatrixSlot, i, (int) Zebra2Preset.ModulationSource.Env4, zebraUsedModMatrixSlots);
							break;
						case Sylenth1Preset.XMODSOURCE.SOURCE_LFO_1:
							SetZebraModMatrixElementFromSylenth(z2, sylenthModSource, sylenthModDestination, zebraModMatrixSourcePrefix, _zebraNextFreeModMatrixSlot, i, (int) Zebra2Preset.ModulationSource.Lfo1, zebraUsedModMatrixSlots);
							break;
						case Sylenth1Preset.XMODSOURCE.SOURCE_LFO_2:
							SetZebraModMatrixElementFromSylenth(z2, sylenthModSource, sylenthModDestination, zebraModMatrixSourcePrefix, _zebraNextFreeModMatrixSlot, i, (int) Zebra2Preset.ModulationSource.Lfo2, zebraUsedModMatrixSlots);
							break;
						case Sylenth1Preset.XMODSOURCE.SOURCE_Aftertch:
							SetZebraModMatrixElementFromSylenth(z2, sylenthModSource, sylenthModDestination, zebraModMatrixSourcePrefix, _zebraNextFreeModMatrixSlot, i, (int) Zebra2Preset.ModulationSource.ATouch, zebraUsedModMatrixSlots);
							break;
						case Sylenth1Preset.XMODSOURCE.SOURCE_StepVlty:
							SetZebraModMatrixElementFromSylenth(z2, sylenthModSource, sylenthModDestination, zebraModMatrixSourcePrefix, _zebraNextFreeModMatrixSlot, i, (int) Zebra2Preset.ModulationSource.Velocity, zebraUsedModMatrixSlots);
							break;
					}
					
					// set the modulation depth amount
					// have to constrain the amount due to too high converstion (real zebra range is 0 - 100)
					float matrixDepth = ConvertSylenthValueToZebra(sylenthXModDestAm, -10, 10, -100, 100);
					SetZebraModMatrixElementFromSylenth(z2,
					                                    sylenthModSource,
					                                    sylenthModDestination,
					                                    zebraModMatrixDepthPrefix,
					                                    _zebraNextFreeModMatrixSlot,
					                                    i,
					                                    matrixDepth,
					                                    zebraUsedModMatrixSlots
					                                   );
				}
				_zebraNextFreeModMatrixSlot += zebraNumberOfSlotsUsed;
			}
		}
		private void SetZebraModSourceFromSylenth(Sylenth1Preset.Syl1PresetContent s1,
		                                          Zebra2Preset z2,
		                                          string zebraModSourceFieldName,
		                                          Object zebraModSourceFieldValue,
		                                          string zebraModDepthFieldName,
		                                          Object zebraModDepthFieldValue,
		                                          bool doForceModMatrix,
		                                          Sylenth1Preset.XMODSOURCE sylenthModSource,
		                                          Sylenth1Preset.YMODDEST sylenthModDestination,
		                                          float sylenthXModDestAm,
		                                          Dictionary<string,List<string>> processedModulationSourceAndDest) {
			
			if (zebraModSourceFieldName == null || zebraModDepthFieldName == null) {
				return;
			}
			
			if (!doForceModMatrix && !_zebraUsedModSources.Contains(zebraModSourceFieldName)) {
				// setting modulation source directly on the source (not via the mod matrix)
				Logger.DoDebug(String.Format("Using the Zebra2 Modulation Source Slot: {0}={1} {2}={3}", zebraModSourceFieldName, Enum.GetName(typeof(Zebra2Preset.ModulationSource), zebraModSourceFieldValue), zebraModDepthFieldName, zebraModDepthFieldValue));
				_zebraUsedModSources.Add(zebraModSourceFieldName);
				ObjectUtils.SetField(z2, zebraModSourceFieldName, zebraModSourceFieldValue);
				ObjectUtils.SetField(z2, zebraModDepthFieldName, zebraModDepthFieldValue);
			} else {
				if (doForceModMatrix) {
					// Force use mod matrix
					Logger.DoDebug(String.Format("Forcing the usage of the mod matrix. {0}={1} {2}={3}", zebraModSourceFieldName, Enum.GetName(typeof(Zebra2Preset.ModulationSource), zebraModSourceFieldValue), zebraModDepthFieldName, zebraModDepthFieldValue));
				} else {
					// Already used the mod source, must revert to using the mod matrix
					Logger.DoDebug(String.Format("Already used up the Zebra2 Modulation Source Slot ({0}). Trying to use the Mod Matrix instead. {0}={1} {2}={3}", zebraModSourceFieldName, Enum.GetName(typeof(Zebra2Preset.ModulationSource), zebraModSourceFieldValue), zebraModDepthFieldName, zebraModDepthFieldValue));
				}
				
				SetZebraModMatrixFromSylenth(s1,
				                             z2,
				                             sylenthModSource,
				                             sylenthModDestination,
				                             sylenthXModDestAm,
				                             processedModulationSourceAndDest);
			}
		}