From 9fbf91db06a6d4f4b5cd8bb45389a731bb86bf22 Mon Sep 17 00:00:00 2001 From: Richard Date: Sun, 13 Apr 2025 18:48:02 +0100 Subject: initial --- site/app/twirl/appdata.js | 1427 +++++++++++++++++++++++++ site/app/twirl/font/Chicago.woff | Bin 0 -> 15020 bytes site/app/twirl/font/JosefinSans.ttf | Bin 0 -> 117720 bytes site/app/twirl/font/NationalPark-Regular.woff | Bin 0 -> 18140 bytes site/app/twirl/font/Nouveau_IBM.woff | Bin 0 -> 29380 bytes site/app/twirl/icon/areaSelect.svg | 1 + site/app/twirl/icon/arrowsUpDown.svg | 1 + site/app/twirl/icon/audition.svg | 1 + site/app/twirl/icon/automate.svg | 1 + site/app/twirl/icon/brightnessDecrease.svg | 1 + site/app/twirl/icon/brightnessIncrease.svg | 1 + site/app/twirl/icon/close.svg | 1 + site/app/twirl/icon/commit.svg | 1 + site/app/twirl/icon/copy.svg | 1 + site/app/twirl/icon/crossfade.svg | 1 + site/app/twirl/icon/cut.svg | 1 + site/app/twirl/icon/delete.svg | 1 + site/app/twirl/icon/develop.svg | 1 + site/app/twirl/icon/ear.svg | 1 + site/app/twirl/icon/fileVolume.svg | 1 + site/app/twirl/icon/hand.svg | 1 + site/app/twirl/icon/hide.svg | 1 + site/app/twirl/icon/horizontalArrows.svg | 1 + site/app/twirl/icon/horizontalFold.svg | 1 + site/app/twirl/icon/lasso.svg | 1 + site/app/twirl/icon/loop.svg | 1 + site/app/twirl/icon/modulate.svg | 1 + site/app/twirl/icon/move.svg | 1 + site/app/twirl/icon/paste.svg | 1 + site/app/twirl/icon/pasteSpecial.svg | 1 + site/app/twirl/icon/pencil.svg | 1 + site/app/twirl/icon/play.svg | 1 + site/app/twirl/icon/pointer.svg | 1 + site/app/twirl/icon/randomise.svg | 1 + site/app/twirl/icon/record.svg | 1 + site/app/twirl/icon/redo.svg | 1 + site/app/twirl/icon/reset.svg | 1 + site/app/twirl/icon/rewind.svg | 1 + site/app/twirl/icon/save.svg | 1 + site/app/twirl/icon/script.svg | 1 + site/app/twirl/icon/show.svg | 1 + site/app/twirl/icon/showAll.svg | 1 + site/app/twirl/icon/stop.svg | 1 + site/app/twirl/icon/trim.svg | 1 + site/app/twirl/icon/undo.svg | 1 + site/app/twirl/icon/verticalArrows.svg | 1 + site/app/twirl/icon/verticalFold.svg | 1 + site/app/twirl/icon/waves.svg | 1 + site/app/twirl/icon/zoomIn.svg | 1 + site/app/twirl/icon/zoomOut.svg | 1 + site/app/twirl/icon/zoomSelection.svg | 1 + site/app/twirl/notedata.json | 1 + site/app/twirl/stdui.js | 494 +++++++++ site/app/twirl/theme.css | 284 +++++ site/app/twirl/transform.js | 1212 +++++++++++++++++++++ site/app/twirl/twirl.css | 310 ++++++ site/app/twirl/twirl.js | 479 +++++++++ site/app/twirl/twirl_compiler.py | 92 ++ 58 files changed, 4345 insertions(+) create mode 100644 site/app/twirl/appdata.js create mode 100644 site/app/twirl/font/Chicago.woff create mode 100644 site/app/twirl/font/JosefinSans.ttf create mode 100644 site/app/twirl/font/NationalPark-Regular.woff create mode 100644 site/app/twirl/font/Nouveau_IBM.woff create mode 100644 site/app/twirl/icon/areaSelect.svg create mode 100644 site/app/twirl/icon/arrowsUpDown.svg create mode 100644 site/app/twirl/icon/audition.svg create mode 100644 site/app/twirl/icon/automate.svg create mode 100644 site/app/twirl/icon/brightnessDecrease.svg create mode 100644 site/app/twirl/icon/brightnessIncrease.svg create mode 100644 site/app/twirl/icon/close.svg create mode 100644 site/app/twirl/icon/commit.svg create mode 100644 site/app/twirl/icon/copy.svg create mode 100644 site/app/twirl/icon/crossfade.svg create mode 100644 site/app/twirl/icon/cut.svg create mode 100644 site/app/twirl/icon/delete.svg create mode 100644 site/app/twirl/icon/develop.svg create mode 100644 site/app/twirl/icon/ear.svg create mode 100644 site/app/twirl/icon/fileVolume.svg create mode 100644 site/app/twirl/icon/hand.svg create mode 100644 site/app/twirl/icon/hide.svg create mode 100644 site/app/twirl/icon/horizontalArrows.svg create mode 100644 site/app/twirl/icon/horizontalFold.svg create mode 100644 site/app/twirl/icon/lasso.svg create mode 100644 site/app/twirl/icon/loop.svg create mode 100644 site/app/twirl/icon/modulate.svg create mode 100644 site/app/twirl/icon/move.svg create mode 100644 site/app/twirl/icon/paste.svg create mode 100644 site/app/twirl/icon/pasteSpecial.svg create mode 100644 site/app/twirl/icon/pencil.svg create mode 100644 site/app/twirl/icon/play.svg create mode 100644 site/app/twirl/icon/pointer.svg create mode 100644 site/app/twirl/icon/randomise.svg create mode 100644 site/app/twirl/icon/record.svg create mode 100644 site/app/twirl/icon/redo.svg create mode 100644 site/app/twirl/icon/reset.svg create mode 100644 site/app/twirl/icon/rewind.svg create mode 100644 site/app/twirl/icon/save.svg create mode 100644 site/app/twirl/icon/script.svg create mode 100644 site/app/twirl/icon/show.svg create mode 100644 site/app/twirl/icon/showAll.svg create mode 100644 site/app/twirl/icon/stop.svg create mode 100644 site/app/twirl/icon/trim.svg create mode 100644 site/app/twirl/icon/undo.svg create mode 100644 site/app/twirl/icon/verticalArrows.svg create mode 100644 site/app/twirl/icon/verticalFold.svg create mode 100644 site/app/twirl/icon/waves.svg create mode 100644 site/app/twirl/icon/zoomIn.svg create mode 100644 site/app/twirl/icon/zoomOut.svg create mode 100644 site/app/twirl/icon/zoomSelection.svg create mode 100644 site/app/twirl/notedata.json create mode 100644 site/app/twirl/stdui.js create mode 100644 site/app/twirl/theme.css create mode 100644 site/app/twirl/transform.js create mode 100644 site/app/twirl/twirl.css create mode 100644 site/app/twirl/twirl.js create mode 100644 site/app/twirl/twirl_compiler.py (limited to 'site/app/twirl') 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 diff --git a/site/app/twirl/font/Chicago.woff b/site/app/twirl/font/Chicago.woff new file mode 100644 index 0000000..0ae3393 Binary files /dev/null and b/site/app/twirl/font/Chicago.woff differ diff --git a/site/app/twirl/font/JosefinSans.ttf b/site/app/twirl/font/JosefinSans.ttf new file mode 100644 index 0000000..00ea1e7 Binary files /dev/null and b/site/app/twirl/font/JosefinSans.ttf differ diff --git a/site/app/twirl/font/NationalPark-Regular.woff b/site/app/twirl/font/NationalPark-Regular.woff new file mode 100644 index 0000000..7766e9b Binary files /dev/null and b/site/app/twirl/font/NationalPark-Regular.woff differ diff --git a/site/app/twirl/font/Nouveau_IBM.woff b/site/app/twirl/font/Nouveau_IBM.woff new file mode 100644 index 0000000..0912b18 Binary files /dev/null and b/site/app/twirl/font/Nouveau_IBM.woff differ diff --git a/site/app/twirl/icon/areaSelect.svg b/site/app/twirl/icon/areaSelect.svg new file mode 100644 index 0000000..dc0549c --- /dev/null +++ b/site/app/twirl/icon/areaSelect.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/site/app/twirl/icon/arrowsUpDown.svg b/site/app/twirl/icon/arrowsUpDown.svg new file mode 100644 index 0000000..8ecaa91 --- /dev/null +++ b/site/app/twirl/icon/arrowsUpDown.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/site/app/twirl/icon/audition.svg b/site/app/twirl/icon/audition.svg new file mode 100644 index 0000000..d4a3dea --- /dev/null +++ b/site/app/twirl/icon/audition.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/site/app/twirl/icon/automate.svg b/site/app/twirl/icon/automate.svg new file mode 100644 index 0000000..16a9705 --- /dev/null +++ b/site/app/twirl/icon/automate.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/site/app/twirl/icon/brightnessDecrease.svg b/site/app/twirl/icon/brightnessDecrease.svg new file mode 100644 index 0000000..4685dae --- /dev/null +++ b/site/app/twirl/icon/brightnessDecrease.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/site/app/twirl/icon/brightnessIncrease.svg b/site/app/twirl/icon/brightnessIncrease.svg new file mode 100644 index 0000000..12f688b --- /dev/null +++ b/site/app/twirl/icon/brightnessIncrease.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/site/app/twirl/icon/close.svg b/site/app/twirl/icon/close.svg new file mode 100644 index 0000000..fa22a65 --- /dev/null +++ b/site/app/twirl/icon/close.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/site/app/twirl/icon/commit.svg b/site/app/twirl/icon/commit.svg new file mode 100644 index 0000000..b00c67b --- /dev/null +++ b/site/app/twirl/icon/commit.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/site/app/twirl/icon/copy.svg b/site/app/twirl/icon/copy.svg new file mode 100644 index 0000000..84d777d --- /dev/null +++ b/site/app/twirl/icon/copy.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/site/app/twirl/icon/crossfade.svg b/site/app/twirl/icon/crossfade.svg new file mode 100644 index 0000000..ca5f34e --- /dev/null +++ b/site/app/twirl/icon/crossfade.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/site/app/twirl/icon/cut.svg b/site/app/twirl/icon/cut.svg new file mode 100644 index 0000000..ca0a485 --- /dev/null +++ b/site/app/twirl/icon/cut.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/site/app/twirl/icon/delete.svg b/site/app/twirl/icon/delete.svg new file mode 100644 index 0000000..b1d974f --- /dev/null +++ b/site/app/twirl/icon/delete.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/site/app/twirl/icon/develop.svg b/site/app/twirl/icon/develop.svg new file mode 100644 index 0000000..9d3f535 --- /dev/null +++ b/site/app/twirl/icon/develop.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/site/app/twirl/icon/ear.svg b/site/app/twirl/icon/ear.svg new file mode 100644 index 0000000..d2cb61a --- /dev/null +++ b/site/app/twirl/icon/ear.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/site/app/twirl/icon/fileVolume.svg b/site/app/twirl/icon/fileVolume.svg new file mode 100644 index 0000000..ee81c71 --- /dev/null +++ b/site/app/twirl/icon/fileVolume.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/site/app/twirl/icon/hand.svg b/site/app/twirl/icon/hand.svg new file mode 100644 index 0000000..b258330 --- /dev/null +++ b/site/app/twirl/icon/hand.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/site/app/twirl/icon/hide.svg b/site/app/twirl/icon/hide.svg new file mode 100644 index 0000000..1b66ce0 --- /dev/null +++ b/site/app/twirl/icon/hide.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/site/app/twirl/icon/horizontalArrows.svg b/site/app/twirl/icon/horizontalArrows.svg new file mode 100644 index 0000000..3187142 --- /dev/null +++ b/site/app/twirl/icon/horizontalArrows.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/site/app/twirl/icon/horizontalFold.svg b/site/app/twirl/icon/horizontalFold.svg new file mode 100644 index 0000000..4c80762 --- /dev/null +++ b/site/app/twirl/icon/horizontalFold.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/site/app/twirl/icon/lasso.svg b/site/app/twirl/icon/lasso.svg new file mode 100644 index 0000000..bbf7602 --- /dev/null +++ b/site/app/twirl/icon/lasso.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/site/app/twirl/icon/loop.svg b/site/app/twirl/icon/loop.svg new file mode 100644 index 0000000..b5eef47 --- /dev/null +++ b/site/app/twirl/icon/loop.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/site/app/twirl/icon/modulate.svg b/site/app/twirl/icon/modulate.svg new file mode 100644 index 0000000..891ded8 --- /dev/null +++ b/site/app/twirl/icon/modulate.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/site/app/twirl/icon/move.svg b/site/app/twirl/icon/move.svg new file mode 100644 index 0000000..1f839f4 --- /dev/null +++ b/site/app/twirl/icon/move.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/site/app/twirl/icon/paste.svg b/site/app/twirl/icon/paste.svg new file mode 100644 index 0000000..0f94433 --- /dev/null +++ b/site/app/twirl/icon/paste.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/site/app/twirl/icon/pasteSpecial.svg b/site/app/twirl/icon/pasteSpecial.svg new file mode 100644 index 0000000..387b56b --- /dev/null +++ b/site/app/twirl/icon/pasteSpecial.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/site/app/twirl/icon/pencil.svg b/site/app/twirl/icon/pencil.svg new file mode 100644 index 0000000..8d5e050 --- /dev/null +++ b/site/app/twirl/icon/pencil.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/site/app/twirl/icon/play.svg b/site/app/twirl/icon/play.svg new file mode 100644 index 0000000..f089aa1 --- /dev/null +++ b/site/app/twirl/icon/play.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/site/app/twirl/icon/pointer.svg b/site/app/twirl/icon/pointer.svg new file mode 100644 index 0000000..2180fb9 --- /dev/null +++ b/site/app/twirl/icon/pointer.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/site/app/twirl/icon/randomise.svg b/site/app/twirl/icon/randomise.svg new file mode 100644 index 0000000..73e0c43 --- /dev/null +++ b/site/app/twirl/icon/randomise.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/site/app/twirl/icon/record.svg b/site/app/twirl/icon/record.svg new file mode 100644 index 0000000..726d9f1 --- /dev/null +++ b/site/app/twirl/icon/record.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/site/app/twirl/icon/redo.svg b/site/app/twirl/icon/redo.svg new file mode 100644 index 0000000..c6dbd45 --- /dev/null +++ b/site/app/twirl/icon/redo.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/site/app/twirl/icon/reset.svg b/site/app/twirl/icon/reset.svg new file mode 100644 index 0000000..f28f3db --- /dev/null +++ b/site/app/twirl/icon/reset.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/site/app/twirl/icon/rewind.svg b/site/app/twirl/icon/rewind.svg new file mode 100644 index 0000000..4aa6f48 --- /dev/null +++ b/site/app/twirl/icon/rewind.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/site/app/twirl/icon/save.svg b/site/app/twirl/icon/save.svg new file mode 100644 index 0000000..1fec9b0 --- /dev/null +++ b/site/app/twirl/icon/save.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/site/app/twirl/icon/script.svg b/site/app/twirl/icon/script.svg new file mode 100644 index 0000000..85069c6 --- /dev/null +++ b/site/app/twirl/icon/script.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/site/app/twirl/icon/show.svg b/site/app/twirl/icon/show.svg new file mode 100644 index 0000000..8ca30ae --- /dev/null +++ b/site/app/twirl/icon/show.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/site/app/twirl/icon/showAll.svg b/site/app/twirl/icon/showAll.svg new file mode 100644 index 0000000..ceb57c5 --- /dev/null +++ b/site/app/twirl/icon/showAll.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/site/app/twirl/icon/stop.svg b/site/app/twirl/icon/stop.svg new file mode 100644 index 0000000..f5e9c24 --- /dev/null +++ b/site/app/twirl/icon/stop.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/site/app/twirl/icon/trim.svg b/site/app/twirl/icon/trim.svg new file mode 100644 index 0000000..d7664d1 --- /dev/null +++ b/site/app/twirl/icon/trim.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/site/app/twirl/icon/undo.svg b/site/app/twirl/icon/undo.svg new file mode 100644 index 0000000..0bc90dd --- /dev/null +++ b/site/app/twirl/icon/undo.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/site/app/twirl/icon/verticalArrows.svg b/site/app/twirl/icon/verticalArrows.svg new file mode 100644 index 0000000..518673d --- /dev/null +++ b/site/app/twirl/icon/verticalArrows.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/site/app/twirl/icon/verticalFold.svg b/site/app/twirl/icon/verticalFold.svg new file mode 100644 index 0000000..a21f94b --- /dev/null +++ b/site/app/twirl/icon/verticalFold.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/site/app/twirl/icon/waves.svg b/site/app/twirl/icon/waves.svg new file mode 100644 index 0000000..5cccfbf --- /dev/null +++ b/site/app/twirl/icon/waves.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/site/app/twirl/icon/zoomIn.svg b/site/app/twirl/icon/zoomIn.svg new file mode 100644 index 0000000..deaf812 --- /dev/null +++ b/site/app/twirl/icon/zoomIn.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/site/app/twirl/icon/zoomOut.svg b/site/app/twirl/icon/zoomOut.svg new file mode 100644 index 0000000..0dab381 --- /dev/null +++ b/site/app/twirl/icon/zoomOut.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/site/app/twirl/icon/zoomSelection.svg b/site/app/twirl/icon/zoomSelection.svg new file mode 100644 index 0000000..76100e1 --- /dev/null +++ b/site/app/twirl/icon/zoomSelection.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/site/app/twirl/notedata.json b/site/app/twirl/notedata.json new file mode 100644 index 0000000..696eae0 --- /dev/null +++ b/site/app/twirl/notedata.json @@ -0,0 +1 @@ +{"notes": [[0, "", 8.18],[1, "", 8.66],[2, "", 9.18],[3, "", 9.72],[4, "", 10.30],[5, "", 10.91],[6, "", 11.56],[7, "", 12.25],[8, "", 12.98],[9, "", 13.75],[10, "", 14.57],[11, "", 15.43],[12, "", 16.35],[13, "", 17.32],[14, "", 18.35],[15, "", 19.45],[16, "", 20.60],[17, "", 21.83],[18, "", 23.12],[19, "", 24.50],[20, "", 25.96],[21, "A0", 27.50],[22, "A#0/Bb0", 29.14],[23, "B0", 30.87],[24, "C1", 32.70],[25, "C#1/Db1", 34.65],[26, "D1", 36.71],[27, "D#1/Eb1", 38.89],[28, "E1", 41.20],[29, "F1", 43.65],[30, "F#1/Gb1", 46.25],[31, "G1", 49.00],[32, "G#1/Ab1", 51.91],[33, "A1", 55.00],[34, "A#1/Bb1", 58.27],[35, "B1", 61.74],[36, "C2", 65.41],[37, "C#2/Db2", 69.30],[38, "D2", 73.42],[39, "D#2/Eb2", 77.78],[40, "E2", 82.41],[41, "F2", 87.31],[42, "F#2/Gb2", 92.50],[43, "G2", 98.00],[44, "G#2/Ab2", 103.83],[45, "A2", 110.00],[46, "A#2/Bb2", 116.54],[47, "B2", 123.47],[48, "C3", 130.81],[49, "C#3/Db3", 138.59],[50, "D3", 146.83],[51, "D#3/Eb3", 155.56],[52, "E3", 164.81],[53, "F3", 174.61],[54, "F#3/Gb3", 185.00],[55, "G3", 196.00],[56, "G#3/Ab3", 207.65],[57, "A3", 220.00],[58, "A#3/Bb3", 233.08],[59, "B3", 246.94],[60, "C4", 261.63],[61, "C#4/Db4", 277.18],[62, "D4", 293.66],[63, "D#4/Eb4", 311.13],[64, "E4", 329.63],[65, "F4", 349.23],[66, "F#4/Gb4", 369.99],[67, "G4", 392.00],[68, "G#4/Ab4", 415.30],[69, "A4", 440.00],[70, "A#4/Bb4", 466.16],[71, "B4", 493.88],[72, "C5", 523.25],[73, "C#5/Db5", 554.37],[74, "D5", 587.33],[75, "D#5/Eb5", 622.25],[76, "E5", 659.26],[77, "F5", 698.46],[78, "F#5/Gb5", 739.99],[79, "G5", 783.99],[80, "G#5/Ab5", 830.61],[81, "A5", 880.00],[82, "A#5/Bb5", 932.33],[83, "B5", 987.77],[84, "C6", 1046.50],[85, "C#6/Db6", 1108.73],[86, "D6", 1174.66],[87, "D#6/Eb6", 1244.51],[88, "E6", 1318.51],[89, "F6", 1396.91],[90, "F#6/Gb6", 1479.98],[91, "G6", 1567.98],[92, "G#6/Ab6", 1661.22],[93, "A6", 1760.00],[94, "A#6/Bb6", 1864.66],[95, "B6", 1975.53],[96, "C7", 2093.00],[97, "C#7/Db7", 2217.46],[98, "D7", 2349.32],[99, "D#7/Eb7", 2489.02],[100, "E7", 2637.02],[101, "F7", 2793.83],[102, "F#7/Gb7", 2959.96],[103, "G7", 3135.96],[104, "G#7/Ab7", 3322.44],[105, "A7", 3520.00],[106, "A#7/Bb7", 3729.31],[107, "B7", 3951.07],[108, "C8", 4186.01],[109, "C#8/Db8", 4434.92],[110, "D8", 4698.64],[111, "D#8/Eb8", 4978.03],[112, "E8", 5274.04],[113, "F8", 5587.65],[114, "F#8/Gb8", 5919.91],[115, "G8", 6271.93],[116, "G#8/Ab8", 6644.88],[117, "A8", 7040.00],[118, "A#8/Bb8", 7458.62],[119, "B8", 7902.13],[120, "C9", 8372.02],[121, "C#9/Db9", 8869.84],[122, "D9", 9397.27],[123, "D#9/Eb9", 9956.06],[124, "E9", 10548.08],[125, "F9", 11175.30],[126, "F#9/Gb9", 11839.82],[127, "G9", 12543.85],[128, "G#9/Ab9", 13289.75]],"chords": [{"intervals": [0, 4, 8], "name": "Augmented"}, {"intervals": [0, 4, 7, 10, 2, 6], "name": "Augmented 11th"}, {"intervals": [0, 4, 8, 11], "name": "Augmented major 7th"}, {"intervals": [0, 4, 8, 10], "name": "Augmented 7th"}, {"intervals": [0, 6, 8], "name": "Augmented 6th"}, {"intervals": [0, 3, 6], "name": "Diminished"}, {"intervals": [0, 3, 6, 11], "name": "Diminished major 7th"}, {"intervals": [0, 3, 6, 9], "name": "Diminished 7th"}, {"intervals": [0, 4, 7], "name": "Dominant"}, {"intervals": [0, 4, 7, 10, 2, 5], "name": "Dominant 11th"}, {"intervals": [0, 4, 7, 10, 1], "name": "Dominant minor 9th"}, {"intervals": [0, 4, 7, 10, 2], "name": "Dominant 9th"}, {"intervals": [0, 3, 7], "name": "Dominant parallel"}, {"intervals": [0, 4, 7, 10], "name": "Dominant 7th"}, {"intervals": [0, 4, 6, 10], "name": "Dominant 7th b5"}, {"intervals": [0, 4, 7, 10, 2, 5, 9], "name": "Dominant 13th"}, {"intervals": [0, 5, 6, 7], "name": "Dream"}, {"intervals": [0, 7, 9, 1, 4], "name": "Elektra"}, {"intervals": [0, 8, 11, 4, 9], "name": "Farben"}, {"intervals": [0, 4, 7, 10], "name": "Harmonic 7th"}, {"intervals": [0, 4, 7, 10, 3], "name": "Augmented 9th"}, {"intervals": [0, 3, 6], "name": "Leading-tone"}, {"intervals": [0, 4, 7, 11, 6], "name": "Lydian"}, {"intervals": [0, 4, 7], "name": "Major"}, {"intervals": [0, 4, 7, 11, 2, 5], "name": "Major 11th"}, {"intervals": [0, 4, 7, 11], "name": "Major 7th"}, {"intervals": [0, 4, 7, 11, 6], "name": "Major 7th #11th"}, {"intervals": [0, 4, 7, 9], "name": "Major 6th"}, {"intervals": [0, 4, 7, 11, 2], "name": "Major 9th"}, {"intervals": [0, 4, 7, 11, 2, 6, 9], "name": "Major 13th"}, {"intervals": [0, 3, 7], "name": "Mediant"}, {"intervals": [0, 3, 7], "name": "Minor"}, {"intervals": [0, 3, 7, 10, 2, 5], "name": "Minor 11th"}, {"intervals": [0, 3, 7, 11], "name": "Minor major 7th"}, {"intervals": [0, 3, 7, 10, 2], "name": "Minor 9th"}, {"intervals": [0, 3, 7, 10], "name": "Minor 7th"}, {"intervals": [0, 3, 6, 10], "name": "Half-diminished 7th"}, {"intervals": [0, 3, 7, 9], "name": "Minor 6th"}, {"intervals": [0, 3, 7, 10, 2, 5, 9], "name": "Minor 13th"}, {"intervals": [0, 2, 4, 7], "name": "Mu"}, {"intervals": [0, 6, 10, 4, 9, 2], "name": "Mystic"}, {"intervals": [1, 5, 8], "name": "Neapolitan"}, {"intervals": [0, 4, 8, 10, 2], "name": "Ninth augmented 5th"}, {"intervals": [0, 4, 6, 10, 2], "name": "Ninth b5th"}, {"intervals": [1, 2, 8, 0, 3, 6, 7, 10, 11, 4, 7], "name": "Northern Lights"}, {"intervals": [0, 1, 4, 5, 8, 9], "name": "Napoleon hexachord"}, {"intervals": [0, 1, 4, 6, 7, 10], "name": "Petrushka"}, {"intervals": [0, 7], "name": "Power"}, {"intervals": [0, 3, 7], "name": "Psalms"}, {"intervals": [0, 4, 7], "name": "Secondary dominant"}, {"intervals": [0, 3, 6], "name": "Secondary leading-tone"}, {"intervals": [0, 3, 7], "name": "Secondary supertonic"}, {"intervals": [0, 4, 7, 9, 10], "name": "Seven six"}, {"intervals": [0, 4, 7, 10, 1], "name": "7th b9"}, {"intervals": [0, 5, 7, 10], "name": "7th suspension 4"}, {"intervals": [0, 4, 7, 9, 2], "name": "Sixth 9th"}, {"intervals": [0, 5, 7], "name": "Suspended"}, {"intervals": [0, 4, 7], "name": "Subdominant"}, {"intervals": [0, 3, 7], "name": "Subdominant parallel"}, {"intervals": [0, 3, 7], "name": "Submediant"}, {"intervals": [0, 4, 7], "name": "Subtonic"}, {"intervals": [0, 3, 7], "name": "Supertonic"}, {"intervals": [0, 5, 10, 3, 7], "name": "So What"}, {"intervals": [0, 4, 7, 10, 1, 9], "name": "Thirteenth b9th"}, {"intervals": [0, 4, 6, 10, 1, 9], "name": "Thirteenth b9th b5th"}, {"intervals": [0, 3, 7], "name": "Tonic counter parallel"}, {"intervals": [0, 4, 7], "name": "Tonic"}, {"intervals": [0, 3, 7], "name": "Tonic parallel"}, {"intervals": [0, 3, 6, 10], "name": "Tristan"}, {"intervals": [0, 1, 6], "name": "Viennese trichord 1"}, {"intervals": [0, 6, 7], "name": "Viennese trichord 2"}]} \ No newline at end of file diff --git a/site/app/twirl/stdui.js b/site/app/twirl/stdui.js new file mode 100644 index 0000000..8141912 --- /dev/null +++ b/site/app/twirl/stdui.js @@ -0,0 +1,494 @@ +twirl.stdui = { + PlayButton: function(options) { + var self = this; + var txtPlay = "\u25b6"; + var txtStop = "\u23f9"; + + this.state = false; + + this.element = $("

").text(txtPlay).css("cursor", "pointer"); + + if (options.hasOwnProperty("fontsize")) { + this.element.css("font-size", options.fontsize); + } + + this.show = function() { + self.element.css("visibility", "visible"); + }; + + this.hide = function() { + self.element.css("visibility", "hidden"); + }; + + this.element.click(function() { + if (!self.state) { + self.element.text(txtStop); + self.state = true; + } else { + self.element.text(txtPlay); + self.state = false; + } + if (options.stateAlter) { + options.stateAlter(self.state, self); + } + if (options.hasOwnProperty("change")) { + options.change(self.state, self); + } + }); + + this.setValue = function(v, runChange) { + if (v) { + self.element.text(txtStop); + self.state = true; + } else { + self.element.text(txtPlay); + self.state = false; + } + + if (runChange && options.hasOwnProperty("change")) { + options.change(self.state, self); + } + }; + + if (options.tooltip) { + this.element.on("mouseover", function(e){ + twirl.tooltip.show(e, options.tooltip); + }).on("mouseout", function(){ + twirl.tooltip.hide(); + }); + } + + if (options.target) { + $("#" + options.target).append(this.element); + } + }, + StandardButton: function(options) { + var self = this; + this.element = $("