Подтвердить что ты не робот

Обучение работе с аудио в С++

Моя степень была в области аудиотехники, но я довольно новичок в программировании. Я хотел бы узнать, как работать со звуком в среде программирования, отчасти потому, что я могу лучше изучить С++ через интересные проекты.

Во-первых, это С++ правильный язык для этого? Есть ли причина, по которой я не должен ее использовать? Я слышал о Soundfile и некоторых других библиотеках - что бы вы порекомендовали?

Наконец, кто-нибудь знает какие-либо хорошие уроки в этой теме? Я изучил основы DSP - я просто хочу запрограммировать его!

EDIT: я использую Windows. Я хотел бы играть в режиме реального времени, немного как Max/MSP, но с большим контролем.

4b9b3361

Ответ 1

Это действительно зависит от того, какую аудиозапись вы хотите сделать. Если вы хотите реализовать аудио для игры, С++ уверен, что правильный язык. Существует множество библиотек, OpenAL - отличная, бесплатная и мультиплатформенная. Я также использовал DirectSound и Fmod с большим успехом. Проверьте их, все зависит от ваших потребностей.

Ответ 2

Является ли С++ правильным языком? Это полностью зависит от контекста. Если вам нужно подключить свой код в другое приложение, фреймворк или что-то еще, вам, вероятно, придется использовать любой язык, для которого созданы рамки.

Если вы создаете свое собственное самостоятельное приложение? Возможно нет. Есть несколько причин, по которым я предлагаю вам перейти на другой язык:

  • С++ не подходит для начинающих. Если ваша цель - научиться программированию через эти проекты, перейдите на язык, который более поддается "обучению". С++ полна подводных камней и вещей, которые "кажутся сработавшими", пока в один прекрасный день они этого не сделают. Добавьте к этому ужасно сложный синтаксис и некоторые довольно сложные идиомы и приемы, которые вам нужно освоить, чтобы обойти причуды языка, которые просто не являются проблемами на любом другом языке, и у вас есть хороший источник ошибок и разочарований, и не намного больше.
  • С++ не имеет понятия "аудио". С++ не поддерживает какую-либо поддержку для записи, обработки или воспроизведения звука, загрузки или сохранения аудиофайлов или чего-либо еще. Большинство современных языков имеют некоторую форму поддержки звука, встроенную в стандартный язык (по крайней мере, возможность загрузки и воспроизведения mp3 файлов и других подобных основ). В С++ все это должно быть выполнено через сторонние библиотеки и код, специфичный для ОС.

Если у вас есть реальный выбор языка, я бы сказал, что вы хотите что-то вроде Python или С#. Их легче освоить, получить гораздо больше функциональности из коробки, и сделать намного сложнее стрелять себе в ногу. Я бы не рекомендовал С++ тому, кто еще не опытный программист.

Ответ 3

Если вы решите использовать С++, то стоит отметить The Synthesis Toolkit. Я использую его для школьного проекта, и он очень полезен, разработан в Стэнфордском университете, кроссплатформе (win, mac и linux), бесплатно и с открытым исходным кодом. Вывод из страницы википедии на нем:

Версии классов инструментов STK были интегрированы в ChucK, Csound, Cmix в реальном времени, Max/MSP (как часть PeCRolate) и SuperCollider

У них много тестовых кодов, включенных + на сайт, некоторые учебные пособия, чтобы начать работу с их библиотекой. (Но вам обязательно нужно знать С++, конечно)

STK имеет некоторые классы для чтения/записи аудиофайлов (и файлов Matlab), аудио /midi io в реальном времени, некоторые базовые алгоритмы (использование на основе аналогичных функций из Matlab),...


Еще один очевидный вариант и, возможно, самая используемая среда для изучения/тестирования материалов dsp - Matlab (или бесплатный octave, но я не использовал его раньше). Я иногда тестирую материал в Matlab перед его реализацией на С++.


EDIT: В прошлом году я использовал JUCE, который является довольно классной библиотекой С++, ориентированной на программирование звука на С++, хотя он более склонен к чему-то вроде QT. Один из их разработчиков (Тимур Думлер) хорошо рассказывает о аудио в реальном времени с С++ и JUCE на CppCon 2015, определенно стоит проверить, даже если вы не закончите использовать JUCE: https://youtu.be/boPEO2auJj4

Ответ 4

Проверьте Audacity. Это кросс-платформенный (Linux, OS X и Windows) аудиоредактор с открытым исходным кодом, написанный на С++. Я не знаю, на каком уровне ваши навыки графического интерфейса, но код, который касается работы с аудио, должен быть довольно легко отличить от кода wxWidgets (GUI).

Ответ 5

Не слушай меня! Возможно, я ошибаюсь!

Я не программирую С++, но соглашаюсь с Jalf, поскольку это трудно для начинающих, есть много вещей, которые нужно сделать вручную, что другие языки сделают для вас автоматически, например, выделение памяти, сбор мусора и т.д. также правы, говоря, что С++ не знает звука, а другие языки имеют встроенные звуковые возможности с нуля. Однако, как правило, большинство из них являются довольно основными возможностями: открытием и воспроизведением файлов, отправкой воспроизведения в разные части файла, настройкой панорамирования и громкости, а также извлечением данных eq.

Но... Я предполагаю, что вы хотите немного глубже и на самом деле сформировать звук, будь то синтез или эффекты, и что вы хотите сделать эти вещи, а не просто добавлять их. Я бы посоветовал вам взглянуть на VST и VSTi, но это область С++ (библиотека JUCE, удивительная удивительная удивительная) и тяжелая работа, но если вы хотите создать свой собственный продукт, то это может быть так. в противном случае, как и другие, предлагали использовать CSound, Max, Cycling и, возможно, обработку. программное обеспечение, такое как Reaktor, позволяет вам комбинировать модульные компоненты с гораздо меньшим (если есть) кодированием.

Иди и посмотри на некоторые из форумов на KVRAudio, есть несколько героев, которые разработали старую классическую бесплатную версию, такую ​​как Hammerhead, а затем другое программное обеспечение indie, такое как Fruity Loops, Rebirth, Tuareg, Audiomulch и т.д.

Я думаю, что изучение VST и С++ является лучшим, но это будет долгий путь с болью и мукой, и если вы не захотите создать отдельную часть программного обеспечения или плагин для другого программного обеспечения (кроме Csound и т.д.), он будет разочаровывающим.

Я думаю.

Ответ 6

Если вы уже изучили основы DSP, я бы рекомендовал Analog Devices Blackfin Processors. Вы можете использовать как C, так и С++, и они предоставляют несколько примеров аудио, чтобы вы начали. Они снабжают достаточным количеством кода для считывания звука на плате, обработки его и воспроизведения его.

Из этого вы можете применить любые типы фильтров или другую необходимую вам обработку. Я использовал BF533 Ez-Kit Lite в сочетании с последовательной ЖК-панелью для создания звукового эквалайзера для проекта один раз. Был отличный опыт и много удовольствия!

Ответ 7

У меня нет такого большого опыта в создании аудиозаписей для себя, но если бы я был на вашем месте, я бы пообщался с созданием VSTi в первую очередь (инструмент для виртуальных студийных технологий). Насколько я знаю, Steinberg выпустил для этого С++ SDK, и я считаю, что это будет хорошей отправной точкой, если вы хотите попасть в звуковые проектные приложения

Ответ 8

С++ может быть отличным языком для обработки звука, я использую Marsyas framework, кросс-платформенный пакет, который позволяет вы выполняете сложные задачи в обработке аудиосигнала, извлечении музыкальной информации и машинного обучения. Это также очень быстро, и вы можете выполнять множество сложных задач в режиме реального времени, в отличие от многих других пакетов. В тестах, которые мы выполнили, Марсия может быть в сотни раз быстрее, чем Matlab.

Чтобы вы начали, вот какой-то код. Скажем, вы хотели воспроизвести аудиофайл, для этого вы бы создали сеть в Марсии, которая выглядит так:

  • Серия
    • SoundFileSource
    • Усиление
    • AudioSink

Marsyas использует модель исправления implict, которая похожа на явное исправление, которое вы видите в Max/MSP, но вам не нужно рисовать провода между объектами, вы просто помещаете их в контейнеры, а провода создаются автоматически. Объект Series выше содержит SoundFileSource, который вы передаете аудиофайлу, а затем передает его на коэффициент усиления, который позволяет вам изменять громкость звука, а затем передает его в AudioSink, который воспроизводит аудиофайл на ваших динамиках.

С++ для создания этой сети мертв просто:

     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();
     }

Первые четыре строки создают MarSystem, которая обрабатывает ваш звук. Объект Series, который содержит все остальное, создается сначала, а затем добавляются SoundFileSource, Gain и AudioSink.

В следующей строке задается имя файла SoundFileSource, вы должны указывать имя файла .wav,.au,.aiff или .mp3, который вы хотите обработать здесь.

Затем вы включаете AudioSource, который сообщает вашей звуковой карте начать воспроизведение звука, обновив элемент управления "initAudio" AudioSource. Цикл while затем петли, пока SoundFileSource имеет аудиоданные.

