Nauka pracy z audio w C++ [zamknięta]

Ukończyłem inżynierię dźwięku, ale jestem całkiem nowy w programowaniu. Chciałbym nauczyć się pracować z dźwiękiem w środowisku programistycznym, częściowo po to, aby lepiej uczyć się C++ poprzez ciekawe projekty.

Po pierwsze, czy C++ jest do tego odpowiednim językiem? Czy jest jakiś powód, dla którego nie powinnam jej używać? Słyszałem o Soundfile i innych bibliotekach - co byście polecili?

Wreszcie, czy ktoś zna jakieś dobre tutoriale w tym temacie? Nauczyłam się podstaw DSP-po prostu chcę go zaprogramować!

EDIT: używam Windows. Chciałbym grać w czasie rzeczywistym rzeczy, trochę jak Max / MSP, ale z większą kontrolą.

 30
Author: Skilldrick, 2009-04-02

16 answers

To naprawdę zależy od tego, jaki rodzaj pracy audio chcesz zrobić, jeśli chcesz zaimplementować dźwięk do gry, C++ jest pewien właściwy język. Wokół jest wiele bibliotek, OpenAL jest świetny, darmowy i wieloplatformowy. Korzystałem również z DirectSound i Fmod z wielkim powodzeniem. Sprawdź je, wszystko zależy od twoich potrzeb.

 14
Author: MissT,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-04-02 20:06:55

Czy C++ jest właściwym językiem? To zależy wyłącznie od kontekstu. Jeśli chcesz podłączyć swój kod do innej aplikacji, frameworka lub czegokolwiek innego, prawdopodobnie musisz użyć dowolnego języka, do którego został stworzony framework.

Jeśli tworzysz własną aplikację wolnostojącą? Pewnie nie. Jest kilka powodów, dla których sugerowałbym użycie innego języka:

  • C++ nie jest odpowiedni dla początkujących. Jeśli twoim celem jest nauka programowania poprzez te projekty, przejdź z język bardziej podatny na "uczenie się przez działanie". C++ jest pełen pułapek i rzeczy, które" wydają się działać", aż pewnego dnia nie. Dodaj do tego strasznie złożoną składnię i kilka dość złożonych idiomów i technik, które musisz opanować, aby obejść dziwactwa języka, które po prostu nie są problemami w prawie każdym innym języku, a masz dobre źródło błędów i frustracji, i nie wiele więcej.
  • C++ nie ma pojęcia "audio". C++ nie posiada żadnego wsparcia dla nagrywanie, przetwarzanie lub odtwarzanie dźwięku, Ładowanie lub zapisywanie plików audio lub cokolwiek innego. Większość współczesnych języków ma jakąś formę obsługi audio wbudowaną w standardowy język (przynajmniej możliwość ładowania i odtwarzania plików mp3 i innych tego typu podstaw). W C++ wszystko to będzie musiało być wykonane za pomocą bibliotek innych firm i kodu specyficznego dla systemu operacyjnego.

Jeśli masz prawdziwy wybór w języku, powiedziałbym, że wybierz coś takiego jak Python lub C#. Są łatwiejsze do nauczenia się, mają o wiele więcej funkcjonalność po wyjęciu z pudełka i znacznie utrudnić strzelanie sobie w stopę. Nie polecałbym C++ komuś, kto nie jest jeszcze doświadczonym programistą.

 9
Author: jalf,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-04-02 20:23:22

Jeśli zdecydujesz się na użycie C++, to Warto zwrócić uwagę na Zestaw Narzędzi syntezy. Używam go do projektu szkolnego i jest bardzo użyteczny, opracowany na Uniwersytecie Stanforda, wieloplatformowy( win, mac i linux), wolny i opensource. Fragment strony Wikipedii na niej:

Wersje klas instrumentów STK zostały zintegrowane z ChucK, Csound, Real-Time Cmix, Max/MSP (jako część Perkolatu) i SuperCollider

Mają dużo testcode included + na stronie są kilka samouczków, aby rozpocząć korzystanie z ich biblioteki. (Ale trzeba oczywiście znać jakieś C++)

STK ma kilka klas do odczytu/zapisu plików audio (i plików matlab), realtime audio / midi io, kilka podstawowych algorytmów (wykorzystanie w oparciu o podobne funkcje z matlab), ...


Kolejną oczywistą opcją i prawdopodobnie najczęściej używanym środowiskiem do nauki / testowania dsp jest Matlab (lub free octave , ale nie używałem go przed). Czasami testuję rzeczy w Matlabie przed zaimplementowaniem go w C++.


EDIT: w zeszłym roku używałem JUCE , która jest całkiem fajną biblioteką C++ skupioną wokół programowania audio C++, choć bardziej skłania się ku czemuś jak QT. Jeden z ich programistów (Timur Doumler) ma miłą rozmowę o dźwięku w czasie rzeczywistym z C++ i JUCE na CppCon 2015, zdecydowanie warto sprawdzić, nawet jeśli nie skończysz z JUCE: https://youtu.be/boPEO2auJj4

 9
Author: Emile Vrijdags,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-11-23 22:46:10

Zobacz Audacity . Jest to wieloplatformowy (Linux, OS X i Windows) open-source edytor audio napisany w C++. Nie wiem, na jakim poziomie są Twoje umiejętności GUI, ale kod, który zajmuje się pracą audio, powinien być dość łatwy do odróżnienia od kodu wxWidgets (GUI).

 4
Author: Chris Lutz,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-04-02 20:11:45

Nie słuchaj mnie! Mogę się mylić!

Nie programuję C++, ale Zgadzam się z Jalfem, ponieważ jest to trudne dla początkujących, jest wiele rzeczy, które muszą być wykonane ręcznie, które inne języki zrobią za ciebie automatycznie, takie jak alokacja pamięci, usuwanie śmieci itp. mają również rację mówiąc, że C++ nie zna dźwięku i że inne języki mają możliwości audio wbudowane od podstaw. Generalnie jednak większość z nich to dość podstawowe możliwości: otwarcie i odtwarzanie plików, wysyłanie głowicy odtwarzania do różnych części pliku, dostosowywanie panoramowania i głośności, może wyodrębnianie danych korektora.

But...Im odgadnięcie, że chcemy uzyskać trochę głębiej i rzeczywiście kształtować dźwięk, czy to poprzez syntezę, czy efekty, i że chcemy tworzyć te rzeczy, a nie po prostu je dodawać. Zachęcam do spojrzenia na VST i VSTi, ale to jest obszar c++ (biblioteka JUCE, awesome awesome awesome), i ciężkiej ciężkiej pracy, ale jeśli chcesz zrobić swój własny produkt, to może być droga. w przeciwnym razie, jak inni sugerowali CSound, Max, Jazda na rowerze, a może przetwarzanie może być interesujące. oprogramowanie takie jak Reaktor pozwala na łączenie komponentów modułowych z dużo mniejszym (jeśli w ogóle) kodowaniem.

Przejrzyj fora na KVRAudio, jest tam kilku bohaterów, którzy stworzyli stare, klasyczne freeware, takie jak Hammerhead, a następnie inne niezależne oprogramowanie, takie jak Fruity Loops, Rebirth, Tuareg, Audiomulch itp.

Myślę, że nauka o VST A C++ jest najlepszy, ale będzie to długa droga z bólem i udręką, i jeśli nie chcesz stworzyć samodzielnego oprogramowania lub wtyczki do innego oprogramowania (oprócz Csound itp.), będzie to rozczarowujące.

Myślę.

 2
Author: Assembler,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-04-05 17:30:41

C++ może być świetnym językiem do przetwarzania dźwięku, używam Marsyas framework, wieloplatformowego pakietu, który pozwala na wykonywanie skomplikowanych zadań w zakresie przetwarzania sygnału audio, wyszukiwania informacji muzycznych i uczenia maszynowego naprawdę łatwo. Jest również bardzo szybki i możesz wykonywać wiele skomplikowanych zadań w czasie rzeczywistym, w przeciwieństwie do wielu innych pakietów. W testach, które przeprowadziliśmy, Marsjanie mogą być setki razy szybsi niż Matlab.

Na początek, oto kod. Powiedzmy, że ty chciałem odtworzyć plik audio, w tym celu utworzyłbyś sieć w Marsjanach, która wygląda następująco:

  • Seria
    • SoundFileSource
    • Zysk
    • AudioSink

Marsyas używa implict patching model, który jest podobny do explicit patching, który widzisz W Max/MSP, ale nie musisz rysować przewodów między obiektami, po prostu umieszczasz je w kontenerach, a przewody są tworzone automatycznie. Obiekt serii powyżej posiada źródło dźwięku, który karmisz plik audio, a następnie przekazuje go do wzmocnienia, który pozwala na zmianę głośności dźwięku, a następnie przekazuje go do AudioSink, który odtwarza plik audio na głośnikach.

C++ do tworzenia tej sieci jest martwe proste:

     MarSystem* playbacknet = mng.create("Series", "playbacknet");
     playbacknet->addMarSystem(mng.create("SoundFileSource", "src"));
     playbacknet->addMarSystem(mng.create("Gain", "gt"));
     playbacknet->addMarSystem(mng.create("AudioSink", "dest"));

     // Set the SoundFileName
     playbacknet->updctrl("SoundFileSource/src/mrs_string/filename",inAudioFileName);

     // Turn on the audio output
     playbacknet->updctrl("AudioSink/dest/mrs_bool/initAudio", true);

     while (playbacknet->getctrl("SoundFileSource/src/mrs_bool/notEmpty")->isTrue())    {
        playbacknet->tick();
     }

Pierwsze cztery linie tworzą MarSystem, który przetwarza Twoje audio. Najpierw tworzony jest obiekt Series, który zawiera wszystko inne, a następnie dodaje się do niego SoundFileSource, Gain i AudioSink.

Następny wiersz ustawia nazwę pliku SoundFileSource, można nadać mu nazwę .wav, .au,.plik aiff lub. mp3, który chcesz przetworzyć tutaj.

Następnie włączasz AudioSource, który mówi Twojej karcie dźwiękowej, aby zaczęła odtwarzać dźwięk, aktualizując sterowanie "Initaudio" w AudioSource. Pętla while jest wtedy pętla tak długo, jak długo SoundFileSource zawiera dane audio.

Widać, że ten prosty przykład jest naprawdę łatwy do zrobienia, ale prawdziwa moc Marsa jest wtedy, gdy chcesz zrobić więcej skomplikowane zadania. Na przykład, aby zrobić FFT, wystarczy zrobić:

     MarSystem* net = mng.create("Series", "net");
     net->addMarSystem(mng.create("SoundFileSource", "src"));
     net->addMarSystem(mng.create("Spectrum", "spectrum"));
     net->addMarSystem(mng.create("PowerSpectrum", "powerspectrum"));

     while (playbacknet->getctrl("SoundFileSource/src/mrs_bool/notEmpty")->isTrue())    {
         cout << net->getctrl("mrs_realvec/processedData")->to<mrs_realvec>() << endl;
     }

Aby oszacować podstawową częstotliwość źródła dźwięku, wykonasz coś w stylu:

  MarSystem* net = mng.create("Series", "series");
  net->addMarSystem(mng.create("AudioSource", "src"));
  net->addMarSystem(mng.create("AubioYin", "yin"));

    while (playbacknet->getctrl("SoundFileSource/src/mrs_bool/notEmpty")->isTrue())    {
         cout << net->getctrl("mrs_realvec/processedData")->to<mrs_realvec>() << endl;
     }
Ten ostatni odczyta dźwięk w czasie rzeczywistym z twojej karty dźwiękowej i uruchomi na niej potężny algorytm wykrywania wysokości Yin. Słodkie, co?

Aby uzyskać więcej kodu, zajrzyj na stronę Marsyas , szczególnie sprawdź dokumentację.

 2
Author: sness,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-07-07 04:39:56

Jeśli już nauczyłeś się podstaw DSP, polecam Analog Devices Procesory Blackfin . Możesz używać zarówno C, jak i C++, A zawierają one wiele przykładów Audio, które pomogą Ci zacząć. Dostarczają wystarczająco dużo kodu, aby odczytać dźwięk na tablicy, przetworzyć go i odtworzyć z powrotem.

Z tego można zastosować dowolne typy filtrów lub inne przetwarzanie, które chcesz. Użyłem BF533 EZ-Kit Lite w połączeniu z szeregowym panelem LCD, aby raz zrobić Korektor Audio dla projektu. Był świetna Nauka i dużo zabawy!

 1
Author: Sean,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-04-02 20:07:51

Nie mam tyle doświadczenia w tworzeniu aplikacji audio dla siebie - ale gdybym był na Twoim miejscu, pobawiłbym się tworzeniem pierwszego instrumentu VSTi (virtual studio technology instrument). Z tego, co wiem, Steinberg wydał do tego C++ SDK i myślę, że byłby to dobry punkt wyjścia, jeśli chcesz dostać się do aplikacji do projektowania dźwięku

 1
Author: Ciaran,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-04-02 20:25:22

C może być lepszym Wyborem niż C++ dla audio, szczególnie jeśli chcesz zrobić dowolny DSP.

  • Większość praktycznych podręczników audio i DSP używa C do przykładów kodu
  • większość bibliotek audio / DSP jest napisana w języku C (lub przynajmniej posiada C API)
  • C++ znacznie zwiększa krzywą uczenia się w porównaniu z C, ale nie dodaje wiele korzyści dla pracy audio / DSP (OOP nie jest szczególnie istotne dla niskopoziomowego/rzeczywistego kodu)

Nie ma nic "złego" w nauce c++ oczywiście i nie przeszkodzi ci to w zrozumieniu i użyciu kodu C (ponieważ C++ jest głównie supersetem C) - po prostu będziesz działał dużo SZYBCIEJ Z C, a zawsze możesz przejść do C++ później, jeśli się na to zdecydujesz.

 1
Author: Paul R,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-03-08 08:22:36

W systemie windows wyszukaj samouczki na DirectSound.

W Linuksie istnieje wiele bibliotek i metod dostępu do kart dźwiękowych, z których najłatwiej jest po prostu otworzyć plik do urządzenia i użyć ioctrl, aby ustawić prędkość itp.

Jeśli podasz więcej informacji na temat środowiska, możemy mieć lepsze zalecenia.

- Adam

 0
Author: Adam Davis,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-04-02 20:05:21

Jeśli chcesz skupić się na rzeczywistym przetwarzaniu dźwięku (w przeciwieństwie do wszystkich crud, które aplikacje GUI są obarczone), chciałbym sprawdzić CSound. Daje to język oparty na plikach tekstowych, który pozwala zbudować prawie każde urządzenie audio praktycznie z tego, co nazywają kodami opcodes, ale także masz kod źródłowy, który możesz zagłębić się, aby zobaczyć rzeczywiste algorytmy, które reprezentują kody opcodes.

 0
Author: U62,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-04-03 12:34:38

Jeśli masz już trochę wiedzy na temat DSP, te samouczki pokazują, jak zamienić kod DSP w gotowy program, w tym sterowanie GUI. Zaczyna się od prostego zniekształcenia, a następnie przechodzi do syntezy itp.
Zasadniczo piszesz kod, który może być zbudowany jako samodzielny .exe lub jako wtyczka VST dla hostów takich jak Cubase lub Ableton Live.

 0
Author: basteln,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-10-05 17:26:33

W zależności od potrzeb, może R jest łatwiejszym językiem. Używam go od roku, wykonuje analizy statystyczne, wykresy, mapy i analizę dźwięku. Z bibliotekami png, tuneR i seewave potrzebujesz jednej linii, aby odczytać .wav, inne, aby uzyskać matrycę danych, a inne, aby umieścić go w obrazie png lub zobaczyć go na ekranie. Punkty projektowania do analizy danych i bycia łatwiejszym w użyciu to dla mnie dwie zalety. Na przykład tabele liczb R i tablice zaczynające się od 1, a nie od 0, jak większość języki programowania. To sprawia, że nasz ludzki mózg znacznie bardziej komfortowe z już skomplikowanych skryptów. Myślę, że powinieneś rzucić na to okiem: http://www.r-project.org/

Powodzenia!

 0
Author: Rodrigo,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-08-01 20:17:11

Aby odpowiedzieć na drugie pytanie, powinieneś zajrzeć do tej książki: Designing Audio Effect Plug-Ins in C++: With Digital Audio Signal Processing Theory by Will Pirkle.

Książka przechodzi przez podstawowe DSP i pokazuje, jak tworzyć Wtyczki audio. Będziesz kodować w C++, ale nie będzie to trudne, ponieważ książka sugeruje pobranie frameworka RACKAFX, który obsługuje wszystkie zdarzenia GUI. Wszystko, co musisz zrobić, to skupić się na pisaniu formuł i przechowywaniu danych w prawym kanały.

Powodzenia!

 0
Author: ThePhantom05,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-10-14 00:55:53

Wiele dobrych sugestii tutaj. Ponadto sugerowałbym spojrzenie na Jack Audio Toolkit, juce framework, i dowiedzieć się, jak portować kod C z bibliotek syntezy, takich jak Csound. "Książka Do Programowania Audio" też jest do tego dobra.

Re C vs C++, myślę, że przekonasz się, że w audio work część C++ jest często tak naprawdę tylko chrome do zarządzania kodem. Bity DSP są niskopoziomowe, więc prawdopodobnie będą to wywołania C i to naprawdę nie ma znaczenia dla tej strony rzeczy czy używasz C czy c++. Wiele projektów C++ audio to w zasadzie tylko C w brzuchu audio.

Hth!

 0
Author: Iain Duncan,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-11-23 19:08:31

Możesz użyć a .plik wav za pomocą jakiegoś polecenia.

To polecenie PlaySound("C:\\SOUNDS\\example.WAV", NULL, SND_ASYNC);

 -1
Author: Psuedorandom programmer,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-02-03 02:20:09