4

コンピューター モジュール EXM32 スターター キットを組み込んだプロジェクトを行っており、8 つの音符でピアノをシミュレートしたいと考えています。OSはLinuxで、Pythonでプログラミングしています。私の問題は、Python のバージョンが 2.4 で、2 つのサウンドを同時に再生するための「pygame」ライブラリがないことです。現在、python "os.system('aplay ./Do.wav')" を使用して、Linux コンソールからサウンドを再生しています。

簡単な質問は次のとおりです。別のライブラリを使用して同じことを行うことはできますか:

    snd1 =  pygame.mixer.Sound('./Do.wav')
    snd2 =  pygame.mixer.Sound('./Re.wav')

    snd1.play()
    snd2.play()

「ド」と「レ」を同時に演奏するには?「auidoop」と「wave」ライブラリを使用できます。

スレッドを使用しようとしましたが、問題はコンソール コマンドが終了するまでプログラムが待機することです。使用できる別のライブラリはありますか? または「wave」または「audiooop」を使用する方法?? (この最後のライブラリは、操作されたサウンド ファイル専用だと思います) 完全なコードは次のとおりです。

import termios, sys, os, time
TERMIOS = termios
#I wrote this method to simulate keyevent. I haven't got better libraries to do this
def getkey():
    fd = sys.stdin.fileno()
    old = termios.tcgetattr(fd)
    new = termios.tcgetattr(fd)
    new[3] = new[3] & ~TERMIOS.ICANON & ~TERMIOS.ECHO
    new[6][TERMIOS.VMIN] = 1
    new[6][TERMIOS.VTIME] = 0
    termios.tcsetattr(fd, TERMIOS.TCSANOW, new)
    key_pressed = None
    try:
            key_pressed = os.read(fd, 1)
    finally:
            termios.tcsetattr(fd, TERMIOS.TCSAFLUSH, old)
    return key_pressed

def keyspress(note):

    if note == DO:
            os.system('aplay  ./notas_musicales/Do.wav')
    elif note == RE:
            os.system('aplay ./notas_musicales/Re.wav')
    elif note == MI:
            os.system('aplay ./notas_musicales/Mi.wav')
    elif note == FA:
            os.system('aplay ./notas_musicales/Fa.wav')
    elif note == SOL:
            os.system('aplay ./notas_musicales/Sol.wav')
    elif note == LA:
            os.system('aplay ./notas_musicales/La.wav')
    elif note == SI:
            os.system('aplay ./notas_musicales/Si.wav')


DO = 'a'
RE = 's'
MI = 'd'
FA = 'f'
SOL = 'g'
LA = 'h'
SI = 'j'
key_pressed = ""
i = 1

#in each iteration the program enter into the other 'if' to doesn't interrupt
#the last sound.
while(key_pressed != 'n'):
    key_pressed = getkey()
    if i == 1:
        keyspress(key_pressed)
        i = 0
    elif i == 0:
        keyspress(key_pressed)
        i = 1
    print ord(key_pressed)
4

2 に答える 2

3

あなたの基本的な問題は、プロセスを生成し、その戻り値を待たないことです。あなたはそれを行うことはできませんos.system()(何十ものスレッドを生成することができます)。

これは、2.4 以降で利用できるsubprocessモジュールで行うことができます。例については、こちらを参照してください。

于 2012-12-28T17:26:13.320 に答える
3

デフォルトの Python 実装のグローバル インタープリター ロック ("GIL") により、一度に 1 つのスレッドしか実行されません。したがって、この場合はあまり役に立ちません。

さらに、os.systemコマンドが終了するのを待ち、コマンドを実行するための追加のシェルを生成します。suprocess.Popen代わりに使用する必要があります。これは、プログラムを開始するとすぐに戻り、デフォルトでは追加のシェルを生成しません。次のコードは、両方のプレーヤーをできるだけ近くで開始する必要があります。

import subprocess

do = subprocess.Popen(['aplay', './notas_musicales/Do.wav'])
re = subprocess.Popen(['aplay', './notas_musicales/Re.wav'])
于 2012-12-28T17:30:46.217 に答える