Вы можете видеть, что этот простой пример действительно прост в использовании, но реальная сила Марсия - это когда вы хотите выполнять более сложные задачи. Например, чтобы сделать FFT, вы просто выполните:

     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;
     }

Чтобы оценить основную частоту источника звука, вы должны сделать что-то вроде:

  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;
     }

Этот последний будет читать в аудио в реальном времени с вашей звуковой карты и будет запускать мощный алгоритм определения высоты тона YIN на нем. Сладкий, а??

Для получения большего количества кода проверьте сайт Marsyas, особенно проверьте documentation.

Ответ 9

C может быть лучшим выбором, чем С++ для аудио, особенно если вы хотите сделать любой DSP.

  • Большинство практических справочников аудио и DSP используют примеры кода C
  • Большинство аудио/DSP-библиотек написаны на C (или, по крайней мере, имеют C API)
  • С++ значительно увеличивает кривую обучения по сравнению с C, но не добавляет много преимуществ для работы аудио /DSP (ООП не особенно подходит для кода низкого уровня/реального времени).

Нет ничего "неправильного" в обучении С++, конечно, и это не остановит вас понимания и использования кода C (поскольку С++ - это в основном надмножество C) - это просто, что вы будете работать быстрее и быстрее C, и вы можете всегда перейти на С++ позже, если вы решите.

Ответ 10

В окнах найдите учебники по DirectSound.

В Linux существует множество библиотек и методов для доступа к звуковым картам, самым простым из которых является просто открытие файла на устройстве и использование ioctrl для установки скорости и т.д.

Если вы дадите больше информации об окружающей среде, у нас могут быть лучшие рекомендации.

-Adam

Ответ 11

Если вы хотите сосредоточиться на фактической обработке звука (в отличие от всех ошибок, с которыми связаны GUI-приложения), я бы посмотрел CSound. Это дает вам текстовые файлы, основанные на langugae, которые позволяют вам создавать практически любые аудиоустройства практически из того, что они называют opcodes, но также у вас есть исходный код, который вы можете изучить, чтобы увидеть фактические алгоритмы, которые представляют коды операций.

Ответ 12

Если у вас уже есть какие-то знания DSP, эти учебники показывают, как превратить DSP-код в готовую программу, включая элементы управления графическим интерфейсом. Он начинается с простого искажения, а затем переходит к синтезу и т.д.
В основном вы пишете код, который может быть создан либо как автономный .exe, либо как плагин VST для таких хостов, как Cubase или Ableton Live.

Ответ 13

В зависимости от ваших потребностей, возможно, R - это более простой язык. Я использую его уже год, он также выполняет статистический анализ, графики, карты и звуковой анализ. В библиотеках png, tuneR и seewave вам нужна одна строка для чтения .wav, другая - для получения матрицы данных, а другая - для размещения в png-изображении или просмотра на экране. Точки, предназначенные для анализа данных и более простые в использовании, являются для меня двумя преимуществами. Например, таблицы R номеров и массивы, начиная с 1, а не 0, как большинство языков программирования. Это делает наш человеческий мозг намного более удобным с уже сложными сценариями. Я думаю, вам стоит взглянуть на это: http://www.r-project.org/

Удачи!

Ответ 14

Чтобы ответить на второй вопрос, вы должны проверить эту книгу: Проектирование модулей аудиоэффектов на С++: с помощью технологии обработки цифрового аудиосигнала Will Pirkle.

В книге рассказывается о некоторых базовых DSP, и вы узнаете, как создавать звуковые плагины. Вы будете писать код на С++, но это не будет сложно, потому что книга предлагает загрузить фреймворк RACKAFX, который обрабатывает все события графического интерфейса пользователя. Все, что вам нужно сделать, это сосредоточиться на написании формул и сохранении данных в правильных каналах.

Удачи!

Ответ 15

Здесь много хороших предложений. Кроме того, я бы предложил посмотреть Jack Audio Toolkit, структуру JUCE и узнать, как переносить код C из библиотек синтеза, таких как Csound. "Книга аудиопрограмм" тоже хороша для этого.

Re C vs С++, я думаю, вы обнаружите, что в аудио-работе часть С++ часто на самом деле просто хром для управления кодом. Биты DSP - это всего лишь низкоуровневая процедурная математика по сигналам, поэтому, вероятно, это вызовы C, и на самом деле это не имеет значения для этой стороны, независимо от того, используете ли вы C или С++. Многие аудиопроекты на С++ по существу являются просто C в звуковых кишках.

НТН!

Ответ 16

Вы можете использовать WAV файл, используя некоторую команду.

Эта команда PlaySound("C:\\SOUNDS\\example.WAV", NULL, SND_ASYNC);