Перейти к публикации
Fingercomp

Как работает звуковая карта?

Рекомендованные сообщения

Взываем на помощь богов и богинь звука!

 

В общем, в CX в 1.6.1 заезжает крутейшая, звуковая карточка. Я сейчас вкратце опишу её функции, взятые из исходников мода.

  • sound.modes — это таблица, которая содержит пары "имя формы волны ⟷ её код" и наоборот. Например, sound.modes.sine вернёт код для синусоиды. Вроде 0, лень вверх по сырцам бежать.
  • Имеются следующие формы волн:
    • square (ква... меандр),
    • sine (синусоида),
    • triangle (треугольная),
    • sawtooth (пилообразная).
    • А ещё есть noise — это белый шум.
  • Есть функция sound.setTotalVolume(volume: number), которая моментально для всех каналов выставляет общую громкость (от 0 до 1).
  • Каналы? Их, как и у предшественников — шумовых и пищащих карт, — 8 штук. Они нумеруются от 1 до 8 включительно, и на каждый из них можно поместить...
  • Инструкции, которыми управляется звуковая карта. Есть некая "очередь" у звуковой карточки, в которую помещаются определённые инструкции, и затем...
  • sound.process() запускает в фоне обработку этой "очереди". То есть, будут устанавливаться параметры, играться звук и прочее.
  • Обращу внимание, что это всё в фоне, да. То есть, нам нужны циклы типа таких: while not sound.process() do os.sleep(.05) end.
  • Очередь можно почистить через sound.clear().
  • И снова про каналы. Каждый из них может быть закрыт или открыт. Соответственно, закрытый канал в большинстве случаев играть звук не будет, а открытый — с превеликим удовольствием.
  • Открыть можно с помощью sound.open(channel: number), закрыть — sound.close(channel: number). И да, это уже инструкции.
  • Вот вам ещё инструкций. Можно установить форму волны на отдельном канале: sound.setWave(channel: number, type: number), вторым аргументом надо скормить код, полученный через sound.modes.
  • Можно установить частоту этой самой волны с помощью sound.setFerquency(channel: number, frequency: number). Инструкция, а как же.
  • Если вы любители... ээ, регистра сдвига с линейной обратной связью, в общем, LFSR/РСЛОС, можно даже на канал ответственную задачу генерирования этого шума возложить. Функция: sound.setLFSR(channel: number, initial: number, mask: number). Чёрт знает, как она работает.
  • Функция sound.delay(duration: number), должна, вообще, выставить какую-то задержку с данной длительностью в миллисекундах. Но что-то я совершенно не понимаю, как её использовать. А использовать надо! Иначе звука не будет.
  • И сразу же можно поставить частотную модуляцию с помощью sound.setFM(channel: number, modIndex: number, intensity: number). Или убрать её: sound.resetFM(channel: number).
  • Тем же образом можно выставить и амплитудную модуляцию. sound.setAM(channel: number, modIndex: number) и sound.resetAM(channel: number).
  • С помощью sound.setADSR(channel: number, attack: number, decay: number, attenuation: number, release: number) имеется возможность выставить ADSR-огибающую. Второй, третий и пятый аргументы указываются в миллисекундах, четвёртый — в виде числа от 0 до 1.
  • Или убрать её: sound.resetEnvelope(channel: number).
  • Для отдельного канала возможно выставить громкость, для этого нужна команда sound.setVolume(channel: number, volume: number). Громкость, как обычно, от 0 до 1.

Собственно, это все функции.

Теперь осталась мааааленькая запинка, с которой после несколько часов тыканья я не особо справился. Как заставить эту карту сгенерировать мне звук?

Потому предлагаю поиграться с этой штукой всем форумом :gamer2:

  • 1.7.10: качаем OC, CX и Asielib.
  • 1.8: OC тут, Asielib не нужен.
  • 1.9: OC тут, Asielib тоже не нужен.

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Ну вот, хоть что-то нормальное будет в этом моде. Генерировать музыку на кассетах, была та еще пытка.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Походу мод ещё не доделан. У шумящей карты нет функции для открытия канала. Я так и не понял как её тестить не открывая канал.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
Всё там доделано и работает прекрасно.

Если разобрался, может напишешь гайд?

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Если разобрался, может напишешь гайд?

Напишу. После релиза CX.

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

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
Напишу. После релиза CX.

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

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

Тестил я вчера новые версии ОС и СХ. Ничего не понял как работает в этих картах СХ.

Тут без 100 грамм костной пыли не разобраться.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Вообщем повозился с вашей карточкой и вышло вот что:

component.sound.open(1)
-- Создаем очередь из частот и сразу обрабатываем
for n=1,1000 do
  component.sound.setWave(1,component.sound.modes.sine)
  component.sound.setFrequency(1,n)
  component.sound.delay(1)
  component.sound.process()
end
-- Слушаем получившийся бульк и радуемся что все работает 
Изменено пользователем TC1061

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Спустя этой просьбы прошёл почти год, когда я написал свой гайд по этой штуке в трёх частях с подробным объяснением. Больше мне не нужно ничего в этом топике, естественно.

 

Ну и по коду: указание волны и процессинг нужно вынести из цикла, а ещё лучше будет заюзать треугольный FM-модулятор.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Спустя этой просьбы прошёл почти год, когда я написал свой гайд по этой штуке в трёх частях с подробным объяснением. Больше мне не нужно ничего в этом топике, естественно.

 

Ну и по коду: указание волны и процессинг нужно вынести из цикла, а ещё лучше будет заюзать треугольный FM-модулятор.

Ой простите. Но, если вынести из цикла указание волны и процессинг, звук ведь совсем не такой выйдет?

Изменено пользователем TC1061

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

звук ведь совсем не такой выйдет?

Гм, разве? Настройки же кумулятивны... в смысле, не сбрасываются сами по себе. Как минимум, когда я писал synth (2017-05), они такими были.

Изменено пользователем Fingercomp

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Гость
Ответить в тему...

×   Вставлено в виде отформатированного текста.   Вставить в виде обычного текста

  Разрешено не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отобразить как ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

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


×