Go Back   Cockos Incorporated Forums > REAPER Forums > MIDI Hardware, Control Surfaces, and OSC

Reply
 
Thread Tools Display Modes
Old 08-17-2022, 08:22 AM   #18721
mschnell
Human being with feelings
 
mschnell's Avatar
 
Join Date: Jun 2013
Location: Krefeld, Germany
Posts: 14,686
Default

... 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
mschnell is online now   Reply With Quote
Old 08-17-2022, 09:00 AM   #18722
Geoff Waddington
Human being with feelings
 
Geoff Waddington's Avatar
 
Join Date: Mar 2009
Location: Dartmouth, Nova Scotia
Posts: 11,183
Default

Quote:
Originally Posted by mschnell View Post
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
Geoff Waddington is offline   Reply With Quote
Old 08-17-2022, 10:19 AM   #18723
Geoff Waddington
Human being with feelings
 
Geoff Waddington's Avatar
 
Join Date: Mar 2009
Location: Dartmouth, Nova Scotia
Posts: 11,183
Default

Quote:
Originally Posted by MixMonkey View Post
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
Geoff Waddington is offline   Reply With Quote
Old 08-17-2022, 10:22 AM   #18724
Geoff Waddington
Human being with feelings
 
Geoff Waddington's Avatar
 
Join Date: Mar 2009
Location: Dartmouth, Nova Scotia
Posts: 11,183
Default

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
Geoff Waddington is offline   Reply With Quote
Old 08-17-2022, 11:58 AM   #18725
mschnell
Human being with feelings
 
mschnell's Avatar
 
Join Date: Jun 2013
Location: Krefeld, Germany
Posts: 14,686
Default

Quote:
Originally Posted by Geoff Waddington View Post
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 View Post
I will implement this when I finish the EuCon work.
Nice one !!
Great !
This will get JP and myself going !
-Michael
mschnell is online now   Reply With Quote
Old 08-17-2022, 12:09 PM   #18726
Geoff Waddington
Human being with feelings
 
Geoff Waddington's Avatar
 
Join Date: Mar 2009
Location: Dartmouth, Nova Scotia
Posts: 11,183
Default

Quote:
Originally Posted by mschnell View Post
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
Geoff Waddington is offline   Reply With Quote
Old 08-17-2022, 12:39 PM   #18727
Navelpluisje
Human being with feelings
 
Navelpluisje's Avatar
 
Join Date: Mar 2020
Location: IJsselstein, Netherlands
Posts: 435
Default 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();
    }
    
};
__________________
Created ReaSonus FaderPort: Documentation and Download from Github. Report Issues
Created Reapinger BCF2000: Documentation and Download from Reaper Stash
Donations: Buy me a coffee or beer or buy one of my shirts in Europe or North America
Navelpluisje is offline   Reply With Quote
Old 08-17-2022, 12:47 PM   #18728
Navelpluisje
Human being with feelings
 
Navelpluisje's Avatar
 
Join Date: Mar 2020
Location: IJsselstein, Netherlands
Posts: 435
Default

@Geoff, can you also check https://forum.cockos.com/showpost.ph...ostcount=18580. This one is needed to make the VU meter work.
__________________
Created ReaSonus FaderPort: Documentation and Download from Github. Report Issues
Created Reapinger BCF2000: Documentation and Download from Reaper Stash
Donations: Buy me a coffee or beer or buy one of my shirts in Europe or North America
Navelpluisje is offline   Reply With Quote
Old 08-17-2022, 12:49 PM   #18729
Navelpluisje
Human being with feelings
 
Navelpluisje's Avatar
 
Join Date: Mar 2020
Location: IJsselstein, Netherlands
Posts: 435
Default

Quote:
Originally Posted by Funkybot View Post
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.
__________________
Created ReaSonus FaderPort: Documentation and Download from Github. Report Issues
Created Reapinger BCF2000: Documentation and Download from Reaper Stash
Donations: Buy me a coffee or beer or buy one of my shirts in Europe or North America
Navelpluisje is offline   Reply With Quote
Old 08-17-2022, 01:02 PM   #18730
Geoff Waddington
Human being with feelings
 
Geoff Waddington's Avatar
 
