Upcoming Events

Weekly BMW races on Simracing.GP Other regular AC events on Simracing.GP Weekly GT3 Sprint Races on Simracing.GP Rookie friendly WTCR sereis Weekly rFactor 2 events

SimHub ShakeIt Bass Shakers custom 4 corner tire slip

blekenbleu

Premium
Messages
1,025
Points
2,037
My sim driving experience is only in Assetto Corsa with an office chair and wheel stand.
I have no experience with the full SRS ShakeKit, which may offer a superior experience.
Without a harness to keep one's back contacting them,
back transducers in ShakeKit Plus seem of arguable benefit.

Already using SimHub, having unused motherboard 7.1 sound and obsolete Denon surround receiver,
a ShakeSeat pad was ordered because:
An equivalent can be made using Dayton pucks with e.g. 40cm square zippered cushion covers
and EVA foam floor tiles.
Standard SimHub ShakeIt tire slip does not consider tire loading.
For example, an inside tire may be fully unloaded during cornering,
with very high slippage, but no perceived sensation in actual driving.
Ideally, a SimHub effect would change frequency based on slip but change amplitude based on load.
This is not seemingly impossible using only currently implemented SimHub support.

This SimHub profile attempts to approximate track sensations from street tires,
when securely harnessed in a fitted racing seat.
Usefulness of such haptic feedback may vary widely among users:
IMO, this wheel slip feedback is less compelling than that from 2DOF harness tensioners,
but reduces a sense of "something missing".

Unambiguously directional haptic cues seemingly requires substantially direct stimulation of
body parts, e.g. left and right thighs, lumbar and/or sit bones.
SRS_EVA.jpg

Sensations to be simulated here:
  • squeal for small slippage, transitioning to moaning with more slippage,
  • then shuddering near breakaway, with intensities proportional to tire loadings
Implementation replaces SimHub Wheels slip effect with a pair of Custom Effects
  1. latitudinal and longitudinal acceleration properties
  2. loaded tire slips, products of tire slip properties times accelerations
Again, because load modulates slip in telemetry,
heavily loaded small slip cannot be generated as strong high frequency tactile effect
and is confounded with larger slips at lower loadings..

Accelerations were originally estimated from speed and yaw sample changes, serving as G force proxies.
Earlier SimHub versions sampled speed and yaw at a lower rate than Assetto Corsa sample updates,
resulting in some changes 2x others, which code here detects and mitigates.
This was obsoleted by SimHub 7.3.14, which added Lateral acceleration support
JavaScript:
// lateral acceleration proxy
var y = $prop('OrientationYaw');
const tc = 3;  // IIR smoothing factor
const noise = 0.01 // non-linear filter threshold

// initialize IIR filter history
if(null==root["yaw"]) {
   root["yaw"] = $prop('OrientationYaw');
   root["delta_y"] = 0.2;
}
if (null==root["Gyb4"])
  root["Gyb4"] = 0.5;

var dy = y - root["yaw"];       // change between sample intervals

// yaw flips at +/- 180
if (Math.abs(dy) > 180) {  // yaw went +/- 180
  if (Math.abs(root["yaw"]) > 150)
    dy = -(y + root["yaw"]);
}

root["yaw"] = y;
y = root["delta_y"];    // previous sample change

// mitigate delta spikes from missed samples
var my = 1;     // sample interval
if ((Math.abs(dy * y) > noise)  // missed sample?
&& (Math.abs(dy) > Math.abs(1.8 * y)))
  dy /= (my = 2);

root["delta_y"] = dy;

// IIR low-pass filter
var Gyb4 = root["Gyb4"];        // IIR output
Gyb4 += my * (dy - Gyb4) / tc;  // low-pass IIR
root["Gyb4"] = Gyb4;
return 50 + (50 * Gyb4);  // range 0-100
// 50 corresponds to no G force
Longitudinal acceleration (right channel) is similar, substituting speed for yaw.

Loaded tire slip corner effects use products of tire slips and G force proxies:
JavaScript:
// left front loaded slip
// convert unsigned lateral Gs to signed left G
var L = $prop('ShakeITBSV3Plugin.Export.proxy_G.FrontLeft');
L -= $prop('ShakeITBSV3Plugin.Export.proxy_G.RearLeft');
// convert lateral G to left load
L = 25 + 25 * L / 100;
// convert unsigned accelerations to signed deceleration
var d = $prop('ShakeITBSV3Plugin.Export.proxy_G.FrontRight')
d -= $prop('ShakeITBSV3Plugin.Export.proxy_G.RearRight');
// apply deceleration to left load
L += L * d/100;
//return L;    // load test
// apply left front load to conditioned corner slip
var s = $prop('ShakeITBSV3Plugin.Export.proxyS.FrontLeft');
return s *  L / 100;

CUSTOM EFFECTS could be combined, except that
SimHub acceleration and wheel slip signals want Response filter tunings
before calculating and applying loads. In particular,
SimHub WHEEL SLIPS are relatively inconsistent among games and cars,
so want tweaking as telemetry signals
in order to exercise the intended range of tactile frequencies.

A complete SimHub ShakeIt profile is available on GitHub.
April 23 update uses SimHub 7.3.14 acceleration properties
instead of Javascript delta yaw and speed calculations.
It also adds a mono channel for unloaded rears wheel slip AKA trailing oversteer.
Slip telemetry used in this profile is not portable among games.
A portable update is being worked on, pending live testing...
 
Last edited:

blekenbleu

Premium
Messages
1,025
Points
2,037
I'd love to make the frequency speed dependent, but I think this is not available in SimHub.
A ShakeIt Bass Shakers effect which changes frequency with speed is not hard..,
and the output of that speed effect can have constant volume.
Using another effect to manipulate volume of a dedicated audio channel for that effect
requires some tricks:
A custom SimHub plugin to directly control some soundcard channel volume would be better..
it would add or read a property to control the volume of a selected Windows sound channel.
The hard part would seemingly be creating a UI to select the appropriate sound channel.
 
Last edited:
Messages
19
Points
27
Hi,
Sorry for the long delay in responding.
I find that I don't get as satisfying a feedback with the simhub substitution as I did with your original formulae?
I have adapted a part of the code, poorly I think, BUT the output is satisfying.

JavaScript:
// Sway
var sway = -0.01 * $prop('AccelerationSway');
// speed @ left rear
var tslr = $prop('GameRawData.TireSpeed.RearLeft') ;
// speed @ Right rear
var tsrr = $prop('GameRawData.TireSpeed.RearRight') ;
// Car speed
var cs = $prop('GameRawData.CarSpeed')
// left rear loaded slip
var L = $prop('ShakeITBSV3Plugin.Export.proxyL.RearLeft');
// corner slip
var s = $prop('ShakeITBSV3Plugin.Export.proxyS.RearLeft');
// weight slip by load
return s * L * sway * (cs + tslr) ;

Please try it. I was attempting to get speed dependent warning of over steer, which I do, but the car speed becomes an overriding factor, where on a high downforce car slip at high car speeds probably isn't an issue.
I'm enjoying the experiment, I'll try and record the sound channel output with the next replay.
Thanks for the super work on this, its making a terrific difference.
RR
 

Attachments

  • Any Game - OpenWheelLoadedWheelslipsRR.siprofile.txt
    40.5 KB · Views: 12

blekenbleu

Premium
Messages
1,025
Points
2,037
Please try it.
Should that code work well for this replay?
I do have a replay from Raceroom of the F4 at Hockenheim which is prone to locking brakes, understeer and snap oversteer.
Link below.
RRE Simhub Replay

s * L * sway basically makes cornering forces more important than braking and acceleration,
where L accounts for acceleration in any direction

I was attempting to get speed dependent warning of over steer, which I do, but the car speed becomes an overriding factor
That could be tweaked using JavaScript's Math.pow.
For example, suppose that you like the car speed effect up to (cs + tslr) = 100.
Then instead try: 100*Math.pow((cs+tslr)/100, 0.5), which applies a square root,
so that values < 100 become larger and values > 100 become smaller.
Stronger effects occur for exponents < 0.5.

Alternatively, you could create another custom effect
to apply a response filter to (cs + tslr)
which limits that speed effect
and export that as another property to be used instead.

where on a high downforce car slip at high car speeds probably isn't an issue
I expect slip to be important at any speed. FWIW, I tune feedback for relatively small amounts of slip,
since high slip values generally occur after already losing control, except e.g. when drifting.
 
