Marsyas sarebbe un'ottima scelta per farlo, è costruito esattamente per questo tipo di attività.
Per accordare uno strumento, quello che devi fare è disporre di un algoritmo che stimi la frequenza fondamentale (F0) di un suono. Esistono numerosi algoritmi per farlo, uno dei più recenti e migliori è l'algoritmo YIN, sviluppato da Alain de Cheveigne. Di recente ho aggiunto l'algoritmo YIN a Marsyas e usarlo è semplicissimo.
Ecco il codice di base che useresti in Marsyas:
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; }
Questo codice crea innanzitutto un oggetto Series a cui aggiungeremo i componenti. In una serie, ciascuno dei componenti riceve in serie l'output del MarSystem precedente. Quindi aggiungiamo un SoundFileSource, in cui puoi inserire un file .wav o .mp3. Quindi aggiungiamo l'oggetto ShiftInput che emette porzioni sovrapposte di audio, che vengono poi inserite nell'oggetto AubioYin, che stima la frequenza fondamentale di quella porzione di audio.
Quindi diciamo a SoundFileSource che vogliamo leggere il file in AudioFileName.
L'istruzione while esegue quindi un ciclo finché SoundFileSource non esaurisce i dati. All'interno del ciclo while, prendiamo i dati che la rete ha elaborato e restituiamo l'elemento (0,0), che è la stima della frequenza fondamentale.
Questo è ancora più semplice quando usi i binding Python per Marsyas.
http://clam-project.org/CLAM è un framework software completo per la ricerca e lo sviluppo di applicazioni nel dominio dell'audio e della musica. Offre un modello concettuale e strumenti per l'analisi, la sintesi e l'elaborazione dei segnali audio.
Hanno un'ottima API, una bella GUI e alcune app finite in cui puoi vedere tutto.
Questa guida dovrebbe aiutare. Non usare ALSA per la tua applicazione. Utilizza un'API di livello superiore. Se decidi di utilizzare JACK, http://jackaudio.org/applications ha tre accordatori di strumenti che puoi utilizzare come codice di esempio.
ALSA è una sorta di standard predefinito per Linux ora in virtù dei driver del kernel inclusi nel kernel e dell'OSS deprezzato. Tuttavia ci sono alternative allo spazio utente ALSA, come jack, che sembra essere rivolto ad applicazioni di tipo professionale a bassa latenza. La sua API sembra avere un'API migliore, anche se non l'ho usata, la mia breve esposizione all'API di ALSA mi farebbe pensare che quasi tutto sarebbe migliore.