Константин @Costic
Программист-консультант
Информация
- В рейтинге
- Не участвует
- Откуда
- Москва, Москва и Московская обл., Россия
- Дата рождения
- Зарегистрирован
- Активность
Специализация
Software Developer, Embedded Software Engineer
Lead
Programming microcontrollers
Software development
C++
Python
Math modeling
Я тоже когда-то собирал на макетке проигрыватель + MIDI-вход. Потом захотелось большего. На фото прототип, отладочная плата для поиска интересных звуков. Не обошлось без ошибок - у 3.3В контроллера выгорели пины BC BDIR (они внутри AY подтянуты к +5В). А написано это в скобках в даташите. :-)
Для расширения звуков я добавил YM2612, но т.к. два пина сжёг, то пришлось резать дорожки снизу платы и городить колхоз. Я планировал звук с AY/YM оцифровать микроконтроллером, микшировать программно, добавить эхо, а потом выводить в ЦАП ES9023. То, как я каналы распределил мне не нравится.Сделал пока мало, "поднимал плату", выявлял ошибки аппаратные, проект на паузе.
Кнопки две - ресет (сброс) и пользовательская, чтобы инструмент не подключать для тестов. К кнопкам я всегда стараюсь ставить RC-фильтр, поэтому проблем с дребезгом у меня нет.
Хотелось бы спросить/почитать про хитрости chiptune. Начальное муз образование у меня есть, но ZX Spectruma у меня не было, только трекерную музыка на 386 мне хорошо знакома - MOD, S3M, XM. Насчёт detune. Может быть надо не ручкой потенциометра крутить, а вычислить гармонику частоты (вторую, третью) и её подмешивать?
С интересом прочитал статью. Сам делал похожее устройство, правда с более мощным контроллером и стерео. Один из трёх каналов подмешивается равномерно к правому и левому. Такая схема довольно распространена. Ноты первой октавы выводятся через этот общий канал, вторая, третья, четвёртая октавы - в правый, малая и большая октавы - в левый канал.
Непонятно как лучше делать одновременное проигрывание нескольких нот. Пробовал арпеджио воспроизводить. Возник вопрос с какой скоростью чередовать ноты.
Отдельная тема про эмуляцию инструментов. С ударными довольно просто. Удалось синтезировать приемлемые гитарные звуки. Думаю, и пианино можно сделать. В итоге устал от чиптюна и уже год "отдыхаю".
Любопытно было посмотреть на вашу реализацию. А диаграммы в чём вы рисовали?
Я заметил, что если в Cubase использовать программные звуки MIDI (что-то вроде GM DLS), то задержки ярко выражены. А вот другие звуки/инструменты Cubase воспроизводятся почти без задержек. Предполагаю, что проблема в древней mmsystem.dll, а именно функциях midiOut*** (например, midiOutCachePatches). Возможно, это такой legacy код из 20-го века, что в Microsoft мало кто сейчас что-то в нём понимает.
Спасибо за добрые слова.
Оригинальный CH345 действительно выпускается в микросхеме с 20-выводами, требует кварца 12МГц, а в схемах рекомендуется ставить опторон. А то, что мы видим в этом "китайском чуде" - неведомая зверушка. Использовать чужой VID/PID - не очень законно, но с технической точки зрения - оптимальное решение. Функционал и драйверы используются одни и те же. SysEx у меня сделан неизвестно как, т.е. не тестировал (не на чем), хотя пару месяцев назад выложил новую переработанную версию прошивки.
Корпус и mini-usb неудачно у меня получились. Слишком глубоко внутри и кабель тяжело втыкать. Но, в целом работает.
А вы закрываете дескриптор, который не смогли получить.
И при настройке таймаутов у вас тоже ошибка. Вы закрываете дескриптор (порт), но продолжаете его использовать. Или не закрывайте порт или добавьте return код ошибки;
P.S. И этот вариант статьи людям не очень нравится.
Boomburum «шо, опять?» (с)
Ну, и хозяева ресурса за просмотры/рекламу/контент получают $$$. Как минимум и автор за каждые NNN просмотров должен получать "+" в карму.
habr.com/ru/company/productivity_inside/blog/544970
Баян опять.
Многое зависит от того, чего изучать. Если изучать введение в программирование под Windows, то ваш подход годится. А если уже на С++ замахнулись, то предполагается что основы всем известны и больше внимания надо уделять проектированию, декомпозиции и т.д. В целом сейчас WinAPI редко где можно встретить, кроссплатформеность важнее и формошлёпство востребовано.
P.S. GetTickCount(), GetKeyboardState(), GetAsyncKeyState() вам в помощь.
Чисто теоретически тут не очень сложно — модель с обратной связью (с двумя). В курсе «Теории автоматического управления/регулирования» и т.п. изучают многие студенты. Система идёт в разнос или наоборот затухает, «устаканивается» около какого-то значения. Без исходных данных (инсайдера) вряд ли бы такую операцию провернули.
Дальнейший диалог считаю бесперспективным.
2) Посмотрите этот пример от Microsoft.
2) Драйвер вы загружаете при старте ОС или как службу? Надо бы его выгружать и все хуки отключать в нём даже при аварийном завершении приложения.
3) А чтобы с буферами и FIFO не было переполнений, то там же флаги есть, они аппаратно рулят и могут просигналить/тормознуть при заполнении или GPIF настроить (не помню).
Должен быть ШИМ примерно 90%, сигнал от 0 до 0.5 В