4

我来自音乐背景,所以我对将音乐集理论实现到 Python 脚本中很感兴趣。

基本上,音符的变量分配给数字(C = 0,C sharp = 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 升是一个完美的五度分开)。

我想我需要这样的东西,但我不知道如何实现它。

if answer >= 12:
    answer - 12

有没有人有任何想法?有没有更好的方法来做到这一点?

4

3 回答 3

5

有一个模运算符%它正是这样做的(另见这里):

print((11 + 7) % 12)

或更一般地说:

def add_wrap_overflow(x,y):
    return (x+y) % 12
于 2016-06-04T08:52:10.173 回答
0

您的解决方案几乎是正确的;然而,answer - 12它只是一个表达式,即它计算出的值answer - 12没有任何附加效果。

您需要创建一个将该值分配给某个变量的语句(在这种情况下,是同一个):

answer = answer - 12.

Python 提供了一种简短的编写方式(尽管您应该避免使用它,因为它可能会让初学者感到困惑):

answer -= 12.

但是,在您的情况下,模运算符可能更有用:

answer = answer % 12 或者 answer %= 12

简而言之,模运算符减去或加 12直到答案出现range(0, 12)(从 0 到 11 的数字之一)。

于 2016-06-04T09:01:17.010 回答
0

我会将您的代码更正为

if (answer >= 12):
    answer = answer - 12
于 2016-06-04T09:06:22.310 回答