4
4
:title " Spectrogram"
5
5
:description " Live audio spectrogram using microphone input."
6
6
(trial-harmony :initialize-audio-backend NIL NIL :source T :mixers ' () :start NIL )
7
- (let* ((visualizer (make-instance ' spectrogram-visualizer :framesize 2048 :frame-count 1024 ))
7
+ (let* ((visualizer (make-instance ' spectrogram-visualizer :framesize 8192 :frame-count 1024 ))
8
8
(input (harmony :segment :input harmony :*server* ))
9
9
(fft (make-instance ' mixed:fwd-fft :samplerate (harmony :samplerate harmony :*server* )
10
10
:framesize (framesize visualizer)))
44
44
(vertex-array :initform (// ' trial ' fullscreen-square))
45
45
(spectrogram :accessor spectrogram)
46
46
(framesize :initarg :framesize :initform 2048 :accessor framesize)
47
+ (range :initarg :range :initform ' (100 . 8000 ) :accessor range)
47
48
(i :initform 0 :accessor i)
48
49
(last-i :initform 0 :accessor last-i))
49
50
(:inhibit-shaders (textured-entity :fragment-shader )))
66
67
(stage (gradient visualizer) area))
67
68
68
69
(defmethod render :before ((visualizer spectrogram-visualizer) (program shader-program))
69
- (let ((i (i visualizer)))
70
+ (let ((i (i visualizer))
71
+ (spectrogram (spectrogram visualizer)))
70
72
(setf (uniform program " gradient" ) (bind (gradient visualizer) 1 ))
71
73
(setf (uniform program " spectrogram" ) (bind (texture visualizer) 0 ))
72
74
; ; FIXME: only update the actually changed partrs of the texture.
73
75
(update-buffer-data (texture visualizer) T )
74
76
(setf (last-i visualizer) i)
75
- (setf (uniform program " offset" ) (vec2 0 (/ i (length (spectrogram visualizer)))))))
77
+ (let ((min-freq (aref spectrogram 0 ))
78
+ (max-freq (aref (spectrogram visualizer) (- (framesize visualizer) 2 ))))
79
+ ; ; TODO: compute the correct scaling and offset to view the range
80
+ (setf (uniform program " offset" ) (vec2 0 (/ i (length spectrogram)))))))
76
81
77
82
(define-class-shader (spectrogram-visualizer :fragment-shader )
78
83
" uniform sampler2D spectrogram;
@@ -82,8 +87,11 @@ in vec2 uv;
82
87
out vec4 color;
83
88
84
89
void main(){
85
- vec2 pos = vec2(uv.y, uv.x)+offset;
90
+ vec2 pos = vec2(pow( uv.y,2) , uv.x)+offset;
86
91
vec2 freqmag = texture(spectrogram, pos).rg;
92
+ float freqp = textureOffset(spectrogram, pos, ivec2(2,0)).r;
87
93
vec3 intensity = texture(gradient, vec2(freqmag.y, 0.5)).rgb;
94
+ // Figure out lines
95
+ if(1000*ceil(freqmag.x / 1000) <= freqp) intensity = vec3(1);
88
96
color = vec4(intensity, 1);
89
97
}" )
0 commit comments