experiments

Pixilang programming language
ainegil
Posts: 456
Joined: Thu Sep 22, 2022 11:37 pm

Re: experiments

Post by ainegil »

video made with the code from the vj thread, track is from 2022

martblek
Posts: 13
Joined: Fri Dec 09, 2016 9:42 pm

Re: experiments

Post by martblek »

I haven't been here in a while. Your experiments are great.
ainegil
Posts: 456
Joined: Thu Sep 22, 2022 11:37 pm

Re: experiments

Post by ainegil »

reused code from above, slightly altered.

Edited in KDEnlive, music made on MPC, sort of industrial music

ainegil
Posts: 456
Joined: Thu Sep 22, 2022 11:37 pm

Re: experiments

Post by ainegil »

very similar code, different track
ainegil
Posts: 456
Joined: Thu Sep 22, 2022 11:37 pm

Re: experiments

Post by ainegil »




code is based on the previous code, messy, hacked and not optimized, as usual.
I can clean it up if someone needs it here its just for testing or completeness.

There are tow different versions, which where composited in KDEnlive, in the following way:

Layer 2 copy - screen mode
Layer 2 - exclusion mode
Layer 1

"spokes": ( Layer 2)

Code: Select all

//

include "../../lib/mjpeg.pixi"
include "../../lib/gfx_primitives.pixi"

scr = get_screen()
resize( scr, 1280, 720)

$fps = 50
fps = $fps
maxframe = (5*60 + 21) * $fps
bpm = 117

preamp = dbtoa(0)// amplify audio for analysis, amplifies effect amount only, not the audio
bands = 40 //8 // number of ERB bands, max 40
erbbandmin = 1 // minimum band ERB scale 1...40
erbbandmax =40// 33// max band ERB scale 1...40

xsize = get_xsize(get_screen())
ysize = get_ysize(get_screen())

$framecounter= 0

$movie_len = maxframe/$fps //seconds
$audio_sample_type = INT16

wav = load( "/home/ga/Music/audio/20251106 3BC tachyphylaxis m14dB.wav")

gradbg = load("/home/ga/Documents/graphik/temp stills/bg_1b.png")
sample_rate_scale = 1

wav_ptr = 0
wav_size = get_size( wav ) //number of samples
wav_channels = wav.channels
wav_amp_max = 255 // 256
samplerate = wav.sample_rate
type = get_type( wav )
if type == INT16 { wav_amp_max = 1 << 15 }//{ wav_amp_max = 1 << 15 }
if type == INT32 { wav_amp_max = 1 << 30 }
if type == FLOAT32 { wav_amp_max = 1 }

$out = fopen( "saved_mjpeg  4.avi", "wb" )
if $out <= 0 { logf( "Can't open file\n" ) halt }
$encoder = mjpeg_encoder_open(
    $fps,
    xsize,
    ysize,
    75, //Quality
    2, //Audio channels
    44100, //Audio frames per second
    $audio_sample_type, //Audio sample type
    MJPEG_ENCODER_FLAG_USEINDEX | MJPEG_ENCODER_FLAG_HASSOUND, //Flags
    $out )
    
$audio_buf_size = mjpeg_encoder_get_audio_size( $encoder ) //Number of frames per audio chunk
$audio_buf = new( $audio_buf_size * wav_channels, 1, $audio_sample_type )
logf( "Audio buffer size: %d frames\n", $audio_buf_size )

$sine_phase = 0
$sine_delta = 1024 * 1

//----------------------------------------


set_pixel_size( 1 )
scr = get_screen()


matrix = new( 4, 4, FLOAT )
clean( matrix )
t_reset()
t_get_matrix( matrix )
matrix[ 2 * 4 + 3 ] = -0.006



gfx_init()

clear()
clean( prevframe)
set_zbuf( zbuffer)

while $framecounter< maxframe
{

//wav_ptr = wav_channels * $framecounter* samplerate / $fps
wav_ptr =  wav_channels * $framecounter * samplerate / $fps
anaudio()

copy( $audio_buf, wav, 0, wav_ptr,  $audio_buf_size * wav_channels, 1, 1 )
//op_cn( OP_DIV, $audio_buf, 2)
/*
    transp(255)
	clear( BLACK )
    pixi( prevframe, 0, 0)
*/


//spinangle = spinangle - 360 / (  96*4*3*4*(118/60)*50)
//spinangle = mod(spinangle, 360) +360

   // t_set_matrix( matrix )

//---

t_reset()
t_set_matrix( matrix )
t_translate( 0, 0, 0)




  transp(8)
 clear()

t_set_matrix( matrix )
t_translate( 0, 0, 1)

    transp(191)

pixi( prevframe, -0.5, -0.5, WHITE, 1,1)



    transp(40)
//pixi( gradbg , 0, 0, WHITE)
t_reset()

    vlow = 120.0
    vhigh = -120.0
    vav = 0
    prange = 72//120
    pstart = 24 //-6

clear_zbuf()

//zpulse = -esum * 0.03
zpulse = zpulse +  ( (esum * 0.01) - zpulse ) *0.2
zpos = 0 //zpos - 4*3*4*(118/60)/50
zpos = mod( zpos , 512.0 ) + 512

for( i = pstart; i < pstart+prange; i +1 ){
    f = pow( 1.059463094, i-69) * 440
    fi = 44100 / f
    sm1 = ftcepsr[ (fi div 1) - 1 ]
    s0 = ftcepsr[ fi div 1 ]
    s1 = ftcepsr[ (fi div 1) + 1 ]
    s2 = ftcepsr[ (fi div 1) + 2 ]
    frac = fi - ( fi div 1 )
    c = ( s1 - sm1 )*0.5
    u = s0 - s1
    w = c + u
    a = w + u + (s2 - s0 )*0.5
    bn = w + a
    ss = (((( a * frac ) - bn ) * frac + c ) * frac +  s0 )

compens = log2( hftsize - fi + 1 ) +1
compens = compens * ( (i -23)/ 18 )
   // v  = exp( 120 * ss  / compens )
v  = exp( 120 * ss  / compens )
    if( v < vlow){ vlow = v}
    if( v > vhigh){ vhigh = v}
    //vav = vav + v / prange
    vav = vav + v / prange
}



//clean( notesv )
op_cn(OP_MUL, notesv, 0.29)
for( i = pstart; i < pstart+prange; i +1 ){
    f = pow( 1.059463094, i-69) * 440
    fi = 44100 / f
    fift = f / ( 44100 / ftsize)
    sm1 = ftcepsr[ (fi div 1) - 1 ]
    s0 = ftcepsr[ fi div 1 ]
    s1 = ftcepsr[ (fi div 1) + 1 ]
    s2 = ftcepsr[ (fi div 1) + 2 ]
    frac = fi - ( fi div 1 )
    c = ( s1 - sm1 )*0.5
    u = s0 - s1
    w = c + u
    a = w + u + (s2 - s0 )*0.5
    bn = w + a
    ss = (((( a * frac ) - bn ) * frac + c ) * frac +  s0 )

compens = log2( hftsize - fi + 1 ) +1
compens = compens * ( (i +1) / 18 ) // /12
    v  =  exp( 120 * ss  / compens )


    vv = ( v - vav )
    vddb = atodb( v  ) - atodb( vav ) 
    if(vddb < 0){vddb = 0 }

    vdv = v - vlow // vlow
    dv = v - ftcepsv[ i ]

        ftcepsvacc[ i ] = v
        ftcepsvddb[ i ] = vddb

    ftcepsv[ i ] = v

notesv[ i % 12 ] = notesv[ i % 12 ] + vddb *0.71

vft = 0
maxh = floor( 22050 / f)
if( maxh > 4){ maxh = 4 }
for( j = 1; j < maxh; j+1){
    fij = j*f / ( 44100 / ftsize)
    ii = fij div 1
    sm1 = ftmag[ ii - 1 ]
    s0 = ftmag[ ii ]
    s1 = ftmag[ ii + 1 ]
    s2 = ftmag[ ii + 2 ]
    frac = fij - ii
    c = ( s1 - sm1 )*0.5
    u = s0 - s1
    w = c + u
    a = w + u + (s2 - s0 )*0.5
    bn = w + a
    ss = (((( a * frac ) - bn ) * frac + c ) * frac +  s0 )

    vft = vft +  ss
}
dbvft = atodb ( vft) 
dbvft = dbvft / 112
if( dbvft < 0){ dbvft = 0}

 // dbvft //
r= vddb * 200

/*
//col = hsvrgb(  360 * ( (i +3 ) % 12)/12,  vddb*0.7, 0.2  + vddb*0.7) 
col =  hsvrgb(  360 * ( (i +3 ) % 12)/12,  0.2*zpos/512 + pow(vddb, 1.5)*0.3, 0.5  + pow(vddb, 1.5)*0.5) 
col2 = hsvrgb(  360 * ( (i +3 ) % 12)/12, 0.2+ 0.2*zpos/512 + pow(vddb, 1.5)*0.3, 0.5  + pow(vddb, 1.5)*0.5) 


t_set_matrix( matrix )
//t_translate( 0, 0,  zpos -1024 )
t_translate( 0, 0,  zpos -1536 + vddb * 64)

transp(  255)
    isbkey = blackkeys[ i % 12 ]
    wl = 44100 /f
    ang1 = ( i % 12 )* 2*M_PI / 12 - spinangle

    px = cos( ang1 ) * (64 + ( i div 12)*128 )
    py = sin( ang1 ) * (64 + ( i div 12)*128 )


 //transp(  zpos/4)
transp( 255)
     fcircle( px, py, r, 72, col )
transp(  127)
      circle( px, py, r+2, 72, col )
//----------------------------------------------



t_reset()
*/
}
t_translate( 0, 0,  zpos -1536 + vddb * 64)

notemax = -1
notemaxv = -1
ang1 = 0
norm = op_cn( OP_SUM, notesv) + 0.000001
for( i = 0; i < 12; i +1 ){
    ang1 = ang1 + ( i  * 2*M_PI / 12 ) * notesv[ i ] *(1/12)/ norm
  if notesv[ i ] > notemaxv { 
        notemaxv = notesv[ i ]
        notemax = i
  }
}

ang2 =  notemax  * 2*M_PI / 12 + M_PI/2

ang1 = ang1 + ang2
ang1 = ang1 * 0.2

accel = accel + ( ( ang1 - spinangle ) *0.0003 )
accel = accel * 0.9
spinangle = spinangle + accel

colbgtint =  hsvrgb(  360 * ( (notemax +3 ) % 12)/12, 1,0.07) 
basecol =  hsvrgb(  360 * ( (notemax +3 ) % 12)/12, 1,0.9) 
norm = norm / 12

//op_cn( OP_ADD, notesv, norm/3)

basefreqnew = pow( 1.059463094, pstart + notemax - 69) * 440

basefreq = basefreq + ( basefreqnew - basefreq )*0.05
//steps = 256
//srange = ( 44100 / basefreq ) / 12
//sstretch =   srange/( 44100 / (fps*12) )

for( i = 0; i < 12; i +1 ){
    col1 =  hsvrgb(  360 * ( (i +3 ) % 12)/12,  0.5 + pow(notesv[ i  ], 1.5)*0.5, 0.5  + pow(notesv[ i  ], 1.5)) 
    col2 =  hsvrgb(  360 * ( (i +4 ) % 12)/12,  0.5 + pow(notesv[ (i+1)%12 ], 1.5)*0.5, 0.5  + pow(notesv[ (i+1)%12], 1.5)) 
    ang1 = ( i % 12 )* 2*M_PI / 12  - spinangle

    f = pow( 1.059463094, pstart + i - 69) * 440


steps = notesv[i] * 255
for( j = 0; j< steps; j +1 ){
    frac = j/steps
   

    alph =  abs( 2*frac - 1 ) 
    //alph = alph * 255

    srange = ( 44100 / f ) / 12
    sstretch =   srange/( 44100 / (fps*12) )

    idx = i * srange   + j // * sstretch// * srange
    sampv = (wav[ wav_ptr + idx * wav_channels ] + wav[ wav_ptr + idx * wav_channels +1] ) / 256 

    col = col1
    col = get_blend( col, WHITE, sampv)
    col = get_blend(col, basecol, abs(sampv))
    col = get_blend(col, basecol, 64 )


    ang2 = ang1 + M_PI/2
    //ring

    px = cos( ang1 ) * j  
    py = sin( ang1 ) * j  
    px2 = cos( ang2 ) * sampv * j/256 
    py2 = sin( ang2 ) * sampv * j/256

    transp(48)
    line( px, py, px+px2, py+py2, col)
    transp(255)
    line( pxold, pyold, px+px2, py+py2, col)
    if(j < steps-1){  pxold = px + px2 pyold = py + py2 }else{ pxold = 0 pyold = 0}


}




   

}
t_reset()
copy( prevframe, scr )
//copy(screenclone, scr)
// blur 1
conv_filter(
    screenclone,  //destination
    scr,  //source
    krnl_x2,  //kernel
//OPTIONAL PARAMETERS:
    23,  //divisor (dividing the result)
    0,  //offset (addition after division)
    CONV_FILTER_COLOR,  //flags (options)
   1, 1,  //kernel center XY (relative to the upper left corner)
    0, 0,  //destination XY
    0, 0,  //source XY
    xsize, ysize,
    1, 1  //XY pitch (step length)
)
transp(128)


conv_filter(
    scr,  //destination
    screenclone,  //source
    krnl_x2,  //kernel
//OPTIONAL PARAMETERS:
    23,  //divisor (dividing the result)
    0,  //offset (addition after division)
    CONV_FILTER_COLOR,  //flags (options)
   1, 1,  //kernel center XY (relative to the upper left corner)
    0, 0,  //destination XY
    0, 0,  //source XY
    xsize, ysize,
    1, 1  //XY pitch (step length)
)




//---
        

	t_reset()
    ts = ""
   // sprintf( ts, "%u x %u", WINDOW_XSIZE, WINDOW_YSIZE )
   // print( ts, -cx + cx div 30, -cy + cy div 30, WHITE, TOP | LEFT )
	//sprintf( ts, "FPS: %u", FPS )	
  //  print( ts, cx - cx div 30, -cy + cy div 30, WHITE, TOP | RIGHT )
   // frame()



    //Save:
    
    mjpeg_encoder_write_image( $encoder, scr )
    mjpeg_encoder_write_audio( $encoder, $audio_buf, 0, 0 )
    mjpeg_encoder_next_frame( $encoder )

    frame()

    $framecounter + 1
	
    while get_event() { 
		if EVT[ EVT_TYPE ] == EVT_QUIT { breakall } 
		if EVT[ EVT_TYPE ] == EVT_SCREENRESIZE {
			resize( scr, WINDOW_XSIZE, WINDOW_YSIZE)
			set_screen( scr )
			init_scn()
		} 		
	}
}

mjpeg_encoder_close( $encoder )
fclose( $out )	

//---------

fn gfx_init()
{
// initial and global  values
spinangle = 0
vlowsmoo =  1
zbuffer = new( xsize, ysize, INT32)
    prevframe = new( xsize, ysize, PIXEL)
clean(prevframe)

    bps = bpm / 60 
    bpf = bps / fps 

 	hxsize = xsize /2
	hysize = ysize /2
 	thrdxsize = xsize /3
	thrdysize = ysize /3
 	qxsize = xsize /4
	qysize = ysize /4
 	fxsize = xsize /5
	fysize = ysize /5
	preampdivwavmax = preamp / wav_amp_max  	
	ftsize = 4*4096// 4*8192 //4096
	ftbinf = wav.sample_rate/ftsize
	ftbinfrez = 1 / ftbinf
	hftsize = ftsize / 2
	ftbufr = new( ftsize, 1, FLOAT )
 	ftbufi = new( ftsize, 1, FLOAT )
 	ftmag = new( hftsize, 1, FLOAT )
 	ftmagsmoo = new( hftsize, 1, FLOAT )
    ftcepsr = new( hftsize, 1, FLOAT)
    ftcepsi = new( hftsize, 1, FLOAT)
    ftcepsv = new( hftsize, 1, FLOAT)
    ftcepsvddb = new( hftsize, 1, FLOAT)

notesv = new( 12, 1, FLOAT)
clean( notesv )
    numparticles = 1*8192
    particlec = new( numparticles, 1, PIXEL)
    particlex = new( numparticles, 1, FLOAT)
    particley = new( numparticles, 1, FLOAT)
    particlez = new( numparticles, 1, FLOAT)
    particles = new( numparticles, 1, FLOAT)
    particlev = new( numparticles, 1, FLOAT)
    particlefade = new( numparticles, 1, FLOAT)
    particlespeed = new( numparticles, 1, FLOAT)

	winlen =   2048//2* 4096 
    if( winlen > ftsize ){ winlen = ftsize }
	wintable = new( ftsize, 1, FLOAT )
    clean( wintable )
	$i = 0 while $i <= winlen{
	wintable[$i] = -cos(2*M_PI*$i/winlen)*0.5 + 0.5
	$i + 1
	}	
	wintablec = new( hftsize, 1, FLOAT )
    clean( wintablec )
	$i = 0 while $i < hftsize {
	wintablec[$i] =  -cos(2*M_PI*$i/hftsize)*0.5 + 0.5
	$i + 1
	}




krnl_blr = new(3,3, INT) // blur kernel
clean(krnl_blr,1)
krnl_blr[1] = 2
krnl_blr[3] = 2
krnl_blr[5] = 2
krnl_blr[7] = 2
krnl_blr[4] = 4

krnl_x = new(3,3, INT) // blur kernel
clean(krnl_x,1)
krnl_x[1] = 4
krnl_x[3] = 2
krnl_x[5] = 2
krnl_x[7] = 4
krnl_x[4] = 4

krnl_x2 = new(3,3, INT) // blur kernel
clean(krnl_x2,1)
krnl_x2[0] = 3
krnl_x2[1] = 2
krnl_x2[2] = 3
krnl_x2[3] = 2
krnl_x2[4] = 4
krnl_x2[5] = 2
krnl_x2[6] = 3
krnl_x2[7] = 2
krnl_x2[8] = 2



krnl_boxblr3 = new(3,3, INT) // blur kernel
clean(krnl_boxblr3,1)

	
	// ERB scale
	erbsize = bands * 2
	erbbuf = new( erbsize, 1, FLOAT)
	erbiftlookup = new( erbsize, 1, INT32)
	
	// ERB filter lookup
	//
	$size = erbsize
	$ERBmin = erbbandmin //1
	$ERBrange = erbbandmax -$ERBmin  //40 -$ERBmin

	$i = 0 while $i < erbsize
	{
	$erb = $ERBrange*$i/(erbsize) + $ERBmin
	$erbf = ($erb) * 0.046729
	$erbf = pow(10,$erbf) -1
	$erbf = $erbf * 228.833 

	erbiftlookup[$i] = ($erbf * ftbinfrez) div 1
	$i +1
	}
	
	// create weights
	ftweight = new( hftsize, 1, FLOAT )
	$i = 0 while $i < erbsize{
		$fromidx = erbiftlookup[$i ]
		$toidx = erbiftlookup[$i + 1 ] -1	
		$d = $toidx - $fromidx 
		$j = 0 while $j < $d{
			$ii = $fromidx +$j
			$w = $j / ($d -1)	
		ftweight[$ii] = $w
			$j = $j +1
		}
 	$i +1
 	}
	
	//----------
	
	// 256 lookup from spectrum
	lmap = new( 256, 1, FLOAT) 
	lmapsmoo = new( 1, 256, FLOAT) // smoothed version
	
	C_GREY = get_color(127,127,127) // neutral grey
	C_erb = WHITE
	
	pxl32 = new(3, 1, INT32)// working pixel 32 bit
	
offsety = offsetmax*9/16

histogramme = new(256,1,FLOAT)
eqtable = new(256,1,FLOAT)
deeqtable = new(256,1,FLOAT)

imgbuf = new(xsize,ysize)// frame
clean(imgbuf, RED)
screenclone = new(xsize,ysize)// screen copy
screenclone_copy = new(xsize,ysize)// screen copy 2
imgW = clone(imgbuf)
img_Y = clone(imgbuf)
img_Cb = clone(imgbuf)	
img_Cr = clone(imgbuf)
img_A = new(xsize,ysize, INT8)// alpha channel buffer
for($i =0; $i < get_size(img_A); $i +1){
	img_A[$i] = 255
}
set_alpha( imgW, img_A)
set_flags( imgW, GL_MIN_LINEAR | GL_MAG_LINEAR | GL_NICEST )

    blackkeys= new( 12, 1, INT)
    clean( blackkeys )
    blackkeys[1] = 1
    blackkeys[3] = 1
    blackkeys[6] = 1
    blackkeys[9] = 1
    blackkeys[10] = 1
}

fn anaudio(){

// FFT
	clean(ftbufi)
    clean(ftbufr)
    clean(ftmag)

    $p = wav_ptr
    
    esum = 0
    $i = 0 while $i < ftsize
    {
	if $i <=  winlen{
	ftbufi[ $i ] = 0
	ftbufr[ $i ] = (wav[ $p + $i * wav_channels ] + wav[ $p + $i * wav_channels +1] )* preampdivwavmax * wintable[$i] 
    esum = esum + ftbufr[ $i ]*ftbufr[ $i ]
	}else{
	ftbufi[ $i ] = 0
	ftbufr[ $i ] = 0
	}
	$i + 1
    }	
fft( 0, ftbufi,ftbufr,ftsize)

    $i = 0 while $i < hftsize
    {
    ftmag[ $i ] =  ftbufr[ $i ] * ftbufr[ $i ]   + ftbufi[ $i ] * ftbufi[ $i ] 
	ftcepsr[ $i ] = ftmag[ $i ] * wintablec[ $i ] +0.01
    ftmag[ $i ] = sqrt( ftmag[ $i ] )
    ftcepsr[ $i ] = log( sqrt( ftcepsr[ $i ] )   )//* wintablec[ $i ] +0.01)
    ftcepsi[ $i ] = 0
	$i + 1
    }

    fft( 1, ftcepsi,ftcepsr,hftsize)



	// map on ERB scale 
	// for color
	$erbgrav = 0
	$erbvmax = 0
	$erbsum = 0
	$i = 0 while $i < erbsize
	{
	erbbuf[$i]=0
	// pass 1 up
	$fromidx = erbiftlookup[$i ]
	$toidx = erbiftlookup[$i + 1 ] -1	
	$d = $toidx - $fromidx 
	$j = 0 while $j < $d
		{
		$ii = $fromidx + $j
		$v = sqrt(ftbufr[$ii]*ftbufr[$ii]+ftbufi[$ii]*ftbufi[$ii])
			erbbuf[$i] = erbbuf[$i] + $v * ftweight[$ii]		
		$j = $j +1 
		}
	erbbuf[$i] = erbbuf[$i] *80/$d
	// pass 2 down
	$fromidx = erbiftlookup[$i + 1 ]
	$toidx = erbiftlookup[$i +2 ] -1	
	$d = $toidx - $fromidx 
	$j = 0 while $j < $d
		{
		$ii = $fromidx + $j
		$v = sqrt(ftbufr[$ii]*ftbufr[$ii]+ftbufi[$ii]*ftbufi[$ii]) 
			erbbuf[$i] = erbbuf[$i] + $v * (1-ftweight[$ii])		
		$j = $j +1 
		}
	erbbuf[$i] = erbbuf[$i] *80/$d
	$erbsum = $erbsum + erbbuf[$i]
	$erbgrav = $erbgrav + erbbuf[$i] * ($i -erbsize/2)
	$i + 1
	}
	
	if $erbvmax > 1 { $erbvmax = 1 } 
	
	//------------------------------------------
	
	// create light lookup map
	lmapsum=0
	clipping = 0;
	$size = 256
	$i = 0 while $i < $size 
	{ 	
	$erbi = ($i * erbsize / $size ) 
	$frac = mod($erbi,1) 
	
	$erbi = $erbi div 1
	$v = erbbuf[$erbi] 
	if $erbi < $size -1 {
	$v2 = erbbuf[$erbi +1] 	
	$v = $v + ($v2 - $v) * $frac}
		
	//lmap[$i] = (atodb($v) +54 )/54 
	//lmap[$i] = (atodb($v) +30 )/30 
    lmap[$i] = (atodb($v) +24 )/24
 
	if lmap[$i] > lmapsmoo[0,$i] {
		lmapsmoo[0,$i] = lmap[$i]
	}else{ lmapsmoo[0,$i] = lmapsmoo[0,$i]*0.95}//96}
	
	if lmapsmoo[0,$i] > 1 { lmapsmoo[0,$i] = 1 clipping = 1}
	if lmapsmoo[0,$i] < 0 { lmapsmoo[0,$i] = 0}

	//lmapsmoo[$i] = lmapsmoo[$i] * lmapsmoo[$i]
	

 lmapsum = lmapsum + lmapsmoo[0,$i]/16

	$i + 1
	}	
ret(1)
}


fn atodb($a){
// converts amplitude to dB
	$db = 20*log10($a)
ret($db)
}
fn dbtoa($db){
// converts db to linear amplitude
	$a = pow(10,($db)*0.05)
ret($a)
}

fn hsvrgb($h,$s,$v){
// HSV to RGB
$h = $h % 360
$M = 255*$v
$m = $M*(1- $s)
$z = 255*($v*$s)*(1-abs(mod(($h/60.0),2)-1))
if $h < 60 {
$r = $M
$g = $z + $m
$b = $m
}else{
if $h < 120 {
$r = $z + $m
$g = $M 
$b = $m
}else{
if $h < 180 {
$r = $m 
$g = $M 
$b = $z + $m
}else{
if $h < 240 {
$r = $m 
$g = $z + $m
$b = $M 
}else{
if $h < 300 {
$r = $z + $m
$g = $m 
$b = $M 
}else{
$r = $M 
$g = $m 
$b = $z + $m
}}}}
}
ret(get_color($r ,$g ,$b ))
}

fn get_hist_red($img){
	clean(histogramme)
	$i = 0 
	$fac = 1/( get_size($img) )
	while $i < get_size($img){
	histogramme[get_red($img[$i])] = histogramme[get_red($img[$i])] + $fac
	$i + 1
	}
ret(1)
}

fn get_hist($img){
	clean(histogramme)
	$i = 0 
	$fac = 1/( get_size($img) )
	while $i < get_size($img){
	histogramme[($img[$i])] = histogramme[($img[$i])] + $fac
	$i + 1
	}
ret(1)
}


fn eq_red($img, $amount){
	get_hist_red($img)
	//clean(eqtable)
	copy(eqtable, histogramme)
	op_cn(OP_H_INTEGRAL, eqtable, 0)
	op_cn(OP_SMUL, eqtable, 255)
	$am1m = 1 - $amount
	for( $i=0; $i < get_size($img); $i + 1){
		$img[$i] = get_color( eqtable[get_red($img[$i])*$amount + get_red($img[$i])*$am1m] , 0, 0)
}
ret($img)
}

fn eq_onechannel($img, $amount){
	get_hist($img)
	//clean(eqtable)
	copy(eqtable, histogramme)
	op_cn(OP_H_INTEGRAL, eqtable, 0)
	op_cn(OP_SMUL, eqtable, 255)
	$am1m = 1 - $amount
	for( $i=0; $i < get_size($img); $i + 1){
		$img[$i] =  eqtable[($img[$i])*$amount + ($img[$i])*$am1m] 
}
ret($img)
}

fn get_eqtable($img){
	get_hist_red($img)
	copy(eqtable, histogramme)
	op_cn(OP_H_INTEGRAL, eqtable, 0)
	op_cn(OP_SMUL, eqtable, 255)
ret(1)
}

fn deeq_red($img, $amount){
	$am1m = 1 - $amount
	clean(deeqtable)
	//for ($i = 0; $i < 256;$i +1){ 
	//deeqtable[$i] =  $i
	//}
	for ($i = 0; $i < 256;$i +1){ 
	$ti = eqtable[$i]
	deeqtable[$ti] =  $i //+ ($i - $ti)
	}
	for ($i = 1; $i < 256;$i +1){ 
	if deeqtable[$i] == 0 {deeqtable[$i] = (deeqtable[$i-1] + 1) & 255}
	}

	for( $i=0; $i < get_size($img); $i + 1){
		$img[$i] = get_color( deeqtable[get_red($img[$i])*$amount + get_red($img[$i])*$am1m] , 0, 0)
}
ret($img)
}

and "splash":

Code: Select all

//

include "../../lib/mjpeg.pixi"
include "../../lib/gfx_primitives.pixi"

scr = get_screen()
resize( scr, 1280, 720)

$fps = 50
fps = $fps
maxframe = (5*60 + 21) * $fps
bpm = 119

preamp = dbtoa(0)// amplify audio for analysis, amplifies effect amount only, not the audio
bands = 40 //8 // number of ERB bands, max 40
erbbandmin = 1 // minimum band ERB scale 1...40
erbbandmax =40// 33// max band ERB scale 1...40

xsize = get_xsize(get_screen())
ysize = get_ysize(get_screen())

$framecounter= 0

$movie_len = maxframe/$fps //seconds
$audio_sample_type = INT16

wav = load( "/home/ga/Music/audio/20251106 3BC tachyphylaxis m14dB.wav")

gradbg = load("/home/ga/Documents/graphik/temp stills/bg_1b.png")
sample_rate_scale = 1

wav_ptr = 0
wav_size = get_size( wav ) //number of samples
wav_channels = wav.channels
wav_amp_max = 255 // 256
samplerate = wav.sample_rate
type = get_type( wav )
if type == INT16 { wav_amp_max = 1 << 15 }//{ wav_amp_max = 1 << 15 }
if type == INT32 { wav_amp_max = 1 << 30 }
if type == FLOAT32 { wav_amp_max = 1 }

$out = fopen( "saved_mjpeg purplepastures 2.avi", "wb" )
if $out <= 0 { logf( "Can't open file\n" ) halt }
$encoder = mjpeg_encoder_open(
    $fps,
    xsize,
    ysize,
    75, //Quality
    2, //Audio channels
    44100, //Audio frames per second
    $audio_sample_type, //Audio sample type
    MJPEG_ENCODER_FLAG_USEINDEX | MJPEG_ENCODER_FLAG_HASSOUND, //Flags
    $out )
    
$audio_buf_size = mjpeg_encoder_get_audio_size( $encoder ) //Number of frames per audio chunk
$audio_buf = new( $audio_buf_size * wav_channels, 1, $audio_sample_type )
logf( "Audio buffer size: %d frames\n", $audio_buf_size )

$sine_phase = 0
$sine_delta = 1024 * 1

//----------------------------------------


set_pixel_size( 1 )
scr = get_screen()


matrix = new( 4, 4, FLOAT )
clean( matrix )
t_reset()
t_get_matrix( matrix )
matrix[ 2 * 4 + 3 ] = -0.006



gfx_init()

clear()
clean( prevframe)
set_zbuf( zbuffer)

while $framecounter< maxframe
{

//wav_ptr = wav_channels * $framecounter* samplerate / $fps
wav_ptr =  wav_channels * $framecounter * samplerate / $fps
anaudio()

copy( $audio_buf, wav, 0, wav_ptr,  $audio_buf_size * wav_channels, 1, 1 )
//op_cn( OP_DIV, $audio_buf, 2)
/*
    transp(255)
	clear( BLACK )
    pixi( prevframe, 0, 0)
*/


//spinangle = spinangle - 360 / (  96*4*3*4*(118/60)*50)
//spinangle = mod(spinangle, 360) +360

   // t_set_matrix( matrix )

//---

t_reset()
t_set_matrix( matrix )
t_translate( 0, 0, 0)




    //transp(8)
	//
t_set_matrix( matrix )
t_translate( 0, 0, 1)

    transp(255)

pixi( prevframe, -0.5, -0.5, WHITE, 1,1)



    transp(40)
//pixi( gradbg , 0, 0, WHITE)
t_reset()

    vlow = 120.0
    vhigh = -120.0
    vav = 0
    prange = 72//120
    pstart = 24 //-6

clear_zbuf()

//zpulse = -esum * 0.03
zpulse = zpulse +  ( (esum * 0.01) - zpulse ) *0.2
zpos = 0 //zpos - 4*3*4*(118/60)/50
zpos = mod( zpos , 512.0 ) + 512

for( i = pstart; i < pstart+prange; i +1 ){
    f = pow( 1.059463094, i-69) * 440
    fi = 44100 / f
    sm1 = ftcepsr[ (fi div 1) - 1 ]
    s0 = ftcepsr[ fi div 1 ]
    s1 = ftcepsr[ (fi div 1) + 1 ]
    s2 = ftcepsr[ (fi div 1) + 2 ]
    frac = fi - ( fi div 1 )
    c = ( s1 - sm1 )*0.5
    u = s0 - s1
    w = c + u
    a = w + u + (s2 - s0 )*0.5
    bn = w + a
    ss = (((( a * frac ) - bn ) * frac + c ) * frac +  s0 )

compens = log2( hftsize - fi + 1 ) +1
compens = compens * ( (i -23)/ 18 )
   // v  = exp( 120 * ss  / compens )
v  = exp( 120 * ss  / compens )
    if( v < vlow){ vlow = v}
    if( v > vhigh){ vhigh = v}
    //vav = vav + v / prange
    vav = vav + v / prange
}



clean( notesv )
for( i = pstart; i < pstart+prange; i +1 ){
    f = pow( 1.059463094, i-69) * 440
    fi = 44100 / f
    fift = f / ( 44100 / ftsize)
    sm1 = ftcepsr[ (fi div 1) - 1 ]
    s0 = ftcepsr[ fi div 1 ]
    s1 = ftcepsr[ (fi div 1) + 1 ]
    s2 = ftcepsr[ (fi div 1) + 2 ]
    frac = fi - ( fi div 1 )
    c = ( s1 - sm1 )*0.5
    u = s0 - s1
    w = c + u
    a = w + u + (s2 - s0 )*0.5
    bn = w + a
    ss = (((( a * frac ) - bn ) * frac + c ) * frac +  s0 )

compens = log2( hftsize - fi + 1 ) +1
compens = compens * ( (i +1) / 18 ) // /12
    v  =  exp( 120 * ss  / compens )


    vv = ( v - vav )
    vddb = atodb( v  ) - atodb( vav ) 
    if(vddb < 0){vddb = 0 }

    vdv = v - vlow // vlow
    dv = v - ftcepsv[ i ]

        ftcepsvacc[ i ] = v
        ftcepsvddb[ i ] = vddb

    ftcepsv[ i ] = v

notesv[ i % 12 ] = notesv[ i % 12 ] + vddb

vft = 0
maxh = floor( 22050 / f)
if( maxh > 4){ maxh = 4 }
for( j = 1; j < maxh; j+1){
    fij = j*f / ( 44100 / ftsize)
    ii = fij div 1
    sm1 = ftmag[ ii - 1 ]
    s0 = ftmag[ ii ]
    s1 = ftmag[ ii + 1 ]
    s2 = ftmag[ ii + 2 ]
    frac = fij - ii
    c = ( s1 - sm1 )*0.5
    u = s0 - s1
    w = c + u
    a = w + u + (s2 - s0 )*0.5
    bn = w + a
    ss = (((( a * frac ) - bn ) * frac + c ) * frac +  s0 )

    vft = vft +  ss
}
dbvft = atodb ( vft) 
dbvft = dbvft / 112
if( dbvft < 0){ dbvft = 0}

 // dbvft //
r= vddb * 200

/*
//col = hsvrgb(  360 * ( (i +3 ) % 12)/12,  vddb*0.7, 0.2  + vddb*0.7) 
col =  hsvrgb(  360 * ( (i +3 ) % 12)/12,  0.2*zpos/512 + pow(vddb, 1.5)*0.3, 0.5  + pow(vddb, 1.5)*0.5) 
col2 = hsvrgb(  360 * ( (i +3 ) % 12)/12, 0.2+ 0.2*zpos/512 + pow(vddb, 1.5)*0.3, 0.5  + pow(vddb, 1.5)*0.5) 


t_set_matrix( matrix )
//t_translate( 0, 0,  zpos -1024 )
t_translate( 0, 0,  zpos -1536 + vddb * 64)

transp(  255)
    isbkey = blackkeys[ i % 12 ]
    wl = 44100 /f
    ang1 = ( i % 12 )* 2*M_PI / 12 - spinangle

    px = cos( ang1 ) * (64 + ( i div 12)*128 )
    py = sin( ang1 ) * (64 + ( i div 12)*128 )


 //transp(  zpos/4)
transp( 255)
     fcircle( px, py, r, 72, col )
transp(  127)
      circle( px, py, r+2, 72, col )
//----------------------------------------------



t_reset()
*/
}
t_translate( 0, 0,  zpos -1536 + vddb * 64)

notemax = -1
notemaxv = -1
ang1 = 0
norm = op_cn( OP_SUM, notesv) + 0.000001
for( i = 0; i < 12; i +1 ){
    ang1 = ang1 + ( i  * 2*M_PI / 12 ) * notesv[ i ] *(1/12)/ norm
  if notesv[ i ] > notemaxv { 
        notemaxv = notesv[ i ]
        notemax = i
  }
}

ang2 =  notemax  * 2*M_PI / 12 + M_PI/2

ang1 = ang1 + ang2
ang1 = ang1 * 0.2

accel = accel + ( ( ang1 - spinangle ) *0.01 )
accel = accel * 0.4
spinangle = spinangle + accel

colbgtint =  hsvrgb(  360 * ( (notemax +3 ) % 12)/12, 1,0.07) 
basecol =  hsvrgb(  360 * ( (notemax +3 ) % 12)/12, 1,0.9) 
norm = norm / 12

//op_cn( OP_ADD, notesv, norm/3)

basefreqnew = pow( 1.059463094, pstart + notemax - 69) * 440

basefreq = basefreq + ( basefreqnew - basefreq )*0.02
steps = 96
srange = ( 44100 / basefreq ) / 12
sstretch =  ( 44100 / fps ) / srange

for( i = 0; i < 12; i +1 ){
    col1 =  hsvrgb(  360 * ( (i +3 ) % 12)/12,  0.5 + pow(notesv[ i  ], 1.5)*0.5, 0.5  + pow(notesv[ i  ], 1.5)) 
    col2 =  hsvrgb(  360 * ( (i +4 ) % 12)/12,  0.5 + pow(notesv[ (i+1)%12 ], 1.5)*0.5, 0.5  + pow(notesv[ (i+1)%12], 1.5)) 
    ang1 = ( i % 12 )* 2*M_PI / 12  - spinangle

    pxm1 = cos( ang1 ) * ( notesv[ ( i +11) % 12 ]*191 )
    pym1 = sin( ang1 ) * ( notesv[ ( i +11) % 12 ]*191 )

    px0 = cos( ang1 ) * ( notesv[ ( i ) % 12 ]*191 )
    py0 = sin( ang1 ) * ( notesv[ ( i ) % 12 ]*191 )

    px1 = cos( ang1 ) * ( notesv[ ( i +1 ) % 12 ]*191 )
    py1 = sin( ang1 ) * ( notesv[ ( i +1 ) % 12 ]*191 )

    px2 = cos( ang1 ) * ( notesv[ ( i +2 ) % 12 ]*191 )
    py2 = sin( ang1 ) * ( notesv[ ( i +2 ) % 12 ]*191 )


for( j = 0; j< steps; j +1 ){
    frac = j/steps
    col = get_blend( col1, col2, frac * 255)

alph =  abs( 2*frac - 1 ) 
alph = alph * 255

idx = i * srange   + j * sstretch * srange
sampv = (wav[ wav_ptr + idx * wav_channels ] + wav[ wav_ptr + idx * wav_channels +1] ) / 128 

col = get_blend( col, WHITE, sampv)



 //(alph/4 + 191)

    sm1 = notesv[ ( i +11) % 12 ]
    s0 =  notesv[ ( i ) % 12 ]
    s1 =  notesv[ ( i +1 ) % 12 ]
    s2 =  notesv[ ( i +2 ) % 12 ]
   

    c = ( s1 - sm1 )*0.5
    u = s0 - s1
    w = c + u
    a = w + u + (s2 - s0 )*0.5
    bn = w + a
    ss = (((( a * frac ) - bn ) * frac + c ) * frac +  s0 )

    ss = ss + (  notesv[ ( i +1 ) % 12 ]* frac + notesv[ ( i  ) % 12 ] *(1-frac))
    ss = ss * 0.5

ang2 = ang1 + frac * M_PI/6

transp(255)
px = cos( ang2 ) * ( ss*300 +   sampv /4)
py = sin( ang2 ) * ( ss*300 +   sampv /4)
    dot( px, py, col)
//

transp(63)
px2 = px *0.87
py2 = py *0.87
   
line( px, py, px2, py2, col )

transp(224)
px = cos( ang2 ) * ( sampv + 128)
py = sin( ang2 ) *  ( sampv + 128)

 dot( px, py, basecol)
}




   

}
t_reset()

//copy(screenclone, scr)
// blur 1
conv_filter(
    screenclone,  //destination
    scr,  //source
    krnl_x2,  //kernel
//OPTIONAL PARAMETERS:
    23,  //divisor (dividing the result)
    0,  //offset (addition after division)
    CONV_FILTER_COLOR,  //flags (options)
   1, 1,  //kernel center XY (relative to the upper left corner)
    0, 0,  //destination XY
    0, 0,  //source XY
    xsize, ysize,
    1, 1  //XY pitch (step length)
)
transp(128)


conv_filter(
    scr,  //destination
    screenclone,  //source
    krnl_x2,  //kernel
//OPTIONAL PARAMETERS:
    23,  //divisor (dividing the result)
    0,  //offset (addition after division)
    CONV_FILTER_COLOR,  //flags (options)
   1, 1,  //kernel center XY (relative to the upper left corner)
    0, 0,  //destination XY
    0, 0,  //source XY
    xsize, ysize,
    1, 1  //XY pitch (step length)
)



copy( prevframe, scr )
//---
        

	t_reset()
    ts = ""
   // sprintf( ts, "%u x %u", WINDOW_XSIZE, WINDOW_YSIZE )
   // print( ts, -cx + cx div 30, -cy + cy div 30, WHITE, TOP | LEFT )
	//sprintf( ts, "FPS: %u", FPS )	
  //  print( ts, cx - cx div 30, -cy + cy div 30, WHITE, TOP | RIGHT )
   // frame()



    //Save:
    
    mjpeg_encoder_write_image( $encoder, scr )
    mjpeg_encoder_write_audio( $encoder, $audio_buf, 0, 0 )
    mjpeg_encoder_next_frame( $encoder )

    frame()

    $framecounter + 1
	
    while get_event() { 
		if EVT[ EVT_TYPE ] == EVT_QUIT { breakall } 
		if EVT[ EVT_TYPE ] == EVT_SCREENRESIZE {
			resize( scr, WINDOW_XSIZE, WINDOW_YSIZE)
			set_screen( scr )
			init_scn()
		} 		
	}
}

mjpeg_encoder_close( $encoder )
fclose( $out )	

//---------

fn gfx_init()
{
// initial and global  values
spinangle = 0
vlowsmoo =  1
zbuffer = new( xsize, ysize, INT32)
    prevframe = new( xsize, ysize, PIXEL)
clean(prevframe)

    bps = bpm / 60 
    bpf = bps / fps 

 	hxsize = xsize /2
	hysize = ysize /2
 	thrdxsize = xsize /3
	thrdysize = ysize /3
 	qxsize = xsize /4
	qysize = ysize /4
 	fxsize = xsize /5
	fysize = ysize /5
	preampdivwavmax = preamp / wav_amp_max  	
	ftsize = 4*4096// 4*8192 //4096
	ftbinf = wav.sample_rate/ftsize
	ftbinfrez = 1 / ftbinf
	hftsize = ftsize / 2
	ftbufr = new( ftsize, 1, FLOAT )
 	ftbufi = new( ftsize, 1, FLOAT )
 	ftmag = new( hftsize, 1, FLOAT )
 	ftmagsmoo = new( hftsize, 1, FLOAT )
    ftcepsr = new( hftsize, 1, FLOAT)
    ftcepsi = new( hftsize, 1, FLOAT)
    ftcepsv = new( hftsize, 1, FLOAT)
    ftcepsvddb = new( hftsize, 1, FLOAT)

notesv = new( 12, 1, FLOAT)

    numparticles = 1*8192
    particlec = new( numparticles, 1, PIXEL)
    particlex = new( numparticles, 1, FLOAT)
    particley = new( numparticles, 1, FLOAT)
    particlez = new( numparticles, 1, FLOAT)
    particles = new( numparticles, 1, FLOAT)
    particlev = new( numparticles, 1, FLOAT)
    particlefade = new( numparticles, 1, FLOAT)
    particlespeed = new( numparticles, 1, FLOAT)

	winlen =   2048//2* 4096 
    if( winlen > ftsize ){ winlen = ftsize }
	wintable = new( ftsize, 1, FLOAT )
    clean( wintable )
	$i = 0 while $i <= winlen{
	wintable[$i] = -cos(2*M_PI*$i/winlen)*0.5 + 0.5
	$i + 1
	}	
	wintablec = new( hftsize, 1, FLOAT )
    clean( wintablec )
	$i = 0 while $i < hftsize {
	wintablec[$i] =  -cos(2*M_PI*$i/hftsize)*0.5 + 0.5
	$i + 1
	}




krnl_blr = new(3,3, INT) // blur kernel
clean(krnl_blr,1)
krnl_blr[1] = 2
krnl_blr[3] = 2
krnl_blr[5] = 2
krnl_blr[7] = 2
krnl_blr[4] = 4

krnl_x = new(3,3, INT) // blur kernel
clean(krnl_x,1)
krnl_x[1] = 4
krnl_x[3] = 2
krnl_x[5] = 2
krnl_x[7] = 4
krnl_x[4] = 4

krnl_x2 = new(3,3, INT) // blur kernel
clean(krnl_x2,1)
krnl_x2[0] = 3
krnl_x2[1] = 2
krnl_x2[2] = 3
krnl_x2[3] = 2
krnl_x2[4] = 4
krnl_x2[5] = 2
krnl_x2[6] = 3
krnl_x2[7] = 2
krnl_x2[8] = 2



krnl_boxblr3 = new(3,3, INT) // blur kernel
clean(krnl_boxblr3,1)

	
	// ERB scale
	erbsize = bands * 2
	erbbuf = new( erbsize, 1, FLOAT)
	erbiftlookup = new( erbsize, 1, INT32)
	
	// ERB filter lookup
	//
	$size = erbsize
	$ERBmin = erbbandmin //1
	$ERBrange = erbbandmax -$ERBmin  //40 -$ERBmin

	$i = 0 while $i < erbsize
	{
	$erb = $ERBrange*$i/(erbsize) + $ERBmin
	$erbf = ($erb) * 0.046729
	$erbf = pow(10,$erbf) -1
	$erbf = $erbf * 228.833 

	erbiftlookup[$i] = ($erbf * ftbinfrez) div 1
	$i +1
	}
	
	// create weights
	ftweight = new( hftsize, 1, FLOAT )
	$i = 0 while $i < erbsize{
		$fromidx = erbiftlookup[$i ]
		$toidx = erbiftlookup[$i + 1 ] -1	
		$d = $toidx - $fromidx 
		$j = 0 while $j < $d{
			$ii = $fromidx +$j
			$w = $j / ($d -1)	
		ftweight[$ii] = $w
			$j = $j +1
		}
 	$i +1
 	}
	
	//----------
	
	// 256 lookup from spectrum
	lmap = new( 256, 1, FLOAT) 
	lmapsmoo = new( 1, 256, FLOAT) // smoothed version
	
	C_GREY = get_color(127,127,127) // neutral grey
	C_erb = WHITE
	
	pxl32 = new(3, 1, INT32)// working pixel 32 bit
	
offsety = offsetmax*9/16

histogramme = new(256,1,FLOAT)
eqtable = new(256,1,FLOAT)
deeqtable = new(256,1,FLOAT)

imgbuf = new(xsize,ysize)// frame
clean(imgbuf, RED)
screenclone = new(xsize,ysize)// screen copy
screenclone_copy = new(xsize,ysize)// screen copy 2
imgW = clone(imgbuf)
img_Y = clone(imgbuf)
img_Cb = clone(imgbuf)	
img_Cr = clone(imgbuf)
img_A = new(xsize,ysize, INT8)// alpha channel buffer
for($i =0; $i < get_size(img_A); $i +1){
	img_A[$i] = 255
}
set_alpha( imgW, img_A)
set_flags( imgW, GL_MIN_LINEAR | GL_MAG_LINEAR | GL_NICEST )

    blackkeys= new( 12, 1, INT)
    clean( blackkeys )
    blackkeys[1] = 1
    blackkeys[3] = 1
    blackkeys[6] = 1
    blackkeys[9] = 1
    blackkeys[10] = 1
}

fn anaudio(){

// FFT
	clean(ftbufi)
    clean(ftbufr)
    clean(ftmag)

    $p = wav_ptr
    
    esum = 0
    $i = 0 while $i < ftsize
    {
	if $i <=  winlen{
	ftbufi[ $i ] = 0
	ftbufr[ $i ] = (wav[ $p + $i * wav_channels ] + wav[ $p + $i * wav_channels +1] )* preampdivwavmax * wintable[$i] 
    esum = esum + ftbufr[ $i ]*ftbufr[ $i ]
	}else{
	ftbufi[ $i ] = 0
	ftbufr[ $i ] = 0
	}
	$i + 1
    }	
fft( 0, ftbufi,ftbufr,ftsize)

    $i = 0 while $i < hftsize
    {
    ftmag[ $i ] =  ftbufr[ $i ] * ftbufr[ $i ]   + ftbufi[ $i ] * ftbufi[ $i ] 
	ftcepsr[ $i ] = ftmag[ $i ] * wintablec[ $i ] +0.01
    ftmag[ $i ] = sqrt( ftmag[ $i ] )
    ftcepsr[ $i ] = log( sqrt( ftcepsr[ $i ] )   )//* wintablec[ $i ] +0.01)
    ftcepsi[ $i ] = 0
	$i + 1
    }

    fft( 1, ftcepsi,ftcepsr,hftsize)



	// map on ERB scale 
	// for color
	$erbgrav = 0
	$erbvmax = 0
	$erbsum = 0
	$i = 0 while $i < erbsize
	{
	erbbuf[$i]=0
	// pass 1 up
	$fromidx = erbiftlookup[$i ]
	$toidx = erbiftlookup[$i + 1 ] -1	
	$d = $toidx - $fromidx 
	$j = 0 while $j < $d
		{
		$ii = $fromidx + $j
		$v = sqrt(ftbufr[$ii]*ftbufr[$ii]+ftbufi[$ii]*ftbufi[$ii])
			erbbuf[$i] = erbbuf[$i] + $v * ftweight[$ii]		
		$j = $j +1 
		}
	erbbuf[$i] = erbbuf[$i] *80/$d
	// pass 2 down
	$fromidx = erbiftlookup[$i + 1 ]
	$toidx = erbiftlookup[$i +2 ] -1	
	$d = $toidx - $fromidx 
	$j = 0 while $j < $d
		{
		$ii = $fromidx + $j
		$v = sqrt(ftbufr[$ii]*ftbufr[$ii]+ftbufi[$ii]*ftbufi[$ii]) 
			erbbuf[$i] = erbbuf[$i] + $v * (1-ftweight[$ii])		
		$j = $j +1 
		}
	erbbuf[$i] = erbbuf[$i] *80/$d
	$erbsum = $erbsum + erbbuf[$i]
	$erbgrav = $erbgrav + erbbuf[$i] * ($i -erbsize/2)
	$i + 1
	}
	
	if $erbvmax > 1 { $erbvmax = 1 } 
	
	//------------------------------------------
	
	// create light lookup map
	lmapsum=0
	clipping = 0;
	$size = 256
	$i = 0 while $i < $size 
	{ 	
	$erbi = ($i * erbsize / $size ) 
	$frac = mod($erbi,1) 
	
	$erbi = $erbi div 1
	$v = erbbuf[$erbi] 
	if $erbi < $size -1 {
	$v2 = erbbuf[$erbi +1] 	
	$v = $v + ($v2 - $v) * $frac}
		
	//lmap[$i] = (atodb($v) +54 )/54 
	//lmap[$i] = (atodb($v) +30 )/30 
    lmap[$i] = (atodb($v) +24 )/24
 
	if lmap[$i] > lmapsmoo[0,$i] {
		lmapsmoo[0,$i] = lmap[$i]
	}else{ lmapsmoo[0,$i] = lmapsmoo[0,$i]*0.95}//96}
	
	if lmapsmoo[0,$i] > 1 { lmapsmoo[0,$i] = 1 clipping = 1}
	if lmapsmoo[0,$i] < 0 { lmapsmoo[0,$i] = 0}

	//lmapsmoo[$i] = lmapsmoo[$i] * lmapsmoo[$i]
	

 lmapsum = lmapsum + lmapsmoo[0,$i]/16

	$i + 1
	}	
ret(1)
}


fn atodb($a){
// converts amplitude to dB
	$db = 20*log10($a)
ret($db)
}
fn dbtoa($db){
// converts db to linear amplitude
	$a = pow(10,($db)*0.05)
ret($a)
}

fn hsvrgb($h,$s,$v){
// HSV to RGB
$h = $h % 360
$M = 255*$v
$m = $M*(1- $s)
$z = 255*($v*$s)*(1-abs(mod(($h/60.0),2)-1))
if $h < 60 {
$r = $M
$g = $z + $m
$b = $m
}else{
if $h < 120 {
$r = $z + $m
$g = $M 
$b = $m
}else{
if $h < 180 {
$r = $m 
$g = $M 
$b = $z + $m
}else{
if $h < 240 {
$r = $m 
$g = $z + $m
$b = $M 
}else{
if $h < 300 {
$r = $z + $m
$g = $m 
$b = $M 
}else{
$r = $M 
$g = $m 
$b = $z + $m
}}}}
}
ret(get_color($r ,$g ,$b ))
}

fn get_hist_red($img){
	clean(histogramme)
	$i = 0 
	$fac = 1/( get_size($img) )
	while $i < get_size($img){
	histogramme[get_red($img[$i])] = histogramme[get_red($img[$i])] + $fac
	$i + 1
	}
ret(1)
}

fn get_hist($img){
	clean(histogramme)
	$i = 0 
	$fac = 1/( get_size($img) )
	while $i < get_size($img){
	histogramme[($img[$i])] = histogramme[($img[$i])] + $fac
	$i + 1
	}
ret(1)
}


fn eq_red($img, $amount){
	get_hist_red($img)
	//clean(eqtable)
	copy(eqtable, histogramme)
	op_cn(OP_H_INTEGRAL, eqtable, 0)
	op_cn(OP_SMUL, eqtable, 255)
	$am1m = 1 - $amount
	for( $i=0; $i < get_size($img); $i + 1){
		$img[$i] = get_color( eqtable[get_red($img[$i])*$amount + get_red($img[$i])*$am1m] , 0, 0)
}
ret($img)
}

fn eq_onechannel($img, $amount){
	get_hist($img)
	//clean(eqtable)
	copy(eqtable, histogramme)
	op_cn(OP_H_INTEGRAL, eqtable, 0)
	op_cn(OP_SMUL, eqtable, 255)
	$am1m = 1 - $amount
	for( $i=0; $i < get_size($img); $i + 1){
		$img[$i] =  eqtable[($img[$i])*$amount + ($img[$i])*$am1m] 
}
ret($img)
}

fn get_eqtable($img){
	get_hist_red($img)
	copy(eqtable, histogramme)
	op_cn(OP_H_INTEGRAL, eqtable, 0)
	op_cn(OP_SMUL, eqtable, 255)
ret(1)
}

fn deeq_red($img, $amount){
	$am1m = 1 - $amount
	clean(deeqtable)
	//for ($i = 0; $i < 256;$i +1){ 
	//deeqtable[$i] =  $i
	//}
	for ($i = 0; $i < 256;$i +1){ 
	$ti = eqtable[$i]
	deeqtable[$ti] =  $i //+ ($i - $ti)
	}
	for ($i = 1; $i < 256;$i +1){ 
	if deeqtable[$i] == 0 {deeqtable[$i] = (deeqtable[$i-1] + 1) & 255}
	}

	for( $i=0; $i < get_size($img); $i + 1){
		$img[$i] = get_color( deeqtable[get_red($img[$i])*$amount + get_red($img[$i])*$am1m] , 0, 0)
}
ret($img)
}



Music was made on MPC One
ainegil
Posts: 456
Joined: Thu Sep 22, 2022 11:37 pm

Re: experiments

Post by ainegil »

basically the same code, rendered two times, one time with the audio track reversed,
and the video output reversed again, and both versions layered with "grain extract" blending mode,
contrast added by a duplicate layer using color distance from grey.


ainegil
Posts: 456
Joined: Thu Sep 22, 2022 11:37 pm

Re: experiments

Post by ainegil »

Nearly identical code and compositing, different version of the track with piano & strings sound only

ainegil
Posts: 456
Joined: Thu Sep 22, 2022 11:37 pm

Re: experiments

Post by ainegil »

Pretty much the same code as 5 posts above, but with the dots replaced with numbers.
The lines and the numbers were rendered sperately, with different z-depth, since otherwise the numbers got too small, and then composited afterwards.
( voice on this track is artificial, rendered in openUtau with DiffSinger ).
ainegil
Posts: 456
Joined: Thu Sep 22, 2022 11:37 pm

Re: experiments

Post by ainegil »

I have scheduled a video on YT for tomorrow, 6 am GMT+1 :



( note the video is not available before this date )


interlude 960540.jpg
interlude 960540.jpg (61 KiB) Viewed 3321 times
code will be published after the premiere, its quite nice, uses cepstrum to find three main tones and calcualtes angles, curvature and colors from these.
Code is pretty messy (gain) though, cuase it was a work in progress and I didnt have a reason to clean it up.
Its antialiased by using a double sized canvas.

EDIT:

Code: Select all

//
include "ffmpeg_video_export.pixi"  
//include "../../lib/mjpeg.pixi"
include "../../lib/gfx_primitives.pixi"

scr = get_screen()
resize( scr, 1280, 720)

xsize = get_xsize(get_screen())
ysize = get_ysize(get_screen())


//INPUT_FILE = "/home/ga/Videos/test_.mp4"
OUTPUT_FILE = "/home/ga/Videos/video_out.mkv" 
OUTPUT_BITRATE = 15000
$fps = 50
fps = $fps
maxframe =  (3*60 + 39) * $fps
bpm = 75


AUDIO_FILE =  "audio_for_video.wav" // Audio track for video

wav = load( "audio_for_visuals_analysis.wav") // Audio input for visuals

video_export = -1
if OUTPUT_FILE > 0
{
    video_export = ffmpeg_video_export_open( OUTPUT_FILE, xsize, ysize, fps, OUTPUT_BITRATE, maxframe, AUDIO_FILE )

}



preamp = dbtoa(0)// amplify audio for analysis, amplifies effect amount only, not the audio
bands = 40 //8 // number of ERB bands, max 40
erbbandmin = 1 // minimum band ERB scale 1...40
erbbandmax =40// 33// max band ERB scale 1...40



$framecounter= 0

//$movie_len = maxframe/$fps //seconds
//$audio_sample_type = INT16




sample_rate_scale = 1

wav_ptr = 0
wav_size = get_size( wav ) //number of samples
wav_channels = wav.channels
wav_amp_max = 255 // 256
samplerate = wav.sample_rate
type = get_type( wav )
if type == INT16 { wav_amp_max = 1 << 15 }//{ wav_amp_max = 1 << 15 }
if type == INT32 { wav_amp_max = 1 << 30 }
if type == FLOAT32 { wav_amp_max = 1 }


/*
$out = fopen( "saved_mjpeg interlude slow 80.avi", "wb" )
if $out <= 0 { logf( "Can't open file\n" ) halt }
$encoder = mjpeg_encoder_open(
    $fps,
    xsize,
    ysize,
    80, //Quality, 75
    2, //Audio channels
    44100, //Audio frames per second
    $audio_sample_type, //Audio sample type
    MJPEG_ENCODER_FLAG_USEINDEX | MJPEG_ENCODER_FLAG_HASSOUND, //Flags
    $out )

$audio_buf_size = mjpeg_encoder_get_audio_size( $encoder ) //Number of frames per audio chunk
$audio_buf = new( $audio_buf_size * wav_channels, 1, $audio_sample_type )
logf( "Audio buffer size: %d frames\n", $audio_buf_size )
   */ 


//----------------------------------------



scr = get_screen()


matrix = new( 4, 4, FLOAT )
clean( matrix )
t_reset()
t_get_matrix( matrix )
matrix[ 2 * 4 + 3 ] = 0.003 // - 0.006



gfx_init()

clear()
clean( prevframe)

    video_export = -1
    if OUTPUT_FILE > 0
    {
        video_export = ffmpeg_video_export_open( OUTPUT_FILE, xsize, ysize, 50, OUTPUT_BITRATE, AUDIO_FILE )
    }


