diff options
| author | 2 * r + 2 * t <61896496+soramanew@users.noreply.github.com> | 2025-05-23 00:05:13 +0800 |
|---|---|---|
| committer | 2 * r + 2 * t <61896496+soramanew@users.noreply.github.com> | 2025-05-23 00:05:13 +0800 |
| commit | cf965934ac789f3f0ba554e872cebae5be32ab9e (patch) | |
| tree | 35dff84df036ac8c4b187c100cb055e174535b96 /assets | |
| parent | dashboard: fix calendar weekdays (diff) | |
| download | caelestia-shell-cf965934ac789f3f0ba554e872cebae5be32ab9e.tar.gz caelestia-shell-cf965934ac789f3f0ba554e872cebae5be32ab9e.tar.bz2 caelestia-shell-cf965934ac789f3f0ba554e872cebae5be32ab9e.zip | |
dashboard: media bongo cat
Diffstat (limited to 'assets')
| -rw-r--r-- | assets/bongocat.gif | bin | 0 -> 8495 bytes | |||
| -rwxr-xr-x | assets/realtime-beat-detector.py | 73 |
2 files changed, 73 insertions, 0 deletions
diff --git a/assets/bongocat.gif b/assets/bongocat.gif Binary files differnew file mode 100644 index 0000000..4a50ff1 --- /dev/null +++ b/assets/bongocat.gif diff --git a/assets/realtime-beat-detector.py b/assets/realtime-beat-detector.py new file mode 100755 index 0000000..dfecad6 --- /dev/null +++ b/assets/realtime-beat-detector.py @@ -0,0 +1,73 @@ +#!/bin/python + +import pyaudio +import numpy as np +import aubio +import signal +import sys + +from typing import List, Tuple + + +class BeatDetector: + def __init__(self, buf_size: int): + self.buf_size: int = buf_size + + # Set up pyaudio and aubio beat detector + self.audio: pyaudio.PyAudio = pyaudio.PyAudio() + samplerate: int = 44100 + + self.stream: pyaudio.Stream = self.audio.open( + format=pyaudio.paFloat32, + channels=1, + rate=samplerate, + input=True, + frames_per_buffer=self.buf_size, + stream_callback=self._pyaudio_callback + ) + + fft_size: int = self.buf_size * 2 + + # tempo detection + self.tempo: aubio.tempo = aubio.tempo("default", fft_size, self.buf_size, samplerate) + + # this one is called every time enough audio data (buf_size) has been read by the stream + def _pyaudio_callback(self, in_data, frame_count, time_info, status): + # Interpret a buffer as a 1-dimensional array (aubio do not work with raw data) + audio_data = np.frombuffer(in_data, dtype=np.float32) + # true if beat present + beat = self.tempo(audio_data) + + # if beat detected, calculate BPM and send to OSC + if beat[0]: + print(self.tempo.get_bpm(), flush=True) + + return None, pyaudio.paContinue # Tell pyAudio to continue + + def __del__(self): + self.stream.close() + self.audio.terminate() + print('--- Stopped ---') + + +# main +def main(): + bd = BeatDetector(512) + + # capture ctrl+c to stop gracefully process + def signal_handler(none, frame): + bd.stream.stop_stream() + bd.stream.close() + bd.audio.terminate() + print(' ===> Ctrl + C') + sys.exit(0) + + signal.signal(signal.SIGINT, signal_handler) + + # Audio processing happens in separate thread, so put this thread to sleep + signal.pause() + + +# main run +if __name__ == "__main__": + main() |