Musik Transkription von Wav-Dateien in Java

8

Ich habe ein Projekt über Musiktranskription mit Java, das Ding ist ,, Ich habe ein Applet erstellt, das Ton aufzeichnet und es in einer WAV-Datei speichert, der Spieler sollte nur das Stück spielen, das er / sie gerne transkribieren würde, danach Ich stecke an dem Punkt fest, an dem ich Informationen aus der gespeicherten WAV-Datei erhalten und diese Informationen verwenden muss, um eine MIDI-Datei zu erzeugen, und nachdem ich die MIDI-Datei erstellt habe, muss ich eine Musical-Partitur dafür und alle diese erzeugen muss in Java gemacht werden.

Ich habe überall nach einer klaren Erklärung gesucht, wie diese Sachen gemacht werden können, aber ich habe nichts Direktes gefunden :( Da ich neu in Java bin, möchte ich, dass mir irgendjemand dabei hilft, die Themen, die ich bin Probleme mit der Programmierung sind:

  1. Informationen zu den gespielten Noten in der WAV-Datei erhalten.
  2. Kenntnis der Notizen.
  3. Erstellen einer MIDI-Datei, die der WAV-Datei entspricht.
  4. Erzeuge eine SCORE aus der MIDI-Datei.

Ich habe auch die Fast Fourier Transformation nach der Segmentierung an den gelesenen Daten versucht, aber ich denke, das ging absolut in die falsche Richtung: (

Bitte, wenn jemand mir zu den oben genannten Themen helfen kann, und wie man diese nur in Java programmiert, wäre das sehr geschätzt:)

Übrigens ist das Projekt:
Spieler spielt Noten auf Piano & gt; & gt; Zeichnet sein Spiel auf & gt; & gt; Der Spieler erhält den SCORE seines Spiels.

    
Xtremeaiy 07.02.2011, 08:40
quelle

5 Antworten

3

Ich bin auf diesem Gebiet kein Experte, also entschuldige ich mich im Voraus, wenn das alles Unsinn ist.

Um die Notizen aus der Datei zu erhalten, müssen Sie eine FFT (Fast Fourier Transformation) auf der WAV-Datei, aber mit nur 10ms Ton auf einmal. Dann finden Sie den höchsten Peak auf der FFT für diesen Zeitrahmen, und gehen Sie zum nächsten "Frame" von 10ms oder was auch immer. Sie machen die FFT erneut, und wenn der höchste Peak eine andere Frequenz als der vorherige Peak hat, dann wird es sagen, dass es eine neue Note ist. Um zu sehen, wie lange die Noten sind, zählen Sie die Anzahl der Peaks innerhalb eines bestimmten Schwellenwerts und multiplizieren Sie sie mit der Zeit, die Sie für jedes Bild (10ms usw.) verwenden.

Ich werde noch einmal sagen, ich bin kein Experte und es gibt wahrscheinlich andere Möglichkeiten, es zu tun.

Davon abgesehen, ich hoffe, das hilft ... sogar ein bisschen.

    
Bojangles 07.02.2011 08:46
quelle
1

Ich bin kein Experte in diesem Bereich, aber einmal spielte ich ein bisschen mit Xuggler (java ffmpeg wrapper). Diese Bibliothek konnte viele interessante Daten aus der Mediendatei extrahieren, ermöglicht Dateitranscodierung und viele andere coole Funktionen. Hier ist der Link: Ссылка

    
Marcin Michalski 07.02.2011 09:25
quelle
1

Was Sie tun möchten, ist derzeit unmöglich. Der Umfang dessen, was Sie beschrieben haben, übersteigt alles, was aktuelle professionelle Musikprogramme leisten können, und sie haben buchstäblich Hunderte von Jahren an Programmierern investiert.

Sie können etwas erreichen, wenn Sie Ihre Anforderungen radikal reduzieren.

  • um die Tonhöhe zu finden, verwenden Sie FFT; das ist der einfachste Teil; Sie müssen sich hier auf einzelne Noten beschränken, Sie werden nicht in der Lage sein, Akkorde sauber zu lesen.

  • Sie werden nicht in der Lage sein zu entdecken, was die Taktart oder Geschwindigkeit (bpm) der Melodie ist - Ihre einzige Chance ist, eine Art Metronom in Ihre Anwendung aufzunehmen und den Spieler zu zwingen, sich an den Beat zu halten. Wenn Sie die Swing-Zeit unterstützen möchten, muss sie auch vom Player konfiguriert werden.

  • Wenn Sie midi machen, quantisieren Sie alle Noten (= bewegen Sie ihre Anfangs- und Endpunkte auf das nächste 1/4, 1/8 oder 1/16 des Takts)

  • Verwenden Sie ein fertiges Satzsystem, um den Score zu erstellen; Die Musiktex könnte für Sie arbeiten; das Generieren einer Tex-Datei ist viel einfacher als das Zeichnen für sich selbst; Wenn ich Sie wäre, würde ich einige der Regeln der Satzmusik ignorieren (ich würde sicherlich die Strahlen fallen lassen; es gibt zu viele Regeln, die sie betreffen)

Wenn Sie sich auf eine einzelne Melodie beschränken, den Großteil des Musiksatzes ignorieren, den Klavierspieler dazu bringen, Ihr eigenes Metronom zu verwenden und seine rhythmischen Entscheidungen zu beschränken, können Sie Erfolg haben.

    
fdreger 11.03.2011 10:48
quelle
1

Ich hatte die gleiche Idee und habe eine sehr einfache, aber unvollständige Lösung ausprobiert. Wie der Beitrag von fdreger gezeigt hat, ist selbst professionelle Software nicht in der Lage, diese Aufgabe korrekt auszuführen. (Ich habe einige Demo-Versionen von IntelliScore, AudioScore und anderer Software ausprobiert und keine davon schien bei der Arbeit mit polyphoner Musik besonders effizient zu sein)

Aber wenn du es selbst ausprobieren willst, habe ich den Quellcode benutzt, den du hier findest: Ссылка Das hat mir geholfen, herauszufinden, wie man die Frequenz bestimmt. (FFT wird genauer sein, aber ein Haufen komplexer).

Um die Notizen auf dem Bildschirm anzuzeigen, habe ich die abc4j-Bibliothek verwendet, die hier zu finden ist: Ссылка

Aber, wie oben erwähnt, funktioniert es nur mit monophoner Musik (eine einzige Stimme).

Viel Glück!

    
OldFreddy 12.02.2012 17:15
quelle
0

Es gibt einen sehr guten Open-Source-Sound-Editor namens Audacity . Ja, es ist in C ++ geschrieben, aber Sie können die Antworten finden, die Sie in seinem Quellcode suchen. Übersetzen von C ++ - Code nach Java ist nicht so schwer.

    
Boris Pavlović 07.02.2011 08:49
quelle