Got (base 10) numeric display working with log-domain (base 2) input (so that exponent is not limited by single precision floating point). I just need to finish up adding minus sign support for the exponent (it can go negative)...

Show thread

Made a as an fragment (function from (x, y, t) to colour).

Oriented box signed distance function from Inigo Quilez:
iquilezles.org/www/articles/di

Segments activated by a load of conditionals on each digit's value.

Digits found by repeated divmod 10 stuff, after multiplying by 10000 (sets maximum number of digits after the point).

Leading zeros stripped with a simple loop (that stops at the point). I have code to strip trailing zeros too, but changing values are seldom affected.

Anti-aliasing of the decimal point seems to be a bit off, looks a bit too blurry. Want to add an option to move it to the baseline too.

Currently there are controls for glyph size, point size, segment length, segment thickness, foreground and background colours.

Eventual aim is to port the number rendering to the zoom video assembler I've been working on, to display zoom depth. Will need some extra fiddling, as that needs to be in log-domain and expanded to scientific notation without overflow.

Need to add motion blur to the zoom assembler first, otherwise the least significant digits will be too stroboscopic.

Figured out how to do bidirectional communication with a subprocess using Win32 API. POSIX version still to do. Now I can pipe raw PPM image streams to FFmpeg and display the output logs in my program. Did some fiddly things too to stop a flood of status lines (in a terminal they are overwritten in place using carriage return without newline). Also made a simple Dear ImGui theme function, so my UI is red when recording, green when playing, and blue when idle.

Figured out how to fix in on with driver : simply enable the display - thought I'd tried it before, but maybe I was doing it wrong, or it didn't work properly in earlier versions (I was on Debian Buster/stable for a long while, now on Bullseye/testing).

I made a thing. Formula is Mandelbrot set modified to have power 2.005 instead of 2, coloured with additive blending of an orbit trap on the negative real axis (cycling between red, green, blue depending on iteration number).

The center point of the zoom is preperiodic point with preperiod 645 and period 12 (this fact was used to refine the coordinates to be more precise). Iteration count was 3000.

The zoom factor for the loop (both rotation and scaling) was found by overlaying two copies and fiddling with sliders until it lined up again.

Probably too much motion blur and not enough samples for anti-aliasing (256 per pixel), but it took almost 2 hours to render this 2 second thing...

KF-next render (hybrid formula), auto white balance in GNU IMP, downscaled 5x5

trying to get motivation back to work on code again, have hardly done anything since before holidays, and haven't even looked at KF code since June (iirc)

another variation, using the output as a new mask for another stage

Show thread

the boundary conditions also constrain it within the frame. can also add additional constraints, like the hole in this one. obvious next step is reading a mask from a bitmap graphic file instead of defining it with code.

Show thread

Part of the algorithm is solving the Laplace equation for electric field strength. I do this by repeatedly applying boundary conditions, blurring, and normalizing. Typically I do 16 or more iterations of this between each next point selection and plotting, because when doing only 2 the image looks weird. But I somehow like the effect, not sure how to control it better...

Show thread

added a horizontal shift when plotting each circle (think this one was 1x radius)

Show thread

tweaked some parameters and it went all weird - this one adds (alpha * (number of boundary pixels) ^ beta) new points each step, with alpha = 0.5 and beta = 0.25.

Show thread

something went bad in this one (power 10), don't know why the thicker vertical/horizontal lines are there... they're not there in the previous image with 1/2 the iterations, but the texture is not so full....

Show thread

./ts i.wav o.wav 

<complex.h>
<math.h>
<sndfile.h>
<fftw3.h>
C 2
F 65536
A 2048
J 1
O (A/4)
double w[A],a[A][C],b[A][C];double _Complex p[F],q[F],r[C][F],u[C][F],v[C][F];int main(int K,char**V){SF_INFO m={0};SNDFILE*f=sf_open(V[1],SFM_READ,&m);SF_INFO n={0,m.samplerate,m.channels,SF_FORMAT_WAV|SF_FORMAT_FLOAT,0,0};SNDFILE*g=sf_open(V[2],SFM_WRITE,&n);fftw_plan T=fftw_plan_dft_1d(F,p,q,FFTW_FORWARD,FFTW_PATIENT|FFTW_DESTROY_INPUT);fftw_plan S=fftw_plan_dft_1d(F,q,p,FFTW_BACKWARD,FFTW_PATIENT|FFTW_DESTROY_INPUT);for(int i=0;i<A;++i)w[i]=(0.5-0.5*cos(6.283185307179586*i/A))*8.2e-3;for(int c=0;c<C;++c)for(int i=0;i<F;++i){r[c][i]=0;u[c][i]=0;v[c][i]=1;}while(A==sf_readf_double(f,&a[0][0],A)){sf_seek(f,J-A,SEEK_CUR);for(int c=0;c<C;++c){for(int i=0;i<A;++i){if(i<A-O)b[i][c]=b[i+O][c];else b[i][c]=0;}for(int i=0;i<A;++i)p[i]=w[i]*a[i][c];for(int i=A;i<F;++i)p[i]=0;fftw_execute(T);for(int i=0;i<F;++i){r[c][i]=u[c][i];u[c][i]=q[i];double _Complex l0=u[c][i]/r[c][i];l0/=cabs(l0);double _Complex l=l0;for(int s=O/J;s>1;s>>=1)l*=l;v[c][i]*=l;v[c][i]/=cabs(v[c][i]);if(v[c][i]==0||!(v[c][i]==v[c][i])||isinf(cabs(v[c][i])))v[c][i]=1;q[i]=cabs(u[c][i])*v[c][i];}fftw_execute(S);for(int i=0;i<A;++i)b[i][c]+=w[i]*p[i];}sf_writef_double(g,&b[0][0],O);}return 0;}

Show more
post.lurk.org

Welcome to post.lurk.org, an instance for discussions around cultural freedom, experimental, new media art, net and computational culture, and things like that.