рд╣рдо рдорд┐рдбреА-рдХреАрдмреЛрд░реНрдб рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд▓рд┐рд▓реАрдкреЛрдВрдб рдореЗрдВ рдЯрд╛рдЗрдк рдХрд░рддреЗ рд╣реИрдВ

рдореИрдВрдиреЗ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рд▓рд┐рд▓рд┐рдкрдВрдб рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдПрдХ рджреЛ рдмрд╛рд░ рд▓рд┐рдЦрд╛ рдерд╛, рдФрд░ рдЕрдм рдореИрдВрдиреЗ рдорд┐рдбреА рдХреАрдмреЛрд░реНрдб рдЦрд░реАрджрд╛ред

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

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

UPD: рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдореЗрдВ рд╕реЗ рд▓рдЧрднрдЧ рдЖрдзреЗ рд╣рд┐рд╕реНрд╕реЗ рдХреЗ рд▓рд┐рдП рдиреЛрдЯ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ

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

рдПрдХ рдХрд╛рд░реНрдпрдХреНрд░рдо рд▓рд┐рдЦрдиреЗ рд╕реЗ рдореБрдЭреЗ рджреЛ рдкреНрд░рдХрд╛рд░ рдХреА рдЬрдЯрд┐рд▓рддрд╛рдУрдВ рдХрд╛ рд╕рд╛рдордирд╛ рдХрд░рдирд╛ рдкрдбрд╝рд╛: рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдорд┐рдбреА рдХреАрдмреЛрд░реНрдб рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдирд╛ рдФрд░ рдкреНрд░рд╛рдкреНрдд рд╕рдВрдХреЗрддреЛрдВ рдХреЛ рд╡рд╛рдВрдЫрд┐рдд рд░реВрдк рдореЗрдВ рдкрд░рд┐рд╡рд░реНрддрд┐рдд рдХрд░рдирд╛ред

рдорд┐рдбреА-рдбреЙрдЯ-рдиреЗрдЯ: рдорд┐рдбреА рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдирд╛


рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ рдореИрдВрдиреЗ рдорд┐рдбреА-рдбреЙрдЯ-рдиреЗрдЯ рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдбрд╛рдЙрдирд▓реЛрдб рдХреА рдереАред рдпрд╣ рдЗрдирдкреБрдЯ рдФрд░ рдЖрдЙрдЯрдкреБрдЯ рджреЛрдиреЛрдВ рдХреА рд╕рдВрднрд╛рд╡рдирд╛ рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рд╣рдо рдЕрдм рдЗрдирдкреБрдЯ рдореЗрдВ рд░реБрдЪрд┐ рд░рдЦрддреЗ рд╣реИрдВред

рдЙрдкрдХрд░рдгреЛрдВ рдХреА рд╕реВрдЪреА, рдЦреЛрд▓рдирд╛ рдФрд░ рдмрдВрдж рдХрд░рдирд╛

рдЙрдкрд▓рдмреНрдз рдЗрдирдкреБрдЯ рдЙрдкрдХрд░рдгреЛрдВ рдХреА рд╕реВрдЪреА, рдореИрдВрдиреЗ рдЗрд╕реЗ рдХреЙрдореНрдмреЛ рдмреЙрдХреНрд╕ рдореЗрдВ рднрд░ рджрд┐рдпрд╛ред

using Midi; // ....... private void LoadMidiDevices() { foreach (InputDevice d in InputDevice.InstalledDevices) { DeviceList.Items.Add(d.Name); } DeviceList.SelectedIndex = 0; UpdateDevice(); } 


рдбрд┐рд╡рд╛рдЗрд╕ рдХреЗ рдирд╛рдо рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдЖрдк рдирд┐рд░реНрдорд╛рддрд╛рдЖрдИрдб, рдкреНрд░реЛрдбрдХреНрдЯрдЖрдИрдб рдФрд░ рдЗрди рд╕рднреА рдХреЛ рдПрдХ рд╕рд╛рде рдПрдХ рдлреАрд▓реНрдб рд╕реНрдкреЗрд╕ рдореЗрдВ рднреА рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВред

рдУрдкрди () рдФрд░ рдХреНрд▓реЛрдЬрд╝ () рд╡рд┐рдзрд┐рдпрд╛рдБ рдЙрдкрдХрд░рдг рдХреЛ рдЦреЛрд▓рддреА рдФрд░ рдмрдВрдж рдХрд░рддреА рд╣реИрдВ, рд░рд╛рдЬреНрдп рдХреЛ рд╕реВрдЪрдирд╛ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЬрд┐рдореНрдореЗрджрд╛рд░ IsOpen, StartReceiving (), StopReceiving (), IsReceiving рдлрд╝реАрд▓реНрдб рд╕реЗ рдХреНрд░рдорд╢рдГ рдкреНрд░рд╛рдкреНрдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдкреБрд╕реНрддрдХрд╛рд▓рдп рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ C # -рд╕реНрдЯрд╛рдЗрд▓ рдЗрд╡реЗрдВрдЯ рдмрд╛рдЗрдВрдбрд┐рдВрдЧ рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИред

StartReceiving () рд╡рд┐рдзрд┐ рд╡реИрдХрд▓реНрдкрд┐рдХ рд░реВрдк рд╕реЗ рдХреНрд▓реЙрдХ рдХреЗ рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЛ рд╕реНрд╡реАрдХрд╛рд░ рдХрд░рддреА рд╣реИ, рдЬрд┐рд╕рдХрд╛ рдЙрджреНрджреЗрд╢реНрдп рдореБрдЦреНрдп рд░реВрдк рд╕реЗ MIDI рдЖрдЙрдЯрдкреБрдЯ рдХреЗ рд▓рд┐рдП рд╣реЛрддрд╛ рд╣реИред рдпрджрд┐ рдЖрдк рдЕрд╢рдХреНрдд рд╣реЛ рдЬрд╛рддреЗ рд╣реИрдВ, рддреЛ рдШрдЯрдирд╛рдУрдВ рдореЗрдВ рдЯрд╛рдЗрдорд╕реНрдЯреИрдореНрдкреНрд╕ рдХреА рдЧрдгрдирд╛ рдЙрд╕ рдХреНрд╖рдг рд╕реЗ рдХреА рдЬрд╛рдПрдЧреА рдЬрдм StartReceiving () рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИред

 private void UpdateDevice() { if (d != null) { if (d.IsReceiving) d.StopReceiving(); if (d.IsOpen) d.Close(); } d = InputDevice.InstalledDevices[DeviceList.SelectedIndex]; if (!d.IsOpen) d.Open(); if (d.IsReceiving) d.StopReceiving(); d.StartReceiving(null); if (d != null) { d.NoteOn += new InputDevice.NoteOnHandler(this.NoteOn); d.NoteOff += new InputDevice.NoteOffHandler(this.NoteOff); d.ControlChange += new InputDevice.ControlChangeHandler(this.ControlChange); } } 


рдмрд╛рд╣рд░ рдирд┐рдХрд▓рддреЗ рд╕рдордп рдбрд┐рд╡рд╛рдЗрд╕ рдХреЛ рдмрдВрдж рдХрд░рдирд╛ рди рднреВрд▓реЗрдВ
 private void SettingsWindow_FormClosing(object sender, FormClosingEventArgs e) { d.StopReceiving(); d.Close(); } 


рдкреНрд░рд╕рдВрд╕реНрдХрд░рдг рдкрд░ рдХреНрд▓рд┐рдХ рдХрд░реЗрдВ

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

рдЕрдкрдорд╛рди рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдирд╛ рд╕рд░рд▓ рд╣реИ:
рдиреЛрдЯрдСрди // рдиреЛрдЯрдСрдл
 private List<Pitch> notes; private Dictionary<Pitch, float> events; //.... public void NoteOn(NoteOnMessage msg) { lock (this) { events[msg.Pitch] = msg.Time; } } public void NoteOff(NoteOffMessage msg) { lock (this) { if (events.ContainsKey(msg.Pitch)) { if (msg.Time - events[msg.Pitch] > 0.05) { notes.Add(msg.Pitch); } events.Remove(msg.Pitch); if ((events.Count == 0) && (notes.Count > 0)) { SendKeys.SendWait(" " + cons.Convert(notes)); notes.Clear(); } } } } 


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

 bool sustain; // ....... public void ControlChange(ControlChangeMessage msg) { if (msg.Control == Midi.Control.SustainPedal) { if ((msg.Value > 64) && !sustain) { sustain = true; SendKeys.SendWait("{(}"); } if ((msg.Value < 64) && sustain) { sustain = false; SendKeys.SendWait("{)}"); } } return; } 


рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдЖрдкрдХреЛ ProgramChange рдФрд░ PitchBend рдИрд╡реЗрдВрдЯреНрд╕ рдХреЛ рд╕рдВрднрд╛рд▓рдиреЗ рдХреА рднреА рдЕрдиреБрдорддрд┐ рджреЗрддреА рд╣реИред

рд╣рдо рд╕рдВрдЧреАрдд рдХреЗ рдкреНрд░рд╛рдердорд┐рдХ рд╕рд┐рджреНрдзрд╛рдВрдд рдХреЗ рдкрд╛рдЧрд▓ рдХрд╛рдЯрддреЗ рд╣реИрдВ


рджреВрд╕рд░рд╛ рдХрд╛рд░реНрдп рдкрд╣рд▓реЗ рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдЕрдзрд┐рдХ рдХрдард┐рди рдерд╛ред рдореИрдВрдиреЗ рд╡рд░реНрдгреЛрдВ рдХреА рд╕рдВрдЦреНрдпрд╛ рдФрд░ рдПрдХ рдкреНрд░рдореБрдЦ-рдорд╛рдореВрд▓реА рд╕реНрд╡рд┐рдЪ рдХреЛ рдЗрдВрдЧрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╡рд┐рдВрдбреЛ рдореЗрдВ рдПрдХ рдХрд╛рдЙрдВрдЯрд░ рдЬреЛрдбрд╝рд╛ рдФрд░ рд╕реЛрдЪрдиреЗ рд▓рдЧрд╛ред

рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рдореИрдВрдиреЗ рдорд┐рдбреА. рдкрд┐рдЪ рдореВрд▓реНрдп рдФрд░ рдирд┐рд╖реНрдХрд░реНрд╖ рдХреЗ рдмреАрдЪ рдПрдХ рдордзреНрдпрд╡рд░реНрддреА рд▓рд┐рдВрдХ рдмрдирд╛рдпрд╛ - рдЧрд╛рдорд╛ рд╕реНрдЯреЗрдк рдХреНрд▓рд╛рд╕ (рд╢рдмреНрджрдХреЛрд╢ рдореЗрдВ рджреЗрдЦрдиреЗ рдХреЗ рд▓рд┐рдП рдмрд╣реБрдд рдЖрд▓рд╕реА, рдкрд╣рд▓реЗ рдЗрд╕реЗ рдЧреНрд░реЗрдб рдХрд╣рд╛ рдЬрд╛рддрд╛ рдерд╛, рд▓реЗрдХрд┐рди рдбрд┐рдЧреНрд░реА рдЖрд╡рд╢реНрдпрдХ рдереА)ред рдХреБрдВрдЬреА рдХреЗ рдЖрдзрд╛рд░ рдкрд░, рд╣рдо Midi.Pitch рдХреЛ рдбрд┐рдЧреНрд░реА рдореЗрдВ рдмрджрд▓ рджреЗрдВрдЧреЗред
Arrays 7-рдЪрд░рдг рдкреИрдорд╛рдиреЗ рдХреЗ рдЪрд░рдг рдФрд░ рдЗрд╕рдХреЗ рдкрд░рд┐рд╡рд░реНрддрди (рд╡реГрджреНрдзрд┐ рдпрд╛ рдХрдореА) рдХреЗ рд▓рд┐рдП рд░рдВрдЧреАрди (12-рдЪрд░рдг) рдкреИрдорд╛рдиреЗ рдореЗрдВ рд╕рдВрдЦреНрдпрд╛ рдХреЛ рдкрд░рд┐рд╡рд░реНрддрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕реЗрдЯрд┐рдВрдЧреНрд╕ рдХреЛ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд░рддрд╛ рд╣реИред
рдкрд┐рдЪрдХреЛрд░реНрдбреНрд░реЗрдб ()
 private static int[] majorScale = { 0, 1, 1, 2, 2, 3, 3, 4, 5, 5, 6, 6 }; private static int[] majorAcc = { 0, -1, 0, -1, 0, 0, 1, 0, -1, 0, -1, 0 }; private static int[] minorScale = { 0, 1, 1, 2, 2, 3, 3, 4, 5, 5, 6, 6 }; private static int[] minorAcc = { 0, -1, 0, 0, 1, 0, 1, 0, 0, 1, 0, 1 }; private Degree PitchToGrade(Pitch p) { //      int keybase = (keys * 7) % 12 - (isMajor?0:3); //          int offset = ((int)p - keybase) % 12; //     7-  int octave = (((int)p - keybase) / 12) * 7; int num, acc; if (offset < 0) offset += 12; if (isMajor) { num = majorScale[offset] + octave; acc = majorAcc[offset]; } else { num = minorScale[offset] + octave; acc = minorAcc[offset]; } return new Degree(num, acc); } 


рдЙрд╕рдХреЗ рдмрд╛рдж, рд╕рдмрд╕реЗ рдЕрдкреНрд░рд┐рдп рдмрд╛рдд рд╢реБрд░реВ рд╣реЛрддреА рд╣реИ: рдпрд╣ рдкрддрд╛ рд▓рдЧрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐ рдХреМрди рд╕рд╛ рдиреЛрдЯ рдФрд░ рдХрд┐рд╕ рд╕рдВрдХреЗрдд рдХреЗ рд╕рд╛рде рдЗрд╕ рд╕рдВрдЦреНрдпрд╛ рдХреЗ рд╕рд╛рде рдХрджрдо рдХреЛ рдЗрдВрдЧрд┐рдд рдХрд░реЗрдЧрд╛ рдФрд░ рджрд┐рдП рдЧрдП рдЯрди рдореЗрдВ рдЗрд╕ рдкрд░рд┐рд╡рд░реНрддрди рдХреЗ рд╕рд╛рдеред

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

рдПрдХ рдЬрд╛рджреБрдИ рддрд░реАрдХреЗ рд╕реЗ (рдЪрд╛рд░ рд╡рд░реНрдгреЛрдВ рдХреА рд╕рдВрдЦреНрдпрд╛ рдХреЛ рдЬреЛрдбрд╝рдХрд░ рдФрд░ рджреЛ рдХреЛ рдорд╛рдореВрд▓реА рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ рдШрдЯрд╛рддреЗ рд╣реБрдП), рдЪрд░рдг рд╕рдВрдЦреНрдпрд╛ рд╕рдлреЗрдж-рдХреБрдВрдЬреА рдкреИрдорд╛рдиреЗ рдореЗрдВ рдиреЛрдЯ рд╕рдВрдЦреНрдпрд╛ рдореЗрдВ рдмрджрд▓ рдЬрд╛рддреА рд╣реИ, рдФрд░ рдпрджрд┐ fs рдЪрд░ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдХреЛ рдЗрдВрдЧрд┐рдд рдХрд░рддрд╛ рд╣реИ, рддреЛ рд╣рдо рдПрдХ "рдореВрд▓" рдЯрдирдХ рдкрд░рд┐рд╡рд░реНрддрди рдЬреЛрдбрд╝рддреЗ рд╣реИрдВред
рд╕рдорд╛рдзрд╛рди ()
 private static String[] Naturals = { "c", "d", "e", "f", "g", "a", "h" }; private static String[] Sharps = { "cis", "dis", "eis", "fis", "gis", "ais", "his" }; private static String[] Flats = { "ces", "des", "es", "fes", "ges", "as", "b" }; private static String[] DoubleSharps = { "cisis", "disis", "eisis", "fisis", "gisis", "aisis", "bisis" }; private static String[] DoubleFlats = { "ceses", "deses", "eses", "feses", "geses", "ases", "beses" }; public String resolveIn(int keys, bool isMajor) { int fAcc = Acc; int fs; int fNum; int numMod = Number % 7; fs = isMajor ? 6 : 3; fs = (fs - 2*numMod) % 7; if (fs <= 0) fs += 7; if (keys < 0) fs = 8 - fs; if (fs <= Math.Abs(keys)) fAcc += keys / Math.Abs(keys); fNum = (numMod + keys*4 - (isMajor ? 0 : 2)) % 7; if (fNum < 0) fNum += 7; switch (fAcc) { case -2: return DoubleFlats[fNum]; case -1: return Flats[fNum]; case 0: return Naturals[fNum]; case 1: return Sharps[fNum]; case 2: return DoubleSharps[fNum]; default: return ""; } } 


рдмрд╛рдХреА рд╕рд░рд▓ рд╣реИ: рдЯреЙрдиреНрд╕рд┐рд▓рд┐рдЯреА рдХреЛ рдмрджрд▓рдиреЗ рдХреЗ рд╕рдВрдХреЗрддреЛрдВ рдХреЛ рдЬреЛрдбрд╝рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдХреЛ рд╕реНрдЯреЗрдк рд╕рдмрдЯреНрд░реИрдХреНрд╢рди рдСрдкрд░реЗрдЯрд░ рджреНрд╡рд╛рд░рд╛ рдЧрдгрдирд╛ рдХреА рдЬрд╛рддреА рд╣реИ, рдФрд░ рдЕрдВрддрд┐рдо рдКрдВрдЪрд╛рдИ рдХреЛ рд▓рд╛рд╕реНрдЯ рдореЗрдВ рд░рдЦрд╛ рдЬрд╛рддрд╛ рд╣реИ:
рдХрдиреНрд╡рд░реНрдЯ () рдФрд░ рдмрд╛рдХреА рд╕рдм
 // class Degree public static String operator -(Degree a, Degree g) { int o; o = a.Number - g.Number; o = (int)Math.Round((double)o / 7.0); if (o > 0) return new String('\'', o); if (o < 0) return new String(',', -o); return ""; } // class PitchConsumer public String Convert(List<Pitch> pitches) { Pitch localLast = lastPitch; String accum; if ((int)lastPitch == 0) lastPitch = pitches[0]; pitches.Sort(); if (pitches.Count == 1) { accum = PitchToString(pitches[0], lastPitch); lastPitch = pitches[0]; } else { lastPitch = pitches[0]; accum = "<"; foreach (Pitch p in pitches) { if (accum.Length > 1) accum += " "; accum += PitchToString(p, localLast); localLast = p; } accum += ">"; } return accum; } private String PitchToString(Pitch p, Pitch last) { Degree g, glast; String note; g = PitchToGrade(p); glast = PitchToGrade(last); note = g.resolveIn(keys, isMajor); return note + (g - glast); } 



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


рдЬрдЯрд┐рд▓рддрд╛ рдореЗрд░реЗ рдЗрдВрддрдЬрд╛рд░ рдореЗрдВ рдереА, рдЙрд╕ рдХреНрд╖реЗрддреНрд░ рдореЗрдВ рдирд╣реАрдВ рдЬрд╣рд╛рдВ рдореБрдЭреЗ рдпрдХреАрди рдирд╣реАрдВ рдерд╛, рд▓реЗрдХрд┐рди рдореЗрд░реА рд╡рд┐рд╢реЗрд╖рддрд╛ рдХрд╛ рд╡рд┐рд╖рдп рдХреНрдпрд╛ рдерд╛ред рд▓реЗрдХрд┐рди рдЕрдм рдореИрдВ рдмреЗрд╣рддрд░ рддрд░реАрдХреЗ рд╕реЗ рд╕рдордЭрддрд╛ рд╣реВрдВ рдХрд┐ рдПрдХ рд╕рдВрдЧреАрдд рд╕реНрдХреВрд▓ рдореЗрдВ рдмрдЪреНрдЪреЛрдВ рдХреЗ рд▓рд┐рдП рдпрд╣ рдХрд┐рддрдирд╛ рдореБрд╢реНрдХрд┐рд▓ рд╣реИ :-)ред рдФрд░ рдиреЛрдЯ рдорд┐рд▓рдирд╛ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рддреЗрдЬрд╝ рд╣реЛ рдЧрдпрд╛ред

https://github.com/m0003r/LilyInput

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


All Articles