+
Hardware Profile Feed

Синтезатор - это просто ^ ^

Всем привет!

Хочу поделиться радостной вестью: я на пороге создания своего собственного железного синтезатора.

Да-да, вы не ослышались.

Как же у меня случился столь стремительный научно-технический прорыв и ментальный штурм?

Отвечу простой аббревиатурой, которая попалась мне на глаза буквально месяц назад и в течение месяца в редкие  часы свободного времени мне удалось сделать полностью адекватный, скомпилированный без ошибок проект ЖЕЛЕЗНОГО СИНТЕЗАТОРА С MIDI ВХОДОМ!

Это чудо называется F.P.G.A.

Я воспользовался одной из самых дешевых разновидностей этой технологии под названием C.P.L.D.

Чтобы не мучать вас долгими лекциями кибернетики и цифровой электроники, скажу простыми словами: это микросхема, которая сделана из матрицы блоков, которые делают нужные логические и арифметические действия и связи между ними прошиваются спецпрограмматором, позволяя создать собственный микропроцессор С НУЛЯ.

Итак, цены с алиэкспресса:

Intel MAX II EPM240 голый чип – 30 грн/1$ оптом за штуку

И да, в один этот чип мне удалось впихнуть  простейший осциллятор с выбором волны и миди входом. Я просто в шоке)

Но 30 грн этого мало. Нужна плата, программатор, внешний генератор колебаний на 50МГц. В итоге у китайцев есть готовое решение для  ламеров – стартерпак-комплект за 230 грн (7$)

aliexpress.ru/item/40002045447…

Кроме того нужны 2 флэш памяти – на одной нужно записать таблицу музыкальных частот, чтобы синтезатор мог читать нужное значение для нужной ноты и генерировать волну на этой частоте, а на второй нужно записать наборчик волн в виде таблиц значений волный за один период, WAVETABLE. Осциллятор генерирует не саму волну, а адрес ячейки таблицы в нужный момент времени и волна уже превращается цифроаналоговым преобразователем (на группе резисторов и операционный усилитель) в аналог с выхода этой флэшки. Флэшки эти не NAND типа (те которые знает обычный юзверь), у которых ограниченный срок службы в 1500 циклов перезаписи, а EEPROM – ее можно перезаписывать примерно 100000 раз, такой себе биос! Но объем ее намного меньше, в виду дорогой технологии. Стоит одна флэшка 1,5-2 бакса, купить 16 мбит можно например здесь: www.kosmodrom.com.ua/el.php?na…, и для ее прошивки нужен специальный программатор, который достаточно дорог (от 50$), но если вы талантливый погромизд и у вас есть ардуина за 6-12$, вы можете сами сделать себе программатор))

Цифроаналоговый преобразователь делается из копеечных резисторов и микросхемки простейшего операционного усилителя звука LM358N, к нему можно сразу подключать наушники, схемы гуглите в интернети. Работает ЦАП так: на вход по 8 дорожкам подается 8 битное число и оно превращается в аналоговое пропорциональное напряжение почти мгновенно!

Итак, давайте же разберемся, как же нам сгенерировать звук.

Задача состоит в том, чтобы устройство выдавало 8 битное число, которое периодически нарастает от 0 до 255 с нужной скоростью и в конце сбрасывается в ноль. Выглядит это так 


01 - SAW @ Kingdom

V = 255, при этом на графике разумеется будет 2 в 8-й степени = 256 ступенек, потому что все цифровые счетчики умеют прибавлять  минимум по единичке. В реале у вас получится пилообразная волна с 256 ступеньками, хотя они достаточно маленькие и на слух 8 битные ступеньки практически не слышны. Внимание, не путать 8 битный звук с 8 битными приставками! Хочу развеять один миф. 8 битная приставка NINTENDO на самом деле генерирует 4-хбитный звук и 4-х битный цвет, это 16 ступенек, которые ухо четко различает как чиптюн, а 8 битными приставки назвали потому что 8 бит в них … это размер шины ДАННЫХ, А НЕ ЗВУКА!

Хорошо, скажете вы, а как же нам сделать другие волны, не пилу? А нам нужно это нарастающее число использовать, как адрес таблички, в которой записаны совсем другие значения напряжения волны! Какие угодно – синус, прямоугольник, тысячи разновидностей волн, которые даже можете нарисовать руками)) Для этого нам и нужна флэшка, в которую мы запишем табличку из 256 значений графика волны за один период, на вход флэшки подаем номер ячейки таблички, на выходе – вуаля – уже совсем другая нужная волна, в цифровом разумеется виде


02 - WAVE @ Kingdom

Окей, со ступеньками и формой волны разобрались, а как же нам быть с частотой? Как заставить это устройство считать с нужной скоростью, чтобы получить нужную нам музыкальную частоту генерации пилы?

