From 6e0eac1d4e2a8437759c71d6cfadd353d711186e Mon Sep 17 00:00:00 2001 From: Stefan Herzog Date: Sun, 2 Feb 2025 23:10:06 +0100 Subject: [PATCH 01/11] add first set of templates + docs --- contrib/midi_follow/roto_control/README.md | 5 + .../all_parameters/Deluge P1.json | 1065 +++++++++++++++++ .../all_parameters/Deluge P2.json | 1032 ++++++++++++++++ .../all_parameters/Deluge P3.json | 471 ++++++++ .../roto_control/all_parameters/README.md | 135 +++ .../roto_control/roto-control_summarize.py | 152 +++ 6 files changed, 2860 insertions(+) create mode 100644 contrib/midi_follow/roto_control/README.md create mode 100644 contrib/midi_follow/roto_control/all_parameters/Deluge P1.json create mode 100644 contrib/midi_follow/roto_control/all_parameters/Deluge P2.json create mode 100644 contrib/midi_follow/roto_control/all_parameters/Deluge P3.json create mode 100644 contrib/midi_follow/roto_control/all_parameters/README.md create mode 100644 contrib/midi_follow/roto_control/roto-control_summarize.py diff --git a/contrib/midi_follow/roto_control/README.md b/contrib/midi_follow/roto_control/README.md new file mode 100644 index 0000000000..739eea3f55 --- /dev/null +++ b/contrib/midi_follow/roto_control/README.md @@ -0,0 +1,5 @@ +# MIDI Follow Mode templates for Melbourne Instruments' Roto-Control motorized MIDI controller + +The subfolders contain MIDI Follow Mode templates for [Melbourne Instruments' Roto-Control motorized MIDI controller](https://www.melbourneinstruments.com/rotocontrol). All templates use MIDI channel 15. See each folders `README.md` file for more specific information about the templates. + +`roto-control_summarize.py` is a python script that takes one or more Roto-Control setup `.json`-files and creates a summary table of the mapped parameters. Enter `python3 roto-control_summarize.py -h` in your terminal to see its documentation. diff --git a/contrib/midi_follow/roto_control/all_parameters/Deluge P1.json b/contrib/midi_follow/roto_control/all_parameters/Deluge P1.json new file mode 100644 index 0000000000..2b6372cc14 --- /dev/null +++ b/contrib/midi_follow/roto_control/all_parameters/Deluge P1.json @@ -0,0 +1,1065 @@ +{ + "version": 1, + "type": "MIDI", + "name": "Deluge P1", + "index": 2, + "knobs": [ + { + "controlIndex": 0, + "controlMode": 0, + "controlChannel": 15, + "controlParam": 7, + "nrpnAddress": 0, + "minValue": 0, + "maxValue": 127, + "controlName": "Master", + "colorScheme": 13, + "hapticMode": 0, + "hapticIndent1": 255, + "hapticIndent2": 255, + "hapticSteps": 0, + "stepNames": [ + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "" + ] + }, + { + "controlIndex": 1, + "controlMode": 0, + "controlChannel": 15, + "controlParam": 10, + "nrpnAddress": 0, + "minValue": 0, + "maxValue": 127, + "controlName": "Panning", + "colorScheme": 13, + "hapticMode": 0, + "hapticIndent1": 64, + "hapticIndent2": 255, + "hapticSteps": 0, + "stepNames": [ + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "" + ] + }, + { + "controlIndex": 2, + "controlMode": 0, + "controlChannel": 15, + "controlParam": 3, + "nrpnAddress": 0, + "minValue": 0, + "maxValue": 127, + "controlName": "Pitch", + "colorScheme": 13, + "hapticMode": 0, + "hapticIndent1": 64, + "hapticIndent2": 255, + "hapticSteps": 0, + "stepNames": [ + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "" + ] + }, + { + "controlIndex": 3, + "controlMode": 0, + "controlChannel": 15, + "controlParam": 5, + "nrpnAddress": 0, + "minValue": 0, + "maxValue": 127, + "controlName": "Portamento", + "colorScheme": 13, + "hapticMode": 0, + "hapticIndent1": 255, + "hapticIndent2": 255, + "hapticSteps": 0, + "stepNames": [ + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "" + ] + }, + { + "controlIndex": 4, + "controlMode": 0, + "controlChannel": 15, + "controlParam": 74, + "nrpnAddress": 0, + "minValue": 0, + "maxValue": 127, + "controlName": "LPF Cutoff", + "colorScheme": 71, + "hapticMode": 0, + "hapticIndent1": 255, + "hapticIndent2": 255, + "hapticSteps": 0, + "stepNames": [ + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "" + ] + }, + { + "controlIndex": 5, + "controlMode": 0, + "controlChannel": 15, + "controlParam": 71, + "nrpnAddress": 0, + "minValue": 0, + "maxValue": 127, + "controlName": "LPF Resonanc", + "colorScheme": 71, + "hapticMode": 0, + "hapticIndent1": 255, + "hapticIndent2": 255, + "hapticSteps": 0, + "stepNames": [ + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "" + ] + }, + { + "controlIndex": 6, + "controlMode": 0, + "controlChannel": 15, + "controlParam": 81, + "nrpnAddress": 0, + "minValue": 0, + "maxValue": 127, + "controlName": "HPF Cutoff", + "colorScheme": 0, + "hapticMode": 0, + "hapticIndent1": 255, + "hapticIndent2": 255, + "hapticSteps": 0, + "stepNames": [ + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "" + ] + }, + { + "controlIndex": 7, + "controlMode": 0, + "controlChannel": 15, + "controlParam": 82, + "nrpnAddress": 0, + "minValue": 0, + "maxValue": 127, + "controlName": "HPF Resonan", + "colorScheme": 42, + "hapticMode": 0, + "hapticIndent1": 255, + "hapticIndent2": 255, + "hapticSteps": 0, + "stepNames": [ + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "" + ] + }, + { + "controlIndex": 8, + "controlMode": 0, + "controlChannel": 15, + "controlParam": 21, + "nrpnAddress": 0, + "minValue": 0, + "maxValue": 127, + "controlName": "OSC1 Level", + "colorScheme": 46, + "hapticMode": 0, + "hapticIndent1": 255, + "hapticIndent2": 255, + "hapticSteps": 0, + "stepNames": [ + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "" + ] + }, + { + "controlIndex": 9, + "controlMode": 0, + "controlChannel": 15, + "controlParam": 12, + "nrpnAddress": 0, + "minValue": 0, + "maxValue": 127, + "controlName": "OSC1 Pitch", + "colorScheme": 46, + "hapticMode": 0, + "hapticIndent1": 64, + "hapticIndent2": 255, + "hapticSteps": 0, + "stepNames": [ + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "" + ] + }, + { + "controlIndex": 10, + "controlMode": 0, + "controlChannel": 15, + "controlParam": 23, + "nrpnAddress": 0, + "minValue": 0, + "maxValue": 127, + "controlName": "OSC1 PW", + "colorScheme": 46, + "hapticMode": 0, + "hapticIndent1": 255, + "hapticIndent2": 255, + "hapticSteps": 0, + "stepNames": [ + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "" + ] + }, + { + "controlIndex": 11, + "controlMode": 0, + "controlChannel": 15, + "controlParam": 25, + "nrpnAddress": 0, + "minValue": 0, + "maxValue": 127, + "controlName": "OSC1 WavePos", + "colorScheme": 46, + "hapticMode": 0, + "hapticIndent1": 255, + "hapticIndent2": 255, + "hapticSteps": 0, + "stepNames": [ + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "" + ] + }, + { + "controlIndex": 12, + "controlMode": 0, + "controlChannel": 15, + "controlParam": 24, + "nrpnAddress": 0, + "minValue": 0, + "maxValue": 127, + "controlName": "OSC1 Feedb", + "colorScheme": 67, + "hapticMode": 0, + "hapticIndent1": 255, + "hapticIndent2": 255, + "hapticSteps": 0, + "stepNames": [ + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "" + ] + }, + { + "controlIndex": 13, + "controlMode": 0, + "controlChannel": 15, + "controlParam": 54, + "nrpnAddress": 0, + "minValue": 0, + "maxValue": 127, + "controlName": "FM1 Level", + "colorScheme": 67, + "hapticMode": 0, + "hapticIndent1": 255, + "hapticIndent2": 255, + "hapticSteps": 0, + "stepNames": [ + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "" + ] + }, + { + "controlIndex": 14, + "controlMode": 0, + "controlChannel": 15, + "controlParam": 14, + "nrpnAddress": 0, + "minValue": 0, + "maxValue": 127, + "controlName": "FM1 Pitch", + "colorScheme": 67, + "hapticMode": 0, + "hapticIndent1": 64, + "hapticIndent2": 255, + "hapticSteps": 0, + "stepNames": [ + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "" + ] + }, + { + "controlIndex": 15, + "controlMode": 0, + "controlChannel": 15, + "controlParam": 55, + "nrpnAddress": 0, + "minValue": 0, + "maxValue": 127, + "controlName": "FM1 Feedback", + "colorScheme": 67, + "hapticMode": 0, + "hapticIndent1": 255, + "hapticIndent2": 255, + "hapticSteps": 0, + "stepNames": [ + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "" + ] + }, + { + "controlIndex": 16, + "controlMode": 0, + "controlChannel": 15, + "controlParam": 26, + "nrpnAddress": 0, + "minValue": 0, + "maxValue": 127, + "controlName": "OSC2 Level", + "colorScheme": 5, + "hapticMode": 0, + "hapticIndent1": 255, + "hapticIndent2": 255, + "hapticSteps": 0, + "stepNames": [ + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "" + ] + }, + { + "controlIndex": 17, + "controlMode": 0, + "controlChannel": 15, + "controlParam": 13, + "nrpnAddress": 0, + "minValue": 0, + "maxValue": 127, + "controlName": "OSC2 Pitch", + "colorScheme": 5, + "hapticMode": 0, + "hapticIndent1": 64, + "hapticIndent2": 255, + "hapticSteps": 0, + "stepNames": [ + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "" + ] + }, + { + "controlIndex": 18, + "controlMode": 0, + "controlChannel": 15, + "controlParam": 28, + "nrpnAddress": 0, + "minValue": 0, + "maxValue": 127, + "controlName": "OSC2 PW", + "colorScheme": 5, + "hapticMode": 0, + "hapticIndent1": 255, + "hapticIndent2": 255, + "hapticSteps": 0, + "stepNames": [ + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "" + ] + }, + { + "controlIndex": 19, + "controlMode": 0, + "controlChannel": 15, + "controlParam": 30, + "nrpnAddress": 0, + "minValue": 0, + "maxValue": 127, + "controlName": "OSC2 WavePos", + "colorScheme": 5, + "hapticMode": 0, + "hapticIndent1": 255, + "hapticIndent2": 255, + "hapticSteps": 0, + "stepNames": [ + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "" + ] + }, + { + "controlIndex": 20, + "controlMode": 0, + "controlChannel": 15, + "controlParam": 29, + "nrpnAddress": 0, + "minValue": 0, + "maxValue": 127, + "controlName": "OSC2 Feedb", + "colorScheme": 67, + "hapticMode": 0, + "hapticIndent1": 255, + "hapticIndent2": 255, + "hapticSteps": 0, + "stepNames": [ + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "" + ] + }, + { + "controlIndex": 21, + "controlMode": 0, + "controlChannel": 15, + "controlParam": 56, + "nrpnAddress": 0, + "minValue": 0, + "maxValue": 127, + "controlName": "FM2 Level", + "colorScheme": 67, + "hapticMode": 0, + "hapticIndent1": 255, + "hapticIndent2": 255, + "hapticSteps": 0, + "stepNames": [ + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "" + ] + }, + { + "controlIndex": 22, + "controlMode": 0, + "controlChannel": 15, + "controlParam": 15, + "nrpnAddress": 0, + "minValue": 0, + "maxValue": 127, + "controlName": "FM2 Pitch", + "colorScheme": 67, + "hapticMode": 0, + "hapticIndent1": 64, + "hapticIndent2": 255, + "hapticSteps": 0, + "stepNames": [ + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "" + ] + }, + { + "controlIndex": 23, + "controlMode": 0, + "controlChannel": 15, + "controlParam": 57, + "nrpnAddress": 0, + "minValue": 0, + "maxValue": 127, + "controlName": "FM2 Feedback", + "colorScheme": 67, + "hapticMode": 0, + "hapticIndent1": 255, + "hapticIndent2": 255, + "hapticSteps": 0, + "stepNames": [ + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "" + ] + }, + { + "controlIndex": 24, + "controlMode": 0, + "controlChannel": 15, + "controlParam": 73, + "nrpnAddress": 0, + "minValue": 0, + "maxValue": 127, + "controlName": "ENV1 Attack", + "colorScheme": 22, + "hapticMode": 0, + "hapticIndent1": 255, + "hapticIndent2": 255, + "hapticSteps": 0, + "stepNames": [ + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "" + ] + }, + { + "controlIndex": 25, + "controlMode": 0, + "controlChannel": 15, + "controlParam": 75, + "nrpnAddress": 0, + "minValue": 0, + "maxValue": 127, + "controlName": "ENV1 Decay", + "colorScheme": 22, + "hapticMode": 0, + "hapticIndent1": 255, + "hapticIndent2": 255, + "hapticSteps": 0, + "stepNames": [ + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "" + ] + }, + { + "controlIndex": 26, + "controlMode": 0, + "controlChannel": 15, + "controlParam": 76, + "nrpnAddress": 0, + "minValue": 0, + "maxValue": 127, + "controlName": "ENV1 Sustain", + "colorScheme": 22, + "hapticMode": 0, + "hapticIndent1": 255, + "hapticIndent2": 255, + "hapticSteps": 0, + "stepNames": [ + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "" + ] + }, + { + "controlIndex": 27, + "controlMode": 0, + "controlChannel": 15, + "controlParam": 72, + "nrpnAddress": 0, + "minValue": 0, + "maxValue": 127, + "controlName": "ENV1 Release", + "colorScheme": 22, + "hapticMode": 0, + "hapticIndent1": 255, + "hapticIndent2": 255, + "hapticSteps": 0, + "stepNames": [ + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "" + ] + }, + { + "controlIndex": 28, + "controlMode": 0, + "controlChannel": 15, + "controlParam": 77, + "nrpnAddress": 0, + "minValue": 0, + "maxValue": 127, + "controlName": "ENV2 Attack", + "colorScheme": 64, + "hapticMode": 0, + "hapticIndent1": 255, + "hapticIndent2": 255, + "hapticSteps": 0, + "stepNames": [ + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "" + ] + }, + { + "controlIndex": 29, + "controlMode": 0, + "controlChannel": 15, + "controlParam": 78, + "nrpnAddress": 0, + "minValue": 0, + "maxValue": 127, + "controlName": "ENV2 Decay", + "colorScheme": 64, + "hapticMode": 0, + "hapticIndent1": 255, + "hapticIndent2": 255, + "hapticSteps": 0, + "stepNames": [ + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "" + ] + }, + { + "controlIndex": 30, + "controlMode": 0, + "controlChannel": 15, + "controlParam": 79, + "nrpnAddress": 0, + "minValue": 0, + "maxValue": 127, + "controlName": "ENV2 Sustain", + "colorScheme": 64, + "hapticMode": 0, + "hapticIndent1": 255, + "hapticIndent2": 255, + "hapticSteps": 0, + "stepNames": [ + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "" + ] + }, + { + "controlIndex": 31, + "controlMode": 0, + "controlChannel": 15, + "controlParam": 80, + "nrpnAddress": 0, + "minValue": 0, + "maxValue": 127, + "controlName": "ENV2 Release", + "colorScheme": 64, + "hapticMode": 0, + "hapticIndent1": 255, + "hapticIndent2": 255, + "hapticSteps": 0, + "stepNames": [ + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "" + ] + } + ], + "buttons": [] +} \ No newline at end of file diff --git a/contrib/midi_follow/roto_control/all_parameters/Deluge P2.json b/contrib/midi_follow/roto_control/all_parameters/Deluge P2.json new file mode 100644 index 0000000000..a175716ce2 --- /dev/null +++ b/contrib/midi_follow/roto_control/all_parameters/Deluge P2.json @@ -0,0 +1,1032 @@ +{ + "version": 1, + "type": "MIDI", + "name": "Deluge P2", + "index": 3, + "knobs": [ + { + "controlIndex": 0, + "controlMode": 0, + "controlChannel": 15, + "controlParam": 84, + "nrpnAddress": 0, + "minValue": 0, + "maxValue": 127, + "controlName": "EQ-Bass Freq", + "colorScheme": 53, + "hapticMode": 0, + "hapticIndent1": 64, + "hapticIndent2": 255, + "hapticSteps": 0, + "stepNames": [ + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "" + ] + }, + { + "controlIndex": 1, + "controlMode": 0, + "controlChannel": 15, + "controlParam": 86, + "nrpnAddress": 0, + "minValue": 0, + "maxValue": 127, + "controlName": "EQ-Bass Gain", + "colorScheme": 53, + "hapticMode": 0, + "hapticIndent1": 255, + "hapticIndent2": 255, + "hapticSteps": 0, + "stepNames": [ + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "" + ] + }, + { + "controlIndex": 2, + "controlMode": 0, + "controlChannel": 15, + "controlParam": 85, + "nrpnAddress": 0, + "minValue": 0, + "maxValue": 127, + "controlName": "EQ-Treb Freq", + "colorScheme": 26, + "hapticMode": 0, + "hapticIndent1": 64, + "hapticIndent2": 255, + "hapticSteps": 0, + "stepNames": [ + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "" + ] + }, + { + "controlIndex": 3, + "controlMode": 0, + "controlChannel": 15, + "controlParam": 87, + "nrpnAddress": 0, + "minValue": 0, + "maxValue": 127, + "controlName": "EQ-Treb Gain", + "colorScheme": 26, + "hapticMode": 0, + "hapticIndent1": 255, + "hapticIndent2": 255, + "hapticSteps": 0, + "stepNames": [ + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "" + ] + }, + { + "controlIndex": 4, + "controlMode": 0, + "controlChannel": 15, + "controlParam": 41, + "nrpnAddress": 0, + "minValue": 0, + "maxValue": 127, + "controlName": "Noise", + "colorScheme": 20, + "hapticMode": 0, + "hapticIndent1": 255, + "hapticIndent2": 255, + "hapticSteps": 0, + "stepNames": [ + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "" + ] + }, + { + "controlIndex": 5, + "controlMode": 0, + "controlChannel": 15, + "controlParam": 91, + "nrpnAddress": 0, + "minValue": 0, + "maxValue": 127, + "controlName": "REVERB Amoun", + "colorScheme": 21, + "hapticMode": 0, + "hapticIndent1": 255, + "hapticIndent2": 255, + "hapticSteps": 0, + "stepNames": [ + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "" + ] + }, + { + "controlIndex": 6, + "controlMode": 0, + "controlChannel": 15, + "controlParam": 52, + "nrpnAddress": 0, + "minValue": 0, + "maxValue": 127, + "controlName": "DELAY Amount", + "colorScheme": 74, + "hapticMode": 0, + "hapticIndent1": 255, + "hapticIndent2": 255, + "hapticSteps": 0, + "stepNames": [ + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "" + ] + }, + { + "controlIndex": 7, + "controlMode": 0, + "controlChannel": 15, + "controlParam": 53, + "nrpnAddress": 0, + "minValue": 0, + "maxValue": 127, + "controlName": "DELAY Rate", + "colorScheme": 74, + "hapticMode": 0, + "hapticIndent1": 255, + "hapticIndent2": 255, + "hapticSteps": 0, + "stepNames": [ + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "" + ] + }, + { + "controlIndex": 8, + "controlMode": 0, + "controlChannel": 15, + "controlParam": 16, + "nrpnAddress": 0, + "minValue": 0, + "maxValue": 127, + "controlName": "MODFX Rate", + "colorScheme": 1, + "hapticMode": 0, + "hapticIndent1": 255, + "hapticIndent2": 255, + "hapticSteps": 0, + "stepNames": [ + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "" + ] + }, + { + "controlIndex": 9, + "controlMode": 0, + "controlChannel": 15, + "controlParam": 93, + "nrpnAddress": 0, + "minValue": 0, + "maxValue": 127, + "controlName": "MODFX Depth", + "colorScheme": 1, + "hapticMode": 0, + "hapticIndent1": 255, + "hapticIndent2": 255, + "hapticSteps": 0, + "stepNames": [ + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "" + ] + }, + { + "controlIndex": 10, + "controlMode": 0, + "controlChannel": 15, + "controlParam": 17, + "nrpnAddress": 0, + "minValue": 0, + "maxValue": 127, + "controlName": "MODFX Feedb", + "colorScheme": 1, + "hapticMode": 0, + "hapticIndent1": 255, + "hapticIndent2": 255, + "hapticSteps": 0, + "stepNames": [ + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "" + ] + }, + { + "controlIndex": 11, + "controlMode": 0, + "controlChannel": 15, + "controlParam": 18, + "nrpnAddress": 0, + "minValue": 0, + "maxValue": 127, + "controlName": "MODFX Offset", + "colorScheme": 1, + "hapticMode": 0, + "hapticIndent1": 64, + "hapticIndent2": 255, + "hapticSteps": 0, + "stepNames": [ + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "" + ] + }, + { + "controlIndex": 12, + "controlMode": 0, + "controlChannel": 15, + "controlParam": 19, + "nrpnAddress": 0, + "minValue": 0, + "maxValue": 127, + "controlName": "Wavefold", + "colorScheme": 73, + "hapticMode": 0, + "hapticIndent1": 255, + "hapticIndent2": 255, + "hapticSteps": 0, + "stepNames": [ + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "" + ] + }, + { + "controlIndex": 13, + "controlMode": 0, + "controlChannel": 15, + "controlParam": 62, + "nrpnAddress": 0, + "minValue": 0, + "maxValue": 127, + "controlName": "Bitcrush", + "colorScheme": 73, + "hapticMode": 0, + "hapticIndent1": 255, + "hapticIndent2": 255, + "hapticSteps": 0, + "stepNames": [ + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "" + ] + }, + { + "controlIndex": 14, + "controlMode": 0, + "controlChannel": 15, + "controlParam": 63, + "nrpnAddress": 0, + "minValue": 0, + "maxValue": 127, + "controlName": "Decimation", + "colorScheme": 73, + "hapticMode": 0, + "hapticIndent1": 255, + "hapticIndent2": 255, + "hapticSteps": 0, + "stepNames": [ + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "" + ] + }, + { + "controlIndex": 16, + "controlMode": 0, + "controlChannel": 15, + "controlParam": 58, + "nrpnAddress": 0, + "minValue": 0, + "maxValue": 127, + "controlName": "LFO1 Rate", + "colorScheme": 27, + "hapticMode": 0, + "hapticIndent1": 255, + "hapticIndent2": 255, + "hapticSteps": 0, + "stepNames": [ + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "" + ] + }, + { + "controlIndex": 17, + "controlMode": 0, + "controlChannel": 15, + "controlParam": 59, + "nrpnAddress": 0, + "minValue": 0, + "maxValue": 127, + "controlName": "LFO2 Rate", + "colorScheme": 27, + "hapticMode": 0, + "hapticIndent1": 255, + "hapticIndent2": 255, + "hapticSteps": 0, + "stepNames": [ + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "" + ] + }, + { + "controlIndex": 18, + "controlMode": 0, + "controlChannel": 15, + "controlParam": 70, + "nrpnAddress": 0, + "minValue": 0, + "maxValue": 127, + "controlName": "LPF Morph", + "colorScheme": 71, + "hapticMode": 0, + "hapticIndent1": 255, + "hapticIndent2": 255, + "hapticSteps": 0, + "stepNames": [ + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "" + ] + }, + { + "controlIndex": 19, + "controlMode": 0, + "controlChannel": 15, + "controlParam": 83, + "nrpnAddress": 0, + "minValue": 0, + "maxValue": 127, + "controlName": "HPF Morph", + "colorScheme": 71, + "hapticMode": 0, + "hapticIndent1": 255, + "hapticIndent2": 255, + "hapticSteps": 0, + "stepNames": [ + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "" + ] + }, + { + "controlIndex": 20, + "controlMode": 0, + "controlChannel": 15, + "controlParam": 20, + "nrpnAddress": 0, + "minValue": 0, + "maxValue": 127, + "controlName": "STUTTER Rate", + "colorScheme": 75, + "hapticMode": 0, + "hapticIndent1": 255, + "hapticIndent2": 255, + "hapticSteps": 0, + "stepNames": [ + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "" + ] + }, + { + "controlIndex": 21, + "controlMode": 0, + "controlChannel": 15, + "controlParam": 61, + "nrpnAddress": 0, + "minValue": 0, + "maxValue": 127, + "controlName": "SIDECH Level", + "colorScheme": 59, + "hapticMode": 0, + "hapticIndent1": 255, + "hapticIndent2": 255, + "hapticSteps": 0, + "stepNames": [ + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "" + ] + }, + { + "controlIndex": 22, + "controlMode": 0, + "controlChannel": 15, + "controlParam": 60, + "nrpnAddress": 0, + "minValue": 0, + "maxValue": 127, + "controlName": "SIDECH Shape", + "colorScheme": 59, + "hapticMode": 0, + "hapticIndent1": 255, + "hapticIndent2": 255, + "hapticSteps": 0, + "stepNames": [ + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "" + ] + }, + { + "controlIndex": 23, + "controlMode": 0, + "controlChannel": 15, + "controlParam": 27, + "nrpnAddress": 0, + "minValue": 0, + "maxValue": 127, + "controlName": "Comp Tresh", + "colorScheme": 31, + "hapticMode": 0, + "hapticIndent1": 255, + "hapticIndent2": 255, + "hapticSteps": 0, + "stepNames": [ + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "" + ] + }, + { + "controlIndex": 24, + "controlMode": 0, + "controlChannel": 15, + "controlParam": 102, + "nrpnAddress": 0, + "minValue": 0, + "maxValue": 127, + "controlName": "ENV3 Attack", + "colorScheme": 68, + "hapticMode": 0, + "hapticIndent1": 255, + "hapticIndent2": 255, + "hapticSteps": 0, + "stepNames": [ + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "" + ] + }, + { + "controlIndex": 25, + "controlMode": 0, + "controlChannel": 15, + "controlParam": 103, + "nrpnAddress": 0, + "minValue": 0, + "maxValue": 127, + "controlName": "ENV3 Decay", + "colorScheme": 68, + "hapticMode": 0, + "hapticIndent1": 255, + "hapticIndent2": 255, + "hapticSteps": 0, + "stepNames": [ + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "" + ] + }, + { + "controlIndex": 26, + "controlMode": 0, + "controlChannel": 15, + "controlParam": 104, + "nrpnAddress": 0, + "minValue": 0, + "maxValue": 127, + "controlName": "ENV3 Sustain", + "colorScheme": 68, + "hapticMode": 0, + "hapticIndent1": 255, + "hapticIndent2": 255, + "hapticSteps": 0, + "stepNames": [ + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "" + ] + }, + { + "controlIndex": 27, + "controlMode": 0, + "controlChannel": 15, + "controlParam": 105, + "nrpnAddress": 0, + "minValue": 0, + "maxValue": 127, + "controlName": "ENV3 Release", + "colorScheme": 68, + "hapticMode": 0, + "hapticIndent1": 255, + "hapticIndent2": 255, + "hapticSteps": 0, + "stepNames": [ + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "" + ] + }, + { + "controlIndex": 28, + "controlMode": 0, + "controlChannel": 15, + "controlParam": 106, + "nrpnAddress": 0, + "minValue": 0, + "maxValue": 127, + "controlName": "ENV4 Attack", + "colorScheme": 17, + "hapticMode": 0, + "hapticIndent1": 255, + "hapticIndent2": 255, + "hapticSteps": 0, + "stepNames": [ + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "" + ] + }, + { + "controlIndex": 29, + "controlMode": 0, + "controlChannel": 15, + "controlParam": 107, + "nrpnAddress": 0, + "minValue": 0, + "maxValue": 127, + "controlName": "ENV4 Decay", + "colorScheme": 17, + "hapticMode": 0, + "hapticIndent1": 255, + "hapticIndent2": 255, + "hapticSteps": 0, + "stepNames": [ + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "" + ] + }, + { + "controlIndex": 30, + "controlMode": 0, + "controlChannel": 15, + "controlParam": 108, + "nrpnAddress": 0, + "minValue": 0, + "maxValue": 127, + "controlName": "ENV4 Sustain", + "colorScheme": 17, + "hapticMode": 0, + "hapticIndent1": 255, + "hapticIndent2": 255, + "hapticSteps": 0, + "stepNames": [ + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "" + ] + }, + { + "controlIndex": 31, + "controlMode": 0, + "controlChannel": 15, + "controlParam": 109, + "nrpnAddress": 0, + "minValue": 0, + "maxValue": 127, + "controlName": "ENV4 Release", + "colorScheme": 17, + "hapticMode": 0, + "hapticIndent1": 255, + "hapticIndent2": 255, + "hapticSteps": 0, + "stepNames": [ + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "" + ] + } + ], + "buttons": [] +} \ No newline at end of file diff --git a/contrib/midi_follow/roto_control/all_parameters/Deluge P3.json b/contrib/midi_follow/roto_control/all_parameters/Deluge P3.json new file mode 100644 index 0000000000..d97a10d69d --- /dev/null +++ b/contrib/midi_follow/roto_control/all_parameters/Deluge P3.json @@ -0,0 +1,471 @@ +{ + "version": 1, + "type": "MIDI", + "name": "Deluge P3", + "index": 4, + "knobs": [ + { + "controlIndex": 0, + "controlMode": 0, + "controlChannel": 15, + "controlParam": 51, + "nrpnAddress": 0, + "minValue": 0, + "maxValue": 127, + "controlName": "ARP Rate", + "colorScheme": 7, + "hapticMode": 0, + "hapticIndent1": 255, + "hapticIndent2": 255, + "hapticSteps": 0, + "stepNames": [ + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "" + ] + }, + { + "controlIndex": 1, + "controlMode": 0, + "controlChannel": 15, + "controlParam": 50, + "nrpnAddress": 0, + "minValue": 0, + "maxValue": 127, + "controlName": "ARP Gate", + "colorScheme": 7, + "hapticMode": 0, + "hapticIndent1": 255, + "hapticIndent2": 255, + "hapticSteps": 0, + "stepNames": [ + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "" + ] + }, + { + "controlIndex": 2, + "controlMode": 0, + "controlChannel": 15, + "controlParam": 40, + "nrpnAddress": 0, + "minValue": 0, + "maxValue": 127, + "controlName": "ARP GateSpr", + "colorScheme": 7, + "hapticMode": 0, + "hapticIndent1": 64, + "hapticIndent2": 255, + "hapticSteps": 0, + "stepNames": [ + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "" + ] + }, + { + "controlIndex": 3, + "controlMode": 0, + "controlChannel": 15, + "controlParam": 39, + "nrpnAddress": 0, + "minValue": 0, + "maxValue": 127, + "controlName": "ARP OctSpr", + "colorScheme": 7, + "hapticMode": 0, + "hapticIndent1": 64, + "hapticIndent2": 255, + "hapticSteps": 0, + "stepNames": [ + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "" + ] + }, + { + "controlIndex": 4, + "controlMode": 0, + "controlChannel": 15, + "controlParam": 37, + "nrpnAddress": 0, + "minValue": 0, + "maxValue": 127, + "controlName": "ARP VelSpr", + "colorScheme": 7, + "hapticMode": 0, + "hapticIndent1": 64, + "hapticIndent2": 255, + "hapticSteps": 0, + "stepNames": [ + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "" + ] + }, + { + "controlIndex": 5, + "controlMode": 0, + "controlChannel": 15, + "controlParam": 42, + "nrpnAddress": 0, + "minValue": 0, + "maxValue": 127, + "controlName": "ARP Rhythm", + "colorScheme": 7, + "hapticMode": 0, + "hapticIndent1": 255, + "hapticIndent2": 255, + "hapticSteps": 0, + "stepNames": [ + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "" + ] + }, + { + "controlIndex": 6, + "controlMode": 0, + "controlChannel": 15, + "controlParam": 43, + "nrpnAddress": 0, + "minValue": 0, + "maxValue": 127, + "controlName": "ARP SeqLen", + "colorScheme": 7, + "hapticMode": 0, + "hapticIndent1": 255, + "hapticIndent2": 255, + "hapticSteps": 0, + "stepNames": [ + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "" + ] + }, + { + "controlIndex": 7, + "controlMode": 0, + "controlChannel": 15, + "controlParam": 36, + "nrpnAddress": 0, + "minValue": 0, + "maxValue": 127, + "controlName": "ARP RevProb", + "colorScheme": 7, + "hapticMode": 0, + "hapticIndent1": 255, + "hapticIndent2": 255, + "hapticSteps": 0, + "stepNames": [ + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "" + ] + }, + { + "controlIndex": 8, + "controlMode": 0, + "controlChannel": 15, + "controlParam": 44, + "nrpnAddress": 0, + "minValue": 0, + "maxValue": 127, + "controlName": "ARP ChoPoly", + "colorScheme": 7, + "hapticMode": 0, + "hapticIndent1": 255, + "hapticIndent2": 255, + "hapticSteps": 0, + "stepNames": [ + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "" + ] + }, + { + "controlIndex": 9, + "controlMode": 0, + "controlChannel": 15, + "controlParam": 48, + "nrpnAddress": 0, + "minValue": 0, + "maxValue": 127, + "controlName": "ARP ChoProb", + "colorScheme": 7, + "hapticMode": 0, + "hapticIndent1": 255, + "hapticIndent2": 255, + "hapticSteps": 0, + "stepNames": [ + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "" + ] + }, + { + "controlIndex": 10, + "controlMode": 0, + "controlChannel": 15, + "controlParam": 45, + "nrpnAddress": 0, + "minValue": 0, + "maxValue": 127, + "controlName": "ARP RatchAm", + "colorScheme": 7, + "hapticMode": 0, + "hapticIndent1": 255, + "hapticIndent2": 255, + "hapticSteps": 0, + "stepNames": [ + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "" + ] + }, + { + "controlIndex": 11, + "controlMode": 0, + "controlChannel": 15, + "controlParam": 49, + "nrpnAddress": 0, + "minValue": 0, + "maxValue": 127, + "controlName": "ARP RatchPr", + "colorScheme": 7, + "hapticMode": 0, + "hapticIndent1": 255, + "hapticIndent2": 255, + "hapticSteps": 0, + "stepNames": [ + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "" + ] + }, + { + "controlIndex": 12, + "controlMode": 0, + "controlChannel": 15, + "controlParam": 46, + "nrpnAddress": 0, + "minValue": 0, + "maxValue": 127, + "controlName": "ARP NoteProb", + "colorScheme": 7, + "hapticMode": 0, + "hapticIndent1": 255, + "hapticIndent2": 255, + "hapticSteps": 0, + "stepNames": [ + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "" + ] + }, + { + "controlIndex": 13, + "controlMode": 0, + "controlChannel": 15, + "controlParam": 47, + "nrpnAddress": 0, + "minValue": 0, + "maxValue": 127, + "controlName": "ARP BassProb", + "colorScheme": 7, + "hapticMode": 0, + "hapticIndent1": 255, + "hapticIndent2": 255, + "hapticSteps": 0, + "stepNames": [ + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "" + ] + } + ], + "buttons": [] +} \ No newline at end of file diff --git a/contrib/midi_follow/roto_control/all_parameters/README.md b/contrib/midi_follow/roto_control/all_parameters/README.md new file mode 100644 index 0000000000..9a047425c0 --- /dev/null +++ b/contrib/midi_follow/roto_control/all_parameters/README.md @@ -0,0 +1,135 @@ +# All parameters + +This folder contains the three setup `.json`-files + +- `Deluge P1.json` +- `Deluge P2.json` +- `Deluge P3.json` + +that together cover all MIDI Follow parameters (and their CC#) described in [*Appendix A - List of Deluge Parameters with Default Mapped CC's*](../../../../docs/features/midi_follow_mode.md#appendix-a---list-of-deluge-parameters-with-default-mapped-ccs). + +The philosophy behind these three templates is to surface all available parameters so users can explore which parameters they might want to consolidate in within, say, a single, more performance-oriented setup. + +Below is a summary table, where `Position` is the knob's position and `Page` is a knob's page in the corresponding setup file.[^1] + +| Parameter | Position | Page | Setup | CC# | +|-----------|----------|------|-------|----| +| **Master** | 1 | 1 | Deluge P1 | 7 | +| **Panning** | 2 | 1 | Deluge P1 | 10 | +| **Pitch** | 3 | 1 | Deluge P1 | 3 | +| **Portamento** | 4 | 1 | Deluge P1 | 5 | +| **LPF Cutoff** | 5 | 1 | Deluge P1 | 74 | +| **LPF Resonanc** | 6 | 1 | Deluge P1 | 71 | +| **HPF Cutoff** | 7 | 1 | Deluge P1 | 81 | +| **HPF Resonan** | 8 | 1 | Deluge P1 | 82 | + +| **OSC1 Level** | 9 | 2 | Deluge P1 | 21 | +| **OSC1 Pitch** | 10 | 2 | Deluge P1 | 12 | +| **OSC1 PW** | 11 | 2 | Deluge P1 | 23 | +| **OSC1 WavePos** | 12 | 2 | Deluge P1 | 25 | +| **OSC1 Feedb** | 13 | 2 | Deluge P1 | 24 | +| **FM1 Level** | 14 | 2 | Deluge P1 | 54 | +| **FM1 Pitch** | 15 | 2 | Deluge P1 | 14 | +| **FM1 Feedback** | 16 | 2 | Deluge P1 | 55 | + +| **OSC2 Level** | 17 | 3 | Deluge P1 | 26 | +| **OSC2 Pitch** | 18 | 3 | Deluge P1 | 13 | +| **OSC2 PW** | 19 | 3 | Deluge P1 | 28 | +| **OSC2 WavePos** | 20 | 3 | Deluge P1 | 30 | +| **OSC2 Feedb** | 21 | 3 | Deluge P1 | 29 | +| **FM2 Level** | 22 | 3 | Deluge P1 | 56 | +| **FM2 Pitch** | 23 | 3 | Deluge P1 | 15 | +| **FM2 Feedback** | 24 | 3 | Deluge P1 | 57 | + +| **ENV1 Attack** | 25 | 4 | Deluge P1 | 73 | +| **ENV1 Decay** | 26 | 4 | Deluge P1 | 75 | +| **ENV1 Sustain** | 27 | 4 | Deluge P1 | 76 | +| **ENV1 Release** | 28 | 4 | Deluge P1 | 72 | +| **ENV2 Attack** | 29 | 4 | Deluge P1 | 77 | +| **ENV2 Decay** | 30 | 4 | Deluge P1 | 78 | +| **ENV2 Sustain** | 31 | 4 | Deluge P1 | 79 | +| **ENV2 Release** | 32 | 4 | Deluge P1 | 80 | + +| **EQ-Bass Freq** | 1 | 1 | Deluge P2 | 84 | +| **EQ-Bass Gain** | 2 | 1 | Deluge P2 | 86 | +| **EQ-Treb Freq** | 3 | 1 | Deluge P2 | 85 | +| **EQ-Treb Gain** | 4 | 1 | Deluge P2 | 87 | +| **Noise** | 5 | 1 | Deluge P2 | 41 | +| **REVERB Amoun** | 6 | 1 | Deluge P2 | 91 | +| **DELAY Amount** | 7 | 1 | Deluge P2 | 52 | +| **DELAY Rate** | 8 | 1 | Deluge P2 | 53 | + +| **MODFX Rate** | 9 | 2 | Deluge P2 | 16 | +| **MODFX Depth** | 10 | 2 | Deluge P2 | 93 | +| **MODFX Feedb** | 11 | 2 | Deluge P2 | 17 | +| **MODFX Offset** | 12 | 2 | Deluge P2 | 18 | +| **Wavefold** | 13 | 2 | Deluge P2 | 19 | +| **Bitcrush** | 14 | 2 | Deluge P2 | 62 | +| **Decimation** | 15 | 2 | Deluge P2 | 63 | +| | 16 | 2 | Deluge P2 | | + +| **LFO1 Rate** | 17 | 3 | Deluge P2 | 58 | +| **LFO2 Rate** | 18 | 3 | Deluge P2 | 59 | +| **LPF Morph** | 19 | 3 | Deluge P2 | 70 | +| **HPF Morph** | 20 | 3 | Deluge P2 | 83 | +| **STUTTER Rate** | 21 | 3 | Deluge P2 | 20 | +| **SIDECH Level** | 22 | 3 | Deluge P2 | 61 | +| **SIDECH Shape** | 23 | 3 | Deluge P2 | 60 | +| **Comp Tresh** | 24 | 3 | Deluge P2 | 27 | + +| **ENV3 Attack** | 25 | 4 | Deluge P2 | 102 | +| **ENV3 Decay** | 26 | 4 | Deluge P2 | 103 | +| **ENV3 Sustain** | 27 | 4 | Deluge P2 | 104 | +| **ENV3 Release** | 28 | 4 | Deluge P2 | 105 | +| **ENV4 Attack** | 29 | 4 | Deluge P2 | 106 | +| **ENV4 Decay** | 30 | 4 | Deluge P2 | 107 | +| **ENV4 Sustain** | 31 | 4 | Deluge P2 | 108 | +| **ENV4 Release** | 32 | 4 | Deluge P2 | 109 | + +| **ARP Rate** | 1 | 1 | Deluge P3 | 51 | +| **ARP Gate** | 2 | 1 | Deluge P3 | 50 | +| **ARP GateSpr** | 3 | 1 | Deluge P3 | 40 | +| **ARP OctSpr** | 4 | 1 | Deluge P3 | 39 | +| **ARP VelSpr** | 5 | 1 | Deluge P3 | 37 | +| **ARP Rhythm** | 6 | 1 | Deluge P3 | 42 | +| **ARP SeqLen** | 7 | 1 | Deluge P3 | 43 | +| **ARP RevProb** | 8 | 1 | Deluge P3 | 36 | + +| **ARP ChoPoly** | 9 | 2 | Deluge P3 | 44 | +| **ARP ChoProb** | 10 | 2 | Deluge P3 | 48 | +| **ARP RatchAm** | 11 | 2 | Deluge P3 | 45 | +| **ARP RatchPr** | 12 | 2 | Deluge P3 | 49 | +| **ARP NoteProb** | 13 | 2 | Deluge P3 | 46 | +| **ARP BassProb** | 14 | 2 | Deluge P3 | 47 | +| | 15 | 2 | Deluge P3 | | +| | 16 | 2 | Deluge P3 | | + +| | 17 | 3 | Deluge P3 | | +| | 18 | 3 | Deluge P3 | | +| | 19 | 3 | Deluge P3 | | +| | 20 | 3 | Deluge P3 | | +| | 21 | 3 | Deluge P3 | | +| | 22 | 3 | Deluge P3 | | +| | 23 | 3 | Deluge P3 | | +| | 24 | 3 | Deluge P3 | | + +| | 25 | 4 | Deluge P3 | | +| | 26 | 4 | Deluge P3 | | +| | 27 | 4 | Deluge P3 | | +| | 28 | 4 | Deluge P3 | | +| | 29 | 4 | Deluge P3 | | +| | 30 | 4 | Deluge P3 | | +| | 31 | 4 | Deluge P3 | | +| | 32 | 4 | Deluge P3 | | + + +MIDI channel: 15 + + +[^1]: Unassigned knobs show up in the table with no parameter name and CC#. The table was automatically produced by calling + + ```python + python3 roto-control_summarize.py "all_parameters/Deluge P1.json" "all_parameters/Deluge P2.json" "all_parameters/Deluge P3.json" + ``` + + from the `roto_control` directory one level above. So barring any errors in the script, the mappings summarized in the table should, by construction, match with the actual setup information encoded in the respective `.json` files. diff --git a/contrib/midi_follow/roto_control/roto-control_summarize.py b/contrib/midi_follow/roto_control/roto-control_summarize.py new file mode 100644 index 0000000000..93dbfb5e75 --- /dev/null +++ b/contrib/midi_follow/roto_control/roto-control_summarize.py @@ -0,0 +1,152 @@ +import json +import argparse +import os +from collections import Counter + +DESCRIPTION = """ +Summarize Melbourne Instruments Roto-Control configuration JSON files into a markdown table. +Currently, only knobs are considered, ignoring buttons. +""" + +def parse_json_files(files, verbose): + rows = [] + midi_channels = [] # Store only valid MIDI channels + + for file in files: + if verbose: + print(f"Processing file: {file}") + with open(file, 'r', encoding='utf-8') as f: + data = json.load(f) + setup_name = data.get("name", "Unknown Setup") + seen_positions = set() # Reset per file + + for knob in data.get("knobs", []): + position = knob["controlIndex"] + 1 + page = ((position - 1) // 8) + 1 # Calculate page (1-4) + midi_channel = knob.get("controlChannel") + + if midi_channel not in ["NA", None, ""]: + midi_channels.append(midi_channel) + if verbose: + print(f"Found MIDI Channel: {midi_channel} for Position {position}") + + seen_positions.add(position) + row = { + "Parameter": f"**{knob['controlName']}**" if knob.get('controlName') else "", + "Position": position, + "Page": page, + "Setup": setup_name, + "CC#": str(knob.get("controlParam", "")) if knob.get("controlParam", 0) != 0 else "", + "MIDI Channel": midi_channel if midi_channel not in ["NA", None, ""] else None + } + rows.append(row) + + # Ensure all 32 positions exist for each setup + for pos in range(1, 33): + if pos not in seen_positions: + if verbose: + print(f"Empty knob at position {pos} for {setup_name}, ensuring no MIDI channel assigned.") + page = ((pos - 1) // 8) + 1 + row = { + "Parameter": "", + "Position": pos, + "Page": page, + "Setup": setup_name, + "CC#": "", + "MIDI Channel": None + } + rows.append(row) + + if verbose: + print(f"Final MIDI channels found: {midi_channels}") + + # Sort the rows by Setup name and Position + rows.sort(key=lambda x: (x['Setup'], x['Position'])) + + return rows, midi_channels + +def generate_markdown_table(rows, midi_channels, single_setup=False): + defined_midi_channels = [ch for ch in midi_channels if ch is not None] + midi_channel_counts = Counter(defined_midi_channels) + most_common_channel, _ = midi_channel_counts.most_common(1)[0] if defined_midi_channels else (None, 0) + unique_channels = set(defined_midi_channels) + + include_midi_column = len(unique_channels) > 1 + + # Build header + markdown = "| Parameter | Position | Page " + if not single_setup: + markdown += "| Setup " + markdown += "| CC# " + if include_midi_column: + markdown += "| MIDI Channel " + markdown += "|\n" + + # Build header divider + markdown += "|-----------|----------|------|" + if not single_setup: + markdown += "-------|" + markdown += "----|" + if include_midi_column: + markdown += "--------------|" + markdown += "\n" + + # Build table rows + for i, row in enumerate(rows, start=1): + markdown += f"| {row['Parameter']} | {row['Position']} | {row['Page']} |" + if not single_setup: + markdown += f" {row['Setup']} |" + markdown += f" {row['CC#']} |" + if include_midi_column: + midi_channel = row["MIDI Channel"] + if midi_channel is not None: + midi_display = str(midi_channel) if midi_channel == most_common_channel else f"**{midi_channel}**" + else: + midi_display = "" + markdown += f" {midi_display} |" + markdown += "\n" + if i % 8 == 0: + markdown += "\n" + + # Append MIDI channel summary if needed + if len(unique_channels) == 1 and most_common_channel is not None: + markdown += f"\nMIDI channel: {most_common_channel}\n" + elif len(unique_channels) > 1: + midi_channels_list = ", ".join(map(str, unique_channels)) + markdown += f"\nMIDI channels: {midi_channels_list}\nWARNING: Multiple MIDI channels detected. Is this intentional?\n" + + # If single file, add setup info below table + if single_setup and rows: + setup_name = rows[0]['Setup'] + markdown += f"\nSetup: {setup_name}\n" + + return markdown + +def generate_output_filename(files): + base_name = "_".join([os.path.splitext(os.path.basename(f))[0] for f in files]) + return f"roto_{base_name}.md" + +def main(): + parser = argparse.ArgumentParser(description=DESCRIPTION) + parser.add_argument("files", nargs='+', help="One or more JSON files to parse.") + parser.add_argument("--output", "-o", help="Optional output file to save markdown table.") + parser.add_argument("--verbose", "-v", action="store_true", help="Enable verbose debugging output.") + + args = parser.parse_args() + rows, midi_channels = parse_json_files(args.files, args.verbose) + + single_setup = len(args.files) == 1 + markdown_table = generate_markdown_table(rows, midi_channels, single_setup) + + output_file = args.output if args.output else generate_output_filename(args.files) + + if args.verbose: + print("\nGenerated Markdown Table:\n") + print(markdown_table) + + with open(output_file, 'w', encoding='utf-8') as f: + f.write(markdown_table) + print(f"Markdown table saved to {output_file}") + +if __name__ == "__main__": + main() From 739bfda9244c976a27bc21394156b683cf35073a Mon Sep 17 00:00:00 2001 From: Stefan Herzog Date: Sun, 2 Feb 2025 23:10:37 +0100 Subject: [PATCH 02/11] midi_follow_mode.md: add section on roto-control templates --- docs/features/midi_follow_mode.md | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/docs/features/midi_follow_mode.md b/docs/features/midi_follow_mode.md index 1be4fd7afc..15517c5e48 100644 --- a/docs/features/midi_follow_mode.md +++ b/docs/features/midi_follow_mode.md @@ -239,9 +239,13 @@ For users of the Electra One, you will find a MIDI Follow template in the Electr Screenshot 2024-03-28 at 7 35 59 PM +## Appendix E - Melbourne Instruments Roto-Control Templates for Deluge MIDI Follow Mode + +For users of Melbourne Instruments' Roto-Control, you will find MIDI Follow templates in this folder: [MIDI Follow Mode Roto-Control Templates] + + [MIDI Follow Mode Loopy Pro Template]: https://github.com/SynthstromAudible/DelugeFirmware/tree/community/contrib/midi_follow/loopy_pro [MIDI Follow Mode Touch OSC Template]: https://github.com/SynthstromAudible/DelugeFirmware/tree/community/contrib/midi_follow/touch_osc [MIDI Follow Mode Electra One Preset]: https://app.electra.one/preset/vZ6WBYb4xDpMGcpChejY - - +[MIDI Follow Mode Roto-Control Templates]: ../../contrib/midi_follow/roto_control/README.md From 6d7319673f71eb7ae7d3b43efc5e73f55dd42e99 Mon Sep 17 00:00:00 2001 From: Stefan Herzog Date: Sun, 2 Feb 2025 23:20:25 +0100 Subject: [PATCH 03/11] midi_follow_mode.md: link to folder, not README --- docs/features/midi_follow_mode.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/features/midi_follow_mode.md b/docs/features/midi_follow_mode.md index 15517c5e48..0728d113d7 100644 --- a/docs/features/midi_follow_mode.md +++ b/docs/features/midi_follow_mode.md @@ -248,4 +248,4 @@ For users of Melbourne Instruments' Roto-Control, you will find MIDI Follow temp [MIDI Follow Mode Touch OSC Template]: https://github.com/SynthstromAudible/DelugeFirmware/tree/community/contrib/midi_follow/touch_osc [MIDI Follow Mode Electra One Preset]: https://app.electra.one/preset/vZ6WBYb4xDpMGcpChejY -[MIDI Follow Mode Roto-Control Templates]: ../../contrib/midi_follow/roto_control/README.md +[MIDI Follow Mode Roto-Control Templates]: ../../contrib/midi_follow/roto_control/ From 18d9ebdff47e922e0782468000a919de09edde69 Mon Sep 17 00:00:00 2001 From: Stefan Herzog Date: Sun, 2 Feb 2025 23:21:10 +0100 Subject: [PATCH 04/11] roto-control, all_parameters: fix table, improve docs --- contrib/midi_follow/roto_control/README.md | 2 +- .../roto_control/all_parameters/README.md | 12 ------------ .../roto_control/roto-control_summarize.py | 4 +--- 3 files changed, 2 insertions(+), 16 deletions(-) diff --git a/contrib/midi_follow/roto_control/README.md b/contrib/midi_follow/roto_control/README.md index 739eea3f55..7cc973d60f 100644 --- a/contrib/midi_follow/roto_control/README.md +++ b/contrib/midi_follow/roto_control/README.md @@ -1,5 +1,5 @@ # MIDI Follow Mode templates for Melbourne Instruments' Roto-Control motorized MIDI controller -The subfolders contain MIDI Follow Mode templates for [Melbourne Instruments' Roto-Control motorized MIDI controller](https://www.melbourneinstruments.com/rotocontrol). All templates use MIDI channel 15. See each folders `README.md` file for more specific information about the templates. +Subfolders contain MIDI Follow Mode templates for [Melbourne Instruments' Roto-Control motorized MIDI controller](https://www.melbourneinstruments.com/rotocontrol). All templates use MIDI channel 15. See each folders `README.md` file for more specific information about the templates. (Currently there is only the folder `all_parameters` but more are in the works.) `roto-control_summarize.py` is a python script that takes one or more Roto-Control setup `.json`-files and creates a summary table of the mapped parameters. Enter `python3 roto-control_summarize.py -h` in your terminal to see its documentation. diff --git a/contrib/midi_follow/roto_control/all_parameters/README.md b/contrib/midi_follow/roto_control/all_parameters/README.md index 9a047425c0..5c4a29eeb9 100644 --- a/contrib/midi_follow/roto_control/all_parameters/README.md +++ b/contrib/midi_follow/roto_control/all_parameters/README.md @@ -22,7 +22,6 @@ Below is a summary table, where `Position` is the knob's position and `Page` is | **LPF Resonanc** | 6 | 1 | Deluge P1 | 71 | | **HPF Cutoff** | 7 | 1 | Deluge P1 | 81 | | **HPF Resonan** | 8 | 1 | Deluge P1 | 82 | - | **OSC1 Level** | 9 | 2 | Deluge P1 | 21 | | **OSC1 Pitch** | 10 | 2 | Deluge P1 | 12 | | **OSC1 PW** | 11 | 2 | Deluge P1 | 23 | @@ -31,7 +30,6 @@ Below is a summary table, where `Position` is the knob's position and `Page` is | **FM1 Level** | 14 | 2 | Deluge P1 | 54 | | **FM1 Pitch** | 15 | 2 | Deluge P1 | 14 | | **FM1 Feedback** | 16 | 2 | Deluge P1 | 55 | - | **OSC2 Level** | 17 | 3 | Deluge P1 | 26 | | **OSC2 Pitch** | 18 | 3 | Deluge P1 | 13 | | **OSC2 PW** | 19 | 3 | Deluge P1 | 28 | @@ -40,7 +38,6 @@ Below is a summary table, where `Position` is the knob's position and `Page` is | **FM2 Level** | 22 | 3 | Deluge P1 | 56 | | **FM2 Pitch** | 23 | 3 | Deluge P1 | 15 | | **FM2 Feedback** | 24 | 3 | Deluge P1 | 57 | - | **ENV1 Attack** | 25 | 4 | Deluge P1 | 73 | | **ENV1 Decay** | 26 | 4 | Deluge P1 | 75 | | **ENV1 Sustain** | 27 | 4 | Deluge P1 | 76 | @@ -49,7 +46,6 @@ Below is a summary table, where `Position` is the knob's position and `Page` is | **ENV2 Decay** | 30 | 4 | Deluge P1 | 78 | | **ENV2 Sustain** | 31 | 4 | Deluge P1 | 79 | | **ENV2 Release** | 32 | 4 | Deluge P1 | 80 | - | **EQ-Bass Freq** | 1 | 1 | Deluge P2 | 84 | | **EQ-Bass Gain** | 2 | 1 | Deluge P2 | 86 | | **EQ-Treb Freq** | 3 | 1 | Deluge P2 | 85 | @@ -58,7 +54,6 @@ Below is a summary table, where `Position` is the knob's position and `Page` is | **REVERB Amoun** | 6 | 1 | Deluge P2 | 91 | | **DELAY Amount** | 7 | 1 | Deluge P2 | 52 | | **DELAY Rate** | 8 | 1 | Deluge P2 | 53 | - | **MODFX Rate** | 9 | 2 | Deluge P2 | 16 | | **MODFX Depth** | 10 | 2 | Deluge P2 | 93 | | **MODFX Feedb** | 11 | 2 | Deluge P2 | 17 | @@ -67,7 +62,6 @@ Below is a summary table, where `Position` is the knob's position and `Page` is | **Bitcrush** | 14 | 2 | Deluge P2 | 62 | | **Decimation** | 15 | 2 | Deluge P2 | 63 | | | 16 | 2 | Deluge P2 | | - | **LFO1 Rate** | 17 | 3 | Deluge P2 | 58 | | **LFO2 Rate** | 18 | 3 | Deluge P2 | 59 | | **LPF Morph** | 19 | 3 | Deluge P2 | 70 | @@ -76,7 +70,6 @@ Below is a summary table, where `Position` is the knob's position and `Page` is | **SIDECH Level** | 22 | 3 | Deluge P2 | 61 | | **SIDECH Shape** | 23 | 3 | Deluge P2 | 60 | | **Comp Tresh** | 24 | 3 | Deluge P2 | 27 | - | **ENV3 Attack** | 25 | 4 | Deluge P2 | 102 | | **ENV3 Decay** | 26 | 4 | Deluge P2 | 103 | | **ENV3 Sustain** | 27 | 4 | Deluge P2 | 104 | @@ -85,7 +78,6 @@ Below is a summary table, where `Position` is the knob's position and `Page` is | **ENV4 Decay** | 30 | 4 | Deluge P2 | 107 | | **ENV4 Sustain** | 31 | 4 | Deluge P2 | 108 | | **ENV4 Release** | 32 | 4 | Deluge P2 | 109 | - | **ARP Rate** | 1 | 1 | Deluge P3 | 51 | | **ARP Gate** | 2 | 1 | Deluge P3 | 50 | | **ARP GateSpr** | 3 | 1 | Deluge P3 | 40 | @@ -94,7 +86,6 @@ Below is a summary table, where `Position` is the knob's position and `Page` is | **ARP Rhythm** | 6 | 1 | Deluge P3 | 42 | | **ARP SeqLen** | 7 | 1 | Deluge P3 | 43 | | **ARP RevProb** | 8 | 1 | Deluge P3 | 36 | - | **ARP ChoPoly** | 9 | 2 | Deluge P3 | 44 | | **ARP ChoProb** | 10 | 2 | Deluge P3 | 48 | | **ARP RatchAm** | 11 | 2 | Deluge P3 | 45 | @@ -103,7 +94,6 @@ Below is a summary table, where `Position` is the knob's position and `Page` is | **ARP BassProb** | 14 | 2 | Deluge P3 | 47 | | | 15 | 2 | Deluge P3 | | | | 16 | 2 | Deluge P3 | | - | | 17 | 3 | Deluge P3 | | | | 18 | 3 | Deluge P3 | | | | 19 | 3 | Deluge P3 | | @@ -112,7 +102,6 @@ Below is a summary table, where `Position` is the knob's position and `Page` is | | 22 | 3 | Deluge P3 | | | | 23 | 3 | Deluge P3 | | | | 24 | 3 | Deluge P3 | | - | | 25 | 4 | Deluge P3 | | | | 26 | 4 | Deluge P3 | | | | 27 | 4 | Deluge P3 | | @@ -122,7 +111,6 @@ Below is a summary table, where `Position` is the knob's position and `Page` is | | 31 | 4 | Deluge P3 | | | | 32 | 4 | Deluge P3 | | - MIDI channel: 15 diff --git a/contrib/midi_follow/roto_control/roto-control_summarize.py b/contrib/midi_follow/roto_control/roto-control_summarize.py index 93dbfb5e75..90e77fbb58 100644 --- a/contrib/midi_follow/roto_control/roto-control_summarize.py +++ b/contrib/midi_follow/roto_control/roto-control_summarize.py @@ -92,7 +92,7 @@ def generate_markdown_table(rows, midi_channels, single_setup=False): markdown += "\n" # Build table rows - for i, row in enumerate(rows, start=1): + for row in rows: markdown += f"| {row['Parameter']} | {row['Position']} | {row['Page']} |" if not single_setup: markdown += f" {row['Setup']} |" @@ -105,8 +105,6 @@ def generate_markdown_table(rows, midi_channels, single_setup=False): midi_display = "" markdown += f" {midi_display} |" markdown += "\n" - if i % 8 == 0: - markdown += "\n" # Append MIDI channel summary if needed if len(unique_channels) == 1 and most_common_channel is not None: From 2304f16df0e61e198f4e9f6526c3c28c07b96571 Mon Sep 17 00:00:00 2001 From: Stefan Herzog Date: Sun, 2 Feb 2025 23:30:01 +0100 Subject: [PATCH 05/11] roto-control, all_parameters: improve README.md --- contrib/midi_follow/roto_control/all_parameters/README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/contrib/midi_follow/roto_control/all_parameters/README.md b/contrib/midi_follow/roto_control/all_parameters/README.md index 5c4a29eeb9..0431456c13 100644 --- a/contrib/midi_follow/roto_control/all_parameters/README.md +++ b/contrib/midi_follow/roto_control/all_parameters/README.md @@ -8,9 +8,9 @@ This folder contains the three setup `.json`-files that together cover all MIDI Follow parameters (and their CC#) described in [*Appendix A - List of Deluge Parameters with Default Mapped CC's*](../../../../docs/features/midi_follow_mode.md#appendix-a---list-of-deluge-parameters-with-default-mapped-ccs). -The philosophy behind these three templates is to surface all available parameters so users can explore which parameters they might want to consolidate in within, say, a single, more performance-oriented setup. +The philosophy behind these three templates is to surface all available parameters so users can explore which parameters they might want to consolidate within, say, a single, more performance-oriented setup. -Below is a summary table, where `Position` is the knob's position and `Page` is a knob's page in the corresponding setup file.[^1] +Below is a summary table, where `Position` is the knob's position across the 32 knobs in the setup and `Page` is the knob's page (1st, 2nd, 3rd, or 4th) in the setup file.[^1] | Parameter | Position | Page | Setup | CC# | |-----------|----------|------|-------|----| From 2342a44e02956c39da14d3499f3402e66c2742b6 Mon Sep 17 00:00:00 2001 From: Stefan Herzog Date: Sun, 2 Feb 2025 23:47:41 +0100 Subject: [PATCH 06/11] midi_follow_mode.md: fix/improve image links --- docs/features/midi_follow_mode.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/features/midi_follow_mode.md b/docs/features/midi_follow_mode.md index 0728d113d7..216f99f83a 100644 --- a/docs/features/midi_follow_mode.md +++ b/docs/features/midi_follow_mode.md @@ -219,7 +219,7 @@ For users of Loopy Pro, you will find a MIDI Follow template in this folder: [MI - Open again the "Deluge Midi Follow" project and click the pencil to edit the UI, and drag a rectangle selection all the page. Copy it, open your own project and in an empy page, paste it. Do the same with the other page with Stepped Dials. -image +![](../../contrib/midi_follow/loopy_pro/loopy-pro-template-snapshot.png) ## Appendix C - Touch OSC Template for Deluge MIDI Follow Mode @@ -227,7 +227,7 @@ For users of Touch OSC, you will find a MIDI Follow template in this folder: [MI - It is setup to send and receive on Channel 15 when the Deluge is setup in the Touch OSC Connections menu -image +![](../../contrib/midi_follow/touch_osc/touch_osc.png) ## Appendix D - Electra One Template for Deluge MIDI Follow Mode From 4672b3495cfbc1ca4b5ef90e7277d247fefc12fb Mon Sep 17 00:00:00 2001 From: Stefan Herzog Date: Mon, 3 Feb 2025 01:10:05 +0100 Subject: [PATCH 07/11] Revert "midi_follow_mode.md: fix/improve image links" This reverts commit 2342a44e02956c39da14d3499f3402e66c2742b6. --- docs/features/midi_follow_mode.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/features/midi_follow_mode.md b/docs/features/midi_follow_mode.md index 216f99f83a..0728d113d7 100644 --- a/docs/features/midi_follow_mode.md +++ b/docs/features/midi_follow_mode.md @@ -219,7 +219,7 @@ For users of Loopy Pro, you will find a MIDI Follow template in this folder: [MI - Open again the "Deluge Midi Follow" project and click the pencil to edit the UI, and drag a rectangle selection all the page. Copy it, open your own project and in an empy page, paste it. Do the same with the other page with Stepped Dials. -![](../../contrib/midi_follow/loopy_pro/loopy-pro-template-snapshot.png) +image ## Appendix C - Touch OSC Template for Deluge MIDI Follow Mode @@ -227,7 +227,7 @@ For users of Touch OSC, you will find a MIDI Follow template in this folder: [MI - It is setup to send and receive on Channel 15 when the Deluge is setup in the Touch OSC Connections menu -![](../../contrib/midi_follow/touch_osc/touch_osc.png) +image ## Appendix D - Electra One Template for Deluge MIDI Follow Mode From e4a513dc0b62992a2f72f65ab1b398561e7fffdb Mon Sep 17 00:00:00 2001 From: Katherine Whitlock Date: Tue, 4 Feb 2025 16:57:15 -0500 Subject: [PATCH 08/11] format roto-control_summarize.py --- .../roto_control/roto-control_summarize.py | 57 ++++++++++++++----- 1 file changed, 42 insertions(+), 15 deletions(-) diff --git a/contrib/midi_follow/roto_control/roto-control_summarize.py b/contrib/midi_follow/roto_control/roto-control_summarize.py index 90e77fbb58..f65b857ae9 100644 --- a/contrib/midi_follow/roto_control/roto-control_summarize.py +++ b/contrib/midi_follow/roto_control/roto-control_summarize.py @@ -8,6 +8,7 @@ Currently, only knobs are considered, ignoring buttons. """ + def parse_json_files(files, verbose): rows = [] midi_channels = [] # Store only valid MIDI channels @@ -15,7 +16,7 @@ def parse_json_files(files, verbose): for file in files: if verbose: print(f"Processing file: {file}") - with open(file, 'r', encoding='utf-8') as f: + with open(file, "r", encoding="utf-8") as f: data = json.load(f) setup_name = data.get("name", "Unknown Setup") seen_positions = set() # Reset per file @@ -28,16 +29,26 @@ def parse_json_files(files, verbose): if midi_channel not in ["NA", None, ""]: midi_channels.append(midi_channel) if verbose: - print(f"Found MIDI Channel: {midi_channel} for Position {position}") + print( + f"Found MIDI Channel: {midi_channel} for Position {position}" + ) seen_positions.add(position) row = { - "Parameter": f"**{knob['controlName']}**" if knob.get('controlName') else "", + "Parameter": ( + f"**{knob['controlName']}**" if knob.get("controlName") else "" + ), "Position": position, "Page": page, "Setup": setup_name, - "CC#": str(knob.get("controlParam", "")) if knob.get("controlParam", 0) != 0 else "", - "MIDI Channel": midi_channel if midi_channel not in ["NA", None, ""] else None + "CC#": ( + str(knob.get("controlParam", "")) + if knob.get("controlParam", 0) != 0 + else "" + ), + "MIDI Channel": ( + midi_channel if midi_channel not in ["NA", None, ""] else None + ), } rows.append(row) @@ -45,7 +56,9 @@ def parse_json_files(files, verbose): for pos in range(1, 33): if pos not in seen_positions: if verbose: - print(f"Empty knob at position {pos} for {setup_name}, ensuring no MIDI channel assigned.") + print( + f"Empty knob at position {pos} for {setup_name}, ensuring no MIDI channel assigned." + ) page = ((pos - 1) // 8) + 1 row = { "Parameter": "", @@ -53,7 +66,7 @@ def parse_json_files(files, verbose): "Page": page, "Setup": setup_name, "CC#": "", - "MIDI Channel": None + "MIDI Channel": None, } rows.append(row) @@ -61,14 +74,17 @@ def parse_json_files(files, verbose): print(f"Final MIDI channels found: {midi_channels}") # Sort the rows by Setup name and Position - rows.sort(key=lambda x: (x['Setup'], x['Position'])) + rows.sort(key=lambda x: (x["Setup"], x["Position"])) return rows, midi_channels + def generate_markdown_table(rows, midi_channels, single_setup=False): defined_midi_channels = [ch for ch in midi_channels if ch is not None] midi_channel_counts = Counter(defined_midi_channels) - most_common_channel, _ = midi_channel_counts.most_common(1)[0] if defined_midi_channels else (None, 0) + most_common_channel, _ = ( + midi_channel_counts.most_common(1)[0] if defined_midi_channels else (None, 0) + ) unique_channels = set(defined_midi_channels) include_midi_column = len(unique_channels) > 1 @@ -100,7 +116,11 @@ def generate_markdown_table(rows, midi_channels, single_setup=False): if include_midi_column: midi_channel = row["MIDI Channel"] if midi_channel is not None: - midi_display = str(midi_channel) if midi_channel == most_common_channel else f"**{midi_channel}**" + midi_display = ( + str(midi_channel) + if midi_channel == most_common_channel + else f"**{midi_channel}**" + ) else: midi_display = "" markdown += f" {midi_display} |" @@ -115,20 +135,26 @@ def generate_markdown_table(rows, midi_channels, single_setup=False): # If single file, add setup info below table if single_setup and rows: - setup_name = rows[0]['Setup'] + setup_name = rows[0]["Setup"] markdown += f"\nSetup: {setup_name}\n" return markdown + def generate_output_filename(files): base_name = "_".join([os.path.splitext(os.path.basename(f))[0] for f in files]) return f"roto_{base_name}.md" + def main(): parser = argparse.ArgumentParser(description=DESCRIPTION) - parser.add_argument("files", nargs='+', help="One or more JSON files to parse.") - parser.add_argument("--output", "-o", help="Optional output file to save markdown table.") - parser.add_argument("--verbose", "-v", action="store_true", help="Enable verbose debugging output.") + parser.add_argument("files", nargs="+", help="One or more JSON files to parse.") + parser.add_argument( + "--output", "-o", help="Optional output file to save markdown table." + ) + parser.add_argument( + "--verbose", "-v", action="store_true", help="Enable verbose debugging output." + ) args = parser.parse_args() rows, midi_channels = parse_json_files(args.files, args.verbose) @@ -142,9 +168,10 @@ def main(): print("\nGenerated Markdown Table:\n") print(markdown_table) - with open(output_file, 'w', encoding='utf-8') as f: + with open(output_file, "w", encoding="utf-8") as f: f.write(markdown_table) print(f"Markdown table saved to {output_file}") + if __name__ == "__main__": main() From e5d4aee7f99cc6a4b03539c4b71e8ec93f0aed13 Mon Sep 17 00:00:00 2001 From: Stefan Herzog Date: Wed, 5 Feb 2025 15:39:25 +0100 Subject: [PATCH 09/11] roto, all_parameters: use better (file) names & update docs --- .../roto_control/all_parameters/README.md | 206 +++++++++--------- .../{Deluge P1.json => all_parameters1.json} | 4 +- .../{Deluge P2.json => all_parameters2.json} | 4 +- .../{Deluge P3.json => all_parameters3.json} | 4 +- 4 files changed, 110 insertions(+), 108 deletions(-) rename contrib/midi_follow/roto_control/all_parameters/{Deluge P1.json => all_parameters1.json} (99%) rename contrib/midi_follow/roto_control/all_parameters/{Deluge P2.json => all_parameters2.json} (99%) rename contrib/midi_follow/roto_control/all_parameters/{Deluge P3.json => all_parameters3.json} (99%) diff --git a/contrib/midi_follow/roto_control/all_parameters/README.md b/contrib/midi_follow/roto_control/all_parameters/README.md index 0431456c13..83f8be3918 100644 --- a/contrib/midi_follow/roto_control/all_parameters/README.md +++ b/contrib/midi_follow/roto_control/all_parameters/README.md @@ -2,122 +2,124 @@ This folder contains the three setup `.json`-files -- `Deluge P1.json` -- `Deluge P2.json` -- `Deluge P3.json` +- `all_parameters1.json` +- `all_parameters2.json` +- `all_parameters3.json` that together cover all MIDI Follow parameters (and their CC#) described in [*Appendix A - List of Deluge Parameters with Default Mapped CC's*](../../../../docs/features/midi_follow_mode.md#appendix-a---list-of-deluge-parameters-with-default-mapped-ccs). The philosophy behind these three templates is to surface all available parameters so users can explore which parameters they might want to consolidate within, say, a single, more performance-oriented setup. -Below is a summary table, where `Position` is the knob's position across the 32 knobs in the setup and `Page` is the knob's page (1st, 2nd, 3rd, or 4th) in the setup file.[^1] +Below is a summary table, where `Position` is the knob's position across the 32 knobs and `Page` is the knob's page (1st, 2nd, 3rd, or 4th) in the setup.[^1] | Parameter | Position | Page | Setup | CC# | |-----------|----------|------|-------|----| -| **Master** | 1 | 1 | Deluge P1 | 7 | -| **Panning** | 2 | 1 | Deluge P1 | 10 | -| **Pitch** | 3 | 1 | Deluge P1 | 3 | -| **Portamento** | 4 | 1 | Deluge P1 | 5 | -| **LPF Cutoff** | 5 | 1 | Deluge P1 | 74 | -| **LPF Resonanc** | 6 | 1 | Deluge P1 | 71 | -| **HPF Cutoff** | 7 | 1 | Deluge P1 | 81 | -| **HPF Resonan** | 8 | 1 | Deluge P1 | 82 | -| **OSC1 Level** | 9 | 2 | Deluge P1 | 21 | -| **OSC1 Pitch** | 10 | 2 | Deluge P1 | 12 | -| **OSC1 PW** | 11 | 2 | Deluge P1 | 23 | -| **OSC1 WavePos** | 12 | 2 | Deluge P1 | 25 | -| **OSC1 Feedb** | 13 | 2 | Deluge P1 | 24 | -| **FM1 Level** | 14 | 2 | Deluge P1 | 54 | -| **FM1 Pitch** | 15 | 2 | Deluge P1 | 14 | -| **FM1 Feedback** | 16 | 2 | Deluge P1 | 55 | -| **OSC2 Level** | 17 | 3 | Deluge P1 | 26 | -| **OSC2 Pitch** | 18 | 3 | Deluge P1 | 13 | -| **OSC2 PW** | 19 | 3 | Deluge P1 | 28 | -| **OSC2 WavePos** | 20 | 3 | Deluge P1 | 30 | -| **OSC2 Feedb** | 21 | 3 | Deluge P1 | 29 | -| **FM2 Level** | 22 | 3 | Deluge P1 | 56 | -| **FM2 Pitch** | 23 | 3 | Deluge P1 | 15 | -| **FM2 Feedback** | 24 | 3 | Deluge P1 | 57 | -| **ENV1 Attack** | 25 | 4 | Deluge P1 | 73 | -| **ENV1 Decay** | 26 | 4 | Deluge P1 | 75 | -| **ENV1 Sustain** | 27 | 4 | Deluge P1 | 76 | -| **ENV1 Release** | 28 | 4 | Deluge P1 | 72 | -| **ENV2 Attack** | 29 | 4 | Deluge P1 | 77 | -| **ENV2 Decay** | 30 | 4 | Deluge P1 | 78 | -| **ENV2 Sustain** | 31 | 4 | Deluge P1 | 79 | -| **ENV2 Release** | 32 | 4 | Deluge P1 | 80 | -| **EQ-Bass Freq** | 1 | 1 | Deluge P2 | 84 | -| **EQ-Bass Gain** | 2 | 1 | Deluge P2 | 86 | -| **EQ-Treb Freq** | 3 | 1 | Deluge P2 | 85 | -| **EQ-Treb Gain** | 4 | 1 | Deluge P2 | 87 | -| **Noise** | 5 | 1 | Deluge P2 | 41 | -| **REVERB Amoun** | 6 | 1 | Deluge P2 | 91 | -| **DELAY Amount** | 7 | 1 | Deluge P2 | 52 | -| **DELAY Rate** | 8 | 1 | Deluge P2 | 53 | -| **MODFX Rate** | 9 | 2 | Deluge P2 | 16 | -| **MODFX Depth** | 10 | 2 | Deluge P2 | 93 | -| **MODFX Feedb** | 11 | 2 | Deluge P2 | 17 | -| **MODFX Offset** | 12 | 2 | Deluge P2 | 18 | -| **Wavefold** | 13 | 2 | Deluge P2 | 19 | -| **Bitcrush** | 14 | 2 | Deluge P2 | 62 | -| **Decimation** | 15 | 2 | Deluge P2 | 63 | -| | 16 | 2 | Deluge P2 | | -| **LFO1 Rate** | 17 | 3 | Deluge P2 | 58 | -| **LFO2 Rate** | 18 | 3 | Deluge P2 | 59 | -| **LPF Morph** | 19 | 3 | Deluge P2 | 70 | -| **HPF Morph** | 20 | 3 | Deluge P2 | 83 | -| **STUTTER Rate** | 21 | 3 | Deluge P2 | 20 | -| **SIDECH Level** | 22 | 3 | Deluge P2 | 61 | -| **SIDECH Shape** | 23 | 3 | Deluge P2 | 60 | -| **Comp Tresh** | 24 | 3 | Deluge P2 | 27 | -| **ENV3 Attack** | 25 | 4 | Deluge P2 | 102 | -| **ENV3 Decay** | 26 | 4 | Deluge P2 | 103 | -| **ENV3 Sustain** | 27 | 4 | Deluge P2 | 104 | -| **ENV3 Release** | 28 | 4 | Deluge P2 | 105 | -| **ENV4 Attack** | 29 | 4 | Deluge P2 | 106 | -| **ENV4 Decay** | 30 | 4 | Deluge P2 | 107 | -| **ENV4 Sustain** | 31 | 4 | Deluge P2 | 108 | -| **ENV4 Release** | 32 | 4 | Deluge P2 | 109 | -| **ARP Rate** | 1 | 1 | Deluge P3 | 51 | -| **ARP Gate** | 2 | 1 | Deluge P3 | 50 | -| **ARP GateSpr** | 3 | 1 | Deluge P3 | 40 | -| **ARP OctSpr** | 4 | 1 | Deluge P3 | 39 | -| **ARP VelSpr** | 5 | 1 | Deluge P3 | 37 | -| **ARP Rhythm** | 6 | 1 | Deluge P3 | 42 | -| **ARP SeqLen** | 7 | 1 | Deluge P3 | 43 | -| **ARP RevProb** | 8 | 1 | Deluge P3 | 36 | -| **ARP ChoPoly** | 9 | 2 | Deluge P3 | 44 | -| **ARP ChoProb** | 10 | 2 | Deluge P3 | 48 | -| **ARP RatchAm** | 11 | 2 | Deluge P3 | 45 | -| **ARP RatchPr** | 12 | 2 | Deluge P3 | 49 | -| **ARP NoteProb** | 13 | 2 | Deluge P3 | 46 | -| **ARP BassProb** | 14 | 2 | Deluge P3 | 47 | -| | 15 | 2 | Deluge P3 | | -| | 16 | 2 | Deluge P3 | | -| | 17 | 3 | Deluge P3 | | -| | 18 | 3 | Deluge P3 | | -| | 19 | 3 | Deluge P3 | | -| | 20 | 3 | Deluge P3 | | -| | 21 | 3 | Deluge P3 | | -| | 22 | 3 | Deluge P3 | | -| | 23 | 3 | Deluge P3 | | -| | 24 | 3 | Deluge P3 | | -| | 25 | 4 | Deluge P3 | | -| | 26 | 4 | Deluge P3 | | -| | 27 | 4 | Deluge P3 | | -| | 28 | 4 | Deluge P3 | | -| | 29 | 4 | Deluge P3 | | -| | 30 | 4 | Deluge P3 | | -| | 31 | 4 | Deluge P3 | | -| | 32 | 4 | Deluge P3 | | +| **Master** | 1 | 1 | all_parameters1 | 7 | +| **Panning** | 2 | 1 | all_parameters1 | 10 | +| **Pitch** | 3 | 1 | all_parameters1 | 3 | +| **Portamento** | 4 | 1 | all_parameters1 | 5 | +| **LPF Cutoff** | 5 | 1 | all_parameters1 | 74 | +| **LPF Resonanc** | 6 | 1 | all_parameters1 | 71 | +| **HPF Cutoff** | 7 | 1 | all_parameters1 | 81 | +| **HPF Resonan** | 8 | 1 | all_parameters1 | 82 | +| **OSC1 Level** | 9 | 2 | all_parameters1 | 21 | +| **OSC1 Pitch** | 10 | 2 | all_parameters1 | 12 | +| **OSC1 PW** | 11 | 2 | all_parameters1 | 23 | +| **OSC1 WavePos** | 12 | 2 | all_parameters1 | 25 | +| **OSC1 Feedb** | 13 | 2 | all_parameters1 | 24 | +| **FM1 Level** | 14 | 2 | all_parameters1 | 54 | +| **FM1 Pitch** | 15 | 2 | all_parameters1 | 14 | +| **FM1 Feedback** | 16 | 2 | all_parameters1 | 55 | +| **OSC2 Level** | 17 | 3 | all_parameters1 | 26 | +| **OSC2 Pitch** | 18 | 3 | all_parameters1 | 13 | +| **OSC2 PW** | 19 | 3 | all_parameters1 | 28 | +| **OSC2 WavePos** | 20 | 3 | all_parameters1 | 30 | +| **OSC2 Feedb** | 21 | 3 | all_parameters1 | 29 | +| **FM2 Level** | 22 | 3 | all_parameters1 | 56 | +| **FM2 Pitch** | 23 | 3 | all_parameters1 | 15 | +| **FM2 Feedback** | 24 | 3 | all_parameters1 | 57 | +| **ENV1 Attack** | 25 | 4 | all_parameters1 | 73 | +| **ENV1 Decay** | 26 | 4 | all_parameters1 | 75 | +| **ENV1 Sustain** | 27 | 4 | all_parameters1 | 76 | +| **ENV1 Release** | 28 | 4 | all_parameters1 | 72 | +| **ENV2 Attack** | 29 | 4 | all_parameters1 | 77 | +| **ENV2 Decay** | 30 | 4 | all_parameters1 | 78 | +| **ENV2 Sustain** | 31 | 4 | all_parameters1 | 79 | +| **ENV2 Release** | 32 | 4 | all_parameters1 | 80 | +| **EQ-Bass Freq** | 1 | 1 | all_parameters2 | 84 | +| **EQ-Bass Gain** | 2 | 1 | all_parameters2 | 86 | +| **EQ-Treb Freq** | 3 | 1 | all_parameters2 | 85 | +| **EQ-Treb Gain** | 4 | 1 | all_parameters2 | 87 | +| **Noise** | 5 | 1 | all_parameters2 | 41 | +| **REVERB Amoun** | 6 | 1 | all_parameters2 | 91 | +| **DELAY Amount** | 7 | 1 | all_parameters2 | 52 | +| **DELAY Rate** | 8 | 1 | all_parameters2 | 53 | +| **MODFX Rate** | 9 | 2 | all_parameters2 | 16 | +| **MODFX Depth** | 10 | 2 | all_parameters2 | 93 | +| **MODFX Feedb** | 11 | 2 | all_parameters2 | 17 | +| **MODFX Offset** | 12 | 2 | all_parameters2 | 18 | +| **Wavefold** | 13 | 2 | all_parameters2 | 19 | +| **Bitcrush** | 14 | 2 | all_parameters2 | 62 | +| **Decimation** | 15 | 2 | all_parameters2 | 63 | +| | 16 | 2 | all_parameters2 | | +| **LFO1 Rate** | 17 | 3 | all_parameters2 | 58 | +| **LFO2 Rate** | 18 | 3 | all_parameters2 | 59 | +| **LPF Morph** | 19 | 3 | all_parameters2 | 70 | +| **HPF Morph** | 20 | 3 | all_parameters2 | 83 | +| **STUTTER Rate** | 21 | 3 | all_parameters2 | 20 | +| **SIDECH Level** | 22 | 3 | all_parameters2 | 61 | +| **SIDECH Shape** | 23 | 3 | all_parameters2 | 60 | +| **Comp Tresh** | 24 | 3 | all_parameters2 | 27 | +| **ENV3 Attack** | 25 | 4 | all_parameters2 | 102 | +| **ENV3 Decay** | 26 | 4 | all_parameters2 | 103 | +| **ENV3 Sustain** | 27 | 4 | all_parameters2 | 104 | +| **ENV3 Release** | 28 | 4 | all_parameters2 | 105 | +| **ENV4 Attack** | 29 | 4 | all_parameters2 | 106 | +| **ENV4 Decay** | 30 | 4 | all_parameters2 | 107 | +| **ENV4 Sustain** | 31 | 4 | all_parameters2 | 108 | +| **ENV4 Release** | 32 | 4 | all_parameters2 | 109 | +| **ARP Rate** | 1 | 1 | all_parameters3 | 51 | +| **ARP Gate** | 2 | 1 | all_parameters3 | 50 | +| **ARP GateSpr** | 3 | 1 | all_parameters3 | 40 | +| **ARP OctSpr** | 4 | 1 | all_parameters3 | 39 | +| **ARP VelSpr** | 5 | 1 | all_parameters3 | 37 | +| **ARP Rhythm** | 6 | 1 | all_parameters3 | 42 | +| **ARP SeqLen** | 7 | 1 | all_parameters3 | 43 | +| **ARP RevProb** | 8 | 1 | all_parameters3 | 36 | +| **ARP ChoPoly** | 9 | 2 | all_parameters3 | 44 | +| **ARP ChoProb** | 10 | 2 | all_parameters3 | 48 | +| **ARP RatchAm** | 11 | 2 | all_parameters3 | 45 | +| **ARP RatchPr** | 12 | 2 | all_parameters3 | 49 | +| **ARP NoteProb** | 13 | 2 | all_parameters3 | 46 | +| **ARP BassProb** | 14 | 2 | all_parameters3 | 47 | +| | 15 | 2 | all_parameters3 | | +| | 16 | 2 | all_parameters3 | | +| | 17 | 3 | all_parameters3 | | +| | 18 | 3 | all_parameters3 | | +| | 19 | 3 | all_parameters3 | | +| | 20 | 3 | all_parameters3 | | +| | 21 | 3 | all_parameters3 | | +| | 22 | 3 | all_parameters3 | | +| | 23 | 3 | all_parameters3 | | +| | 24 | 3 | all_parameters3 | | +| | 25 | 4 | all_parameters3 | | +| | 26 | 4 | all_parameters3 | | +| | 27 | 4 | all_parameters3 | | +| | 28 | 4 | all_parameters3 | | +| | 29 | 4 | all_parameters3 | | +| | 30 | 4 | all_parameters3 | | +| | 31 | 4 | all_parameters3 | | +| | 32 | 4 | all_parameters3 | | MIDI channel: 15 -[^1]: Unassigned knobs show up in the table with no parameter name and CC#. The table was automatically produced by calling +[^1]: Unassigned knobs show up in the table with no parameter name and CC#. + + The table was automatically produced by calling ```python - python3 roto-control_summarize.py "all_parameters/Deluge P1.json" "all_parameters/Deluge P2.json" "all_parameters/Deluge P3.json" + python3 roto-control_summarize.py "all_parameters/all_parameters1.json" "all_parameters/all_parameters2.json" "all_parameters/all_parameters3.json" ``` from the `roto_control` directory one level above. So barring any errors in the script, the mappings summarized in the table should, by construction, match with the actual setup information encoded in the respective `.json` files. diff --git a/contrib/midi_follow/roto_control/all_parameters/Deluge P1.json b/contrib/midi_follow/roto_control/all_parameters/all_parameters1.json similarity index 99% rename from contrib/midi_follow/roto_control/all_parameters/Deluge P1.json rename to contrib/midi_follow/roto_control/all_parameters/all_parameters1.json index 2b6372cc14..e904159dee 100644 --- a/contrib/midi_follow/roto_control/all_parameters/Deluge P1.json +++ b/contrib/midi_follow/roto_control/all_parameters/all_parameters1.json @@ -1,8 +1,8 @@ { "version": 1, "type": "MIDI", - "name": "Deluge P1", - "index": 2, + "name": "all_parameters1", + "index": 0, "knobs": [ { "controlIndex": 0, diff --git a/contrib/midi_follow/roto_control/all_parameters/Deluge P2.json b/contrib/midi_follow/roto_control/all_parameters/all_parameters2.json similarity index 99% rename from contrib/midi_follow/roto_control/all_parameters/Deluge P2.json rename to contrib/midi_follow/roto_control/all_parameters/all_parameters2.json index a175716ce2..22f80c8187 100644 --- a/contrib/midi_follow/roto_control/all_parameters/Deluge P2.json +++ b/contrib/midi_follow/roto_control/all_parameters/all_parameters2.json @@ -1,8 +1,8 @@ { "version": 1, "type": "MIDI", - "name": "Deluge P2", - "index": 3, + "name": "all_parameters2", + "index": 1, "knobs": [ { "controlIndex": 0, diff --git a/contrib/midi_follow/roto_control/all_parameters/Deluge P3.json b/contrib/midi_follow/roto_control/all_parameters/all_parameters3.json similarity index 99% rename from contrib/midi_follow/roto_control/all_parameters/Deluge P3.json rename to contrib/midi_follow/roto_control/all_parameters/all_parameters3.json index d97a10d69d..239ff2d2b6 100644 --- a/contrib/midi_follow/roto_control/all_parameters/Deluge P3.json +++ b/contrib/midi_follow/roto_control/all_parameters/all_parameters3.json @@ -1,8 +1,8 @@ { "version": 1, "type": "MIDI", - "name": "Deluge P3", - "index": 4, + "name": "all_parameters3", + "index": 2, "knobs": [ { "controlIndex": 0, From 1a5b0c99cc049f3a926d6ac318450e0a3208f3c8 Mon Sep 17 00:00:00 2001 From: Stefan Herzog Date: Wed, 5 Feb 2025 17:00:20 +0100 Subject: [PATCH 10/11] roto, all_parameters: use better (file) names & update docs (2) --- contrib/midi_follow/roto_control/README.md | 7 +- .../{all_parameters1.json => D_1.json} | 6 +- .../{all_parameters2.json => D_2.json} | 8 +- .../{all_parameters3.json => D_3.json} | 2 +- .../roto_control/all_parameters/README.md | 205 +++++++++--------- 5 files changed, 116 insertions(+), 112 deletions(-) rename contrib/midi_follow/roto_control/all_parameters/{all_parameters1.json => D_1.json} (99%) rename contrib/midi_follow/roto_control/all_parameters/{all_parameters2.json => D_2.json} (99%) rename contrib/midi_follow/roto_control/all_parameters/{all_parameters3.json => D_3.json} (99%) diff --git a/contrib/midi_follow/roto_control/README.md b/contrib/midi_follow/roto_control/README.md index 7cc973d60f..6a57f2915c 100644 --- a/contrib/midi_follow/roto_control/README.md +++ b/contrib/midi_follow/roto_control/README.md @@ -1,5 +1,10 @@ # MIDI Follow Mode templates for Melbourne Instruments' Roto-Control motorized MIDI controller -Subfolders contain MIDI Follow Mode templates for [Melbourne Instruments' Roto-Control motorized MIDI controller](https://www.melbourneinstruments.com/rotocontrol). All templates use MIDI channel 15. See each folders `README.md` file for more specific information about the templates. (Currently there is only the folder `all_parameters` but more are in the works.) +Subfolders contain MIDI Follow Mode templates for [Melbourne Instruments' Roto-Control motorized MIDI controller](https://www.melbourneinstruments.com/rotocontrol). + +- `all_parameters` +- `synth_perform` + +All templates use MIDI channel 15. See each folders `README.md` file for more specific information about the templates. `roto-control_summarize.py` is a python script that takes one or more Roto-Control setup `.json`-files and creates a summary table of the mapped parameters. Enter `python3 roto-control_summarize.py -h` in your terminal to see its documentation. diff --git a/contrib/midi_follow/roto_control/all_parameters/all_parameters1.json b/contrib/midi_follow/roto_control/all_parameters/D_1.json similarity index 99% rename from contrib/midi_follow/roto_control/all_parameters/all_parameters1.json rename to contrib/midi_follow/roto_control/all_parameters/D_1.json index e904159dee..4efe6b5db4 100644 --- a/contrib/midi_follow/roto_control/all_parameters/all_parameters1.json +++ b/contrib/midi_follow/roto_control/all_parameters/D_1.json @@ -1,7 +1,7 @@ { "version": 1, "type": "MIDI", - "name": "all_parameters1", + "name": "D_1", "index": 0, "knobs": [ { @@ -12,7 +12,7 @@ "nrpnAddress": 0, "minValue": 0, "maxValue": 127, - "controlName": "Master", + "controlName": "Master Vol", "colorScheme": 13, "hapticMode": 0, "hapticIndent1": 255, @@ -78,7 +78,7 @@ "nrpnAddress": 0, "minValue": 0, "maxValue": 127, - "controlName": "Pitch", + "controlName": "Master Pitch", "colorScheme": 13, "hapticMode": 0, "hapticIndent1": 64, diff --git a/contrib/midi_follow/roto_control/all_parameters/all_parameters2.json b/contrib/midi_follow/roto_control/all_parameters/D_2.json similarity index 99% rename from contrib/midi_follow/roto_control/all_parameters/all_parameters2.json rename to contrib/midi_follow/roto_control/all_parameters/D_2.json index 22f80c8187..b5dc2d98c0 100644 --- a/contrib/midi_follow/roto_control/all_parameters/all_parameters2.json +++ b/contrib/midi_follow/roto_control/all_parameters/D_2.json @@ -1,7 +1,7 @@ { "version": 1, "type": "MIDI", - "name": "all_parameters2", + "name": "D_2", "index": 1, "knobs": [ { @@ -48,7 +48,7 @@ "controlName": "EQ-Bass Gain", "colorScheme": 53, "hapticMode": 0, - "hapticIndent1": 255, + "hapticIndent1": 64, "hapticIndent2": 255, "hapticSteps": 0, "stepNames": [ @@ -114,7 +114,7 @@ "controlName": "EQ-Treb Gain", "colorScheme": 26, "hapticMode": 0, - "hapticIndent1": 255, + "hapticIndent1": 64, "hapticIndent2": 255, "hapticSteps": 0, "stepNames": [ @@ -213,7 +213,7 @@ "controlName": "DELAY Amount", "colorScheme": 74, "hapticMode": 0, - "hapticIndent1": 255, + "hapticIndent1": 64, "hapticIndent2": 255, "hapticSteps": 0, "stepNames": [ diff --git a/contrib/midi_follow/roto_control/all_parameters/all_parameters3.json b/contrib/midi_follow/roto_control/all_parameters/D_3.json similarity index 99% rename from contrib/midi_follow/roto_control/all_parameters/all_parameters3.json rename to contrib/midi_follow/roto_control/all_parameters/D_3.json index 239ff2d2b6..04ff3b7dd9 100644 --- a/contrib/midi_follow/roto_control/all_parameters/all_parameters3.json +++ b/contrib/midi_follow/roto_control/all_parameters/D_3.json @@ -1,7 +1,7 @@ { "version": 1, "type": "MIDI", - "name": "all_parameters3", + "name": "D_3", "index": 2, "knobs": [ { diff --git a/contrib/midi_follow/roto_control/all_parameters/README.md b/contrib/midi_follow/roto_control/all_parameters/README.md index 83f8be3918..dd3a2aefb1 100644 --- a/contrib/midi_follow/roto_control/all_parameters/README.md +++ b/contrib/midi_follow/roto_control/all_parameters/README.md @@ -1,10 +1,10 @@ -# All parameters +# All parameters (MIDI Follow Mode Template for Melbourne Instruments ROTO-CONTROL) This folder contains the three setup `.json`-files -- `all_parameters1.json` -- `all_parameters2.json` -- `all_parameters3.json` +- `D_1.json` +- `D_2.json` +- `D_3.json` that together cover all MIDI Follow parameters (and their CC#) described in [*Appendix A - List of Deluge Parameters with Default Mapped CC's*](../../../../docs/features/midi_follow_mode.md#appendix-a---list-of-deluge-parameters-with-default-mapped-ccs). @@ -14,112 +14,111 @@ Below is a summary table, where `Position` is the knob's position across the 32 | Parameter | Position | Page | Setup | CC# | |-----------|----------|------|-------|----| -| **Master** | 1 | 1 | all_parameters1 | 7 | -| **Panning** | 2 | 1 | all_parameters1 | 10 | -| **Pitch** | 3 | 1 | all_parameters1 | 3 | -| **Portamento** | 4 | 1 | all_parameters1 | 5 | -| **LPF Cutoff** | 5 | 1 | all_parameters1 | 74 | -| **LPF Resonanc** | 6 | 1 | all_parameters1 | 71 | -| **HPF Cutoff** | 7 | 1 | all_parameters1 | 81 | -| **HPF Resonan** | 8 | 1 | all_parameters1 | 82 | -| **OSC1 Level** | 9 | 2 | all_parameters1 | 21 | -| **OSC1 Pitch** | 10 | 2 | all_parameters1 | 12 | -| **OSC1 PW** | 11 | 2 | all_parameters1 | 23 | -| **OSC1 WavePos** | 12 | 2 | all_parameters1 | 25 | -| **OSC1 Feedb** | 13 | 2 | all_parameters1 | 24 | -| **FM1 Level** | 14 | 2 | all_parameters1 | 54 | -| **FM1 Pitch** | 15 | 2 | all_parameters1 | 14 | -| **FM1 Feedback** | 16 | 2 | all_parameters1 | 55 | -| **OSC2 Level** | 17 | 3 | all_parameters1 | 26 | -| **OSC2 Pitch** | 18 | 3 | all_parameters1 | 13 | -| **OSC2 PW** | 19 | 3 | all_parameters1 | 28 | -| **OSC2 WavePos** | 20 | 3 | all_parameters1 | 30 | -| **OSC2 Feedb** | 21 | 3 | all_parameters1 | 29 | -| **FM2 Level** | 22 | 3 | all_parameters1 | 56 | -| **FM2 Pitch** | 23 | 3 | all_parameters1 | 15 | -| **FM2 Feedback** | 24 | 3 | all_parameters1 | 57 | -| **ENV1 Attack** | 25 | 4 | all_parameters1 | 73 | -| **ENV1 Decay** | 26 | 4 | all_parameters1 | 75 | -| **ENV1 Sustain** | 27 | 4 | all_parameters1 | 76 | -| **ENV1 Release** | 28 | 4 | all_parameters1 | 72 | -| **ENV2 Attack** | 29 | 4 | all_parameters1 | 77 | -| **ENV2 Decay** | 30 | 4 | all_parameters1 | 78 | -| **ENV2 Sustain** | 31 | 4 | all_parameters1 | 79 | -| **ENV2 Release** | 32 | 4 | all_parameters1 | 80 | -| **EQ-Bass Freq** | 1 | 1 | all_parameters2 | 84 | -| **EQ-Bass Gain** | 2 | 1 | all_parameters2 | 86 | -| **EQ-Treb Freq** | 3 | 1 | all_parameters2 | 85 | -| **EQ-Treb Gain** | 4 | 1 | all_parameters2 | 87 | -| **Noise** | 5 | 1 | all_parameters2 | 41 | -| **REVERB Amoun** | 6 | 1 | all_parameters2 | 91 | -| **DELAY Amount** | 7 | 1 | all_parameters2 | 52 | -| **DELAY Rate** | 8 | 1 | all_parameters2 | 53 | -| **MODFX Rate** | 9 | 2 | all_parameters2 | 16 | -| **MODFX Depth** | 10 | 2 | all_parameters2 | 93 | -| **MODFX Feedb** | 11 | 2 | all_parameters2 | 17 | -| **MODFX Offset** | 12 | 2 | all_parameters2 | 18 | -| **Wavefold** | 13 | 2 | all_parameters2 | 19 | -| **Bitcrush** | 14 | 2 | all_parameters2 | 62 | -| **Decimation** | 15 | 2 | all_parameters2 | 63 | -| | 16 | 2 | all_parameters2 | | -| **LFO1 Rate** | 17 | 3 | all_parameters2 | 58 | -| **LFO2 Rate** | 18 | 3 | all_parameters2 | 59 | -| **LPF Morph** | 19 | 3 | all_parameters2 | 70 | -| **HPF Morph** | 20 | 3 | all_parameters2 | 83 | -| **STUTTER Rate** | 21 | 3 | all_parameters2 | 20 | -| **SIDECH Level** | 22 | 3 | all_parameters2 | 61 | -| **SIDECH Shape** | 23 | 3 | all_parameters2 | 60 | -| **Comp Tresh** | 24 | 3 | all_parameters2 | 27 | -| **ENV3 Attack** | 25 | 4 | all_parameters2 | 102 | -| **ENV3 Decay** | 26 | 4 | all_parameters2 | 103 | -| **ENV3 Sustain** | 27 | 4 | all_parameters2 | 104 | -| **ENV3 Release** | 28 | 4 | all_parameters2 | 105 | -| **ENV4 Attack** | 29 | 4 | all_parameters2 | 106 | -| **ENV4 Decay** | 30 | 4 | all_parameters2 | 107 | -| **ENV4 Sustain** | 31 | 4 | all_parameters2 | 108 | -| **ENV4 Release** | 32 | 4 | all_parameters2 | 109 | -| **ARP Rate** | 1 | 1 | all_parameters3 | 51 | -| **ARP Gate** | 2 | 1 | all_parameters3 | 50 | -| **ARP GateSpr** | 3 | 1 | all_parameters3 | 40 | -| **ARP OctSpr** | 4 | 1 | all_parameters3 | 39 | -| **ARP VelSpr** | 5 | 1 | all_parameters3 | 37 | -| **ARP Rhythm** | 6 | 1 | all_parameters3 | 42 | -| **ARP SeqLen** | 7 | 1 | all_parameters3 | 43 | -| **ARP RevProb** | 8 | 1 | all_parameters3 | 36 | -| **ARP ChoPoly** | 9 | 2 | all_parameters3 | 44 | -| **ARP ChoProb** | 10 | 2 | all_parameters3 | 48 | -| **ARP RatchAm** | 11 | 2 | all_parameters3 | 45 | -| **ARP RatchPr** | 12 | 2 | all_parameters3 | 49 | -| **ARP NoteProb** | 13 | 2 | all_parameters3 | 46 | -| **ARP BassProb** | 14 | 2 | all_parameters3 | 47 | -| | 15 | 2 | all_parameters3 | | -| | 16 | 2 | all_parameters3 | | -| | 17 | 3 | all_parameters3 | | -| | 18 | 3 | all_parameters3 | | -| | 19 | 3 | all_parameters3 | | -| | 20 | 3 | all_parameters3 | | -| | 21 | 3 | all_parameters3 | | -| | 22 | 3 | all_parameters3 | | -| | 23 | 3 | all_parameters3 | | -| | 24 | 3 | all_parameters3 | | -| | 25 | 4 | all_parameters3 | | -| | 26 | 4 | all_parameters3 | | -| | 27 | 4 | all_parameters3 | | -| | 28 | 4 | all_parameters3 | | -| | 29 | 4 | all_parameters3 | | -| | 30 | 4 | all_parameters3 | | -| | 31 | 4 | all_parameters3 | | -| | 32 | 4 | all_parameters3 | | +| **Master Vol** | 1 | 1 | D_1 | 7 | +| **Panning** | 2 | 1 | D_1 | 10 | +| **Master Pitch** | 3 | 1 | D_1 | 3 | +| **Portamento** | 4 | 1 | D_1 | 5 | +| **LPF Cutoff** | 5 | 1 | D_1 | 74 | +| **LPF Resonanc** | 6 | 1 | D_1 | 71 | +| **HPF Cutoff** | 7 | 1 | D_1 | 81 | +| **HPF Resonan** | 8 | 1 | D_1 | 82 | +| **OSC1 Level** | 9 | 2 | D_1 | 21 | +| **OSC1 Pitch** | 10 | 2 | D_1 | 12 | +| **OSC1 PW** | 11 | 2 | D_1 | 23 | +| **OSC1 WavePos** | 12 | 2 | D_1 | 25 | +| **OSC1 Feedb** | 13 | 2 | D_1 | 24 | +| **FM1 Level** | 14 | 2 | D_1 | 54 | +| **FM1 Pitch** | 15 | 2 | D_1 | 14 | +| **FM1 Feedback** | 16 | 2 | D_1 | 55 | +| **OSC2 Level** | 17 | 3 | D_1 | 26 | +| **OSC2 Pitch** | 18 | 3 | D_1 | 13 | +| **OSC2 PW** | 19 | 3 | D_1 | 28 | +| **OSC2 WavePos** | 20 | 3 | D_1 | 30 | +| **OSC2 Feedb** | 21 | 3 | D_1 | 29 | +| **FM2 Level** | 22 | 3 | D_1 | 56 | +| **FM2 Pitch** | 23 | 3 | D_1 | 15 | +| **FM2 Feedback** | 24 | 3 | D_1 | 57 | +| **ENV1 Attack** | 25 | 4 | D_1 | 73 | +| **ENV1 Decay** | 26 | 4 | D_1 | 75 | +| **ENV1 Sustain** | 27 | 4 | D_1 | 76 | +| **ENV1 Release** | 28 | 4 | D_1 | 72 | +| **ENV2 Attack** | 29 | 4 | D_1 | 77 | +| **ENV2 Decay** | 30 | 4 | D_1 | 78 | +| **ENV2 Sustain** | 31 | 4 | D_1 | 79 | +| **ENV2 Release** | 32 | 4 | D_1 | 80 | +| **EQ-Bass Freq** | 1 | 1 | D_2 | 84 | +| **EQ-Bass Gain** | 2 | 1 | D_2 | 86 | +| **EQ-Treb Freq** | 3 | 1 | D_2 | 85 | +| **EQ-Treb Gain** | 4 | 1 | D_2 | 87 | +| **Noise** | 5 | 1 | D_2 | 41 | +| **REVERB Amoun** | 6 | 1 | D_2 | 91 | +| **DELAY Amount** | 7 | 1 | D_2 | 52 | +| **DELAY Rate** | 8 | 1 | D_2 | 53 | +| **MODFX Rate** | 9 | 2 | D_2 | 16 | +| **MODFX Depth** | 10 | 2 | D_2 | 93 | +| **MODFX Feedb** | 11 | 2 | D_2 | 17 | +| **MODFX Offset** | 12 | 2 | D_2 | 18 | +| **Wavefold** | 13 | 2 | D_2 | 19 | +| **Bitcrush** | 14 | 2 | D_2 | 62 | +| **Decimation** | 15 | 2 | D_2 | 63 | +| | 16 | 2 | D_2 | | +| **LFO1 Rate** | 17 | 3 | D_2 | 58 | +| **LFO2 Rate** | 18 | 3 | D_2 | 59 | +| **LPF Morph** | 19 | 3 | D_2 | 70 | +| **HPF Morph** | 20 | 3 | D_2 | 83 | +| **STUTTER Rate** | 21 | 3 | D_2 | 20 | +| **SIDECH Level** | 22 | 3 | D_2 | 61 | +| **SIDECH Shape** | 23 | 3 | D_2 | 60 | +| **Comp Tresh** | 24 | 3 | D_2 | 27 | +| **ENV3 Attack** | 25 | 4 | D_2 | 102 | +| **ENV3 Decay** | 26 | 4 | D_2 | 103 | +| **ENV3 Sustain** | 27 | 4 | D_2 | 104 | +| **ENV3 Release** | 28 | 4 | D_2 | 105 | +| **ENV4 Attack** | 29 | 4 | D_2 | 106 | +| **ENV4 Decay** | 30 | 4 | D_2 | 107 | +| **ENV4 Sustain** | 31 | 4 | D_2 | 108 | +| **ENV4 Release** | 32 | 4 | D_2 | 109 | +| **ARP Rate** | 1 | 1 | D_3 | 51 | +| **ARP Gate** | 2 | 1 | D_3 | 50 | +| **ARP GateSpr** | 3 | 1 | D_3 | 40 | +| **ARP OctSpr** | 4 | 1 | D_3 | 39 | +| **ARP VelSpr** | 5 | 1 | D_3 | 37 | +| **ARP Rhythm** | 6 | 1 | D_3 | 42 | +| **ARP SeqLen** | 7 | 1 | D_3 | 43 | +| **ARP RevProb** | 8 | 1 | D_3 | 36 | +| **ARP ChoPoly** | 9 | 2 | D_3 | 44 | +| **ARP ChoProb** | 10 | 2 | D_3 | 48 | +| **ARP RatchAm** | 11 | 2 | D_3 | 45 | +| **ARP RatchPr** | 12 | 2 | D_3 | 49 | +| **ARP NoteProb** | 13 | 2 | D_3 | 46 | +| **ARP BassProb** | 14 | 2 | D_3 | 47 | +| | 15 | 2 | D_3 | | +| | 16 | 2 | D_3 | | +| | 17 | 3 | D_3 | | +| | 18 | 3 | D_3 | | +| | 19 | 3 | D_3 | | +| | 20 | 3 | D_3 | | +| | 21 | 3 | D_3 | | +| | 22 | 3 | D_3 | | +| | 23 | 3 | D_3 | | +| | 24 | 3 | D_3 | | +| | 25 | 4 | D_3 | | +| | 26 | 4 | D_3 | | +| | 27 | 4 | D_3 | | +| | 28 | 4 | D_3 | | +| | 29 | 4 | D_3 | | +| | 30 | 4 | D_3 | | +| | 31 | 4 | D_3 | | +| | 32 | 4 | D_3 | | MIDI channel: 15 - [^1]: Unassigned knobs show up in the table with no parameter name and CC#. The table was automatically produced by calling ```python - python3 roto-control_summarize.py "all_parameters/all_parameters1.json" "all_parameters/all_parameters2.json" "all_parameters/all_parameters3.json" + python3 roto-control_summarize.py "all_parameters/D_1.json" "all_parameters/D_2.json" "all_parameters/D_3.json" ``` - from the `roto_control` directory one level above. So barring any errors in the script, the mappings summarized in the table should, by construction, match with the actual setup information encoded in the respective `.json` files. + from the `roto_control` directory one level above. From 4ee08f4055c2d2e4e2986e4c310a55d89500f549 Mon Sep 17 00:00:00 2001 From: Stefan Herzog Date: Wed, 5 Feb 2025 17:00:48 +0100 Subject: [PATCH 11/11] roto, synth_perform: add --- .../synth_perform/D_synth_perform.json | 1066 +++++++++++++++++ .../roto_control/synth_perform/README.md | 52 + 2 files changed, 1118 insertions(+) create mode 100644 contrib/midi_follow/roto_control/synth_perform/D_synth_perform.json create mode 100644 contrib/midi_follow/roto_control/synth_perform/README.md diff --git a/contrib/midi_follow/roto_control/synth_perform/D_synth_perform.json b/contrib/midi_follow/roto_control/synth_perform/D_synth_perform.json new file mode 100644 index 0000000000..13be189720 --- /dev/null +++ b/contrib/midi_follow/roto_control/synth_perform/D_synth_perform.json @@ -0,0 +1,1066 @@ +{ + "version": 1, + "type": "MIDI", + "name": "D_synth_perf", + "index": 3, + "knobs": [ + { + "controlIndex": 0, + "controlMode": 0, + "controlChannel": 15, + "controlParam": 74, + "nrpnAddress": 0, + "minValue": 0, + "maxValue": 127, + "controlName": "LPF Cutoff", + "colorScheme": 71, + "hapticMode": 0, + "hapticIndent1": 255, + "hapticIndent2": 255, + "hapticSteps": 0, + "stepNames": [ + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "" + ] + }, + { + "controlIndex": 1, + "controlMode": 0, + "controlChannel": 15, + "controlParam": 71, + "nrpnAddress": 0, + "minValue": 0, + "maxValue": 127, + "controlName": "LPF Resonanc", + "colorScheme": 71, + "hapticMode": 0, + "hapticIndent1": 255, + "hapticIndent2": 255, + "hapticSteps": 0, + "stepNames": [ + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "" + ] + }, + { + "controlIndex": 2, + "controlMode": 0, + "controlChannel": 15, + "controlParam": 81, + "nrpnAddress": 0, + "minValue": 0, + "maxValue": 127, + "controlName": "HPF Cutoff", + "colorScheme": 0, + "hapticMode": 0, + "hapticIndent1": 255, + "hapticIndent2": 255, + "hapticSteps": 0, + "stepNames": [ + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "" + ] + }, + { + "controlIndex": 3, + "controlMode": 0, + "controlChannel": 15, + "controlParam": 82, + "nrpnAddress": 0, + "minValue": 0, + "maxValue": 127, + "controlName": "HPF Resonan", + "colorScheme": 42, + "hapticMode": 0, + "hapticIndent1": 255, + "hapticIndent2": 255, + "hapticSteps": 0, + "stepNames": [ + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "" + ] + }, + { + "controlIndex": 4, + "controlMode": 0, + "controlChannel": 15, + "controlParam": 85, + "nrpnAddress": 0, + "minValue": 0, + "maxValue": 127, + "controlName": "EQ-Treb Freq", + "colorScheme": 26, + "hapticMode": 0, + "hapticIndent1": 64, + "hapticIndent2": 255, + "hapticSteps": 0, + "stepNames": [ + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "" + ] + }, + { + "controlIndex": 5, + "controlMode": 0, + "controlChannel": 15, + "controlParam": 87, + "nrpnAddress": 0, + "minValue": 0, + "maxValue": 127, + "controlName": "EQ-Treb Gain", + "colorScheme": 26, + "hapticMode": 0, + "hapticIndent1": 64, + "hapticIndent2": 255, + "hapticSteps": 0, + "stepNames": [ + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "" + ] + }, + { + "controlIndex": 6, + "controlMode": 0, + "controlChannel": 15, + "controlParam": 84, + "nrpnAddress": 0, + "minValue": 0, + "maxValue": 127, + "controlName": "EQ-Bass Freq", + "colorScheme": 53, + "hapticMode": 0, + "hapticIndent1": 64, + "hapticIndent2": 255, + "hapticSteps": 0, + "stepNames": [ + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "" + ] + }, + { + "controlIndex": 7, + "controlMode": 0, + "controlChannel": 15, + "controlParam": 86, + "nrpnAddress": 0, + "minValue": 0, + "maxValue": 127, + "controlName": "EQ-Bass Gain", + "colorScheme": 53, + "hapticMode": 0, + "hapticIndent1": 64, + "hapticIndent2": 255, + "hapticSteps": 0, + "stepNames": [ + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "" + ] + }, + + { + "controlIndex": 8, + "controlMode": 0, + "controlChannel": 15, + "controlParam": 54, + "nrpnAddress": 0, + "minValue": 0, + "maxValue": 127, + "controlName": "FM1 Level", + "colorScheme": 67, + "hapticMode": 0, + "hapticIndent1": 255, + "hapticIndent2": 255, + "hapticSteps": 0, + "stepNames": [ + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "" + ] + }, + { + "controlIndex": 9, + "controlMode": 0, + "controlChannel": 15, + "controlParam": 55, + "nrpnAddress": 0, + "minValue": 0, + "maxValue": 127, + "controlName": "FM1 Feedback", + "colorScheme": 67, + "hapticMode": 0, + "hapticIndent1": 255, + "hapticIndent2": 255, + "hapticSteps": 0, + "stepNames": [ + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "" + ] + }, + { + "controlIndex": 10, + "controlMode": 0, + "controlChannel": 15, + "controlParam": 56, + "nrpnAddress": 0, + "minValue": 0, + "maxValue": 127, + "controlName": "FM2 Level", + "colorScheme": 67, + "hapticMode": 0, + "hapticIndent1": 255, + "hapticIndent2": 255, + "hapticSteps": 0, + "stepNames": [ + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "" + ] + }, + { + "controlIndex": 11, + "controlMode": 0, + "controlChannel": 15, + "controlParam": 57, + "nrpnAddress": 0, + "minValue": 0, + "maxValue": 127, + "controlName": "FM2 Feedback", + "colorScheme": 67, + "hapticMode": 0, + "hapticIndent1": 255, + "hapticIndent2": 255, + "hapticSteps": 0, + "stepNames": [ + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "" + ] + }, + { + "controlIndex": 12, + "controlMode": 0, + "controlChannel": 15, + "controlParam": 21, + "nrpnAddress": 0, + "minValue": 0, + "maxValue": 127, + "controlName": "OSC1 Level", + "colorScheme": 46, + "hapticMode": 0, + "hapticIndent1": 255, + "hapticIndent2": 255, + "hapticSteps": 0, + "stepNames": [ + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "" + ] + }, + { + "controlIndex": 13, + "controlMode": 0, + "controlChannel": 15, + "controlParam": 24, + "nrpnAddress": 0, + "minValue": 0, + "maxValue": 127, + "controlName": "OSC1 Feedb", + "colorScheme": 67, + "hapticMode": 0, + "hapticIndent1": 255, + "hapticIndent2": 255, + "hapticSteps": 0, + "stepNames": [ + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "" + ] + }, + { + "controlIndex": 14, + "controlMode": 0, + "controlChannel": 15, + "controlParam": 26, + "nrpnAddress": 0, + "minValue": 0, + "maxValue": 127, + "controlName": "OSC2 Level", + "colorScheme": 5, + "hapticMode": 0, + "hapticIndent1": 255, + "hapticIndent2": 255, + "hapticSteps": 0, + "stepNames": [ + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "" + ] + }, + { + "controlIndex": 15, + "controlMode": 0, + "controlChannel": 15, + "controlParam": 29, + "nrpnAddress": 0, + "minValue": 0, + "maxValue": 127, + "controlName": "OSC2 Feedb", + "colorScheme": 67, + "hapticMode": 0, + "hapticIndent1": 255, + "hapticIndent2": 255, + "hapticSteps": 0, + "stepNames": [ + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "" + ] + }, + { + "controlIndex": 16, + "controlMode": 0, + "controlChannel": 15, + "controlParam": 91, + "nrpnAddress": 0, + "minValue": 0, + "maxValue": 127, + "controlName": "REVERB Amoun", + "colorScheme": 21, + "hapticMode": 0, + "hapticIndent1": 255, + "hapticIndent2": 255, + "hapticSteps": 0, + "stepNames": [ + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "" + ] + }, + { + "controlIndex": 17, + "controlMode": 0, + "controlChannel": 15, + "controlParam": 19, + "nrpnAddress": 0, + "minValue": 0, + "maxValue": 127, + "controlName": "Wavefold", + "colorScheme": 73, + "hapticMode": 0, + "hapticIndent1": 255, + "hapticIndent2": 255, + "hapticSteps": 0, + "stepNames": [ + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "" + ] + }, + { + "controlIndex": 18, + "controlMode": 0, + "controlChannel": 15, + "controlParam": 52, + "nrpnAddress": 0, + "minValue": 0, + "maxValue": 127, + "controlName": "DELAY Amount", + "colorScheme": 74, + "hapticMode": 0, + "hapticIndent1": 64, + "hapticIndent2": 255, + "hapticSteps": 0, + "stepNames": [ + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "" + ] + }, + { + "controlIndex": 19, + "controlMode": 0, + "controlChannel": 15, + "controlParam": 53, + "nrpnAddress": 0, + "minValue": 0, + "maxValue": 127, + "controlName": "DELAY Rate", + "colorScheme": 74, + "hapticMode": 0, + "hapticIndent1": 255, + "hapticIndent2": 255, + "hapticSteps": 0, + "stepNames": [ + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "" + ] + }, + { + "controlIndex": 20, + "controlMode": 0, + "controlChannel": 15, + "controlParam": 16, + "nrpnAddress": 0, + "minValue": 0, + "maxValue": 127, + "controlName": "MODFX Rate", + "colorScheme": 1, + "hapticMode": 0, + "hapticIndent1": 255, + "hapticIndent2": 255, + "hapticSteps": 0, + "stepNames": [ + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "" + ] + }, + { + "controlIndex": 21, + "controlMode": 0, + "controlChannel": 15, + "controlParam": 93, + "nrpnAddress": 0, + "minValue": 0, + "maxValue": 127, + "controlName": "MODFX Depth", + "colorScheme": 1, + "hapticMode": 0, + "hapticIndent1": 255, + "hapticIndent2": 255, + "hapticSteps": 0, + "stepNames": [ + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "" + ] + }, + { + "controlIndex": 22, + "controlMode": 0, + "controlChannel": 15, + "controlParam": 17, + "nrpnAddress": 0, + "minValue": 0, + "maxValue": 127, + "controlName": "MODFX Feedb", + "colorScheme": 1, + "hapticMode": 0, + "hapticIndent1": 255, + "hapticIndent2": 255, + "hapticSteps": 0, + "stepNames": [ + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "" + ] + }, + { + "controlIndex": 23, + "controlMode": 0, + "controlChannel": 15, + "controlParam": 18, + "nrpnAddress": 0, + "minValue": 0, + "maxValue": 127, + "controlName": "MODFX Offset", + "colorScheme": 1, + "hapticMode": 0, + "hapticIndent1": 64, + "hapticIndent2": 255, + "hapticSteps": 0, + "stepNames": [ + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "" + ] + }, + { + "controlIndex": 24, + "controlMode": 0, + "controlChannel": 15, + "controlParam": 7, + "nrpnAddress": 0, + "minValue": 0, + "maxValue": 127, + "controlName": "Master Vol", + "colorScheme": 13, + "hapticMode": 0, + "hapticIndent1": 255, + "hapticIndent2": 255, + "hapticSteps": 0, + "stepNames": [ + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "" + ] + }, + { + "controlIndex": 25, + "controlMode": 0, + "controlChannel": 15, + "controlParam": 10, + "nrpnAddress": 0, + "minValue": 0, + "maxValue": 127, + "controlName": "Panning", + "colorScheme": 13, + "hapticMode": 0, + "hapticIndent1": 64, + "hapticIndent2": 255, + "hapticSteps": 0, + "stepNames": [ + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "" + ] + }, + { + "controlIndex": 26, + "controlMode": 0, + "controlChannel": 15, + "controlParam": 3, + "nrpnAddress": 0, + "minValue": 0, + "maxValue": 127, + "controlName": "Master Pitch", + "colorScheme": 13, + "hapticMode": 0, + "hapticIndent1": 64, + "hapticIndent2": 255, + "hapticSteps": 0, + "stepNames": [ + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "" + ] + }, + { + "controlIndex": 27, + "controlMode": 0, + "controlChannel": 15, + "controlParam": 41, + "nrpnAddress": 0, + "minValue": 0, + "maxValue": 127, + "controlName": "Noise", + "colorScheme": 20, + "hapticMode": 0, + "hapticIndent1": 255, + "hapticIndent2": 255, + "hapticSteps": 0, + "stepNames": [ + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "" + ] + }, + { + "controlIndex": 28, + "controlMode": 0, + "controlChannel": 15, + "controlParam": 73, + "nrpnAddress": 0, + "minValue": 0, + "maxValue": 127, + "controlName": "ENV1 Attack", + "colorScheme": 22, + "hapticMode": 0, + "hapticIndent1": 255, + "hapticIndent2": 255, + "hapticSteps": 0, + "stepNames": [ + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "" + ] + }, + { + "controlIndex": 29, + "controlMode": 0, + "controlChannel": 15, + "controlParam": 75, + "nrpnAddress": 0, + "minValue": 0, + "maxValue": 127, + "controlName": "ENV1 Decay", + "colorScheme": 22, + "hapticMode": 0, + "hapticIndent1": 255, + "hapticIndent2": 255, + "hapticSteps": 0, + "stepNames": [ + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "" + ] + }, + { + "controlIndex": 30, + "controlMode": 0, + "controlChannel": 15, + "controlParam": 76, + "nrpnAddress": 0, + "minValue": 0, + "maxValue": 127, + "controlName": "ENV1 Sustain", + "colorScheme": 22, + "hapticMode": 0, + "hapticIndent1": 255, + "hapticIndent2": 255, + "hapticSteps": 0, + "stepNames": [ + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "" + ] + }, + { + "controlIndex": 31, + "controlMode": 0, + "controlChannel": 15, + "controlParam": 72, + "nrpnAddress": 0, + "minValue": 0, + "maxValue": 127, + "controlName": "ENV1 Release", + "colorScheme": 22, + "hapticMode": 0, + "hapticIndent1": 255, + "hapticIndent2": 255, + "hapticSteps": 0, + "stepNames": [ + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "" + ] + } + ], + "buttons": [] +} \ No newline at end of file diff --git a/contrib/midi_follow/roto_control/synth_perform/README.md b/contrib/midi_follow/roto_control/synth_perform/README.md new file mode 100644 index 0000000000..3ba556ed83 --- /dev/null +++ b/contrib/midi_follow/roto_control/synth_perform/README.md @@ -0,0 +1,52 @@ +# synth_perform (MIDI Follow Mode Template for Melbourne Instruments ROTO-CONTROL) + +This setup (`synth_perform.json`) surfaces parameters useful for performing with subtractive or FM synths on the Synthstrom Deluge. It uses the same set of parameters surfaced in [Sean Ditny's "synth perform" page for Electa One](https://app.electra.one/preset/vZ6WBYb4xDpMGcpChejY), but ordered somewhat differently to ensure that related parameters appear on the same page of eight knobs. + +Below is a summary table, where `Position` is the knob's position across the 32 knobs and `Page` is the knob's page (1st, 2nd, 3rd, or 4th) in the setup.[^1] + +| Parameter | Position | Page | CC# | +|-----------|----------|------|----| +| **LPF Cutoff** | 1 | 1 | 74 | +| **LPF Resonanc** | 2 | 1 | 71 | +| **HPF Cutoff** | 3 | 1 | 81 | +| **HPF Resonan** | 4 | 1 | 82 | +| **EQ-Treb Freq** | 5 | 1 | 85 | +| **EQ-Treb Gain** | 6 | 1 | 87 | +| **EQ-Bass Freq** | 7 | 1 | 84 | +| **EQ-Bass Gain** | 8 | 1 | 86 | +| **FM1 Level** | 9 | 2 | 54 | +| **FM1 Feedback** | 10 | 2 | 55 | +| **FM2 Level** | 11 | 2 | 56 | +| **FM2 Feedback** | 12 | 2 | 57 | +| **OSC1 Level** | 13 | 2 | 21 | +| **OSC1 Feedb** | 14 | 2 | 24 | +| **OSC2 Level** | 15 | 2 | 26 | +| **OSC2 Feedb** | 16 | 2 | 29 | +| **REVERB Amoun** | 17 | 3 | 91 | +| **Wavefold** | 18 | 3 | 19 | +| **DELAY Amount** | 19 | 3 | 52 | +| **DELAY Rate** | 20 | 3 | 53 | +| **MODFX Rate** | 21 | 3 | 16 | +| **MODFX Depth** | 22 | 3 | 93 | +| **MODFX Feedb** | 23 | 3 | 17 | +| **MODFX Offset** | 24 | 3 | 18 | +| **Master Vol** | 25 | 4 | 7 | +| **Panning** | 26 | 4 | 10 | +| **Master Pitch** | 27 | 4 | 3 | +| **Noise** | 28 | 4 | 41 | +| **ENV1 Attack** | 29 | 4 | 73 | +| **ENV1 Decay** | 30 | 4 | 75 | +| **ENV1 Sustain** | 31 | 4 | 76 | +| **ENV1 Release** | 32 | 4 | 72 | + +MIDI channel: 15 + +[^1]: Unassigned knobs show up in the table with no parameter name and CC#. + + The table was automatically produced by calling + + ```python + python3 roto-control_summarize.py "synth_perform/D_synth_perform.json" + ``` + + from the `roto_control` directory one level above.