Итак, захотелось мне когда-то стать диджеем. Не, не таким, которые собирают стадионы, и не таким, которые просто включают заранее сведенный микс из аблетона, а сами понтуются. Не, обычным диджеем-любителем, сам для себя. Вот знаете, кто-то для себя сборники песен составляет, а я вот люблю миксы. Чтобы без пауз, чтобы без всякого "зависалова", где песня только к половине начинает более менее годно "качать", ну и вот это вот все. Ранее я баловался с этим еще в самых первых версиях трактора, сначала с клавиатуры, а затем уже собрал относительно годный midi контроллер для Трактора. Но все это было не то, это привязка к компьютеру, определенные настройки, определенная звуковая карта с ASIO для уменьшения задержек (SB Live!) и прочий головняк с драйверами. Хотелось что-то такое, standalone штуку, чтобы включил и тут же попер сводить миксы. Давай гуглить я б.у. вертушки. Не, я знал, что подобное оборудование стоит больших денег. Но не настолько же! На эти деньги можно было бы купить вполне себе неплохую однушку - две цифровые вертушки и пульт. Ну, разумеется я не смотрел на модели с компакт-дисками - это казалось уже несколько анахронизмом, хотелось с флешки. А что умеют с флешки играть, там уже цена под потолок. Ну и решился. Собственно, вот он, первый диджейский проигрыватель на Атмеге:
Иногда попадались дни, когда я был практически ничем не занят на работе, ну собственно там и творил. Такой монтаж был выбран по причине невозможности ЛУТить на работе, но в большей степени и потому, что я еще сам не знал, какие функции туда добавлю, а проводки всегда можно перепаять, или добавить куски текстолита, если места будет мало. Частоты не те, можно не переживать.
ТЗ было относительно простое: повторить CD-DJ проигрыватель Pioneer CDJ-100, но только чтобы обязательно с флешки играло. Разрядность звука я думаю, очевидна - 22 кГц дискрет, и 8 бит. Воткнул туда атмегу32, с запасом, мало ли что. Не прогадал. Тут можно увидеть стандартный ЦАП R-2R, вот там, где синенький конденсатор и разьем на колонки. Этот цап, он же covox, как могут мне напомнить старые компьютерщики, подключался прямо на порт МК и проблем не вызывал. До определенного момента. Но об этом позже. Далее - экран, то есть дисплей. Тоже собственное изготовление, но поскольку я делал такие экранчики ЛУТом дома для калымов на работе , у меня оставались такие "дисплеи". Общается по SPI, пришлось писать для него собственный драйвер, т.к. готового в сети не нашел. Конструкция удачная и довольно универсальная, но - дорогая, потому что на плате стоит спецмикруха-контроллер 7значных 4символьных дисплеев, и стоит она одна почти тыщу рублей. Потому что у меня было их целый чемодан, поэтому и не 1602, вот почему. Иногда на работе возникают такие перекосы, что хоть из дома тащи. Ну или наоборот. Но - по ситуации!
Функции проигрывателя, коих должно быть минимум пара, но это же прототип, заключаются в следующем. Нужно уметь по нажатию Play пускать\останавливать трек, по нажатию кнопки Cue запоминать позицию в треке и при последующем нажатии из любого места в треке мгновенно перескакивать в эту запомненную позицию (на самом деле не совсем так, почитайте описание кнопки Cue к любому диджейскому проигрывателю, там сначала неочевидное поведение у нее. Затем loops - петли. Например, поймал начало бита и конец, закольцевал и бит играет бесконечно. Это две кнопки - первая ставит маркер на начало, а вторая ставит маркер на конец и одновременно запускает воспроизведение сначала. Иногда очень нужно, особенно в дабстепе, хехе. Ну вот у меня и получилось - слева направо: stop, cue, loop1start,loop1end.
Видны подтягивающие резисторы. Кнопки специально такие купил, ими так удобно клацать. А куда еще три кнопки понадобились? А это, господа, эффекты.
Собственно у CDJ-100 всего три эффекта - Jet, Zip, Wah.
Ах да, я же забыл написать, на чем это все построено. В смысле программная часть. За основу была взят кем-то переделанный проект Чена (elm-chan) простого плеера на тини13(забыл), вроде б как. Тот передельщик его немного упростил, сделав практически базисное ядро для создания всяких музыкальных открыток и говорящих игрушек, я уже давно забыл, где я это нашел, потому что искал и сохранял, помню вот только описание, а таких проектов в интернете сотни гуляет. Может это и самого Чена, не помню. Там проектов штук 20 насохранял когда-то себе. Что точно помню - в нем использовался вывод звука через модуляцию аппаратного ШИМ, за неимением скоростного синхронного ногодрыга. И тот вполне справлялся. Но это не спортивно же! Даешь COVOX! И МК пожирнее. Ну так я сначала на атмегу8 перенес тот проект, потом вывел значение звукового уровня напрямую в порт, и понеслось. Взял 32 мегу. Почему не 64? Офигел бы ее запаивать и плата уже ЛУТ автоматом, или шильды всякие - ну нафиг. Изначально проектик плеера занимал что-то там 5 Кб. Не много, но и не мало, с учетом того что я хотел по ТЗ.Мега 32 в дипе подошла идеально, полдня работы резаком на куске текстолита (а его завались было) - и можно запаивать! Впрочем я отвлекся. Еще про программную часть. В этом "микроплеере" использовалась FatFs, адаптированная под МК начального уровня, а сам код "плеера" мог читать исключительно wav файлы 8 бит, 22 кГц, моно. Ну и пойдет, решил я.И начал собирать. А какая одна из самых важных вещей диджейской вертушки? Правильно, регулятор питча, или говоря по-простому - регулятор скорости. Без него практически нереально свести два трека с чуть отличающимся темпом (bpm), поэтому там был добавлен взрослый такой переменник (советский, коробку нашел на складе), был заведен на канал АЦПа, и регулировал собственно частоту ногодрыга ЦАП. Получается такая картина - есть у нас кнопка пуск- стоп, есть флешка, регулятор скорости. С этим можно уже работать. Но самая мякотка этого проекта - это его Jog - колесо. Изготовлено из пластин дохлого харда, снизу обклеено малярным скотчем. В качестве датчика использована микросхема из оптической мыши (все строго б.у). Даташит на микросхему я не нашел, поэтому пришлось использовать Saleae logic китайский, для раскуривания протокола. Через месяц или три протокол я раскурил и понял, что это очень универсальная штука. Энкодер, грубо говоря. А о применении энкодеров в самоделках не писал только самый ленивый ЧПУшник. Из чего только энкодеры не делают - и из шаговых двигателей, и из старых шариковых мышей, печатают на прозрачной пленке риски и считывают их фотоэлементами...Но тут круче. Информации с датчика можно извлечь море, в том числе использовать его как скоростную видеокамеру 800 снимков в секунду, с огромным разрешением 18 на 18 пикселей. Но мне не надо было это, тем более один чувак из сети уже делал такую камеру. Мне надо было просто - инкремент, декремент. И всё. Поэтому я добавил в подпрограмму опроса Pitch резистора еще и показание с Jog, постоянно уменьшающееся. Для того, чтобы можно было этим диском "подгонять" трек, как настоящую виниловую пластинку, или замедлять, крутя в противоложную сторону. Разумеется, пришлось написать кастомный "драйвер", который общался по SPI с микросхемой мыши и читал ее регистры.Вот он, мышиный датчик.
Разрешение датчика получилось почти невероятных 5000 импульсов на оборот, но были проблемы с повторяемостью. То есть совершив один оборот, можно было получить как 5010 импульсов, так и 4980 импульсов, грубо говоря. Ну мышь была не игровая, и ладно с нее. Позднее на основе этой же технологии я делал энкодеры для опытного оборудования на нашем заводе. Там им повторяемость была не нужна настолько точно, а готовые энкодеры денег стоят. А тут мышей наколупал старых, и вуаля. Денег за это я не получил, правда, но был ценный опыт.
А дальше что? Ну забыл упомянуть флешку, обычная микроСД, общение по SPI через стандартные библиотеки (не ардуино) от того же плеера, от которого проект я и взял за основу. Точнее автор приводил на них ссылки. 2Гб, даже с wav файлами, я посчитал достаточным, по сравнению с CD дисками флешки это небо и земля. То ли в FatFS это уже все было.
Итого у нас получилась практически стандартная DJ вертушка (цифровая), экранчик показывал номер трека, и через секунду показывал, сколько секунд осталось до конца проигрывания. Можно играть скоростью (громкость не предусмотрел), останавливать, делать cue - точки и лупы.
А теперь про эффекты. Эффект Jet - это такой эффект, когда музыка начинает будто пропускаться через реактивный двигатель, смещая весь спектр выше или ниже (причем неравномерно). Кто-то подумает про БПФ на АВР, раскладывание спектра на составляющие и сборка их обратно в реальном времени? Нет. Все куда много проще. У нас есть кольцевой буфер, потому что данные с флешки читаются кусочками, и туда кладутся. С флешки они читаются быстрее, чем проигрываются, поэтому есть еще процессорное время. Никаких DMA! Чисто ногодрыг. В общем, создается буфер на 512 байт в ОЗУ , копирующий оригинальный буфер воспроизведения, но со сдвигом байт. А этот сдвиг байт определяется количеством инкремента или декремента с энкодера. Т.е. + 10 - пишем со сдвигом +10 байт, и наоборот. А затем все это сводится в программный микшер, который уменьшается в простую формулу (A + B) / 2 , где деление на два заменяется сдвигом. При нажатии кнопки Jet активируется вышеупомянутый механизм, и чем быстрее крутишь Jog, тем более "улетает" звук, достигая смещения до размеров буфера. Опытным путем было установлено, что чем больше вот таких относительно смещенных буферов, тем "глубже" становится эффект, при этом оригинальный звук желательно немного приглушать в формуле микширования. Но на каком то моменте памяти стало не хватать, и проц захлебывался, поэтому решил оставить только один "эффектный" буфер.
Эффект Wah - это вау эффект, знакомый гитаристам и музыкантам с 70 годов. Достижим обычными аналоговыми методами. В самом простом случае это просто модулируемый Cutoff, собираемый на трех транзисторах. Я пошел немного дальше, и собрал его на ОУ. Регулировалось все через SPI , была использована микросхема управляемого цифрового резистора, которая и регулировала соотношение сигнала master/ cutoff, беря сигнал с выхода ЦАП, и возвращая его туда же, через разрыв, который управлялся полевиком от дискретного вывода Меги. Выводов было еще много. Я не помню эту микросхему, надо впомнить бы, полезная.
Эффект Zip - тот самый cutoff, тоже собираемый по примитивным схемам, и также регулировался цифровым резистором. Глубина эффекта там назначается просто записью в определенный регистр микросхемы Резистора" некоторого числа. На этом принципе можно делать очень много крутых звуковых штук, управляемых по Midi. И я решил туда добавить Midi интерфейс. А также генератор сигналов в виде готовых полуволн (табличный синтез), чтобы в некоторых треках можно было бы добавлять какое-то петросянское "Пиу" или "фьють". Но к сожалению, проект оборвался на этом самом месте. Плата Wah и Zip была сделана отдельно и она не сохранилась. Там, справа, видны дорожки уже облуженные, под установку целых двух таких плат (вертикально), но была только одна плата с двумя эффектами на проводках отдельно. Возможно, она осталась на старой работе.
Ну что еще могу сказать? Если долго мучиться - что-нибудь получится! Кстати, звук даже после такой "звуковой карты", что представляет из себя R-2R ЦАП, вполне даже сносный, если вы не меломан. Хоть это и восемь бит, но это совсем не напоминало приставки "денди" с их пиликающими звуками. Полноценная звуковая карта. Частота дискретизации тоже решает, пробовал битность звука повышать - да почти незаметно. Если на компе так файлы преобразовать, то же самое будет в колонках. Можете проверить. Ну шумы были, иногда что то такое мелькало в звуке неестественное на резких звуках, но когда оно играет - работает и вышло из твоих рук - это бесценно.
Ну вот, собственно, и всё! И еще фоточек напоследок: