0

为了演奏一个音符,我们需要知道它的频率以及它应该演奏多长时间。为此,在练习中我有以下两个变量:

一个名为 freqs 的字典,其中键是表示字符名称的字符串,值是表示频率的数字。

freqs = {"la": 220,
         "si": 247,
         "do": 261,
         "re": 293,
         "mi": 329,
         "fa": 349,
         "sun": 392,
         }

以及包含歌曲音符的弦乐:

notes =
"sol,250-mi,250-mi,500-fa,250-re,250-re,500-do,250-re,250-mi,250-fa,250-sol,250-sol,250-sol,500"

字符串的构造如下:

每个字符后面都有一个逗号,后面跟着一个数字,表示该角色应该玩的时间长度。每个字符由破折号相互分隔。在第一阶段,我使用 split 方法通过连字符分割字符串。我检查了它是可迭代的

为了扮演一个角色,我应该使用骨架 下一个代码:

import winsound
...
winsound.Beep (frequency, duration)

当 Beep 函数接收两个参数时:一个字符的频率和播放的时间长度。(持续时间、频率)

我需要编写一个程序,根据音符中的音符串(表示歌曲的结构)播放歌曲“小乔纳森”,以从上述字符串创建可迭代并运行它进行循环,或使用下一个功能。

到目前为止,这是我的代码,效果不佳。我该如何从这里开始?

def Beep(frequency, duration ):

    for word in duration:
          yield frequency[word]

frequency={"la": 220,"si": 247,"do": 261,"re": 293,"mi": 329,"fa": 
           349,"sol": 392,
          }

res = Beep(['sol,250', 'mi,250', 'mi,500', 'fa,250', 're,250', 're,500', 'do,250', 're,250', 'mi,250', 'fa,250', 'sol,250', 'sol,250', 'sol,500'],frequency)


print(next(res))

所需的输出:

250,392  
500,329  
250,349  
250,293  
500,293  
250,261  
250,293  
250,329  
250,349  
250,392 
250,392 
500,392 
4

3 回答 3

2

Beep期望单个频率和该频率的持续时间。

您需要为音符串中的每个音符发出哔哔声。因此,您需要以一种可以使用所述音符的频率和持续时间的方式迭代音符。假设你已经用笔记填充了 1 个数组,用持续时间填充了 1 个数组,你可以这样做

for note, duration in zip(notes, durations):
    winsound.Beep(freqs[note], duration)

如果您尚未拆分字符串,您可以迭代字符串的拆分结果。

for note in notes.split('-'):
   winsound.Beep(freqs(note.split(',')[1], note.split(',')[0])
于 2020-01-07T14:44:43.213 回答
1

首先,让我们正确地获取您的表格。

notes = "sol,250-mi,250-mi,500-fa,250-re,250-re,500-do,250-re,250-mi,250-fa,250-sol,250-sol,250-sol,500"

song = []
for block in notes.split('-'):
    note, duration = block.split(',')
    song.append((note, int(duration)))

然后是函数。我假设你正在使用winsound.Beep()并且你想要一个函数为你的每个 note:duration 对调用 Beep song。如果是这样,以下函数将完成这项工作。

def play(song):
    freq_table = {
        "la": 220,
        "si": 247,
        "do": 261,
        "re": 293,
        "mi": 329,
        "fa": 349,
        "sol": 392,
    }
    for note, duration in song:
        frequency = freq_table[note]
        print(frequency, duration)
        winsound.Beep(frequency, duration)

play(song)
于 2020-01-07T14:56:32.977 回答
0

你的变量中有很多奇怪的东西notes,所以我假设它是一个错字,它确实是note-duration用逗号和空格分隔的格式。

在这种情况下,这应该工作:

for i in notes.split(", "):
    winsound.Beep(freqs[i.split("-")[1]], i.split("-")[0])
于 2020-01-07T14:39:51.447 回答