Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- sound.modes — это таблица, которая содержит пары "имя формы волны её код" и наоборот.
- sound.setTotalVolume(volume: number) выставляет общую громкость для всех каналов (от 0 до 1).
- sound.setVolume(channel: number, volume: number) выставить громкость для отдельного канала
- sound.process() запускает в фоне обработку этой "очереди". То есть, будут устанавливаться параметры, играться звук и прочее.
- sound.clear() почистить очередь.
- sound.open(channel: number) Открыть канал.
- sound.close(channel: number) закрыть канал.
- sound.setWave(channel: number, type: number) установить форму волны на отдельном канале: вторым аргументом код, полученный через sound.modes.
- sound.setFerquency(channel: number, frequency: number) установить частоту
- sound.delay(duration: number) задержку с данной длительностью в миллисекундах
- sound.setFrequency(channel: number, frequency: number) Установить указанную частоту
- sound.setLFSR(channel: number, initial: number, mask: number) регистр сдвига с линейной обратной связью, в общем, LFSR/РСЛОС
- 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); sound.resetEnvelope(channel: number) выставить/убрать ADSR-огибающую. Второй, третий и пятый аргументы указываются в миллисекундах, четвёртый — в виде числа от 0 до 1.
- local sound = require("component").sound
- sound.open(1)
- sound.setWave(1, sound.modes.sine)
- sound.setFrequency(1, 404)
- sound.setADSR(1, 400, 500, 0, 1)
- sound.setVolume(1, 1)
- sound.setTotalVolume(1)
- sound.delay(5000)
- while not sound.process() do
- os.sleep(.05)
- end
- setADSR(channel, attack, decay, attenuation, release)
- вот что там
- attenuation, если что, — это типа затухание
- > attack, decay, release — всё целые числа, это миллисекунды
- > а вот attenuation — нормализованное число
- > в смысле, от 0 до 1
- > ща смотрю в сырцах, что за хрень это
- > attenuation ставит скорость затухания, что ли
- > 0 — это самая высокая громкость звука
- > которая заявлена официально
- > 1 — это отсутствие звука вообще
- > к этим значением будет стремиться громковть в фазе Decay
- > и от этого значения будет затухать звук в фазе Release
- > есть у нас будет setADSR(1, 500, 500, 0.5, 500)
- > то тогда 500 мс звук будет от 0 до заданной громкости идти
- > потом за ещё 500 мс громкость уменьшится наполовину
- > и 500 мс от полгромкости до нуля идти будет
- > если будет setADSR(1, 500, 500, 1, 500)
- > то 500 секунд будет от 0 до заданной громкости идти звук
- > и потом мгновенно пропадёт
- > вот что у тебя и происходит
- > у тебя значение 410 вносится в границы [0; 1]
- > получаем единицу
- > и потому звук сразу после Attack глохнет
- > у тебя delay меньше длины ADSR итоговой
- > delay меньше ADSR
- > максимальное затухание означает ЗАТУХАЙ БЫСТРО
- > чем это чревато
- > после конца delay сразу же переходит в фазу Release
- > даже не достигнув Attack
- > у тебя 660 мс должна увеличиваться громкость
- > но на точке 90 мс сразу начнёт затухать
- > с заданной скоростью
- > если 1 — мгновенно потухнет
- > если 0 — потухнет через 900 мс
- > вот так это работает
- > так что увеличивай Delay на период Attack + Decay
- > минимум
- > т.е., 1300
- > и будет полная нота
- > в программе скорость идет как 8 нот в секунду, а мелодии затухания ноты хватает только на ~6 надо пересчитывать
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement