Итерация в dict и string с функцией от 2 переменных - PullRequest
0 голосов
/ 07 января 2020

Чтобы сыграть ноту, нам нужно знать ее частоту и как долго она должна играть. Для этого в упражнении у меня есть следующие две переменные:

Словарь под названием 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"

Строки строятся следующим образом:

После каждого символа появляется запятая, за которой следует число, представляющее продолжительность времени, в течение которого персонаж должен играть в. Каждый символ отделен друг от друга знаком da sh. На первом этапе я использовал метод split, чтобы разделить строки символов по дефису. И я проверил, чтобы это было итеративно

Для воспроизведения персонажа я должен использовать скелет Следующий код:

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

Когда функция Beep получает два параметра: частоту персонажа и продолжительности времени, которое будет сыграно. (длительность, частота)

Мне нужно написать программу, которая воспроизводит песню "Little Jonathan" в соответствии со строкой нот в примечаниях (которая обозначает структуру песни), чтобы создать итерацию из вышеприведенного символа. строки и запустите его для l oop, или используйте следующую функцию.

Это мой код до сих пор, не работал хорошо. Как мне продолжить отсюда?

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 

Ответы [ 3 ]

2 голосов
/ 07 января 2020

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])
1 голос
/ 07 января 2020

Во-первых, давайте правильно составим ваши таблицы.

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() и вам нужна функция, которая вызывает 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)
0 голосов
/ 07 января 2020

В вашей переменной notes много странных вещей, поэтому я предполагаю, что это опечатка, и она действительно находится в формате note-duration, разделенных запятой и пробелом.

В этом случае это должно работать:

for i in notes.split(", "):
    winsound.Beep(freqs[i.split("-")[1]], i.split("-")[0])
...