Сэмплер может (но не обязательно)принимать МИДИ и команды других протоколов и может проигрывать сэмплы, но не может и не должен генерировать МИДИ(а нахуа?)
программируемый как секвенсер МИДИ контроллер можно канешно назвать и секвенсером,
Обязательным условием долгой и стабильной работы Li-FePO4-аккумуляторов, в том числе и производства EVE Energy, является применение специализированных BMS-микросхем. Литий-железофосфатные АКБ отличаются такими характеристиками, как высокая многократность циклов заряда-разряда, безопасность, возможность быстрой зарядки, устойчивость к буферному режиму работы и приемлемая стоимость. Но для этих АКБ очень важен контроль процесса заряда и разряда для избегания воздействия внешнего зарядного напряжения после достижения 100% заряда. Инженеры КОМПЭЛ подготовили список таких решений от разных производителей.
Компания EVE выпустила новый аккумулятор серии PLM, сочетающий в себе высокую безопасность, длительный срок службы, широкий температурный диапазон и высокую токоотдачу даже при отрицательной температуре.
Эти аккумуляторы поддерживают заряд при температуре от -40/-20°С (сниженным значением тока), безопасны (не воспламеняются и не взрываются) при механическом повреждении (протыкание и сдавливание), устойчивы к вибрации. Они могут применяться как для автотранспорта (трекеры, маячки, сигнализация), так и для промышленных устройств мониторинга, IoT-устройств.
Обрабатывает прерывания, типа(только не просто Toggle, там а с параметрами), и по протоколу выдает команды на выход
Вот именно так. А прерывания эти выдаёт секвенсор (а не наоборот). И затем контроллер эти команды выдаёт на выход (который будет включен на вход сэмплера). Но у меня секвенсор и мидиконтроллер будут объединены в одно устройство. И это не только у меня. Все автономные секвенсоры сделаны именно так.
Цитата:
это MIDI Thru (Clock) в основном, он же не генерирует События, ну если только не имеет встроенного контроллера
Они могут работать в качестве мидиконтроллеров. То есть передавать мидикоманды от своих органов управления.
Секвенсор- это проигрыватель самлов. ПРОТГРЫВАТЕЛЬ!!! А МИДИ-контроллер- это КОНТРОЛЛЕР!!!(сам нихера не может проигрывать и звук не рендерит), и передает комманды Секвенсеру и другому железу.
Правильно, тока поправлю: секвенсер может и ЗАПИСЫВАТЬ . Не может, а записывает, запоминает и потом можно и проигрывать. Отличается от магнитофона: пишет не звук, а команды (управление). Вот я Сереге пытался обьяснить: вживую пишет - сам считывает и длительность нажатия и номер клавиши и паузы, а пошагово - надо думать мозгом, как когда то композитор тщательно записывал на нотном стане свои каракули и закорючки, проигрывая тему в своей голове.
А как тут не охуеешь, если ты хуйню написал? Не хуйня: самый умный компутерный мозг, ждет...когда сделаешь следующий шаг.
// тип MIDI сообщения — статус байт // 1001 взять ноту (Note On) // 0000 номер канала #define NOTE_ON 0b10010000
void setup() { // открываем последовательный порт // задаем скорость передачи данных 31250 кбит/с для MIDI Serial1.begin(31250); } // put your setup code here, to run once:
Это зацикленная последовательность из четырёх нот. В общем работает, осталось только сделать, чтобы программа опрашивала последовательно 8 тумблеров (на каждую из 4х нот) и чтобы когда опрашивался включенный тумблер, выдавалась команда на воспроизведение соответствующей ноты. Ну и чтобы задержка между опросами тумблеров регулировалась потенциометром.
#define pot A0 // Потенциометр на вход A0 void setup() { pinMode(pot, INPUT); // скорость передачи MIDI-данных: Serial1.begin(31250); } void loop() { int x; x = analogRead(pot) / 4 + 50; // Задаётся длительность паузы между нотами, регулируемая потенциометром. noteOn(0x90, 1, 0x45); delay(x); // задержка перед повтором x = analogRead(pot) / 4 + 50; noteOn(0x90, 2, 0x45); delay(x); // задержка перед повтором x = analogRead(pot) / 4 + 50; noteOn(0x90, 3, 0x45); delay(x); // задержка перед повтором x = analogRead(pot) / 4 + 50; noteOn(0x90, 4, 0x45); delay(x); // задержка перед повтором noteOn(0x90, 1, 0x45); noteOn(0x90, 3, 0x45); x = analogRead(pot) / 4 + 50; delay(x); // задержка перед повтором x = analogRead(pot) / 4 + 50; noteOn(0x90, 2, 0x45); delay(x); // задержка перед повтором x = analogRead(pot) / 4 + 50; noteOn(0x90, 3, 0x45); delay(x); // задержка перед повтором x = analogRead(pot) / 4 + 50; noteOn(0x90, 4, 0x45); delay(x); // задержка перед повтором }
void noteOn(int cmd, int pitch, int velocity) { Serial1.write(cmd); Serial1.write(pitch); Serial1.write(velocity); }
сделать так, чтобы опрос потенциометра не прописывать после каждой ноты (а то если делать много нот, слишком много строк получается)? А если не опрашивать аналоговый вход после каждой ноты, то темп регулировать не удобно (не сразу реагирует). Как вообще можно сделать мелодию (ну или как у меня, ритмический рисунок) в виде массива и выводить массив по миди?
В общем как правильно оптимизировать данный код? Как упростить, сократить и т.д. Потому что там ещё много всего надо, это только пример вывода нот.
Потому что там ещё много всего надо, это только пример вывода нот.
Как там дедушка Ленин говорил... в общем изучать Си.
В работе не проверял, но суть примерно такая. В данном случае возможна передача двух нот подряд без паузы (я так понял по коду, что оно надо), ну и вообще произвольные паузы между нотами. Значение потенциометра не добавляется к базе, а умножается на нее (тут возможен косяк с типами переменных).
Спойлер
Код:
#define pot A0 // Потенциометр на вход A0
// структура нот struct Notes { byte pitch; //нота ? int delay; //базовый темп ? };
void noteOn(int cmd, int pitch, int velocity) { Serial1.write(cmd); Serial1.write(pitch); Serial1.write(velocity); }
_________________ "Вся военная пропаганда, все крики, ложь и ненависть исходят от людей, которые на эту войну не пойдут !" / Джордж Оруэлл / "Война - это,когда за интересы других,гибнут совершенно безвинные люди." / Уинстон Черчилль /
Как там дедушка Ленин говорил... в общем изучать Си.
Ну это понятно! Просто хочется сперва сделать, а потом уже изучать Ну или хотябы изучать во время делания Раньше немного изучал, уже позабывал всё. Буду вспоминать.
Morroc писал(а):
В работе не проверял, но суть примерно такая.
В работе работает, но диапазон регулировки темпа очень широкий. От ооочень медленного до сверхбыстрого, когда всё сливается в один шум. Ну у меня тоже сперва так было, я потом дополнительно 50 миллисекунд к задержкам прибавлял, чтобы задержка была не менее 50 миллисекунды. Тут пока не понял, как задержку ограничить. Сейчас попробую вникнуть в суть кода, чего там и как. Буду разбираться Спасибо!
У вас был + к паузам, а у меня * (чтобы темп масштабировался одинаково для всей последовательности). Поиграйтесь вот тут делителем x = float(analogRead(pot)) / 50.0; или например так x = float(analogRead(pot) + 50.0) / 50.0; чтобы ниже базовой пауза не была, я забыл просто 100.0 или 200.0 уменьшит диапазон с бОльшей стороны
_________________ "Вся военная пропаганда, все крики, ложь и ненависть исходят от людей, которые на эту войну не пойдут !" / Джордж Оруэлл / "Война - это,когда за интересы других,гибнут совершенно безвинные люди." / Уинстон Черчилль /
100.0 или 200.0 уменьшит диапазон с бОльшей стороны
Сделал вот так:
Код:
x = float(analogRead(pot)+100) / 250.0;
С большей стороны (максимальная задержка, самый медленный темп) стало нормально. Ну и минимальную задержку ограничило, но всё равно минимальная задержка слишком маленькая. Пробовал прибавлять более 100, но минимальная задержка меньше не становится, а максимальная увеличивается. Но уже можно пользоваться Можно как-то прибавить +50 после делителя? Я в конце строчки пробовал просто +50 прописать, вообще какая-то лажа получилась.
Добавлено after 5 minutes 46 seconds:
Morroc писал(а):
Значение потенциометра не добавляется к базе, а умножается на нее (тут возможен косяк с типами переменных).
Я таки попробовал прибавить. Сперва даже не понял, вроде всё нормально, но какая-то лажа играется. А оно же и к нулевой паузе 50 миллисекунд добавилось
Если так x = float(analogRead(pot)+100.0) / 250.0; то получается снизу диапазон где то 1/2 базы (100 / 250), а сверху *4 где то (1123 / 250). Саму базу можно поменять прям в массиве Notes notes[10] = {1,50, 2,50, 3,50, 4,50, 1,0, 3,50, 2,50, 3,50, 4,50, 0,0}; - вот тут 50 это базовая пауза в ms.
Ну это "я так вижу" задачу исходя из вашего кода, от музыки и секвенсеров я очень очень далек
_________________ "Вся военная пропаганда, все крики, ложь и ненависть исходят от людей, которые на эту войну не пойдут !" / Джордж Оруэлл / "Война - это,когда за интересы других,гибнут совершенно безвинные люди." / Уинстон Черчилль /
А вот это "Notes notes[10]", это что? "Notes" - это тип массива, notes - название массива, а [10] - это количество нот в массиве? А если 10 не указывать? Если делать несколько массивов, то для такого кода надо писать так? Notes notes[10] { Notes notes-2[17] { Notes notes-3[14] { И т.д.
Вы не можете начинать темы Вы не можете отвечать на сообщения Вы не можете редактировать свои сообщения Вы не можете удалять свои сообщения Вы не можете добавлять вложения