Messages
2,419
Points
1,967
Is there any way to get good effects WITHOUT all of this coding? There is no way I'll be diving into any of this custom stuff but I do want to start getting some more involved effects. I have some older profiles from Mr Latte that provide most of what I need but I do want to add some effective lateral load and wheel slip with my new unit/s.

Also, hi Rangey ;)
 
Last edited:

blekenbleu

Premium
Messages
1,025
Points
2,037
good effects
There are several aspects to goodness of effects
  • entertainment
  • realism
  • usefulness
SimHub ShakeIt already provides effects that can be tweaked for entertainment and realism.
For example, since useful engine sounds are already available directly from games,
I personally consider ShakeIt's Engine effect generally not useful.
FWIW, my sim "rig" is a desk chair and wheel stand,
with haptics only by pucks and exciters, focused on usefulness.

For e.g. slip of loaded wheels, one must obtain and apply wheel slip and load values.
Vertical wheel loads are available for some games as GameRawData.Physics properties,
but for other games must be derived e.g. from G-Forces.

effective lateral load
If considering lateral loads, rather than slippages,
acceleration and deceleration loads should also be considered.
These add to lateral loads approximately by square root of sum of squares.

I also have a home theater with multiple 18-inch subwoofers
and used to employ bass shakers in a previous home theater;
I appreciate, but only imagine, many of @Mr Latte's offerings.
 

Mr Latte

Premium
Messages
3,636
Points
1,861
So for a demonstration, of your effect in action, can you please confirm that the recent file shared on Simhub discord by another user is the newest/latest.

 

Mr Latte

Premium
Messages
3,636
Points
1,861
So here I looked at the version of your effect the guy on Simhub Discord shared and with the other set "Loaded Wheelslip Understeer" which I think is your most recent?

Not surprisingly I found trying to run the game, and Nvidia Recording with also showing the real-time monitoring it caused missed frames in the recording. I can see it fine when I have both side/side on the G9 but when I also try to record my system just cant cope.

Shame I cant get a video to record without being choppy.
I may have to just record the monitor from phone at some point.


Both versions loaded into Simhub, all 4 channels for this test were applied to one output.
This way we will just monitor to see the combined frequencies generated from all 4 wheels in this example

(A) Settings


(B) Settings



Various tools from Cubase Pro 11 were being used to see the output being generated.

If I should set different settings then let me know...

Generally, the version the guy on Discord channel shared does very little in moving much beyond 44Hz. It maintains a very narrow peak, this regards burnouts, lockups, placing the car in understeer and oversteer scenarios. I will look at it operating over different channels for each individual wheel but it appears to be mostly static in frequency and just increasing amplitude.

With your other version, it certainly has more range of frequencies being used and I can see your using pretty much the best you can get from the exciter's abilities.

I Will look into things more but when I compare the operation of your effect. At this early look, I don't see a great deal of difference to standard effects, yes times we can see the output of the unloaded wheel reacting but how useable is that to the driver compared to just sensing normal slip?

Do we have to define these more as individual effects and place to certain units or just focus more on what the felt sensation of low-high values in slip produces?

I do think it's important to feel independently the front/rear but taking things to individual tyres, mmm not yet fully convinced it is as useful or as important as how good having the effect feel and vary over its full range of operation maybe is.

Needs further examination, below is just me having fun looking into things more deeply.


This is a grab from your effect compared to one of my own.

We see the different approaches we have, in how I want to apply much more frequency range based on the hardware configuration I use and recommend.



Also as seen in the "Frequency Intensity Meter" below how much wider (fullier bodied) one is to the other with much more harmonics and level of finer detail.



In general yes, this gives a much greater felt sensation and how low-high telemetry values shift in transitioning of their frequencies and not just in the amplitude of a more static range. Simply put you feel much more from small to large operations of the slip and the felt sensation between these is much greater in the definition.

This isn't a dig at your approach or ability by any means in what you are doing, it helps showcase I think what a more budget-based tactile configuration can offer to a more pro-level-based one and trying to take them to their best potential.
 
Last edited:

blekenbleu

Premium
Messages
1,025
Points
2,037
So here I looked at the version of your effect the guy on Simhub Discord shared and with the other set "Loaded Wheelslip Understeer" which I think is your most recent?
First, I want to be clear about sincerely appreciating that you would invest time and effort to evaluate these profiles.

