Создание звуков без библиотеки?

Я пытаюсь найти документацию, учебные пособия, примеры того, как создавать звуки. Я имею в виду, не используя библиотеку, которая скроет все интересные вещи.

Мне интересно звучать, и я хочу начать с ним что-то делать, но я не знаю, с чего начать.

Исправьте меня, если я ошибаюсь, но самый низкий уровень для генерации звука - один из них (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-) использовала шаговый двигатель флоппи-дисковода в качестве аудиовыхода.