Marsyas by pro to byl skvělou volbou, přesně pro tento druh úkolu je stavěný.
Pro ladění nástroje musíte mít algoritmus, který odhaduje základní frekvenci (F0) zvuku. K tomu existuje řada algoritmů, jeden z nejnovějších a nejlepší je algoritmus YIN, který vyvinul Alain de Cheveigne. Nedávno jsem přidal algoritmus YIN do Marsyas a jeho použití je smrtelně jednoduché.
Zde je základní kód, který byste použili v 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; }
Tento kód nejprve vytvoří objekt Series, do kterého přidáme komponenty. V sérii každá z komponent přijímá výstup předchozího MarSystemu v sérii. Poté přidáme SoundFileSource, do kterého můžete vložit soubor .wav nebo .mp3. Poté přidáme objekt ShiftInput, jehož výstupem jsou překrývající se kusy zvuku, které jsou pak přiváděny do objektu AubioYin, který odhaduje základní frekvenci tohoto kusu zvuku.
Poté sdělíme SoundFileSource, že chceme číst soubor v AudioFileName.
Příkaz while se pak opakuje, dokud SoundFileSource nedojdou data. Uvnitř whileloop bereme data, která síť zpracovala, a vydáváme prvek (0,0), což je základní odhad frekvence.
To je ještě jednodušší, když použijete vazby Pythonu pro Marsyas.
http://clam-project.org/CLAM je plnohodnotný softwarový rámec pro výzkum a vývoj aplikací v oblasti zvuku a hudby. Nabízí koncepční model a také nástroje pro analýzu, syntézu a zpracování zvukových signálů.
Mají skvělé API, pěkné GUI a pár hotových aplikací, kde všechno vidíte.
Tento návod by měl pomoci. Nepoužívejte ALSA pro svou aplikaci. Použijte API vyšší úrovně. Pokud se rozhodnete, že byste chtěli použít JACK, http://jackaudio.org/applications má tři ladičky nástrojů, které můžete použít jako příklad kódu.
ALSA je nyní jakýmsi výchozím standardem pro linux, protože ovladače jádra jsou součástí jádra a OSS je odepisován. Existují však alternativy k uživatelskému prostoru ALSA, jako je jack, který se zdá být zaměřen na aplikace profesionálního typu s nízkou latencí. Zdá se, že jeho API má hezčí API, i když jsem ho nepoužíval, moje krátké seznámení s ALSA API by mě přimělo si myslet, že téměř cokoliv by bylo lepší.