Перейти к публикации
Форум - ComputerCraft
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 тоже не нужен.

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

  • Like 5

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


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

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

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


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

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

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


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

Всё там доделано и работает прекрасно.

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


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

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

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


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

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

Напишу. После релиза 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

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


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

Создайте аккаунт или войдите в него для комментирования

Вы должны быть пользователем, чтобы оставить комментарий

Создать аккаунт

Зарегистрируйтесь для получения аккаунта. Это просто!

Зарегистрировать аккаунт

Войти

Уже зарегистрированы? Войдите здесь.

Войти сейчас

×