Rekonstruktion von Midi aus Synthesia-Videos (und ähnlichem)

Als ich einmal auf YouTube saß und nach interessanten Lehrmelodien suchte, stieß ich auf Videos von Synthesia, von denen einige mir sehr gut gefallen haben. Ich entschied mich, sie herunterzuladen und zu lernen ... =) Aber leider stellte sich heraus, dass es Videos gibt, aber niemand wollte MIDI-Dateien hochladen = (


Als ich mich für Google entschied, wollte ich herausfinden, ob es vorgefertigte Lösungen gibt, die zu mir passen, aber leider aufgrund der Tatsache, dass es nur Audiokonverter im Midi gab, was mich leicht verärgerte ... Ohne zweimal darüber nachzudenken, entschied ich, dass es ausreichen würde, die MIDI-Bildrate in Videoclips wiederherzustellen ..., und ich beschloss zu versuchen, dieses Geschäft umzusetzen ...


Ich wollte nicht alles von Grund auf neu schreiben, weil ich beschlossen habe, was ich mit den vorgefertigten Komponenten tun möchte, die Debian GNU / Linux mir zur Verfügung stellt, von denen Python am besten geeignet ist.


Zu Beginn der Implementierung habe ich beschlossen, fertige (aus Videoclips herausgezogene) Bilder zu verwenden, aber nach den ersten Uploads wurde mir klar, dass dies keinen Sinn ergibt. Es stellte sich heraus, dass es sehr langsam war und auch erhebliche Ressourcen für die Schraube verbrauchte. Dann entschied ich mich, eine neue Sache für mich selbst auszuprobieren OpenCV (ich wollte es schon lange spüren) stellte sich heraus, dass OpenCV sehr gut mit dem Videostream zusammenarbeitet und alle Funktionen bietet, die ich benötige (Pixel zählen, Frames anzeigen und Text).


Das Öffnen einer Videodatei und das Empfangen eines Frames kann beispielsweise in zwei Zeilen beschrieben werden:


vidcap = cv2.VideoCapture('test.mp4') success,image = vidcap.read() 

Und wenn Sie möchten, können Sie sofort Rahmen auf die Schraube werfen:


 cv2.imwrite("/tmp/frame%d.jpg" % frame, image) 

Nach einiger Zeit schrieb ich eine Funktion, um die Positionen der Tasten der virtuellen Tastatur zu generieren und sie (in Form von Rechtecken) über dem Stream-Bild anzuzeigen und das Bild hochzuladen. Es stellte sich Folgendes heraus:
Bild


Nachdem ich mich für Frame für Frame entschieden habe, lese ich beim Lesen des Bildes aus dem Videostream die aktiven Notizen von der Position der virtuellen Tasten (nur Noten, deren Pixel mit der Referenzfarbe übereinstimmen oder nicht weit davon entfernt sind) als aktiv und sende sie an Midi. Ich konnte Notizen nicht einfach registrieren, als ob die Situation auf einer normalen Midi-Tastatur wäre, es ist nur ein bisschen einfacher ... Ich habe das Video überprüft und gesehen, wie viele Notizen ich habe (und es gab viele davon). Ich dachte nicht schlecht, ich musste nur herausfinden, wie man Notizen in eine Datei schreibt und nach etwas sucht , fand ein tolles Python-Midiutil-Python-Paket. Nach einiger Zeit konnte ich Noten im Midi aufnehmen. Wie sich herausstellte, ist Python-Midiutil ein sehr einfacher und sehr benutzerfreundlicher Beutel. Das Erstellen einer Datei und das Hinzufügen von Notizen erfolgt beispielsweise in mehreren Zeilen:


 mf.addTrackName(track, time, "Sample Track") mf.addTempo(track, time, 60 ) mf.addNote(track, channel, pitch, keytime, duration, volume) with open(outputmid, 'wb') as outf: mf.writeFile(outf) 

Das Herunterladen des resultierenden Midi in LMMS erwies sich als recht erfolgreich. Zunächst habe ich einige meiner Lieblingslieder restauriert. Dann wurde klar, dass die Funktion zum Generieren von Schlüsselpositionen von Rolle zu Rolle nicht sehr praktisch war, ihre Position änderte sich, ich entschied mich für eine grafische Benutzeroberfläche, ich machte eine einfache, aber mit einer Tastenplatzierungsfunktion


Bild


Ich denke, dass dieses Programm für viele nützlich sein kann, weil ich alles auf dem Github gepostet habe

Source: https://habr.com/ru/post/de450710/


All Articles