Ableton рдХреА рдЬрд░реВрд░рдд рдирд╣реАрдВ рд╣реИ: Ableton Push 2 рдХреЛ VCV рд░реИрдХ рд╕реЗ рдХрдиреЗрдХреНрдЯ рдХрд░реЗрдВ


рд╕рдВрдЧреАрдд рдХрд╛ рдирд┐рд░реНрдорд╛рдг, рд╣рд╛рд▓ рд╣реА рдореЗрдВ, 10 рд╕рд╛рд▓ рдкрд╣рд▓реЗ рдХреА рддрд╕реНрд╡реАрд░ рдХреЗ рд╕рдорд╛рди рд╣реИ: рдкреНрд░рддреНрдпреЗрдХ рдХрд╛ рдЕрдкрдирд╛ рдбреАрдПрд╕рдПрд▓рдЖрд░ рдФрд░ рдЗрдВрд╕реНрдЯрд╛рдЧреНрд░рд╛рдо рдЦрд╛рддрд╛ рд╣реИред рд╕рдВрдЧреАрдд рдЙрджреНрдпреЛрдЧ рдЗрд╕ рдмрд╛рд░реЗ рдореЗрдВ рдмрд╣реБрдд рдЦреБрд╢ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдЗрд╕ рддрд░рд╣ рдХреЗ рдмреНрдпрд╛рдЬ рд╕реЗ рдмрд╣реБрдд рд╕рд╛рд░рд╛ рдкреИрд╕рд╛ рдЖрддрд╛ рд╣реИред рд╣рд░ рджрд┐рди, рдирдП рд╡реАрдПрд╕рдЯреА рдкреНрд▓рдЧрдЗрдиреНрд╕ рдФрд░ рдПрдирд╛рд▓реЙрдЧ рдбрд┐рд╡рд╛рдЗрд╕ рджрд┐рдЦрд╛рдИ рджреЗрддреЗ рд╣реИрдВ, рд╡рд┐рд╖рдпрдЧрдд рдкрд╛рдареНрдпрдХреНрд░рдореЛрдВ рдХреА рд╕рдВрдЦреНрдпрд╛ рддреЗрдЬреА рд╕реЗ рдмрдврд╝ рд░рд╣реА рд╣реИ, рд╕рдВрдЧреАрдд рдЙрддреНрдкрд╛рджрди рдХреЗ рд▓рд┐рдП рд╕рдорд░реНрдкрд┐рдд рдмреНрд▓реЙрдЧ рд╢реАрд░реНрд╖ рдпреВрдЯреНрдпреВрдм рдкрд░ рдЬрд╛рддреЗ рд╣реИрдВред рдЗрд╕ рдкреГрд╖реНрдарднреВрдорд┐ рдХреЗ рдЦрд┐рд▓рд╛рдл, рдУрдкрди-рд╕реЛрд░реНрд╕ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдмрд╣реБрдд рджрд┐рд▓рдЪрд╕реНрдк рд▓рдЧрддреЗ рд╣реИрдВ, рдЬреЛ рдХрд┐рд╕реА рдХреЛ рднреА рдЗрд╕ рдкрд░ рдПрдХ рдЯрди рдкреИрд╕рд╛ рдЦрд░реНрдЪ рдХрд┐рдП рдмрд┐рдирд╛ рдЦреБрдж рдХреЛ рдирд┐рд░реНрдорд╛рддрд╛ рдХреЗ рд░реВрдк рдореЗрдВ рдЖрдЬрд╝рдорд╛рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реИред рдРрд╕реА рд╣реА рдПрдХ рдкрд░рд┐рдпреЛрдЬрдирд╛ рд╣реИ рд╡реАрд╕реАрд╡реА рд░реИрдХ, рдЬрд┐рд╕рдХрд╛ рдЙрджреНрджреЗрд╢реНрдп рд╕рдВрдЧреАрдд рдХреЗ рд╕рдмрд╕реЗ рдорд╣рдВрдЧреЗ рд╡рд░реНрдЧ - рдПрдирд╛рд▓реЙрдЧ рдореЙрдбреНрдпреВрд▓рд░ рд╕рд┐рдВрдереЗрд╕рд╛рдЗрдЬрд╝рд░ - рд╕рднреА рдХреЗ рд▓рд┐рдП рд╕реБрд▓рдн рдмрдирд╛рдирд╛ рд╣реИред рд╣рд╛рд▓ рд╣реА рдореЗрдВ, рдЬрдм рдореБрдЭреЗ рдПрдХ рдЯреНрд░реИрдХ рдХреЗ рд▓рд┐рдП рд╡рд┐рдЪрд╛рд░ рдорд┐рд▓рд╛,рдФрд░ рд╣рд╛рде рдореЗрдВ рдХреЗрд╡рд▓ рдПрдХ рд▓рд┐рдирдХреНрд╕ рд▓реИрдкрдЯреЙрдк рдерд╛, рдореИрдВ рд╡реАрд╕реАрд╡реА рдореЗрдВ рдкреВрд░реЗ рдЯреНрд░реИрдХ рдмрдирд╛рдирд╛ рдЪрд╛рд╣рддрд╛ рдерд╛ред рдФрд░ рд░рд╛рд╕реНрддреЗ рдореЗрдВ, рдорд┐рдбреА рдирд┐рдпрдВрддреНрд░рдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд╕рд┐рдВрдереЗрд╕рд╛рдЗрдЬрд╝рд░ рдХреЛ рдирд┐рдпрдВрддреНрд░рд┐рдд рдХрд░рдиреЗ рдХреА рдЗрдЪреНрдЫрд╛ рдереА рдХрд┐ рдЙрдкрд▓рдмреНрдз рдореЙрдбреНрдпреВрд▓ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рд╕реЗ рдХрд╛рдо рдирд╣реАрдВ рдЪрд▓реЗред рдЕрдВрдд рдореЗрдВ, рдореИрдВрдиреЗ рдПрдмреАрд╕реАрдЯрди рдкреБрд╢ 2 рдХреЛ рд╡реАрд╕реАрд╡реА рд░реИрдХ рд╕реЗ рдЬреЛрдбрд╝рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдкреНрд▓рдЧрдЗрди рд▓рд┐рдЦрдиреЗ рдХрд╛ рдлреИрд╕рд▓рд╛ рдХрд┐рдпрд╛ред рд╣рдо рдЗрд╕ рдмрд╛рд░реЗ рдореЗрдВ рдмрд╛рдд рдХрд░реЗрдВрдЧреЗ рдХрд┐ рдЗрд╕рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдХреНрдпрд╛ рдЖрдпрд╛, рдФрд░ рдЗрд╕ рд▓реЗрдЦ рдореЗрдВ VCV рдХреЗ рд▓рд┐рдП рдЕрдкрдиреЗ рд╕реНрд╡рдпрдВ рдХреЗ рдореЙрдбреНрдпреВрд▓ рдХреИрд╕реЗ рд▓рд┐рдЦреЗрдВред

рддреНрд╡рд░рд┐рдд рд╕рдВрджрд░реНрдн
VCV Rack тАФ open source , . VCV , .


Ableton Push 2 тАФ midi- Ableton, DAW, API .



рд╡реАрд╕реАрд╡реА рд░реИрдХ рдПрдкреАрдЖрдИ


VCV рдореЗрдВ рдкреНрд░рддреНрдпреЗрдХ рдореЙрдбреНрдпреВрд▓ рдореЗрдВ рджреЛ рднрд╛рдЧ рд╣реЛрддреЗ рд╣реИрдВ - рдСрдбрд┐рдпреЛ рдФрд░ рдЧреНрд░рд╛рдлрд┐рдХред рдСрдбрд┐рдпреЛ рднрд╛рдЧ рдореЙрдбреНрдпреВрд▓ рд╡рд░реНрдЧ рд╕реЗ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рд╡рд┐рдзрд┐ рдкреНрд░рд╛рдкреНрдд рдХрд░рддрд╛ рд╣реИ , рдЬрд┐рд╕реЗ рдкреНрд░рддреНрдпреЗрдХ рдирдореВрдиреЗ рдХреЗ рд▓рд┐рдП рдмреБрд▓рд╛рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЬреЛ рдХрд┐ рдПрдХ рдирдореВрдирд╛ рдЖрд╡реГрддреНрддрд┐ рдХреЗ рд╕рд╛рде рд╣реЛрддрд╛ рд╣реИред рд╡реИрд╕реЗ, рд╡реАрд╕реАрд╡реА рдореЗрдВ рдирдореВрдирд╛ рдЖрд╡реГрддреНрддрд┐ рдорд╛рдирдХ 44.1 kHz рд╕реЗ 768 kHz рддрдХ рднрд┐рдиреНрди рд╣реЛ рд╕рдХрддреА рд╣реИ, рдЬреЛ рдкрд░реНрдпрд╛рдкреНрдд рдХрдВрдкреНрдпреВрдЯрд┐рдВрдЧ рд╢рдХреНрддрд┐ рдХреЗ рд╕рд╛рде рдореЙрдбреНрдпреВрд▓рд░ рд╕рд┐рдВрдереЗрд╕рд╛рдЗрдЬрд╝рд░ рдХреЗ рдЕрдзрд┐рдХ рд╕рдЯреАрдХ рдЕрдиреБрдХрд░рдг рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред рдореЙрдбреНрдпреВрд▓реНрдпреВрд▓рдбрдЧреЗрдЯ

рдкреНрд░рдХрд╛рд░ рдХреА рд╡рд╕реНрддреБрдПрдВ рдЧреНрд░рд╛рдлрд┐рдХреНрд╕ рдХреЗ рд▓рд┐рдП рдЬрд┐рдореНрдореЗрджрд╛рд░ рд╣реИрдВ , рдЬреЛ рдЖрдзрд╛рд░ рд╕рдВрд░рдЪрдирд╛ рд╕реЗ рдбреНрд░реЙ рд╡рд┐рдзрд┐ рдХреЛ рдкреНрд░рд╛рдкреНрдд рдХрд░рддреА рд╣реИрдВ ред VCV рдиреИрдиреЛрд╡рд╛рдЧ рд╡реЗрдХреНрдЯрд░ рдЧреНрд░рд╛рдлрд┐рдХреНрд╕ рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИред рдбреНрд░рд╛ рд╡рд┐рдзрд┐ рдХреЗ рдЕрдВрджрд░ рдбреНрд░рд╛рдЗрдВрдЧрдпрд╣ рдореЙрдбреНрдпреВрд▓ рд╕реАрдорд╛рдУрдВ рдХреЗ рдЕрдВрджрд░ рджреЛрдиреЛрдВ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ (рдЗрдВрдЬрди рджреНрд╡рд╛рд░рд╛ рдЕрддрд┐рд░рд┐рдХреНрдд рдХрд╛рдЯ рджрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ), рдФрд░ рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП рдлреНрд░реЗрдордмрдлрд╝рд░ рдореЗрдВ, рдЬрд┐рд╕рдХрд╛ рд╣рдо рдЕрднреА рднреА рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВред

рддреЛ VCV рдХреЗ рд▓рд┐рдП рдЕрдкрдиреЗ рдореЙрдбреНрдпреВрд▓ рдХреЛ рд▓рд┐рдЦрдиреЗ рдореЗрдВ рдХреНрдпрд╛ рд▓рдЧрддрд╛ рд╣реИ?

рдкрд░реНрдпрд╛рд╡рд░рдг рдХреА рд╕реНрдерд╛рдкрдирд╛ рдФрд░ рд░реИрдХ рдПрд╕рдбреАрдХреЗ рд╕реНрдерд╛рдкрд┐рдд рдХрд░рдирд╛


рдкрд╣рд▓реЗ рдЪрд░рдг рдХреЛ рджрд╕реНрддрд╛рд╡реЗрдЬрд╝реАрдХрд░рдг рдореЗрдВ рдЕрдЪреНрдЫреА рддрд░рд╣ рд╕реЗ рд╡рд░реНрдгрд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ рдФрд░ рдЗрд╕рд╕реЗ рдХреЛрдИ рдХрдард┐рдирд╛рдИ рдирд╣реАрдВ рд╣реЛрддреА рд╣реИ (рдХрдо рд╕реЗ рдХрдо рд▓рд┐рдирдХреНрд╕ рдХреЗ рддрд╣рдд), рдЗрд╕рд▓рд┐рдП рд╣рдо рдЙрд╕ рдкрд░ рдзреНрдпрд╛рди рдирд╣реАрдВ рджреЗрдВрдЧреЗред

рдПрдХ рдкреНрд▓рдЧрдЗрди рдЯреЗрдореНрдкрд▓реЗрдЯ рдЙрддреНрдкрдиреНрди рдХрд░реЗрдВ


рд░реИрдХ SDK рдореЗрдВ рдЗрд╕рдХреЗ рд▓рд┐рдП рдПрдХ рд╕рд╣рд╛рдпрдХ рдлрд╝рд╛рдЗрд▓ рд╣реИред рдЙрд╕реЗ createplugin рдХрд╣рдиреЗ рдХреА рдЬрд░реВрд░рдд рд╣реИ, рдФрд░ рдлрд┐рд░ рдкреНрд▓рдЧрдЗрди рдХрд╛ рдирд╛рдо рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░реЗрдВ рдФрд░, рд╡реИрдХрд▓реНрдкрд┐рдХ рд░реВрдк рд╕реЗ, рдЗрд╕рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЬрд╛рдирдХрд╛рд░реАред

<Rack SDK folder>/helper.py createplugin MyPlugin

рдЬрдм рдкреНрд▓рдЧрдЗрди рдЯреЗрдореНрдкрд▓реЗрдЯ рдмрдирд╛рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ рдЗрд╕реЗ рдХрдорд╛рдВрдб рдХреЗ рд╕рд╛рде рд╕рдВрдХрд▓рд┐рдд рдФрд░ рд╕реНрдерд╛рдкрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ

RACK_DIR=<Rack SDK folder> make install

рдореЙрдбреНрдпреВрд▓ рдХреЗ рд╕рд╛рдордиреЗ рдХреЛ рдЦреАрдВрдЪрдирд╛


рдкреНрд░рддреНрдпреЗрдХ рдкреНрд▓рдЧрдЗрди рдореЗрдВ рдХрдИ рдореЙрдбреНрдпреВрд▓ рд╢рд╛рдорд┐рд▓ рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВ, рдФрд░ рдкреНрд░рддреНрдпреЗрдХ рдореЙрдбреНрдпреВрд▓ рдХреЗ рд▓рд┐рдП рдЖрдкрдХреЛ рдПрдХ рдореБрдЦреНрдп рдкреИрдирд▓ рдЦреАрдВрдЪрдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИред рдЗрд╕рдХреЗ рд▓рд┐рдП, рд╡реАрд╕реАрд╡реА рдкреНрд░рд▓реЗрдЦрди рд╣рдореЗрдВ рдЗрдВрдХрд╕реНрдХреЗрдк рдпрд╛ рдХрд┐рд╕реА рдЕрдиреНрдп рд╡реЗрдХреНрдЯрд░ рд╕рдВрдкрд╛рджрдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рдкреЗрд╢рдХрд╢ рдХрд░рддрд╛ рд╣реИред рдЪреВрдВрдХрд┐ рд╡реАрд╕реАрд╡реА рдореЗрдВ рдореЙрдбреНрдпреВрд▓ рдПрдХ рдЖрднрд╛рд╕реА рдпреВрд░реЛрд░реИрдХ-рд╕реНрдЯреИрдВрдб рдкрд░ рд▓рдЧрд╛рдП рдЬрд╛рддреЗ рд╣реИрдВ, рдЗрд╕рд▓рд┐рдП рдЙрдирдХреА рдКрдВрдЪрд╛рдИ рд╣рдореЗрд╢рд╛ 128.5 рдорд┐рдореА рдФрд░ рдЪреМрдбрд╝рд╛рдИ 5.08 рдорд┐рдореА рд╕реЗ рдЕрдзрд┐рдХ рд╣реЛрдиреА рдЪрд╛рд╣рд┐рдПред
рдореВрд▓ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рддрддреНрд╡, рдЬреИрд╕реЗ рдХрд┐ рд╕реАрд╡реА / рдЧреЗрдЯ рд╕реЙрдХреЗрдЯ, рдмрдЯрди рдФрд░ рд▓рд╛рдЗрдЯ рдмрд▓реНрдм рд╡реЗрдХреНрдЯрд░ рд░реВрдк рдореЗрдВ рдЪрд┐рд╣реНрдирд┐рдд рдХрд┐рдП рдЬрд╛ рд╕рдХрддреЗ рд╣реИрдВред рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╕рдВрдмрдВрдзрд┐рдд рд░рдВрдЧреЛрдВ рдХреЗ рдЙрдирдХреЗ рд╕реНрдерд╛рди рдордВрдбрд▓рд┐рдпреЛрдВ ( рдпрд╣рд╛рдВ рдЕрдзрд┐рдХ рд╡рд┐рд╡рд░рдг ) рдореЗрдВ рдЖрдХрд░реНрд╖рд┐рдд рдХрд░реЗрдВ , рддрд╛рдХрд┐ рд╣реЗрд▓реНрдкрд░рд╣реЛрдо рдлрд┐рд░ рдЗрд╕ рдорд╛рд░реНрдХрдЕрдк рдХреЗ рд▓рд┐рдП рдХреЛрдб рдЙрддреНрдкрдиреНрди рдХрд░реЗ ред рд╡реНрдпрдХреНрддрд┐рдЧрдд рд░реВрдк рд╕реЗ, рдореБрдЭреЗ рдРрд╕рд╛ рд▓рдЧрд╛ рдХрд┐ рдпрд╣ рдмрд╣реБрдд рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рд╕реБрд╡рд┐рдзрд╛ рдирд╣реАрдВ рд╣реИ рдФрд░ рдХреЛрдб рд╕реЗ рд╕реАрдзреЗ рддрддреНрд╡реЛрдВ рдХреЛ рд░рдЦрдирд╛ рдЖрд╕рд╛рди рд╣реИред рдЬрдм рдЪрд┐рддреНрд░ рдФрд░ рд▓реЗрдЖрдЙрдЯ рддреИрдпрд╛рд░ рд╣реЛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ рдЖрдкрдХреЛ рдлрд┐рд░ рд╕реЗ helper.py рдЪрд▓рд╛рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ рдПрдХ рдореЙрдбреНрдпреВрд▓ рдЯреЗрдореНрдкрд▓реЗрдЯ рдмрдирд╛рдиреЗ рдФрд░ рдЗрд╕реЗ рдлреНрд░рдВрдЯ рдкреИрдирд▓ рдХреЗ рд╕рд╛рде рдЬреЛрдбрд╝рдиреЗ рдХреЗ рд▓рд┐рдПред

helper.py createmodule MyModule res/MyModule.svg src/MyModule.cpp

рд╣рдо рдмрдЯрди рдФрд░ рдЯреНрд╡рд┐рд╕реНрдЯ рдХрдиреЗрдХреНрдЯ рдХрд░рддреЗ рд╣реИрдВ




рдбрд┐рд╕реНрдкреНрд▓реЗ рдХреЗ рдЕрд▓рд╛рд╡рд╛, Ableton Push 2 рдХреЛ рдХрдВрдкреНрдпреВрдЯрд░ рджреНрд╡рд╛рд░рд╛ рдПрдХ рдирд┐рдпрдорд┐рдд USB-MIDI рдбрд┐рд╡рд╛рдЗрд╕ рдХреЗ рд░реВрдк рдореЗрдВ рджреЗрдЦрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЬрд┐рд╕рд╕реЗ рдЗрд╕рдХреЗ рдФрд░ VCV рд░реИрдХ рдХреЗ рдмреАрдЪ рд╕рдВрдмрдВрдз рд╕реНрдерд╛рдкрд┐рдд рдХрд░рдирд╛ рдЖрд╕рд╛рди рд╣реЛ рдЬрд╛рддрд╛ рд╣реИред рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдореЙрдбреНрдпреВрд▓ рдХреА рдХрдХреНрд╖рд╛ рдХреЗ рдЕрдВрджрд░ рдПрдХ рдЗрдирдкреБрдЯ рдорд┐рдбреА рдХрддрд╛рд░ рдФрд░ рдПрдХ рдЖрдЙрдЯрдкреБрдЯ рдорд┐рдбреА рдкреЛрд░реНрдЯ рдмрдирд╛рдПрдВред

рдкреНрд░рд╛рд░рдВрднрд┐рдХ рдХреЛрдб
struct AbletonPush2 : Module {
    midi::Output midiOutput;
    midi::InputQueue midiInput;

    bool inputConnected;
    bool outputConnected;
}


рдЖрдЗрдП рдЬреБрдбрд╝реЗ рдорд┐рдбреА рдЙрдкрдХрд░рдгреЛрдВ рдХреЗ рдмреАрдЪ рдПрдмрд▓рдЯрди рдкреБрд╢ рдХреЛ рдЦреЛрдЬрдиреЗ рдФрд░ рдЙрд╕рд╕реЗ рдЬреБрдбрд╝рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░реЗрдВред рдЪреВрдВрдХрд┐ рдореЙрдбреНрдпреВрд▓ рдПрдмрд▓рдЯрди рдкреБрд╢ рдХреЗ рд╕рд╛рде рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдбрд┐рдЬрд╝рд╛рдЗрди рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рд╣рдореЗрдВ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЛ рдбрд┐рд╡рд╛рдЗрд╕ рдХреА рдкрд╕рдВрдж рдХреЗ рд╕рд╛рде рдмреЛрдЭ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИ рдФрд░ рдЖрдк рдЗрд╕реЗ рдХреЗрд╡рд▓ рдирд╛рдо рд╕реЗ рдкрд╛ рд╕рдХрддреЗ рд╣реИрдВред

рдирд┐рдпрдВрддреНрд░рдХ рдХрдиреЗрдХреНрд╢рди рдХреЛрдб
void connectPush() {
    auto in_devs = midiInput.getDeviceIds();
    for (int i = 0; i < in_devs.size(); i++){
        if (midiInput.getDeviceName(in_devs[i]).find("Ableton") != std::string::npos) {
            midiInput.setDeviceId(in_devs[i]);
            inputConnected = true;
            break;
        }
    }
		
    auto out_devs = midiOutput.getDeviceIds();
    for (int i = 0; i < out_devs.size(); i++){
        if (midiOutput.getDeviceName(out_devs[i]).find("Ableton") != std::string::npos) {
            midiOutput.setDeviceId(out_devs[i]);
            outputConnected = true;
            break;
        }
    }
}


рдЕрдм рдкреНрд░рдХреНрд░рд┐рдпрд╛ рд╡рд┐рдзрд┐ рдореЗрдВ рдЖрдк рд╕рдордп-рд╕рдордп рдкрд░ рдЬрд╛рдВрдЪ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рдХреНрдпрд╛ рдирд┐рдпрдВрддреНрд░рдХ рдЬреБрдбрд╝рд╛ рд╣реБрдЖ рд╣реИ рдФрд░ рдорд┐рдбреА рдХрддрд╛рд░ рд╕реЗ рдкреВрдЫреЗрдВ рдХрд┐ рдХреНрдпрд╛ рдХреЛрдИ рд╕рдВрджреЗрд╢ рдЖрдпрд╛ рд╣реИред рдпрд╣рд╛рдВ рдпрд╣ рдзреНрдпрд╛рди рджреЗрдиреЗ рдпреЛрдЧреНрдп рд╣реИ рдХрд┐ рдорд┐рдбреА рдорд╛рдирдХ рдореЗрдВ рдЖрдо рддреМрд░ рдкрд░ рдХреНрдпрд╛ рдФрд░ рдХреИрд╕реЗ рдХреВрдЯрдмрджреНрдз рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рджреЛ рдореБрдЦреНрдп рдкреНрд░рдХрд╛рд░ рдХреЗ рд╕рдВрджреЗрд╢ рд╣реИрдВ, рдпреЗ рдиреЛрдЯ ON / OFF рд╣реИрдВ, рдиреЛрдЯ рд╕рдВрдЦреНрдпрд╛ рдФрд░ рджрдмрд╛рд╡ рдмрд▓ рдХреЛ рд╕рдВрдЪрд╛рд░рд┐рдд рдХрд░рддреЗ рд╣реИрдВ, рдФрд░ CC - рдХрдорд╛рдВрдб рдХрдВрдЯреНрд░реЛрд▓, рдХреБрдЫ рдЪрд░ рдкреИрд░рд╛рдореАрдЯрд░ рдХреЗ рд╕рдВрдЦреНрдпрд╛рддреНрдордХ рдорд╛рди рдХреЛ рдкреНрд░реЗрд╖рд┐рдд рдХрд░рддреЗ рд╣реИрдВред рдорд┐рдбреА рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЕрдзрд┐рдХ рдЬрд╛рдирдХрд╛рд░реА рдпрд╣рд╛рдВ рдкрд╛рдИ рдЬрд╛ рд╕рдХрддреА рд╣реИ ред

