120-рд▓рд╛рдЗрди рдкрд░реНрд▓ рдбреНрд░рдо рдорд╢реАрди

рдЖрдЗрдП рдПрдХ рдЧреНрд░рд╛рдлрд┐рдХ рдЯреВрд▓рдХрд┐рдЯ рдХреЗ рд░реВрдк рдореЗрдВ рдорд┐рдбреА рдФрд░ рдЯреАрдПрдХреНрд╕рдПрдХреНрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдореЛрддреА рдкрд░ рдПрдХ рд╕рд╛рдзрд╛рд░рдг рдбреНрд░рдо рдорд╢реАрди рд▓рд┐рдЦрдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░реЗрдВред

рдЫрд╡рд┐

рдореБрдЦреНрдп рд╡рд┐рд╢реЗрд╖рддрд╛рдПрдВ
  1. 47 рдЙрдкрдХрд░рдг, 4 рдПрдХ рд╕рд╛рде рдЙрдкрдпреЛрдЧ рдХрд┐рдП рдЬрд╛ рд╕рдХрддреЗ рд╣реИрдВред
  2. рдХреАрдмреЛрд░реНрдб рдирд┐рдпрдВрддреНрд░рдгред
  3. рдорд╛рддреНрд░рд╛ рдкрд░ рдирд┐рдпрдВрддреНрд░рдг
  4. рдмреАрдкреАрдПрдо рд░реЗрдЧреБрд▓реЗрдЯрд░ 60 рд╕реЗ 600 рдмреАрдЯ рдкреНрд░рддрд┐ рдорд┐рдирдЯред



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

рдЖрд╡рд╢реНрдпрдХ рдиреЛрдЯ рд╕рдВрдЦреНрдпрд╛ рдЗрд╕ рдкреГрд╖реНрда рдкрд░ рдкрд╛рдИ рдЬрд╛ рд╕рдХрддреА рд╣реИред

рд╣рдореЗрдВ рдореЙрдбреНрдпреВрд▓ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдЧреА: Win32API :: MIDI рдФрд░ Tkxред рдпрджрд┐ рдЖрдк ActivePerl рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ рддреЛ рдмрд╛рдж рд╡рд╛рд▓рд╛ рдкрд╣рд▓реЗ рд╕реЗ рдЗрдВрд╕реНрдЯреЙрд▓ рд╣реЛ рдЬрд╛рдПрдЧрд╛ред

рдЪрд▓реЛ рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рдкрд░ рдЪрд▓рддреЗ рд╣реИрдВ
 #! / usr / рдмрд┐рди / рдкрд░реНрд▓
 рд╕рдЦреНрдд рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ;
 Tkx рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ;
 Win32API рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ :: рдорд┐рдбреА;


