├── _docimg
├── scripting_console.png
├── open_script_console.png
├── vscode_autocompletion.png
├── project_window_with_overlays.png
├── vscode_open_scripts_folder.png
├── remote_window_real_world_device.png
├── overview_big.svg
└── script_structure.svg
├── behringer
└── bcr2000
│ ├── docs
│ ├── BCR2000_label_v1.6.pdf
│ ├── bcr2000_midiremote.pdf
│ ├── BCR2000 midi remote.pdf
│ └── Behringer_BCR2000.midiremote
│ ├── README.md
│ └── behringer_bcr2000.js
├── LICENSE
├── examplecompany
└── putasmileonyoursurface
│ └── examplecompany_putasmileonyoursurface.js
├── README.md
├── alesis
└── vi49
│ └── alesis_vi49.js
├── presonus
└── faderport8
│ └── presonus_faderport8.js
└── Akai
└── LPD8
└── Akai_LPD8.json
/_docimg/scripting_console.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/steinbergmedia/midiremote-userscripts/HEAD/_docimg/scripting_console.png
--------------------------------------------------------------------------------
/_docimg/open_script_console.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/steinbergmedia/midiremote-userscripts/HEAD/_docimg/open_script_console.png
--------------------------------------------------------------------------------
/_docimg/vscode_autocompletion.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/steinbergmedia/midiremote-userscripts/HEAD/_docimg/vscode_autocompletion.png
--------------------------------------------------------------------------------
/_docimg/project_window_with_overlays.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/steinbergmedia/midiremote-userscripts/HEAD/_docimg/project_window_with_overlays.png
--------------------------------------------------------------------------------
/_docimg/vscode_open_scripts_folder.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/steinbergmedia/midiremote-userscripts/HEAD/_docimg/vscode_open_scripts_folder.png
--------------------------------------------------------------------------------
/_docimg/remote_window_real_world_device.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/steinbergmedia/midiremote-userscripts/HEAD/_docimg/remote_window_real_world_device.png
--------------------------------------------------------------------------------
/behringer/bcr2000/docs/BCR2000_label_v1.6.pdf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/steinbergmedia/midiremote-userscripts/HEAD/behringer/bcr2000/docs/BCR2000_label_v1.6.pdf
--------------------------------------------------------------------------------
/behringer/bcr2000/docs/bcr2000_midiremote.pdf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/steinbergmedia/midiremote-userscripts/HEAD/behringer/bcr2000/docs/bcr2000_midiremote.pdf
--------------------------------------------------------------------------------
/behringer/bcr2000/docs/BCR2000 midi remote.pdf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/steinbergmedia/midiremote-userscripts/HEAD/behringer/bcr2000/docs/BCR2000 midi remote.pdf
--------------------------------------------------------------------------------
/behringer/bcr2000/docs/Behringer_BCR2000.midiremote:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/steinbergmedia/midiremote-userscripts/HEAD/behringer/bcr2000/docs/Behringer_BCR2000.midiremote
--------------------------------------------------------------------------------
/LICENSE:
--------------------------------------------------------------------------------
1 | MIT License
2 |
3 | Copyright (c) 2022 Steinberg
4 |
5 | Permission is hereby granted, free of charge, to any person obtaining a copy
6 | of this software and associated documentation files (the "Software"), to deal
7 | in the Software without restriction, including without limitation the rights
8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9 | copies of the Software, and to permit persons to whom the Software is
10 | furnished to do so, subject to the following conditions:
11 |
12 | The above copyright notice and this permission notice shall be included in all
13 | copies or substantial portions of the Software.
14 |
15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21 | SOFTWARE.
22 |
--------------------------------------------------------------------------------
/behringer/bcr2000/README.md:
--------------------------------------------------------------------------------
1 |
MIDI REMOTE for BEHRINGER BCR2000
2 |
3 | INSTALL:
4 | - Create folder structure "Behringer/BCR2000" inside "../MIDI Remote/Driver Scripts/Local" folder.
5 | - Copy .js file inside BCR2000 folder.
6 | - Connect your device.
7 | - Start Cubase/Nuendo.
8 |
9 | IMPORTANT:
10 | factory preset for BCR2000 is absolute mode, and this cause stutter moving on knobs: I used relative mode.
11 | BCR2000 need to be configured manually prior to use this script:
12 | - all knobs need to be in “rel1” mode;
13 | - all buttons “toggle off” mode.
14 |
15 | Or you can load attached .bcr preset (easy done with BC MANAGER https://mountainutilities.eu/bcmanager).
16 |
17 | This is the default CC assignement to match midi remote script:
18 | 
19 |
20 |
FOCUS PAGE
21 |
22 | 
23 |
24 | Use Encoder Groups buttons on BCR2000 to switch between
25 | - Sends
26 | - Focused Quick Controls
27 | - Track Quick Controls
28 | - Cues
29 |
30 | EQ Q/TYPE button, switches between Q and filter type on lower knobs
31 |
32 | Side buttons:
33 | use arrows buttons to move between tracks
34 | use page button to switch page
35 |
36 |
MIXING PAGE
37 |
38 | 
39 |
40 | Side buttons:
41 | use arrows to switch banks
42 |
43 |
44 |
Changelog:
45 |
46 | - v 1.0 07/03/2022
47 | first release.
48 | - v 1.1 08/03/2022
49 | navigate tracks via side button.
50 | - v 1.2 09/03/2022
51 | Focused Quick Control lock added.
52 | - v 1.3 10/03/2022
53 | Pre-filter eq controls added.
54 | Added push button for Focused Quick Control: if focused parameter is a button now you can push the encoder to switch.
55 | - v 1.4.
56 | Added Layers for encoders Group.
57 | - v 1.5 11/03/2022
58 | Cue level control added.
59 | Control Room Main channel level control added.
60 | Monitor enable control added.
61 | Read and write automation control added.
62 | Foot-switches added.
63 | - v 1.6 19/03/2022
64 | Added label for focused track and selected page.
65 | Focus Control page: Phase control added, EQ Q/TYPE button added to switch between Q and filter type on lower knobs. Mixing page added to control banks of 8 channels at once. Mixing page shows track names.
66 |
67 |
68 |
69 | Programmed by Giampaolo Gesuale
70 | contact: giampaologesuale@gmail.com
71 |
--------------------------------------------------------------------------------
/examplecompany/putasmileonyoursurface/examplecompany_putasmileonyoursurface.js:
--------------------------------------------------------------------------------
1 | //-----------------------------------------------------------------------------
2 | // 1. DRIVER SETUP - create driver object, midi ports and detection information
3 | //-----------------------------------------------------------------------------
4 |
5 | // get the api's entry point
6 | var midiremote_api = require('midiremote_api_v1')
7 |
8 | // create the device driver main object
9 | var deviceDriver = midiremote_api.makeDeviceDriver('ExampleCompany', 'PutASmileOnYourSurface', 'Steinberg Media Technologies GmbH')
10 |
11 | // create objects representing the hardware's MIDI ports
12 | var midiInput = deviceDriver.mPorts.makeMidiInput()
13 | var midiOutput = deviceDriver.mPorts.makeMidiOutput()
14 |
15 | // define all possible namings the devices MIDI ports could have
16 | // NOTE: Windows and MacOS handle port naming differently
17 | deviceDriver.makeDetectionUnit().detectPortPair(midiInput, midiOutput)
18 | .expectInputNameEquals('SmileDevice IN')
19 | .expectOutputNameEquals('SmileDevice OUT')
20 |
21 | deviceDriver.makeDetectionUnit().detectPortPair(midiInput, midiOutput)
22 | .expectInputNameEquals('SmileDevice (MIDI IN)')
23 | .expectOutputNameEquals('SmileDevice (MIDI OUT)')
24 |
25 |
26 | //-----------------------------------------------------------------------------
27 | // 2. SURFACE LAYOUT - create control elements and midi bindings
28 | //-----------------------------------------------------------------------------
29 |
30 | // create control element representing your hardware's surface
31 |
32 | deviceDriver.mSurface.makeBlindPanel(0, 0, 6, 6).setShapeCircle()
33 |
34 | var knob1 = deviceDriver.mSurface.makeKnob(0.75, 3.25, 1, 1.5)
35 | var knob2 = deviceDriver.mSurface.makeKnob(1.50, 4.00, 1, 1.5)
36 | var knob3 = deviceDriver.mSurface.makeKnob(2.50, 4.25, 1, 1.5)
37 | var knob4 = deviceDriver.mSurface.makeKnob(3.50, 4.00, 1, 1.5)
38 | var knob5 = deviceDriver.mSurface.makeKnob(4.25, 3.25, 1, 1.5)
39 | var knob6 = deviceDriver.mSurface.makeKnob(1.00, 1.15, 2, 2)
40 | var knob7 = deviceDriver.mSurface.makeKnob(3.00, 1.15, 2, 2)
41 |
42 | // bind midi ports to surface elements
43 | knob1.mSurfaceValue.mMidiBinding
44 | .setInputPort(midiInput)
45 | .setOutputPort(midiOutput)
46 | .bindToControlChange (0, 21) // channel 0, cc 21
47 |
48 | knob2.mSurfaceValue.mMidiBinding
49 | .setInputPort(midiInput)
50 | .setOutputPort(midiOutput)
51 | .bindToControlChange (0, 22) // channel 0, cc 22
52 |
53 | knob3.mSurfaceValue.mMidiBinding
54 | .setInputPort(midiInput)
55 | .setOutputPort(midiOutput)
56 | .bindToControlChange (0, 23) // channel 0, cc 23
57 |
58 | knob4.mSurfaceValue.mMidiBinding
59 | .setInputPort(midiInput)
60 | .setOutputPort(midiOutput)
61 | .bindToControlChange (0, 24) // channel 0, cc 24
62 |
63 | //-----------------------------------------------------------------------------
64 | // 3. HOST MAPPING - create mapping pages and host bindings
65 | //-----------------------------------------------------------------------------
66 |
67 | // create at least one mapping page
68 | var page = deviceDriver.mMapping.makePage('Example Mixer Page')
69 |
70 | // create host accessing objects
71 | var hostSelectedTrackChannel = page.mHostAccess.mTrackSelection.mMixerChannel
72 |
73 |
74 | // bind surface elements to host accessing object values
75 | page.makeValueBinding(knob1.mSurfaceValue, hostSelectedTrackChannel.mValue.mVolume)
76 | page.makeValueBinding(knob2.mSurfaceValue, hostSelectedTrackChannel.mSends.getByIndex(0).mLevel)
77 | page.makeValueBinding(knob3.mSurfaceValue, hostSelectedTrackChannel.mSends.getByIndex(1).mLevel)
78 | page.makeValueBinding(knob4.mSurfaceValue, hostSelectedTrackChannel.mSends.getByIndex(2).mLevel)
79 | page.makeValueBinding(knob5.mSurfaceValue, hostSelectedTrackChannel.mSends.getByIndex(3).mLevel)
80 | page.makeValueBinding(knob6.mSurfaceValue, hostSelectedTrackChannel.mValue.mVolume)
81 | page.makeValueBinding(knob7.mSurfaceValue, hostSelectedTrackChannel.mValue.mPan)
82 |
--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------
1 | # MIDI Remote API - User Scripts
2 |
3 | # About
4 |
5 | Welcome to the Steinberg **MIDI Remote API**.
6 |
7 | This document will guide you through the steps of writing a **MIDI Remote API Script** for a specific MIDI Controller Hardware.
8 |
9 | > **NOTE**: Scripts are written in the **[ES5](https://www.w3schools.com/js/js_es5.asp)** version of **JavaScript**
10 |
11 | # How to work with this repository
12 |
13 | 1. Make a fork of steinbergmedia/midiremote-userscripts
14 |
15 | 2. Rename your existing …/Driver Scripts/Local folder to something else (like Local_backup)
16 |
17 | 3. Create a new empty folder Local to replace it
18 |
19 | 4. Clone your forked repository inside the newly created empty Local folder
20 |
21 | 5. Copy your existing scripts from within the Local_backup folder into the Local folder
22 |
23 | 6. Still use the parent folder of Local, the Drive Scripts folder, as the workspace folder in Visual Studio Code
24 |
25 | 7. Make commits/pushes to your forked repo
26 |
27 | 8. Make pull requests to the upstream repo (steinbergmedia/midiremote-userscripts)
28 |
29 | > And don't forget to regulary do “fetch and merge” from the upstream repo (steinbergmedia/midiremote-userscripts) to stay in sync.
30 |
31 |
32 | # Basic Concept
33 |
34 | > The **MIDI Remote API Script** acts as a mediator between a Hardware Controller and Cubase / Nuendo
35 |
36 |
37 |
38 |
39 |
40 |
43 |
44 | > The **MIDI Remote API Script** emulates the hardware surface. This improves usability and recognizability.
45 |
46 |
47 |
48 | # Script Structure
49 |
50 | ### The **MIDI Remote API Script** consists of three building blocks
51 | 1. Driver Setup
52 | - create driver object
53 | - define driver ports to be associated with existing hardware midi ports
54 | - specify all possible port namings for automatic device detection
55 |
56 | 2. Surface Layout
57 | - visualize the hardware's surface elements (e.g. knobs, faders, buttons)
58 | - bind surface elements to midi messages
59 |
60 | 3. Host Mapping
61 | - create mapping pages for each user workflow (e.g. mixing, playing instruments, track navigation)
62 |
63 |
64 |
65 | > The following image illustrates that:
66 |
67 |
68 |
69 |
70 |
71 |
72 | # Getting Started
73 |
74 |
75 |
76 | ### To get started please perform these steps:
77 |
78 | 1. Make sure you have [Visual Studio Code](https://code.visualstudio.com/) installed.
79 |
80 |
81 | We highly recommend using Visual Studio Code for writing MIDI Remote API Scripts. We provide a JSDoc based auto-completion setup. You will not have to look up types and methods in a separate documentation. Visual Studio Code will help you write scripts intuitively.
82 |
83 |
84 |
85 |
86 | 2. Make sure the folder of the [Visual Studio Code](https://code.visualstudio.com/) executable is added to the PATH environment variable.
87 |
88 | 3. Make sure you have the newest Cubase / Nuendo installed.
89 |
90 | 4. Start Cubase / Nuendo.
91 |
92 | 5. Create a project with audio and/or instrument tracks.
93 |
94 | 6. Open the Remote tab in the lower zone.
95 |
96 |
97 |
98 | 1. Open the **MIDI Remote Driver Scripts** folder.
99 |
100 | > Mac: /Users/<Username>/Documents/Steinberg/<Cubase or Nuendo>/MIDI Remote/Driver Scripts
101 |
102 | > Windows: C:\Users\\<Username>\Documents\Steinberg\<Cubase or Nuendo>\MIDI Remote\Driver Scripts
103 |
104 |
105 |
106 | 1. Open a console (win: cmd, mac: terminal) and go to the **MIDI Remote Driver Scripts** folder.
107 |
108 | 2. Open [Visual Studio Code](https://code.visualstudio.com/) from the command line like this:
109 |
110 | > code .
111 |
112 |
113 |
114 | 10. Create a script file.
115 |
116 | The **MIDI Remote API Script** file follows the structure:
117 | <Driver Scripts Folder>/<Local or Public>/<vendor>/<device>/<vendor>_<device>.js
118 |
119 |
120 | WARNING: Always use the folder Local for development, folder Public will be overwritten when starting Cubase / Nuendo.
121 |