Как создать программу со звуком

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

Я слышал о Soundfile и некоторых других библиотеках — что бы вы порекомендовали? Наконец, кто-нибудь знает какие-либо хорошие уроки в этой теме? Я изучил основы DSP — я просто хочу запрограммировать его! EDIT: я использую Windows. Я хотел бы играть в режиме реального времени, немного как Max/MSP, но с большим контролем.

Skilldrick 02 апр. 2009, в 22:07
Поделиться
Какая операционная система?
anon 02 апр.

2009, в 19:59

Чтобы добавить к вопросу Нила — мы предполагаем, что вы хотите слушать аудио, а не просто читать / записывать файлы. Любые решения будут зависеть от операционной системы.

Mark Ransom 02 апр. 2009, в 20:05

Если вы собираетесь начать с C ++, я бы порекомендовал openFrameworks.cc, поскольку он немного смягчает жесткие края C ++, в то же время позволяя писать на языке.

Как записать звук «внутри» компьютера (системный звук, игры и мессенджеры)

buildsucceeded 15 июль 2011, в 14:26
Пример минимального звука C для синтеза музыки Canon: stackoverflow.com/questions/2205070/…
Ciro Santilli 新疆改造中心996ICU六四事件 01 сен. 2018, в 09:26
Показать ещё 2 комментария

Поделиться:

16 ответов

Лучший ответ

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

MissT 02 апр. 2009, в 20:18
Поделиться

По моему опыту, с WaveOutWrite Win32 API легче работать, чем с DirectSound, даже когда DirectSound более мощный. (Кроме того, DirectSound был заменен XACT, AFAIK).

Jasper Bekkers 05 апр. 2009, в 17:35

К сожалению, в отличие от OpenGL, OpenAL на самом деле не является открытым стандартом, поскольку это проприетарное программное обеспечение, поддерживаемое Creative. Он также предназначен для трехмерных компьютерных игр с моделью Listener, Sources и Buffers (и расстояниями, скоростями). Я бы сказал, что если вы действительно хотите перейти к ядру, вам следует использовать API операционной системы, над которой вы работаете (например, win32 API для Windows, CoreAudio API для OSX, не совсем уверенный в Linux).

rwols 10 янв. 2013, в 12:32

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

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

Как записать звук с компьютера в Windows 10 за пару минут.

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

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

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

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

Emile Vrijdags 05 апр. 2009, в 20:40
Поделиться

Matlab был моим первым опытом кодирования! Я бы, наверное, не был бы здесь сейчас (на Stack Overflow, то есть!), Если бы меня не учили DSP в Matlab в Uni. У меня все еще есть старая копия — возможно, мне стоит поиграть с этой первой . хорошей идеей.

Skilldrick 05 апр. 2009, в 20:53

Я был тяжелым пользователем Matlab на работе. Я работал над библиотекой Nsound в C ++, которая похожа на matlab: youtube.com/watch?v=j4uLvl68PtI

Nick 27 нояб. 2014, в 20:02

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

Читайте также:
Что такое за программа vcomp100 dll

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

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

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

jalf 02 апр. 2009, в 21:05
Поделиться

Просто помните, что обработка аудио — это, как правило, процесс в реальном времени, в котором вы должны предварительно выполнять сложные (FFT) вычисления в порядке миллисекунд, потому что вам нужно поставить аудио в очередь. Если вы опоздали, вы услышите заметные артефакты.

Jasper Bekkers 05 апр. 2009, в 17:41

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

Chris Lutz 02 апр. 2009, в 21:45
Поделиться

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

gath 07 июль 2009, в 04:52

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

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

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

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

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

Assembler 05 апр. 2009, в 18:51
Поделиться

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

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

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

Читайте также:
Как отредактировать готовую программу

Paul R 08 март 2010, в 08:38
Поделиться

С++ может быть отличным языком для обработки звука, я использую 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 getctrl(«mrs_realvec/processedData»)->to()

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

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 getctrl(«mrs_realvec/processedData»)->to()

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

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

Источник: overcoder.net

Урок 29 SFML C++ Звуки и музыка

Звук ( sf::Sound ) – подходит для короткихмаленьких звуков (прыжков, выстрелов), это более легковесный объект, помещается в памяти.