рд╣реИрд╢, рдЬреЛрдбрд╝реА: рд╕рд╛рдзрди рдХрд╛ рдирд╛рдо => рдиреЛрдЯ рд╕рдВрдЦреНрдпрд╛ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░реЗрдВ
 рдореЗрд░реЗ% рдбреНрд░рдо = (
         'рдмрд╛рд╕ рдбреНрд░рдо 2' => 35,
         'рдмрд╛рд╕ рдбреНрд░рдо 1' => 36,
         'рд╕рд╛рдЗрдб рд╕реНрдЯрд┐рдХ' => 37,
         'рд╕реНрдиреЗрдпрд░ рдбреНрд░рдо 1' => 38,
         'рд╣реИрдВрдб рдХреНрд▓реИрдк' => 39,
         'рд╕реНрдиреЗрдпрд░ рдбреНрд░рдо 2' => 40,
         'рд▓реЛ рдЯреЙрдо 2' => 41,
         'рдмрдВрдж рд╣рд╛рдп-рдЯреЛрдкреА' => 42,
         'рд▓реЛ рдЯреЙрдо 1' => 43,
         'рдкреЗрдбрд▓ рд╣рд╛рдп-рд╣реЗрдЯ' => 44,
         'рдорд┐рдб рдЯреЙрдо 2' => 45,
         'рдУрдкрди рд╣рд╛рдп-рд╣реИрдЯ' => 46,
         'рдорд┐рдб рдЯреЙрдо 1' => 47,
         'рд╣рд╛рдИ рдЯреЙрдо 2' => 48,
         'рдХреНрд░реИрд╢ рд╕рд╛рдЗрдорд▓ 1' => 49,
         'рд╣рд╛рдИ рдЯреЙрдо 1' => 50,
         'рд░рд╛рдЗрдб рд╕рд┐рдореНрдмрд▓ 1' => 51,
         'рдЪреАрдиреА рд╕рд┐рдореНрдмрд▓' => 52,
         'рд░рд╛рдЗрдб рдмреЗрд▓' => 53,
         'рдЯреИрдореНрдмреЛрд░рд┐рди' => 54,
         'рд╕реНрдкреНрд▓реИрд╢ рд╕рд┐рдВрдмрд▓' => 55,
         'рдХрд╛рдЙрдмреЗрд▓' => 56,
         'рдХреНрд░реИрд╢ рд╕рд┐рдВрдмрд▓ 2' => 57,
         'рд╡рд╛рдЗрдмрд░рд╛ рдердкреНрдкрдбрд╝' => релib,
         'рд░рд╛рдЗрдб рд╕рд┐рдореНрдмрд▓ 2' => 59,
         'рд╣рд╛рдИ рдмреЛрдВрдЧреЛ' => 60,
         'рд▓реЛ рдмреЛрдВрдЧреЛ' => 61,
         'рдореНрдпреВрдЯ рд╣рд╛рдИ рдХрд╛рдВрдЧрд╛' => 62,
         'рдУрдкрди рд╣рд╛рдИ рдХрд╛рдВрдЧрд╛' => 63,
         'рд▓реЛ рдХрд╛рдВрдЧрд╛' => 64,
         'рд╣рд╛рдИ рдЯрд┐рдВрдмреЗрд▓' => 65,
         'рд▓реЛ рдЯрд┐рдВрдмрд▓реЗ' => 66,
         'рд╣рд╛рдИ рдЕрдЧреЛрдЧреЛ' => 67,
         'рд▓реЛ рдЕрдЧреЛрдЧреЛ' => 68,
         'рдХрд╛рдмрд╛рд╕рд╛' => 69,
         'рдорд░рд╛рдХрд╕' => 70,
         'рд▓рдШреБ рд╕реАрдЯреА' => 71,
         'рд▓реЙрдиреНрдЧ рд╡реНрд╣рд┐рд╕рд▓' => 72,
         'рд╢реЙрд░реНрдЯ рдЧрд╛рдпрд░реЛ' => 73,
         'рд▓реЙрдиреНрдЧ рдЧрд╛рдпрд░реЛ' => 74,
         'рдХреНрд▓рд╡реНрд╕' => 75,
         'рд╣рд╛рдИ рд╡реБрдб рдмреНрд▓реЙрдХ' => 76,
         'рд▓реЛ рд╡реБрдб рдмреНрд▓реЙрдХ' => 77,
         'рдореНрдпреВрдЯ рдХреНрдпреВрдЗрдХрд╛' => 78,
         'рдУрдкрди рдХреНрдпреБрдХреА' => 79,
         'рдореНрдпреВрдЯ рддреНрд░рд┐рдХреЛрдг' => 80,
         'рдЦреБрд▓рд╛ рддреНрд░рд┐рднреБрдЬ' => 81,
 );


