def update_features(self, n_bins = 3): latest_data_window = self.stream_reader.data_buffer.get_most_recent(self.FFT_window_size) self.fft = getFFT(latest_data_window, self.rate, self.FFT_window_size, log_scale = self.log_features) #Equalize pink noise spectrum falloff: self.fft = self.fft * self.power_normalization_coefficients self.num_ffts += 1 self.fft_fps = self.num_ffts / (time.time() - self.stream_reader.stream_start_time) if self.smoothing_length_ms > 0: self.feature_buffer.append_data(self.fft) buffered_features = self.feature_buffer.get_most_recent(len(self.smoothing_kernel)) if len(buffered_features) == len(self.smoothing_kernel): buffered_features = self.smoothing_kernel * buffered_features self.fft = np.mean(buffered_features, axis=0) self.strongest_frequency = self.fftx[np.argmax(self.fft)] #ToDo: replace this for-loop with pure numpy code for bin_index in range(self.n_frequency_bins): self.frequency_bin_energies[bin_index] = np.mean(self.fft[self.fftx_indices_per_bin[bin_index]]) #Beat detection ToDo: #https://www.parallelcube.com/2018/03/30/beat-detection-algorithm/ #https://github.com/shunfu/python-beat-detector #https://pypi.org/project/vamp/ return
def update_features(self, n_bins=3): latest_data_window = self.stream_reader.data_buffer.get_most_recent( self.FFT_window_size) self.fft = getFFT(latest_data_window, self.rate, self.FFT_window_size, log_scale=self.log_features) #Equalize pink noise spectrum falloff: self.fft = self.fft * self.power_normalization_coefficients self.num_ffts += 1 self.fft_fps = self.num_ffts / (time.time() - self.stream_reader.stream_start_time) if self.smoothing_length_ms > 0: self.feature_buffer.append_data(self.fft) buffered_features = self.feature_buffer.get_most_recent( len(self.smoothing_kernel)) if len(buffered_features) == len(self.smoothing_kernel): buffered_features = self.smoothing_kernel * buffered_features self.fft = np.mean(buffered_features, axis=0) self.strongest_frequency = self.fftx[np.argmax(self.fft)] for bin_index in range(self.n_frequency_bins): self.frequency_bin_energies[bin_index] = np.mean( self.fft[self.fftx_indices_per_bin[bin_index]]) return
def stream_readchunk(self): """Reads some audio and re-launches itself""" try: self.data = numpy.fromstring(self.stream.read(self.chunk), dtype=numpy.int16) self.fftx, self.fft = getFFT(self.data, self.rate) except Exception as E: print("💩 Something bad happen. Terminating...") print(E) self.keepRecording = False if self.keepRecording: self.stream_thread_new() else: self.stream.close() # self.pa.terminate() print("🛑 Stream STOPPED") self.chunksRead += 1