|
|
|
08-17-2022, 08:22 AM
|
#18721
|
Human being with feelings
Join Date: Jun 2013
Location: Krefeld, Germany
Posts: 14,686
|
... and I will do another start with CSI to integrate the "Compact" in my mixing Workflow. Hopefully with support from you regarding enabling the stock and free plugins, I use.
-Michael
|
|
|
08-17-2022, 09:00 AM
|
#18722
|
Human being with feelings
Join Date: Mar 2009
Location: Dartmouth, Nova Scotia
Posts: 11,183
|
Quote:
Originally Posted by mschnell
The "Compact" in Standard (non MCU) mode does send and receive Midi CCs by default. But it can be programmed to do lot of tricks.
I did do the testing JSFX.
It communicates with the Compact via Midi (here a single rotary using a dedicated Midi CC # and channel).
This is done on Midi Bus 1 (to allow appropriate Routing in Reaper).
Hence you need to connect the Input of a track to hold the JSFX to the Midi device "X-TOUCH Compact" and route the output of that track to that device as well.
On Bus 2 the JSFX outputs (14 Bit) pitchbend messages with a resolution (Step) selectable by a slider.
here it is:
Code:
desc:encoder
slider1:0<0,16,1{1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16}>in Channel (Bus 1)
slider2:1<0,127,1{0 Bank Sel M,1 Mod Wheel M,2 Breath M,3,4 Foot P M,5 Porta M,6 Data Entry M,7 Vol M,8 Balance M,9,10 Pan M,11 Expression M,12 Ctrl 1 M,13 Ctrl 2 M,14,15,16 GP Slider 1,17 GP Slider 2,18 GP Slider 3,19 GP Slider 4,20,21,22,23,24,25,26,27,28,29,30,31,32 Bank Sel L,33 Mod Wheel L,34 Breath L,35,36 Foot P L,37 Porta L,38 Data Entry L,39 Vol L,40 Balance L,41,42 Pan L,43 Expression L,44 Ctrl 1 L,45 Ctrl 2 L,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64 Hold P sw,65 Porta sw,66 Sustenuto sw,67 Soft P sw,68 Legato P sw,69 Hold 2 P sw,70 S.Variation,71 S.Timbre,72 S.Release,73 S.Attack,74 S.Brightness,75 S.Ctrl 6,76 S.Ctrl 7,77 S.Ctrl 8,78 S.Ctrl 9,79 S.Ctrl 10,80 GP B.1 sw,81 GP B.2 sw,82 GP B.3 sw,83 GP B.4 sw,84,85,86,87,88,89,90,91 Effects Lv,92 Trem Lv,93 Chorus Lv,94 Celeste Lv,95 Phaser Lv,96 Data B. Inc,97 Data B. Dec,98 NRP L,99 NRP M,100 RP L,101 RP M,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127}>in CC
slider3:0<0,16,1{1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16}>out Channel (Bus 2)
slider4:0.001953125<0.000244140625, 0.0078125, 0.000244140625>Step
in_pin:none
out_pin:none
@init
ext_midi_bus = 1;
virtualValue = 0.5;
ccValue = -1;
ccLast = -1;
outLast = -1;
@slider
inBus = 0;
outBus = 1;
inChannel = 0xB0 + slider1;
outChannel = 0xE0 + slider3;
inCC = slider2;
step = slider4;
step2 = step / 2;
@block
midi_bus = inBus;
while (midirecv(offset, msg1, msg2, msg3)) (
inChannel == msg1 ? (
msg2 == inCC ? ( // Is it the MSB CC?
ccValue < 0 ? (
ccValue = msg3;
) : (
ccValue < msg3 ? ( // increase
d = step;
) : ccValue > msg3 ? ( // decrease
d = -step;
) : (
d = 0; // == don't do amnythging
);
);
virtualValue += d;
virtualValue < 0 ? (
virtualValue = 0;
) : ( virtualValue > 1 ?
virtualValue = 1;
);
ccValue = virtualValue * 128;
ccValue += 0.5;
ccValue < 0 ? (
ccValue = 0;
) : ccValue > 127 ? (
ccValue = 127;
);
ccValue |= 0;
ccLast != ccValue ? (
midisend(offset, msg1, msg2, ccvalue);
ccLast = ccValue;
);
outValue = virtualValue * 16384;
outValue += 0.5;
outValue < 0 ? (
outValue = 0;
) : outValue > 16383 ? (
outValue = 16383;
);
outValue |= 0;
outLast != outValue ? (
midi_bus = outBus;
msg3 = (outValue / 128) | 0;
msg2 = outValue - (msg3 * 128);
midisend(offset, outChannel, msg2, msg3);
outLast = outValue;
midi_Bus = inBus;
);
);
);
);
Result:
- The virtual value and thus the Pitchbend message can be controlled with high resolution by turning the rotary
- the LED ring shows the state of the virtual value with the resolution possible by the LED ring (25 different displays when using the mode that displays a value not "Fan" or "Pan")
- The LEDs flicker slightly funny when turning the rotary
- it does not work with a Motor Fader.
-Michael
|
Ah, I finally see what you are saying !
For me code is easier to understand than English
I will implement this when I finish the EuCon work.
Nice one !!
__________________
To install you need the CSI Software and Support Files
For installation instructions and documentation see the Wiki
Donate -- via PayPal to waddingtongeoff@gmail.com
|
|
|
08-17-2022, 10:19 AM
|
#18723
|
Human being with feelings
Join Date: Mar 2009
Location: Dartmouth, Nova Scotia
Posts: 11,183
|
Quote:
Originally Posted by MixMonkey
If the Compact works the same as the Mini, it will carry on sending out $00 at fully anticlockwise for every tick and $7F at fully clockwise.
|
Thanks, based on this, I gave it a shot
I was really hesitant, because, try as I might, the Console One simply would not do this trick
__________________
To install you need the CSI Software and Support Files
For installation instructions and documentation see the Wiki
Donate -- via PayPal to waddingtongeoff@gmail.com
|
|
|
08-17-2022, 10:22 AM
|
#18724
|
Human being with feelings
Join Date: Mar 2009
Location: Dartmouth, Nova Scotia
Posts: 11,183
|
New build is up.
CSI Exp.zip
Added XTouchCompactEncoder, you know what to do next
Might also work for the Mini
__________________
To install you need the CSI Software and Support Files
For installation instructions and documentation see the Wiki
Donate -- via PayPal to waddingtongeoff@gmail.com
|
|
|
08-17-2022, 11:58 AM
|
#18725
|
Human being with feelings
Join Date: Jun 2013
Location: Krefeld, Germany
Posts: 14,686
|
Quote:
Originally Posted by Geoff Waddington
Ah, I finally see what you are saying !
For me code is easier to understand than English
|
I was positive that you do read EEL
Quote:
Originally Posted by Geoff Waddington
I will implement this when I finish the EuCon work.
Nice one !!
|
Great !
This will get JP and myself going !
-Michael
|
|
|
08-17-2022, 12:09 PM
|
#18726
|
Human being with feelings
Join Date: Mar 2009
Location: Dartmouth, Nova Scotia
Posts: 11,183
|
Quote:
Originally Posted by mschnell
Great !
This will get JP and myself going !
-Michael
|
Well, if it works , please check it out as soon as you can.
__________________
To install you need the CSI Software and Support Files
For installation instructions and documentation see the Wiki
Donate -- via PayPal to waddingtongeoff@gmail.com
|
|
|
08-17-2022, 12:39 PM
|
#18727
|
Human being with feelings
Join Date: Mar 2020
Location: IJsselstein, Netherlands
Posts: 435
|
ValueBar
It took a while, but here it is, the ValueBar.
Only thing not going really well is hiding on empty tracks. All clearences, for instance on deleting a track, return a value of 0. But for pan, volume, etc, this is a valid value and for that reason am not able to remove the ValueBar in that case.
At the botton (3th code block) is a small fix for undoing the invert on an empty line.
Code:
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
class FPValueBar_Midi_FeedbackProcessor : public Midi_FeedbackProcessor
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
{
private:
double lastValue_ = 0;
int valueBarType_ = 4; // 0: Normal, 1: Bipolar, 2: Fill, 3: Spread, 4: Off
int channel_ = 0;
public:
virtual ~FPValueBar_Midi_FeedbackProcessor() {}
FPValueBar_Midi_FeedbackProcessor(Midi_ControlSurface* surface, Widget* widget, int channel) : Midi_FeedbackProcessor(surface, widget), channel_(channel) { }
virtual void SetValue(double value) override
{
if(value == lastValue_)
return;
lastValue_ = value;
ForceValue();
}
virtual void SetValue(int param, double value) override
{
SetValue(value);
}
virtual void ForceValue() override
{
if (channel_ < 8)
{
SendMidiMessage(0xb0, channel_ + 0x30, lastValue_ * 127.0);
SendMidiMessage(0xb0, channel_ + 0x38, valueBarType_);
}
else
{
SendMidiMessage(0xb0, channel_ - 8 + 0x40, lastValue_ * 127.0);
SendMidiMessage(0xb0, channel_ - 8 + 0x48, valueBarType_);
}
}
virtual void SetProperties(vector<vector<string>> properties) override
{
for(auto property : properties)
{
if(property.size() == 0)
continue;
if(property[0] == "Mode" && property.size() > 1)
{
if (property[1] == "Normal")
valueBarType_ = 0;
if (property[1] == "BiPolar")
valueBarType_ = 1;
if (property[1] == "Fill")
valueBarType_ = 2;
if (property[1] == "Spread")
valueBarType_ = 3;
if (property[1] == "Off")
valueBarType_ = 4;
ForceValue();
}
}
ForceValue();
}
};
Code:
else if(widgetClass == "FB_FaderportTwoStateRGB" && size == 4)
{
feedbackProcessor = new FPTwoStateRGB_Midi_FeedbackProcessor(surface, widget, new MIDI_event_ex_t(strToHex(tokenLines[i][1]), strToHex(tokenLines[i][2]), strToHex(tokenLines[i][3])));
}
else if(widgetClass == "FB_FaderportValueBar" && size == 2)
{
feedbackProcessor = new FPValueBar_Midi_FeedbackProcessor(surface, widget, stoi(tokenLines[i][1]));
}
else if((widgetClass == "FB_FPVUMeter") && size == 2)
Code:
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
class FPDisplay_Midi_FeedbackProcessor : public Midi_FeedbackProcessor
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
{
private:
int deviceId_ = 0x02;
int displayRow_ = 0x00;
int channel_ = 0;
string lastStringSent_ = " ";
int textAlign_ = 0; // center: 0, left: 1, right: 2
int invert_ = 0; // value is 4 or 0
public:
virtual ~FPDisplay_Midi_FeedbackProcessor() {}
FPDisplay_Midi_FeedbackProcessor(Midi_ControlSurface* surface, Widget* widget, int deviceId, int channel, int displayRow) : Midi_FeedbackProcessor(surface, widget), deviceId_(deviceId), channel_(channel), displayRow_(displayRow) { }
virtual void ClearCache() override
{
lastStringSent_ = " ";
}
virtual void SetValue(string displayText) override
{
if(displayText != lastStringSent_) // changes since last send
lastStringSent_ = displayText;
ForceValue();
}
virtual void ForceValue() override
{
string displayText = lastStringSent_;
if(displayText == "")
displayText = " ";
const char* text = displayText.c_str();
int invert = lastStringSent_ == "" ? 0 : invert_; // prevent empty inverted lines
int align = 0x0000000 + invert + textAlign_;
struct
{
MIDI_event_ex_t evt;
char data[512];
}
midiSysExData;
midiSysExData.evt.frame_offset = 0;
midiSysExData.evt.size = 0;
midiSysExData.evt.midi_message[midiSysExData.evt.size++] = 0xF0;
midiSysExData.evt.midi_message[midiSysExData.evt.size++] = 0x00;
midiSysExData.evt.midi_message[midiSysExData.evt.size++] = 0x01;
midiSysExData.evt.midi_message[midiSysExData.evt.size++] = 0x06;
midiSysExData.evt.midi_message[midiSysExData.evt.size++] = deviceId_; // Faderport8=0x02, Faderport16=0x16
// <SysExHdr> 12, xx, yy, zz, tx,tx,tx,... F7
midiSysExData.evt.midi_message[midiSysExData.evt.size++] = 0x12;
midiSysExData.evt.midi_message[midiSysExData.evt.size++] = channel_; // xx channel_ id
midiSysExData.evt.midi_message[midiSysExData.evt.size++] = displayRow_; // yy line number 0-3
midiSysExData.evt.midi_message[midiSysExData.evt.size++] = align; // zz alignment flag 0000000=centre, see manual for other setups.
int length = strlen(text);
if (length > 30)
length = 30;
int count = 0;
while (count < length)
{
midiSysExData.evt.midi_message[midiSysExData.evt.size++] = *text++; // tx text in ASCII format
count++;
}
midiSysExData.evt.midi_message[midiSysExData.evt.size++] = 0xF7;
SendMidiMessage(&midiSysExData.evt);
}
virtual void SetProperties(vector<vector<string>> properties) override
{
for(auto property : properties)
{
if(property.size() == 0)
continue;
if(property[0] == "TextAlign" && property.size() > 1)
{
if (property[1] == "Center")
textAlign_ = 0;
else if (property[1] == "Left")
textAlign_ = 1;
else if (property[1] == "Right")
textAlign_ = 2;
else
textAlign_ = 0;
ForceValue();
}
else if(property[0] == "Invert" && property.size() > 1)
{
if (property[1] != "1")
invert_ = 0;
else
invert_ = 4;
ForceValue();
}
}
ForceValue();
}
};
|
|
|
08-17-2022, 12:49 PM
|
#18729
|
Human being with feelings
Join Date: Mar 2020
Location: IJsselstein, Netherlands
Posts: 435
|
Quote:
Originally Posted by Funkybot
Ok, time for the promised Wiki related questions on these:
1. Can I get .mst examples of each feedback processor and/or how it's used in a zone file where relevant?
2. FB_FaderportRGB was previously used to control the Select button colors right? But then we have FB_FaderportTwoStateRGB. What does that one do? Or how do they work in tandem?
3. What was updated on FB_FP8DisplayUpper and FB_FP16DisplayUpper if anything? Anything worth pointing out on the Wiki?
4. Anything that needs calling out on FB_FPVUMeter?
Thanks!
Note: if Navelpluisje wants access to update the Wiki to document those, that would be a-ok with me! Or if you want to write something up and send it to me, I can do that too!
|
Hi Funkybot, I will start now putting all the stuff done so far in a document. Also created some images for the different display types and valuebar modes.
|
|
|
08-17-2022, 01:02 PM
|
#18730
|
Human being with feelings
Join Date: Mar 2009
Location: Dartmouth, Nova Scotia
Posts: 11,183
|
Quote:
Originally Posted by Navelpluisje
It took a while, but here it is, the ValueBar.
Only thing not going really well is hiding on empty tracks. All clearences, for instance on deleting a track, return a value of 0. But for pan, volume, etc, this is a valid value and for that reason am not able to remove the ValueBar in that case.
At the botton (3th code block) is a small fix for undoing the invert on an empty line.
|
Great stuff !
Will be in next build.
Once again please don't use ForceValue(), use the ones with parameters.
ForceValue() was a mistake that got added when coding the SCE24.
It will be removed.
If you don't have a value available, as in the SetProperties method, use ForceValue(lastValue_);
__________________
To install you need the CSI Software and Support Files
For installation instructions and documentation see the Wiki
Donate -- via PayPal to waddingtongeoff@gmail.com
|
|
|
08-17-2022, 01:04 PM
|
#18731
|
Human being with feelings
Join Date: Mar 2009
Location: Dartmouth, Nova Scotia
Posts: 11,183
|
Quote:
Originally Posted by Navelpluisje
|
Sure I'll have a look at it.
__________________
To install you need the CSI Software and Support Files
For installation instructions and documentation see the Wiki
Donate -- via PayPal to waddingtongeoff@gmail.com
|
|
|
08-17-2022, 01:13 PM
|
#18732
|
Human being with feelings
Join Date: Mar 2020
Location: IJsselstein, Netherlands
Posts: 435
|
Quote:
Originally Posted by Geoff Waddington
Great stuff !
Will be in next build.
Once again please don't use ForceValue(), use the ones with parameters.
ForceValue() was a mistake that got added when coding the SCE24.
It will be removed.
If you don't have a value available, as in the SetProperties method, use ForceValue(lastValue_);
|
Ah nice. That would have been my reply if you wouldn't have said it . Will change it
|
|
|
08-17-2022, 01:18 PM
|
#18733
|
Human being with feelings
Join Date: Mar 2009
Location: Dartmouth, Nova Scotia
Posts: 11,183
|
Quote:
Originally Posted by Navelpluisje
Ah nice. That would have been my reply if you wouldn't have said it . Will change it
|
Yes, and that allows you to move the lastValue_ = value into the ForceValue method.
__________________
To install you need the CSI Software and Support Files
For installation instructions and documentation see the Wiki
Donate -- via PayPal to waddingtongeoff@gmail.com
|
|
|
08-17-2022, 01:25 PM
|
#18734
|
Human being with feelings
Join Date: Mar 2020
Location: IJsselstein, Netherlands
Posts: 435
|
Quote:
Originally Posted by Funkybot
3. What was updated on FB_FP8DisplayUpper and FB_FP16DisplayUpper if anything? Anything worth pointing out on the Wiki?
|
Properties were added and once the display type is in place all 4 the lines are working (depending on the display type).
Here is the text for the displays (Already in markdown):
Code:
CSI supports all the display functionality of the Presonus FaderPort8 and FaderPort16. The FaderPorts have multiple (9) display types to choose from, contains a ValueBar and can, depending on the display type, show the VU Meter.
### Display Type
Display type is a per display setting and consists of a widget and an action to set the actual display type. In your .mst file this will look like:
```
// ===========================================
// DISPLAY TYPE
// ===========================================
Widget DisplayType1
FB_FP8DisplayType 0
WidgetEnd
Widget DisplayType2
FB_FP8DisplayType 1
WidgetEnd
etc.....
```
The image below shows all the display types and the Id
![DisplayTypes](https://user-images.githubusercontent.com/1625221/185239569-a5c1477b-45b4-4cda-b26d-f7dd4409cf90.jpg)
The default display type is id **2** This is a version with 4 lines and in most cases the most versatile one.
In your zone file this will look like this:
```
Zone "Track"
DisplayType| DisplayType 5
```
### Display lines
Each of the 4 display rows requires it’s own widget in the .mst file.
For your .mst, here are the names for the FB generators that correspond to each line on the surface.
| | **FaderPort 8** | **FaderPort 16** |
| --- | --- | --- |
| Line 1 | FB_FP8DisplayUpper | FB_FP16DisplayUpper |
| Line 2 | FB_FP8DisplayUpperMiddle | FB_FP16DisplayUpperMiddle |
| Line 3 | FB_FP8DisplayLowerMiddle | FB_FP16DisplayLowerMiddle |
| Line 4 | FB_FP8DisplayLower | FB_FP16DisplayLower |
And here is an example of how the `.mst` would be mapped out for Display 1 on the Faderport8.
```
// ===========================================
// SCRIBBLE LINES CHANNEL 1
// ===========================================
Widget ScribbleLine1_1
FB_FP8DisplayUpper 0
WidgetEnd
Widget ScribbleLine2_1
FB_FP8DisplayUpperMiddle 0
WidgetEnd
Widget ScribbleLine3_1
FB_FP8DisplayLowerMiddle 0
WidgetEnd
Widget ScribbleLine4_1
FB_FP8DisplayLower 0
WidgetEnd
```
These widgets also have some properties to add some styling to the lines. The next properties are available:
* **TextAlign**: Possible values are **Center**, **Left** and **Right**. The default when not set is **Center**
* **Invert**: Value is either `0` or `1`. When set to `1` the background of the line becomes white and the text dark
Using this in a zone file will look like this:
```
Zone "Track"
ScribbleLine1_| TrackNameDisplay
Property+ScribbleLine1_| TextAlign Left
Property+ScribbleLine1_| Invert 1
ScribbleLine2_| TrackNameDisplay
Property+ScribbleLine2_| TextAlign Right
ZoneEnd
```
_In this example line 1 in the scribble text will be left aligned and inverted. Line 2 will be right aligned and not inverted._
> Keep in mind that properties do not work with modifier keys like Shift, Control, etc. The past used properties for a widget are used.
There is also an image for this page needed. That can be found here: https://pasteboard.co/qQTheianj9tM.jpg
Last edited by Navelpluisje; 08-17-2022 at 01:54 PM.
Reason: Added display type, added image url
|
|
|
08-17-2022, 01:32 PM
|
#18735
|
Human being with feelings
Join Date: Mar 2020
Location: IJsselstein, Netherlands
Posts: 435
|
Quote:
Originally Posted by Geoff Waddington
Yes, and that allows you to move the lastValue_ = value into the ForceValue method.
|
Modified both Widgets:
Code:
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
class FPDisplay_Midi_FeedbackProcessor : public Midi_FeedbackProcessor
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
{
private:
int deviceId_ = 0x02;
int displayRow_ = 0x00;
int channel_ = 0;
string lastStringSent_ = " ";
int textAlign_ = 0; // center: 0, left: 1, right: 2
int invert_ = 0; // value is 4 or 0
public:
virtual ~FPDisplay_Midi_FeedbackProcessor() {}
FPDisplay_Midi_FeedbackProcessor(Midi_ControlSurface* surface, Widget* widget, int deviceId, int channel, int displayRow) : Midi_FeedbackProcessor(surface, widget), deviceId_(deviceId), channel_(channel), displayRow_(displayRow) { }
virtual void ClearCache() override
{
lastStringSent_ = " ";
}
virtual void SetValue(string displayText) override
{
if(displayText == lastStringSent_) // changes since last send
return;
ForceValue(displayText);
}
virtual void ForceValue(string displayText) override
{
lastStringSent_ = displayText;
if(displayText == "")
displayText = " ";
const char* text = displayText.c_str();
int invert = lastStringSent_ == "" ? 0 : invert_; // prevent empty inverted lines
int align = 0x0000000 + invert + textAlign_;
struct
{
MIDI_event_ex_t evt;
char data[512];
}
midiSysExData;
midiSysExData.evt.frame_offset = 0;
midiSysExData.evt.size = 0;
midiSysExData.evt.midi_message[midiSysExData.evt.size++] = 0xF0;
midiSysExData.evt.midi_message[midiSysExData.evt.size++] = 0x00;
midiSysExData.evt.midi_message[midiSysExData.evt.size++] = 0x01;
midiSysExData.evt.midi_message[midiSysExData.evt.size++] = 0x06;
midiSysExData.evt.midi_message[midiSysExData.evt.size++] = deviceId_; // Faderport8=0x02, Faderport16=0x16
// <SysExHdr> 12, xx, yy, zz, tx,tx,tx,... F7
midiSysExData.evt.midi_message[midiSysExData.evt.size++] = 0x12;
midiSysExData.evt.midi_message[midiSysExData.evt.size++] = channel_; // xx channel_ id
midiSysExData.evt.midi_message[midiSysExData.evt.size++] = displayRow_; // yy line number 0-3
midiSysExData.evt.midi_message[midiSysExData.evt.size++] = align; // zz alignment flag 0000000=centre, see manual for other setups.
int length = strlen(text);
if (length > 30)
length = 30;
int count = 0;
while (count < length)
{
midiSysExData.evt.midi_message[midiSysExData.evt.size++] = *text++; // tx text in ASCII format
count++;
}
midiSysExData.evt.midi_message[midiSysExData.evt.size++] = 0xF7;
SendMidiMessage(&midiSysExData.evt);
}
virtual void SetProperties(vector<vector<string>> properties) override
{
for(auto property : properties)
{
if(property.size() == 0)
continue;
if(property[0] == "TextAlign" && property.size() > 1)
{
if (property[1] == "Center")
textAlign_ = 0;
else if (property[1] == "Left")
textAlign_ = 1;
else if (property[1] == "Right")
textAlign_ = 2;
else
textAlign_ = 0;
ForceValue(lastStringSent_);
}
else if(property[0] == "Invert" && property.size() > 1)
{
if (property[1] != "1")
invert_ = 0;
else
invert_ = 4;
ForceValue(lastStringSent_);
}
}
ForceValue(lastStringSent_);
}
};
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
class FPValueBar_Midi_FeedbackProcessor : public Midi_FeedbackProcessor
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
{
private:
double lastValue_ = 0;
int valueBarType_ = 4; // 0: Normal, 1: Bipolar, 2: Fill, 3: Spread, 4: Off
int channel_ = 0;
public:
virtual ~FPValueBar_Midi_FeedbackProcessor() {}
FPValueBar_Midi_FeedbackProcessor(Midi_ControlSurface* surface, Widget* widget, int channel) : Midi_FeedbackProcessor(surface, widget), channel_(channel) { }
virtual void SetValue(double value) override
{
if(value == lastValue_)
return;
ForceValue(value);
}
virtual void SetValue(int param, double value) override
{
SetValue(value);
}
virtual void ForceValue(double value) override
{
lastValue_ = value;
if (channel_ < 8)
{
SendMidiMessage(0xb0, channel_ + 0x30, lastValue_ * 127.0);
SendMidiMessage(0xb0, channel_ + 0x38, valueBarType_);
}
else
{
SendMidiMessage(0xb0, channel_ - 8 + 0x40, lastValue_ * 127.0);
SendMidiMessage(0xb0, channel_ - 8 + 0x48, valueBarType_);
}
}
virtual void SetProperties(vector<vector<string>> properties) override
{
for(auto property : properties)
{
if(property.size() == 0)
continue;
if(property[0] == "Mode" && property.size() > 1)
{
if (property[1] == "Normal")
valueBarType_ = 0;
if (property[1] == "BiPolar")
valueBarType_ = 1;
if (property[1] == "Fill")
valueBarType_ = 2;
if (property[1] == "Spread")
valueBarType_ = 3;
if (property[1] == "Off")
valueBarType_ = 4;
ForceValue(lastValue_);
}
}
ForceValue(lastValue_);
}
};
|
|
|
08-17-2022, 02:00 PM
|
#18736
|
Human being with feelings
Join Date: Mar 2020
Location: IJsselstein, Netherlands
Posts: 435
|
Quote:
Originally Posted by Funkybot
4. Anything that needs calling out on FB_FPVUMeter?
|
Only thing needed herre is that the DisplayType needs to be one supporting the VU meter. Check this image: https://pasteboard.co/qQTheianj9tM.jpg. Is also in the previous post. The rest is just as the other VU meters.
mst:
Code:
// ===========================================
// VU METER
// ===========================================
Widget VUMeter1
FB_FPVUMeter 0
WidgetEnd
Widget VUMeter2
FB_FPVUMeter 1
WidgetEnd
When the valuebar and display type are in place the full code for 1 display can look like this:
Code:
Zone "Track"
DisplayType| DisplayType 5
ScribbleLine1_| TrackNameDisplay
Property+ScribbleLine1_| TextAlign Left
Property+ScribbleLine1_| Invert 1
ScribbleLine2_| TrackVolumeDisplay
ScribbleLine3_| TrackPanDisplay
ScribbleLine4_| TrackPanDisplay
ValueBar| TrackPan
Property+ValueBar| Mode BiPolar
VUMeter| TrackOutputMeter
|
|
|
08-17-2022, 02:16 PM
|
#18737
|
Human being with feelings
Join Date: Mar 2020
Location: IJsselstein, Netherlands
Posts: 435
|
Quote:
Originally Posted by Funkybot
2. FB_FaderportRGB was previously used to control the Select button colors right? But then we have FB_FaderportTwoStateRGB. What does that one do? Or how do they work in tandem?
|
Within FB_FaderportRGB you have the ability to add 2 colors. One for inactive and one for active:
Surface
Code:
Widget Trim
Press 90 4c 7f 90 4c 00
FB_FaderportRGB 90 4c 7f
WidgetEnd
Zone
Code:
Trim TrackAutoMode 0 { 20 0 0 255 0 0 }
This sets the color in inactive mode to a lighter illuminated red and when active it will be set to a full illuminated red led.
On the FaderPort the Select button is used as a visual indicator for a track being selected, but also for the Track color. Normally with a track color you would do:
Code:
Select| TrackUniqueSelect { "Track" }
Problem here is that the Track color is a single color, so in both inactive and active state the colors are exactly the same. This way there is no visual indicator anymore on the FaderPort for an selected track.
When using this in your Surface file
Code:
Widget Select1
Press 90 4c 7f 90 4c 00
FB_FaderportTwoStateRGB 90 4c 7f
WidgetEnd
The color will be illuminated when the state of the button is inactive. When the button is active the color will have full brightness. With this addition also the FaderPort users have a visual feedback for the selected track
|
|
|
08-17-2022, 02:17 PM
|
#18738
|
Human being with feelings
Join Date: Mar 2020
Location: IJsselstein, Netherlands
Posts: 435
|
Quote:
Originally Posted by Funkybot
1. Can I get .mst examples of each feedback processor and/or how it's used in a zone file where relevant?
|
I think this one is answered with the above. If not, let me know
|
|
|
08-17-2022, 02:32 PM
|
#18739
|
Human being with feelings
Join Date: Jul 2007
Location: New Joisey
Posts: 5,988
|
Quote:
Originally Posted by Navelpluisje
Within FB_FaderportRGB you have the ability to add 2 colors. One for inactive and one for active:
Surface
Code:
Widget Trim
Press 90 4c 7f 90 4c 00
FB_FaderportRGB 90 4c 7f
WidgetEnd
Zone
Code:
Trim TrackAutoMode 0 { 20 0 0 255 0 0 }
This sets the color in inactive mode to a lighter illuminated red and when active it will be set to a full illuminated red led.
On the FaderPort the Select button is used as a visual indicator for a track being selected, but also for the Track color. Normally with a track color you would do:
Code:
Select| TrackUniqueSelect { "Track" }
Problem here is that the Track color is a single color, so in both inactive and active state the colors are exactly the same. This way there is no visual indicator anymore on the FaderPort for an selected track.
When using this in your Surface file
Code:
Widget Select1
Press 90 4c 7f 90 4c 00
FB_FaderportTwoStateRGB 90 4c 7f
WidgetEnd
The color will be illuminated when the state of the button is inactive. When the button is active the color will have full brightness. With this addition also the FaderPort users have a visual feedback for the selected track
|
I'm working through these out of order and will get them on the Wiki tonight or tomorrow (Friday at the absolute latest).
Regarding this example, so FB_FaderportTwoStateRGB basically does everything FB_FaderportRGB does but works better for distinguishing selected versus unselected tracks? Should we just "unofficially depreciate" the old widget type and suggest users replace it with the new one? I'm thinking that makes sense - but don't want to do jump the gun.
|
|
|
08-17-2022, 02:43 PM
|
#18740
|
Human being with feelings
Join Date: Mar 2020
Location: IJsselstein, Netherlands
Posts: 435
|
Quote:
Originally Posted by Funkybot
I'm working through these out of order and will get them on the Wiki tonight or tomorrow (Friday at the absolute latest).
Regarding this example, so FB_FaderportTwoStateRGB basically does everything FB_FaderportRGB does but works better for distinguishing selected versus unselected tracks? Should we just "unofficially depreciate" the old widget type and suggest users replace it with the new one? I'm thinking that makes sense - but don't want to do jump the gun.
|
Hmmm , not quite sure about that. Get back to you about this tomorrow.
|
|
|
08-17-2022, 02:53 PM
|
#18741
|
Human being with feelings
Join Date: Jul 2007
Location: New Joisey
Posts: 5,988
|
Quote:
Originally Posted by Navelpluisje
Hmmm , not quite sure about that. Get back to you about this tomorrow.
|
And which buttons on the Faderport support these colors? Maybe I just don't understand how the unit works. I've been assuming that users would have previously set all the buttons that support colors to FB_FaderportRGB and that now, they'd gain some additional functionality by replacing that with FB_FaderportTwoStateRGB. But maybe that's a faulty assumption on my part.
If they'd use one widget type for one type of button and the other for a different type, that would be helpful context for me. Thanks!
|
|
|
08-17-2022, 03:38 PM
|
#18742
|
Human being with feelings
Join Date: Mar 2009
Location: Dartmouth, Nova Scotia
Posts: 11,183
|
Is there a reason why we aren't using the familiar notation that all other .mst files use ?
Code:
Widget ScribbleLine1_1
FB_FP8DisplayUpper 0
WidgetEnd
Widget ScribbleLine2_1
FB_FP8DisplayUpperMiddle 0
WidgetEnd
Widget ScribbleLine3_1
FB_FP8DisplayLowerMiddle 0
WidgetEnd
Widget ScribbleLine4_1
FB_FP8DisplayLower 0
WidgetEnd
is notated this way in the other .mst files:
Code:
Widget DisplayUpper1
FB_FP8DisplayUpper 0
WidgetEnd
Widget DisplayUpperMiddle1
FB_FP8DisplayUpperMiddle 0
WidgetEnd
Widget DisplayLowerMiddle1
FB_FP8DisplayLowerMiddle 0
WidgetEnd
Widget DisplayLower1
FB_FP8DisplayLower 0
WidgetEnd
If there is a good reason, I'm all for it, just can't think of why this should deviate.
__________________
To install you need the CSI Software and Support Files
For installation instructions and documentation see the Wiki
Donate -- via PayPal to waddingtongeoff@gmail.com
|
|
|
08-17-2022, 03:40 PM
|
#18743
|
Human being with feelings
Join Date: Jun 2013
Location: Krefeld, Germany
Posts: 14,686
|
Quote:
Originally Posted by Geoff Waddington
Well, if it works , please check it out as soon as you can.
|
Puhhh,
I would need to do some configuration at least for a single rotary to see it working. As I only tried a pre-Alpha version of CSI two years or so ago, I will need to learn how to do the necessary files from scratch. This will take some days....
-Michael
|
|
|
08-17-2022, 04:03 PM
|
#18744
|
Human being with feelings
Join Date: Mar 2009
Location: Dartmouth, Nova Scotia
Posts: 11,183
|
Quote:
Originally Posted by Navelpluisje
|
Had a look, at this, not sure an Action is the best way to go here.
RequestUpdate is really for values that change throughout the lifetime of the Action, this one just sets once and that's it.
It's quite clever, top points for that, but it is a bit verbose and adds a lot of context -- aka variables/coupling.
Let me ponder on that one a bit...
[edit] I think there is a much easier way to do this.
Add a property to FPDisplay_Midi_FeedbackProcessor, ScribbleStripMode that takes a single digit.
Then in the FPDisplay_Midi_FeedbackProcessor::SetProperties method add logic to detect and decipher ScribbleStripMode.
Then add a method named SetScribbleStripMode(int scribbleStripMode) to FPDisplay_Midi_FeedbackProcessor.
The body of SetScribbleStripMode(int scribbleStripMode) is just the code from the ForceValue method of the DisplayType Widget:
Code:
void SetScribbleStripMode(int scribbleStripMode)
{
struct
{
MIDI_event_ex_t evt;
char data[512];
}
midiSysExData;
midiSysExData.evt.frame_offset = 0;
midiSysExData.evt.size = 0;
midiSysExData.evt.midi_message[midiSysExData.evt.size++] = 0xF0;
midiSysExData.evt.midi_message[midiSysExData.evt.size++] = 0x00;
midiSysExData.evt.midi_message[midiSysExData.evt.size++] = 0x01;
midiSysExData.evt.midi_message[midiSysExData.evt.size++] = 0x06;
midiSysExData.evt.midi_message[midiSysExData.evt.size++] = displayType_; // Faderport8=0x02, Faderport16=0x16
midiSysExData.evt.midi_message[midiSysExData.evt.size++] = 0x13;
midiSysExData.evt.midi_message[midiSysExData.evt.size++] = channel_;
midiSysExData.evt.midi_message[midiSysExData.evt.size++] = scribbleStripMode;
midiSysExData.evt.midi_message[midiSysExData.evt.size++] = 0xF7;
SendMidiMessage(&midiSysExData.evt);
}
Then in a Zone, just set the property in any of the Display lines -- DisplayUpper, DisplayUpperMiddle, DisplayLowerDisplayUpperMiddle, DisplayLower.
Code:
DisplayUpper| TrackNameDisplay
Property+DisplayUpper| ScribbleStripMode 2
__________________
To install you need the CSI Software and Support Files
For installation instructions and documentation see the Wiki
Donate -- via PayPal to waddingtongeoff@gmail.com
Last edited by Geoff Waddington; 08-17-2022 at 04:41 PM.
|
|
|
08-17-2022, 04:03 PM
|
#18745
|
Human being with feelings
Join Date: Mar 2009
Location: Dartmouth, Nova Scotia
Posts: 11,183
|
Quote:
Originally Posted by mschnell
Puhhh,
I would need to do some configuration at least for a single rotary to see it working. As I only tried a pre-Alpha version of CSI two years or so ago, I will need to learn how to do the necessary files from scratch. This will take some days....
-Michael
|
Ah, perhaps MixMonkey can try it with his Mini.
__________________
To install you need the CSI Software and Support Files
For installation instructions and documentation see the Wiki
Donate -- via PayPal to waddingtongeoff@gmail.com
|
|
|
08-17-2022, 05:14 PM
|
#18746
|
Human being with feelings
Join Date: Jul 2022
Posts: 93
|
I'll test in the morning, to confirm; I just use rotary 1 and see how it's operating vs before and vs MCU mode?
|
|
|
08-17-2022, 05:15 PM
|
#18747
|
Human being with feelings
Join Date: Jul 2022
Posts: 93
|
Quote:
Originally Posted by Geoff Waddington
New build is up.
CSI Exp.zip
Added XTouchCompactEncoder, you know what to do next
Might also work for the Mini
|
Is this the new build?
https://stash.reaper.fm/v/42044/CSI%20Exp.zip
|
|
|
08-17-2022, 05:18 PM
|
#18748
|
Human being with feelings
Join Date: Mar 2009
Location: Dartmouth, Nova Scotia
Posts: 11,183
|
Quote:
Originally Posted by JP_
I'll test in the morning, to confirm; I just use rotary 1 and see how it's operating vs before and vs MCU mode?
|
Yes, in your .mst file, just replace Fader7Bit with XTouchCompactEncoder.
__________________
To install you need the CSI Software and Support Files
For installation instructions and documentation see the Wiki
Donate -- via PayPal to waddingtongeoff@gmail.com
|
|
|
08-17-2022, 05:20 PM
|
#18749
|
Human being with feelings
Join Date: Jan 2022
Location: Unifield
Posts: 373
|
This one's for Funkybot
Working on importing FX files to the editor I'm developing, I decided to try defining different surfaces and importing other people's FX Zones.
Checking your FX Zone files I found a line that I couldn't make sense of. Could you please explain this? Thanks!
Code:
Property+CellA1_Text1 Text 01 " " 254 254 254 00 00 00
|
|
|
08-17-2022, 05:21 PM
|
#18750
|
Human being with feelings
Join Date: Mar 2009
Location: Dartmouth, Nova Scotia
Posts: 11,183
|
Quote:
Originally Posted by JP_
|
Yes, that 's it, you may recall the suggestion the other day to bookmark it.
Since it is experimental, we don't want just anyone getting their hands on it
__________________
To install you need the CSI Software and Support Files
For installation instructions and documentation see the Wiki
Donate -- via PayPal to waddingtongeoff@gmail.com
|
|
|
08-17-2022, 05:23 PM
|
#18751
|
Human being with feelings
Join Date: Mar 2009
Location: Dartmouth, Nova Scotia
Posts: 11,183
|
Quote:
Originally Posted by MT4U
This one's for Funkybot
Working on importing FX files to the editor I'm developing, I decided to try defining different surfaces and importing other people's FX Zones.
Checking your FX Zone files I found a line that I couldn't make sense of. Could you please explain this? Thanks!
Code:
Property+CellA1_Text1 Text 01 " " 254 254 254 00 00 00
|
That's from an SCE24, an entirely different beast, not much you can learn from those files.
__________________
To install you need the CSI Software and Support Files
For installation instructions and documentation see the Wiki
Donate -- via PayPal to waddingtongeoff@gmail.com
|
|
|
08-17-2022, 05:27 PM
|
#18752
|
Human being with feelings
Join Date: Jul 2022
Posts: 93
|
Quote:
Originally Posted by Geoff Waddington
Yes, that 's it, you may recall the suggestion the other day to bookmark it.
Since it is experimental, we don't want just anyone getting their hands on it
|
I just tested it, it's the same as before, taking 3-4 turns for one notch on bx 4000 e knobs.
Am I supposed to change anything, or just replace the .dll and that's it?
Last edited by JP_; 08-17-2022 at 05:37 PM.
|
|
|
08-17-2022, 05:39 PM
|
#18753
|
Human being with feelings
Join Date: Mar 2009
Location: Dartmouth, Nova Scotia
Posts: 11,183
|
Quote:
Originally Posted by JP_
I just tested it, it's the same as before, taking 3-4 turns for one notch on bx 4000 e knobs.
Am I supposed to change anything, or just replace the .dll and that's it?
|
Yes, in your .mst file, just replace Fader7Bit with XTouchCompactEncoder as stated a few posts back.
Also, you probably want to use custom deltas.
__________________
To install you need the CSI Software and Support Files
For installation instructions and documentation see the Wiki
Donate -- via PayPal to waddingtongeoff@gmail.com
|
|
|
08-17-2022, 05:49 PM
|
#18754
|
Human being with feelings
Join Date: Jul 2022
Posts: 93
|
Quote:
Originally Posted by Geoff Waddington
Yes, in your .mst file, just replace Fader7Bit with XTouchCompactEncoder as stated in a few posts back.
Also, you probably want to use custom deltas.
|
I don't know what deltas are sorry dude! It must be stated that I'm still recovering from a serious motorcycle cash. I lost my left arm from nerve damage and am on insane amounts of medication/morphine.
So I really do apologize if I miss things and repeat myself atm.
|
|
|
08-17-2022, 05:54 PM
|
#18755
|
Human being with feelings
Join Date: Jul 2007
Location: New Joisey
Posts: 5,988
|
Quote:
Originally Posted by JP_
I don't know what deltas are sorry dude! It must be stated that I'm still recovering from a serious motorcycle cash. I lost my left arm from nerve damage and am on insane amounts of medication/morphine.
So I really do apologize if I miss things and repeat myself atm.
|
I think it should look like what I documented here. Geoff/JP_, let me know if that needs to change.
https://github.com/GeoffAWaddington/...compactencoder
If that Message Generator goes official, I'll remove the message at the top of the page. If it gets pulled, then I'll take that section down.
|
|
|
08-17-2022, 05:55 PM
|
#18756
|
Human being with feelings
Join Date: Sep 2017
Location: London, England.
Posts: 4,869
|
Quote:
Originally Posted by Geoff Waddington
Ah, perhaps MixMonkey can try it with his Mini.
|
He can and it works
Code:
Widget RotaryA1
XTouchCompactEncoder ba 01 7f
FB_XTouchCompactEncoder ba 01 7f
WidgetEnd
How does acceleration/tick size play into this?
EDIT: Ok, tick size aka delta works the same, how does acceleration work?
Last edited by MixMonkey; 08-17-2022 at 06:01 PM.
|
|
|
08-17-2022, 05:58 PM
|
#18757
|
Human being with feelings
Join Date: Jul 2007
Location: New Joisey
Posts: 5,988
|
Geoff, are the EncoderPlain and EncoderPlainReversed message generators still in the CSI builds? I found a reference to them on the Wiki but wasn't sure if they should be removed entirely.
|
|
|
08-17-2022, 05:58 PM
|
#18758
|
Human being with feelings
Join Date: Jul 2007
Location: New Joisey
Posts: 5,988
|
Quote:
Originally Posted by MixMonkey
He can and it works
Code:
Widget RotaryA1
XTouchCompactEncoder ba 01 7f
FB_XTouchCompactEncoder ba 01 7f
WidgetEnd
How does acceleration/tick size play into this?
|
Thanks MixMonkey! Will update the wiki with this.
|
|
|
08-17-2022, 06:02 PM
|
#18759
|
Human being with feelings
Join Date: Jul 2022
Posts: 93
|
Quote:
Originally Posted by Geoff Waddington
Yes, in your .mst file, just replace Fader7Bit with XTouchCompactEncoder as stated a few posts back.
Also, you probably want to use custom deltas.
|
OK the control is now on par with MCU encoders! It works!
|
|
|
08-17-2022, 06:08 PM
|
#18760
|
Human being with feelings
Join Date: Mar 2009
Location: Dartmouth, Nova Scotia
Posts: 11,183
|
Quote:
Originally Posted by JP_
I don't know what deltas are sorry dude! It must be stated that I'm still recovering from a serious motorcycle cash. I lost my left arm from nerve damage and am on insane amounts of medication/morphine.
So I really do apologize if I miss things and repeat myself atm.
|
No worries, you are picking things up so quickly, sometimes I forget you are new around here
Take a look at MixMonkey's posts, he's got it figured out.
__________________
To install you need the CSI Software and Support Files
For installation instructions and documentation see the Wiki
Donate -- via PayPal to waddingtongeoff@gmail.com
|
|
|
Thread Tools |
|
Display Modes |
Linear Mode
|
Posting Rules
|
You may not post new threads
You may not post replies
You may not post attachments
You may not edit your posts
HTML code is Off
|
|
|
All times are GMT -7. The time now is 02:13 AM.
|