SafetyNet constantly posting error messages on Windows 7/10


#1

Hello Synths,

I am having this problem with Windows 7 Ultimate 64 bits SC 3.10.0. Every time I send a synth to the server this error message shows up in post window:

-> Synth('temp__0' : 1001)
CheckBadValues: normal found in Synth 1000, ID 0 (previous 110018 values were unknown)

When I hard kill the synth (ctrl + .) I always get this one:

Safety('localhost') is running, using 'safeClip'.
CheckBadValues: unknown found in Synth 1002, ID 0
CheckBadValues: unknown found in Synth 1002, ID 0

Everything is working perfectly, no sound issues, but when I run processes that calls constantly calls lots of synths I am having my post window fully polluted by these messages.

I’ve also testing it with SC 3.9.3 and the same thing is happening. What can be the problem?


#2

I was testing this in Windows 10 and just discovered that the problem is related to SafetyNet Quark.
When I uninstall it the problem is gone. But it really need to use this quark…
Does anyone know how to solve this?


#3

SafetyNet uses a ugen called CheckBadValues which prints to the post window if it encounters problematic floating-point values: nans, infinities, or subnormals/denormals.

however, unknown found and normal found are weird outputs that shouldn’t be happening. i think you’ve found a bug in CheckBadValues here. it likely has to do with Windows-specific preprocessor directives in the source code of this ugen.


#4

i’ve filed an issue at https://github.com/supercollider/supercollider/issues/4238

this looks like an easy fix for 3.10.1. thanks for reporting @ZeCraum!


#5

Thanks for supporting and fixing it!


#6

@nathan I am using 3.10.1 on windows 7 and everything was working fine, no CheckBadValues errors, but when I was trying to simulate some fuzz distortion effect pedals I got it again :weary::

(
{
a =5;
b = Buffer.read(s,  Platform.resourceDir +/+ "sounds/a11wlk01.wav");
x = PlayBuf.ar(1, b, BufRateScale.kr(b), loop: 1, doneAction: Done.freeSelf);
	y = (x/(abs(x))) * (1 - (exp( (a *(x**2))/abs(x) ))); 
	y = LeakDC.ar(y);
	((0.01 * y) + (0.01 * x))!2;
}.play;
)

-> Synth('temp__102' : 1278)
CheckBadValues: NaN found in Synth 1277, ID 0 (previous 226369 values were normal)
CheckBadValues: NaN found in Synth 1277, ID 0 (previous 226369 values were normal)
CheckBadValues: normal found in Synth 1277, ID 0 (previous 64 values were NaN)
CheckBadValues: normal found in Synth 1277, ID 0 (previous 64 values were NaN)

#7

@ZeCraum

That output is correct, because your code is producing NaNs. x/abs(x) will be NaN anytime x == 0, because dividing by zero produces NaN.


#8

brian is right – CheckBadValues is telling you something is wrong. try a Sanitize.ar.


#9

Thanks!

BTW, I was using x/abs(x) to implement the sign function sgn(x), but I after realizing the presence of the method .sign, I tried using it without sanitze.ar and the same warning was shown. Should .sign without sanitize.ar post this as well?


#10

There is another point: you should avoid to write Buffer.read inside the synthdef function.
It’s an asynchronous action. Might be that buffer values are asked for before filling.
In virtually all examples you’ll find it separated for good reason:

b = Buffer.read(s, Platform.resourceDir +/+ "sounds/a11wlk01.wav");

then (evaluated separately)

{ ... b ... }.play

even that is a bit sloppy style, passing the buffer as Function arg would be more clean, but with short examples it’s fine. At least I’d define the other variables y, a locally inside the Function.

To avoid a division by zero you could also write somthing like

... / max(thr, abs(x))

with a small positive threshold thr. But then again it might be that the result of the division is large, so you should limit it (most easily done with tanh, softclip or distort). And in addition a LeakDC makes sense as you can produce a continous offset with a series of very small values x.

And in general: fractions with small denominators in synthdefs are always dangerous soundwise !