рдорд┐рдбреА рдХрддрд╛рд░ рдорддрджрд╛рди рдХреЛрдб
void process(const ProcessArgs &args) override {
    if (sampleCounter > args.sampleRate / updateFrequency) {

        if ((!inputConnected) && (!outputConnected)) {
            connectPush();
        }

	midi::Message msg;
	while (midiInput.shift(&msg)) {
	    processMidi(msg);
	}
    }
}


рдЕрдм рдореИрдВ рдХрдВрдЯреНрд░реЛрд▓рд░ рдкреИрдбреНрд╕ рдХреЛ рдЕрд▓рдЧ-рдЕрд▓рдЧ рд░рдВрдЧреЛрдВ рдореЗрдВ рдЪрдордХрдирд╛ рд╕рд┐рдЦрд╛рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ, рддрд╛рдХрд┐ рдЙрдиреНрд╣реЗрдВ рдиреЗрд╡рд┐рдЧреЗрдЯ рдХрд░рдирд╛ рдЕрдзрд┐рдХ рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рд▓рдЧреЗред рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдореЗрдВ рдЙрд╕реЗ рдЙрдкрдпреБрдХреНрдд рдорд┐рдбреА рдХрдорд╛рдВрдб рднреЗрдЬрдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдЧреАред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдкреИрдб рд╕рдВрдЦреНрдпрд╛ 36 рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВ (рдпрд╣ рд╕рдмрд╕реЗ рдХрдо рдмрд╛рдПрдВ рдкреИрдб рд╣реИ)ред рдпрджрд┐ рдЖрдк рдЙрд╕ рдкрд░ рдХреНрд▓рд┐рдХ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдирд┐рдпрдВрддреНрд░рдХ рдХрдорд╛рдВрдб 0x90 (рдиреЛрдЯ рдкрд░) рднреЗрдЬреЗрдЧрд╛, рдЗрд╕рдХреЗ рдмрд╛рдж рдиреЛрдЯ рд╕рдВрдЦреНрдпрд╛ (36) рдФрд░ 0 рд╕реЗ 127 рддрдХ рдХреА рд╕рдВрдЦреНрдпрд╛ рд╣реЛрдЧреА, рдЬрд┐рд╕рдХрд╛ рдЕрд░реНрде рд╣реИ рдкреНрд░реЗрд╕ рдХреА рддрд╛рдХрддред рдФрд░ рдЬрдм, рдЗрд╕рдХреЗ рд╡рд┐рдкрд░реАрдд, рдХрдВрдкреНрдпреВрдЯрд░ рдирд┐рдпрдВрддреНрд░рдХ рдХреЛ рдЙрд╕реА 0x90 рдХрдорд╛рдВрдб рдФрд░ рдЙрд╕реА рдиреЛрдЯ рдирдВрдмрд░ 36 рдХреЛ рднреЗрдЬрддрд╛ рд╣реИ, рддреЛ рддреАрд╕рд░рд╛ рдирдВрдмрд░ рдЙрд╕ рд░рдВрдЧ рдХреЛ рдЗрдВрдЧрд┐рдд рдХрд░реЗрдЧрд╛ рдЬрд┐рд╕рдХреЗ рд╕рд╛рде рдирд┐рдЪрд▓реЗ рдмрд╛рдПрдВ рдкреИрдб рдХреЛ рдЪрдордХрдирд╛ рдЪрд╛рд╣рд┐рдПред рдмрдЯрди рдФрд░ рдкреИрдб рдХреА рд╕рдВрдЦреНрдпрд╛ рдКрдкрд░ рдХреА рдЖрдХреГрддрд┐ рдореЗрдВ рджрд┐рдЦрд╛рдИ рдЧрдИ рд╣реИред рдкреБрд╢ рдореЗрдВ рд░рдВрдЧ, рдкрдЯреНрдЯрд┐рдпрд╛рдБ, рдПрдиреАрдореЗрд╢рди рдФрд░ рдЕрдиреНрдп рдмреИрдХрд▓рд╛рдЗрдЯрд┐рдВрдЧ рдорд╛рдкрджрдВрдбреЛрдВ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреА рдХрд╛рдлреА рд╕рдВрднрд╛рд╡рдирд╛рдПрдВ рд╣реИрдВред рдореИрдВ рд╡рд┐рд╡рд░рдг рдореЗрдВ рдирд╣реАрдВ рдЧрдпрд╛ рдФрд░ рдмрд╕ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рдкреИрд▓реЗрдЯ рдХреЗ рд╕рднреА рд╕рдВрднрд╛рд╡рд┐рдд рд░рдВрдЧреЛрдВ рдХреЛ рдкреИрдб рдореЗрдВ рд▓рд╛рдпрд╛ рдФрд░ рдЙрди рд▓реЛрдЧреЛрдВ рдХреЛ рдЪреБрдирд╛ рдЬрд┐рдиреНрд╣реЗрдВ рдореИрдВрдиреЗ рдкрд╕рдВрдж рдХрд┐рдпрд╛ рдерд╛редрд▓реЗрдХрд┐рди рд╕рд╛рдорд╛рдиреНрдп рдорд╛рдорд▓реЗ рдореЗрдВ, рдорд┐рдбреА рдХрд╛ рд░реВрдкрд╛рдВрддрд░рдг рдкреАрдбрдмреНрд▓реВрдПрдо рдХреЗ рдореВрд▓реНрдпреЛрдВ рдХреЛ рдПрд▓ рдИ рдбреА рдкрд░, рдкреНрд░рд▓реЗрдЦрди рдХреЗ рдЕрдиреБрд╕рд╛рд░, рдЗрд╕ рддрд░рд╣ рджрд┐рдЦрддрд╛ рд╣реИ:



рдмреИрдХрд▓рд╛рдЗрдЯ рдХрдВрдЯреНрд░реЛрд▓ рдХреЛрдб
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);
}


