experiments
-
ainegil
- Posts: 456
- Joined: Thu Sep 22, 2022 11:37 pm
Re: experiments
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
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
reused code from above, slightly altered.
Edited in KDEnlive, music made on MPC, sort of industrial music
Edited in KDEnlive, music made on MPC, sort of industrial music
-
ainegil
- Posts: 456
- Joined: Thu Sep 22, 2022 11:37 pm
Re: experiments
very similar code, different track
-
ainegil
- Posts: 456
- Joined: Thu Sep 22, 2022 11:37 pm
Re: experiments
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)
}
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)
}
-
ainegil
- Posts: 456
- Joined: Thu Sep 22, 2022 11:37 pm
Re: experiments
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.
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
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
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 ).
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
I have scheduled a video on YT for tomorrow, 6 am GMT+1 :
( note the video is not available before this date )
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:
needs ffmpeg
( note the video is not available before this date )
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)
}
-
ainegil
- Posts: 456
- Joined: Thu Sep 22, 2022 11:37 pm
Re: experiments
basically the same code, but without screen clearing, and a frame blur effect as post process