Die Geschichte, mit Python eine Hanon-ähnliche Partitur zu machen

Einführung

Kennen Sie das Hanon Piano Textbook? Viele Menschen, die Erfahrung im Klavierspielen haben, haben möglicherweise unangenehme Erinnerungen. Das Hanon Piano Textbook ist ein Lehrbuch, das Ihnen die Grundlagen des Klavierspiels vermittelt. Sehen ist Glauben, also auf jeden Fall Video wird abgespielt und [Punktzahl](https://ameblo.jp/manana888/entry- Schauen Sie sich 11753162091.html an. Dieses Mal wollte ich automatisch Songs wie Nr. 1 bis 20 in den Hanon Piano-Lehrbüchern erstellen.

Sprache und verwendete Werkzeuge

Die verwendete Sprache ist ** Python **. Ich habe auch ** music21 ** verwendet, eine vom MIT entwickelte Python-Bibliothek zur Verarbeitung von Musikinformationen. Tatsächlich erstellt music21 selbst nicht die Partitur, MuseScore und Lilypond jedoch. (Allerdings berühre ich MuseScore oder Lilypond nicht wirklich, daher muss ich nichts darüber wissen.) In Bezug auf music21 bin ich [diesem Blog] sehr dankbar (https://ameblo.jp/delphinus1024/entry-12365205195.html).

Was ist Hanon-ish?

Um eine Hanon-ähnliche Punktzahl zu erzielen, müssen Sie an Hanon-ähnliche Ergebnisse denken. Ich entschied, dass die folgenden Bedingungen Hanon-ähnlich sind. Es kann für Leute, die keine Musik spielen, schwierig sein, dies zu verstehen. Es wäre also schön, wenn Sie glauben könnten, Sie hätten die Regeln festgelegt, während Sie sich die Partitur selbst angesehen haben.

  1. Der erste Ton ist do.
  2. Wiederholen Sie das, was Sie in Takt 1 getan haben, in Takt 2-14 (aufsteigend). Erhöhen Sie beim Wiederholen eine Note aus dem vorherigen Takt.
  3. Die rechte und die linke Hand stimmen mit verschiedenen Oktaven überein.
  4. Der gleiche Ton ist nicht kontinuierlich.
  5. Halten Sie den Klang eines Balkens innerhalb von 8 Grad.
  6. Die Maßnahmen 15-28 gehen zurück.
  7. Die erste Note in Takt 15 beginnt mit Seo. Stellen Sie die Bewegung in Kontrast zum Aufstieg.
  8. Takt 29 endet mit einer Dehnung.

Wird implementiert, um zufällig eine Punktzahl zu erstellen, die diese Bedingungen erfüllt. Als Ergebnis wurde eine Punktzahl wie dieser Tweet erstellt!

Quellcode

Quellcode

Hanon.py


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



#Zufällige Generierung
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: #Vermeiden Sie es, die gleichen Noten wie die vorherige zu tragen
        while True:
            if random_num[i] != random_num[i-1]:
                break
            else:
                random_num[i] = random.randint(1, 7)



#Schreiben Sie die Partitur

##Irgendwie die erste 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() #Höhenzeichen
bc = clef.BassClef() #F Tonsymbol

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"]



##rechte Hand
for i in range(14): #Klettern
    ###1. Bar
    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): #Mist
    ###1. Bar
    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)
###Letzte Maßnahme
meas = stream.Measure()
n = note.Note("C3", quarterLength = 2)
meas.append(n)
stream_right.append(meas)


##linke Hand
for i in range(14): #Klettern
    ###1. Bar
    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): #Mist
    ###1. Bar
    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)
###Letzte Maßnahme
meas = stream.Measure()
n = note.Note("C2", quarterLength = 2)
meas.append(n)
stream_left.append(meas)


##Die letzte Magie
s = stream.Score()
s.append(stream_right)
s.append(stream_left)
s.show('musicxml')

Sie können es auch auf GitHub sehen. Von hier aus werde ich den Quellcode separat erklären. Ich habe jedoch gerade angefangen, music21 zu verwenden, und ich bin mir nicht sicher, und es gibt viele Teile, die ich anderen Menschen nacheifere. Bitte weisen Sie darauf hin, wenn Sie einen Fehler machen.

