Marsyas wäre eine gute Wahl dafür, es ist genau für diese Art von Aufgabe gebaut.
Um ein Instrument abzustimmen, müssen Sie einen Algorithmus haben, der die grundlegende Frequenz (F0) eines Sounds schätzt. Es gibt eine Reihe von Algorithmen, um dies zu tun, einer der neuesten und besten ist der YIN-Algorithmus, der von Alain de Cheveigne entwickelt wurde. Ich habe kürzlich den YIN-Algorithmus zu Marsyas hinzugefügt, und es ist todschick.
Hier ist der grundlegende Code, den Sie in Marsyas verwenden würden:
MarSystemManager mng;
// A series to contain everything
MarSystem* net = mng.create("Series", "series");
// Process the data from the SoundFileSource with AubioYin
net->addMarSystem(mng.create("SoundFileSource", "src"));
net->addMarSystem(mng.create("ShiftInput", "si"));
net->addMarSystem(mng.create("AubioYin", "yin"));
net->updctrl("SoundFileSource/src/mrs_string/filename",inAudioFileName);
while (net->getctrl("SoundFileSource/src/mrs_bool/notEmpty")->to<mrs_bool>()) {
net->tick();
realvec r = net->getctrl("mrs_realvec/processedData")->to<mrs_realvec>();
cout << r(0,0) << endl;
}
Dieser Code erzeugt zuerst eine Serie Objekt, das wir Komponenten hinzufügen. In einer Serie erhält jede Komponente die Ausgabe des vorherigen MarSystems in Serie. Wir fügen dann eine SoundFileSource hinzu, die Sie in einer .wav- oder .mp3-Datei einspeisen können. Wir fügen dann das ShiftInput-Objekt hinzu, das überlappende Audioabschnitte ausgibt, die dann in das AubioYin-Objekt eingegeben werden, das die Grundfrequenz dieses Audioabschnitts schätzt.
Wir sagen dann der SoundFileSource, dass wir die Datei inAudioFileName lesen möchten.
Die while-Anweisung wird dann wiederholt, bis die SoundFileSource keine Daten mehr enthält. Innerhalb der Schleife nehmen wir die Daten, die das Netzwerk verarbeitet hat, und geben das Element (0,0) aus, das die Grundfrequenzschätzung ist.
Dies ist noch einfacher, wenn Sie die Python-Bindungen für Marsyas verwenden.