Pull to refresh
24
0
Константин @Costic

Программист-консультант

Send message

Я тоже когда-то собирал на макетке проигрыватель + MIDI-вход. Потом захотелось большего. На фото прототип, отладочная плата для поиска интересных звуков. Не обошлось без ошибок - у 3.3В контроллера выгорели пины BC BDIR (они внутри AY подтянуты к +5В). А написано это в скобках в даташите. :-)

Для расширения звуков я добавил YM2612, но т.к. два пина сжёг, то пришлось резать дорожки снизу платы и городить колхоз. Я планировал звук с AY/YM оцифровать микроконтроллером, микшировать программно, добавить эхо, а потом выводить в ЦАП ES9023. То, как я каналы распределил мне не нравится.Сделал пока мало, "поднимал плату", выявлял ошибки аппаратные, проект на паузе.

Кнопки две - ресет (сброс) и пользовательская, чтобы инструмент не подключать для тестов. К кнопкам я всегда стараюсь ставить RC-фильтр, поэтому проблем с дребезгом у меня нет.

Хотелось бы спросить/почитать про хитрости chiptune. Начальное муз образование у меня есть, но ZX Spectruma у меня не было, только трекерную музыка на 386 мне хорошо знакома - MOD, S3M, XM. Насчёт detune. Может быть надо не ручкой потенциометра крутить, а вычислить гармонику частоты (вторую, третью) и её подмешивать?

С интересом прочитал статью. Сам делал похожее устройство, правда с более мощным контроллером и стерео. Один из трёх каналов подмешивается равномерно к правому и левому. Такая схема довольно распространена. Ноты первой октавы выводятся через этот общий канал, вторая, третья, четвёртая октавы - в правый, малая и большая октавы - в левый канал.

Мой USM-Midi синтезатор-контроллер.
Мой USM-Midi синтезатор-контроллер.

Непонятно как лучше делать одновременное проигрывание нескольких нот. Пробовал арпеджио воспроизводить. Возник вопрос с какой скоростью чередовать ноты.

Отдельная тема про эмуляцию инструментов. С ударными довольно просто. Удалось синтезировать приемлемые гитарные звуки. Думаю, и пианино можно сделать. В итоге устал от чиптюна и уже год "отдыхаю".

Любопытно было посмотреть на вашу реализацию. А диаграммы в чём вы рисовали?

Я заметил, что если в Cubase использовать программные звуки MIDI (что-то вроде GM DLS), то задержки ярко выражены. А вот другие звуки/инструменты Cubase воспроизводятся почти без задержек. Предполагаю, что проблема в древней mmsystem.dll, а именно функциях midiOut*** (например, midiOutCachePatches). Возможно, это такой legacy код из 20-го века, что в Microsoft мало кто сейчас что-то в нём понимает.

Спасибо за добрые слова.

Оригинальный CH345 действительно выпускается в микросхеме с 20-выводами, требует кварца 12МГц, а в схемах рекомендуется ставить опторон. А то, что мы видим в этом "китайском чуде" - неведомая зверушка. Использовать чужой VID/PID - не очень законно, но с технической точки зрения - оптимальное решение. Функционал и драйверы используются одни и те же. SysEx у меня сделан неизвестно как, т.е. не тестировал (не на чем), хотя пару месяцев назад выложил новую переработанную версию прошивки.

Корпус и mini-usb неудачно у меня получились. Слишком глубоко внутри и кабель тяжело втыкать. Но, в целом работает.

Вы неаккуратно работаете с COM портом. Если не удалось открыть порт, то дальнейшая работа программы не имеет смысла и надо заканчивать работу. return 1;
А вы закрываете дескриптор, который не смогли получить.
if (Port == INVALID_HANDLE_VALUE)
    {
        printf("\nError to Get the COM state\n");
        CloseHandle(Port);
    }