рд╣рдо рдбрд┐рдлрд╝реЙрд▓реНрдЯ рдорд╛рди рдФрд░ рд▓рдпрдмрджреНрдз рдкреИрдЯрд░реНрди рдХреЛ рд╕реНрдХреНрд░реАрдирд╢реЙрдЯ рдореЗрдВ рд╕реЗрдЯ рдХрд░рддреЗ рд╣реИрдВ
 рдореЗрд░рд╛ $ bpm = 300;
 рдореЗрд░реЗ $ рдмрд┐рдЯ = 0;
 рдореЗрд░реЗ $ рдмрд┐рдЯреНрд╕ = [[0, 1, 1, 0], [0, 0, 1, 0], [1, 0, 0], [1, 0, 1, 0]];

 my @volume = (127, 127, 127, 127);
 my @drumset = ('рдмрд╛рд╕ рдбреНрд░рдо 2', 'рдмрд╛рд╕ рдбреНрд░рдо 1', 'рд╕реНрдиреЗрдпрд░ рдбреНрд░рдо 1', 'рд╕реНрдиреЗрдпрд░ рдбреНрд░рдо 2');
 my @kb_keys = (qw (QWERASDFUIOPHJKL));


рдПрдХ Win32API :: рдорд┐рдбреА рдСрдмреНрдЬреЗрдХреНрдЯ рдмрдирд╛рдПрдБ
 рдореЗрд░рд╛ $ рдореЛ = рдирдпрд╛ Win32API :: рдорд┐рдбреА :: рдЖрдЙрдЯ () рдпрд╛ "рдорд┐рдбреА рдЖрдЙрдЯрдкреБрдЯ рдирд╣реАрдВ рдмрдирд╛ рд╕рдХрддрд╛";


рдкреНрд░реЛрдЧреНрд░рд╛рдо рд╡рд┐рдВрдбреЛ рдХреЗ рд▓рд┐рдП рдПрдХ рд╡рд┐рдЬреЗрдЯ рдмрдирд╛рдПрдВ, рд╢реАрд░реНрд╖рдХ рд╕реЗрдЯ рдХрд░реЗрдВ рдФрд░ рдЖрдХрд╛рд░ рдмрджрд▓рдиреЗ рдХреА рдХреНрд╖рдорддрд╛ рдХреЛ рдЕрдХреНрд╖рдо рдХрд░реЗрдВ
 рдореЗрд░реЗ $ mw = Tkx :: рд╡рд┐рдЬреЗрдЯ-> рдирдпрд╛ ('ред');
    $ mw-> g_wm_title ('рдкрд░реНрд▓ рдореЗрдВ рдбреНрд░рдо рдорд╢реАрди');  
    $ mw-> g_wm_resizable (0, 0);

 my @pad = (-padx => 4, -pady => 4, -sticky => 'names');


рд╣рдо рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдЦреАрдВрдЪрддреЗ рд╣реИрдВ, рдмрд┐рдВрдбрд┐рдо рд╣реЙрдЯрдХреАрдЬрд╝
 рдореЗрд░реЗ $ i (0..3) {рдХреЗ рд▓рд┐рдП
         рдореЗрд░рд╛ $ рдХреЙрдореНрдмреЛ = $ mw-> new_ttk__combobox (
                 -рдЯреЗрдХреНрд╕реНрдЯрд╡рд░реНрд╕реЗрдмрд▓ => \ $ рдбреНрд░рдо [$ i],
                 -рд╕реНрдЯреЗрдЯ => 'рдкрдардиреАрдп',
                 -рдпрд╛рд▓ = = [рдкреНрд░рдХрд╛рд░ {$ рдбреНрд░рдо {$ a} <=> $ рдбреНрд░рдо {$ b}} рдЪрд╛рдмрд┐рдпрд╛рдБ% рдбреНрд░рдо],
         );
         рдореЗрд░рд╛ $ рдкреИрдорд╛рдирд╛ = $ mw-> new_ttk__scale (
                 -рдпреЛрдЧреНрдп => \ $ рдорд╛рддреНрд░рд╛ [$ i],
                 -рдлреНрд░реЙрдо => 0,
                 -рддреЛ => 127,
                 -рд▓рд╛рдн => 50,
         );
         $ рдХреЙрдореНрдмреЛ-> g_grid (-рд░реЛ => $ i -column => 0, @pad);
         $ рд╕реНрдХреЗрд▓-> g_grid (-рд░реЛ => $ i, -column => 1, @рдкреИрдб);
         рдореЗрд░реЗ $ j (0..3) {рдХреЗ рд▓рд┐рдП
                 рдореЗрд░рд╛ $ k = $ kb_keys [4 * $ i + $ j];
                 рдореЗрд░рд╛ $ c = $ mw-> new_ttk__checkbutton (
                         -рдпреЛрдЧреНрдп => $ рдмрд┐рдЯреНрд╕ -> [$ i] -> [$ j],
                         -рд╕реНрдЯрд╛рдЗрд▓ => 'рдЯреВрд▓рдмрдЯрди',
                         -рдЯреЗрдХреНрд╕реНрдЯ => "$ k",
                 );
                 Txx :: bind (all => $ _ => рдЙрдк {$ c-> invoke ()}) рдХреЗ рд▓рд┐рдП (lc ($ k), uc ($ k));
                 Txx :: grid ($ c, -row => $ i; -column => $ j + 2, @pad);
         }
 }

 рдореЗрд░реЗ $ bpm_label = $ mw-> new_ttk__label (-text => "$ bpm BPM");
 рдореЗрд░реЗ $ bpm_scale = $ mw-> new_ttk__scale (
         -рдпреЛрдЧреНрдп => $ bpm,
         -рдлреНрд░реЙрдо => 60,
         -рддреЛ => 600,
         -рдХреЙрдордВрдб => рдЙрдк {$ bpm_label-> m_configure (-text => int ($ bpm)ред 'BPM')}ред
 );

 $ bpm_label-> g_grid (-рд░реЛ => 4, -рдХреВрд▓ = = 0);
 $ bpm_scale-> g_grid (-row => 5, -column => 0);


рдореБрдЦреНрдп рд▓реВрдк, рд╣рдо рд╕реАрдХреНрд╡реЗрдВрд╕рд░ рдХреЛ рдПрдХ рдЫреЛрдЯрд╛ рд╕рдВрджреЗрд╢ рднреЗрдЬрддреЗ рд╣реИрдВ, рд╣рдо рдмреАрдкреАрдПрдо, рдЕрдВрддрд░рд╛рд▓ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдЧрдгрдирд╛ рдХрд░рддреЗ рд╣реИрдВ, рдЬрд┐рд╕рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рд╣рдо рдбреНрд░реВрдкрд▓реВрдк () рдХрд╣рддреЗ рд╣реИрдВред

 рдЙрдк рдбреНрд░рдорд▓реВ {
         рдореЗрд░рд╛ $ b = $ рдмрд┐рдЯ ++% 4;
         (0..3) рдХреЗ рд▓рд┐рдП {
                 рдЕрдЧрд░ ($ рдмрд┐рдЯреНрд╕ -> [$ _] -> [$ b]) {
                         $ рдореЛ-> рд╢реЙрд░реНрдЯрдПрдордПрд╕рдЬреА ((0x00000090 | 9) | ($ рдбреНрд░рдо {$ рдбреНрд░рдо [$ _]} << 8) | ($ рдорд╛рддреНрд░рд╛ [$ _] << 16));
                 }
         }
         Txx :: рдХреЗ рдмрд╛рдж (int (60000 / $ bpm) => \ & рдбреНрд░рдо;
 }

 Tkx :: рдХреЗ рдмрд╛рдж (1000 => \ & рдбреНрд░рдо);
 Txx :: рдореЗрдирд▓реЛрдк;



рд╡рд╣ рд╕рдм рд╣реИред рдореИрдВрдиреЗ рд╡рд┐рдВрдбреЛрдЬ рдХреЗ рд▓рд┐рдП рдПрдХ рдмрд┐рд▓реНрдб рдмрдирд╛рдпрд╛ред

рд╕рдВрджрд░реНрдн
рд╕реНрд░реЛрдд рдХреЛрдб
рд╡рд┐рдВрдбреЛрдЬ рдХреЗ рддрд╣рдд рдирд┐рд░реНрдорд╛рдг (рд╢рд░рд╛рдм рдХреЗ рддрд╣рдд рднреА рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ)

Source: https://habr.com/ru/post/In118495/


All Articles