Как изменить аргумент, чтобы следующая итерация использовала измененное значение - PullRequest
0 голосов
/ 15 апреля 2020

Я пытаюсь использовать тоны, чтобы играть случайно сгенерированную гитарную вкладку. Есть 3 ноты (нота 1 («О», нота 2 (1) и отключение звука (X)). Есть также устойчивые ноты («о»). Это означает, что любая нота, сыгранная последней, будет играть полную ноту (т. Е. Не вызывать time.break () после тона) и будет удерживать этот тон для устойчивой партии. Однако вы не можете сохранить приглушенную ноту. Существуют также скобки, которые делят нотацию пополам, и более или менее бесполезные приглушения ладони прямо сейчас.

Я просто использую счетчик, чтобы посмотреть вперед на следующее значение, и если это значение сустейна. Я делаю это путем преобразования исходного аргумента в список, изменения следующего значения в соответствии с текущей заметкой, и возвращаю его обратно. Однако аргумент не «запоминает» это изменение, когда он повторяет следующий символ в строке.

Я очень новичок в программировании, поэтому я уверен, что это просто исправить, но никакая документация или форумы пока не помогли.

from pysine import sine
import time

bar = ['1', 'O', 'o', 'o', 'X', '1']
master_tuning = 450
n1f = master_tuning
n2f = master_tuning-70
sleep_time = .05
mutef = master_tuning-260
nchunks = -1
phrase_int = 4
notes_int = 4

def notes_to_tones(ilist):
    n = 0
    speed_val = .26
    for i in ilist:
        print(i)
        if i == "[":
            speed_val = speed_val/2
            n += 1
        if i == "]":
            speed_val = speed_val*2
            n += 1
        if i == "1":
            if ilist[n+1] == "o":
                ilist2 = list(ilist)
                ilist2[n+1] = "1"
                ilist = str(ilist2)
                sine(frequency=n1f, duration=speed_val+sleep_time)
                n += 1
            if ilist[n+1] != "o":
                sine(frequency=n1f, duration=speed_val)
                time.sleep(sleep_time)
                n += 1
            continue
        if i == "O":
            if ilist[n+1] == "o":
                ilist2 = list(ilist)
                ilist2[n+1] = "O"
                ilist = str(ilist2)
                print(ilist)
                sine(frequency=n2f, duration=speed_val+sleep_time)
                n += 1
            if ilist[n+1] != "o":
                sine(frequency=n2f, duration=speed_val)
                time.sleep(sleep_time)
                n += 1
            continue
        if i == "X":
            sine(frequency=mutef, duration=speed_val-(speed_val*.1))
            # time.sleep(sleep_time - speed_val*.1)
        if i == "-":
            time.sleep(speed_val)
            time.sleep(sleep_time)

def build_and_play(var):
    sub_notes_list = []
    bars_final = []
    for i in range((len(var))):
        sub_final = var[i * notes_int : (i +1) * notes_int]
        sub_notes_list.append(sub_final)
    # print(sub_notes_list)
    n = 0
    for n in range(phrase_int):
        single_bar = sub_notes_list[n]
        single_bar = "".join(single_bar)
        bars_final.append(single_bar)
        n += 1
    bars_final = "".join(bars_final)
    bars_final = bars_final.replace("][", "")
    print_length = ("-"*(len(bars_final)-(phrase_int-1)))
    print(print_length)
    print(bars_final)
    print(print_length)
    notes_to_tones(bars_final)

build_and_play(bar)

Я пытался изменить ifs на elifs, переназначить аргумент новой переменной в функции note_to_tones, изменив t Область видимости переменных, и даже удалил аргумент и попытался использовать вместо него глобальную переменную.

---
1OooX1
---
1
O
['1', 'O', 'O', 'o', 'X', '1']
o
o
X
1

Как видите, функция изменяет следующее значение в строке, но я полностью потерян о том, как обновить аргумент новыми значениями, чтобы я мог иметь несколько постоянных заметок подряд. Спасибо за любую помощь!

...