L'histoire de la création d'une partition de type Hanon avec Python

introduction

Connaissez-vous le manuel de piano de Hanon? De nombreuses personnes qui ont déjà joué du piano peuvent avoir des souvenirs désagréables. Le manuel de piano de Hanon est un manuel qui vous apprend les rudiments du piano. Voir c'est croire, donc certainement vidéo en cours de lecture et [score](https://ameblo.jp/manana888/entry- Jetez un œil à 11753162091.html). Cette fois, j'avais pour objectif de créer automatiquement des chansons comme les n ° 1 à 20 dans les manuels Hanon Piano.

Langue et outils utilisés

Le langage utilisé est ** Python **. J'ai également utilisé ** music21 **, une bibliothèque de traitement d'informations musicales Python développée par le MIT. En fait, la musique21 elle-même ne crée pas la partition, contrairement à MuseScore et Lilypond. (Cependant, je ne touche pas vraiment MuseScore ou Lilypond, donc je n'ai pas besoin de savoir quoi que ce soit à ce sujet.) En ce qui concerne music21, je suis très reconnaissant à ce blog.

Qu'est-ce que Hanon-ish?

Pour faire un score à la Hanon, vous devez penser à Hanon. J'ai décidé que les conditions suivantes ressemblaient à celles de Hanon. Il peut être difficile pour les personnes qui ne jouent pas de musique de comprendre, alors ce serait bien si vous pouviez penser que vous avez décidé des règles tout en regardant la partition vous-même.

  1. Le premier son est do.
  2. Répétez ce que vous avez fait dans la mesure 1 dans les mesures 2 à 14 (croissant). Lors de la répétition, élevez une note de la mesure précédente.
  3. Les mains droite et gauche sont à l'unisson avec des octaves différentes.
  4. Le même son n'est pas continu.
  5. Gardez le son d'une mesure à moins de 8 degrés.
  6. Les mesures 15 à 28 diminuent.
  7. La première note de la mesure 15 commence par Seo. Faites le contraste du mouvement avec l'ascendant.
  8. La mesure 29 se termine par un étirement.

Mis en œuvre pour créer aléatoirement un score qui remplit ces conditions. En conséquence, une partition comme ce tweet a été créée!

Code source

<détails>

Code source </ summary>

Hanon.py


# -*- coding: utf-8 -*-
from music21 import *
import numpy
import matplotlib
import scipy
import random



#Génération aléatoire
random_num = [-1 for _ in range(8)]
random_num[0] = 0
for i in range(1,8):
    random_num[i] = random.randint(1, 7)
    if i >= 1: #Évitez de porter les mêmes billets que le précédent
        while True:
            if random_num[i] != random_num[i-1]:
                break
            else:
                random_num[i] = random.randint(1, 7)



#Écrivez le score

##D'une certaine manière, la première magie
stream_right = stream.Part()
stream_left = stream.Part()

inst1 = instrument.Instrument()
inst2 = instrument.Instrument()

stream_right.append(inst1)
stream_left.append(inst2)

tc = clef.TrebleClef() #Signe des aigus
bc = clef.BassClef() #Symbole sonore F

stream_right.append(tc)
stream_left.append(bc)

otos = ["C1", "D1", "E1", "F1", "G1", "A1", "B1", "C2", "D2", "E2", "F2", "G2", "A2", "B2", "C3", "D3", "E3", "F3", "G3", "A3", "B3", "C4", "D4", "E4", "F4", "G4", "A4", "B4", "C5", "D5", "E5", "F5", "G5", "A5", "B5", "C6"]



##main droite
for i in range(14): #Escalade
    ###1ère barre
    meas = stream.Measure()
    n0 = note.Note(otos[random_num[0] + 14 + i], quarterLength = 0.25)
    meas.append(n0)
    n1 = note.Note(otos[random_num[1] + 14 + i], quarterLength = 0.25)
    meas.append(n1)
    n2 = note.Note(otos[random_num[2] + 14 + i], quarterLength = 0.25)
    meas.append(n2)
    n3 = note.Note(otos[random_num[3] + 14 + i], quarterLength = 0.25)
    meas.append(n3)
    n4 = note.Note(otos[random_num[4] + 14 + i], quarterLength = 0.25)
    meas.append(n4)
    n5 = note.Note(otos[random_num[5] + 14 + i], quarterLength = 0.25)
    meas.append(n5)
    n6 = note.Note(otos[random_num[6] + 14 + i], quarterLength = 0.25)
    meas.append(n6)
    n7 = note.Note(otos[random_num[7] + 14 + i], quarterLength = 0.25)
    meas.append(n7)
    stream_right.append(meas)
for i in range(14): #Merde
    ###1ère barre
    meas = stream.Measure()
    x = 18
    n0 = note.Note(otos[x + 14 - i], quarterLength = 0.25)
    meas.append(n0)
    n1 = note.Note(otos[x - random_num[1] + 14 - i], quarterLength = 0.25)
    meas.append(n1)
    n2 = note.Note(otos[x - random_num[2] + 14 - i], quarterLength = 0.25)
    meas.append(n2)
    n3 = note.Note(otos[x - random_num[3] + 14 - i], quarterLength = 0.25)
    meas.append(n3)
    n4 = note.Note(otos[x - random_num[4] + 14 - i], quarterLength = 0.25)
    meas.append(n4)
    n5 = note.Note(otos[x - random_num[5] + 14 - i], quarterLength = 0.25)
    meas.append(n5)
    n6 = note.Note(otos[x - random_num[6] + 14 - i], quarterLength = 0.25)
    meas.append(n6)
    n7 = note.Note(otos[x - random_num[7] + 14 - i], quarterLength = 0.25)
    meas.append(n7)
    stream_right.append(meas)
###Dernière mesure
meas = stream.Measure()
n = note.Note("C3", quarterLength = 2)
meas.append(n)
stream_right.append(meas)


##main gauche
for i in range(14): #Escalade
    ###1ère barre
    meas = stream.Measure()
    n0 = note.Note(otos[random_num[0] + 7 + i], quarterLength = 0.25)
    meas.append(n0)
    n1 = note.Note(otos[random_num[1] + 7 + i], quarterLength = 0.25)
    meas.append(n1)
    n2 = note.Note(otos[random_num[2] + 7 + i], quarterLength = 0.25)
    meas.append(n2)
    n3 = note.Note(otos[random_num[3] + 7 + i], quarterLength = 0.25)
    meas.append(n3)
    n4 = note.Note(otos[random_num[4] + 7 + i], quarterLength = 0.25)
    meas.append(n4)
    n5 = note.Note(otos[random_num[5] + 7 + i], quarterLength = 0.25)
    meas.append(n5)
    n6 = note.Note(otos[random_num[6] + 7 + i], quarterLength = 0.25)
    meas.append(n6)
    n7 = note.Note(otos[random_num[7] + 7 + i], quarterLength = 0.25)
    meas.append(n7)
    stream_left.append(meas)
for i in range(14): #Merde
    ###1ère barre
    meas = stream.Measure()
    x = 18
    n0 = note.Note(otos[x + 7 - i], quarterLength = 0.25)
    meas.append(n0)
    n1 = note.Note(otos[x - random_num[1] + 7 - i], quarterLength = 0.25)
    meas.append(n1)
    n2 = note.Note(otos[x - random_num[2] + 7 - i], quarterLength = 0.25)
    meas.append(n2)
    n3 = note.Note(otos[x - random_num[3] + 7 - i], quarterLength = 0.25)
    meas.append(n3)
    n4 = note.Note(otos[x - random_num[4] + 7 - i], quarterLength = 0.25)
    meas.append(n4)
    n5 = note.Note(otos[x - random_num[5] + 7 - i], quarterLength = 0.25)
    meas.append(n5)
    n6 = note.Note(otos[x - random_num[6] + 7 - i], quarterLength = 0.25)
    meas.append(n6)
    n7 = note.Note(otos[x - random_num[7] + 7 - i], quarterLength = 0.25)
    meas.append(n7)
    stream_left.append(meas)
###Dernière mesure
meas = stream.Measure()
n = note.Note("C2", quarterLength = 2)
meas.append(n)
stream_left.append(meas)


##La dernière magie
s = stream.Score()
s.append(stream_right)
s.append(stream_left)
s.show('musicxml')

Vous pouvez également le voir sur GitHub. De là, je vais expliquer le code source séparément. Cependant, je commence tout juste à utiliser la musique21, et je n'en suis pas sûr, et il y a beaucoup de parties qui imitent d'autres personnes, alors veuillez signaler si vous faites une erreur.

Bibliothèques

python


# -*- coding: utf-8 -*-
from music21 import *
import numpy
import matplotlib
import scipy
import random

Autre que aléatoire, il semble nécessaire d'utiliser music21, donc je l'ai importé pour le moment. Je veux créer un nombre aléatoire, je vais donc importer au hasard.

Faire un nombre aléatoire

python


#Génération aléatoire
random_num = [-1 for _ in range(8)]
random_num[0] = 0
for i in range(1,8):
    random_num[i] = random.randint(1, 7)
    if i >= 1: #Évitez de porter les mêmes billets que le précédent
        while True:
            if random_num[i] != random_num[i-1]:
                break
            else:
                random_num[i] = random.randint(1, 7)

Si seulement les 2e à 8e notes de la 1ère mesure sont randomisées, le reste est juste transposé, j'ai donc préparé 7 nombres aléatoires. Je voulais que les nombres correspondent aux nombres, alors j'ai fait les nombres aléatoires dans la gamme de 1 à 8. L'instruction while est tournée pour que le même son ne continue pas.

Préparation à la rédaction d'une partition

python


##D'une certaine manière, la première magie
stream_right = stream.Part()
stream_left = stream.Part()

inst1 = instrument.Instrument()
inst2 = instrument.Instrument()

stream_right.append(inst1)
stream_left.append(inst2)

tc = clef.TrebleClef() #Signe des aigus
bc = clef.BassClef() #Symbole sonore F

stream_right.append(tc)
stream_left.append(bc)

otos = ["C1", "D1", "E1", "F1", "G1", "A1", "B1", "C2", "D2", "E2", "F2", "G2", "A2", "B2", "C3", "D3", "E3", "F3", "G3", "A3", "B3", "C4", "D4", "E4", "F4", "G4", "A4", "B4", "C5", "D5", "E5", "F5", "G5", "A5", "B5", "C6"]

Premièrement, il y a deux parties, la main droite et la main gauche, alors préparez deux parties. Ensuite, ajoutez un symbole d'aigus et un symbole de basse à chaque partie. Enfin, je préparerai les sons à utiliser dans un tableau.

Écrivez une partition! Partie principale! !!

python


##main droite
for i in range(14): #Escalade
    ###1ère barre
    meas = stream.Measure()
    n0 = note.Note(otos[random_num[0] + 14 + i], quarterLength = 0.25)
    meas.append(n0)
    n1 = note.Note(otos[random_num[1] + 14 + i], quarterLength = 0.25)
    meas.append(n1)
    n2 = note.Note(otos[random_num[2] + 14 + i], quarterLength = 0.25)
    meas.append(n2)
    n3 = note.Note(otos[random_num[3] + 14 + i], quarterLength = 0.25)
    meas.append(n3)
    n4 = note.Note(otos[random_num[4] + 14 + i], quarterLength = 0.25)
    meas.append(n4)
    n5 = note.Note(otos[random_num[5] + 14 + i], quarterLength = 0.25)
    meas.append(n5)
    n6 = note.Note(otos[random_num[6] + 14 + i], quarterLength = 0.25)
    meas.append(n6)
    n7 = note.Note(otos[random_num[7] + 14 + i], quarterLength = 0.25)
    meas.append(n7)
    stream_right.append(meas)
for i in range(14): #Merde
    ###1ère barre
    meas = stream.Measure()
    x = 18
    n0 = note.Note(otos[x + 14 - i], quarterLength = 0.25)
    meas.append(n0)
    n1 = note.Note(otos[x - random_num[1] + 14 - i], quarterLength = 0.25)
    meas.append(n1)
    n2 = note.Note(otos[x - random_num[2] + 14 - i], quarterLength = 0.25)
    meas.append(n2)
    n3 = note.Note(otos[x - random_num[3] + 14 - i], quarterLength = 0.25)
    meas.append(n3)
    n4 = note.Note(otos[x - random_num[4] + 14 - i], quarterLength = 0.25)
    meas.append(n4)
    n5 = note.Note(otos[x - random_num[5] + 14 - i], quarterLength = 0.25)
    meas.append(n5)
    n6 = note.Note(otos[x - random_num[6] + 14 - i], quarterLength = 0.25)
    meas.append(n6)
    n7 = note.Note(otos[x - random_num[7] + 14 - i], quarterLength = 0.25)
    meas.append(n7)
    stream_right.append(meas)
###Dernière mesure
meas = stream.Measure()
n = note.Note("C3", quarterLength = 2)
meas.append(n)
stream_right.append(meas)

Commencez par créer la première barre. À cette époque, lorsque j'utilisais l'instruction for, pour une raison quelconque, il n'y avait qu'un seul son dans une mesure, donc je n'avais pas d'autre choix que de l'écrire solidement. Écrivez-le sous forme de note Remarque (hauteur, longueur). La longueur du son est exprimée sous forme de fraction ou de fraction, avec la noire comme 1. Lorsque la première mesure est terminée, répétez-la 14 fois en la transposant pour terminer l'ascendant! Écrivez la ligne inférieure de la même manière. Et n'oubliez pas d'ajouter l'extension de la dernière barre et le tour est joué! !! La main gauche est seulement une octave plus bas, donc je l'ai omise.

Affichage avec Muse Score

python


##La dernière magie
s = stream.Score()
s.append(stream_right)
s.append(stream_left)
s.show('musicxml')

Enfin, affichez ce que vous avez écrit jusqu'à présent dans MuseScore. Vous pouvez également l'afficher dans Lilypond en réécrivant la dernière ligne.

finalement

On m'a dit que je devrais essayer l'apprentissage automatique afin de poursuivre plus de ressemblance avec Hanon, donc j'ai envie de l'essayer (je ne sais rien, donc je dois étudier à partir de 0 ... ). Je souhaite également pouvoir régler le niveau de difficulté en 5 étapes environ. De plus, music21 semble être utilisable pour l'analyse musicale, et il semble que cela puisse vérifier de quel type de ton il s'agit (incroyable), alors j'ai pensé que j'aimerais jouer avec ça aussi.

Recommended Posts

L'histoire de la création d'une partition de type Hanon avec Python
Une histoire sur un amateur faisant une rupture de bloc avec python (kivy) ②
Une histoire sur un amateur faisant une rupture de bloc avec python (kivy) ①
Une histoire d'essayer un monorepo (Golang +) Python avec Bazel
Une histoire sur la création d'une courte chanson par hasard avec Sudachi Py
Une histoire à propos d'un débutant en python coincé avec aucun module nommé'ttp.server '
Une histoire sur l'ajout d'une API REST à un démon créé avec Python
Une histoire sur l'apprentissage automatique avec Kyasuket
L'histoire de la création d'un pilote standard pour db avec python.
Une histoire sur le développement d'un type logiciel avec Firestore + Python + OpenAPI + Typescript
Une histoire sur Python pop and append
L'histoire de la création d'un module qui ignore le courrier avec python
L'histoire de la création d'un robot LINE pour le petit-déjeuner d'une université de 100 yens avec Python
[Python3] Une histoire bloquée avec la conversion du fuseau horaire
Une histoire sur la gestion des données binaires en Python
Une histoire sur l'implémentation d'un écran de connexion avec django
Une histoire sur l'exécution de Python sur PHP sur Heroku
Une histoire sur la modification de Python et l'ajout de fonctions
Zakuzaku automatique, Bitcoin. Une histoire sur un débutant en Python faisant un tableau de contrôle de pièces en 1 minute
J'ai essayé de créer un chargeur de démarrage x86 qui peut démarrer vmlinux avec Rust
Une histoire de prédiction du taux de change avec Deep Learning
L'histoire de la création d'un réseau neuronal de génération musicale
L'histoire de la gestion de theano avec TSUBAME 2.0
Un mémo sur la création d'une application Django (Python) avec Docker
Une histoire sur la façon dont les utilisateurs de Windows 10 ont créé un environnement pour utiliser OpenCV3 avec Python 3.5
Histoire de trébucher avec le tableau Python
Mémorandum sur la corrélation [Python]
[Python] Une histoire sur la création d'un bot LINE avec une fonction humaine pratique sans utiliser Salesforce [API de messagerie]
Faites une loterie avec Python
Un mémorandum sur le simulacre de Python
Automatisez la fabrication des sushis avec Python
Créer un répertoire avec python
Une note sur [python] __debug__
Une note sur l'utilisation de l'API Facebook avec le SDK Python
Une histoire sur la façon de spécifier un chemin relatif en python.
Une histoire de compétition avec un ami dans Othello AI Preparation
Une histoire sur la façon de traiter le problème CORS
Une histoire sur la tentative d'implémentation de variables privées en Python.
L'histoire de la création d'un bot de boîte à questions avec discord.py
L'histoire de la construction d'un serveur de cache PyPI (avec Docker) et de me rendre un peu heureux à nouveau
[Note] Une histoire sur la tentative de remplacer une méthode de classe avec deux barres inférieures dans la série Python 3.
Apprentissage automatique Une histoire sur des personnes qui ne sont pas familiarisées avec GBDT utilisant GBDT en Python
[Python, Selenium, PhantomJS] Une histoire lors de la capture d'un site Web avec une charge paresseuse
[Python] Qu'est-ce qu'une instruction with?
Résoudre ABC163 A ~ C avec Python
Faites fonctionner l'imprimante de reçus avec python
Manuel de graphisme Python avec Matplotlib.
Faisons une interface graphique avec python.
Python: une note sur les classes 1 "Résumé"
Résoudre ABC166 A ~ D avec Python
Créez un simple OMR (lecteur de feuille de marque) avec Python et OpenCV
Créer un environnement virtuel avec Python 3
Résoudre ABC168 A ~ C avec Python
Créer un système de recommandation avec python
[Petite histoire] Obtenez l'horodatage avec Python
Une histoire sur la tentative d'exécuter plusieurs versions de Python (édition Mac)
[Python] Générer un mot de passe avec Slackbot
Résoudre ABC162 A ~ C avec Python
Résoudre ABC167 A ~ C avec Python