#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
, которая умножает его на afloat
np.pi
.2. Работает ли ваш код в настоящее время вообще? Какой результат вы хотите получить и что вы получаете в настоящее время?
3. поделитесь некоторыми примерами ввода-вывода, чтобы мы могли помочь вам найти решение
4. вместо
xFreq = [x for x in myArray]
этого вы можете использоватьxFreq = myArray
илиxFreq = myArray.copy()
, если вам нужно, дублировать его.5. Я не понимаю вашего вопроса. Я не понимаю, зачем вы вообще используете этот
for
цикл. Почему бы не отправитьmyArray
напрямую вgenSine
withoutfor
-loop.