Биперные дела #2
Немного продолжаю ковыряния с бипером и Plip Plop-подобными движками.
Решил проверить одну давнюю идею, о которой давно шли разговоры, но мало кто реализовал: сделать такой движок, в котором код синтеза будет чередоваться с логикой проигрывателя, и таким образом звук будет ровный, без треска.
Идея такая: есть макрос или подпрограмма одного цикла синтеза звука, которая занимает наименьшее количество тактов и использует только определённые регистры (у меня это IX и теневой набор), оставляя остальные для прочего кода. Макрос лучше по скорости, подпрограмма добавляет накладные расходы в 27 тактов на каждый вызов, но зато подпрограмма сильно экономит память.
Так как регистры не портятся, я просто вставляю каждые N тактов в код движка call на синтезатор, и выравниваю код по тактам между вызовами.
В псевдокоде это выглядит примерно так:
call synth ;100 тактов
..какой-то код ;100 тактов
call synth ;100 тактов
..какой-то код ;100 тактов
И так сколько-то раз, пока не кончится логика.
Но это ещё не всё. Есть вторая часть. Я задумал сделать движок с плавным эффектом вибрато, которое очень сложно заставить чисто звучать когда оно работает по кадрам.
Для того, чтобы это реализовать, я решил применить новую технику. Питч в движке хранится в «центах» и номерах нот. В одном полутоне у меня 8 центов, весь диапазон в 8 октав получается 768 центов. Чтобы быстро преобразовать центы в делитель, применяется табличка размером в 1536 байт.
Вибрато реализуется через табличку в 256 байт, знаковых 8-битных смещений, также хранимых в центах. Всего 8 табличек, максимальный размах 16 центов. Итого 2048 байт. Смещение расширяется до 16 бит, складывается с центами базового питча. Скорость движения по табличке задаёт скорость вибрато.
Помимо линейного вибрато этот способ даёт возможность сделать плавный линейный слайд по всему диапазону, а также арпеджио: просто прибавляем его ступени к значению питча, и какая бы не была нота или положение между нотами, арпеджио будет звучать корректно. Это я пока не реализовал.
У метода с центами есть свои недостатки. При нехватке разрешения часть фактических делителей для центов может просто совпасть. Собственно, это и происходит на низких нотах, из-за чего не все сочетания октав и расстроек работают предсказуемым образом.
В общем, пока это просто тест. Думаю, куда двигаться дальше: развить эту идею до полноценного движка, или же наоборот, пойти в сторону хардкорной классики и просто сделать современную версию Plip Plop с классическим кодом синтеза и новым компактным форматом данных.
phazerro_take1.zip6.14 KbDownload
На самом деле, конечно, пусть распускаются все цветы: надо сделать и то, и другое, но пока некогда.
рабочее
1bit