the version the guy on Discord channel shared does very little in moving much beyond 44Hz
This would be [URL='https://cdn.discordapp.com/attachments/526148774947586068/875658554495881266/blekenbleu_4-channel_wheelslip.siprofile']B settings[/URL], which output was configured by @sierses.

Various tools from Cubase Pro 11 were being used to see the output being generated.
Are those results from running SimHub output thru your DSP?
  • @sierses SimHub output was set as 92Hz +/16Hz
  • That mostly corresponds to the B settings Spectrum Bar green peak
  • A settings mix slips and oversteer output was set to 44 Hz, but I expected users to change the mix formulae and tune their own outputs, which @sierses did for his discord version.
the other set "Loaded Wheelslip Understeer" which I think is your most recent?
Literally, I am not completely certain; having lost track of how many different SimHub ShakeIt profiles I may have exposed.
Searching racedepartment.com found 4 unique SimHub ShakeIt profiles:
https://blekenbleu.github.io/pedals/GmodulatedWheelSlip.siprofile.txt

.. so I suspect that the one you have was originally named "NewLoaded4-chanWheelslipUndersteer",
which is about half the size of my (unreleased) "Loaded Wheelslip Understeer" profile...
In newloaded4-chanwheelslipundersteer-siprofile.txt,
outputs that I personally use were disabled, namely: under, oversteer and loaded wheel slips for each corner,
and I consider the understeer output basically redundant to steering FFB,
and I have since discovered than both oversteer and understeer formulae are buggy.
 
Last edited:

blekenbleu

Premium
Messages
1,025
Points
2,037
I do think it's important to feel independently the front/rear but taking things to individual tyres, mmm not yet fully convinced it is as useful or as important as how good having the effect feel and vary over its full range of operation maybe is.
Left-to-right differences seem roughly as important in at least some open wheel racers
as do front-to-rear differences in street (and many GT) cars.
Perhaps that is more about wheelbase vs track width..
It appears that several shakers and exciters are required to deliver tactile effects
with the frequency and dynamic range that you and others consider important.
I doubt whether it is practical to implement four channels of that high quality which could be sensed independently.
It is certainly not possible with my desk chair, and a proper race seat is no longer a viable option for my back.

I personally find it quite helpful for my sim driving to be able to tell:
  • roughly how much each loaded wheel is slipping,
  • while ignoring slip from any single unloaded wheel
  • while also being able to (separately) sense when both rear wheels begin slipping more than both fronts (oversteer)
    or vice versa (understeer), but understeer is already sensed in steering force feedback.
Work is still needed to sort whether trailing (unloaded) oversteer wants handling differently from e.g. power (loaded) oversteer.

I had supposed that you might experiment
changing SimHub tactile power spectra for my sim physics formulae.
By analogy, I play haptics thru a kazoo, while you play tactile effects thru a pipe organ.
 

Mr Latte

Premium
Messages
3,636
Points
1,861
Your welcome and I appreciate your willingness to help/share in seeing what potential can be achieved.

I think I need to then clarify with you what version to use and start to look more into.
Easier for me to just share it as .txt

Thoughts
Splitting the slip into different elements with "unloaded wheels" being given its own controlled operation would then allow me to work on a felt sensation that really makes it as a response have its own unique character. Yet try to take this a bit further with the 1-200Hz range.

However, as effects go I really do think on most rigs applying tactile installed on "corners" is not working well enough to fully appreciate being able to feel independent channels effectively.

You do however seem to think as I do, that with more direct installed tactile and in the exciters, we can apply this more to the seat for specific body zones and these having their own unique feel.

Therefore making it easier for a user to distinguish a difference between "unloaded" sensation and "standard slip" with each outputting on different exciters placed in different seat locations. Tus giving the use a clear distinction of when each is operating.

Yeah I would be interested to see if this can bring additional useful immersion and as a driving aid too?

Ongoing Learning Curve:
This post today, was just a quick play around as I am still learning Cubase options but for monitoring audio I now have several of the best software plugins available and we can see everything in different ways. I can also record direct into the DAW to then see the captured audio as a waveform.

It becomes evident to be able to have this as I would like with additional screen real estate.
A 2nd G9 monitor solely for displaying the activity of the different channels (and more of them) would be nice to have.
 