while $framecounter< maxframe
{

//wav_ptr = wav_channels * $framecounter* samplerate / $fps
wav_ptr =  wav_channels * $framecounter * samplerate div $fps
anaudio()

//copy( $audio_buf, wav, 0, wav_ptr,  $audio_buf_size * wav_channels, 1, 1 )

//spinangle = spinangle + 360 / (  1*4*3*4*(bpm/60)*fps)
//spinangle = mod(spinangle, 360) 
//op_cn( OP_DIV, $audio_buf, 2)
/*
    transp(255)
	clear( BLACK )
    pixi( prevframe, 0, 0)
*/


   // t_set_matrix( matrix )

//---
set_screen( canvas)
set_zbuf( zbuffer)
set_pixel_size(4)
   transp(1)
   clear()
    clear_zbuf()





    vlow = 120.0
    vhigh = -120.0
    vav = 0
    prange = 96//120
    pstart = 24 //-6

zpos = 32




imaxold = imax
imax = -1
imax2 = -1
imax3 = -1
vimaxold = vimax
vimax = -300

for( i = pstart; i < pstart+prange; i +1 ){
    f = pow( 1.059463094, i-69) * 440
    fi = 44100 / f
    sm1 = ftcepsr[ (fi div 1) - 1 ]
    s0 = ftcepsr[ fi div 1 ]
    s1 = ftcepsr[ (fi div 1) + 1 ]
    s2 = ftcepsr[ (fi div 1) + 2 ]
    frac = fi - ( fi div 1 )
    c = ( s1 - sm1 )*0.5
    u = s0 - s1
    w = c + u
    a = w + u + (s2 - s0 )*0.5
    bn = w + a
    ss = (((( a * frac ) - bn ) * frac + c ) * frac +  s0 )

compens = log2( hftsize - fi + 1 ) +1
compens = compens * ( (i -23)/ 18 )
   // v  = exp( 120 * ss  / compens )
v  = exp( 120 * ss  / compens )
    if( v < vlow){ vlow = v}
    if( v > vhigh){ vhigh = v}
    //vav = vav + v / prange
    vav = vav + v / prange

    if( v > vimax ){
        vimax = v
        imax3 = imax2
        imax2 = imax
        imax = i 

    }
}



colall = BLACK


for( i = pstart; i < pstart+prange; i +1 ){
    f = pow( 1.059463094, i-69) * 440
    fi = 44100 / f
    fift = f / ( 44100 / ftsize)
    sm1 = ftcepsr[ (fi div 1) - 1 ]
    s0 = ftcepsr[ fi div 1 ]
    s1 = ftcepsr[ (fi div 1) + 1 ]
    s2 = ftcepsr[ (fi div 1) + 2 ]
    frac = fi - ( fi div 1 )
    c = ( s1 - sm1 )*0.5
    u = s0 - s1
    w = c + u
    a = w + u + (s2 - s0 )*0.5
    bn = w + a
    ss = (((( a * frac ) - bn ) * frac + c ) * frac +  s0 )

compens = log2( hftsize - fi + 1 ) +1
compens = compens * ( (i +1) / 18 ) // /12
    v  =  exp( 120 * ss  / compens )


    vv = ( v - vav )
    vddb = atodb( v  ) - atodb( vav ) 

    vdv = v - vlow // vlow
    dv = v - ftcepsv[ i ]



    ftcepsv[ i ] = v

vft = 0
maxh = floor( 22050 / f)
for( j = 1; j < maxh/8; j+1){
    fij = j*f / ( 44100 / ftsize)
    ii = fij div 1
    sm1 = ftmag[ ii - 1 ]
    s0 = ftmag[ ii ]
    s1 = ftmag[ ii + 1 ]
    s2 = ftmag[ ii + 2 ]
    frac = fij - ii
    c = ( s1 - sm1 )*0.5
    u = s0 - s1
    w = c + u
    a = w + u + (s2 - s0 )*0.5
    bn = w + a
    ss = (((( a * frac ) - bn ) * frac + c ) * frac +  s0 )

    vft = vft +  ss
}
dbvft = atodb ( vft) //+ 36
if( dbvft < 0){ dbvft = 0}

 // dbvft //

//r1 = vddb * 1280/2048 
r1 = dbvft * 960/2048 
//if( r1 < 0){ r1 = 0 }

//r1 = r1 + 1280/2048 

//col = hsvrgb(  360 * ( (i +3 ) % 12)/12,  vddb*0.7, 0.2  + vddb*0.7) 
col = hsvrgb(  360 * ( (i +3 ) % 12)/12,   pow(vddb, 1.5)*0.3, 0.05  + pow(vddb, 1.5)*0.5) 



    isbkey = blackkeys[ i % 12 ]
    wl = 44100 /f
    ang1 = ( i  % 12 ) * 2* M_PI/(4*50) - 6 * 2 * M_PI /(4*50)

    px = sin( ang1 ) * r1
    py = -cos( ang1 ) * r1





    if( i == imax ){



        histlist[ 0, histlistptr] = px
        histlist[ 1, histlistptr] = py
        histlist[ 2, histlistptr] = r1
            angprev = histlist[ 3, ( histlistptr  + numparticles - 1) % numparticles] 
        histlist[ 3, histlistptr] =    ang1 
       
        colorlist[ 0, histlistptr] = col
        

    }
        
    if( i == imax2 ){
        histlist[ 4, histlistptr] = px
        histlist[ 5, histlistptr] = py
        histlist[ 6, histlistptr] = r1 * 0.618
           angprev2 = histlist[ 7, ( histlistptr  + numparticles - 1) % numparticles] 
        histlist[ 7, histlistptr] = ang1 + histlist[ 3, histlistptr] 
       
        colorlist[ 1, histlistptr] = col

    }

    if( i == imax3 ){
        histlist[ 8, histlistptr] = px
        histlist[ 9, histlistptr] = py
        histlist[ 10, histlistptr] = r1 * 0.382
           angprev2 = histlist[ 7, ( histlistptr  + numparticles - 1) % numparticles] 
        histlist[ 11, histlistptr] = ang1 + histlist[ 7, histlistptr]
       
        colorlist[ 2, histlistptr] = col

    }

//----------------------------------------------
}
histlist[ 3, histlistptr] = angprev   + ( histlist[ 3, histlistptr] - angprev )*0.06125
histlist[ 7, histlistptr] = angprev2   + ( histlist[ 7, histlistptr] - angprev2 )*0.06125
histlist[ 11, histlistptr] = angprev3   + ( histlist[ 11, histlistptr] - angprev2 )*0.06125 

pxold = 0 
pyold = 0
pxold2 = 0 
pyold2 = 0
pxold3 = 0 
pyold3 = 0
angold = 0
angold2 = 0
angold3 = 0
grow = pow(0.61803399, 1/24)// 1.001
grow2 = pow(0.61803399, 1/36)// 1.001
grow3 = pow(0.61803399, 1/48)// 1.001



// max arm:
for( i = 0; i < numparticles; i +1 ){ 


    fraci = i / numparticles
    idx = (histlistptr + numparticles - i) % numparticles



    ang1 = histlist[ 3, idx ] + angold 
    ang2 = histlist[ 7, idx ] + angold2 
    ang3 = histlist[ 11, idx ] + angold3 
   
    px = cos( ang1 ) * histlist[ 2, idx ] + pxold
    py = sin( ang1 ) * histlist[ 2, idx ] + pyold

    px2 = cos( ang2 ) * histlist[ 6, idx ] + pxold2
    py2 = sin( ang2 ) * histlist[ 6, idx ] + pyold2

    px3 = cos( ang3 ) * histlist[ 10, idx ] + pxold3
    py3 = sin( ang3 ) * histlist[ 10, idx ] + pyold3

        col = get_blend( colorlist[ 0, histlistptr], colorlist[ 0, idx], 157)
        colb = get_blend( colorlist[ 0, histlistptr], colorlist[ 0, ( idx +1 ) % numparticles], 157)

        steps = histlist[ 2, idx ] * 31
        for( j = 0; j < steps; j + 1) {
            frac = j/steps
            
            
t_set_matrix( matrix )
t_translate( 0, 0, zpos)
            col2 = get_blend( col, colb, frac * 255)
transp( 255 - 255 * fraci )

            dot3d( pxold + cos( ang1 ) * histlist[ 2, idx ] * frac , pyold + sin( ang1 ) * histlist[ 2, idx ] * frac , 0, col2)
            dot3d( -pxold - cos( ang1 ) * histlist[ 2, idx ] * frac , -pyold - sin( ang1 ) * histlist[ 2, idx ] * frac , 0, col2)

            t_reset()

        }

        col = get_blend( colorlist[ 1, histlistptr], colorlist[ 1, idx], 157)
        colb = get_blend( colorlist[ 1, histlistptr], colorlist[ 1, ( idx +1 ) % numparticles], 157)

        steps = histlist[ 6, idx ] * 31
        for( j = 0; j < steps; j + 1) {
            frac = j/steps
            
            
t_set_matrix( matrix )
t_translate( 0, 0, zpos)
            col2 = get_blend( col, colb, frac * 255)
transp( 255 - 255 * fraci )



            dot3d( pxold2 + cos( ang2 ) * histlist[ 6, idx ] * frac , pyold2 + sin( ang2 ) * histlist[ 6, idx ] * frac , 0, col2)
            dot3d( -pxold2 - cos( ang2 ) * histlist[ 6, idx ] * frac , -pyold2 - sin( ang2 ) * histlist[ 6, idx ] * frac , 0, col2)

            t_reset()

        }

        col = get_blend( colorlist[ 2, histlistptr], colorlist[ 2, idx], 157)
        colb = get_blend( colorlist[ 2, histlistptr], colorlist[ 2, ( idx +1 ) % numparticles], 157)

        steps = histlist[ 10, idx ] * 31
        for( j = 0; j < steps; j + 1) {
            frac = j/steps
            
            
t_set_matrix( matrix )
t_translate( 0, 0, zpos)
            col2 = get_blend( col, colb, frac * 255)
transp( 255 - 255 * fraci )



            dot3d( pxold3 + cos( ang3 ) * histlist[ 10, idx ] * frac , pyold3 + sin( ang3 ) * histlist[ 10, idx ] * frac , 0, col2)
            dot3d( -pxold3 - cos( ang3 ) * histlist[ 10, idx ] * frac , -pyold3 - sin( ang3 ) * histlist[ 10, idx ] * frac , 0, col2)

            t_reset()

        }



    angold = ang1 
    pxold = px
    pyold = py

    angold2 = ang2 
    pxold2 = px2
    pyold2 = py2

    angold3 = ang3 
    pxold3 = px3
    pyold3 = py3

}
histlist[ 2, histlistptr ] = histlist[ 2, histlistptr ]  * grow // + 1280/256 
histlist[ 3, histlistptr ] = histlist[ 3, histlistptr ] * (1/grow) 

histlist[ 6, histlistptr ] = histlist[ 6, histlistptr ]  * grow2
histlist[ 7, histlistptr ] = histlist[ 7, histlistptr ] * (1/grow2)

histlist[ 10, histlistptr ] = histlist[ 10, histlistptr ]  * grow3
histlist[ 11, histlistptr ] = histlist[ 11, histlistptr ] * (1/grow3)
histlistptr + 1
histlistptr = histlistptr % numparticles

set_pixel_size( 1 )
// blur 1
/*
conv_filter(
    screenclone,  //destination
    scr,  //source
    krnl_x2,  //kernel
//OPTIONAL PARAMETERS:
    23,  //divisor (dividing the result)
    0,  //offset (addition after division)
    CONV_FILTER_COLOR,  //flags (options)
   1, 1,  //kernel center XY (relative to the upper left corner)
    0, 0,  //destination XY
    0, 0,  //source XY
    xsize, ysize,
    1, 1  //XY pitch (step length)
)

transp(4)
	t_reset()
pixi( screenclone, 0, 0, #BFDFFF, 1.05, 1.05)

conv_filter(
    screenclone,  //destination
    scr,  //source
    krnl_x2,  //kernel
//OPTIONAL PARAMETERS:
    23,  //divisor (dividing the result)
    0,  //offset (addition after division)
    CONV_FILTER_COLOR,  //flags (options)
   1, 1,  //kernel center XY (relative to the upper left corner)
    0, 0,  //destination XY
    0, 0,  //source XY
    xsize, ysize,
    1, 1  //XY pitch (step length)
)
//pixi( screenclone, 0, 0, #BFDFFF, 1.005, 1.005)

*/
set_zbuf()
set_screen( scr)
  transp(255) 
pixi( canvas, 0,0, WHITE, 0.5, 0.5)

//---
        


    ts = ""
    //sprintf( ts, "%u x %u", ang2deg, imax )
    // print( ts, -cx + cx div 30, -cy + cy div 30, WHITE, TOP | LEFT )
	//sprintf( ts, "FPS: %u", FPS )	
  //  print( ts, cx - cx div 30, -cy + cy div 30, WHITE, TOP | RIGHT )
   // frame()


//Audio:

    //Save:
    
    //if ffmpeg_video_export_write( video_export, get_screen() ) { breakall }

    frame()
ertest = ffmpeg_video_export_write( video_export, get_screen() )
    $framecounter + 1
	
    while get_event() { 
		if EVT[ EVT_TYPE ] == EVT_QUIT { breakall } 
		if EVT[ EVT_TYPE ] == EVT_SCREENRESIZE {
			resize( scr, WINDOW_XSIZE, WINDOW_YSIZE)
			set_screen( scr )
	
		} 		
	}
}


ffmpeg_video_export_close( video_export )
	
frame(5000)
//---------

