Marsyas sẽ là một lựa chọn tuyệt vời để làm điều này, nó được xây dựng cho chính xác loại nhiệm vụ này.
Để điều chỉnh nhạc cụ, những gì bạn cần làm là có thuật toán ước tính tần số cơ bản (F0) của âm thanh. Có một số thuật toán để làm điều này, một trong những mới nhất và tốt nhất là thuật toán YIN, được phát triển bởi Alain de Cheveigne. Gần đây tôi đã thêm thuật toán YIN vào Marsyas và việc sử dụng nó đã chết đơn giản.
Dưới đây là các mã cơ bản mà bạn sẽ sử dụng trong 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;
}
Mã này đầu tiên tạo ra một đối tượng Loạt chúng tôi sẽ bổ sung thêm các thành phần để. Trong một Series, mỗi thành phần nhận được đầu ra của hệ thống MarSystem trước đó. Sau đó chúng tôi thêm một SoundFileSource, bạn có thể nạp vào tệp .wav hoặc .mp3 vào. Sau đó chúng ta thêm đối tượng ShiftInput xuất ra các khối âm thanh chồng lên nhau, trong đó sau đó được đưa vào đối tượng AubioYin, ước tính tần số cơ bản của đoạn âm thanh đó.
Sau đó chúng tôi thông báo cho SoundFileSource rằng chúng tôi muốn đọc tệp trongAudioFileName.
Câu lệnh while sau đó lặp lại cho đến khi SoundFileSource hết dữ liệu. Bên trong vòng lặp , chúng tôi lấy dữ liệu mà mạng đã xử lý và xuất phần tử (0,0), là ước tính tần số cơ bản .
Điều này thậm chí còn dễ dàng hơn khi bạn sử dụng các ràng buộc Python cho Marsyas.