2016-06-04 3 views
4

Я родом из музыкального фона, так что я был заинтересован в реализации набора теории музыки в сценарий Python.вычитая 12, когда сумма двух переменных больше или равна 12

В основном переменные музыкальных нот присвоены номера (C = 0, С = 1 острые и т.д.). Однако теория музыкальных множеств работает только до числа 11, так как B = 11, а следующий C снова будет = 0.

Я уже назначил некоторые переменные, они выглядят так.

# pitch classes 
Bs = C = 0 
Cs = Db = 1 
D = 2 
Ds = Eb = 3 
E = Fb = 4 
F = Es = 5 
Fs = Gb = 6 
G = 7 
Gs = Ab = 8 
A = 9 
As = Bb = 10 
B = Cb = 11 

# intervals 
m2 = 1 
mj2 = 2 
m3 = 3 
mj3 = 4 
P4 = 5 
T = 6 
P5 = 7 
m6 = 8 
mj6 = 9 
m7 = 10 
mj7 = 11 

Я хочу, чтобы иметь возможность добавлять заметки и интервалы вместе, например, B плюс идеальный 5. Как правило, это будет 11 + 7 = 18, но я хочу, чтобы равняться 6 (с 6 = F диез , и B и F sharp - идеальное 5-е место).

Я думаю, что мне нужно что-то вроде этого, но я понятия не имею, как ее реализовать.

if answer >= 12: 
    answer - 12 

У кого-нибудь есть идеи? Есть ли лучший способ сделать это?

ответ

4

Там в modulo operator, %, который делает именно это (см также here):

print((11 + 7) % 12) 

или более общо:

def add_wrap_overflow(x,y): 
    return (x+y) % 12 
+0

нафига это сейчас кажется настолько очевидным, спасибо так много. В любом случае я могу что-то написать, поэтому мне не нужно набирать «print ((x + z)% 12) для каждой операции? – AlexC

+0

Я не совсем понимаю. Вы можете определить функцию, например. 'module_add (x, y)', который делает это для вас, но вы должны будете каждый раз вызывать эту функцию - см. обновленный ответ – DomTomCat

+0

Хорошо, я, вероятно, немного из глубины, я тоже не совсем понимаю. Ваш первый ответ - именно то, что я искал, спасибо! – AlexC

0

Ваше решение почти правильно; однако answer - 12 является просто выражением, то есть оно оценивает значение answer - 12 без какого-либо дополнительного эффекта.

Вы должны сделать заявление о том, что присваивает значение некоторой переменной (в данном случае, тот же один):

answer = answer - 12.

Python предлагает краткий способ написания этого (хотя вы должны избегать его, как это может ввести в заблуждение новичков):

answer -= 12.

Однако в вашем случае, оператор по модулю может быть более полезным:

answer = answer % 12 или answer %= 12

Короче говоря, оператор по модулю вычитает или добавляет 12 до ответ в range(0, 12) (один из числа от 0 до 11).

0

Я бы исправить свой код, как

if (answer >= 12): 
    answer = answer - 12 
+0

Почему дополнительные брекеты? – DomTomCat

Смежные вопросы