Музыка ( sf::Music ) – не загружает весь ваш файл в память, вместо этого он передает его “на лету” из вашего файла. Используется для сжатых музыкальных сопровождений, которые длятся от одной до нескольких минут.

Для загрузки звуков – такая конструкция:

sf :: SoundBuffer buffer ;
buffer . loadFromFile ( какой — то файл ) // тут загружаем в буфер что то
sf :: Sound sound ;
sound . setBuffer ( buffer ) ;
sound . play ( ) ;

На примере рассмотрим:

В продолжение предыдущим урокам научим нашего персонажа озвучивать свою стрельбу.

Я буду использовать этот звук стрельбы:
shoot

Помещу его в папку с main.cpp (лучше внутри ещё одну папку sounds создать)

SFML не поддерживает mp3. Только WAV, FLAC, OGG/Vorbis

Я буду использовать ogg, в инете есть конвертер mp3 в ogg онлайн, удобно. Например вот: http://audio.online-convert.com/ru/convert-to-ogg

Там где загружаем картинки и уровень напишем (а вы старайтесь не городить всё вместе и разделять)

SoundBuffer shootBuffer ; //создаём буфер для звука
shootBuffer . loadFromFile ( «shoot.ogg» ) ; //загружаем в него звук
Sound shoot ( shootBuffer ) ; //создаем звук и загружаем в него звук из буфера

Теперь в месте , где мы нажимаем кнопку выстрела, а так же сразу после появления пули пишем:

entities . push_back ( new Bullet ( BulletImage , «Bullet» , lvl , p . x , p . y , 16 , 16 , pos . x , pos . y ) ) ; //и передаем в конструктор пули. создается пуля

shoot . play ( ) ; //играем звук пули

Запускаем и проверяем. Напишите shoot. и посмотрите варианты, которые предлагаются. Например там можно задать громкость setVolume, или перемотать.

Перейдем к музыке:

конвертните свой файл музыки в .ogg или другой съедобный формат и закиньте в папку с main.cpp

теперь после создания (не воспроизведения, а создания!) звука пишем:

Music music ; //создаем объект музыки
music . openFromFile ( «music.ogg» ) ; //загружаем файл
music . play ( ) ; //воспроизводим музыку

Всё, музыка будет играть. После того, как она кончится – она может замолчать. На форуме был такой вопрос. Есть стандартное решение, по моему music.setLoop(true); зациклит музыку и она будет играть снова. Опять же напечатав music. Вы увидите ф-ции , которые есть у этого объекта.

Читайте также:
Верный вариант запуска ms access с помощью окна запуск программы

Там же есть getStatus, который вернет “играется ли сейчас музыка?” . Не играется? Ну так включаем: music.play (), но это уже второй способ зациклить музыку. Первый стандартный и более простой. Это Вам как пример.

Самая частая проблема, с которой Вы столкнетесь – зацикливание. Если Ваше событие происходит бесконечное количество раз (всегда == true например), то звук не сможет проиграться , он будет играть всегда с самого начала. Поэтому будьте внимательнее.

Источник: kychka-pc.ru

Стрелялка с Pygame №8: звук и музыка

Восьмая часть проекта «Стрелялка с Pygame». Если пропустили, обязательно вернитесь и начните с первой части.
В этом уроке в игре появятся музыка и звуки.

В этой серии уроков будет создана полноценная игра на языке Python с помощью библиотеки Pygame. Она будет особенно интересна начинающим программистам, которые уже знакомы с основами языка и хотят углубить знания, а также узнать, что лежит в основе создания игр.

Сила звука

Хороший звук (музыка и звуковые эффекты) — это один из самых эффективных способов добавить в игру «энергии». Это неофициальный термин из геймдизайна, который применяется по отношению к элементам, делающим игры более веселыми и захватывающими. Его часто называют «чувством игры» (game feel).

Как и в случае с графикой, найти подходящие звуки может быть непросто. OpenGameArt — отличное место для поиска аудио-ассетов, но в этот раз попробуем другой подход — создать звуковые эффекты самостоятельно.

Создание собственных звуков

Для этого будет использоваться инструмент под названием Bfxr. Он выглядит следующим образом:

Создание собственных звуков