рд╣рдо рдбрд┐рд╕реНрдкреНрд▓реЗ рдХрдиреЗрдХреНрдЯ рдХрд░рддреЗ рд╣реИрдВ




рдбрд┐рд╕реНрдкреНрд▓реЗ рдХреЛ рдХрдиреЗрдХреНрдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЖрдкрдХреЛ USB рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред рдирд┐рдпрдВрддреНрд░рдХ рдЦреБрдж рдирд╣реАрдВ рдЬрд╛рдирддрд╛ рдХрд┐ рдХреБрдЫ рднреА рдХреИрд╕реЗ рдЦреАрдВрдЪрдирд╛ рд╣реИ рдФрд░ рдЧреНрд░рд╛рдлрд┐рдХреНрд╕ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдХреБрдЫ рднреА рдирд╣реАрдВ рдкрддрд╛ рд╣реИред рд╡рд╣ рдЬреЛ рдЪрд╛рд╣рддрд╛ рд╣реИ, рд╡рд╣ рдХрдо рд╕реЗ рдХрдо рд╣рд░ 2 рд╕реЗрдХрдВрдб рдореЗрдВ 160x960 рдкрд┐рдХреНрд╕рд▓ рдХрд╛ рдПрдХ рдлреНрд░реЗрдо рднреЗрдЬрдирд╛ рд╣реИред рд╕рднреА рдкреНрд░рддрд┐рдкрд╛рджрди рдХрдВрдкреНрдпреВрдЯрд░ рдХреА рддрд░рдл рд╕реЗ рд╣реЛрддреЗ рд╣реИрдВред рдкреНрд░рд▓реЗрдЦрди рдореЗрдВ рд╡рд░реНрдгрд┐рдд рдХреЗ рд░реВрдк рдореЗрдВ , USB рдбрд┐рд╡рд╛рдЗрд╕ рдХреЛ рд╢реБрд░реВ рдХрд░рдиреЗ, рдХрдиреЗрдХреНрдЯ рдХрд░рдиреЗ рдФрд░ рдЦреЛрд▓рдиреЗ рдХреЗ рд▓рд┐рдП :

рдХрдиреЗрдХреНрд╢рди рдХреЛрдб рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░реЗрдВ
#ifdef _MSC_VER
#define _CRT_SECURE_NO_WARNINGS
#endif

#include <stdio.h>

#ifdef _WIN32

// see following link for a discussion of the
// warning suppression:
// http://sourceforge.net/mailarchive/forum.php?
// thread_name=50F6011C.2020000%40akeo.ie&forum_name=libusbx-devel

// Disable: warning C4200: nonstandard extension used:
// zero-sized array in struct/union
#pragma warning(disable:4200)

#include <windows.h>
#endif

#ifdef __linux__
#include <libusb-1.0/libusb.h>
#else
#include "libusb.h"
#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)) < 0)
  {
    printf("error: [%d] could not initilialize usblib\n", result);
    return NULL;
  }

  libusb_set_debug(NULL, LIBUSB_LOG_LEVEL_ERROR);

  libusb_device** devices;
  ssize_t count;
  count = libusb_get_device_list(NULL, &devices);
  if (count < 0)
  {
    printf("error: [%ld] could not get usb device list\n", 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, "error: Ableton Push 2 device not found\n");

  for (int i = 0; (device = devices[i]) != NULL; i++)
  {
    struct libusb_device_descriptor descriptor;
    if ((result = libusb_get_device_descriptor(device, &descriptor)) < 0)
    {
      sprintf(ErrorMsg,
        "error: [%d] could not get usb device descriptor\n", result);
      continue;
    }

    if (descriptor.bDeviceClass == LIBUSB_CLASS_PER_INTERFACE
      && descriptor.idVendor == ABLETON_VENDOR_ID
      && descriptor.idProduct == PUSH2_PRODUCT_ID)
    {
      if ((result = libusb_open(device, &device_handle)) < 0)
      {
        sprintf(ErrorMsg,
          "error: [%d] could not open Ableton Push 2 device\n", result);
      }
      else if ((result = libusb_claim_interface(device_handle, 0)) < 0)
      {
        sprintf(ErrorMsg,
          "error: [%d] could not claim interface 0 of Push 2 device\n", 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);
}


рдХрд┐рд╕реА рдлрд╝реНрд░реЗрдо рдХреЛ рдкреНрд░реЗрд╖рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ рдкрд╣рд▓реЗ 16-рдмрд╛рдЗрдЯ рд╣реИрдбрд░ рднреЗрдЬрдирд╛ рд╣реЛрдЧрд╛, рдФрд░ рдлрд┐рд░ 960 16-рдмрд┐рдЯ рд╕рдВрдЦреНрдпрд╛рдУрдВ рдХреА 160 рдкрдВрдХреНрддрд┐рдпрд╛рдБред рдЙрд╕реА рд╕рдордп, рдкреНрд░рд▓реЗрдЦрди рдХреЗ рдЕрдиреБрд╕рд╛рд░, рддрд╛рд░реЛрдВ рдХреЛ 1920 рдмрд╛рдЗрдЯреНрд╕ рдореЗрдВ рд╕рдВрдЪрд░рд┐рдд рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП, рд▓реЗрдХрд┐рди 2048 рдмрд╛рдЗрдЯреНрд╕ рдХреЗ рдкреИрдХреЗрдЯ рдореЗрдВ, рд╢реВрдиреНрдп рдХреЗ рд╕рд╛рде рдкреВрд░рдХред

рдлреНрд░реЗрдо рдЯреНрд░рд╛рдВрд╕рдлрд░ рдХреЛрдб
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), &actual_length, TRANSFER_TIMEOUT);
        for (int i = 0; i < 160; i++)
            libusb_bulk_transfer(device_handle, PUSH2_BULK_EP_OUT, &image[(159 - i)*1920], 2048, &actual_length, TRANSFER_TIMEOUT);
    }
}


рдЕрдм рдпрд╣ рдХреЗрд╡рд▓ рдмрдлрд░ рдХреЛ рдПрдХ рдлреНрд░реЗрдо рдЦреАрдВрдЪрдиреЗ рдФрд░ рд▓рд┐рдЦрдиреЗ рдХреЗ рд▓рд┐рдП рдмрдирд╛ рд╣реБрдЖ рд╣реИред рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдХрд╛ рдЙрдкрдпреЛрдЧ FramebufferWidget рд╡рд░реНрдЧ рдХрд┐ рдФрдЬрд╛рд░ drawFramebuffer рд╡рд┐рдзрд┐ ред рдмреЙрдХреНрд╕ рд╕реЗ рдмрд╛рд╣рд░ VCV рд░реИрдХ рдиреИрдиреЛрд╡рдЧ рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИ , рдЗрд╕рд▓рд┐рдП рдпрд╣рд╛рдВ рдЧреНрд░рд╛рдлрд┐рдХреНрд╕ рд▓рд┐рдЦрдирд╛ рдмрд╣реБрдд рдЖрд╕рд╛рди рд╣реИред рд╣рдо рд╡реИрд╢реНрд╡рд┐рдХ рдЪрд░ рдПрдкреАрдкреА рд╕реЗ рд╡рд░реНрддрдорд╛рди рдЧреНрд░рд╛рдлрд┐рдХ рд╕рдВрджрд░реНрдн рд╕реАрдЦрддреЗ рд╣реИрдВ рдФрд░ рдЗрд╕рдХреА рд╕реНрдерд┐рддрд┐ рдХреЛ рдмрдЪрд╛рддреЗ рд╣реИрдВред рдЕрдЧрд▓рд╛, рдПрдХ рдЦрд╛рд▓реА 160x960 рдлреНрд░реЗрдо рдмрдирд╛рдПрдВ рдФрд░ рдЗрд╕реЗ рдбреНрд░рд╛ рд╡рд┐рдзрд┐ рд╕реЗ рдбреНрд░рд╛ рдХрд░реЗрдВ ред рдЙрд╕рдХреЗ рдмрд╛рдж, рдлреНрд░реЗрдордмрдлрд╝рд░ рдХреЛ рдЙрд╕ рд╕рд░рдгреА рдкрд░ рдХреЙрдкреА рдХрд░реЗрдВ рдЬреЛ рдпреВрдПрд╕рдмреА рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рднреЗрдЬрд╛ рдЬрд╛рдПрдЧрд╛, рдФрд░ рд╕рдВрджрд░реНрдн рдХреА рд╕реНрдерд┐рддрд┐ рд╡рд╛рдкрд╕ рдХрд░ рджреЗрдЧрд╛ред рдЕрдВрдд рдореЗрдВ, рдЧрдВрджреЗ рдЭрдВрдбреЗ рдХреЛ рд╕реЗрдЯ рдХрд░реЗрдВ рддрд╛рдХрд┐ рд░реЗрдВрдбрд░рд┐рдВрдЧ рдХреЗ рдЕрдЧрд▓реЗ рдкреБрдирд░рд╛рд╡реГрддреНрддрд┐ рдкрд░, рд╡реАрд╕реАрд╡реА рдЗрдВрдЬрди рд╣рдорд╛рд░реЗ рд╡рд┐рдЬреЗрдЯ рдХреЛ рдЕрдкрдбреЗрдЯ рдХрд░рдирд╛ рди рднреВрд▓реЗрдВред

рдлрд╝реНрд░реЗрдо рд░реЗрдВрдбрд░рд┐рдВрдЧ рдХреЛрдб
void drawFramebuffer() override {

    NVGcontext* vg = APP->window->vg;

    if (display_connected) {
        nvgSave(vg);
	glViewport(0, 0, 960, 160);
        glClearColor(0, 0, 0, 0);
        glClear(GL_COLOR_BUFFER_BIT|GL_STENCIL_BUFFER_BIT);

	nvgBeginFrame(vg, 960,  160, 1);
        draw(vg);
        nvgEndFrame(vg);

        glReadPixels(0, 0, 960, 160, GL_RGB, GL_UNSIGNED_SHORT_5_6_5, image); 

        //  XOR   ,  
        for (int i = 0; i < 80*960; i ++){
            image[i * 4] ^= 0xE7;
	    image[i * 4 + 1] ^= 0xF3;
            image[i * 4 + 2] ^= 0xE7;
	    image[i * 4 + 3] ^= 0xFF;
        }
	    	
	sendDisplay(image);

	nvgRestore(vg);
    }

    dirty = true;
}


рдорд╛рдкрджрдВрдбреЛрдВ рдХреЗ рдЗрдВрдЯрд░реИрдХреНрд╢рди рдФрд░ рдореИрдкрд┐рдВрдЧ рдХрд╛ рддрд░реНрдХ


рдЕрдкрдиреЗ рдХрд╛рд░реНрдп рдХреЗ рд▓рд┐рдП, рдореИрдВ рд╕реАрдХреНрд╡реЗрдВрд╕рд░ рдореЗрдВ рджрд░реНрдЬ рдХрд┐рдП рдЧрдП рдкреИрдЯрд░реНрди рдХреЛ рд╕реНрд╡рд┐рдЪ рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реЛрдирд╛ рдЪрд╛рд╣рддрд╛ рдерд╛, рдФрд░ рд╕рд╛рде рд╣реА рд╕рд╛рде рдорд╛рдкрджрдВрдбреЛрдВ рдХреЗ рдПрдХ рдирд┐рд╢реНрдЪрд┐рдд рд╕рдореВрд╣ рдХреЛ рдирд┐рдпрдВрддреНрд░рд┐рдд рдХрд░рддрд╛ рдерд╛, рдкреИрдЯрд░реНрди рдХреЗ рдкреНрд░рддреНрдпреЗрдХ рд╕рдореВрд╣ рдХреЗ рд▓рд┐рдП рдореЗрд░рд╛ рдЕрдкрдирд╛ред рдореИрдкрд┐рдВрдЧ рдХрд░рдХреЗ, рдореИрдВ рдПрдХ рдореЙрдбреНрдпреВрд▓ рдХреЗ рдкреИрд░рд╛рдореАрдЯрд░ рдХреЛ рджреВрд╕рд░реЗ рдореЙрдбреНрдпреВрд▓ рдпрд╛ рдорд┐рдбреА рдХрдВрдЯреНрд░реЛрд▓рд░ рдХреЗ рдкреИрд░рд╛рдореАрдЯрд░ рдХреЗ рд╕рд╛рде рд╕рдордЭрддрд╛ рд╣реВрдВред рдореБрдЭреЗ рдореИрдкрд┐рдВрдЧ рдХреЛ рдЦреВрдмрд╕реВрд░рддреА рд╕реЗ рдмрдирд╛рдиреЗ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрд╣реБрдд рдХрдо рдЬрд╛рдирдХрд╛рд░реА рдорд┐рд▓реА, рдЗрд╕рд▓рд┐рдП рдореИрдВрдиреЗ рдЕрдзрд┐рдХрд╛рдВрд╢ рдХреЛрдб рд▓рд┐рдпрд╛ рдЬреЛ VCV рдореЗрдВ рдирд┐рд░реНрдорд┐рдд MIDI рдореИрдк рдореЙрдбреНрдпреВрд▓ рд╕реЗ рд▓рд╛рдЧреВ рдХрд░рддрд╛ рд╣реИ ред рд╕рдВрдХреНрд╖реЗрдк рдореЗрдВ, рдорд╛рдкрджрдВрдбреЛрдВ рдХреЗ рдкреНрд░рддреНрдпреЗрдХ рдЧреБрдЪреНрдЫрд╛ рдХреЗ рд▓рд┐рдП рдПрдХ рд╡рд┐рд╢реЗрд╖ рдкрд░рдорд╣реИрдВрдбрд▓ рдСрдмреНрдЬреЗрдХреНрдЯ рдмрдирд╛рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ , рдЬреЛ рдХрд┐ рдмреИрд╕рд╛рдЦреА рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдЗрдВрдЬрди рдХреЛ рдмрддрд╛рддрд╛ рд╣реИ рдХрд┐ рдХреНрдпрд╛ рд╕реЗ рдЬреБрдбрд╝рд╛ рд╣реБрдЖ рд╣реИред

рдирд┐рд╖реНрдХрд░реНрд╖


рдпрд╣рд╛рдБ рдПрдХ рдореЙрдбреНрдпреВрд▓ рд╣реИ рдЬреЛ рдореБрдЭреЗ рдЕрдВрдд рдореЗрдВ рдорд┐рд▓рд╛ рд╣реИред рдорд┐рдбреА рд╕реЗ рд╕реАрд╡реА рдХреЗ рдорд╛рдирдХ рд░реВрдкрд╛рдВрддрд░рдг рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдпрд╣ рдЖрдкрдХреЛ рд╕рдореВрд╣ рдкреИрдб рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ, рдЙрдиреНрд╣реЗрдВ рд░рдВрдЧ рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИ рдФрд░ рдкреБрд╢ рдПрдиреНрдХреЛрдбрд░реНрд╕ рдХреЗ рд╕рд╛рде рдореЙрдбреНрдпреВрд▓ рдХреЗ рдордирдорд╛рдиреЗ рдорд╛рдкрджрдВрдбреЛрдВ рдХреЛ рд╕рдВрдмрджреНрдз рдХрд░рддрд╛ рд╣реИ, рдирд┐рдпрдВрддреНрд░рдХ рдирд╛рдо рдкрд░ рдЙрдирдХреЗ рдирд╛рдо рдФрд░ рдореВрд▓реНрдпреЛрдВ рдХреЛ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рддрд╛ рд╣реИред рдиреАрдЪреЗ рджрд┐рдП рдЧрдП рд╡реАрдбрд┐рдпреЛ рдореЗрдВ рдЖрдк рдЙрд╕рдХрд╛ рдЕрд╡рд▓реЛрдХрди рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ, рдФрд░ рдЗрд╕ рд╡реАрдбрд┐рдпреЛ рдореЗрдВ рдЖрдк рдХрд╛рд░реНрд░рд╡рд╛рдИ рдореЗрдВ рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВред


рдкреВрд░рд╛ рдХреЛрдб рдпрд╣рд╛рдБ рдЙрдкрд▓рдмреНрдз рд╣реИ ред

рд╣рдо рдЗрд╕реЗ рдХреЗрд╡рд▓ рд▓рд┐рдирдХреНрд╕ (рдЙрдмрдВрдЯреВ 18.04) рдХреЗ рддрд╣рдд рдкрд░реАрдХреНрд╖рдг рдХрд░рдиреЗ рдореЗрдВ рдХрд╛рдордпрд╛рдм рд░рд╣реЗ, рдореИрдХрдУрдПрд╕ рдкрд░ рд▓рд┐рдмрд╛рд╕ рдХреА рдмрд╛рд░реАрдХрд┐рдпреЛрдВ рдХреЗ рдХрд╛рд░рдг рдбрд┐рд╕реНрдкреНрд▓реЗ рдХрдиреЗрдХреНрдЯ рдирд╣реАрдВ рд╣реБрдЖ рдФрд░ рдорд┐рдбреА рдЗрдВрдЯрд░рдлреЗрд╕ рдореЗрдВ рдЕрдЬреАрдм рджреЗрд░реА рд╣реБрдИред рдЗрд╕рдХреЗ рдмрд╛рд╡рдЬреВрдж, VCV рд░реИрдХ рдиреЗ рдПрдХ рд░реВрдкрд░реЗрдЦрд╛ рдХреЗ рд░реВрдк рдореЗрдВ рдФрд░ рдореЙрдбреНрдпреВрд▓рд░ DAW рджреЛрдиреЛрдВ рдХреЗ рд░реВрдк рдореЗрдВ рдмрд╣реБрдд рдЕрдЪреНрдЫреА рдЫрд╛рдк рдЫреЛрдбрд╝реА, рдореБрдЭреЗ рдЙрдореНрдореАрдж рд╣реИ рдХрд┐ VCV рдХрд╛ рд╡рд┐рдХрд╛рд╕ рдЬрд╛рд░реА рд░рд╣реЗрдЧрд╛, рдФрд░ рдпрд╣ рд▓реЗрдЦ рдХрд┐рд╕реА рдФрд░ рдХреЛ рдЗрд╕рдХреЗ рд▓рд┐рдП рдЕрдкрдиреЗ рд╕реНрд╡рдпрдВ рдХреЗ рдореЙрдбреНрдпреВрд▓ рд▓рд┐рдЦрдиреЗ рдореЗрдВ рдорджрдж рдХрд░реЗрдЧрд╛ред

All Articles