Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/312.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
从终端窗口快速生成自定义合成音调序列的Python方法_Python_Terminal_Dsl_Pyparsing_Textx - Fatal编程技术网

从终端窗口快速生成自定义合成音调序列的Python方法

从终端窗口快速生成自定义合成音调序列的Python方法,python,terminal,dsl,pyparsing,textx,Python,Terminal,Dsl,Pyparsing,Textx,我正在尝试设计一种快速生成音频信号的方法。我需要这个来做电生理实验,在这个实验中,我会播放音调序列来检查大脑听觉系统中的神经元反应 我需要能够快速构建一个新的序列,在该序列中,我可以指定每个音调的特征(例如频率、持续时间、振幅等)、无声暂停(即休息)以及音调和暂停的序列 我想从终端使用一个简单的代码序列来实现这一点。例如,输入tone(440,2)rest(2)tone(880,1)rest(1)tone(880,1)将生成一首“歌曲”,在440 Hz时播放2秒正弦波音调,然后播放2秒rest,

我正在尝试设计一种快速生成音频信号的方法。我需要这个来做电生理实验,在这个实验中,我会播放音调序列来检查大脑听觉系统中的神经元反应

我需要能够快速构建一个新的序列,在该序列中,我可以指定每个音调的特征(例如频率、持续时间、振幅等)、无声暂停(即休息)以及音调和暂停的序列

我想从终端使用一个简单的代码序列来实现这一点。例如,输入
tone(440,2)rest(2)tone(880,1)rest(1)tone(880,1)
将生成一首“歌曲”,在440 Hz时播放2秒正弦波音调,然后播放2秒rest,然后在880 Hz时播放1秒音调,以此类推


我有Python函数来生成音调和休息,但我不知道如何从终端访问和控制它们。经过一些阅读,似乎使用textX或PyParsing可能是不错的选择,但我没有创建特定领域语言或解析器的背景,所以我不确定。我已经完成并阅读了这篇文章,但还不清楚如何或是否可以使用这些方法来快速、基于终端的音频构建和播放,我需要这些方法。您有什么建议吗?

这个带注释的pyparsing示例应该让您开始:

import pyparsing as pp
ppc = pp.pyparsing_common

# expressions for punctuation - useful during parsing, but 
# should be suppressed from the parsed results
LPAR, RPAR, COMMA = map(pp.Suppress, "(),")

# expressions for your commands and numeric values
# the value expression could have used ppc.integer, but
# using number allows for floating point values (such as
# durations that are less than a second)
TONE = pp.Keyword("tone")
REST = pp.Keyword("rest")
value = ppc.number

# expressions for tone and rest commands
tone_expr = (TONE("cmd")
             + LPAR + value("freq") + COMMA + value("duration") + RPAR)
rest_expr = (REST("cmd")
             + LPAR + value("duration") + RPAR)

# a command is a tone or a rest expression
cmd_expr = tone_expr | rest_expr

# functions to call for each command - replace with your actual
# music functions
def play_tone(freq, dur):
    print("BEEP({}, {})".format(freq, dur))

def play_rest(dur):
    print("REST({})".format(dur))
工作原理:

cmd_str = "tone(440,0.2) rest(2) tone(880, 1) rest(1) tone( 880, 1 )"

for music_code in cmd_expr.searchString(cmd_str):
    if music_code.cmd == "tone":
        play_tone(music_code.freq, music_code.duration)
    elif music_code.cmd == "rest":
        play_rest(music_code.duration)
    else:
        print("unexpected code", music_code.cmd)
印刷品:

BEEP(440, 0.2)
REST(2)
BEEP(880, 1)
REST(1)
BEEP(880, 1)

更多信息和模块参考位于

这将是textX的初始解决方案:

从textx导入元模型从
语法=r''
命令:命令*=命令;
命令:音调|静止;
音调:“音调”(“freq=INT”,“duration=INT”);
Rest:'Rest'('duration=INT');
'''
mm=元模型(语法)
输入='音调(440,2)静止(2)音调(880,1)静止(1)音调(880,1)'
模型=毫米。模型来自(输入)
对于model.commands中的命令:
如果命令.\uuuuuuu类\uuuuuuu名\uuuuuuuu=='Tone':
#这个命令是一个音调。调用函数以获取音调。例如:
渲染音调(command.freq、command.duration)
其他:
#叫休息。例如:
render_rest(命令持续时间)

您还可以通过将上面的
mm.model\u从\u str
更改为
mm.model\u从\u文件

轻松地从外部文件获取您的输入配方,为什么不直接启动python或更好的ipython,从某个地方导入函数
,其余的
并像调用
音调一样调用它们(440,2);其余部分(2)…
?你有什么特别的理由走DSL路线吗?@Igor Dejanović感谢你的想法。我考虑过这一点,但我担心从一次回放到下一次回放,事件的时间可能会略有不同,这可能会导致不同的神经元反应。最好我能够快速创建和播放由函数输出序列生成的.wav,这样每次我播放该序列时,音频都完全相同。啊,明白了。如果您选择这条路线,我已经为textX bellow提供了一个初始解决方案。