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

рдореБрдЦреНрдп рд╡рд┐рд╢реЗрд╖рддрд╛рдПрдВ
- 47 рдЙрдкрдХрд░рдг, 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 :: рдореЗрдирд▓реЛрдк;
рд╡рд╣ рд╕рдм рд╣реИред рдореИрдВрдиреЗ рд╡рд┐рдВрдбреЛрдЬ рдХреЗ рд▓рд┐рдП рдПрдХ рдмрд┐рд▓реНрдб рдмрдирд╛рдпрд╛ред
рд╕рдВрджрд░реНрдн
рд╕реНрд░реЛрдд рдХреЛрдбрд╡рд┐рдВрдбреЛрдЬ рдХреЗ рддрд╣рдд рдирд┐рд░реНрдорд╛рдг (рд╢рд░рд╛рдм рдХреЗ рддрд╣рдд рднреА рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ)