{"id":299742,"date":"2020-03-05T21:00:23","date_gmt":"2020-03-05T21:00:23","guid":{"rendered":"http:\/\/savepearlharbor.com\/?p=299742"},"modified":"-0001-11-30T00:00:00","modified_gmt":"-0001-11-29T21:00:00","slug":"","status":"publish","type":"post","link":"https:\/\/savepearlharbor.com\/?p=299742","title":{"rendered":"Ableton \u043d\u0435 \u043d\u0443\u0436\u043e\u043d: \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0430\u0435\u043c Ableton Push 2 \u043a VCV Rack"},"content":{"rendered":"\n<div class=\"post__text post__text-html post__text_v1\" id=\"post-content-body\" data-io-article-url=\"https:\/\/habr.com\/ru\/post\/491244\/\">\n<div style=\"text-align:center;\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/webt\/qk\/vm\/8j\/qkvm8jnnid3kb_8kybxztptlbfu.png\"><\/div>\n<p>  \u0421\u043e\u0437\u0434\u0430\u043d\u0438\u0435 \u043c\u0443\u0437\u044b\u043a\u0438, \u0432 \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0435\u0435 \u0432\u0440\u0435\u043c\u044f, \u043f\u0440\u043e\u0445\u043e\u0434\u0438\u0442 \u043f\u0440\u0438\u043c\u0435\u0440\u043d\u043e \u0442\u043e\u0442 \u0436\u0435 \u043f\u0443\u0442\u044c \u0447\u0442\u043e \u0444\u043e\u0442\u043e\u0433\u0440\u0430\u0444\u0438\u044f 10 \u043b\u0435\u0442 \u043d\u0430\u0437\u0430\u0434: \u0443 \u043a\u0430\u0436\u0434\u043e\u0433\u043e \u043f\u043e\u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0441\u0432\u043e\u044f \u0437\u0435\u0440\u043a\u0430\u043b\u043a\u0430 \u0438 \u0430\u043a\u043a\u0430\u0443\u043d\u0442 \u0432 \u0438\u043d\u0441\u0442\u0430\u0433\u0440\u0430\u043c\u0435. \u041c\u0443\u0437\u044b\u043a\u0430\u043b\u044c\u043d\u0430\u044f \u0438\u043d\u0434\u0443\u0441\u0442\u0440\u0438\u044f \u044d\u0442\u043e\u043c\u0443 \u043e\u0447\u0435\u043d\u044c \u0440\u0430\u0434\u0430, \u0432\u0435\u0434\u044c \u0442\u0430\u043a\u043e\u0439 \u0438\u043d\u0442\u0435\u0440\u0435\u0441 \u043f\u0440\u0438\u043d\u043e\u0441\u0438\u0442 \u043c\u043d\u043e\u0433\u043e \u0434\u0435\u043d\u0435\u0433. \u041a\u0430\u0436\u0434\u044b\u0439 \u0434\u0435\u043d\u044c \u043f\u043e\u044f\u0432\u043b\u044f\u044e\u0442\u0441\u044f \u043d\u043e\u0432\u044b\u0435 VST \u043f\u043b\u0430\u0433\u0438\u043d\u044b \u0438 \u0430\u043d\u0430\u043b\u043e\u0433\u043e\u0432\u044b\u0435 \u0434\u0435\u0432\u0430\u0439\u0441\u044b, \u0441\u0442\u0440\u0435\u043c\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u0440\u0430\u0441\u0442\u0451\u0442 \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u0442\u0435\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438\u0445 \u043a\u0443\u0440\u0441\u043e\u0432, \u0431\u043b\u043e\u0433\u0438, \u043f\u043e\u0441\u0432\u044f\u0449\u0451\u043d\u043d\u044b\u0435 \u043c\u0443\u0437\u044b\u043a\u0430\u043b\u044c\u043d\u043e\u043c\u0443 \u043f\u0440\u043e\u0434\u0430\u043a\u0448\u0435\u043d\u0443 \u0432\u044b\u0445\u043e\u0434\u044f\u0442 \u0432 \u0442\u043e\u043f youtube. \u041d\u0430 \u044d\u0442\u043e\u043c \u0444\u043e\u043d\u0435 \u043e\u0447\u0435\u043d\u044c \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u043e \u0432\u044b\u0433\u043b\u044f\u0434\u044f\u0442 open-source \u043f\u0440\u043e\u0435\u043a\u0442\u044b, \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u044e\u0449\u0438\u0435 \u043b\u044e\u0431\u043e\u043c\u0443 \u0436\u0435\u043b\u0430\u044e\u0449\u0435\u043c\u0443 \u043f\u043e\u043f\u0440\u043e\u0431\u043e\u0432\u0430\u0442\u044c \u0441\u0435\u0431\u044f \u0432 \u0440\u043e\u043b\u0438 \u043f\u0440\u043e\u0434\u044e\u0441\u0435\u0440\u0430, \u043d\u0435 \u0442\u0440\u0430\u0442\u044f \u043d\u0430 \u044d\u0442\u043e \u043a\u0443\u0447\u0443 \u0441\u0440\u0435\u0434\u0441\u0442\u0432. \u041e\u0434\u043d\u0438\u043c \u0438\u0437 \u0442\u0430\u043a\u0438\u0445 \u043f\u0440\u043e\u0435\u043a\u0442\u043e\u0432 \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f VCV Rack, \u0441\u0442\u0430\u0432\u044f\u0449\u0438\u0439 \u0446\u0435\u043b\u044c\u044e \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u0441\u0430\u043c\u044b\u0439 \u0434\u043e\u0440\u043e\u0433\u043e\u0439 \u043a\u043b\u0430\u0441\u0441 \u043c\u0443\u0437\u044b\u043a\u0430\u043b\u044c\u043d\u044b\u0445 \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u043e\u0432 \u2014 \u0430\u043d\u0430\u043b\u043e\u0433\u043e\u0432\u044b\u0435 \u043c\u043e\u0434\u0443\u043b\u044c\u043d\u044b\u0435 \u0441\u0438\u043d\u0442\u0435\u0437\u0430\u0442\u043e\u0440\u044b \u2014 \u0434\u043e\u0441\u0442\u0443\u043f\u043d\u044b\u043c\u0438 \u043a\u0430\u0436\u0434\u043e\u043c\u0443. \u041d\u0435\u0434\u0430\u0432\u043d\u043e, \u043a\u043e\u0433\u0434\u0430 \u0443 \u043c\u0435\u043d\u044f \u0432\u043e\u0437\u043d\u0438\u043a\u043b\u0430 \u0438\u0434\u0435\u044f \u0442\u0440\u0435\u043a\u0430, \u0430 \u043f\u043e\u0434 \u0440\u0443\u043a\u043e\u0439 \u043e\u043a\u0430\u0437\u0430\u043b\u0441\u044f \u0442\u043e\u043b\u044c\u043a\u043e \u043d\u043e\u0443\u0442\u0431\u0443\u043a \u043d\u0430 linux \u044f \u0437\u0430\u0445\u043e\u0442\u0435\u043b \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u0442\u0440\u0435\u043a \u0446\u0435\u043b\u0438\u043a\u043e\u043c \u0432 VCV. \u0410 \u043f\u043e \u0445\u043e\u0434\u0443 \u0434\u0435\u043b\u0430 \u043f\u043e\u044f\u0432\u0438\u043b\u043e\u0441\u044c \u0436\u0435\u043b\u0430\u043d\u0438\u0435 \u0443\u043f\u0440\u0430\u0432\u043b\u044f\u0442\u044c \u0441\u0438\u043d\u0442\u0435\u0437\u0430\u0442\u043e\u0440\u0430\u043c\u0438 \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e midi \u043a\u043e\u043d\u0442\u0440\u043e\u043b\u043b\u0435\u0440\u0430 \u0442\u0430\u043a, \u043a\u0430\u043a \u0441 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435\u043c \u0434\u043e\u0441\u0442\u0443\u043f\u043d\u044b\u0445 \u043c\u043e\u0434\u0443\u043b\u0435\u0439 \u043d\u0435 \u043f\u043e\u043b\u0443\u0447\u0430\u043b\u043e\u0441\u044c. \u0412 \u0438\u0442\u043e\u0433\u0435 \u044f \u0440\u0435\u0448\u0438\u043b \u043d\u0430\u043f\u0438\u0441\u0430\u0442\u044c \u043f\u043b\u0430\u0433\u0438\u043d \u0434\u043b\u044f \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u044f Ableton Push 2 \u043a VCV Rack. \u041e \u0442\u043e\u043c \u0447\u0442\u043e \u0438\u0437 \u044d\u0442\u043e\u0433\u043e \u043f\u043e\u043b\u0443\u0447\u0438\u043b\u043e\u0441\u044c, \u0438 \u043a\u0430\u043a \u043f\u0438\u0441\u0430\u0442\u044c \u0441\u0432\u043e\u0438 \u043c\u043e\u0434\u0443\u043b\u0438 \u0434\u043b\u044f VCV \u043f\u043e\u0433\u043e\u0432\u043e\u0440\u0438\u043c \u0432 \u044d\u0442\u043e\u0439 \u0441\u0442\u0430\u0442\u044c\u0435. <br \/>  <a name=\"habracut\"><\/a>  <\/p>\n<div class=\"spoiler\"><b class=\"spoiler_title\">\u041a\u0440\u0430\u0442\u043a\u0430\u044f \u0441\u043f\u0440\u0430\u0432\u043a\u0430<\/b><\/p>\n<div class=\"spoiler_text\">VCV Rack \u2014 open source \u0441\u0440\u0435\u0434\u0430, \u044d\u043c\u0443\u043b\u0438\u0440\u0443\u044e\u0449\u0430\u044f \u043c\u043e\u0434\u0443\u043b\u044c\u043d\u044b\u0435 \u0441\u0438\u043d\u0442\u0435\u0437\u0430\u0442\u043e\u0440\u044b. \u041f\u0440\u043e VCV \u043c\u043e\u0436\u043d\u043e <a href=\"https:\/\/www.youtube.com\/playlist?list=PLiECaNQx239tpzUF2_Od-SvlEhSO1oa2j\" rel=\"nofollow\">\u043f\u043e\u0441\u043c\u043e\u0442\u0440\u0435\u0442\u044c \u0432\u043e\u0442 \u0442\u0443\u0442<\/a>, \u0430 \u043f\u0440\u043e \u043c\u043e\u0434\u0443\u043b\u044c\u043d\u044b\u0435 \u0441\u0438\u043d\u0442\u0435\u0437\u0430\u0442\u043e\u0440\u044b \u043c\u043e\u0436\u043d\u043e <a href=\"https:\/\/habr.com\/ru\/post\/236703\/\">\u043f\u043e\u0447\u0438\u0442\u0430\u0442\u044c \u0445\u043e\u0440\u043e\u0448\u0443\u044e \u0441\u0442\u0430\u0442\u044c\u044e \u043d\u0430 \u0425\u0430\u0431\u0440\u0435<\/a>.<\/p>\n<div class=\"oembed\">\n<div>\n<div style=\"left: 0; width: 100%; height: 0; position: relative; padding-bottom: 56.25%;\"><iframe src=\"https:\/\/www.youtube.com\/embed\/videoseries?list=PLiECaNQx239tpzUF2_Od-SvlEhSO1oa2j\" style=\"border: 0; top: 0; left: 0; width: 100%; height: 100%; position: absolute;\" allowfullscreen scrolling=\"no\" allow=\"encrypted-media\"><\/iframe><\/div>\n<\/div>\n<\/div>\n<p>  Ableton Push 2 \u2014 \u044d\u0442\u043e \u0432\u0442\u043e\u0440\u043e\u0435 \u043f\u043e\u043a\u043e\u043b\u0435\u043d\u0438\u0435 midi-\u043a\u043e\u043d\u0442\u0440\u043e\u043b\u043b\u0435\u0440\u0430 \u043e\u0442 Ableton, \u0437\u0430\u0442\u043e\u0447\u0435\u043d\u043d\u043e\u0433\u043e \u043d\u0430 \u0440\u0430\u0431\u043e\u0442\u0443 \u0441 <a href=\"https:\/\/ru.wikipedia.org\/wiki\/Ableton_Live\" rel=\"nofollow\">\u043e\u0434\u043d\u043e\u0438\u043c\u0451\u043d\u043d\u043e\u0439 DAW<\/a>, \u043d\u043e \u0442\u0430\u043a\u0436\u0435 \u0438\u043c\u0435\u044e\u0449\u0435\u0433\u043e <a href=\"https:\/\/github.com\/Ableton\/push-interface\" rel=\"nofollow\">API \u0434\u043b\u044f \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u044f \u0441\u0442\u043e\u0440\u043e\u043d\u043d\u0438\u043c\u0438 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u0430\u043c\u0438<\/a>.<\/p>\n<div class=\"oembed\">\n<div>\n<div style=\"left: 0; width: 100%; height: 0; position: relative; padding-bottom: 56.25%;\"><iframe src=\"https:\/\/www.youtube.com\/embed\/0CdMvkBOUgs?rel=0&amp;showinfo=1&amp;hl=en-US\" style=\"border: 0; top: 0; left: 0; width: 100%; height: 100%; position: absolute;\" allowfullscreen scrolling=\"no\" allow=\"encrypted-media; accelerometer; gyroscope; picture-in-picture\"><\/iframe><\/div>\n<\/div>\n<\/div>\n<p>  <\/div>\n<\/div>\n<p>  <\/p>\n<h2><b>API VCV Rack<\/b><\/h2>\n<p>  \u041a\u0430\u0436\u0434\u044b\u0439 \u043c\u043e\u0434\u0443\u043b\u044c \u0432 VCV \u0441\u043e\u0441\u0442\u043e\u0438\u0442 \u0438\u0437 \u0434\u0432\u0443\u0445 \u0447\u0430\u0441\u0442\u0435\u0439 \u2014 \u0437\u0432\u0443\u043a\u043e\u0432\u043e\u0439 \u0438 \u0433\u0440\u0430\u0444\u0438\u0447\u0435\u0441\u043a\u043e\u0439. \u0417\u0432\u0443\u043a\u043e\u0432\u0430\u044f \u0447\u0430\u0441\u0442\u044c \u043d\u0430\u0441\u043b\u0435\u0434\u0443\u0435\u0442 \u043e\u0442 \u043a\u043b\u0430\u0441\u0441\u0430 <i>Module<\/i> \u043c\u0435\u0442\u043e\u0434 <i>process<\/i>, \u0432\u044b\u0437\u044b\u0432\u0430\u044e\u0449\u0438\u0439\u0441\u044f \u0434\u043b\u044f \u043a\u0430\u0436\u0434\u043e\u0433\u043e \u0441\u0435\u043c\u043f\u043b\u0430, \u0442\u043e \u0435\u0441\u0442\u044c \u0441 \u0447\u0430\u0441\u0442\u043e\u0442\u043e\u0439 \u0434\u0438\u0441\u043a\u0440\u0435\u0442\u0438\u0437\u0430\u0446\u0438\u0438. \u041a\u0441\u0442\u0430\u0442\u0438, \u0447\u0430\u0441\u0442\u043e\u0442\u0430 \u0434\u0438\u0441\u043a\u0440\u0435\u0442\u0438\u0437\u0430\u0446\u0438\u0438 \u0432 VCV \u043c\u043e\u0436\u0435\u0442 \u0432\u0430\u0440\u044c\u0438\u0440\u043e\u0432\u0430\u0442\u044c\u0441\u044f \u043e\u0442 \u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043d\u044b\u0445 44.1 \u043a\u0413\u0446 \u0434\u043e \u0430\u0436 768 \u043a\u0413\u0446, \u0447\u0442\u043e \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u0431\u043e\u043b\u0435\u0435 \u0442\u043e\u0447\u043d\u043e \u044d\u043c\u0443\u043b\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043c\u043e\u0434\u0443\u043b\u044c\u043d\u044b\u0435 \u0441\u0438\u043d\u0442\u0435\u0437\u0430\u0442\u043e\u0440\u044b \u043f\u0440\u0438 \u043d\u0430\u043b\u0438\u0447\u0438\u0438 \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e\u0439 \u0432\u044b\u0447\u0438\u0441\u043b\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0439 \u043c\u043e\u0449\u043d\u043e\u0441\u0442\u0438. <\/p>\n<p>  \u0417\u0430 \u0433\u0440\u0430\u0444\u0438\u043a\u0443 \u043e\u0442\u0432\u0435\u0447\u0430\u044e\u0442 \u043e\u0431\u044a\u0435\u043a\u0442\u044b \u0442\u0438\u043f\u0430 <i>ModuleWidget<\/i>, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043d\u0430\u0441\u043b\u0435\u0434\u0443\u044e\u0442 \u043e\u0442 \u0431\u0430\u0437\u043e\u0432\u043e\u0439 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u044b \u043c\u0435\u0442\u043e\u0434 <i>draw<\/i>. \u0412 VCV \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0430 \u0432\u0435\u043a\u0442\u043e\u0440\u043d\u043e\u0439 \u0433\u0440\u0430\u0444\u0438\u043a\u0438 nanovg. \u041e\u0442\u0440\u0438\u0441\u043e\u0432\u043a\u0430 \u0432\u043d\u0443\u0442\u0440\u0438 \u043c\u0435\u0442\u043e\u0434\u0430 <i>draw<\/i> \u043c\u043e\u0436\u0435\u0442 \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u0438\u0442\u044c \u043a\u0430\u043a \u0432\u043d\u0443\u0442\u0440\u0438 \u0433\u0440\u0430\u043d\u0438\u0446 \u043c\u043e\u0434\u0443\u043b\u044f (\u043b\u0438\u0448\u043d\u0435\u0435 \u043e\u0442\u0440\u0435\u0437\u0430\u0435\u0442\u0441\u044f \u0434\u0432\u0438\u0436\u043a\u043e\u043c), \u0442\u0430\u043a \u0438 \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440 \u0432\u043e \u0444\u0440\u0435\u0439\u043c\u0431\u0443\u0444\u0435\u0440, \u0447\u0435\u043c \u043c\u044b \u0435\u0449\u0451 \u0432\u043e\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c\u0441\u044f.<\/p>\n<p>  \u0418\u0442\u0430\u043a, \u0447\u0442\u043e \u0436\u0435 \u043d\u0443\u0436\u043d\u043e, \u0447\u0442\u043e\u0431\u044b \u043d\u0430\u043f\u0438\u0441\u0430\u0442\u044c \u0441\u0432\u043e\u0439 \u043c\u043e\u0434\u0443\u043b\u044c \u0434\u043b\u044f VCV?<\/p>\n<h2><b>\u041d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0430 \u043e\u043a\u0440\u0443\u0436\u0435\u043d\u0438\u044f \u0438 \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0430 Rack SDK<\/b><\/h2>\n<p>  \u041f\u0435\u0440\u0432\u044b\u0439 \u0448\u0430\u0433 <a href=\"https:\/\/vcvrack.com\/manual\/Building#setting-up-your-development-environment\" rel=\"nofollow\">\u0445\u043e\u0440\u043e\u0448\u043e \u043e\u043f\u0438\u0441\u0430\u043d<\/a> \u0432 \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u0438 \u0438 \u0441\u043e\u0432\u0435\u0440\u0448\u0435\u043d\u043d\u043e \u043d\u0435 \u0432\u044b\u0437\u044b\u0432\u0430\u0435\u0442 \u0442\u0440\u0443\u0434\u043d\u043e\u0441\u0442\u0435\u0439 (\u043f\u043e-\u043a\u0440\u0430\u0439\u043d\u0435\u0439 \u043c\u0435\u0440\u0435 \u043f\u043e\u0434 linux), \u0442\u0430\u043a \u0447\u0442\u043e \u043d\u0435 \u0431\u0443\u0434\u0435\u043c \u043d\u0430 \u043d\u0451\u043c \u043e\u0441\u0442\u0430\u043d\u0430\u0432\u043b\u0438\u0432\u0430\u0442\u044c\u0441\u044f.<\/p>\n<h2><b>\u0413\u0435\u043d\u0435\u0440\u0438\u0440\u0443\u0435\u043c \u0448\u0430\u0431\u043b\u043e\u043d \u043f\u043b\u0430\u0433\u0438\u043d\u0430<\/b><\/h2>\n<p>  \u0414\u043b\u044f \u044d\u0442\u043e\u0433\u043e \u0432 Rack SDK \u0435\u0441\u0442\u044c \u0441\u043a\u0440\u0438\u043f\u0442 helper.py. \u0415\u043c\u0443 \u043d\u0443\u0436\u043d\u043e \u0441\u043a\u0430\u0437\u0430\u0442\u044c createplugin, \u043f\u043e\u0441\u043b\u0435 \u0447\u0435\u0433\u043e \u0443\u043a\u0430\u0437\u0430\u0442\u044c \u043d\u0430\u0437\u0432\u0430\u043d\u0438\u0435 \u043f\u043b\u0430\u0433\u0438\u043d\u0430 \u0438, \u043e\u043f\u0446\u0438\u043e\u043d\u0430\u043b\u044c\u043d\u043e, \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044e \u043e \u043d\u0451\u043c. <\/p>\n<pre><code class=\"bash\">&lt;Rack SDK folder&gt;\/helper.py createplugin MyPlugin<\/code><\/pre>\n<p>  \u041a\u043e\u0433\u0434\u0430 \u0448\u0430\u0431\u043b\u043e\u043d \u043f\u043b\u0430\u0433\u0438\u043d\u0430 \u0441\u043e\u0437\u0434\u0430\u043d, \u0435\u0433\u043e \u043c\u043e\u0436\u043d\u043e \u0441\u043a\u043e\u043c\u043f\u0438\u043b\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0438 \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u044c \u043a\u043e\u043c\u0430\u043d\u0434\u043e\u0439<\/p>\n<pre><code class=\"bash\">RACK_DIR=&lt;Rack SDK folder&gt; make install<\/code><\/pre>\n<p>  <\/p>\n<h2><b>\u0420\u0438\u0441\u0443\u0435\u043c \u0444\u0440\u043e\u043d\u0442\u0435\u043d\u0434 \u043c\u043e\u0434\u0443\u043b\u044f<\/b><\/h2>\n<p>  \u041a\u0430\u0436\u0434\u044b\u0439 \u043f\u043b\u0430\u0433\u0438\u043d \u043c\u043e\u0436\u0435\u0442 \u0441\u043e\u0434\u0435\u0440\u0436\u0430\u0442\u044c \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u043c\u043e\u0434\u0443\u043b\u0435\u0439, \u0438 \u0434\u043b\u044f \u043a\u0430\u0436\u0434\u043e\u0433\u043e \u0438\u0437 \u043c\u043e\u0434\u0443\u043b\u0435\u0439 \u043d\u0443\u0436\u043d\u043e \u043d\u0430\u0440\u0438\u0441\u043e\u0432\u0430\u0442\u044c \u0433\u043b\u0430\u0432\u043d\u0443\u044e \u043f\u0430\u043d\u0435\u043b\u044c. \u0414\u043b\u044f \u044d\u0442\u043e\u0433\u043e \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u044f VCV \u043f\u0440\u0435\u0434\u043b\u0430\u0433\u0430\u0435\u0442 \u043d\u0430\u043c \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c Inkscape \u0438\u043b\u0438 \u043b\u044e\u0431\u043e\u0439 \u0434\u0440\u0443\u0433\u043e\u0439 \u0432\u0435\u043a\u0442\u043e\u0440\u043d\u044b\u0439 \u0440\u0435\u0434\u0430\u043a\u0442\u043e\u0440. \u0422\u0430\u043a \u043a\u0430\u043a \u043c\u043e\u0434\u0443\u043b\u0438 \u0432 VCV \u043a\u0440\u0435\u043f\u044f\u0442\u0441\u044f \u043d\u0430 \u0432\u0438\u0440\u0442\u0443\u0430\u043b\u044c\u043d\u044b\u0439 Eurorack-\u0441\u0442\u0435\u043d\u0434, \u0438\u0445 \u0432\u044b\u0441\u043e\u0442\u0430 \u0432\u0441\u0435\u0433\u0434\u0430 \u0440\u0430\u0432\u043d\u0430 128,5\u043c\u043c, \u0430 \u0448\u0438\u0440\u0438\u043d\u0430 \u0434\u043e\u043b\u0436\u043d\u0430 \u0431\u044b\u0442\u044c \u043a\u0440\u0430\u0442\u043d\u0430 5,08\u043c\u043c. <br \/>  \u041e\u0441\u043d\u043e\u0432\u043d\u044b\u0435 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u044b \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u0430, \u0442\u0430\u043a\u0438\u0435 \u043a\u0430\u043a CV\/Gate \u0433\u043d\u0451\u0437\u0434\u0430, \u043a\u043d\u043e\u043f\u043a\u0438 \u0438 \u043b\u0430\u043c\u043f\u043e\u0447\u043a\u0438 \u043c\u043e\u0436\u043d\u043e \u0440\u0430\u0437\u043c\u0435\u0442\u0438\u0442\u044c \u0432 \u0432\u0435\u043a\u0442\u043e\u0440\u043d\u043e\u043c \u0432\u0438\u0434\u0435. \u0414\u043b\u044f \u044d\u0442\u043e\u0433\u043e \u043d\u0443\u0436\u043d\u043e \u043d\u0430\u0440\u0438\u0441\u043e\u0432\u0430\u0442\u044c \u043d\u0430 \u0438\u0445 \u043c\u0435\u0441\u0442\u0435 \u043a\u0440\u0443\u0433\u0438 \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0449\u0438\u0445 \u0446\u0432\u0435\u0442\u043e\u0432 (<a href=\"https:\/\/vcvrack.com\/manual\/Panel\" rel=\"nofollow\">\u043f\u043e\u0434\u0440\u043e\u0431\u043d\u0435\u0435 \u0442\u0443\u0442<\/a>), \u0447\u0442\u043e\u0431\u044b \u043f\u043e\u0442\u043e\u043c <i>helper.py<\/i> \u0441\u0433\u0435\u043d\u0435\u0440\u0438\u043b \u043f\u043e \u044d\u0442\u043e\u0439 \u0440\u0430\u0437\u043c\u0435\u0442\u043a\u0435 \u043a\u043e\u0434. \u041b\u0438\u0447\u043d\u043e \u043c\u043d\u0435 \u043f\u043e\u043a\u0430\u0437\u0430\u043b\u043e\u0441\u044c \u0447\u0442\u043e \u044d\u0442\u043e \u043d\u0435 \u043e\u0447\u0435\u043d\u044c \u0443\u0434\u043e\u0431\u043d\u0430\u044f \u0444\u0438\u0447\u0430 \u0438 \u043f\u0440\u043e\u0449\u0435 \u0440\u0430\u0437\u043c\u0435\u0449\u0430\u0442\u044c \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u044b \u043d\u0430\u043f\u0440\u044f\u043c\u0443\u044e \u0438\u0437 \u043a\u043e\u0434\u0430. \u041a\u043e\u0433\u0434\u0430 \u043a\u0430\u0440\u0442\u0438\u043d\u043a\u0430 \u0438 \u0440\u0430\u0437\u043c\u0435\u0442\u043a\u0430 \u0433\u043e\u0442\u043e\u0432\u044b, \u043d\u0443\u0436\u043d\u043e \u0441\u043d\u043e\u0432\u0430 \u0437\u0430\u043f\u0443\u0441\u0442\u0438\u0442\u044c <i>helper.py<\/i> \u0447\u0442\u043e\u0431\u044b \u0441\u043e\u0437\u0434\u0430\u0442\u044c \u0448\u0430\u0431\u043b\u043e\u043d \u043c\u043e\u0434\u0443\u043b\u044f \u0438 \u0441\u0432\u044f\u0437\u0430\u0442\u044c \u0435\u0433\u043e \u0441 \u043f\u0435\u0440\u0435\u0434\u043d\u0435\u0439 \u043f\u0430\u043d\u0435\u043b\u044c\u044e.<\/p>\n<pre><code class=\"bash\">helper.py createmodule MyModule res\/MyModule.svg src\/MyModule.cpp<\/code><\/pre>\n<p>  <\/p>\n<h2><b>\u041f\u043e\u0434\u043a\u043b\u044e\u0447\u0430\u0435\u043c \u043a\u043d\u043e\u043f\u043a\u0438 \u0438 \u043a\u0440\u0443\u0442\u0438\u043b\u043a\u0438<\/b><\/h2>\n<p>  <img decoding=\"async\" src=\"https:\/\/habrastorage.org\/webt\/oz\/wq\/z_\/ozwqz_ss4sqqdci_q7dxbarbfve.png\"><\/p>\n<p>  \u041d\u0435 \u0441\u0447\u0438\u0442\u0430\u044f \u0434\u0438\u0441\u043f\u043b\u0435\u044f, Ableton Push 2 \u0432\u0438\u0434\u0438\u0442\u0441\u044f \u043a\u043e\u043c\u043f\u044c\u044e\u0442\u0435\u0440\u043e\u043c \u043a\u0430\u043a \u043e\u0431\u044b\u0447\u043d\u044b\u0439 USB-MIDI \u0434\u0435\u0432\u0430\u0439\u0441, \u0447\u0442\u043e \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u043b\u0435\u0433\u043a\u043e \u043d\u0430\u043b\u0430\u0434\u0438\u0442\u044c \u0441\u0432\u044f\u0437\u044c \u043c\u0435\u0436\u0434\u0443 \u043d\u0438\u043c \u0438 VCV Rack. \u0414\u043b\u044f \u044d\u0442\u043e\u0433\u043e \u0441\u043e\u0437\u0434\u0430\u0434\u0438\u043c \u0432\u043d\u0443\u0442\u0440\u0438 \u043a\u043b\u0430\u0441\u0441\u0430 \u043c\u043e\u0434\u0443\u043b\u044f \u0432\u0445\u043e\u0434\u043d\u0443\u044e midi \u043e\u0447\u0435\u0440\u0435\u0434\u044c \u0438 \u0432\u044b\u0445\u043e\u0434\u043d\u043e\u0439 midi \u043f\u043e\u0440\u0442.<\/p>\n<div class=\"spoiler\"><b class=\"spoiler_title\">\u041a\u043e\u0434 \u0438\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438<\/b><\/p>\n<div class=\"spoiler_text\">\n<pre><code class=\"cpp\">struct AbletonPush2 : Module {     midi::Output midiOutput;     midi::InputQueue midiInput;      bool inputConnected;     bool outputConnected; } <\/code><\/pre>\n<p>  <\/div>\n<\/div>\n<p>  \u041f\u043e\u043f\u0440\u043e\u0431\u0443\u0435\u043c \u043d\u0430\u0439\u0442\u0438 Ableton Push \u0441\u0440\u0435\u0434\u0438 \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u043d\u044b\u0445 midi \u0434\u0435\u0432\u0430\u0439\u0441\u043e\u0432 \u0438 \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0438\u0442\u044c\u0441\u044f \u043a \u043d\u0435\u043c\u0443. \u0422\u0430\u043a \u043a\u0430\u043a \u043c\u043e\u0434\u0443\u043b\u044c \u043f\u0440\u0435\u0434\u043d\u0430\u0437\u043d\u0430\u0447\u0435\u043d \u0434\u043b\u044f \u0440\u0430\u0431\u043e\u0442\u044b \u0438\u0441\u043a\u043b\u044e\u0447\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u0441 Ableton Push, \u043d\u0430\u043c \u043d\u0435 \u043d\u0443\u0436\u043d\u043e \u043e\u0431\u0440\u0435\u043c\u0435\u043d\u044f\u0442\u044c \u044e\u0437\u0435\u0440\u0430 \u0432\u044b\u0431\u043e\u0440\u043e\u043c \u0434\u0435\u0432\u0430\u0439\u0441\u0430 \u0438 \u043c\u043e\u0436\u043d\u043e \u043f\u0440\u043e\u0441\u0442\u043e \u043d\u0430\u0439\u0442\u0438 \u0435\u0433\u043e \u043f\u043e \u043d\u0430\u0437\u0432\u0430\u043d\u0438\u044e.<\/p>\n<div class=\"spoiler\"><b class=\"spoiler_title\">\u041a\u043e\u0434 \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u044f \u043a \u043a\u043e\u043d\u0442\u0440\u043e\u043b\u043b\u0435\u0440\u0443<\/b><\/p>\n<div class=\"spoiler_text\">\n<pre><code class=\"cpp\">void connectPush() {     auto in_devs = midiInput.getDeviceIds();     for (int i = 0; i &lt; in_devs.size(); i++){         if (midiInput.getDeviceName(in_devs[i]).find(&quot;Ableton&quot;) != std::string::npos) {             midiInput.setDeviceId(in_devs[i]);             inputConnected = true;             break;         }     } \t\t     auto out_devs = midiOutput.getDeviceIds();     for (int i = 0; i &lt; out_devs.size(); i++){         if (midiOutput.getDeviceName(out_devs[i]).find(&quot;Ableton&quot;) != std::string::npos) {             midiOutput.setDeviceId(out_devs[i]);             outputConnected = true;             break;         }     } } <\/code><\/pre>\n<p>  <\/div>\n<\/div>\n<p>  \u0422\u0435\u043f\u0435\u0440\u044c \u0432 \u043c\u0435\u0442\u043e\u0434\u0435 <i>process<\/i> \u043c\u043e\u0436\u043d\u043e \u043f\u0435\u0440\u0438\u043e\u0434\u0438\u0447\u0435\u0441\u043a\u0438 \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u0442\u044c, \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d \u043b\u0438 \u043a\u043e\u043d\u0442\u0440\u043e\u043b\u043b\u0435\u0440 \u0438 \u0441\u043f\u0440\u0430\u0448\u0438\u0432\u0430\u0442\u044c midi \u043e\u0447\u0435\u0440\u0435\u0434\u044c, \u043d\u0435 \u043f\u0440\u0438\u0448\u043b\u043e \u043b\u0438 \u043d\u0430\u043c \u043a\u0430\u043a\u0438\u0445-\u043d\u0438\u0431\u0443\u0434\u044c \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0439. \u0422\u0443\u0442 \u0441\u0442\u043e\u0438\u0442 \u0441\u043a\u0430\u0437\u0430\u0442\u044c \u043e \u0442\u043e\u043c \u0447\u0442\u043e \u0438 \u043a\u0430\u043a \u0432\u043e\u043e\u0431\u0449\u0435 \u043a\u043e\u0434\u0438\u0440\u0443\u0435\u0442\u0441\u044f \u0432 \u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u0435 midi. \u041f\u043e \u0441\u0443\u0442\u0438 \u0435\u0441\u0442\u044c \u0434\u0432\u0430 \u0433\u043b\u0430\u0432\u043d\u044b\u0445 \u0442\u0438\u043f\u0430 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0439, \u044d\u0442\u043e Note ON\/OFF, \u043f\u0435\u0440\u0435\u0434\u0430\u044e\u0449\u0438\u0435 \u043d\u043e\u043c\u0435\u0440 \u043d\u043e\u0442\u044b \u0438 \u0441\u0438\u043b\u0443 \u043d\u0430\u0436\u0430\u0442\u0438\u044f \u0438 CC \u2014 Command Control, \u043f\u0435\u0440\u0435\u0434\u0430\u044e\u0449\u0438\u0435 \u0447\u0438\u0441\u043b\u0435\u043d\u043d\u043e\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u043e\u0433\u043e \u0438\u0437\u043c\u0435\u043d\u044f\u0435\u043c\u043e\u0433\u043e \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u0430. \u041f\u043e\u0434\u0440\u043e\u0431\u043d\u0435\u0435 \u043f\u0440\u043e midi \u043c\u043e\u0436\u043d\u043e \u043f\u043e\u0441\u043c\u043e\u0442\u0440\u0435\u0442\u044c <a href=\"https:\/\/habr.com\/ru\/post\/139226\/\">\u0437\u0434\u0435\u0441\u044c<\/a>.<\/p>\n<div class=\"spoiler\"><b class=\"spoiler_title\">\u041a\u043e\u0434 \u043e\u043f\u0440\u043e\u0441\u0430 MIDI \u043e\u0447\u0435\u0440\u0435\u0434\u0438<\/b><\/p>\n<div class=\"spoiler_text\">\n<pre><code class=\"cpp\">void process(const ProcessArgs &amp;args) override {     if (sampleCounter &gt; args.sampleRate \/ updateFrequency) {          if ((!inputConnected) &amp;&amp; (!outputConnected)) {             connectPush();         }  \tmidi::Message msg; \twhile (midiInput.shift(&amp;msg)) { \t    processMidi(msg); \t}     } } <\/code><\/pre>\n<p>  <\/div>\n<\/div>\n<p>  \u0422\u0435\u043f\u0435\u0440\u044c \u0445\u043e\u0447\u0435\u0442\u0441\u044f \u043d\u0430\u0443\u0447\u0438\u0442\u044c \u043f\u044d\u0434\u044b \u043a\u043e\u043d\u0442\u0440\u043e\u043b\u043b\u0435\u0440\u0430 \u0441\u0432\u0435\u0442\u0438\u0442\u044c\u0441\u044f \u0440\u0430\u0437\u043d\u044b\u043c\u0438 \u0446\u0432\u0435\u0442\u0430\u043c\u0438, \u0447\u0442\u043e\u0431\u044b \u0431\u044b\u043b\u043e \u0443\u0434\u043e\u0431\u043d\u0435\u0435 \u0432 \u043d\u0438\u0445 \u043e\u0440\u0438\u0435\u043d\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c\u0441\u044f. \u0414\u043b\u044f \u044d\u0442\u043e\u0433\u043e \u043d\u0430\u043c \u043d\u0430\u0434\u043e \u0431\u0443\u0434\u0435\u0442 \u043f\u043e\u0441\u044b\u043b\u0430\u0442\u044c \u0435\u043c\u0443 \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0449\u0438\u0435 midi \u043a\u043e\u043c\u0430\u043d\u0434\u044b. \u0420\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u0438\u043c, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u043f\u044d\u0434 \u0441 \u043d\u043e\u043c\u0435\u0440\u043e\u043c 36 (\u044d\u0442\u043e \u0441\u0430\u043c\u044b\u0439 \u043d\u0438\u0436\u043d\u0438\u0439 \u043b\u0435\u0432\u044b\u0439 \u043f\u044d\u0434). \u0415\u0441\u043b\u0438 \u043d\u0430 \u043d\u0435\u0433\u043e \u043d\u0430\u0436\u0430\u0442\u044c, \u043a\u043e\u043d\u0442\u0440\u043e\u043b\u043b\u0435\u0440 \u043f\u043e\u0448\u043b\u0451\u0442 \u043a\u043e\u043c\u0430\u043d\u0434\u0443 0x90 (note on), \u0441\u043b\u0435\u0434\u043e\u043c \u0437\u0430 \u043d\u0435\u0439 \u043d\u043e\u043c\u0435\u0440 \u043d\u043e\u0442\u044b (36) \u0438 \u0447\u0438\u0441\u043b\u043e \u043e\u0442 0 \u0434\u043e 127, \u043e\u0437\u043d\u0430\u0447\u0430\u044e\u0449\u0435\u0435 \u0441\u0438\u043b\u0443 \u043d\u0430\u0436\u0430\u0442\u0438\u044f. \u0410 \u043a\u043e\u0433\u0434\u0430, \u043d\u0430\u043e\u0431\u043e\u0440\u043e\u0442, \u043a\u043e\u043c\u043f\u044c\u044e\u0442\u0435\u0440 \u043f\u043e\u0441\u044b\u043b\u0430\u0435\u0442 \u043a\u043e\u043d\u0442\u0440\u043e\u043b\u043b\u0435\u0440\u0443 \u0442\u0443 \u0436\u0435 \u0441\u0430\u043c\u0443\u044e \u043a\u043e\u043c\u0430\u043d\u0434\u0443 0x90 \u0438 \u0442\u043e\u0442 \u0436\u0435 \u0441\u0430\u043c\u044b\u0439 \u043d\u043e\u043c\u0435\u0440 \u043d\u043e\u0442\u044b 36, \u0442\u043e \u0442\u0440\u0435\u0442\u044c\u0435 \u0447\u0438\u0441\u043b\u043e \u0431\u0443\u0434\u0435\u0442 \u043e\u0437\u043d\u0430\u0447\u0430\u0442\u044c \u0446\u0432\u0435\u0442, \u043a\u043e\u0442\u043e\u0440\u044b\u043c \u0434\u043e\u043b\u0436\u0435\u043d \u0441\u0432\u0435\u0442\u0438\u0442\u044c\u0441\u044f \u043d\u0438\u0436\u043d\u0438\u0439 \u043b\u0435\u0432\u044b\u0439 \u043f\u044d\u0434. \u041d\u043e\u043c\u0435\u0440\u0430 \u043a\u043d\u043e\u043f\u043e\u043a \u0438 \u043f\u044d\u0434\u043e\u0432 \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u044b \u043d\u0430 \u0440\u0438\u0441\u0443\u043d\u043a\u0435 \u0432\u044b\u0448\u0435. \u0423 Push \u0434\u043e\u0432\u043e\u043b\u044c\u043d\u043e \u043c\u043d\u043e\u0433\u043e \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u0435\u0439 \u0434\u043b\u044f \u0440\u0430\u0431\u043e\u0442\u044b \u0441 \u0446\u0432\u0435\u0442\u043e\u043c, \u043f\u0430\u043b\u0438\u0442\u0440\u0430\u043c\u0438, \u0430\u043d\u0438\u043c\u0430\u0446\u0438\u0435\u0439 \u0438 \u0434\u0440\u0443\u0433\u0438\u043c\u0438 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u0430\u043c\u0438 \u043f\u043e\u0434\u0441\u0432\u0435\u0442\u043a\u0438. \u042f \u043d\u0435 \u0441\u0442\u0430\u043b \u0432\u043d\u0438\u043a\u0430\u0442\u044c \u0432 \u043f\u043e\u0434\u0440\u043e\u0431\u043d\u043e\u0441\u0442\u0438 \u0438 \u043f\u0440\u043e\u0441\u0442\u043e \u0432\u044b\u0432\u0435\u043b \u0432\u0441\u0435 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u044b\u0435 \u0446\u0432\u0435\u0442\u0430 \u0434\u0435\u0444\u043e\u043b\u0442\u043d\u043e\u0439 \u043f\u0430\u043b\u0438\u0442\u0440\u044b \u043d\u0430 \u043f\u044d\u0434\u044b \u0438 \u0432\u044b\u0431\u0440\u0430\u043b \u043f\u043e\u043d\u0440\u0430\u0432\u0438\u0432\u0448\u0438\u0435\u0441\u044f. \u041d\u043e \u0432 \u043e\u0431\u0449\u0435\u043c \u0441\u043b\u0443\u0447\u0430\u0435, \u043f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u043e\u0432\u0430\u043d\u0438\u0435 midi \u043a\u043e\u043c\u0430\u043d\u0434\u044b \u0432 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u0428\u0418\u041c \u043d\u0430 \u0441\u0432\u0435\u0442\u043e\u0434\u0438\u043e\u0434\u0430\u0445, \u0441\u043e\u0433\u043b\u0430\u0441\u043d\u043e \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u0438, \u0432\u044b\u0433\u043b\u044f\u0434\u0438\u0442 \u0442\u0430\u043a:<\/p>\n<p>  <img decoding=\"async\" src=\"https:\/\/habrastorage.org\/webt\/8o\/at\/zq\/8oatzqvwy_gwqvgu4cmjgjpbknm.png\"><\/p>\n<div class=\"spoiler\"><b class=\"spoiler_title\">\u041a\u043e\u0434 \u0443\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u043f\u043e\u0434\u0441\u0432\u0435\u0442\u043a\u043e\u0439<\/b><\/p>\n<div class=\"spoiler_text\">\n<pre><code class=\"cpp\">void lightOn(int note, int color){     midi::Message msg;     msg.setNote(note);     msg.setValue(color);     msg.setChannel(1);     msg.setStatus(0x9);     midiOutput.sendMessage(msg); }  void lightOff(int note){     midi::Message msg;     msg.setNote(note);     msg.setValue(0);     msg.setChannel(1);     msg.setStatus(0x8);     midiOutput.sendMessage(msg); } <\/code><\/pre>\n<p>  <\/div>\n<\/div>\n<p>  <\/p>\n<h2><b>\u041f\u043e\u0434\u043a\u043b\u044e\u0447\u0430\u0435\u043c \u0434\u0438\u0441\u043f\u043b\u0435\u0439<\/b><\/h2>\n<p>  <img decoding=\"async\" src=\"https:\/\/habrastorage.org\/webt\/os\/yl\/kv\/osylkvou5ba8_aoa3rwhst94uiu.png\"><\/p>\n<p>  \u0414\u043b\u044f \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u044f \u0434\u0438\u0441\u043f\u043b\u0435\u044f \u043f\u0440\u0438\u0434\u0451\u0442\u0441\u044f \u043f\u043e\u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c \u0441 USB. \u0421\u0430\u043c \u043f\u043e \u0441\u0435\u0431\u0435 \u043a\u043e\u043d\u0442\u0440\u043e\u043b\u043b\u0435\u0440 \u043d\u0435 \u0443\u043c\u0435\u0435\u0442 \u043d\u0438\u0447\u0435\u0433\u043e \u0440\u0438\u0441\u043e\u0432\u0430\u0442\u044c \u0438 \u043d\u0435 \u0437\u043d\u0430\u0435\u0442 \u043d\u0438\u0447\u0435\u0433\u043e \u043e \u0433\u0440\u0430\u0444\u0438\u043a\u0435. \u0412\u0441\u0451 \u0447\u0442\u043e \u043e\u043d \u0445\u043e\u0447\u0435\u0442 \u2014 \u044d\u0442\u043e \u0447\u0442\u043e\u0431\u044b \u043d\u0435 \u0440\u0435\u0436\u0435 \u0447\u0435\u043c \u0440\u0430\u0437 \u0432 2 \u0441\u0435\u043a\u0443\u043d\u0434\u044b \u0435\u043c\u0443 \u043f\u0440\u0438\u0441\u044b\u043b\u0430\u043b\u0438 \u043a\u0430\u0434\u0440 \u0440\u0430\u0437\u043c\u0435\u0440\u043e\u043c 160&#215;960 \u043f\u0438\u043a\u0441\u0435\u043b\u0435\u0439. \u0412\u0435\u0441\u044c \u0440\u0435\u043d\u0434\u0435\u0440\u0438\u043d\u0433 \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u0438\u0442 \u043d\u0430 \u0441\u0442\u043e\u0440\u043e\u043d\u0435 \u043a\u043e\u043c\u043f\u044c\u044e\u0442\u0435\u0440\u0430. \u0414\u043b\u044f \u043d\u0430\u0447\u0430\u043b\u0430 \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0438\u043c \u0438 \u043e\u0442\u043a\u0440\u043e\u0435\u043c USB \u0434\u0435\u0432\u0430\u0439\u0441, \u043a\u0430\u043a \u044d\u0442\u043e <a href=\"https:\/\/github.com\/Ableton\/push-interface\/blob\/master\/doc\/AbletonPush2MIDIDisplayInterface.asc#3-display-interface\" rel=\"nofollow\">\u043e\u043f\u0438\u0441\u0430\u043d\u043e \u0432 \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u0438<\/a>:<\/p>\n<div class=\"spoiler\"><b class=\"spoiler_title\">\u041a\u043e\u0434 \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u044f \u0434\u0438\u0441\u043f\u043b\u0435\u044f<\/b><\/p>\n<div class=\"spoiler_text\">\n<pre><code class=\"cpp\">#ifdef _MSC_VER #define _CRT_SECURE_NO_WARNINGS #endif  #include &lt;stdio.h&gt;  #ifdef _WIN32  \/\/ see following link for a discussion of the \/\/ warning suppression: \/\/ http:\/\/sourceforge.net\/mailarchive\/forum.php? \/\/ thread_name=50F6011C.2020000%40akeo.ie&amp;forum_name=libusbx-devel  \/\/ Disable: warning C4200: nonstandard extension used: \/\/ zero-sized array in struct\/union #pragma warning(disable:4200)  #include &lt;windows.h&gt; #endif  #ifdef __linux__ #include &lt;libusb-1.0\/libusb.h&gt; #else #include &quot;libusb.h&quot; #endif  #define ABLETON_VENDOR_ID 0x2982 #define PUSH2_PRODUCT_ID  0x1967  static libusb_device_handle* open_push2_device() {   int result;    if ((result = libusb_init(NULL)) &lt; 0)   {     printf(&quot;error: [%d] could not initilialize usblib\\n&quot;, result);     return NULL;   }    libusb_set_debug(NULL, LIBUSB_LOG_LEVEL_ERROR);    libusb_device** devices;   ssize_t count;   count = libusb_get_device_list(NULL, &amp;devices);   if (count &lt; 0)   {     printf(&quot;error: [%ld] could not get usb device list\\n&quot;, count);     return NULL;   }    libusb_device* device;   libusb_device_handle* device_handle = NULL;    char ErrorMsg[128];    \/\/ set message in case we get to the end of the list w\/o finding a device   sprintf(ErrorMsg, &quot;error: Ableton Push 2 device not found\\n&quot;);    for (int i = 0; (device = devices[i]) != NULL; i++)   {     struct libusb_device_descriptor descriptor;     if ((result = libusb_get_device_descriptor(device, &amp;descriptor)) &lt; 0)     {       sprintf(ErrorMsg,         &quot;error: [%d] could not get usb device descriptor\\n&quot;, result);       continue;     }      if (descriptor.bDeviceClass == LIBUSB_CLASS_PER_INTERFACE       &amp;&amp; descriptor.idVendor == ABLETON_VENDOR_ID       &amp;&amp; descriptor.idProduct == PUSH2_PRODUCT_ID)     {       if ((result = libusb_open(device, &amp;device_handle)) &lt; 0)       {         sprintf(ErrorMsg,           &quot;error: [%d] could not open Ableton Push 2 device\\n&quot;, result);       }       else if ((result = libusb_claim_interface(device_handle, 0)) &lt; 0)       {         sprintf(ErrorMsg,           &quot;error: [%d] could not claim interface 0 of Push 2 device\\n&quot;, result);         libusb_close(device_handle);         device_handle = NULL;       }       else       {         break; \/\/ successfully opened       }     }   }    if (device_handle == NULL)   {     printf(ErrorMsg);   }    libusb_free_device_list(devices, 1);   return device_handle; }  static void close_push2_device(libusb_device_handle* device_handle) {   libusb_release_interface(device_handle, 0);   libusb_close(device_handle); } <\/code><\/pre>\n<p>  <\/div>\n<\/div>\n<p>  \u0427\u0442\u043e\u0431\u044b \u043f\u0435\u0440\u0435\u0434\u0430\u0442\u044c \u043a\u0430\u0434\u0440, \u043d\u0443\u0436\u043d\u043e \u0441\u043d\u0430\u0447\u0430\u043b\u0430 \u043f\u043e\u0441\u043b\u0430\u0442\u044c 16-\u0431\u0430\u0439\u0442\u043e\u0432\u044b\u0439 \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043e\u043a, \u0430 \u043f\u043e\u0442\u043e\u043c 160 \u0441\u0442\u0440\u043e\u043a \u0438\u0437 960 16-\u0431\u0438\u0442\u043d\u044b\u0445 \u0447\u0438\u0441\u0435\u043b \u043a\u0430\u0436\u0434\u0430\u044f. \u041f\u0440\u0438 \u044d\u0442\u043e\u043c, \u0441\u043e\u0433\u043b\u0430\u0441\u043d\u043e \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u0438, \u0441\u0442\u0440\u043e\u043a\u0438 \u0441\u043b\u0435\u0434\u0443\u0435\u0442 \u043f\u0435\u0440\u0435\u0434\u0430\u0432\u0430\u0442\u044c \u043d\u0435 \u043f\u043e 1920 \u0431\u0430\u0439\u0442, \u0430 \u043f\u0430\u043a\u0435\u0442\u0430\u043c\u0438 \u043f\u043e 2048 \u0431\u0430\u0439\u0442, \u0434\u043e\u043f\u043e\u043b\u043d\u044f\u044f \u043d\u0443\u043b\u044f\u043c\u0438.<\/p>\n<div class=\"spoiler\"><b class=\"spoiler_title\">\u041a\u043e\u0434 \u043f\u0435\u0440\u0435\u0434\u0430\u0447\u0438 \u043a\u0430\u0434\u0440\u0430<\/b><\/p>\n<div class=\"spoiler_text\">\n<pre><code class=\"cpp\">struct Push2Display : FramebufferWidget {      unsigned char frame_header[16] = {           0xFF, 0xCC, 0xAA, 0x88,           0x00, 0x00, 0x00, 0x00,           0x00, 0x00, 0x00, 0x00,           0x00, 0x00, 0x00, 0x00      };      libusb_device_handle* device_handle;      unsigned char* image;      void sendDisplay(unsigned char * image) {         int actual_length;               libusb_bulk_transfer(device_handle, PUSH2_BULK_EP_OUT, frame_header, sizeof(frame_header), &amp;actual_length, TRANSFER_TIMEOUT);         for (int i = 0; i &lt; 160; i++)             libusb_bulk_transfer(device_handle, PUSH2_BULK_EP_OUT, &amp;image[(159 - i)*1920], 2048, &amp;actual_length, TRANSFER_TIMEOUT);     } } <\/code><\/pre>\n<p>  <\/div>\n<\/div>\n<p>  \u0422\u0435\u043f\u0435\u0440\u044c \u043e\u0441\u0442\u0430\u043b\u043e\u0441\u044c \u0442\u043e\u043b\u044c\u043a\u043e \u043e\u0442\u0440\u0438\u0441\u043e\u0432\u0430\u0442\u044c \u0438 \u0437\u0430\u043f\u0438\u0441\u0430\u0442\u044c \u0432 \u0431\u0443\u0444\u0435\u0440 \u043a\u0430\u0434\u0440. \u0414\u043b\u044f \u044d\u0442\u043e\u0433\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c \u043a\u043b\u0430\u0441\u0441 <i>FramebufferWidget<\/i>, \u0440\u0435\u0430\u043b\u0438\u0437\u0443\u044e\u0449\u0438\u0439 \u043c\u0435\u0442\u043e\u0434 <i>drawFramebuffer<\/i>. VCV Rack \u0438\u0437 \u043a\u043e\u0440\u043e\u0431\u043a\u0438 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0443 <a href=\"https:\/\/github.com\/memononen\/nanovg\" rel=\"nofollow\">nanovg<\/a>, \u0442\u0430\u043a \u0447\u0442\u043e \u0433\u0440\u0430\u0444\u0438\u043a\u0443 \u0437\u0434\u0435\u0441\u044c \u043f\u0438\u0441\u0430\u0442\u044c \u0434\u043e\u0432\u043e\u043b\u044c\u043d\u043e \u043b\u0435\u0433\u043a\u043e. \u0423\u0437\u043d\u0430\u0435\u043c \u0442\u0435\u043a\u0443\u0449\u0438\u0439 \u0433\u0440\u0430\u0444\u0438\u0447\u0435\u0441\u043a\u0438\u0439 \u043a\u043e\u043d\u0442\u0435\u043a\u0441\u0442 \u0438\u0437 \u0433\u043b\u043e\u0431\u0430\u043b\u044c\u043d\u043e\u0439 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u043e\u0439 APP \u0438 \u0441\u043e\u0445\u0440\u0430\u043d\u0438\u043c \u0435\u0433\u043e \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435. \u0414\u0430\u043b\u044c\u0448\u0435 \u0441\u043e\u0437\u0434\u0430\u0434\u0438\u043c \u043f\u0443\u0441\u0442\u043e\u0439 \u043a\u0430\u0434\u0440 \u0440\u0430\u0437\u043c\u0435\u0440\u043e\u043c 160&#215;960 \u0438 \u043e\u0442\u0440\u0438\u0441\u0443\u0435\u043c \u0435\u0433\u043e \u043c\u0435\u0442\u043e\u0434\u043e\u043c <i>draw<\/i>. \u041f\u043e\u0441\u043b\u0435 \u044d\u0442\u043e\u0433\u043e \u0441\u043a\u043e\u043f\u0438\u0440\u0443\u0435\u043c \u0444\u0440\u0435\u0439\u043c\u0431\u0443\u0444\u0435\u0440 \u0432 \u043c\u0430\u0441\u0441\u0438\u0432, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0431\u0443\u0434\u0435\u0442 \u043e\u0442\u043f\u0440\u0430\u0432\u043b\u0435\u043d \u043f\u043e USB, \u0438 \u0432\u0435\u0440\u043d\u0451\u043c \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435 \u043a\u043e\u043d\u0442\u0435\u043a\u0441\u0442\u0430. \u0412 \u043a\u043e\u043d\u0446\u0435 \u0432\u044b\u0441\u0442\u0430\u0432\u0438\u043c \u0444\u043b\u0430\u0433 <i>dirty<\/i>, \u0447\u0442\u043e\u0431\u044b \u043d\u0430 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u0439 \u0438\u0442\u0435\u0440\u0430\u0446\u0438\u0438 \u043e\u0442\u0440\u0438\u0441\u043e\u0432\u043a\u0438 \u0434\u0432\u0438\u0436\u043e\u043a VCV \u043d\u0435 \u0437\u0430\u0431\u044b\u043b \u043e\u0431\u043d\u043e\u0432\u0438\u0442\u044c \u043d\u0430\u0448 \u0432\u0438\u0434\u0436\u0435\u0442.<\/p>\n<div class=\"spoiler\"><b class=\"spoiler_title\">\u041a\u043e\u0434 \u043e\u0442\u0440\u0438\u0441\u043e\u0432\u043a\u0438 \u043a\u0430\u0434\u0440\u0430<\/b><\/p>\n<div class=\"spoiler_text\">\n<pre><code class=\"cpp\">void drawFramebuffer() override {      NVGcontext* vg = APP-&gt;window-&gt;vg;      if (display_connected) {         nvgSave(vg); \tglViewport(0, 0, 960, 160);         glClearColor(0, 0, 0, 0);         glClear(GL_COLOR_BUFFER_BIT|GL_STENCIL_BUFFER_BIT);  \tnvgBeginFrame(vg, 960,  160, 1);         draw(vg);         nvgEndFrame(vg);          glReadPixels(0, 0, 960, 160, GL_RGB, GL_UNSIGNED_SHORT_5_6_5, image);           \/\/ \u041f\u043e\u0431\u0430\u0439\u0442\u043e\u0432\u044b\u0439 XOR \u0441 \u043a\u043e\u0434\u0438\u0440\u0443\u044e\u0449\u0435\u0439 \u043f\u043e\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u044c\u044e, \u0441\u043e\u0433\u043b\u0430\u0441\u043d\u043e \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u0438         for (int i = 0; i &lt; 80*960; i ++){             image[i * 4] ^= 0xE7; \t    image[i * 4 + 1] ^= 0xF3;             image[i * 4 + 2] ^= 0xE7; \t    image[i * 4 + 3] ^= 0xFF;         } \t    \t \tsendDisplay(image);  \tnvgRestore(vg);     }      dirty = true; } <\/code><\/pre>\n<p>  <\/div>\n<\/div>\n<p>  <\/p>\n<h2><b>\u041b\u043e\u0433\u0438\u043a\u0430 \u0432\u0437\u0430\u0438\u043c\u043e\u0434\u0435\u0439\u0441\u0442\u0432\u0438\u044f \u0438 \u043c\u0430\u043f\u043f\u0438\u043d\u0433 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u043e\u0432<\/b><\/h2>\n<p>  \u0414\u043b\u044f \u043c\u043e\u0435\u0439 \u0437\u0430\u0434\u0430\u0447\u0438 \u043c\u043d\u0435 \u0445\u043e\u0442\u0435\u043b\u043e\u0441\u044c \u0443\u043c\u0435\u0442\u044c \u043f\u0435\u0440\u0435\u043a\u043b\u044e\u0447\u0430\u0442\u044c \u043f\u0430\u0442\u0442\u0435\u0440\u043d\u044b, \u0437\u0430\u043f\u0438\u0441\u0430\u043d\u043d\u044b\u0435 \u0432 \u0441\u0435\u043a\u0432\u0435\u043d\u0441\u0435\u0440\u044b, \u0438 \u043f\u0440\u0438 \u044d\u0442\u043e\u043c \u043a\u043e\u043d\u0442\u0440\u043e\u043b\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0451\u043d\u043d\u044b\u0439 \u043d\u0430\u0431\u043e\u0440 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u043e\u0432, \u0441\u0432\u043e\u0439 \u0434\u043b\u044f \u043a\u0430\u0436\u0434\u043e\u0439 \u0433\u0440\u0443\u043f\u043f\u044b \u043f\u0430\u0442\u0442\u0435\u0440\u043d\u043e\u0432. \u041f\u043e\u0434 \u043c\u0430\u043f\u043f\u0438\u043d\u0433\u043e\u043c \u044f \u043f\u043e\u043d\u0438\u043c\u0430\u044e \u0441\u0432\u044f\u0437\u044b\u0432\u0430\u043d\u0438\u0435 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u0430 \u043e\u0434\u043d\u043e\u0433\u043e \u043c\u043e\u0434\u0443\u043b\u044f \u0441 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u043e\u043c \u0434\u0440\u0443\u0433\u043e\u0433\u043e \u043c\u043e\u0434\u0443\u043b\u044f \u0438\u043b\u0438 midi \u043a\u043e\u043d\u0442\u0440\u043e\u043b\u043b\u0435\u0440\u0430. \u042f \u043d\u0430\u0448\u0451\u043b \u043a\u0440\u0430\u0439\u043d\u0435 \u043c\u0430\u043b\u043e \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u0438 \u043e \u0442\u043e\u043c \u043a\u0430\u043a \u043c\u0430\u043f\u043f\u0438\u043d\u0433 \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u043a\u0440\u0430\u0441\u0438\u0432\u043e, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u0431\u043e\u043b\u044c\u0448\u0443\u044e \u0447\u0430\u0441\u0442\u044c \u043a\u043e\u0434\u0430, \u0440\u0435\u0430\u043b\u0438\u0437\u0443\u044e\u0449\u0435\u0433\u043e \u0435\u0433\u043e \u0432\u0437\u044f\u043b \u0438\u0437 \u0432\u0441\u0442\u0440\u043e\u0435\u043d\u043d\u043e\u0433\u043e \u0432 VCV \u043c\u043e\u0434\u0443\u043b\u044f <a href=\"https:\/\/github.com\/VCVRack\/Rack\/blob\/v1\/src\/core\/MIDI_Map.cpp\" rel=\"nofollow\">MIDI Map<\/a>. \u0412\u043a\u0440\u0430\u0442\u0446\u0435, \u0434\u043b\u044f \u043a\u0430\u0436\u0434\u043e\u0439 \u0441\u0432\u044f\u0437\u043a\u0438 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u043e\u0432 \u0442\u0430\u043c \u0441\u043e\u0437\u0434\u0430\u0451\u0442\u0441\u044f \u0441\u043f\u0435\u0446\u0438\u0430\u043b\u044c\u043d\u044b\u0439 \u043e\u0431\u044a\u0435\u043a\u0442 <i>ParamHandle<\/i>, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 <s>\u0447\u0435\u0440\u0435\u0437 \u043a\u043e\u0441\u0442\u044b\u043b\u0438<\/s> \u0441\u043e\u043e\u0431\u0449\u0430\u0435\u0442 \u0434\u0432\u0438\u0436\u043a\u0443 \u0447\u0442\u043e \u0441 \u0447\u0435\u043c \u0441\u0432\u044f\u0437\u0430\u043d\u043e.<\/p>\n<h2><b>\u0417\u0430\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435<\/b><\/h2>\n<p>  \u0412\u043e\u0442 \u0442\u0430\u043a\u043e\u0439 \u043c\u043e\u0434\u0443\u043b\u044c \u0443 \u043c\u0435\u043d\u044f \u043f\u043e\u043b\u0443\u0447\u0438\u043b\u0441\u044f \u0432 \u0438\u0442\u043e\u0433\u0435. \u041f\u043e\u043c\u0438\u043c\u043e \u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043d\u043e\u0433\u043e \u043f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u043e\u0432\u0430\u043d\u0438\u044f midi \u0432 CV, \u043e\u043d \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u0433\u0440\u0443\u043f\u043f\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043f\u044d\u0434\u044b, \u043f\u0440\u0438\u0441\u0432\u0430\u0438\u0432\u0430\u0442\u044c \u0438\u043c \u0446\u0432\u0435\u0442\u0430 \u0438 \u0441\u0432\u044f\u0437\u044b\u0432\u0430\u0442\u044c \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u043b\u044c\u043d\u044b\u0435 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b \u043c\u043e\u0434\u0443\u043b\u0435\u0439 \u0441 \u044d\u043d\u043a\u043e\u0434\u0435\u0440\u0430\u043c\u0438 Push, \u043e\u0442\u043e\u0431\u0440\u0430\u0436\u0430\u044f \u0438\u0445 \u043d\u0430\u0437\u0432\u0430\u043d\u0438\u044f \u0438 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u043d\u0430 \u0434\u0438\u0441\u043f\u043b\u0435\u0435 \u043a\u043e\u043d\u0442\u0440\u043e\u043b\u043b\u0435\u0440\u0430. \u041d\u0430 \u0432\u0438\u0434\u0435\u043e \u043d\u0438\u0436\u0435 \u043c\u043e\u0436\u043d\u043e \u043f\u043e\u0441\u043c\u043e\u0442\u0440\u0435\u0442\u044c \u0435\u0433\u043e \u043e\u0431\u0437\u043e\u0440, \u0430 \u043d\u0430 <a href=\"https:\/\/www.youtube.com\/watch?v=Y2RphGohREE\" rel=\"nofollow\">\u044d\u0442\u043e\u043c \u0432\u0438\u0434\u0435\u043e<\/a> \u0443\u0432\u0438\u0434\u0435\u0442\u044c \u0432 \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0438.<\/p>\n<div class=\"oembed\">\n<div>\n<div style=\"left: 0; width: 100%; height: 0; position: relative; padding-bottom: 56.25%;\"><iframe src=\"https:\/\/www.youtube.com\/embed\/OhdxXv6uHF0?rel=0&amp;showinfo=1&amp;start=2&amp;hl=en-US\" style=\"border: 0; top: 0; left: 0; width: 100%; height: 100%; position: absolute;\" allowfullscreen scrolling=\"no\" allow=\"encrypted-media; accelerometer; gyroscope; picture-in-picture\"><\/iframe><\/div>\n<\/div>\n<\/div>\n<p>  \u041f\u043e\u043b\u043d\u044b\u0439 \u043a\u043e\u0434 \u0434\u043e\u0441\u0442\u0443\u043f\u0435\u043d <a href=\"https:\/\/github.com\/ed9m\/ed9m_vcv\" rel=\"nofollow\">\u0432\u043e\u0442 \u0437\u0434\u0435\u0441\u044c<\/a>.<\/p>\n<p>  \u041f\u0440\u043e\u0442\u0435\u0441\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0435\u0433\u043e \u0443\u0434\u0430\u043b\u043e\u0441\u044c \u0442\u043e\u043b\u044c\u043a\u043e \u043f\u043e\u0434 Linux (Ubuntu 18.04), \u043d\u0430 MacOS \u043d\u0435 \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0438\u043b\u0441\u044f \u0434\u0438\u0441\u043f\u043b\u0435\u0439 \u0438\u0437-\u0437\u0430 \u0441\u043f\u0435\u0446\u0438\u0444\u0438\u043a\u0438 libusb \u0438 \u0432\u043e\u0437\u043d\u0438\u043a\u043b\u0438 \u0441\u0442\u0440\u0430\u043d\u043d\u044b\u0435 \u0437\u0430\u0434\u0435\u0440\u0436\u043a\u0438 \u0432 midi \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u0435. \u041d\u0435 \u0441\u043c\u043e\u0442\u0440\u044f \u043d\u0430 \u044d\u0442\u043e, VCV Rack \u043e\u0441\u0442\u0430\u0432\u0438\u043b \u043e\u0447\u0435\u043d\u044c \u0445\u043e\u0440\u043e\u0448\u0435\u0435 \u0432\u043f\u0435\u0447\u0430\u0442\u043b\u0435\u043d\u0438\u0435 \u0438 \u043a\u0430\u043a \u0444\u0440\u0435\u0439\u043c\u0432\u043e\u0440\u043a \u0438 \u043a\u0430\u043a modular DAW, \u044f \u043d\u0430\u0434\u0435\u044e\u0441\u044c \u0447\u0442\u043e VCV \u0431\u0443\u0434\u0435\u0442 \u0440\u0430\u0437\u0432\u0438\u0432\u0430\u0442\u044c\u0441\u044f \u0438 \u0434\u0430\u043b\u044c\u0448\u0435, \u0430 \u044d\u0442\u0430 \u0441\u0442\u0430\u0442\u044c\u044f \u043f\u043e\u043c\u043e\u0436\u0435\u0442 \u0435\u0449\u0451 \u043a\u043e\u043c\u0443-\u0442\u043e \u043d\u0430\u043f\u0438\u0441\u0430\u0442\u044c \u0434\u043b\u044f \u043d\u0435\u0433\u043e \u0441\u0432\u043e\u0438 \u043c\u043e\u0434\u0443\u043b\u0438.<\/p><\/div>\n<p> \u0441\u0441\u044b\u043b\u043a\u0430 \u043d\u0430 \u043e\u0440\u0438\u0433\u0438\u043d\u0430\u043b \u0441\u0442\u0430\u0442\u044c\u0438 <a href=\"https:\/\/habr.com\/ru\/post\/491244\/\"> https:\/\/habr.com\/ru\/post\/491244\/<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"\n<div class=\"post__text post__text-html post__text_v1\" id=\"post-content-body\" data-io-article-url=\"https:\/\/habr.com\/ru\/post\/491244\/\">\n<div style=\"text-align:center;\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/webt\/qk\/vm\/8j\/qkvm8jnnid3kb_8kybxztptlbfu.png\"><\/div>\n<p>  \u0421\u043e\u0437\u0434\u0430\u043d\u0438\u0435 \u043c\u0443\u0437\u044b\u043a\u0438, \u0432 \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0435\u0435 \u0432\u0440\u0435\u043c\u044f, \u043f\u0440\u043e\u0445\u043e\u0434\u0438\u0442 \u043f\u0440\u0438\u043c\u0435\u0440\u043d\u043e \u0442\u043e\u0442 \u0436\u0435 \u043f\u0443\u0442\u044c \u0447\u0442\u043e \u0444\u043e\u0442\u043e\u0433\u0440\u0430\u0444\u0438\u044f 10 \u043b\u0435\u0442 \u043d\u0430\u0437\u0430\u0434: \u0443 \u043a\u0430\u0436\u0434\u043e\u0433\u043e \u043f\u043e\u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0441\u0432\u043e\u044f \u0437\u0435\u0440\u043a\u0430\u043b\u043a\u0430 \u0438 \u0430\u043a\u043a\u0430\u0443\u043d\u0442 \u0432 \u0438\u043d\u0441\u0442\u0430\u0433\u0440\u0430\u043c\u0435. \u041c\u0443\u0437\u044b\u043a\u0430\u043b\u044c\u043d\u0430\u044f \u0438\u043d\u0434\u0443\u0441\u0442\u0440\u0438\u044f \u044d\u0442\u043e\u043c\u0443 \u043e\u0447\u0435\u043d\u044c \u0440\u0430\u0434\u0430, \u0432\u0435\u0434\u044c \u0442\u0430\u043a\u043e\u0439 \u0438\u043d\u0442\u0435\u0440\u0435\u0441 \u043f\u0440\u0438\u043d\u043e\u0441\u0438\u0442 \u043c\u043d\u043e\u0433\u043e \u0434\u0435\u043d\u0435\u0433. \u041a\u0430\u0436\u0434\u044b\u0439 \u0434\u0435\u043d\u044c \u043f\u043e\u044f\u0432\u043b\u044f\u044e\u0442\u0441\u044f \u043d\u043e\u0432\u044b\u0435 VST \u043f\u043b\u0430\u0433\u0438\u043d\u044b \u0438 \u0430\u043d\u0430\u043b\u043e\u0433\u043e\u0432\u044b\u0435 \u0434\u0435\u0432\u0430\u0439\u0441\u044b, \u0441\u0442\u0440\u0435\u043c\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u0440\u0430\u0441\u0442\u0451\u0442 \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u0442\u0435\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438\u0445 \u043a\u0443\u0440\u0441\u043e\u0432, \u0431\u043b\u043e\u0433\u0438, \u043f\u043e\u0441\u0432\u044f\u0449\u0451\u043d\u043d\u044b\u0435 \u043c\u0443\u0437\u044b\u043a\u0430\u043b\u044c\u043d\u043e\u043c\u0443 \u043f\u0440\u043e\u0434\u0430\u043a\u0448\u0435\u043d\u0443 \u0432\u044b\u0445\u043e\u0434\u044f\u0442 \u0432 \u0442\u043e\u043f youtube. \u041d\u0430 \u044d\u0442\u043e\u043c \u0444\u043e\u043d\u0435 \u043e\u0447\u0435\u043d\u044c \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u043e \u0432\u044b\u0433\u043b\u044f\u0434\u044f\u0442 open-source \u043f\u0440\u043e\u0435\u043a\u0442\u044b, \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u044e\u0449\u0438\u0435 \u043b\u044e\u0431\u043e\u043c\u0443 \u0436\u0435\u043b\u0430\u044e\u0449\u0435\u043c\u0443 \u043f\u043e\u043f\u0440\u043e\u0431\u043e\u0432\u0430\u0442\u044c \u0441\u0435\u0431\u044f \u0432 \u0440\u043e\u043b\u0438 \u043f\u0440\u043e\u0434\u044e\u0441\u0435\u0440\u0430, \u043d\u0435 \u0442\u0440\u0430\u0442\u044f \u043d\u0430 \u044d\u0442\u043e \u043a\u0443\u0447\u0443 \u0441\u0440\u0435\u0434\u0441\u0442\u0432. \u041e\u0434\u043d\u0438\u043c \u0438\u0437 \u0442\u0430\u043a\u0438\u0445 \u043f\u0440\u043e\u0435\u043a\u0442\u043e\u0432 \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f VCV Rack, \u0441\u0442\u0430\u0432\u044f\u0449\u0438\u0439 \u0446\u0435\u043b\u044c\u044e \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u0441\u0430\u043c\u044b\u0439 \u0434\u043e\u0440\u043e\u0433\u043e\u0439 \u043a\u043b\u0430\u0441\u0441 \u043c\u0443\u0437\u044b\u043a\u0430\u043b\u044c\u043d\u044b\u0445 \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u043e\u0432 \u2014 \u0430\u043d\u0430\u043b\u043e\u0433\u043e\u0432\u044b\u0435 \u043c\u043e\u0434\u0443\u043b\u044c\u043d\u044b\u0435 \u0441\u0438\u043d\u0442\u0435\u0437\u0430\u0442\u043e\u0440\u044b \u2014 \u0434\u043e\u0441\u0442\u0443\u043f\u043d\u044b\u043c\u0438 \u043a\u0430\u0436\u0434\u043e\u043c\u0443. \u041d\u0435\u0434\u0430\u0432\u043d\u043e, \u043a\u043e\u0433\u0434\u0430 \u0443 \u043c\u0435\u043d\u044f \u0432\u043e\u0437\u043d\u0438\u043a\u043b\u0430 \u0438\u0434\u0435\u044f \u0442\u0440\u0435\u043a\u0430, \u0430 \u043f\u043e\u0434 \u0440\u0443\u043a\u043e\u0439 \u043e\u043a\u0430\u0437\u0430\u043b\u0441\u044f \u0442\u043e\u043b\u044c\u043a\u043e \u043d\u043e\u0443\u0442\u0431\u0443\u043a \u043d\u0430 linux \u044f \u0437\u0430\u0445\u043e\u0442\u0435\u043b \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u0442\u0440\u0435\u043a \u0446\u0435\u043b\u0438\u043a\u043e\u043c \u0432 VCV. \u0410 \u043f\u043e \u0445\u043e\u0434\u0443 \u0434\u0435\u043b\u0430 \u043f\u043e\u044f\u0432\u0438\u043b\u043e\u0441\u044c \u0436\u0435\u043b\u0430\u043d\u0438\u0435 \u0443\u043f\u0440\u0430\u0432\u043b\u044f\u0442\u044c \u0441\u0438\u043d\u0442\u0435\u0437\u0430\u0442\u043e\u0440\u0430\u043c\u0438 \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e midi \u043a\u043e\u043d\u0442\u0440\u043e\u043b\u043b\u0435\u0440\u0430 \u0442\u0430\u043a, \u043a\u0430\u043a \u0441 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435\u043c \u0434\u043e\u0441\u0442\u0443\u043f\u043d\u044b\u0445 \u043c\u043e\u0434\u0443\u043b\u0435\u0439 \u043d\u0435 \u043f\u043e\u043b\u0443\u0447\u0430\u043b\u043e\u0441\u044c. \u0412 \u0438\u0442\u043e\u0433\u0435 \u044f \u0440\u0435\u0448\u0438\u043b \u043d\u0430\u043f\u0438\u0441\u0430\u0442\u044c \u043f\u043b\u0430\u0433\u0438\u043d \u0434\u043b\u044f \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u044f Ableton Push 2 \u043a VCV Rack. \u041e \u0442\u043e\u043c \u0447\u0442\u043e \u0438\u0437 \u044d\u0442\u043e\u0433\u043e \u043f\u043e\u043b\u0443\u0447\u0438\u043b\u043e\u0441\u044c, \u0438 \u043a\u0430\u043a \u043f\u0438\u0441\u0430\u0442\u044c \u0441\u0432\u043e\u0438 \u043c\u043e\u0434\u0443\u043b\u0438 \u0434\u043b\u044f VCV \u043f\u043e\u0433\u043e\u0432\u043e\u0440\u0438\u043c \u0432 \u044d\u0442\u043e\u0439 \u0441\u0442\u0430\u0442\u044c\u0435.   <\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[],"tags":[],"class_list":["post-299742","post","type-post","status-publish","format-standard","hentry"],"_links":{"self":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/299742","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=299742"}],"version-history":[{"count":0,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/299742\/revisions"}],"wp:attachment":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=299742"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=299742"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=299742"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}