И при настройке таймаутов у вас тоже ошибка. Вы закрываете дескриптор (порт), но продолжаете его использовать. Или не закрывайте порт или добавьте return код ошибки;
Вы каждый день по 3 статьи выкладываете. Кто-то их готовит, читает, деньги получает. А мне за вылавливание халтуры минусы.
P.S. И этот вариант статьи людям не очень нравится.
Всё очень интересно, но почему повторяете публикацию? Накручиваете рейтинг этим способом? Предыдущую статью скрыли, но в кэше она есть. Если вносите исправления, то зачем новую публикацию делать?
Boomburum «шо, опять?» (с)
Boomburum
13 марта 2021 в 20:57
К сожалению, такие ситуации иногда случаются, тем более что это контент компаний, а не редакционный. Но в целом же вроде в этом нет никакого криминала?
goto в 21 веке? Я бы сделал развернутые блоки if и else.
Очень хорошая идея о снятии ограничении по времени. Попадаются статьи, которые давно написаны и хотелось бы им поднять рейтинг, но это невозможно. А счётчик просмотров говорит, что статья пользуется популярностью.
Ну, и хозяева ресурса за просмотры/рекламу/контент получают $$$. Как минимум и автор за каждые NNN просмотров должен получать "+" в карму.
Boomburum, почему Хабр не торт? Потому что его не внимательно читают и не листают редакторы? В погоне за количеством статей страдает качество.
habr.com/ru/company/productivity_inside/blog/544970
Баян опять.
У меня были разные калькуляторы. Примерно в 1988 году мне папа купил МК-85. Работает до сих пор, даже от батареек, хотя экран тусклый.
Мой экземпляр
image

Схема, если кому интересно.
image
Артиллерийский снаряд с наведением на цель. Ещё во времена СССР был сделан.
Наверное на С++ нужно создать абстракции, например, Screen или Window. Внутри спрятать весь вывод, закадровый буфер (если есть) и вообще всё рисование. Создать объект абстрактный Input, а к нему, например, добавить наследников InputKeyboard, InputJoystick, InputMouse. Ну, и ко всему этому уже прикручивать игровые сущности — Player, Map, Item, Unit, на что фантазии хватит.
Многое зависит от того, чего изучать. Если изучать введение в программирование под Windows, то ваш подход годится. А если уже на С++ замахнулись, то предполагается что основы всем известны и больше внимания надо уделять проектированию, декомпозиции и т.д. В целом сейчас WinAPI редко где можно встретить, кроссплатформеность важнее и формошлёпство востребовано.
P.S. GetTickCount(), GetKeyboardState(), GetAsyncKeyState() вам в помощь.
Тема очень интересная.
Чисто теоретически тут не очень сложно — модель с обратной связью (с двумя). В курсе «Теории автоматического управления/регулирования» и т.п. изучают многие студенты. Система идёт в разнос или наоборот затухает, «устаканивается» около какого-то значения. Без исходных данных (инсайдера) вряд ли бы такую операцию провернули.
Вы вспомните как работает биполярный транзистор и как он рассчитывается. Может быть сообразите, что я написал и откуда взял 500мА. Потом язвите.
Дальнейший диалог считаю бесперспективным.
1)
«Проще взять драйвер, который будет работать с любым чипом.»
Не так много контроллеров с поддержкой USB 3.0+. Я кроме Fx3 не знаю ничего доступного. Ну, а если ограничиться USB 2.0, то согласен с вами.

2) Посмотрите этот пример от Microsoft.
1) Я не совсем понял зачем вам WinUSB, почему CyUSB не использовать, тем более что исходники и примеры для Streamer и CxControl доступны. Кроссплатформенность?
2) Драйвер вы загружаете при старте ОС или как службу? Надо бы его выгружать и все хуки отключать в нём даже при аварийном завершении приложения.
3) А чтобы с буферами и FIFO не было переполнений, то там же флаги есть, они аппаратно рулят и могут просигналить/тормознуть при заполнении или GPIF настроить (не помню).
У меня не сохранилось лучшего разрешения. Могу посоветовать посмотреть ссылки, которые я приводил, там есть осциллограммы. Я могу показать, что стало после установки параллельно диода и светодиода (я проводил эксперименты) с пищалкой.
Должен быть ШИМ примерно 90%, сигнал от 0 до 0.5 В

Information

Rating
Does not participate
Location
Москва, Москва и Московская обл., Россия
Date of birth
Registered
Activity

Specialization

Software Developer, Embedded Software Engineer
Lead
Programming microcontrollers
Software development
C++
Python
Math modeling