Python: Итерация со списком внутри функции

#python #loops #for-loop

Вопрос:

Я пытаюсь использовать элементы из списка внутри цикла for, пытаюсь воспроизвести создание ряда Фибоначчи в музыке, генерируя синусоидальную волну в Python. Функция для генерации синуса.

 def genSine(A, f, phi, fs, t):
    """
    A=amplitude of sin
    f=frequency
    phi = initial phase in rad
    fs= sampl freq
    t= duration
    """
    time = np.arange(0, t, 1.0/fs)
    Y = A * np.sin(2 * np.pi * f * time   phi)
    return Y
 

Это список

fibonacciDigit-это fibonacciSeries, но с одним номером, используемым для вызова примечаний ex: 0 = 311 / 1 = 329 / 2 = 369 / экк…

     fibonacciDigit = [int(x) if x.isdigit() else x 
          for z in fibonacciSeries for x in str(z)]
print(fibonacciDigit)
[0, 1, 1, 2, 3, 5, 8, 1, 3, 2, 1, 3, 4, 5, 5, 8, 9, 1, 4, 4, 2, 3, 3, 3, 7, 7]
 

Список частот/примечания
примечания = [311, 329, 369, 415, 440, 493, 554, 622, 659, 739]
Фибоначчи = [примечания[i] для i в fibonacciDigit]
Это функция для генерации синуса из последовательности Фибоначчи.

 def fibonacciSines(myArray):
 for i in range(len(myArray)):
    xFreq = [x for x in myArray]
    freqFibonacci = genSine(0.2,xFreq,0,44100,1)
 

Я не очень уверен, какой способ лучше всего подходит для получения результата.
Я использую цикл for, связанный с количеством элементов, поэтому у меня будет новый список с точно таким же количеством элементов для каждой ноты, теперь мне нужно передать информацию xFreq в цикл for, надеясь получить новый список из нескольких элементов, это часть «не уверен»: может быть

Код явно не работает. Одна из проблем заключается в том, что я передаю массив функции, которая принимает только значение с плавающей точкой. Мне нужен цикл, потому что я хочу, чтобы функция выполнялась столько же раз, сколько значение в myArray. Я ожидаю получить несколько массивов, а затем объединить их только в один.

Что я ожидаю от этой функции, так это то, что на каждом цикле xFreq равен значению, взятому из myArray (в моем примере приведен список частот, соответствующих fibonacciNotes), так что у меня будет несколько массивов синусов, сгенерированных с разной частотой.

 print(fibonacciNotes)
[311, 329, 329, 369, 415, 493, 659, 329, 415, 369, 329, 415, 440, 493, 493, 659, 739, 329, 440, 440, 369, 415, 415, 415, 622, 622]
 

Общий пример генератора синусов

 # GENERIC SINE GENERATOR
Z = genSine(0.5,1500,1,44100,2)
Y = genSine(0.2,440,1,44100,2)
X = np.concatenate((Z, Y))
print(X)
[0.42073549 0.46846029 0.49487015 ... 0.14512357 0.15346013 0.1611938 ]
 

Комментарии:

1.Вам придется постараться сделать этот пост более понятным. Неясно, какой результат вы хотите, и в коде есть много необъяснимых вещей. Что такое fibonacciDigit ? Где вы пользуетесь fibonacciNotes ? Почему ничего не fibonacciSines возвращает? xFreq это список, но вы передаете его в функцию genSine , которая умножает его на a float np.pi .

2. Работает ли ваш код в настоящее время вообще? Какой результат вы хотите получить и что вы получаете в настоящее время?

3. поделитесь некоторыми примерами ввода-вывода, чтобы мы могли помочь вам найти решение

4. вместо xFreq = [x for x in myArray] этого вы можете использовать xFreq = myArray или xFreq = myArray.copy() , если вам нужно, дублировать его.

5. Я не понимаю вашего вопроса. Я не понимаю, зачем вы вообще используете этот for цикл. Почему бы не отправить myArray напрямую в genSine without for -loop.