Last edited:

blekenbleu

Premium
Messages
1,025
Points
2,037
However, as effects go I really do think on most rigs applying tactile installed on "corners" is not working well enough to fully appreciate being able to feel independent channels effectively.
I understand this to mean:
  • You mostly want front vs rear effects; many users have at most 2 nominally independent channels
Folks with active belt tensioners may get feedback suggesting whether left or right wheels are most loaded.

I will create a separate thread for a ShakeIt profile dedicated to front vs rear effects.
I can think of a couple experiments for deriving better signals for controlling front/rear tactile effects.
It may be another month before back problems relent enough to not distract from productive coding.

If possible, useful SimHub recordings from e.g. ACC and iRacing would be very helpful,
because much JavaScript whacking in different profile revisions
is to work around limitations of SimHub physics properties available only from certain games.
 

Mr Latte

Premium
Messages
3,636
Points
1,861
I understand this to mean:
  • You mostly want front vs rear effects; many users have at most 2 nominally independent channels
Folks with active belt tensioners may get feedback suggesting whether left or right wheels are most loaded.

I will create a separate thread for a ShakeIt profile dedicated to front vs rear effects.
I can think of a couple experiments for deriving better signals for controlling front/rear tactile effects.
It may be another month before back problems relent enough to not distract from productive coding.

If possible, useful SimHub recordings from e.g. ACC and iRacing would be very helpful,
because much JavaScript whacking in different profile revisions
is to work around limitations of SimHub physics properties available only from certain games.

Well the vast majority of CM owners do not have a seat tensioner nor will they have expensive tactile or it installed to a decent standard with any form of isolation. So its questionable what level of "stereo" without crosstalk interference they do feel.

I understand what your saying in how you can get the stereo activity in the seat with exciters to work with the tensioner and also in the front with exciters in stereo at the pedals..

No question the exciters can play an important role for effects over typical installations.

I can look into recordings, its not something I use that much but is nice to compare repeated sequences with different settings.
 
Last edited:

Mr Latte

Premium
Messages
3,636
Points
1,861
So back in looking to set up a comparison to see each element of your effect operating.....
To enable an A Vs B comparison.

Upon routing 4 wheels of A to 1,2,3,4 channels and 4 wheels of B to 5,6,7,8

This way I can have two sets of your effect operating with 8 visualizations operating at once.

Yet I discover when labeling the effects with custom labels only "Oversteer" is available for mapping in "Sound Output"?

Is there a way or as you mentioned earlier a version that has each effect element available as a controlled output?

That's what I need to start seeing when

Oversteer
Understeer
Load

are all individually active.
 
Last edited:

blekenbleu

Premium
Messages
1,025
Points
2,037
I discover when labeling the effects with custom labels only "Oversteer" is available for mapping in "Sound Output"?

I had not previously tried custom labels AKA Use separate output channels settings.

Trying it now, whether label setting allows for more than a single custom output effect
appears to depend on the sequence in which custom effects are enabled and labelled:
labelled.gif


Perhaps that is a bug in current SimHub versions?

Is there a way or as you mentioned earlier a version that has each effect element available as a controlled output?

That's what I need to start seeing when

Oversteer
Understeer
Load

are all individually active.

My loaded slips is a 4-channel effect,
while UnderOversteer are Front and Rear channels of another custom effect:
custom.gif


...all six appear under Custom Effect in OUTPUT SELECTION:
outputs.gif
 
Last edited:

Mr Latte

Premium
Messages
3,636
Points
1,861
Hi, just to confirm, can you share as .txt here the version of the effect you would like me to try?
Have it pre-set with settings you think are ideal.


Much appreciated...
 

blekenbleu

Premium
Messages
1,025
Points
2,037
can you share as .txt here the version of the effect you would like me to try?
My understanding is that you want loaded effect as front/rear, rather than 4 channel.
I have not worked on that yet, nor have bugs in oversteer effect formula been addressed.
While in less discomfort, I am still unable to drive, spending most of days propped in a recliner.
 

Mr Latte

Premium
Messages
3,636
Points
1,861
My understanding is that you want loaded effect as front/rear, rather than 4 channel.
I have not worked on that yet, nor have bugs in oversteer effect formula been addressed.
While in less discomfort, I am still unable to drive, spending most of days propped in a recliner.
I can work with "Corners" no problem, I am keen to see the effect mainly more in action
 