Join Date: Mar 2009
Location: Dartmouth, Nova Scotia
Posts: 11,183
Default

Quote:
Originally Posted by Navelpluisje View Post
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
Geoff Waddington is offline   Reply With Quote
Old 08-17-2022, 01:04 PM   #18731
Geoff Waddington
Human being with feelings
 
Geoff Waddington's Avatar
 
Join Date: Mar 2009
Location: Dartmouth, Nova Scotia
Posts: 11,183
Default

Quote:
Originally Posted by Navelpluisje View Post
@Geoff, can you also check https://forum.cockos.com/showpost.ph...ostcount=18580. This one is needed to make the VU meter work.
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
Geoff Waddington is offline   Reply With Quote
Old 08-17-2022, 01:13 PM   #18732
Navelpluisje
Human being with feelings
 
Navelpluisje's Avatar
 
Join Date: Mar 2020
Location: IJsselstein, Netherlands
Posts: 435
Default

Quote:
Originally Posted by Geoff Waddington View Post
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
__________________
Created ReaSonus FaderPort: Documentation and Download from Github. Report Issues
Created Reapinger BCF2000: Documentation and Download from Reaper Stash
Donations: Buy me a coffee or beer or buy one of my shirts in Europe or North America
Navelpluisje is offline   Reply With Quote
Old 08-17-2022, 01:18 PM   #18733
Geoff Waddington
Human being with feelings
 
Geoff Waddington's Avatar
 
Join Date: Mar 2009
Location: Dartmouth, Nova Scotia
Posts: 11,183
Default

Quote:
Originally Posted by Navelpluisje View Post
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
Geoff Waddington is offline   Reply With Quote
Old 08-17-2022, 01:25 PM   #18734
Navelpluisje
Human being with feelings
 
Navelpluisje's Avatar
 
Join Date: Mar 2020
Location: IJsselstein, Netherlands
Posts: 435
Default

Quote:
Originally Posted by Funkybot View Post
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
__________________
Created ReaSonus FaderPort: Documentation and Download from Github. Report Issues
Created Reapinger BCF2000: Documentation and Download from Reaper Stash
Donations: Buy me a coffee or beer or buy one of my shirts in Europe or North America

Last edited by Navelpluisje; 08-17-2022 at 01:54 PM. Reason: Added display type, added image url
Navelpluisje is offline   Reply With Quote
Old 08-17-2022, 01:32 PM   #18735
Navelpluisje
Human being with feelings
 
Navelpluisje's Avatar
 
Join Date: Mar 2020
Location: IJsselstein, Netherlands
Posts: 435
Default

Quote:
Originally Posted by Geoff Waddington View Post
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_);
    }
};
__________________
Created ReaSonus FaderPort: Documentation and Download from Github. Report Issues
Created Reapinger BCF2000: Documentation and Download from Reaper Stash
Donations: Buy me a coffee or beer or buy one of my shirts in Europe or North America
Navelpluisje is offline   Reply With Quote
Old 08-17-2022, 02:00 PM   #18736
Navelpluisje
Human being with feelings
 
Navelpluisje's Avatar
 
Join Date: Mar 2020
Location: IJsselstein, Netherlands
Posts: 435
Default

Quote:
Originally Posted by Funkybot View Post
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
__________________
Created ReaSonus FaderPort: Documentation and Download from Github. Report Issues
Created Reapinger BCF2000: Documentation and Download from Reaper Stash
Donations: Buy me a coffee or beer or buy one of my shirts in Europe or North America
Navelpluisje is offline   Reply With Quote
Old 08-17-2022, 02:16 PM   #18737
Navelpluisje
Human being with feelings
 
Navelpluisje's Avatar
 
Join Date: Mar 2020
Location: IJsselstein, Netherlands
Posts: 435
Default

Quote:
Originally Posted by Funkybot View Post
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
__________________
Created ReaSonus FaderPort: Documentation and Download from Github. Report Issues
Created Reapinger BCF2000: Documentation and Download from Reaper Stash
Donations: Buy me a coffee or beer or buy one of my shirts in Europe or North America
Navelpluisje is offline   Reply With Quote
Old 08-17-2022, 02:17 PM   #18738
Navelpluisje
Human being with feelings
 
Navelpluisje's Avatar
 
Join Date: Mar 2020
Location: IJsselstein, Netherlands
Posts: 435
Default

Quote:
Originally Posted by Funkybot View Post
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
__________________
Created ReaSonus FaderPort: Documentation and Download from Github. Report Issues
Created Reapinger BCF2000: Documentation and Download from Reaper Stash
Donations: Buy me a coffee or beer or buy one of my shirts in Europe or North America
Navelpluisje is offline   Reply With Quote
Old 08-17-2022, 02:32 PM   #18739
Funkybot
Human being with feelings
 
Funkybot's Avatar
 
Join Date: Jul 2007
Location: New Joisey
Posts: 5,988
Default

Quote:
Originally Posted by Navelpluisje View Post
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.
__________________
CSI v3 Wiki
Funkybot is offline   Reply With Quote
Old 08-17-2022, 02:43 PM   #18740
Navelpluisje
Human being with feelings
 
Navelpluisje's Avatar
 
Join Date: Mar 2020
Location: IJsselstein, Netherlands
Posts: 435
Default

Quote:
Originally Posted by Funkybot View Post
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.
__________________
Created ReaSonus FaderPort: Documentation and Download from Github. Report Issues
Created Reapinger BCF2000: Documentation and Download from Reaper Stash
Donations: Buy me a coffee or beer or buy one of my shirts in Europe or North America
Navelpluisje is offline   Reply With Quote
Old 08-17-2022, 02:53 PM   #18741
Funkybot
Human being with feelings
 
Funkybot's Avatar
 
Join Date: Jul 2007
Location: New Joisey
Posts: 5,988
Default

Quote:
Originally Posted by Navelpluisje View Post
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!
__________________
CSI v3 Wiki
Funkybot is offline   Reply With Quote
Old 08-17-2022, 03:38 PM   #18742
Geoff Waddington
Human being with feelings
 
Geoff Waddington's Avatar
 
Join Date: Mar 2009
Location: Dartmouth, Nova Scotia
Posts: 11,183
Default

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
Geoff Waddington is offline   Reply With Quote
Old 08-17-2022, 03:40 PM   #18743
mschnell
Human being with feelings
 
mschnell's Avatar
 
Join Date: Jun 2013
Location: Krefeld, Germany
Posts: 14,686
Default

Quote:
Originally Posted by Geoff Waddington View Post
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
mschnell is online now   Reply With Quote
Old 08-17-2022, 04:03 PM   #18744
Geoff Waddington
Human being with feelings
 
Geoff Waddington's Avatar
 
Join Date: Mar 2009
Location: Dartmouth, Nova Scotia
Posts: 11,183
Default

Quote:
Originally Posted by Navelpluisje View Post
@Geoff, can you also check https://forum.cockos.com/showpost.ph...ostcount=18580. This one is needed to make the VU meter work.
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.
Geoff Waddington is offline   Reply With Quote
Old 08-17-2022, 04:03 PM   #18745
Geoff Waddington
Human being with feelings
 
Geoff Waddington's Avatar
 
Join Date: Mar 2009
Location: Dartmouth, Nova Scotia
Posts: 11,183
Default

Quote:
Originally Posted by mschnell View Post
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
Geoff Waddington is offline   Reply With Quote
Old 08-17-2022, 05:14 PM   #18746
JP_
Human being with feelings
 
Join Date: Jul 2022
Posts: 93
Default

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?
JP_ is offline   Reply With Quote
Old 08-17-2022, 05:15 PM   #18747
JP_
Human being with feelings
 
Join Date: Jul 2022
Posts: 93
Default

Quote:
Originally Posted by Geoff Waddington View Post
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
JP_ is offline   Reply With Quote
Old 08-17-2022, 05:18 PM   #18748
Geoff Waddington
Human being with feelings
 
Geoff Waddington's Avatar
 
Join Date: Mar 2009
Location: Dartmouth, Nova Scotia
Posts: 11,183
Default

Quote:
Originally Posted by JP_ View Post
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
Geoff Waddington is offline   Reply With Quote
Old 08-17-2022, 05:20 PM   #18749
MT4U
Human being with feelings
 
MT4U's Avatar
 
