Есть ли способ создать звуки оборотов двигателя в python? - PullRequest
1 голос
/ 21 июня 2020

Я хочу создавать звуки оборотов двигателя (аналогичные приложению RevHeadz на android / apple), используя python. Есть ли библиотека или способ сделать это? Я пробовал увеличивать частоту образца аудиофайла по мере увеличения оборотов, но я не знаю, как изменить частоту аудиофайла на лету (достаточно быстро, чтобы он казался непрерывным). Любые предложения приветствуются!

Код для того, что я уже пробовал -

import sounddevice as sd
import soundfile as sf
import curses
import time

screen = curses.initscr() # initialize a terminal screen for you
curses.noecho() # don't show what input was entered
curses.cbreak() #character break -> don't wait for enter to accept input
screen.keypad(True)
screen.scrollok(True)

data, fs = sf.read('engine_start.wav', dtype='float32')
sd.play(data, fs)
sd.wait()

filename = 'engine_short.wav'
# Extract data and sampling rate from file
data, fs = sf.read(filename, dtype='float32')
sd.play(data, fs, loop = True)
#status = sd.wait()  # Wait until file is done playing

class ecu:
    def __init__(self, frequency):
        self.fs = 1
    def speedUp(self):
        if (self.fs + 0.1 <= 2):
            self.fs += 0.1
    def slowDown(self):
        if (self.fs - 0.1 >= 0.5):
            self.fs -= 0.1

newECU = ecu(fs)

while True:
    char = screen.getch()
    if char == 113:
        screen.addstr("Exiting...\n")
        curses.echo()
        curses.nocbreak()
        screen.keypad(False)
        curses.endwin() #close application
        exit()  # q
    elif char == curses.KEY_UP:
        if (newECU.fs + 0.005 <= 2.0):
            newECU.fs += 0.005
        value = "UP: " + str(newECU.fs) + "\n"
        sd.play(data, fs * newECU.fs, loop = True)
        screen.addstr(value)
        time.sleep(0.100)
    elif char == curses.KEY_DOWN:
        if (newECU.fs - 0.005 >= 1.0):
            newECU.fs -= 0.005
        value = "DOWN: " + str(newECU.fs) + "\n"
        sd.play(data, fs * newECU.fs, loop = True)
        screen.addstr(value)
        time.sleep(0.100)
    elif char == 115:
        value = "Current Speed: " + str(newECU.fs) + "\n"
        screen.addstr(value)
...