Messages
1
Points
11
Based on your RRRE replay,
my 33-line Javascript for left yaw changes with an IIR tc = 2 is equivalent to:
-5 * $prop('AccelerationSway').
Eliminating overhead from a CUSTOM EFFECT with 120 lines of Javascript is a win.

ShakeIt Bass Shakers has effects for ACCELERATION, DECELERATION, and LATERAL G-FORCE, which IMO:
  • saturation/clip too much, too often
  • lack seemingly useful details
Consequently, a new CUSTOM EFFECT simply generates properties
for absolute values of $prop('AccelerationSway') and $prop('AccelerationSurge')
to which a gamma of 3.0 is applied.
Its Input gain should be adjusted so that Live Effects rarely saturate.

This profile includes the threatened mix CUSTOM EFFECT
  • Consider editing each corner setting to comment out e.g. (unloaded) mix += $prop('ShakeITBSV3Plugin.Export.proxyS.RearRight');
  • If using mix, then probably disable other effect outputs and vice versa..
  • No effort was made to tune actual sounds, since tactile devices differ so much
  • separate, dedicated tactile devices for under and oversteer are recommended.
14 Aug 2021: I think there is a fundamental bug in formulae for "understeer, oversteer" custom effect. Rewriting and retesting is wanted...
Hello, I just wanted to let you know that I have downloaded your "NewLoaded4-chanWheelslipUndersteer" profile (found attached to the quoted post) and am very pleased with your work. I am also using four Dayton TT25 pucks: two under an office chair, and two attached to wooden board, which is fastened beneath my plastic pedal set. I primarily drive in Assetto Corsa.

I am technically-unskilled when it comes to programming/coding, so I was really pleased to stumble across your documentation for this project. I've been inspired to purchase these Dayton pucks after reading your many posts - both here and on Github - and am glad I did. Your work has added another dimension of immersion that I did not know I was missing! I've been able to consistently improve my laptimes by ~0.5 seconds, when I previously believed to have reached my limit.

I don't post reviews often, but I felt compelled to offer you my gratitude for successfully undertaking such an intelligent project. Words cannot begin to express the thrill I've experienced these past days. I'd like to wish you the best, and hope that you make a speedy return to driving!

Thank you :)
 
Last edited:

blekenbleu

Premium
Messages
1,025
Points
2,037
Words cannot begin to express
Thanks, I would not have begun without contributions from @Mr Latte and of course @Wotever.
Our dishwasher quit some days ago, and I was eventually able to get down on the floor
and troubleshoot its control board.
It has taken a couple of days for my back to recover from that,
but I may be able to focus enough to resume coding based on SimHub game recordings,
of which I encourage interested parties to volunteer, having only a quite limited set.

I suspect that games other than AC might require substantially different telemetry tuning
and contemplate documenting car and game-specific telemetry tuning,
which would be complementary to tactile layering and shaker DSP tuning
that depends on available exciter and shaker installations.

For the relatively limited tactile tuning appropriate for only exciters,
here is a technique for experimenting with them independently of actual telemetry:
In search of some way to simulate telemetry without driving in a sim game,
I stumbled into this workaround using SimHub and a joystick:
  • in SimHub, enable the Controllers input plugin
  • press some joystick or button box button
  • then, in SimHub Available properties, scroll to InputStatus
    • SimHub may not list InputStatus entries before a button is pressed
  • still in Available properties, search for joy
    • manipulate some joystick axis of interest to identify its corresponding property name, e.g. JoystickPlugin.SideWinder_Precision_2_Joystick_Slider0
  • back in ShakeIt Bass Shakers, create a custom effect, e.g.:
JavaScript:
var button = $prop('InputStatus.JoystickPlugin.SideWinder_Precision_2_Joystick_B07');
return button * (100 - $prop('JoystickPlugin.SideWinder_Precision_2_Joystick_Slider0')/655);

The button control is to avoid overheating a transducer by constant high power signal.
SimHub does not output for this effect unless e.g. Replay is active

Setting Minimum force 100 and Frequencies Based on Input,
tactile frequency will vary based on joystick axis setting while button is pressed.
View attachment 498225
Use Sound Output to cast this tone among channels.
 
Top