Bibliotheken

python


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

Anders als zufällig scheint es notwendig zu sein, music21 zu verwenden, also habe ich es vorerst importiert. Ich möchte eine Zufallszahl erstellen, daher importiere ich eine Zufallszahl.

Machen Sie eine Zufallszahl

python


#Zufällige Generierung
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: #Vermeiden Sie es, die gleichen Noten wie die vorherige zu tragen
        while True:
            if random_num[i] != random_num[i-1]:
                break
            else:
                random_num[i] = random.randint(1, 7)

Wenn nur die 2. bis 8. Note des 1. Takts zufällig angeordnet sind, wird der Rest nur transponiert, sodass wir 7 Zufallszahlen vorbereitet haben. Ich wollte, dass die Zahlen den Zahlen entsprechen, also habe ich die Zufallszahlen im Bereich von 1-8 gemacht. Die while-Anweisung wird so gedreht, dass derselbe Sound nicht fortgesetzt wird.

Vorbereitung zum Schreiben einer Partitur

python


##Irgendwie die erste 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() #Höhenzeichen
bc = clef.BassClef() #F Tonsymbol

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"]

Erstens gibt es zwei Teile, die rechte und die linke Hand. Bereiten Sie also zwei Teile vor. Fügen Sie dann jedem Teil ein Höhensymbol und ein Höhensymbol hinzu. Schließlich werde ich die Sounds vorbereiten, die in einem Array verwendet werden sollen.

Schreibe eine Partitur! Hauptteil! !!

python


##rechte Hand
for i in range(14): #Klettern
    ###1. Bar
    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): #Mist
    ###1. Bar
    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)
###Letzte Maßnahme
meas = stream.Measure()
n = note.Note("C3", quarterLength = 2)
meas.append(n)
stream_right.append(meas)

Erstellen Sie zunächst den ersten Balken. Zu diesem Zeitpunkt, als ich die for-Anweisung verwendete, gab es aus irgendeinem Grund nur einen Ton in einem Takt, so dass ich keine andere Wahl hatte, als ihn solide zu schreiben. Schreiben Sie es als Notiz. Hinweis (Tonhöhe, Länge). Die Länge des Klangs wird als Bruch oder Bruch ausgedrückt, wobei die Viertelnote 1 ist. Wenn der erste Takt abgeschlossen ist, wiederholen Sie ihn 14 Mal, während Sie ihn transponieren, um den Aufstieg abzuschließen! Schreiben Sie die untere Zeile auf die gleiche Weise. Und vergessen Sie nicht, die Erweiterung des letzten Balkens hinzuzufügen, und fertig! !! Die linke Hand ist nur eine Oktave tiefer, also habe ich sie weggelassen.

Anzeige mit Muse Score

python


##Die letzte Magie
s = stream.Score()
s.append(stream_right)
s.append(stream_left)
s.show('musicxml')

Zeigen Sie abschließend an, was Sie bisher in MuseScore geschrieben haben. Sie können es auch in Lilypond anzeigen, indem Sie die letzte Zeile neu schreiben.

Schließlich

Mir wurde gesagt, dass ich maschinelles Lernen ausprobieren sollte, um mehr Hanon-ness zu erreichen, also habe ich den Wunsch, es zu versuchen (ich weiß nichts, also muss ich von 0 lernen ... ). Ich möchte auch in der Lage sein, den Schwierigkeitsgrad in ungefähr 5 Schritten anzupassen. Außerdem scheint music21 für die Musikanalyse verwendbar zu sein, und es scheint, dass es überprüfen kann, welche Art von Ton es ist (erstaunlich), also dachte ich, dass ich auch damit spielen möchte.

Recommended Posts

Die Geschichte, mit Python eine Hanon-ähnliche Partitur zu machen
Eine Geschichte über einen Amateur, der mit Python (Kivy) einen Blockbruch macht ②
Eine Geschichte über einen Amateur, der mit Python (Kivy) einen Blockbruch macht ①
Eine Geschichte über das Ausprobieren eines (Golang +) Python-Monorepo mit Bazel
Eine Geschichte über das zufällige Erstellen eines kurzen Songs mit Sudachi Py
Eine Geschichte über einen Python-Anfänger, der mit dem No-Modul'http.server 'feststeckt.
Eine Geschichte über das Hinzufügen einer REST-API zu einem mit Python erstellten Daemon
Eine Geschichte über maschinelles Lernen mit Kyasuket
Die Geschichte, einen Standardtreiber für db mit Python zu erstellen.
Eine Geschichte über die Entwicklung eines weichen Typs mit Firestore + Python + OpenAPI + Typescript
Eine Geschichte über Python Pop und Append
Die Geschichte, ein Modul zu erstellen, das E-Mails mit Python überspringt
Die Geschichte, wie man mit Python einen 100-Yen-Frühstücks-Bot für die Universität macht
[Python3] Eine Geschichte, die bei der Zeitzonenkonvertierung steckt
Eine Geschichte über den Umgang mit Binärdaten in Python
Eine Geschichte über die Implementierung eines Anmeldebildschirms mit Django
Eine Geschichte über das Ausführen von Python auf PHP auf Heroku
Eine Geschichte über das Ändern von Python und das Hinzufügen von Funktionen
Automatisches Zakuzaku, Bitcoin. Eine Geschichte über einen Python-Anfänger, der ein 1-Minuten-Diagramm für Münzprüfungen erstellt
Ich habe versucht, einen x86-Bootloader zu erstellen, der vmlinux mit Rust booten kann
Eine Geschichte über die Vorhersage des Wechselkurses mit Deep Learning
Die Geschichte eines neuronalen Netzwerks der Musikgeneration
Die Geschichte, wie theano mit TSUBAME 2.0 verwaltet wurde
Ein Memo zum Erstellen einer Django (Python) -Anwendung mit Docker
Eine Geschichte darüber, wie Windows 10-Benutzer eine Umgebung für die Verwendung von OpenCV3 mit Python 3.5 erstellt haben
Stolpern Geschichte mit Python-Array
Memorandum über Korrelation [Python]
[Python] Eine Geschichte über das Erstellen eines LINE-Bots mit einer praktischen bemannten Funktion ohne Verwendung von Salesforce [Messaging-API]
Machen Sie eine Lotterie mit Python
Ein Memorandum über den Python-Mock
Automatisieren Sie die Sushi-Herstellung mit Python
Erstellen Sie ein Verzeichnis mit Python
Ein Hinweis zu [Python] __debug__
Ein Hinweis zum Aufrufen der Facebook-API mit dem Python SDK
Eine Geschichte darüber, wie man einen relativen Pfad in Python angibt.
Eine Geschichte über den Wettbewerb mit einem Freund in Othello AI Preparation
Eine Geschichte über den Umgang mit dem CORS-Problem
Eine Geschichte über den Versuch, private Variablen in Python zu implementieren.
Die Geschichte, wie man mit discord.py einen Fragenkasten-Bot erstellt
Die Geschichte, einen PyPI-Cache-Server (mit Docker) aufzubauen und mich wieder ein wenig glücklich zu machen
[Hinweis] Eine Geschichte über den Versuch, eine Klassenmethode mit zwei Unterbalken in der Python 3-Serie zu überschreiben.
Maschinelles Lernen Eine Geschichte über Menschen, die mit GBDT in GBDT in Python nicht vertraut sind
[Python, Selenium, PhantomJS] Eine Geschichte beim Scrapen einer Website mit fauler Last
[Python] Was ist eine with-Anweisung?
Löse ABC163 A ~ C mit Python
Bedienen Sie den Belegdrucker mit Python
Python-Grafikhandbuch mit Matplotlib.
Lassen Sie uns eine GUI mit Python erstellen.
Python: Ein Hinweis zu Klasse 1 "Abstract"
Löse ABC166 A ~ D mit Python
Erstellen Sie mit Python und OpenCV ein einfaches OMR (Mark Sheet Reader)
Erstellen einer virtuellen Umgebung mit Python 3
Löse ABC168 A ~ C mit Python
Erstellen Sie ein Empfehlungssystem mit Python
[Kleine Geschichte] Holen Sie sich mit Python einen Zeitstempel
Eine Geschichte über den Versuch, mehrere Python-Versionen auszuführen (Mac Edition)
[Python] Generiere ein Passwort mit Slackbot
Löse ABC162 A ~ C mit Python
Löse ABC167 A ~ C mit Python