!7 import static x30_pkg.x30_util.VF1; module LiveVAD > DynPrintLog { volatile bool enabled = true; transient double windowSize = 1.0; // seconds transient Q q; transient new L buffer; transient int bufferSize, neededSamples; transient VAD_1 vad; visualize { ret centerAndSouthWithMargins(super.visualize(), jrightalignedline(dm_fieldCheckBox('enabled))); } start { vad = filled_VAD_1(); neededSamples = iround(windowSize*44100); q = dm_startQ(); dm_addAudioListener(voidfunc(short[] data) { if (!enabled) ret; buffer.add(mixStereoShortArrayToMono(data)); bufferSize += l(data)/2; if (bufferSize >= neededSamples) { bufferSize -= neededSamples; final L salvaged = cloneList(buffer); buffer.clear(); if (bufferSize > 0) { buffer.add(lastNShorts(bufferSize, last(salvaged))); replaceLastElement(salvaged, dropLastNShorts(bufferSize, last(salvaged))); } q.add(r { MultiShortArrayInputStream_resettable stream = new(salvaged); stream.bigEndian = true; Clip clip = spectro_clipFromMonoInputStream(stream); BWImage img = clipToFrequencyImage(clip); quickShowZoomedImage(img); print("VAD: " + callF(vad, img)); }); } }); } }