Создание звуков без библиотеки? [закрытый]


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

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

Поправьте меня, если я ошибаюсь, но самый низкий уровень для генерации звука - это один из них (DirectSound , CoreAudio, ALSA, OSS) в зависимости от операционной системы. Поэтому я должен выбрать операционную систему и выучить соответствующий звук система?

Действительно ли это стоит того или я должен просто изучить библиотеку, которая охватывает все вышесказанное и предлагает кросс-платформенную совместимость?

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

4 11

4 ответа:

Вот пример, который поможет вам начать.

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

В некоторых системах Unix (ish) вы можете просто записать звуковые данные в /dev/audio (или /dev/dsp) и он будет играть. В современных системах Linux, использующих ALSA, вам может потребоваться передать его в aplay вместо этого. В любом случае, однако, вам не нужно использовать какую - либо конкретную звуковую библиотеку-просто откройте выходной поток и запишите в него. Вот как все этиbytebeat однострочники делают это.

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

Могу я предложить OpenAL ?

Все остальные ответы просто предполагают некоторую абстракцию или библиотеку. Всегда есть возможность откатиться назад непосредственно на аппаратное обеспечение. (Является ли это хорошей идеей-это совершенно другой вопрос и полностью зависит от вас)

Могу ли я предложить посмотреть код аудио драйвера? ДрайверEmu10k1 - это только один пример, доступный в исходных текстах linux.

Также стоит посмотреть вот это: "создание драйвера ядра для PC-динамика "

Я также помню, что дни на Amiga, где какой-то забавный чувак создал программу, которая (ab-)использовала шаговый двигатель дисководав качестве аудиовыхода .