diff options
Diffstat (limited to 'site/app/twirl/appdata.js')
| -rw-r--r-- | site/app/twirl/appdata.js | 1427 | 
1 files changed, 1427 insertions, 0 deletions
| diff --git a/site/app/twirl/appdata.js b/site/app/twirl/appdata.js new file mode 100644 index 0000000..b417c3f --- /dev/null +++ b/site/app/twirl/appdata.js @@ -0,0 +1,1427 @@ +twirl.appdata = {
 +	version: 1.0,
 +	modulations: [
 +		{
 +			name: "LFO",
 +			instr: "twst_mod_lfo",
 +			parameters: [
 +				{name: "Rate", description: "Rate in Hz", dfault: 1, min: 0.1, max: 20},
 +				{name: "Base value", description: "Base value", hostrange: true},
 +				{name: "Gain", description: "Gain", dfault: 0.2},
 +				{preset: "wave"},
 +				{name: "Min", preset: "hostrangemin", hidden: true},
 +				{name: "Max", preset: "hostrangemax", hidden: true}
 +			]
 +		},
 +		{
 +			name: "Line",
 +			instr: "twst_mod_line",
 +			parameters: [
 +				{name: "First point", channel: "first", description: "First point value", hostrange: true, automatable: false},
 +				{name: "Last point", channel: "last", description: "Last point value", hostrange: true, automatable: false},
 +			]
 +		},
 +		{
 +			name: "Random",
 +			instr: "twst_mod_random",
 +			parameters: [
 +				{name: "Rate", description: "Rate in Hz", min: 0.1, max: 20, dfault: 1},
 +				{name: "Min", hostrange: true, dfault: "hostrangemin"},
 +				{name: "Max", hostrange: true, dfault: "hostrangemax"},
 +				{name: "Portamento time", channel: "porttime", description: "Value glide time in seconds", dfault: 0.1, min: 0, max: 0.5},
 +				
 +			]
 +		},
 +		{
 +			name: "Jitter",
 +			instr: "twst_mod_jitter",
 +			parameters: [
 +				{name: "Base value", description: "Base value", hostrange: true},
 +				{name: "Amplitude", channel: "amp", dfault: 1},
 +				{name: "Rate minimum", description: "Rate in Hz", channel: "freqmin", dfault: 1, min: 0.1, max: 20},
 +				{name: "Rate maximum", description: "Rate in Hz", channel: "freqmax", dfault: 1, min: 0.1, max: 20},
 +				{name: "Min", hostrange: true, dfault: "hostrangemin"},
 +				{name: "Max", hostrange: true, dfault: "hostrangemax"}
 +				
 +			]
 +		},
 +		{
 +			name: "Parametric jitter",
 +			instr: "twst_mod_jitter2",
 +			parameters: [
 +				{name: "Base value", description: "Base value", hostrange: true},
 +				{name: "Total amplitude", channel: "totalamp", dfault: 1},
 +				{name: "Amp 1", channel: "amp1", dfault: 0.5},
 +				{name: "Rate 1", description: "Rate in Hz", channel: "freq1", dfault: 1, min: 0.1, max: 20},
 +				{name: "Amp 2", channel: "amp2", dfault: 0.5},
 +				{name: "Rate 2", description: "Rate in Hz", channel: "freq2", dfault: 1, min: 0.1, max: 20},
 +				{name: "Amp 3", channel: "amp3", dfault: 0.5},
 +				{name: "Rate 3", description: "Rate in Hz", channel: "freq3", dfault: 1, min: 0.1, max: 20},
 +				{name: "Min", preset: "hostrangemin", hidden: true},
 +				{name: "Max", preset: "hostrangemax", hidden: true}
 +			]
 +		},
 +		{
 +			name: "Crossadaptive RMS",
 +			instr: "twst_xa_rms",
 +			inputs: 2,
 +			parameters: [
 +				{preset: "instance", channel: "xrmsinstance"},
 +				{preset: "instanceloop", channel: "xrmslooptype"},
 +				{name: "Scaling", channel: "xrmsscale", description: "Scaling", hostrange: true},
 +				{name: "Portamento time", channel: "porttime", description: "Value glide time in seconds", dfault: 0, min: 0, max: 0.2}
 +			]
 +		},
 +		{
 +			name: "Crossadaptive AMDF pitch",
 +			instr: "twst_xa_pitchamdf",
 +			inputs: 2,
 +			parameters: [
 +				{preset: "instance", channel: "xpitchinstance"},
 +				{preset: "instanceloop", channel: "xpitchlooptype"},
 +				{name: "Scaling", channel: "xpitchscale", description: "Scaling", hostrange: true},
 +				{name: "Minimum frequency", channel: "xpitchmin", description: "Minimum frequency in analysis", min: 20, max: 1000, step: 1, dfault: 20, automatable: false},
 +				{name: "Maximum frequency", channel: "xpitchmax", description: "Maximum frequency in analysis", min: 1000, max: 10000, step: 1, dfault: 10000, automatable: false},
 +				{name: "Portamento time", channel: "porttime", description: "Value glide time in seconds", dfault: 0, min: 0, max: 0.2},
 +			]
 +		},
 +		{
 +			name: "Crossadaptive pitch 1",
 +			instr: "twst_xa_pitch1",
 +			inputs: 2,
 +			parameters: [
 +				{preset: "instance", channel: "xpitchinstance"},
 +				{preset: "instanceloop", channel: "xpitchlooptype"},
 +				{name: "Scaling", channel: "xpitchscale", description: "Scaling", hostrange: true},
 +				{name: "Hop size root", channel: "xpitchhopsize", description: "Square root of hop size", min: 6, max: 12, dfault: 8, step: 1, automatable: false},
 +				{name: "Portamento time", channel: "porttime", description: "Value glide time in seconds", dfault: 0, min: 0, max: 0.2},
 +			]
 +		},
 +		{
 +			name: "Crossadaptive pitch 2",
 +			instr: "twst_xa_pitch2",
 +			inputs: 2,
 +			parameters: [
 +				{preset: "instance", channel: "xpitchinstance"},
 +				{preset: "instanceloop", channel: "xpitchlooptype"},
 +				{name: "Scaling", channel: "xpitchscale", description: "Scaling", hostrange: true},
 +				{name: "Minimum frequency", channel: "xpitchmin", description: "Minimum frequency in analysis", min: 20, max: 1000, step: 1, dfault: 20, automatable: false},
 +				{name: "Maximum frequency", channel: "xpitchmax", description: "Maximum frequency in analysis", min: 1000, max: 10000, step: 1, dfault: 10000, automatable: false},
 +				{name: "Analysis period", channel: "xpitchperiod", description: "Analysis period in seconds", min: 0.001, max: 0.1, dfault: 0.05, automatable: false},
 +				{name: "Amplitude threshold", channel: "xpitchampthresh", description: "Analysis amplitude threshold in decibels", min: 1, max: 30, dfault: 10, automatable: false},
 +				{name: "Portamento time", channel: "porttime", description: "Value glide time in seconds", dfault: 0, min: 0, max: 0.2},
 +			]
 +		},
 +		{
 +			name: "Crossadaptive spectral centroid",
 +			instr: "twst_xa_centroid",
 +			inputs: 2,
 +			parameters: [
 +				{preset: "instance", channel: "xcentroidinstance"},
 +				{preset: "instanceloop", channel: "xcentroidlooptype"},
 +				{name: "Scaling", channel: "xcentroidscale", description: "Scaling", hostrange: true},
 +				{name: "Analysis period", channel: "xcentroidperiod", description: "Analysis period in seconds", min: 0.001, max: 0.3, dfault: 0.05},
 +				{preset: "fftsize", channel: "xcentroidfftsize"},
 +				{name: "Portamento time", channel: "porttime", description: "Value glide time in seconds", dfault: 0, min: 0, max: 0.2}
 +			]
 +		},
 +	], 
 +	transforms: [
 +		{
 +			name: "General",
 +			contents: [
 +				{
 +					name: "Reverse", 
 +					description: "Reverse sample region",
 +					instr: "twst_tfi_reverse", 
 +					parameters: []
 +				}
 +			]
 +		},
 +		{
 +			name: "Generate",
 +			contents: [
 +				{
 +					name: "Silence", 
 +					instr: "twst_tf_gensilence",
 +					description: "Replace region with silence",
 +					parameters: []
 +					},
 +				{
 +					name: "Oscillator",
 +					instr: "twst_tf_gentone",
 +					description: "Simple interpolating oscillator",
 +					parameters: [
 +						{presetgroup: "notefreq"},
 +						{preset: "amp"},
 +						{preset: "wave", automatable: true},
 +						{presetgroup: "applymode"}
 +					]
 +				},
 +				{
 +					name: "FM", 
 +					instr: "twst_tf_genfm",
 +					description: "Frequency modulation synthesis",
 +					parameters: [
 +						{presetgroup: "notefreq"},
 +						{preset: "amp"},
 +						{name: "Carrier factor", channel: "carrier", min: 0.1, max: 8, dfault: 1},
 +						{name: "Modulator factor", channel: "modulator", min: 0.1, max: 8, dfault: 1},
 +						{name: "Modulation index", channel: "index", min: 0.1, max: 10, dfault: 2},
 +						{preset: "wave"},
 +						{name: "Stereo variance", channel: "stereovar", min: 0.5, max: 1.5, dfault: 1},
 +						{presetgroup: "applymode"}
 +					]
 +				},
 +				{
 +					name: "FM model", 
 +					instr: "twst_tf_genfmmodel",
 +					description: "Frequency modulation physical models",
 +					parameters: [
 +						{name: "Type", channel: "fmtype", options: ["Organ", "Bell", "Flute", "Rhodes", "Wurlitzer", "Random"]},
 +						{presetgroup: "notefreq"},
 +						{preset: "amp"},
 +						{name: "Modulation index", channel: "control1", min: 0.1, max: 10, dfault: 2},
 +						{name: "Oscillator crossfade", channel: "control2", min: 0.1, max: 10, dfault: 2},
 +						{name: "Vibrato depth", channel: "vibdepth", min: 0, max: 1, dfault: 0.05},
 +						{name: "Vibrato rate", channel: "vibrate", min: 0, max: 20, dfault: 2},
 +						{preset: "wave", channel: "wave1", name: "Wave 1"},
 +						{preset: "wave", channel: "wave2", name: "Wave 2"},
 +						{preset: "wave", channel: "wave3", name: "Wave 3"},
 +						{preset: "wave", channel: "wave4", name: "Wave 4"},
 +						{preset: "wave", channel: "vibwave", name: "Vibrato wave"},
 +						{name: "Stereo variance", channel: "stereovar", min: 0.5, max: 1.5, dfault: 1},
 +						{presetgroup: "applymode"}
 +					]
 +				},
 +				{
 +					name: "String pluck", 
 +					instr: "twst_tf_genrepluck",
 +					description: "String pluck physical model",
 +					parameters: [
 +						{presetgroup: "notefreq"},
 +						{preset: "amp"},
 +						{name: "Pluck point", channel: "pluckpoint", description: "String pluck point ratio", dfault: 0.3, automatable: false},
 +						{name: "Pickup point", channel: "pickpoint", description: "Pickup point ratio", dfault: 0.6, automatable: false},
 +						{name: "Reflection", channel: "reflection", description: "Reflection coefficient", min: 0.0001, max: 0.9999, dfault: 0.4},
 +						{name: "Exciter mode", channel: "excitemode", options: ["Noise", "Oscillator"], dfault: 1},
 +						{preset: "wave", channel: "excitewave", name: "Exciter waveform", conditions:[{channel: "excitemode", operator: "eq", value: 1}]},
 +						{presetgroup: "notefreq", channelprepend: "excite", nameprepend: "Exciter", conditions: [{channel: "excitemode", operator: "eq", value: 1}]},					
 +						{name: "Exciter amplitude", channel: "exciteamp", description: "Exciter amplitude", dfault: 1, min: 0, max: 1},
 +						{presetgroup: "applymode"}
 +					]
 +				},
 +				{
 +					name: "Stochastic additive", 
 +					instr: "twst_tf_genadditive",
 +					description: "Aleatoric additive synthesis",
 +					parameters: [
 +						{preset: "amp", automatable: false},
 +						{presetgroup: "notefreq", nameprepend: "Minimum", dfault: 440, channelprepend: "min", automatable: false, lagHint: 1},
 +						{presetgroup: "notefreq", nameprepend: "Maximum", dfault: 8000, channelprepend: "max", automatable: false, lagHint: -1},
 +						{name: "Frequency increment", channel: "step", automatable: false, min: 1.001, max: 1.5, dfault: 1.1, lagHint: -1},
 +						{name: "Frequency randomness", channel: "steprand", automatable: false, min: 1, max: 1.5, dfault: 1},
 +						{name: "Amplitude increment", channel: "ampmult", automatable: false, min: 0.2, max: 1, dfault: 0.6},
 +						{presetgroup: "applymode"}
 +					]
 +				},
 +				{
 +					name: "Noise", 
 +					instr: "twst_tf_gennoise",
 +					description: "Noise generation",
 +					parameters: [
 +						{preset: "amp"},
 +						{name: "Type", options: ["White", "Pink"], description: "Type of noise"},
 +						{presetgroup: "applymode"}
 +					]
 +				},
 +				{
 +					name: "Bamboo", 
 +					instr: "twst_tf_genbamboo",
 +					description: "Bamboo shaker physical model",
 +					parameters: [
 +						{preset: "amp"},
 +						{name: "Number of resonators", channel: "number", min: 0, max: 10, step: 1, dfault: 0, automatable: false},
 +						{presetgroup: "notefreq", nameprepend: "Resonator 1", dfault: 440, channelprepend: "r1", automatable: false},
 +						{presetgroup: "notefreq", nameprepend: "Resonator 2", dfault: 440, channelprepend: "r2", automatable: false},
 +						{presetgroup: "notefreq", nameprepend: "Resonator 3", dfault: 440, channelprepend: "r3", automatable: false},
 +						{presetgroup: "applymode"}
 +					]
 +				},
 +				{
 +					name: "WG bow",
 +					instr: "twst_tf_genwgbow",
 +					description: "Physical modelling waveguide bowed string",
 +					parameters: [
 +						{preset: "amp"},
 +						{presetgroup: "notefreq"},
 +						{name: "Bow pressure", channel: "pressure", min: 0, max: 5, dfault: 3},
 +						{name: "Bow position", channel: "position", min: 0.025, max: 0.23, dfault: 0.127236},
 +						{name: "Vibrato rate", channel: "vibfreq", min: 0, max: 12, dfault: 0},
 +						{name: "Vibrato rate", channel: "vibamp", min: 0, max: 1, dfault: 0},
 +						{name: "Vibrato waveform", preset: "wave"},
 +						{presetgroup: "applymode"}
 +					]
 +				},
 +				{
 +					name: "Feedback",
 +					instr: "twst_tf_genfeedback",
 +					description: "Feedback modelling",
 +					added: "2025-04-17",
 +					parameters: [
 +						{preset: "amp"},
 +						{presetgroup: "notefreq"},
 +						{name: "Feedback", min: 0.1, max: 10, dfault: 1.1},
 +						{name: "Filter bandwidth", channel: "bandwidth", min: 10, max: 500, dfault: 125},
 +						{name: "Post gain", channel: "postgain", min: 0.1, max: 2, dfault: 1},
 +						{presetgroup: "applymode"}
 +					]
 +				},
 +				{
 +					name: "Additive",
 +					instr: "twst_tf_gensimpleadditive",
 +					description: "Simple additive synthesis",
 +					added: "2025-04-17",
 +					parameters: [
 +						{preset: "amp"},
 +						{presetgroup: "notefreq"},
 +						{name: "Frequency step multiplier", channel: "multiplier", min: 1.0001, max: 2, dfault: 1.1},
 +						{name: "Frequency multiplier", channel: "stepmultiplier", min: 0.5, max: 2, dfault: 1},
 +						{name: "Amplitude smoothing", channel: "ampprofile", min: 0, max: 1, step: 1, dfault: 1},
 +						{name: "Harmonics", min: 2, max: 256, dfault: 64, automatable: false},
 +						{presetgroup: "applymode"}
 +					]
 +				}
 +				/* not quite right, don't create sound as expected
 +				{
 +					name: "WG bowed bar",
 +					instr: "twst_tf_genwgbowedbar",
 +					description: "Physical modelling waveguide bowed bar",
 +					parameters: [
 +						{preset: "amp"},
 +						{presetgroup: "notefreq"},
 +						{name: "Bow pressure", channel: "pressure", min: 0, max: 5, dfault: 3},
 +						{name: "Bow position", channel: "position", min: 0.025, max: 0.23, dfault: 0.127236},
 +						{name: "Filter gain", channel: "filtergain", min: 0, max: 1, dfault: 0.809},
 +						{presetgroup: "applymode"}
 +					]
 +				},
 +				{
 +					name: "WG brass",
 +					instr: "twst_tf_genwgbrass",
 +					description: "Physical modelling waveguide brass",
 +					parameters: [
 +						{preset: "amp"},
 +						{presetgroup: "notefreq"},
 +						{name: "Lip tension", channel: "tension", min: 0, max: 1, dfault: 0.4},
 +						{name: "Attack", channel: "position", min: 0, max: 1, dfault: 0.1, automatable: false},
 +						{name: "Vibrato rate", channel: "vibfreq", min: 0, max: 12, dfault: 0},
 +						{name: "Vibrato rate", channel: "vibamp", min: 0, max: 1, dfault: 0},
 +						{name: "Vibrato waveform", preset: "wave"},
 +						{presetgroup: "applymode"}
 +					]
 +				},*/
 +			]
 +		},
 +		{
 +			name: "Amplitude",
 +			contents: [
 +				{
 +					name: "Normalise", 
 +					instr: "twst_tf_normalise",
 +					description: "Normalise region",
 +					parameters: [
 +						{name: "Scale", description: "Scaling of normalisation", dfault: 1, min: 0, max: 1, automatable: false},
 +						{name: "Stereo equal", channel: "equal", description: "Normalise stereo channels equally", dfault: 1, min: 0, max: 1, step: 1, automatable: false},
 +					]
 +				},
 +				{
 +					name: "Amplitude", 
 +					instr: "twst_tf_amplitude",
 +					description: "Gain alteration",
 +					twine: true, 
 +					parameters: [
 +						{name: "Gain", description: "Gain amount", dfault: 1, min: 0, max: 2},
 +						{name: "Balance", description: "Left and right balance", dfault: 0.5, min: 0, max: 1}
 +					]
 +				},
 +				{
 +					name: "Bit crush", 
 +					instr: "twst_tf_bitcrush",
 +					description: "Sample level bit reduction",
 +					twine: true, 
 +					parameters: [
 +						{name: "Crush depth", channel: "crush", description: "Bit depth", dfault: 16, min: 1, max: 64, step: 1},
 +						{presetgroup: "applymode"}
 +					]
 +				},
 +				{
 +					name: "Suppressor",
 +					instr: "twst_tf_suppress",
 +					description: "Wrap, mirror or limit amplitude",
 +					twine: true, 
 +					parameters: [
 +						{name: "Mode", channel: "mode", options: ["Limit", "Wrap", "Mirror"], automatable: true, dfault: 0},
 +						{name: "Threshold", dfault: 0.8},
 +						{presetgroup: "applymode"}
 +					]
 +				},
 +				{
 +					name: "Linear clip",
 +					instr: "twst_tf_pdclip",
 +					description: "Phase distortion linear clipping",
 +					twine: true,
 +					parameters: [
 +						{name: "Width", min: 0, max: 1, dfault: 0.2},
 +						{name: "Centre", description: "Clipping offset", min: -1, max: 1, dfault: 0},
 +						{name: "Bipolar", min: 0, max: 1, step: 1, dfault: 0, automatable: false},
 +						{name: "Fullscale", min: 0, max: 1, dfault: 1, automatable: false},
 +					]
 +				},
 +				{
 +					name: "Distortion",
 +					instr: "twst_tf_distort",
 +					description: "Waveshaping distortion",
 +					twine: true,
 +					parameters: [
 +						{name: "Amount", min: 0, max: 1, dfault: 0.2},
 +						{preset: "wave"},
 +						{name: "Half power point", channel: "halfpower", min: 0, max: 100, dfault: 10, automatable: false},
 +					]
 +				},
 +				{
 +					name: "HT Distortion",
 +					instr: "twst_tf_distort1",
 +					description: "Hyperbolic tangent distortion",
 +					twine: true,
 +					parameters: [
 +						{name: "Pre gain", channel: "pregain", min: 0, max: 5, dfault: 1},
 +						{name: "Post gain", channel: "postgain", min: 0, max: 1, dfault: 1},
 +						{name: "Positive shape", channel: "shape1", min: 0, max: 1, dfault: 0.2},
 +						{name: "Negative shape", channel: "shape2", min: 0, max: 1, dfault: 0.2},
 +					]
 +				},
 +				{
 +					name: "Strobe", 
 +					instr: "twst_tf_strobe",
 +					description: "Automatic amplitude attenuation",
 +					twine: true, 
 +					added: "2025-04-17",
 +					parameters: [
 +						{name: "Rate", description: "Rate of action in Hz", dfault: 4, min: 0.1, max: 30},
 +						{name: "Hold time", channel: "holdtime", description: "Hold time in seconds", dfault: 0.1, min: 0.01, max: 0.5},
 +						{name: "Windowed", description: "Whether to apply windowing", dfault: 0, min: 0, max: 1, step: 1}
 +					]
 +				},
 +			]
 +		},
 +		{
 +			name: "Filter",
 +			contents: [
 +				{
 +					name: "Low pass", 
 +					instr: "twst_tf_lpf",
 +					description: "Butterworth low pass filter",
 +					twine: true,
 +					parameters: [
 +						{name: "Frequency", description: "Filter frequency", max: 22000, min: 20, dfault: 1000},
 +						{presetgroup: "applymode"}
 +					]
 +				},
 +				{
 +					name: "High pass", 
 +					instr: "twst_tf_hpf",
 +					description: "Butterworth high pass filter",
 +					twine: true,
 +					parameters: [
 +						{name: "Frequency", description: "Filter frequency", max: 22000, min: 20, dfault: 1000},
 +						{presetgroup: "applymode"}
 +					]
 +				},
 +				{
 +					name: "Band pass", 
 +					instr: "twst_tf_bpf",
 +					description: "Butterworth band pass filter",
 +					twine: true,
 +					parameters: [
 +						{name: "Frequency", description: "Filter frequency", max: 22000, min: 20, dfault: 1000},
 +						{name: "Bandwidth", description: "Filter bandwidth", max: 5000, min: 1, dfault: 200},
 +						{presetgroup: "applymode"}
 +					]
 +				},
 +				{
 +					name: "Parametric", 
 +					instr: "twst_tf_pareq",
 +					description: "Parametric EQ",
 +					twine: true,
 +					parameters: [
 +						{name: "Frequency", description: "Filter frequency", max: 22000, min: 20, dfault: 1000},
 +						{name: "Gain", description: "Filter gain factor", max: 4, min: 0, dfault: 1},
 +						{name: "Q", description: "Filter Q", max: 0.9, min: 0.5, dfault: 0.707},
 +						{presetgroup: "applymode"}
 +					]
 +				},
 +				{
 +					name: "DC Block",
 +					instr: "twst_tf_dcblock",
 +					description: "Remove DC offset from signal",
 +					twine: true,
 +					parameters: [
 +						{presetgroup: "applymode"}
 +					]
 +				},
 +				{
 +					name: "Moog high pass",
 +					instr: "twst_tf_mooghpf",
 +					description: "Emulated Moog high pass filter",
 +					twine: true,
 +					parameters: [
 +						{name: "Frequency", channel: "freq", min: 10, max: 10000, dfault: 800},
 +						{presetgroup: "applymode"}
 +					]
 +				},
 +				{
 +					name: "Moog low pass",
 +					instr: "twst_tf_mooglpf",
 +					description: "Emulated Moog low pass filter",
 +					twine: true,
 +					parameters: [
 +						{name: "Frequency", channel: "freq", min: 10, max: 10000, dfault: 800},
 +						{name: "Resonance", min: 0, max: 1, dfault: 0.6},
 +						{name: "Mode", min: 0, max: 2, dfault: 1, step: 1},
 +						{presetgroup: "applymode"}
 +					]
 +				},
 +				{
 +					name: "TB303 low pass",
 +					instr: "twst_tf_tbvcf",
 +					description: "Emulated TB303 low pass filter",
 +					twine: true,
 +					parameters: [
 +						{name: "Frequency", channel: "freq", min: 1000, max: 15000, dfault: 1500},
 +						{name: "Resonance", min: 0, max: 2, dfault: 0.6},
 +						{name: "Distortion", min: 0.5, max: 3, dfault: 2},
 +						{name: "Resonance asymmetry ", min: 0, max: 1, dfault: 0.5},
 +						{presetgroup: "applymode"}
 +					]
 +				},
 +				{
 +					name: "Waveguide",
 +					instr: "twst_tf_waveguide1",
 +					description: "Waveguide filter",
 +					twine: true,
 +					parameters: [
 +						{name: "Rate", channel: "freq", min: 10, max: 4000, dfault: 100},
 +						{name: "Filter cutoff", channel: "cutoff", min: 400, max: 20000, dfault: 4000},
 +						{name: "Feedback", dfault: 0.5},
 +						{presetgroup: "applymode"}
 +					]
 +				}
 +			]
 +		},
 +		{
 +			name: "Frequency", contents: [
 +				{
 +					name: "Frequency shift 1",
 +					instr: "twst_tf_freqshift1",
 +					description: "Hilbert frequency shifter",
 +					twine: true,
 +					parameters: [
 +						{name: "Shift", description: "Shift frequency in Hz", dfault: 0, min: -1000, max: 1000},
 +						{presetgroup: "applymode"}
 +					]
 +				},
 +				{
 +					name: "Frequency shift 2",
 +					instr: "twst_tf_freqshift2",
 +					description: "Biquadratic frequency shifter",
 +					twine: true,
 +					parameters: [
 +						{name: "Shift", description: "Shift frequency in Hz", dfault: 0, min: -1000, max: 1000},
 +						{presetgroup: "applymode"}
 +					]
 +				},
 +				{
 +					name: "Ring modulator",
 +					instr: "twst_tf_ringmod",
 +					description: "Ring modulator",
 +					twine: true,
 +					parameters: [
 +						{name: "Frequency", description: "Modulation frequency in Hz", dfault: 440, min: 20, max: 18000},
 +						{presetgroup: "applymode"}
 +					]
 +				},
 +				{
 +					name: "Exciter",
 +					instr: "twst_tf_exciter",
 +					description: "Non-linear signal excitation",
 +					twine: true,
 +					parameters: [
 +						{presetgroup: "notefreq", nameprepend: "Lower", channelprepend: "low"},
 +						{presetgroup: "notefreq", nameprepend: "Upper", channelprepend: "high"},
 +						{name: "Harmonics", description: "Number of harmonics", min: 0.1, max: 10, dfault: 6, lagHint: -1},
 +						{name: "Blend", description: "Harmonic blending", min: -10, max: 10, dfault: 10},
 +						{presetgroup: "applymode"}
 +					]
 +				}
 +			]
 +		},
 +		{
 +			name: "Delay", contents: [
 +				{
 +					name: "Dynamic delay",
 +					instr: "twst_tf_vdelay",
 +					description: "Variable delay",
 +					twine: true,
 +					parameters: [
 +						{name: "Delay time", channel: "delay", description: "Delay time in seconds", dfault: 0.3, min: 0.001, max: 1, lagHint: -1},
 +						{name: "Feedback", description: "Feedback gain", dfault: 0.5},
 +						{presetgroup: "applymode"}
 +					]
 +				},
 +				{
 +					name: "Flanger",
 +					instr: "twst_tf_flanger",
 +					twine: true,
 +					parameters: [
 +						{name: "Delay", max: 0.02, dfault: 0.01, lagHint: -1},
 +						{name: "Feedback", dfault: 0.3},
 +						{presetgroup: "applymode"}
 +					]
 +				},
 +				{
 +					name: "First order phaser", 
 +					instr: "twst_tf_phaser1",
 +					twine: true,
 +					parameters: [
 +						{name: "Frequency", channel: "freq", min: 10, max: 10000, dfault: 3000},
 +						{name: "Order", min: 1, max: 24, step: 1, dfault: 4, automatable: false, lagHint: -1},
 +						{name: "Feedback", dfault: 0.3},
 +						{presetgroup: "applymode"}
 +					]
 +				},
 +				{
 +					name: "Second order phaser", 
 +					instr: "twst_tf_phaser2",
 +					twine: true,
 +					parameters: [
 +						{name: "Frequency", channel: "freq", min: 10, max: 10000, dfault: 3000},
 +						{name: "Q", min: 0.2, max: 1.5, dfault: 0.67},
 +						{name: "Order", min: 1, max: 2499, step: 1, dfault: 800, automatable: false, lagHint: -1},
 +						{name: "Mode", min: 1, max: 2, dfault: 1, step: 1, automatable: false},
 +						{name: "Separation", channel: "sep", min: 0.01, max: 4, dfault: 1, lagHint: 1},
 +						{name: "Feedback", min: -1, max: 1, dfault: 0.3},
 +						{presetgroup: "applymode"}
 +					]
 +				}
 +			]
 +		},
 +		{
 +			name: "Reverb", contents: [
 +				{
 +					name: "Room",
 +					instr: "twst_tf_reverb3",
 +					twine: true,
 +					parameters: [
 +						{name: "Room size", channel: "roomsize", description: "Room size", dfault: 0.5, min: 0, max: 1, lagHint: -1},
 +						{name: "Damping", channel: "hfdamp", description: "High frequency damping", dfault: 0.5, min: 0, max: 1},
 +						{presetgroup: "applymode"}
 +					]
 +				},
 +				{
 +					name: "Midverb",
 +					instr: "twst_tf_reverb2",
 +					twine: true,
 +					parameters: [
 +						{name: "Length", channel: "time", description: "Decay time", dfault: 1, min: 0.1, max: 10, lagHint: -1},
 +						{name: "Damping", channel: "hfdamp", description: "High frequency damping", dfault: 0.5, min: 0, max: 1},
 +						{presetgroup: "applymode"}
 +					]
 +				},
 +				{
 +					name: "Basicverb",
 +					instr: "twst_tf_reverb1",
 +					twine: true,
 +					parameters: [
 +						{name: "Length", channel: "time", description: "Decay time", dfault: 1, min: 0.1, max: 10, lagHint: -1},
 +						{presetgroup: "applymode"}
 +					]
 +				},
 +				{
 +					name: "FDNverb",
 +					instr: "twst_tf_reverb4",
 +					twine: true,
 +					parameters: [
 +						{name: "Feedback", channel: "feedback", description: "Feedback amount equating to decay time", dfault: 0.5, min: 0.1, max: 1, lagHint: -1},
 +						{name: "Damping", channel: "hfdamp", description: "High frequency damping", dfault: 0.5, min: 0, max: 1},
 +						{name: "Pitch variation", channel: "pitchmod", description: "Pitch variation", dfault: 1, min: 0, max: 10, automatable: false},
 +						{presetgroup: "applymode"}
 +					]
 +				},
 +				{
 +					name: "Baboverb",
 +					instr: "twst_tf_reverb5",
 +					description: "Physical model reverberator",
 +					twine: true,
 +					parameters: [
 +						{name: "Room width", channel: "width", description: "Room width in metres", dfault: 14.39, min: 2, max: 100, automatable: false, lagHint: -1},
 +						{name: "Room depth", channel: "depth", description: "Room depth in metres", dfault: 11.86, min: 2, max: 100, automatable: false, lagHint: -1},
 +						{name: "Room height", channel: "height", description: "Room height in metres", dfault: 10, min: 2, max: 100, automatable: false, lagHint: -1},
 +						{name: "X position", channel: "posx", description: "X position of listener", dfault: 0.5, min: 0, max: 1},
 +						{name: "Y position", channel: "posy", description: "Y position of listener", dfault: 0.5, min: 0, max: 1},
 +						{name: "Z position", channel: "posz", description: "Z position of listener", dfault: 0.5, min: 0, max: 1},
 +						{presetgroup: "applymode"}
 +					]
 +				},
 +			]
 +		},
 +		{
 +			name: "Granular", contents: [
 +				{
 +					name: "Autoglitch",
 +					instr: "twst_tf_autoglitch",
 +					description: "Automatic aleatoric sample reading with modifications",
 +					twine: true,
 +					parameters: [
 +						{name: "Minimum ratio", channel: "minratio", description: "Minimum time ratio of original", dfault: 0.5, min: 0, max: 1, lagHint: 1},
 +						{name: "Change rate", channel: "changerate", description: "Rate of change in Hz", dfault: 0.5, min: 0.1, max: 10, lagHint: -1},
 +						{name: "Change chance", channel: "changechance", description: "Chance of change", dfault: 0.5, min: 0, max: 1},
 +						{name: "Portamento time", channel: "porttime", description: "Reading position glide", dfault: 0.1, min: 0.001, max: 0.5},
 +						{name: "Distortion", channel: "distortion", description: "Apply distortion", dfault: 0, min: 0, max: 1, step: 1},
 +						{name: "Amp change", channel: "ampchange", description: "Apply amplitude changes", dfault: 0, min: 0, max: 1, step: 1},
 +						{name: "Buffer size", channel: "buflens", description: "Buffer size in seconds", dfault: 0.5, min: 0.1, max: 4, automatable: false, lagHint: -1},
 +						{name: "Read mode", channel: "readmode", description: "Reading mode", dfault: 0, options: ["Direct", "Texture", "FFT"], automatable: false, lagHint: {option: 0}},
 +						{name: "Stereo unique", channel: "stereounique", description: "Whether channels are glitched independently", dfault: 1, min: 0, max: 1, step: 1, automatable: false},
 +						{presetgroup: "applymode"}
 +						
 +					]
 +				},
 +				{
 +					name: "Syncgrain",
 +					instr: "twst_tfi_syncgrain",
 +					description: "Synchronous granular synthesis",
 +					parameters: [
 +						{preset: "amp"},
 +						{name: "Frequency", description: "Grains per second", channel: "freq", step: 1, min: 1, max: 100, dfault: 20, lagHint: -1},
 +						{presetgroup: "pitchscale"},
 +						{name: "Grain size", channel: "grainsize", min: 0.01, max: 0.5, dfault: 0.1, lagHint: 1},
 +						{name: "Overlaps", min: 1, max: 8, step: 1, dfault: 1},
 +						{name: "Time scale", min: 0.1, max: 10, dfault: 1, channel: "timescale"},
 +						{preset: "wintype"},
 +						{presetgroup: "applymode"}
 +					]
 +				},
 +				{
 +					name: "Grain",
 +					instr: "twst_tfi_grain",
 +					description: "Granular synthesis",
 +					parameters: [
 +						{preset: "amp"},
 +						{presetgroup: "pitchscale"},
 +						{name: "Density", description: "Grains per second", channel: "density", step: 1, min: 1, max: 100, dfault: 20, lagHint: -1},
 +						{name: "Grain size", channel: "grainsize", min: 0.01, max: 0.5, dfault: 0.1, lagHint: 1},
 +						{name: "Amplitude variation", channel: "ampvar", min: 0, max: 1, dfault: 0},
 +						{name: "Pitch variation", channel: "pitchvar", min: 0, max: 1, dfault: 0},						
 +						{name: "Random readpoint", min: 0, max: 1, step: 1, dfault: 1},
 +						{preset: "wintype"},
 +						{presetgroup: "applymode"}
 +					]
 +				},
 +				{
 +					name: "Retrigger",
 +					instr: "twst_tfi_retriglitch",
 +					description: "Repeated window reader",
 +					parameters: [
 +						{name: "Read mode", channel: "readmode", description: "Sample reading type", options: ["Linear", "Direct", "Scale", "Reverse", "Random"], dfault: 0},
 +						{name: "Read position", channel: "readtime", description: "Read time ratio", dfault: 0.5, conditions: [{channel: "readmode", operator: "eq", value: 1}]},
 +						{name: "Time scaling", channel: "timescale", description: "Time scaling factor", dfault: 1, min: 0.1, max: 16, conditions: [{channel: "readmode", operator: "eq", value: 2}], automatable: false},
 +						{presetgroup: "pitchscale"},
 +						{name: "Retrigger length", channel: "triglen", min: 0.01, max: 1, dfault: 0.2, lagHint: 1},
 +						{name: "Apply windowing", channel: "applywindowing", step: 1, dfault: 0},
 +						{preset: "wintype", conditions:[{channel: "applywindowing", operator: "eq", value: 1}]},
 +						{presetgroup: "applymode"}
 +					]
 +				},
 +				{
 +					name: "Sample rearrange",
 +					instr: "twst_tfi_rearrange",
 +					description: "Aleatoric sample range rearrangement",
 +					parameters: [
 +						{name: "Number of chops", description: "Number of sample rearrangements to apply", channel: "chopnumber", step: 1, min: 1, max: 128, dfault: 16, automatable: false},
 +						{name: "Minimum samples", description: "Minimum number of samples to rearrange with each chop", channel: "chopmin", step: 1, min: 1, max: 1000, dfault: 400, automatable: false},
 +						{name: "Maximum samples", description: "Maximum number of samples to rearrange with each chop", channel: "chopmax", step: 1, min: 64, max: 10000, dfault: 5000, automatable: false},
 +						{name: "Stereo unique", description: "Whether to chop channels independently", channel: "stereounique", step: 1, min: 0, max: 1, dfault: 0, automatable: false},
 +						{presetgroup: "applymode"}
 +					]
 +				}
 +			]
 +		},
 +		{
 +			name: "Harmonic", contents: [
 +				{
 +					name: "Parallel resonators",
 +					instr: "twst_tf_resony",
 +					twine: true,
 +					parameters: [
 +						{presetgroup: "notefreq"},
 +						{name: "Bandwidth", description: "Bandwidth in Hz", dfault: 100, min: 1, max: 500},
 +						{name: "Number", channel: "num", description: "Number of resonators", dfault: 8, min: 1, max: 64, step: 1, automatable: false, lagHint: -1},
 +						{name: "Separation", description: "Band separation octaves", dfault: 1, min: 1, max: 6, step: 1, lagHint: 1},
 +						{name: "Separation mode", channel: "sepmode", description: "Separation mode", options: ["Logarithmic", "Linear"], dfault: 0},
 +						{name: "Balance output", channel: "balance", description: "Balance output level to input level", dfault: 1, min: 0, max: 1, step: 1, automatable: 0},
 +						{presetgroup: "applymode"}
 +					]
 +				},
 +				{
 +					name: "Resonator stack",
 +					instr: "twst_tf_resonx",
 +					twine: true,
 +					parameters: [
 +						{presetgroup: "notefreq"},
 +						{name: "Bandwidth", description: "Bandwidth in Hz", dfault: 100, min: 1, max: 500},
 +						{name: "Number", channel: "num", description: "Number of resonators", dfault: 8, min: 1, max: 64, step: 1, automatable: false, lagHint: -1},
 +						{name: "Balance output", channel: "balance", description: "Balance output level to input level", dfault: 1, min: 0, max: 1, step: 1, automatable: 0},
 +						{presetgroup: "applymode"}
 +					]
 +				},
 +				{
 +					name: "String resonator",
 +					instr: "twst_tf_streson",
 +					twine: true,
 +					parameters: [
 +						{presetgroup: "notefreq"},
 +						{name: "Feedback", description: "Feedback gain", dfault: 0.6, min: 0, max: 1},
 +						{presetgroup: "applymode"}
 +					]
 +				},
 +				{
 +					name: "MVM resonator", 
 +					instr: "twst_tf_mvmfilter",
 +					twine: true,
 +					parameters: [
 +						{name: "Frequency", channel: "freq", min: 10, max: 10000, dfault: 800},
 +						{name: "Decay time", channel: "decay", min: 0.1, max: 0.8, dfault: 0.2, lagHint: -1},
 +						{name: "Balance", channel: "balance", min: 0, max: 1, step: 1, dfault: 1},
 +						{presetgroup: "applymode"}
 +					]
 +				},
 +				{
 +					name: "Autoharmoniser", 
 +					instr: "twst_tf_harmon",
 +					twine: true,
 +					parameters: [
 +						{name: "Estimated frequency", channel: "estfreq", min: 10, max: 4000, dfault: 440},
 +						{name: "Maximum variance", channel: "maxvar", dfault: 0.2},
 +						{name: "Frequency 1 ratio", channel: "genfreq1", min: 0, max: 8, dfault: 2},
 +						{name: "Frequency 2 ratio", channel: "genfreq2", min: 0, max: 8, dfault: 4},
 +						{name: "Minimum analysis frequency", channel: "minfreq", min: 200, max: 4000, step: 1, dfault: 300, automatable: false, lagHint: 1},
 +						{name: "Analysis time", channel: "minfreq", min: 0.01, max: 0.1, dfault: 0.03, automatable: false},
 +						{presetgroup: "applymode"}
 +					]
 +				},
 +				{
 +					name: "Formant autoharmoniser", 
 +					instr: "twst_tf_formantharmon",
 +					twine: true,
 +					parameters: [
 +						{name: "Frequency 1 ratio", channel: "genfreq1", min: 0, max: 8, dfault: 2},
 +						{name: "Frequency 2 ratio", channel: "genfreq2", min: 0, max: 8, dfault: 3},
 +						{name: "Frequency 3 ratio", channel: "genfreq3", min: 0, max: 8, dfault: 4},
 +						{name: "Frequency 4 ratio", channel: "genfreq4", min: 0, max: 8, dfault: 5},
 +						{name: "Minimum frequency", channel: "minfreq", min: 20, max: 4000, step: 1, dfault: 100, automatable: false},
 +						{name: "Polarity", min: 0, max: 1, step: 1, dfault: 1, automatable: false},
 +						{name: "Analysis window time", channel: "pupdate", min: 0.001, max: 0.1, dfault: 0.01, automatable: false, lagHint: 1},
 +						{name: "Analysis bottom frequency", channel: "plowfreq", min: 20, max: 1000, dfault: 100, automatable: false, lagHint: 1},
 +						{name: "Analysis top frequency", channel: "phighfreq", min: 1000, max: 22000, dfault: 20000, automatable: false, lagHint: -1},
 +						{name: "Analysis threshold", channel: "pthresh", min: 0, max: 1, dfault: 0.4, automatable: false},
 +						{name: "Analysis octave divisions", channel: "pfrqs", min: 1, max: 120, dfault: 12, step: 1, automatable: false, lagHint: 1},
 +						{name: "Analysis confirmations", channel: "pconfirms", min: 1, max: 40, dfault: 10, step: 1, automatable: false, lagHint: -1},
 +						{presetgroup: "applymode"}
 +					]
 +				}
 +			]
 +		},
 +		{
 +			name: "Warping", contents: [
 +				{
 +					name: "Paulstretch",
 +					instr: "twst_tfi_paulstretch",
 +					description: "Extreme timestretch",
 +					parameters: [
 +						{name: "Stretch ratio", channel: "stretch", description: "Ratio to stretch by", dfault: 2, min: 1, max: 20, automatable: false},
 +						{name: "Window size", channel: "winsize", description: "Window size used for stretch", dfault: 0.5, min: 0.1, max: 5, automatable: false, lagHint: -1}
 +					]
 +				},
 +				{
 +					name: "Freeze",
 +					instr: "twst_tf_freeze",
 +					description: "Frequency domain freezing",
 +					twine: true,
 +					parameters: [
 +						{name: "Freeze amp", channel: "freezeamp", description: "Freeze amplitudes", min: 0, max: 1, dfault: 1, step: 1},
 +						{name: "Freeze frequency", channel: "freezefreq", description: "Freeze frequencies", min: 0, max: 1, dfault: 1, step: 1},
 +						{presetgroup: "pvanal"},
 +						{presetgroup: "pvsynth"},
 +						{presetgroup: "applymode"}
 +					]
 +				},
 +				{
 +					name: "Waveset",
 +					instr: "twst_tf_waveset",
 +					description: "Repeat wave cycles",
 +					twine: true,
 +					parameters: [
 +						{name: "Repetitions", channel: "reps", description: "Number of samples repetition in stretch", min: 1, max: 64, dfault: 2, step: 1},
 +						{presetgroup: "applymode"}
 +					]
 +				},
 +				{
 +					name: "Blur",
 +					instr: "twst_tf_blur",
 +					description: "Frequency domain time blurring",
 +					twine: true,
 +					parameters: [
 +						{name: "Blur time", channel: "time", description: "Blur time in seconds", min: 0.01, max: 3, dfault: 0.4, lagHint: -1},
 +						{presetgroup: "pvanal"},
 +						{presetgroup: "pvsynth"},
 +						{presetgroup: "applymode"}
 +					]
 +				},
 +				{
 +					name: "Spectral pitch scale",
 +					instr: "twst_tf_fftpitchscale",
 +					description: "Formant preserving pitch shifter",
 +					twine: true,
 +					parameters: [
 +						{presetgroup: "pitchscale"},
 +						{name: "Keep formants", channel: "formants", description: "Preserve formants", dfault: 0, min: 0, max: 1, step: 1},
 +						{name: "Formant coefficients", channel: "formantcoefs", description: "Number of formants in preservation", dfault: 80, min: 1, max: 120, step: 1, conditions: [{channel: "formants", operator: "eq", value: 1}]},
 +						{presetgroup: "pvanal"},
 +						{presetgroup: "pvsynth"},
 +						{presetgroup: "applymode"}
 +					]
 +				},
 +				{
 +					name: "Hilbert pitch scale",
 +					instr: "twst_tf_hilbertpitchscale",
 +					description: "Hilbert transform based pitch shifter",
 +					twine: true,
 +					parameters: [
 +						{presetgroup: "pitchscale"},
 +						{preset: "fftsize"},
 +						{presetgroup: "applymode"}
 +					]
 +				},
 +				{
 +					name: "Autotune",
 +					instr: "twst_tf_autotune",
 +					description: "Formant preserving autotune pitch shifter",
 +					twine: true,
 +					parameters: [
 +						{name: "Threshold", channel: "threshold", description: "Pitch detection threshold", dfault: 0.01, min: 0.001, max: 0.2},
 +						{name: "Keep formants", channel: "formants", description: "Preserve formants", dfault: 0, min: 0, max: 1, step: 1},
 +						{name: "Formant coefficients", channel: "formantcoefs", description: "Number of formants in preservation", dfault: 80, min: 1, max: 120, step: 1, conditions: [{channel: "formants", operator: "eq", value: 1}]},
 +						{presetgroup: "pvanal"},
 +						{presetgroup: "pvsynth"},
 +						{presetgroup: "applymode"}
 +					]
 +				},
 +				{
 +					name: "Window reader",
 +					instr: "twst_tfi_sndwarp",
 +					description: "Windowed playback",
 +					parameters: [
 +						{name: "Read mode", channel: "readmode", description: "Sample reading type", options: ["Linear", "Direct", "Scale", "Reverse"], dfault: 0},
 +						{name: "Read position", channel: "readtime", description: "Read time ratio", dfault: 0.5, conditions: [{channel: "readmode", operator: "eq", value: 1}]},
 +						{name: "Time scaling", channel: "timescale", description: "Time scaling factor", dfault: 1, min: 0.1, max: 16, conditions: [{channel: "readmode", operator: "eq", value: 2}], automatable: false},
 +						{presetgroup: "pitchscale"},
 +						{name: "Window size", channel: "winsize", description: "Window size", min: 256, max: 10000, dfault: 4410, step: 1, automatable: false, lagHint: -1},
 +						{name: "Window randomness", channel: "winrand", description: "Randomness in window size", min: 0, max: 1000, dfault: 441, step: 1, automatable: false},
 +						{name: "Window overlap", channel: "overlap", description: "Overlap number", min: 1, max: 32, dfault: 4, step: 1, automatable: false, lagHint: -1},
 +						{preset: "wintype"}
 +					]
 +				},
 +				{
 +					name: "FFT reader",
 +					instr: "twst_tfi_mincer",
 +					description: "Frequency domain playback",
 +					parameters: [
 +						{name: "Read mode", channel: "readmode", description: "Sample reading type", options: ["Linear", "Direct", "Scale", "Reverse"], dfault: 0},
 +						{name: "Read position", channel: "readtime", description: "Read time ratio", dfault: 0.5, conditions: [{channel: "readmode", operator: "eq", value: 1}]},
 +						{name: "Time scaling", channel: "timescale", description: "Time scaling factor", dfault: 1, min: 0.1, max: 16, conditions: [{channel: "readmode", operator: "eq", value: 2}], automatable: false},
 +						{presetgroup: "pitchscale"},
 +						{name: "Phase lock", channel: "phaselock", description: "Lock phase when resynthesising", dfault: 0, min: 0, max: 1, step: 1},
 +						{preset: "fftsize"},
 +						{name: "Overlap decimation", options: [2, 4, 8, 16], asvalue: true, dfault: 1, channel: "decimation", automatable: false, lagHint: -1}
 +					]
 +				},
 +				{
 +					name: "Sample holder",
 +					instr: "twst_tf_smphold",
 +					twine: true,
 +					parameters: [
 +						{name: "Ratio", description: "Inverse ratio of samples to be held in a block period", min: 0.000001},
 +						{presetgroup: "applymode"}
 +					]
 +				}
 +			]
 +		},
 +		{
 +			name: "Cross processing", contents: [
 +				{
 +					name: "Cross synth",
 +					instr: "twst_tf_crosssynth",
 +					description: "Amplitude based cross synthesis",
 +					inputs: 2,
 +					parameters: [
 +						{preset: "instance"},
 +						{preset: "instanceloop"},
 +						{name: "Current amp", channel: "amp1", description: "Ratio of current amplitude to use", dfault: 1, min: 0, max: 1},
 +						{name: "Target amp", channel: "amp2", description: "Ratio of target amplitude to use", dfault: 1, min: 0, max: 1},
 +						{presetgroup: "pvanal"},
 +						{presetgroup: "pvsynth"},
 +						{presetgroup: "applymode"}
 +					]
 +				},
 +				{
 +					name: "Direct convolution",
 +					instr: "twst_tf_directconvolve",
 +					description: "Convolution",
 +					inputs: 2,
 +					parameters: [
 +						{preset: "instance"},
 +						{preset: "amp"},
 +						{name: "Size ratio", min: 0.00001, max: 1, dfault: 0.1, lagHint: -1, channel: "sizeratio", automatable: false},
 +						{presetgroup: "applymode"}
 +					]
 +				},
 +				{
 +					name: "Block convolution",
 +					instr: "twst_tf_blockconvolve",
 +					description: "Short term frequency domain convolution",
 +					inputs: 2,
 +					parameters: [
 +						{preset: "instance"},
 +						{preset: "instanceloop"},
 +						{preset: "fftsize", dfault: 2},
 +						{name: "Overlap", min: 1, max: 8, step: 1, dfault: 2, lagHint: -1},
 +						{presetgroup: "applymode"}
 +					]
 +				}, /* not in WASM at current
 +				{
 +					name: "DFT/FIR convolve",
 +					instr: "twst_tf_tvconv",
 +					inputs: 2,
 +					parameters: [
 +						{preset: "instance"},
 +						{preset: "instanceloop"},
 +						{name: "Update source", channel: "apply1", min: 0, max: 1, step: 1, dfault: 1},
 +						{name: "Update destination", channel: "apply2", min: 0, max: 1, step: 1, dfault: 1},
 +						{name: "Mode", options: ["DFT", "FIR"]},
 +						{name: "Partition size", channel: "parts", options: [16, 32, 64, 128, 256, 512, 1024, 2048, 4096, 8192], dfault: 5, asvalue: true, conditions: [{channel: "mode", operator: "eq", value: 0}]},
 +						{name: "Filter size", channel: "dftfiltersize", options: [16, 32, 64, 128, 256, 512, 1024, 2048, 4096, 8192], dfault: 5, asvalue: true, conditions: [{channel: "mode", operator: "eq", value: 0}]},
 +						{name: "Filter size", channel: "firfiltersize", min: 2, max: 8192, dfault: 512, conditions: [{channel: "mode", operator: "eq", value: 1}]},
 +						{presetgroup: "applymode"}
 +					]
 +				}, */
 +				{
 +					name: "Morph",
 +					instr: "twst_tf_morph",
 +					description: "Amplitude and frequency cross synthesis",
 +					inputs: 2,
 +					parameters: [
 +						{preset: "instance", name: "Cross instance"},
 +						{preset: "instanceloop"},						
 +						{name: "Amplitude amount", channel: "amp", description: "Amplitude interpolation", dfault: 1, min: 0, max: 1},
 +						{name: "Frequency amount", channel: "freq", description: "Frequency interpolation", dfault: 1, min: 0, max: 1},
 +						{presetgroup: "pvanal"},
 +						{presetgroup: "pvsynth"},
 +						{presetgroup: "applymode"}
 +					]
 +				},
 +				{
 +					name: "Concatenative resynthesis",
 +					instr: "twst_tf_mfccmatch",
 +					description: "Map nearest perceptually similar segments",
 +					inputs: 2,
 +					parameters: [
 +						{preset: "instance", name: "Corpus"},
 +						{preset: "instanceloop"},
 +						{preset: "fftsize"},
 +						{name: "Minimum frequency", channel: "freqmin", description: "Minimum frequency to account for", dfault: 100, min: 30, max: 1000, automatable: false, lagHint: 1},
 +						{name: "Maximum frequency", channel: "freqmax", description: "Maximum frequency to account for", dfault: 4000, min: 1000, max: 20000, automatable: false, lagHint: -1},
 +						{name: "Bands", channel: "bands", description: "Number of frequency bands to use", dfault: 3, options:[2, 4, 8, 16, 32, 64], asvalue: true, automatable: false, lagHint: -1},
 +						{name: "Stretch", channel: "stretch", description: "Read stretch", dfault: 0.35, min: 0.1, max: 2.5},
 +						{presetgroup: "applymode"}
 +					]
 +				},
 +				{
 +					name: "Cross rearrange",
 +					instr: "twst_tf_crossrearrange",
 +					description: "Select chunks from all open instances",
 +					added: "2025-04-17",
 +					parameters: [
 +						{name: "Minimum samples", channel: "minsamples", description: "Minimum number of samples to chop", dfault: 4410, min: 10, max: 10000},
 +						{name: "Maximum samples", channel: "maxsamples", description: "Maximum number of samples to chop", dfault: 10000, min: 1000, max: 50000},
 +						{name: "Change rate", channel: "rate", description: "Rate of rearrangement change", dfault: 4, min: 0.1, max: 20},
 +						{name: "Stereo unique", channel: "stereounique", description: "Stereo independent rearrangement", dfault: 1, min: 0, max: 1, step: 1},
 +						{presetgroup: "applymode"}
 +					]
 +				}
 +			]
 +		},
 +		{
 +			name: "Spectral", contents: [
 +				{
 +					name: "Spectral autoglitch",
 +					instr: "twst_tf_spectralautoglitch",
 +					description: "Automatic frequency domain glitcher",
 +					twine: true,
 +					parameters: [
 +						{name: "Change rate", channel: "changerate", description: "Rate of change", dfault: 1, min: 0.1, max: 10, lagHint: -1},
 +						{name: "Change chance", channel: "changechance", description: "Chance of change", dfault: 0.5, min: 0, max: 1, lagHint: -1},
 +						{name: "Portamento time", channel: "porttime", description: "Reading position glide", dfault: 0.1, min: 0.001, max: 0.5},
 +						{name: "Alter pitch", channel: "pitchalter", description: "Apply pitch alterations", dfault: 0, min: 0, max: 1, step: 1},
 +						{preset: "fftsize"},
 +						{presetgroup: "pvsynth"},
 +						{presetgroup: "applymode"}
 +					]
 +				},
 +				{
 +					name: "Delay",
 +					instr: "twst_tf_spectraldelay",
 +					description: "Frequency domain bin-independent delay",
 +					unstable: true,
 +					parameters: [
 +						{name: "Delay time", channel: "time", description: "Delay time in seconds", dfault: 0.03, min: 0.01, max: 0.4, lagHint: -1},
 +						{name: "Delay time add", channel: "add", description: "Delay time addition with each step", dfault: 0.001, min: 0, max: 0.2, lagHint: -1},
 +						{name: "Portamento", channel: "porttime", description: "Resynthesis oscillator portamento time in seconds", dfault: 0.01, min: 0.01, max: 0.1},
 +						{presetgroup: "pitchscale"},
 +						{name: "Frequency bottom ratio", automatable: false, channel: "start", description: "Resynthesis bin start", dfault: 0, lagHint: 1},
 +						{name: "Frequency top ratio", automatable: false, channel: "end", description: "Resynthesis bin end", dfault: 0.3, lagHint: -1},
 +						{name: "Resynthesis waveform", preset: "wave"},
 +						{presetgroup: "pvanal"},
 +						{presetgroup: "applymode"}
 +					]
 +				},/* not in WASM
 +				{
 +					name: "Trace",
 +					instr: "twst_tf_trace",
 +					twine: true,
 +					description: "Retain only a selected number of the loudest bins",
 +					parameters: [
 +						{name: "Number of bins (ratio)", description: "Number of frequency bins to retain", dfault: 0.5, min: 0, max: 1},
 +						{presetgroup: "pvanal"},
 +						{presetgroup: "applymode"}
 +					]
 +				},*/
 +				{
 +					name: "Isolator",
 +					instr: "twst_tf_isolator",
 +					description: "Isolate an analysis bin",
 +					twine: true,
 +					parameters: [
 +						{name: "Bin (ratio)", description: "Bin to use", dfault: 0.1, min: 0, max: 1, channel: "bin"},
 +						{name: "Attenuation", description: "Bin attenuation", dfault: 1, min: 0, max: 1},
 +						{name: "Accentuation", description: "Bin accentuation", dfault: 1, min: 0, max: 2},
 +						{presetgroup: "pvanal"},
 +						{presetgroup: "applymode"}
 +					]
 +				},
 +				{
 +					name: "Shift",
 +					instr: "twst_tf_spectralshift",
 +					description: "Frequency shifter in the spectral domain",
 +					twine: true,
 +					parameters: [
 +						{name: "Shift", channel: "freqincr", description: "Frequency addition per bin", dfault: 0, min: -100, max: 100},
 +						{name: "Portamento", channel: "porttime", description: "Resynthesis oscillator portamento time in seconds", dfault: 0.01, min: 0.01, max: 0.1},
 +						{presetgroup: "pitchscale"},
 +						{name: "Frequency bottom ratio", automatable: false, channel: "start", description: "Resynthesis bin start", dfault: 0, lagHint: 1},
 +						{name: "Frequency top ratio", dfault: 0.3, automatable: false, channel: "end", description: "Resynthesis bin end", lagHint: -1},
 +						{name: "Resynthesis waveform", preset: "wave"},
 +						{presetgroup: "pvanal"},
 +						{presetgroup: "applymode"}
 +					]
 +				},
 +				{
 +					name: "Gate",
 +					instr: "twst_tf_spectralgate",
 +					description: "Analysis bin-independent gate",
 +					twine: true,
 +					parameters: [
 +						{name: "Threshold", description: "Gate threshold", dfault: 0.01, min: 0, max: 0.2},
 +						{name: "Hold", description: "Hold or decay frequencies", dfault: 0, min: 0, max: 1, step: 1},
 +						{name: "Portamento", channel: "porttime", description: "Resynthesis oscillator portamento time in seconds", dfault: 0.01, min: 0.01, max: 0.1},
 +						{presetgroup: "pitchscale"},
 +						{name: "Frequency bottom ratio", automatable: false, channel: "start", description: "Resynthesis bin start", dfault: 0, lagHint: 1},
 +						{name: "Frequency top ratio", dfault: 0.3, automatable: false, channel: "end", description: "Resynthesis bin end", lagHint: -1},
 +						{name: "Resynthesis waveform", preset: "wave"},
 +						{presetgroup: "pvanal"},
 +						{presetgroup: "applymode"}
 +					]
 +				},
 +				{
 +					name: "Granular",
 +					instr: "twst_tfi_spectralgrain1",
 +					description: "Frequency domain granular synthesis",
 +					parameters: [
 +						{name: "Grain duration", channel: "graindur", description: "Duration of grains in seconds", min: 0.05, max: 2, dfault: 0.2},
 +						{name: "Overlaps", channel: "layers", description: "Layers of grains", min: 1, max: 6, dfault: 1, step: 1, automatable: false},
 +						{name: "Rate randomness", channel: "freqrand", description: "Read rate randomness", min: 1, max: 3, dfault: 1},
 +						{name: "Duration randomness", channel: "durrand", description: "Grain duration randomness", min: 1, max: 3, dfault: 1},
 +						{name: "Pitch randomness", channel: "pitchrand", description: "Grain pitch randomness", min: 1, max: 3, dfault: 1},
 +						{name: "Read mode", channel: "readmode", description: "Grain reading mode", options: ["Linear", "Direct", "Scale", "Reverse"], dfault: 0},
 +						{name: "Read position", channel: "readtime", description: "Read time ratio", dfault: 0.5, conditions: [{channel: "readmode", operator: "eq", value: 1}]},
 +						{name: "Time scaling", channel: "timescale", description: "Time scaling factor", dfault: 1, min: 0.1, max: 10, conditions: [{channel: "readmode", operator: "eq", value: 2}], automatable: false},
 +						{name: "Portamento", channel: "porttime", description: "Resynthesis oscillator portamento time in seconds", dfault: 0.01, min: 0.01, max: 0.1},
 +						{presetgroup: "pitchscale"},
 +						{name: "Frequency bottom ratio", automatable: false, channel: "start", description: "Resynthesis bin start", dfault: 0, lagHint: 1},
 +						{name: "Frequency top ratio", dfault: 0.3, automatable: false, channel: "end", description: "Resynthesis bin end", lagHint: -1},
 +						{name: "Resynthesis waveform", preset: "wave"},
 +						{presetgroup: "pvanal"},
 +						{presetgroup: "applymode"}
 +					]
 +				},
 +				{
 +					name: "Residuals",
 +					instr: "twst_tf_residual",
 +					description: "Spectral resynthesis residuals",
 +					twine: true,
 +					parameters: [
 +						{preset: "fftsize"}
 +					]
 +				},
 +				/*{
 +					name: "Stencil",
 +					instr: "twst_tf_stencil",
 +					unstable: true,
 +					inputs: 2,
 +					parameters: [
 +						{preset: "instance"},
 +						{preset: "instanceloop"},
 +						{name: "Gain", description: "Pre processing gain", dfault: 1},
 +						{name: "Level", description: "Level of transformation", dfault: 1},
 +						{presetgroup: "pvanal"},
 +						{presetgroup: "pvsynth"},
 +						{presetgroup: "applymode"}
 +					]
 +					
 +				},*/
 +				{
 +					name: "Bubble",
 +					instr: "twst_tf_tpvbubble",
 +					description: "Randomly reset bin amplitudes to zero",
 +					twine: true,
 +					parameters: [
 +						{name: "Chance", description: "Chance of resetting bin amplitudes to 0", dfault: 0.5},
 +						{name: "Stereo unique", channel: "stereounique", description: "Whether to apply channel independently", dfault: 1, min: 0, max: 1, step: 1},
 +						{presetgroup: "pvanal"},
 +						{presetgroup: "pvsynth"},
 +						{presetgroup: "applymode"}
 +					]
 +				},
 +				{
 +					name: "Smear",
 +					instr: "twst_tf_tpvsmear",
 +					description: "Delay bin amplitudes",
 +					twine: true,
 +					parameters: [
 +						{name: "Maximum frames", channel: "maxframes", description: "Maximum number of frames to be used", automatable: false, min: 4, max: 32, step: 1, dfault: 16},
 +						{name: "Frames", description: "Number of frames to be used", min: 4, max: 32, step: 1, dfault: 16},
 +						{name: "Average frequencies", channel: "avgfreqs", description: "Average frequencies as well as smearing amplitudes", min: 0, max: 1, step: 1, dfault: 1},
 +						{name: "Include original", channel: "includeoriginal", description: "Include original frames in output", min: 0, max: 1, step: 1, dfault: 0},
 +						{presetgroup: "pvanal"},
 +						{presetgroup: "pvsynth"},
 +						{presetgroup: "applymode"}
 +					]
 +				},
 +				{
 +					name: "Read",
 +					instr: "twst_tf_spectralread",
 +					description: "Frequency domain sample reader",
 +					parameters: [
 +						{name: "Read position", channel: "readtime", description: "Read time ratio", dfault: 0},
 +						{presetgroup: "pvanal"},
 +						{presetgroup: "pvsynth"},
 +						{presetgroup: "applymode"}
 +					]
 +				},
 +				{
 +					name: "Partial reconstruction",
 +					instr: "twst_tf_partialreconstruction",
 +					description: "Streaming partials resynthesis",
 +					twine: true,
 +					parameters: [
 +						{name: "Threshold", description: "Analysis threshold factor", dfault: 0.5},
 +						{name: "Minimum points", channel: "minpoints", description: "Minimum analysis points", dfault: 1, min: 1, max: 10, lagHint: 1},
 +						{name: "Maximum gap", channel: "maxgap", description: "Maximum gap between analysis points", dfault: 3, min: 1, max: 10, lagHint: 1},
 +						{name: "Maximum analysis tracks", channel: "anlmaxtracks", description: "Maximum number of frequency tracks in analysis", automatable: false, lagHint: -1},
 +						{name: "Amplitude scale", channel: "ampscale", description: "Amplitude scaling"},
 +						{presetgroup: "pitchscale"},
 +						{name: "Maximum resynth tracks", channel: "resmaxtracks", description: "Maximum number of frequency tracks in resynthesis", lagHint: -1},
 +						{preset: "fftsize"},
 +						{preset: "wave"},
 +						{presetgroup: "applymode"}
 +					]
 +				},
 +				{
 +					name: "Invert",
 +					instr: "twst_tf_tpvinvert",
 +					description: "Invert frequency and/or amplitude",
 +					twine: true,
 +					parameters: [
 +						{name: "Invert frequency", channel: "invertfreq", description: "Perform inversion of frequency", dfault: 1, min: 0, max: 1, step: 1},
 +						{name: "Invert amplitude", channel: "invertamp", description: "Perform inversion of amplitude", dfault: 1, min: 0, max: 1, step: 1},
 +						{presetgroup: "pvanal"},
 +						{presetgroup: "pvsynth", dfault: 1},
 +						{presetgroup: "applymode"}
 +					]
 +				},
 +				{
 +					name: "Scramble",
 +					instr: "twst_tf_tpvscramble",
 +					twine: true,
 +					description: "Randomly reassign amplitude and/or frequency",
 +					parameters: [
 +						{name: "Sanity", channel: "step", description: "Retention of sanity in scrambling", dfault: 0, min: 0, max: 1},
 +						{name: "Amplitude", channel: "scrambleamp", description: "Apply scrambling to amplitude", dfault: 1, min: 0, max: 1, step: 1},
 +						{name: "Frequency", channel: "scramblefreq", description: "Apply scrambling to frequency", dfault: 1, min: 0, max: 1, step: 1},
 +						{presetgroup: "pvanal"},
 +						{presetgroup: "pvsynth"},
 +						{presetgroup: "applymode"}
 +					]
 +				},
 +				{
 +					name: "Frame gate",
 +					instr: "twst_tf_tpvthreshold",
 +					twine: true,
 +					description: "Bin-independent spectral gate",
 +					parameters: [
 +						{name: "Threshold", description: "Amplitude threshold", dfault: 0.5, min: 0, max: 1},
 +						{name: "Direction", description: "Apply to above or below threshold", dfault: 0, min: 0, max: 1, step: 1},
 +						{presetgroup: "pvanal"},
 +						{presetgroup: "pvsynth"},
 +						{presetgroup: "applymode"}
 +					]
 +				},
 +				{
 +					name: "Frame freeze",
 +					instr: "twst_tf_tpvfreeze",
 +					twine: true,
 +					description: "Freeze analysis frames",
 +					parameters: [
 +						{name: "Freeze amount", channel: "freeze", description: "Freeze amount", dfault: 1, min: 0, max: 1},
 +						{name: "Freeze amplitude", channel: "freezeamp", description: "Apply amplitude freeze", dfault: 0, min: 0, max: 1, step: 1},
 +						{name: "Freeze frequency", channel: "freezefreq", description: "Apply amplitude freeze", dfault: 0, min: 0, max: 1, step: 1},
 +						{name: "Apply crossfades", channel: "crossfade", dfault: 0, min: 0, max: 1, step: 1},
 +						{presetgroup: "pvanal"},
 +						{presetgroup: "pvsynth"},
 +						{presetgroup: "applymode"}
 +					]
 +				},
 +				{
 +					name: "Average",
 +					instr: "twst_tf_tpvaverage",
 +					twine: true,
 +					description: "Time-average frequency and/or amplitudes",
 +					parameters: [
 +						{name: "Average amplitudes", channel: "avgamp", dfault: 0, min: 0, max: 1, step: 1},
 +						{name: "Average frequencies", channel: "avgfreq", dfault: 1, min: 0, max: 1, step: 1},
 +						{name: "Maximum frames", description: "Maximum frames in average window", channel: "maxframes", dfault: 16, min: 2, max: 512, step: 1, lagHint: -1},
 +						{name: "Rate", description: "Rate of averaging in Hz", dfault: 1, min: 0.1, max: 10, lagHint: -1},
 +						{presetgroup: "pvanal"},
 +						{presetgroup: "pvsynth"},
 +						{presetgroup: "applymode"}
 +					]
 +				},
 +				{
 +					name: "Wrap",
 +					instr: "twst_tf_tpvwrap",
 +					twine: true,
 +					description: "Wrap amplitude and/or frequency bins",
 +					parameters: [
 +						{name: "Amplitude wrap bin ratio", channel: "wrapampbin", dfault: 0, min: 0, max: 3},
 +						{name: "Frequency wrap bin ratio", channel: "wrapfreqbin", dfault: 1, min: 0, max: 3},
 +						{presetgroup: "pvanal"},
 +						{presetgroup: "pvsynth"},
 +						{presetgroup: "applymode"}
 +					]
 +				},
 +				{
 +					name: "Swap",
 +					instr: "twst_tf_tpvswap",
 +					twine: true,
 +					description: "Swap amplitude and/or frequency bin ranges",
 +					parameters: [
 +						{name: "Amplitude start bin ratio", channel: "ampstart"},
 +						{name: "Amplitude length bin ratio", channel: "amplength", dfault: 0.1},
 +						{name: "Amplitude target bin ratio", channel: "amptarget"},
 +						{name: "Frequency start bin ratio", channel: "freqstart"},
 +						{name: "Frequency length bin ratio", channel: "freqlength", dfault: 0.1},
 +						{name: "Frequency target bin ratio", channel: "freqtarget"},
 +						{name: "Wrap mode", channel: "wrapmode", options: ["Limit", "Wrap"], dfault: 1, automatable: true},
 +						{presetgroup: "pvanal"},
 +						{presetgroup: "pvsynth"},
 +						{presetgroup: "applymode"}
 +					]
 +				},
 +				{
 +					name: "Centroid oscillator",
 +					instr: "twst_tf_centroidoscillator",
 +					twine: true,
 +					description: "Oscillate at the analysed spectral centroid",
 +					parameters: [
 +						{preset: "wave", automatable: true},
 +						{presetgroup: "pitchscale"},
 +						{name: "Portamento time", channel: "porttime", description: "Reading position glide", dfault: 0.01, min: 0.001, max: 0.3},
 +						{presetgroup: "pvanal"},
 +						{presetgroup: "applymode"}
 +					]
 +				},
 +				{
 +					name: "Bin oscillator",
 +					instr: "twst_tf_binoscillator",
 +					twine: true,
 +					description: "Resynthesise a single analysis bin",
 +					parameters: [
 +						{name: "Bin ratio", channel: "bin", description: "Frequency bin ratio", dfault: 0.1, min: 0, max: 1},
 +						{preset: "wave", automatable: true},
 +						{presetgroup: "pitchscale"},
 +						{name: "Portamento time", channel: "porttime", description: "Reading position glide", dfault: 0.01, min: 0.001, max: 0.3},
 +						{presetgroup: "pvanal"},
 +						{presetgroup: "applymode"}
 +					]
 +				},
 +				{
 +					name: "Stochastic subtractive", 
 +					instr: "twst_tf_subtractive",
 +					description: "Parametric aleatoric subtractive synthesis",
 +					twine: true,
 +					unstable: true,
 +					parameters: [
 +						{preset: "amp", automatable: false},
 +						{presetgroup: "notefreq", nameprepend: "Minimum", dfault: 440, channelprepend: "min", automatable: false, lagHint: 1},
 +						{presetgroup: "notefreq", nameprepend: "Maximum", dfault: 8000, channelprepend: "max", automatable: false, lagHint: -1},
 +						{name: "Frequency increment", channel: "step", automatable: false, min: 1.1, max: 2, dfault: 1, lagHint: 1},
 +						{name: "Frequency randomness", channel: "steprand", automatable: false, min: 1, max: 1.5, dfault: 1},
 +						{name: "Amplitude increment", channel: "ampmult", automatable: false, min: 0.2, max: 1, dfault: 0.6},
 +						{presetgroup: "applymode"}
 +					]
 +				},
 +				{
 +					name: "Phase masher",
 +					instr: "twst_tf_phasemash",
 +					twine: true,
 +					description: "Phase modification and reset",
 +					parameters: [
 +						{name: "Replace phase", min: 0, max: 1, step: 1, dfault: 0, channel: "phasereplace"},
 +						{name: "Phase alteration", min: 0, max: 1, dfault: 0.5, channel: "phasevalue"},
 +						{preset: "fftsize"},
 +						{presetgroup: "applymode"}
 +					]
 +				}
 +			]
 +		}
 +	]
 +};
\ No newline at end of file |