OpenGL/PulseAudio visualizer, with project management scripts added; currently only mono channel is supported.
# build project, may -DCMAKE_BUILD_TYPE=Release
cmake -B build . &&cd build &&make ; cd -
# clean
rm -rf gl/ pkged/ build/
FFT(fast fourier transf.) is used for extracting freq dB histogram.
OGL framework: glad+glfw
pip install glad --user
apt install libpulse-dev libfftw3-dev libgl-dev libglfw3-dev
pacman -S fftw glfw-x11
- buffer ptr slice buffer with
checkUnmodify()
and mutex - fourier transform
fftwf
+ Blackman Window multiplier - pulseaudio input Register context/stream state and (PA server)info/read callbacks with PA mainloop&lock, provide audio sample-point buffer
- render
- sharder code: a RK4 interpolation "gravity", bars vert/frag/geom
- main dt deltaTime loop
Used tool: mkhpp.py, mk_glsl_hpp.py
This program uses various C++17 feature like std::chrono
, constexpr
.
mkhpp
tool enables decl/defn reuse by outputting {}
-removed pkged/x.hpp
preprocessed with cpp -DPKGED
, unless inlined members with {1;
prefix
Setting config params is supported, but it looks very hard to support bg color customization(vec4
), or migerate to WebAssembly(FFT,WebAudio)?
Main dataflow:
main()
initbuffer_size
+PAInput
+FFT
, startGL, start capture & deltaTime loopPAInput::stream_read_callback
peek&write&drop tobuffer
hereFFT::calculate(buf)
tooutput[i]
withprepare_window(window_size)
, fftwRender::render(float dt)
ofrender.data[i] = dB;
here, bindfft_buf
in ctorp_bar.use()
sharder program with (rect,l,r -1/y,0,1
layout,RGBA)link(vertex,geometry,fragment)
u_size
,u_half=1/usize
; and gravityu_dt
here
where
- startGL windowHint GLFW_OPENGL_CORE_PROFILE,
glfwCreateWindow(1000,350, "abeat")
&glContext&onresize&gladLoad - fftw
fftwf_execute(fftwf_plan_dft_r2c_1d(window_size, input, output, FFTW_ESTIMATE))
infftwf_alloc_real
out_complex