Создание звуков без библиотеки?
Я пытаюсь найти документацию, учебные пособия, примеры того, как создавать звуки. Я имею в виду, не используя библиотеку, которая скроет все интересные вещи.
Мне интересно звучать, и я хочу начать с ним что-то делать, но я не знаю, с чего начать.
Исправьте меня, если я ошибаюсь, но самый низкий уровень для генерации звука - один из них (DirectSound
, CoreAudio, ALSA, OSS) в зависимости от ОС. Итак, я должен выбрать операционную систему и изучить соответствующую звуковую систему?
Это действительно стоит или я должен просто изучить библиотеку, которая обертывает все вышеперечисленное и предлагает кросс-платформенную совместимость?
Возможно, этот вопрос не очень ясен, и я сожалею об этом, но, как оказалось, я даже не знаю, чего хочу. Я просто пытаюсь найти что-то интересное для моего тезиса.
Ответы
Ответ 1
Вот пример, чтобы вы начали.
// filename "wf.cpp" (simple wave-form generator)
#include <iostream>
#include <cmath>
#include <stdint.h>
int main()
{
const double R=8000; // sample rate (samples per second)
const double C=261.625565; // frequency of middle-C (hertz)
const double F=R/256; // bytebeat frequency of 1*t due to 8-bit truncation (hertz)
const double V=127; // a volume constant
for ( int t=0; ; t++ )
{
uint8_t temp = (sin(t*2*M_PI/R*C)+1)*V; // pure middle C sine wave
// uint8_t temp = t/F*C; // middle C saw wave (bytebeat style)
// uint8_t temp = (t*5&t>>7)|(t*3&t>>10); // viznut bytebeat composition
std::cout<<temp;
}
}
скомпилировать и запустить в Linux через интерфейс ALSA:
make wf && ./wf |aplay
скомпилировать и запустить в Linux через интерфейс GStreamer:
make wf && ./wf |gst-launch-0.10 -v filesrc location=/dev/stdin ! 'audio/x-raw-int,rate=8000,channels=1,depth=8' ! autoaudiosink
GStreamer утверждает, что он кросс-платформенный. Основная интересная особенность заключается в том, что вы можете создавать (или использовать существующие) плагины для конструирования конвейера звуковых фильтров.
Ответ 2
В некоторых системах Unix (ish) вы можете просто записывать аудиоданные в /dev/audio
(или /dev/dsp
), и он будет воспроизводить, В современных Linux-системах, использующих ALSA, вам, возможно, потребуется перевести его на aplay
. Однако в любом случае вам не нужно использовать какую-либо специальную звуковую библиотеку — просто откройте выходной поток и напишите ему. Вот как это делают bytebeat однострочные.
Ответ 3
Вам нужно общаться со звуковым оборудованием, но время, в которое вы можете сделать это напрямую, уже давно...
Могу ли я предложить OpenAL?
Ответ 4
Все остальные ответы просто предлагают некоторую абстракцию или библиотеку. Всегда есть возможность отступить непосредственно на аппаратное обеспечение. (Является ли это хорошей идеей, это совершенно другой вопрос и полностью решать вам)
Могу ли я предложить посмотреть код аудиодрайвера? Драйвер Emu10k1 - всего лишь один пример, доступный в источниках Linux.
Также стоит посмотреть: " Создание драйвера ядра для ПК-динамика"
Я также помню дни на Amiga, где какой-то смешной чувак создал программу, которая (ab-) использовала шаговый двигатель флоппи-дисковода в качестве аудиовыхода.