Join Date: Jan 2022
Location: Unifield
Posts: 373
Default

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
__________________

CSI_FX
: SubZone based GUI/Automapper for CSI.(UPD:2024-01-13)
Video Demo/Tutorial
Scripts for CSI: Reaper EEL2 scripts to use with CSI
MT4U is offline   Reply With Quote
Old 08-17-2022, 05:21 PM   #18750
Geoff Waddington
Human being with feelings
 
Geoff Waddington's Avatar
 
Join Date: Mar 2009
Location: Dartmouth, Nova Scotia
Posts: 11,183
Default

Quote:
Originally Posted by JP_ View Post
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
Geoff Waddington is offline   Reply With Quote
Old 08-17-2022, 05:23 PM   #18751
Geoff Waddington
Human being with feelings
 
Geoff Waddington's Avatar
 
Join Date: Mar 2009
Location: Dartmouth, Nova Scotia
Posts: 11,183
Default

Quote:
Originally Posted by MT4U View Post
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
Geoff Waddington is offline   Reply With Quote
Old 08-17-2022, 05:27 PM   #18752
JP_
Human being with feelings
 
Join Date: Jul 2022
Posts: 93
Default

Quote:
Originally Posted by Geoff Waddington View Post
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.
JP_ is offline   Reply With Quote
Old 08-17-2022, 05:39 PM   #18753
Geoff Waddington
Human being with feelings
 
Geoff Waddington's Avatar
 
Join Date: Mar 2009
Location: Dartmouth, Nova Scotia
Posts: 11,183
Default

Quote:
Originally Posted by JP_ View Post
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
Geoff Waddington is offline   Reply With Quote
Old 08-17-2022, 05:49 PM   #18754
JP_
Human being with feelings
 
Join Date: Jul 2022
Posts: 93
Default

Quote:
Originally Posted by Geoff Waddington View Post
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.
JP_ is offline   Reply With Quote
Old 08-17-2022, 05:54 PM   #18755
Funkybot
Human being with feelings
 
Funkybot's Avatar
 
Join Date: Jul 2007
Location: New Joisey
Posts: 5,988
Default

Quote:
Originally Posted by JP_ View Post
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.
__________________
CSI v3 Wiki
Funkybot is offline   Reply With Quote
Old 08-17-2022, 05:55 PM   #18756
MixMonkey
Human being with feelings
 
MixMonkey's Avatar
 
Join Date: Sep 2017
Location: London, England.
Posts: 4,869
Default

Quote:
Originally Posted by Geoff Waddington View Post
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.
MixMonkey is offline   Reply With Quote
Old 08-17-2022, 05:58 PM   #18757
Funkybot
Human being with feelings
 
Funkybot's Avatar
 
Join Date: Jul 2007
Location: New Joisey
Posts: 5,988
Default

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.
__________________
CSI v3 Wiki
Funkybot is offline   Reply With Quote
Old 08-17-2022, 05:58 PM   #18758
Funkybot
Human being with feelings
 
Funkybot's Avatar
 
Join Date: Jul 2007
Location: New Joisey
Posts: 5,988
Default

Quote:
Originally Posted by MixMonkey View Post
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.
__________________
CSI v3 Wiki
Funkybot is offline   Reply With Quote
Old 08-17-2022, 06:02 PM   #18759
JP_
Human being with feelings
 
Join Date: Jul 2022
Posts: 93
Default

Quote:
Originally Posted by Geoff Waddington View Post
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!
JP_ is offline   Reply With Quote
Old 08-17-2022, 06:08 PM   #18760
Geoff Waddington
Human being with feelings
 
Geoff Waddington's Avatar
 
Join Date: Mar 2009
Location: Dartmouth, Nova Scotia
Posts: 11,183
Default

Quote:
Originally Posted by JP_ View Post
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
Geoff Waddington is offline   Reply With Quote
Reply

Thread Tools
Display Modes

Posting Rules
You may not post new threads
You may not post replies
You may not post attachments
You may not edit your posts

BB code is On
Smilies are On
[IMG] code is On
HTML code is Off

Forum Jump


All times are GMT -7. The time now is 02:13 AM.


Powered by vBulletin® Version 3.8.11
Copyright ©2000 - 2024, vBulletin Solutions Inc.