У меня есть проект, который я делаю, который включает в себя светодиоды и обработку звука.Я пытаюсь получить ту же функциональность библиотеки Minim обработки в Python, но у меня нет успеха.Класс BeatDetect в Minim имеет методы isHat, isSnare и т. Д., Которые позволяют легко обрабатывать их, поэтому я могу включить соответствующий светодиод.
from aubio import source, pitch
def is_hat(frequency):
lower = 3000
upper = 5000
return lower <= frequency <= upper
def is_kick(frequency):
lower = 20
upper = 100
return lower <= frequency <= upper
def is_snare(frequency):
lower = 300
upper = 600
return lower <= frequency <= upper
def read_audio(filename: str):
downsample = 1
samplerate = 44100 // downsample
win_s = 4096 // downsample # fft size
hop_s = 512 // downsample # hop size
s = source(filename, samplerate, hop_s)
samplerate = s.samplerate
tolerance = 0.8
pitch_o = pitch("yin", win_s, hop_s, samplerate)
pitch_o.set_unit("midi")
pitch_o.set_tolerance(tolerance)
pitches = []
confidences = []
# total number of frames read
total_frames = 0
while True:
samples, read = s()
pitch_s = pitch_o(samples)[0]
# pitch = int(round(pitch))
confidence = pitch_o.get_confidence()
# if confidence < 0.8: pitch = 0.
print('hat' if is_hat(pitch_s) else '')
print('kick' if is_kick(pitch_s) else '')
print('snare' if is_snare(pitch_s) else '')
#print("%f %f %f" % (total_frames / float(samplerate), pitch_s, confidence))
print(pitch_s)
pitches += [pitch_s]
confidences += [confidence]
total_frames += read
if read < hop_s:
break
if 0:
sys.exit(0)
def main():
read_audio("song.mp3")
if __name__ == '__main__':
main()
Из документов Minim ([http://code.compartmental.net/minim/beatdetect_method_ishat.html][1]) для BeatDetect говорит:
"В режиме частотной энергии возвращается значение true, если был обнаружен удар, соответствующий частотному диапазону хай-хэта. Он настроен на работу с танцевальной / техно музыкой и может не работать хорошос другими стилями музыки. В режиме звуковой энергии это всегда возвращает false. "
Я пытался исследовать различные частотные диапазоны ловушек, ударов и хай-хэтов, но is_kick () былтолько один вернул значение true. С aubio я пытаюсь сравнить текущую частоту с частотой вышеупомянутых диапазонов, пытаясь заставить его работать так же, как BeatDetect. Я мало что знаю об аудио, поэтому помощь будет очень признательна. Спасибо.