fn gfx_init()
{
// initial and global  values
spinangle = -4
vlowsmoo =  1
//zbuffer = new( xsize, ysize, INT32)
    prevframe = new( xsize, ysize, PIXEL)
clean(prevframe)


canvas = new( xsize * 2, ysize*2, PIXEL)
set_flags( canvas, CFLAG_INTERP)
zbuffer = new( xsize * 2, ysize*2, INT32)

    bps = bpm / 60 
    bpf = bps / fps 

 	hxsize = xsize /2
	hysize = ysize /2
 	thrdxsize = xsize /3
	thrdysize = ysize /3
 	qxsize = xsize /4
	qysize = ysize /4
 	fxsize = xsize /5
	fysize = ysize /5
	preampdivwavmax = preamp / wav_amp_max  	
	ftsize = 4*8192// 4*8192 //4096
	ftbinf = wav.sample_rate/ftsize
	ftbinfrez = 1 / ftbinf
	hftsize = ftsize / 2
	ftbufr = new( ftsize, 1, FLOAT )
 	ftbufi = new( ftsize, 1, FLOAT )
 	ftmag = new( hftsize, 1, FLOAT )
 	ftmagsmoo = new( hftsize, 1, FLOAT )
    ftcepsr = new( hftsize, 1, FLOAT)
    ftcepsi = new( hftsize, 1, FLOAT)
    ftcepsv = new( hftsize, 1, FLOAT)
    ftcepsvddb = new( hftsize, 1, FLOAT)

    numparticles = 128
    histlist = new( 12, numparticles, FLOAT)
clean(histlist)
    histlistptr = 0
    colorlist = new( 3, numparticles, PIXEL)
clean(colorlist, BLACK)
	winlen =   2048//2* 4096 
    if( winlen > ftsize ){ winlen = ftsize }
	wintable = new( ftsize, 1, FLOAT )
    clean( wintable )
	$i = 0 while $i <= winlen{
	wintable[$i] = -cos(2*M_PI*$i/winlen)*0.5 + 0.5
	$i + 1
	}	
	wintablec = new( hftsize, 1, FLOAT )
    clean( wintablec )
	$i = 0 while $i < hftsize {
	wintablec[$i] =  -cos(2*M_PI*$i/hftsize)*0.5 + 0.5
	$i + 1
	}




krnl_blr = new(3,3, INT) // blur kernel
clean(krnl_blr,1)
krnl_blr[1] = 2
krnl_blr[3] = 2
krnl_blr[5] = 2
krnl_blr[7] = 2
krnl_blr[4] = 4

krnl_x = new(3,3, INT) // blur kernel
clean(krnl_x,1)
krnl_x[1] = 4
krnl_x[3] = 2
krnl_x[5] = 2
krnl_x[7] = 4
krnl_x[4] = 4

krnl_x2 = new(3,3, INT) // blur kernel
clean(krnl_x2,1)
krnl_x2[0] = 3
krnl_x2[1] = 2
krnl_x2[2] = 3
krnl_x2[3] = 2
krnl_x2[4] = 4
krnl_x2[5] = 2
krnl_x2[6] = 3
krnl_x2[7] = 2
krnl_x2[8] = 2



krnl_boxblr3 = new(3,3, INT) // blur kernel
clean(krnl_boxblr3,1)

	
	// ERB scale
	erbsize = bands * 2
	erbbuf = new( erbsize, 1, FLOAT)
	erbiftlookup = new( erbsize, 1, INT32)
	
	// ERB filter lookup
	//
	$size = erbsize
	$ERBmin = erbbandmin //1
	$ERBrange = erbbandmax -$ERBmin  //40 -$ERBmin

	$i = 0 while $i < erbsize
	{
	$erb = $ERBrange*$i/(erbsize) + $ERBmin
	$erbf = ($erb) * 0.046729
	$erbf = pow(10,$erbf) -1
	$erbf = $erbf * 228.833 

	erbiftlookup[$i] = ($erbf * ftbinfrez) div 1
	$i +1
	}
	
	// create weights
	ftweight = new( hftsize, 1, FLOAT )
	$i = 0 while $i < erbsize{
		$fromidx = erbiftlookup[$i ]
		$toidx = erbiftlookup[$i + 1 ] -1	
		$d = $toidx - $fromidx 
		$j = 0 while $j < $d{
			$ii = $fromidx +$j
			$w = $j / ($d -1)	
		ftweight[$ii] = $w
			$j = $j +1
		}
 	$i +1
 	}
	
	//----------
	
	// 256 lookup from spectrum
	lmap = new( 256, 1, FLOAT) 
	lmapsmoo = new( 1, 256, FLOAT) // smoothed version
	
	C_GREY = get_color(127,127,127) // neutral grey
	C_erb = WHITE
	
	pxl32 = new(3, 1, INT32)// working pixel 32 bit
	


histogramme = new(256,1,FLOAT)
eqtable = new(256,1,FLOAT)
deeqtable = new(256,1,FLOAT)

imgbuf = new(xsize,ysize)// frame
clean(imgbuf, RED)
screenclone = new(xsize,ysize)// screen copy
screenclone_copy = new(xsize,ysize)// screen copy 2
imgW = clone(imgbuf)
img_Y = clone(imgbuf)
img_Cb = clone(imgbuf)	
img_Cr = clone(imgbuf)
img_A = new(xsize,ysize, INT8)// alpha channel buffer
for($i =0; $i < get_size(img_A); $i +1){
	img_A[$i] = 255
}
set_alpha( imgW, img_A)
set_flags( imgW, GL_MIN_LINEAR | GL_MAG_LINEAR | GL_NICEST )

    blackkeys= new( 12, 1, INT)
    clean( blackkeys )
    blackkeys[1] = 1
    blackkeys[3] = 1
    blackkeys[6] = 1
    blackkeys[9] = 1
    blackkeys[10] = 1
}

fn anaudio(){

// FFT
	clean(ftbufi)
    clean(ftbufr)
    clean(ftmag)

    $p = wav_ptr
    
    esum = 0
    $i = 0 while $i < ftsize
    {
	if $i <=  winlen{
	ftbufi[ $i ] = 0
	ftbufr[ $i ] = (wav[ $p + $i * wav_channels ] + wav[ $p + $i * wav_channels +1] )* preampdivwavmax * wintable[$i] 
    esum = esum + ftbufr[ $i ]*ftbufr[ $i ]
	}else{
	ftbufi[ $i ] = 0
	ftbufr[ $i ] = 0
	}
	$i + 1
    }	
fft( 0, ftbufi,ftbufr,ftsize)

    $i = 0 while $i < hftsize
    {
    ftmag[ $i ] =  ftbufr[ $i ] * ftbufr[ $i ]   + ftbufi[ $i ] * ftbufi[ $i ] 
	ftcepsr[ $i ] = ftmag[ $i ] * wintablec[ $i ] +0.01
    ftmag[ $i ] = sqrt( ftmag[ $i ] )
    ftcepsr[ $i ] = log( sqrt( ftcepsr[ $i ] )   )//* wintablec[ $i ] +0.01)
    ftcepsi[ $i ] = 0
	$i + 1
    }

    fft( 1, ftcepsi,ftcepsr,hftsize)



	// map on ERB scale 
	// for color
	$erbgrav = 0
	$erbvmax = 0
	$erbsum = 0
	$i = 0 while $i < erbsize
	{
	erbbuf[$i]=0
	// pass 1 up
	$fromidx = erbiftlookup[$i ]
	$toidx = erbiftlookup[$i + 1 ] -1	
	$d = $toidx - $fromidx 
	$j = 0 while $j < $d
		{
		$ii = $fromidx + $j
		$v = sqrt(ftbufr[$ii]*ftbufr[$ii]+ftbufi[$ii]*ftbufi[$ii])
			erbbuf[$i] = erbbuf[$i] + $v * ftweight[$ii]		
		$j = $j +1 
		}
	erbbuf[$i] = erbbuf[$i] *80/$d
	// pass 2 down
	$fromidx = erbiftlookup[$i + 1 ]
	$toidx = erbiftlookup[$i +2 ] -1	
	$d = $toidx - $fromidx 
	$j = 0 while $j < $d
		{
		$ii = $fromidx + $j
		$v = sqrt(ftbufr[$ii]*ftbufr[$ii]+ftbufi[$ii]*ftbufi[$ii]) 
			erbbuf[$i] = erbbuf[$i] + $v * (1-ftweight[$ii])		
		$j = $j +1 
		}
	erbbuf[$i] = erbbuf[$i] *80/$d
	$erbsum = $erbsum + erbbuf[$i]
	$erbgrav = $erbgrav + erbbuf[$i] * ($i -erbsize/2)
	$i + 1
	}
	
	if $erbvmax > 1 { $erbvmax = 1 } 
	
	//------------------------------------------
	
	// create light lookup map
	lmapsum=0
	clipping = 0;
	$size = 256
	$i = 0 while $i < $size 
	{ 	
	$erbi = ($i * erbsize / $size ) 
	$frac = mod($erbi,1) 
	
	$erbi = $erbi div 1
	$v = erbbuf[$erbi] 
	if $erbi < $size -1 {
	$v2 = erbbuf[$erbi +1] 	
	$v = $v + ($v2 - $v) * $frac}
		
	//lmap[$i] = (atodb($v) +54 )/54 
	//lmap[$i] = (atodb($v) +30 )/30 
    lmap[$i] = (atodb($v) +24 )/24
 
	if lmap[$i] > lmapsmoo[0,$i] {
		lmapsmoo[0,$i] = lmap[$i]
	}else{ lmapsmoo[0,$i] = lmapsmoo[0,$i]*0.95}//96}
	
	if lmapsmoo[0,$i] > 1 { lmapsmoo[0,$i] = 1 clipping = 1}
	if lmapsmoo[0,$i] < 0 { lmapsmoo[0,$i] = 0}

	//lmapsmoo[$i] = lmapsmoo[$i] * lmapsmoo[$i]
	

 lmapsum = lmapsum + lmapsmoo[0,$i]/16

	$i + 1
	}	
ret(1)
}


fn atodb($a){
// converts amplitude to dB
	$db = 20*log10($a)
ret($db)
}
fn dbtoa($db){
// converts db to linear amplitude
	$a = pow(10,($db)*0.05)
ret($a)
}

fn hsvrgb($h,$s,$v){
// HSV to RGB
$h = $h % 360
$M = 255*$v
$m = $M*(1- $s)
$z = 255*($v*$s)*(1-abs(mod(($h/60.0),2)-1))
if $h < 60 {
$r = $M
$g = $z + $m
$b = $m
}else{
if $h < 120 {
$r = $z + $m
$g = $M 
$b = $m
}else{
if $h < 180 {
$r = $m 
$g = $M 
$b = $z + $m
}else{
if $h < 240 {
$r = $m 
$g = $z + $m
$b = $M 
}else{
if $h < 300 {
$r = $z + $m
$g = $m 
$b = $M 
}else{
$r = $M 
$g = $m 
$b = $z + $m
}}}}
}
ret(get_color($r ,$g ,$b ))
}

fn get_hist_red($img){
	clean(histogramme)
	$i = 0 
	$fac = 1/( get_size($img) )
	while $i < get_size($img){
	histogramme[get_red($img[$i])] = histogramme[get_red($img[$i])] + $fac
	$i + 1
	}
ret(1)
}

fn get_hist($img){
	clean(histogramme)
	$i = 0 
	$fac = 1/( get_size($img) )
	while $i < get_size($img){
	histogramme[($img[$i])] = histogramme[($img[$i])] + $fac
	$i + 1
	}
ret(1)
}


fn eq_red($img, $amount){
	get_hist_red($img)
	//clean(eqtable)
	copy(eqtable, histogramme)
	op_cn(OP_H_INTEGRAL, eqtable, 0)
	op_cn(OP_SMUL, eqtable, 255)
	$am1m = 1 - $amount
	for( $i=0; $i < get_size($img); $i + 1){
		$img[$i] = get_color( eqtable[get_red($img[$i])*$amount + get_red($img[$i])*$am1m] , 0, 0)
}
ret($img)
}

fn eq_onechannel($img, $amount){
	get_hist($img)
	//clean(eqtable)
	copy(eqtable, histogramme)
	op_cn(OP_H_INTEGRAL, eqtable, 0)
	op_cn(OP_SMUL, eqtable, 255)
	$am1m = 1 - $amount
	for( $i=0; $i < get_size($img); $i + 1){
		$img[$i] =  eqtable[($img[$i])*$amount + ($img[$i])*$am1m] 
}
ret($img)
}

fn get_eqtable($img){
	get_hist_red($img)
	copy(eqtable, histogramme)
	op_cn(OP_H_INTEGRAL, eqtable, 0)
	op_cn(OP_SMUL, eqtable, 255)
ret(1)
}

fn deeq_red($img, $amount){
	$am1m = 1 - $amount
	clean(deeqtable)
	//for ($i = 0; $i < 256;$i +1){ 
	//deeqtable[$i] =  $i
	//}
	for ($i = 0; $i < 256;$i +1){ 
	$ti = eqtable[$i]
	deeqtable[$ti] =  $i //+ ($i - $ti)
	}
	for ($i = 1; $i < 256;$i +1){ 
	if deeqtable[$i] == 0 {deeqtable[$i] = (deeqtable[$i-1] + 1) & 255}
	}

	for( $i=0; $i < get_size($img); $i + 1){
		$img[$i] = get_color( deeqtable[get_red($img[$i])*$amount + get_red($img[$i])*$am1m] , 0, 0)
}
ret($img)
}



needs ffmpeg
ainegil
Posts: 456
Joined: Thu Sep 22, 2022 11:37 pm

Re: experiments

Post by ainegil »

basically the same code, but without screen clearing, and a frame blur effect as post process

ainegil
Posts: 456
Joined: Thu Sep 22, 2022 11:37 pm

Re: experiments

Post by ainegil »

Post Reply