Давайте разберемся, какое устройство нужно, чтобы генерировать нарастающее число. Нам для этого нужен обыкновенный счетчик.  Это такая электронная штука, которая хранит число и циклически с каждым шагом увеличивает его на единичку до заданного максимального значения. Для того чтобы счетчик считал, к нему подключают ножку генератора импульсов, такие генераторы выдают простые квадратные щелчки, стоят копейки и используются для процессоров и разных устройств, чтобы они считали шаги и выполняли команды по очереди. Счетчик получает один импульс от генератора и увеличивает свое число на 1. Все просто. Скорость счета равна скорости импульсов. В моем проекте я использую генератор на 50МГц. Это 50 миллионов счетов за одну секунду. Тогда какая же будет частота нашей нарастающей пилы, если мы со скоростью 50млн в секунду будем увеличивать на единичку 256 раз, от нуля до 255? Правильно, в 256 раз медленнее, то есть 50 000 000/256 = 195312,5 Гц. Нуу, скажете вы, это же очень быстро, музыка не играет на такой частоте, как же нам замедлить счет еще больше и как нам считать с разными скоростями используя всего один генератор импульсов?

Первый секрет. Это увеличить максимальное число счетчика, очень сильно, значит счетчик будет считать до него гораздо дольше, а значит частота пилы будет гораздо меньше, а чтобы превратить это огромное число назад в диапазон 0-255, мы просто поделим его ровно настолько, насколько умножали. Хорошо, если мы будем делить частоту 50 МГц таким способом на целые числа, у нас получатся частоты, которые кратны 50 МГц, но они будут сильно отличаться от музыкальных частот, которые нам нужны, вот табличка для равномерно темперированного строя


03 - TUNE @ Kingdom

Кроме того, счетчик использует двоичный код, а значит считает до числа кратного степени двойки.

Например если мы использует 24 бита

Nmax = 2^24-1 = 16777215

А для 32-х бит 

Nmax = 2^32-1 = 4294967295

Если мы будем считать от 0 до 4294967295 со скоростью 50 000 000 Гц, мы получим пилу с частотой 50000000/ 4294967296 = 0,0116415321826934814453125 Гц.

Это просто невероятно медленно. Окей, как же тогда нам получить нужную частоту? А давайте прибавлять не единичку, а некое целое число! Это и есть второй секрет: так мы ускоряем счет, но уже не так радикально, как замедление увеличением битности. Чтобы узнать какое это число, нам нужно искомую частоту разделить на этих самых пресловутых 0,0116415321826934814453125 Гц. 

Для 1 Гц это число равно ПРИБЛИЖЕННО 

1Гц / 0,0116415321826934814453125 Гц = 85,89934592.

То есть нам нужен счетчик, который в каждом шаге прибавляет не 1, а 85,89934592 или округлим до 86.  Давайте умножим 

86 на 50 000 000 = 4300000000

Получается погрешность 

4300000000/4294967296-1 = 1,0011717677-1=0,0011717677 или примерно 0,12%!

Неплохо, да? Мы получили волну 1Гц с погрешностью 0,12%!

Победа))

Осталось рассчитать эти прибавки счетчика для КАЖДОЙ музыкальной частоты из таблицы и записать эти прибавки в нашу первую флэшку. Когда нам нужно сыграть на нужной ноте, мы подаем номер ноты на вход флэшки, читаем нужное нам ЗАРАНЕЕ ПРОСЧИТАННОЕ 32-х битное число, и счетчик постоянно складывает вместе с этой прибавкой.

А чтобы на выходе у нас было 8 бит, мы просто берем из этого числа старшие 8 бит, таким образом делим огромное число на 2^24.

Есть еще один нюанс, чисто аппаратный. Флэшка может за один раз выдать только 8 бит из памяти, а нам нужно 32. Значит нужно собрать  читалку , которая читает 4 байта (1 байт = 8 бит) подряд и подает готовое 32х битное число на счетчик.

Итак, структурная схема осциллятора с читалкой получилась такая 


Synth PM @ Kingdom

Пройдемся по обозначениям:

OSC – генератор импульсов, я вначале использовал встроенный в MAX II генератор 5,56 МГц, потом узнал, что на китайской плате стоит внешний на 50 МГц, провод ON включает генератор, если подать «1».

Counter328 – 32-х битный счетчик адреса волны с 8 битным выходом адреса на вторую флэшку волны, 32-хбитным входом прибавки Def, 8-хбитным входом фазы(это даст возможность сделать FM синтез)

Countread – читалка прибавок частот  с первой флэшки

Толстые линии – это жгуты/шины проводов.

