
рд╕рдВрдЧреАрдд рдХрд╛ рдирд┐рд░реНрдорд╛рдг, рд╣рд╛рд▓ рд╣реА рдореЗрдВ, 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
#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];
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;
}
}
}
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);
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 рдХрд╛ рд╡рд┐рдХрд╛рд╕ рдЬрд╛рд░реА рд░рд╣реЗрдЧрд╛, рдФрд░ рдпрд╣ рд▓реЗрдЦ рдХрд┐рд╕реА рдФрд░ рдХреЛ рдЗрд╕рдХреЗ рд▓рд┐рдП рдЕрдкрдиреЗ рд╕реНрд╡рдпрдВ рдХреЗ рдореЙрдбреНрдпреВрд▓ рд▓рд┐рдЦрдиреЗ рдореЗрдВ рдорджрдж рдХрд░реЗрдЧрд╛ред