Je crée un programme qui imprime l'échelle de musique que l'utilisateur souhaite utiliser (c'est-à-dire la gamme de do majeur)
La gamme majeure utilise un motif demi-ton qui est 2 - 2 - 1 - 2 - 2 - 2 - 1
Je suis nouveau, donc je ne suis pas sûr de mes autres options. Désolé pour l'ignorance!
keys = ["C", "C#", "D", "D#", "E", "F", "F#", "G", "G#", "A", "A#", "B"]
i = 0
while i < len(keys):
print(keys[i])
i += 2
# Output after being run:
C
D
E
F#
G#
A#
# Expected output
C
D
E
F
G
A
B
Je m'excuse si cela est mal expliqué.
3 Réponses :
Une façon de le faire serait de conserver les incréments dans un tableau eux-mêmes, et d'itérer dessus:
# ...
for increment in steps:
print(keys[i % len(keys)])
i += increment
Si vous vouliez commencer par une note autre que C, vous besoin d'éviter les erreurs "index hors limites" en prenant le reste de i / len (clés) :
keys = # ...
steps = [2, 2, 1, 2, 2, 2, 1]
i = 0
for increment in steps:
print(keys[i])
i += increment
Ouah merci. C'est assez incroyable. Alors que faire si je voulais commencer à un indice différent de 0 (aka «C»). Et si je voulais commencer à l'index 4 (alias «E»)?
Jetez un œil à ma réponse, que j'ai postée spécifiquement pour remédier à cette situation ...
L'approche de @ larsks fonctionnerait, ou vous pourriez simplement prendre le reste de i divisé par le nombre de clés. (Je mettrai à jour ma réponse pour l'inclure.)
Vous devez définir le modèle quelque part pour y parvenir. Une liste est une structure de données appropriée à cet effet, par exemple:
...
i = 2 # D
for p in pattern_major:
print(keys[i])
i = (i + p) % len(keys)
Maintenant, cela ne fonctionnera que pour C majeur car il manquera de clés si vous commencez avec une clé différente. Pour le rendre circulaire, essayez ceci (pour le ré majeur, par exemple):
keys = ["C", "C#", "D", "D#", "E", "F", "F#", "G", "G#", "A", "A#", "B"]
pattern_major = [2, 2, 1, 2, 2, 2, 1]
i = 0
for p in pattern_major:
print(keys[i])
i += p
Les réponses existantes ici sont en grande partie correctes, mais ne fonctionneront que pour la clé de C. Si vous deviez commencer par une autre note, votre code échouerait avec:
D E F# G A B C#
C'est parce qu'à partir de, disons, D et en suivant le modèle d'incrémentation, vous finissez par tomber de la fin du tableau keys . Une façon de résoudre ce problème consiste à ajouter le tableau keys à lui-même, comme ceci:
selected_key = 'D'
keys = ["C", "C#", "D", "D#", "E", "F", "F#", "G", "G#", "A", "A#", "B"]
major_scale = [2, 2, 1, 2, 2, 2, 1]
mark = keys.index(selected_key)
for inc in major_scale:
print((keys + keys)[mark]) # <-- Here is where we double the keys array
mark += inc # to avoid falling off the end.
Ce qui précède donnerait:
XXX
Putain de merde je t'aime pour tes connaissances !! C'était exactement ce dont j'avais besoin: D
Cela vous dérange-t-il d'expliquer cela? Désolé si c'est trop demander ... Je veux juste comprendre pourquoi tu as fait ce que tu as fait! @larsks
Je fais juste en sorte que le tableau keys ressemble à ["C", "C #", "D", "D #", "E", "F", "F #", "G", "G #", "A", "A #", "B", "C", "C #", "D", "D #", "E", "F", "F #", "G "," G # "," A "," A # "," B "] , de sorte que si vous commencez par, disons, D et montez sur une échelle majeure, vous pouvez aller passé B et continuez vers C # sans manquer d'éléments. Cela se produit dans l'expression (clés + clés) ; avec des listes, + ajoute les deux listes ensemble.
Je ne connais pas grand chose à l ' Echelle de Do majeur , mais vous imprimez uniquement les éléments sans cardinal (
#), est-ce un motif ou juste une coïncidence?C'est le modèle. Disons que je voulais utiliser D Major au lieu de C Major. Je commencerais à D et utiliserais le modèle, ce qui me donnerait: D, E, F #, G, A, B, C #
Si c'est un modèle, pourquoi ne pas utiliser
sinon "#" dans la clépour faire quelque chose? Désolé pour mon manque de qualités musicales!@PedroLobito Parce qu'il n'est pas nécessaire que ce soit en do majeur. Le PO a publié cela à titre d'exemple seulement.
@Selcuk Ok, j'ai compris ce que veut OP après avoir vu votre réponse.