А вот чтобы сделать все эти счетчики и схему, мне пришлось изучить настоящий язык эльфов VERILOG и программу для разработки QUARTUS!

Код счетчика:

module counter328(

    clk,

clr,

def,

phase,

clk2,

    adr

);


input clk;

input clr;

input [31:0]def;

input [7:0]phase;

output clk2;

output [7:0]adr;


reg [31:0]cnt = 0;


assign adr[7:0] = cnt[31:24]+phase[7:0];


assign clk2 = cnt[31];


always @(posedge clk or posedge clr) begin

    if (clr)

        cnt <= 0;

    else

        cnt <= cnt + def;

end


endmodule

Код читалки:

module countread(

    clk,

clr,

in,

adr,

    out

);


input clk;

input clr;

input [7:0]in;

output [1:0]adr;

output [31:0]out;

reg [31:0]out;

reg [31:0]buffer;


reg [2:0]cnt = 0;


assign adr[1] = cnt[2];

assign adr[0] = cnt[1];


always @(posedge clk or posedge clr) begin

    if (clr)

        cnt <= 0;

    else begin

        case(cnt)

  0:begin

  out <= buffer;

  end

  1:begin

  buffer[7:0] <= in[7:0];

  end

  3:begin

  buffer[15:8] <= in[7:0];

  end

  5:begin

  buffer[23:16] <= in[7:0];

  end

  7:begin

  buffer[31:24] <= in[7:0];

  end

  endcase

  cnt <= cnt + 1;

end   

end


endmodule

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

Вот его контакты

https://vk.com/bolshakov_av

https://vk.com/fpga_synth

https://habr.com/ru/users/UA3MQJ/

Отдельно хочу поблагодарить его за интеллектуальную помощь.


Финальная версия синтезатора которую я хочу прошить в чип, выглядит в проекте вот так


Synth MIDI PM @ Kingdom

 

Скачать и посмотреть в Full HD можно здесь

И да. Тема очень сложная и я не буду вас учить микроэлектронике! Учитесь сами)

SYNTHCRAFT
6 ▲
19 March 2020 13:29
Kingdom

Comments

Pinned comments
Monkeys Pride  9 November 2020 1:15
Арчи радуется когда Пашка делает успехи
UA3MQJ  19 March 2020 14:21
В полку ПЛИСоводов прибывает, это отлично! )))
Но рекомендую макс240 оставить под какие-нибудь ТТЛ делительные эксперименты с синтезаторами на меандрах. А для твоей задачи взять любой Cyclone на 1000 ячеек. У китайцев такие платы есть. Что-то типа этого:

aliexpress.ru/item/1795558846. …

Зато весь твой замысел обойдется без внешних микросхем. В этой плисине есть еще и встроенная RAM память. Таблица с преобразованием нота-слово для DDS поместится легко. Как и волноформа генератора. Я вот даже семпл хэта на пол секунды помещал. Плюс в нем еще есть аппаратные умножители. Сможешь сделать сразу и VCA вместе с ADSR

Успехов!
крут, надеюсь эт сделает твои треки и творчество круче и интересней) будеш делать лайв записи треков)
а как там твой микс и переработкой треков? ещё недоделал? можноб было заценить уже
Пока занят синтом хех
В полку ПЛИСоводов прибывает, это отлично! )))
Но рекомендую макс240 оставить под какие-нибудь ТТЛ делительные эксперименты с синтезаторами на меандрах. А для твоей задачи взять любой Cyclone на 1000 ячеек. У китайцев такие платы есть. Что-то типа этого:

aliexpress.ru/item/1795558846. …

Зато весь твой замысел обойдется без внешних микросхем. В этой плисине есть еще и встроенная RAM память. Таблица с преобразованием нота-слово для DDS поместится легко. Как и волноформа генератора. Я вот даже семпл хэта на пол секунды помещал. Плюс в нем еще есть аппаратные умножители. Сможешь сделать сразу и VCA вместе с ADSR

Успехов!
Обязательно воспользуюсь, я буквально начал месяц назад
Молодец. Может тебе эта память на 32 Мбит понравится. imrad.com.ua/ru/m29w320et70n6e
Мне на таблицу 127 нот с 256 центами (1/256 полутона) хватит ровно 1 мбит^^. Один вейвформ весит вообще 256 байт
Вот и сделаешь аж два банка, а переключение замыканием старшего адреса на плюс или минус.
Ну ты маньяк. ) Поздравляю в связи переходом на новый уровень осознания бытия!
Я с другой планеты, ахах
Арчи радуется когда Пашка делает успехи
Короче мне пара валить с этого сайта тут такие гении музыки так что я пошел ,всем пока короче,не скучайте...
Хех, это уровень студентов политеха)))

Please, sign up (it's quick!) or sign in, to post comments and do more fun stuff.