Но не стоит пугаться этого многообразия слайдеров и жаргонизмов. Кнопки слева случайным образом генерируют звук выбранного типа. Попробуйте нажать «Shoot» несколько раз. Сгенерированные звуки сохранятся в списке ниже.

Для Стрелялки нужны звуки «выстрела» и «взрыва». После получения подходящего звука, нужно нажать на кнопку «Export Wav» (НЕ «Save to Disk»).

Дальше необходимо создать папку «snd» (как и для изображений) и переместить WAV-файлы туда. Можете использовать, например, эти звуки:

Обратите внимание, что здесь два звука взрыва. Можно сделать так, чтобы они воспроизводились случайным образом, и таким образом добавить разнообразия в игру.

Теперь нужна музыка. Ее можно поискать на OpenGameArt или использовать следующую:

Обратите внимание, что автор указал «Attribution Instructions» (модель атрибуции). Это условия, которые выбрал музыкант, чтобы лицензировать свое произведение. Это значит, что его нужно упомянуть. Для этого достаточно скопировать и вставить текст со страницы в верхнюю часть программы.

Добавление звука в игру

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

# Frozen Jam by tgfcoder licensed under CC-BY-3 # Art from Kenney.nl import pygame import random from os import path img_dir = path.join(path.dirname(__file__), ‘img’) snd_dir = path.join(path.dirname(__file__), ‘snd’)

Дальше файлы необходимо загрузить. Это стоит сделать в том же месте, где загружалась графика. Сначала звук выстрелов:

# Загрузка мелодий игры shoot_sound = pygame.mixer.Sound(path.join(snd_dir, ‘pew.wav’))

Теперь, когда звук загружен и присвоен переменной shoot_sound , на него можно ссылаться. Важно, чтобы он воспроизводился каждый раз, когда игрок стреляет, поэтому его нужно добавить в метод shoot() :

def shoot(self): bullet = Bullet(self.rect.centerx, self.rect.top) all_sprites.add(bullet) bullets.add(bullet) shoot_sound.play()

Это все, что требуется. Стрелять теперь будет приятнее!

Дальше нужны звуки взрывов. Загрузим оба и добавим их в список:

# Загрузка мелодий игры shoot_sound = pygame.mixer.Sound(path.join(snd_dir, ‘pew.wav’)) expl_sounds = [] for snd in [‘expl3.wav’, ‘expl6.wav’]: expl_sounds.append(pygame.mixer.Sound(path.join(snd_dir, snd)))

Для воспроизведения взрывов нужно будет случайным образом выбирать один и включать его при разрушении астероида.

# проверка, попала ли пуля в моб hits = pygame.sprite.groupcollide(mobs, bullets, True, True) for hit in hits: score += 50 — hit.radius random.choice(expl_sounds).play() m = Mob() all_sprites.add(m) mobs.add(m)

Музыка

Наконец, необходимо добавить фоновую музыку, которая сделает игру более эмоциональной. Здесь необходим другой подход, потому что музыка играет непрерывно.

Сначала загружаем файл:

expl_sounds = [] for snd in [‘expl3.wav’, ‘expl6.wav’]: expl_sounds.append(pygame.mixer.Sound(path.join(snd_dir, snd))) pygame.mixer.music.load(path.join(snd_dir, ‘tgfcoder-FrozenJam-SeamlessLoop.ogg’)) pygame.mixer.music.set_volume(0.4)

Музыка довольно громкая, поэтому, чтобы она не перекрывала звуки, необходимо опустить ее максимальную громкость до 40%.

Чтобы музыка играла, нужно просто выбрать в каком месте кода она будет стартовать. В случае Стрелялки это будет позиция перед началом игрового цикла.

score = 0 pygame.mixer.music.play(loops=-1) # Цикл игры running = True

Параметр loops определяет, как часто трек будет повторяться. Если установить значение на -1 , то он будет воспроизводиться бесконечно.

Игра теперь ощущается совсем по-другому. Геймплей не поменялся, но с музыкой и звуками все воспринимается живее. Осталось поэкспериментировать с разными звуками и понять, какие подходят лучше.

В следующем уроке добавим игроку щиты, чтобы он не умирал так быстро.

Источник: pythonru.com

Рейтинг
( Пока оценок нет )
Загрузка ...
EFT-Soft.ru