рдореИрдВрдиреЗ рдорд┐рдбреА рдХреАрдмреЛрд░реНрдб рдХреИрд╕реЗ рд▓рд┐рдЦрд╛

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

рдПрдХ, рдПрдХ, рджреЛ, рддреАрди ...


рдЗрд╕рд╕реЗ рдкрд╣рд▓реЗ рдХрд┐ рдЖрдк рдПрдХ рдХреАрдмреЛрд░реНрдб рд▓рд┐рдЦреЗрдВ, рдЖрдкрдХреЛ рдХрд┐рд╕реА рддрд░рд╣ рдзреНрд╡рдирд┐ рдмрдЬрд╛рдирд╛ рд╕реАрдЦрдирд╛ рд╣реЛрдЧрд╛ред рдкрд╣рд▓реА рдмрд╛рдд рдЬреЛ рдорди рдореЗрдВ рдЖрддреА рд╣реИ рд╡рд╣ рд╕рд┐рд╕реНрдЯрдо рдореЗрдВ рдЕрдВрддрд░реНрдирд┐рд╣рд┐рдд рд╕рд┐рдВрдереЗрд╕рд╛рдЗрдЬрд╝рд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рд╣реИред рдпрд╣ рдкреНрд░рддреНрдпреЗрдХ рдбрд┐рд╡рд╛рдЗрд╕ рдкрд░ рд╣реИ, рдФрд░ рдЖрдкрдХреЛ рдХреБрдЫ рднреА рд╕реНрдерд╛рдкрд┐рдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИред рд╕рд╛рдорд╛рдиреНрдп рддреМрд░ рдкрд░, рдпрд╣ рдмреЙрдХреНрд╕ рд╕реЗ рдмрд╛рд╣рд░ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИред
рдореИрдВрдиреЗ C # рдореЗрдВ рдПрдХ рдкреНрд░реЛрдЧреНрд░рд╛рдо рд▓рд┐рдЦрдиреЗ рдХрд╛ рдлреИрд╕рд▓рд╛ рдХрд┐рдпрд╛ред Google рдореЗрдВ рдЦреЛрдЬ рдХрд░рдиреЗ рдкрд░, рдореБрдЭреЗ рдкрддрд╛ рдЪрд▓рд╛ рдХрд┐ .NET рд╕реНрд╡рдпрдВ рдорд┐рдбреА рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдирд╛ рдирд╣реАрдВ рдЬрд╛рдирддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдЗрд╕рдХреЗ рд▓рд┐рдП WinAPI рдлрд╝рдВрдХреНрд╢рди рд╣реИрдВред рдПрдХ рдмрд╛рдж рдХреА рдЦреЛрдЬ рдиреЗ рдЕрдВрддрддрдГ рдореБрдЭреЗ рдПрдирдПрдкреАрдУ рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдХреЗ рд▓рд┐рдП рдкреНрд░реЗрд░рд┐рдд рдХрд┐рдпрд╛ред рдЗрд╕рдХреЗ рд╕рд╛рде, рд╣рдо рдзреНрд╡рдирд┐рдпрд╛рдБ рдмрдЬрд╛рдПрдБрдЧреЗред

рдПрдХ рдиреЛрдЯ рдЪрд▓рд╛рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ рдорд┐рдбреАрдУрдЯ рдХреЛ рдПрдХ рд╡рд┐рд╢рд┐рд╖реНрдЯ рд╕рдВрджреЗрд╢ рднреЗрдЬрдиреЗ рдХреА рдЬрд░реВрд░рдд рд╣реИ, рдЬреЛ рдкреНрд▓реЗрдмреИрдХ рдЪреИрдирд▓, рдиреЛрдЯреНрд╕ рдФрд░ рджрдмрд╛рд╡ рдмрд▓ рдХреЛ рджрд░реНрд╢рд╛рддрд╛ рд╣реИред
рддреЛ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдЖрдк 3 рд╕рдкреНрддрдХ рдХреЗ рд▓рд┐рдП рдПрдХ рдиреЛрдЯ рдЦреЗрд▓ рд╕рдХрддреЗ рд╣реИрдВ:

midiOut.Send( MidiMessage.StartNote( 57, 127, 0 ).RawData ) //id ,   (0-127),  ; 


рд▓реЗрдХрд┐рди рд╕рдм рдХреБрдЫ рдЗрддрдирд╛ рд╕рд░рд▓ рдирд╣реАрдВ рд╣реИ, рдПрдХ рдиреЛрдЯ рдХреЗ рдкреНрд░рдЬрдирди рдХреЛ рд░реЛрдХрдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рдЕрдиреНрдпрдерд╛ рдпрд╣ рдЙрд╕ рддрд░рд╣ рд╕реЗ рдзреНрд╡рдирд┐ рдХрд░реЗрдЧрд╛ред

 midiOut.Send( MidiMessage.StopNote( 57, 0, 0 ).RawData ); 


рдЦреЗрд▓рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ, рдЖрдкрдХреЛ рд╡рд╛рдВрдЫрд┐рдд рдорд┐рдбреА рдбрд┐рд╡рд╛рдЗрд╕ рдХреЛ рдЦреЛрд▓рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдпрд╣ рдХреЗрд╡рд▓ рдПрдХ MidiOut рдСрдмреНрдЬреЗрдХреНрдЯ рдмрдирд╛рдиреЗ рдХреЗ рджреНрд╡рд╛рд░рд╛ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдбрд┐рд╡рд╛рдЗрд╕ рдирдВрдмрд░ рдХреЛ рдХрдВрд╕реНрдЯреНрд░рдХреНрдЯрд░ рдХреЛ рдкрд╛рд╕ рдХрд░ рджрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдХрдИ рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВред
рдЖрдк рд╕реНрдереИрддрд┐рдХ рд╕рдВрдкрддреНрддрд┐ MidiOut.NumberOfDevices рдХреЛ рдкрдврд╝рдХрд░ рдЙрдирдХреА рд╕рдВрдЦреНрдпрд╛ рдХрд╛ рдкрддрд╛ рд▓рдЧрд╛ рд╕рдХрддреЗ рд╣реИрдВ, рдФрд░ рдЗрд╕ рдбрд┐рд╡рд╛рдЗрд╕ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЬрд╛рдирдХрд╛рд░реА рдкреНрд░рд╛рдкреНрдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ MidiOut.DeviceInfo рдкрджреНрдзрддрд┐ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ, рдЗрд╕реЗ рд╕рд┐рдВрдереЗрд╕рд╛рдЗрдЬрд╝рд░ рдЖрдИрдбреА рдкрд╛рд╕ рдХрд░рдХреЗред

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

рдЫрд╡рд┐

рдпрд╣ рд╕рдм рдЬрд╛рдирдХрд╛рд░реА рдкрдврд╝рдиреЗ рдХреЗ рдмрд╛рдж, рдореИрдВрдиреЗ NAudio рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреЛ рдЖрд╕рд╛рди рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рд╡рд░реНрдЧ рд▓рд┐рдЦрд╛:
рдЫрд┐рдкрд╛ рд╣реБрдЖ рдкрд╛рда
 internal struct Note { public Note( byte oct, Tones t ) { octave = oct; tone = t; id = 12 + octave * 12 + (int)tone; } public byte octave; public Tones tone; public int id; } public enum Tones { A = 9, Ad = 10, B = 11, C = 0, Cd = 1, D = 2, Dd = 3, E = 4, F = 5, Fd = 6, G = 7, Gd = 8 } class AudioSintezator : IDisposable { public int PlayTone( byte octave, Tones tone ) { // 12   ,    0-  (   -1-) int note = 12 + octave * 12 + (int)tone; if( !playingTones.Contains( note ) ) { //    .     0 midiOut.Send( MidiMessage.StartNote( note, 127, 0 ).RawData ); playingTones.Add( note ); } return note; } public void StopPlaying( int id ) { if( playingTones.Contains( id ) ) { //    midiOut.Send( MidiMessage.StopNote( id, 0, 0 ).RawData ); playingTones.Remove( id ); } } MidiOut midiOut = new MidiOut( 0 ); List<int> playingTones = new List<int>(); public void Dispose() { midiOut.Close(); midiOut.Dispose(); } } 


рдФрд░ рдорд┐рдбреА рдХреАрдмреЛрд░реНрдб рдХрд╛ рдПрдХ рдкрд░реАрдХреНрд╖рдг рд╕рдВрд╕реНрдХрд░рдг рднреА рдмрдирд╛рдпрд╛

рдЫрд╡рд┐

рд╕реЗрдХреНрд╕, рдбреНрд░рдЧреНрд╕ рдФрд░ рд░реЙрдХ рдПрдВрдб рд░реЛрд▓


рдЕрдЧрд▓рд╛ рдЪрд░рдг рдПрдХ рдЧрд┐рдЯрд╛рд░ рдХреА рдЧрд░реНрджрди рдФрд░ рд╕реНрдЯреНрд░рд┐рдВрдЧреНрд╕ рдФрд░ рдлреНрд░реАрдЯреНрд╕ рдХреЗ рд▓рд┐рдП рдиреЛрдЯреЛрдВ рдХрд╛ рдмрдВрдзрди рд╣реИред
рдЧрд┐рдЯрд╛рд░ рдлреНрд░реЗрдЯрдмреЛрд░реНрдб рдмрд╣реБрдд рд╕рд░рд▓ рд╣реИред рдЦреБрд▓реА рд╕реНрдерд┐рддрд┐ рдореЗрдВ рдкреНрд░рддреНрдпреЗрдХ рд╕реНрдЯреНрд░рд┐рдВрдЧ рдПрдХ рд╡рд┐рд╢рд┐рд╖реНрдЯ рд╕реНрд╡рд░ рдХреЗ рд╕рд╛рде рдПрдХ рдзреНрд╡рдирд┐ рдмрдирд╛рддреА рд╣реИред рдПрдХ рд╣реА рд╕реНрдЯреНрд░рд┐рдВрдЧ, рдПрдХ рдирд┐рд╢реНрдЪрд┐рдд рдЭрд▓реНрд▓рд╛рд╣рдЯ рдкрд░ рдЬрдХрдбрд╝реА рд╣реБрдИ, рдзреНрд╡рдирд┐ рдХреЛ рдПрдХ рдирд┐рд╢реНрдЪрд┐рдд рд╕рдВрдЦреНрдпрд╛ рдореЗрдВ рдЙрдЪреНрдЪ рд╢реНрд░реЗрдгреА (1 рдЭрд▓реНрд▓рд╛рд╣рдЯ - 1 рдЕрд░реНрдз-рд╕реНрд╡рд░) рдмрдирд╛рддреА рд╣реИред
рдпрджрд┐ рдПрдХ рдЦреБрд▓реА рд╕реНрдЯреНрд░рд┐рдВрдЧ рдИ 4 рдзреНрд╡рдирд┐ рдмрдирд╛рддреА рд╣реИ, рддреЛ рдЗрд╕реЗ рджреВрд╕рд░реЗ рдЭрд▓реНрд▓рд╛рд╣рдЯ рдореЗрдВ рдкрд┐рди рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдФрд░ рдзреНрд╡рдирд┐ F # 4 рдХрд╛ рдЙрддреНрдкрд╛рджрди рдХрд░реЗрдЧрд╛, рдФрд░ 12 рд╡реЗрдВ E5 рдкрд░ред
рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо рд╕рд░рд▓ рд╣реИ: рдПрдХ рдЦреБрд▓реА рд╕реНрдЯреНрд░рд┐рдВрдЧ рдХрд╛ рдзреНрдпрд╛рди рд░рдЦреЗрдВ, рдФрд░ рдЗрд╕реЗ рдирд┐рд╢реНрдЪрд┐рдд рд╕рдВрдЦреНрдпрд╛ рдореЗрдВ рдЖрдзрд╛ рдЯрди рдмрдврд╝рд╛рдПрдВред

рдЕрдкрдиреЗ рдЬреАрд╡рди рдХреЛ рдЖрд╕рд╛рди рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП, рдореИрдВрдиреЗ рдПрдХ рдХрдХреНрд╖рд╛ рд▓рд┐рдЦреА:
рдЫрд┐рдкрд╛ рд╣реБрдЖ рдкрд╛рда
 class Guitar { public Guitar( params Note[] tune ) { for( int i = 0; i < 6; ++i ) { strs.Add( new GuitarString( tune[i] ) ); } } public List<Tuple<byte, byte>> GetFretsForNote( Note note ) { // 1-    ( 0  5), 2- -   ( 0 -  ) List<Tuple<byte, byte>> result = new List<Tuple<byte, byte>>(); byte currentString = 0; foreach( var str in strs ) { var fret = str.GetFretForNote( note ); if( fret != -1 ) //         { result.Add( new Tuple<byte, byte>( currentString, (byte)fret ) ); } ++currentString; } return result; } public Note GetNote( byte str, byte fret ) { return strs[str].GetNoteForFret( fret ); } public void SetTuning( params Note[] tune ) //    { for( int i = 0; i < 6; ++i ) { strs[i].SetTune( tune[i] ); } } List<GuitarString> strs = new List<GuitarString>(); } class GuitarString { public GuitarString( Note note ) { this.open = note; } public void SetTune( Note note ) { this.open = note; } public Note GetNoteForFret( byte fret ) { return open + fret; } public int GetFretForNote( Note note ) { int fret = -1; // -1 ,        if( open <= note ) { int octDiff = note.octave - open.octave; int noteDiff = note.tone - open.tone; fret = octDiff * 12 + noteDiff; } return fret; } Note open; } 



рдпрд╣рд╛рдБ рдореБрдЭреЗ рдЗрд╕ рд╕реНрддрд░ рдкрд░ рдорд┐рд▓рд╛ рд╣реИ:

рдЫрд╡рд┐

рддреАрдиреЛрдВ, рд╕рд╛рддрд╡реЗрдВ рд░рд╛рдЧ рдФрд░ рд╕рдВрдЧреАрдд рдХреА рджреВрд╕рд░реА рдЦреБрд╢рд┐рдпрд╛рдБ


рдпрд╣ рдЪрд░рдг рдПрдХ рдмрд┐рдВрджреБ рдХреЛ рдЫреЛрдбрд╝рдХрд░ рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рдЬрдЯрд┐рд▓ рдирд╣реАрдВ рд╣реИ, рдЬрд┐рд╕реЗ рдереЛрдбрд╝реА рджреЗрд░ рдмрд╛рдж рд╡рд░реНрдгрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред
рд╕рд┐рджреНрдзрд╛рдВрдд рдХреА рдПрдХ рдмрд┐рдЯ: рдПрдХ рд░рд╛рдЧ рдХреБрдЫ рдХреБрдВрдЬрд┐рдпреЛрдВ рдХреА рдЖрд╡рд╛рдЬрд╝ рдХрд╛ рдПрдХ рд╕реЗрдЯ рд╣реИред рдЗрди рдиреЛрдЯреЛрдВ рдХреЛ рдХрд┐рд╕реА рднреА рддрд░рд╣ рд╕реЗ рдирд╣реАрдВ рд▓рд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ - рд╡реЗ рдХреБрдЫ рдирд┐рд╢реНрдЪрд┐рдд рдЕрдВрддрд░рд╛рд▓ рдкрд░ рд╕реНрдерд┐рдд рд╣реЛрддреЗ рд╣реИрдВред рдЕрдВрддрд░рд╛рд▓ рдХреЛ рд╕реЗрдореАрд┐рдЯреЛрдиреНрд╕ рдореЗрдВ рдорд╛рдкрд╛ рдЬрд╛рддрд╛ рд╣реИред
рдП рдорд╛рдЗрдирд░ рдореЗрдВ рдХреЙрд░реНрдб, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, 3.4 рдХрд╛ рдЕрдВрддрд░рд╛рд▓ рд╣реИ, рдЕрд░реНрдерд╛рддред рдиреЛрдЯреЛрдВ рдХреЗ рдЕрдиреБрдХреНрд░рдо рдХрд╛ рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡ рдХрд░рддрд╛ рд╣реИ: A, C, E (la, do, mi)
рдореИрдВ рдЕрдм рдЗрд╕ рдмрд╛рд░реЗ рдореЗрдВ рдмрд╛рдд рдирд╣реАрдВ рдХрд░ рдкрд╛рдКрдВрдЧрд╛ред рд╕рдВрдЧреАрдд рдореЗрдВ рд╢реМрдХрд┐рдпрд╛, рд░реВрдврд╝рд┐рд╡рд╛рджреА рдЦрддреНрдо рдирд╣реАрдВ рд╣реБрдЖред рдФрд░ рдореИрдВ рд╕рдЪ рд╕реЗ рдмрд╣реБрдд рдЕрдирд╛рд╡рд╢реНрдпрдХ рдФрд░ рджреВрд░ рдХрд╛ рдХрд╣рдиреЗ рд╕реЗ рдбрд░рддрд╛ рд╣реВрдВред рд╡рд┐рдХрд┐рдкреАрдбрд┐рдпрд╛ рдкрд░ рдЕрдзрд┐рдХ рдкрд╛рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред

рд╡рд╛рдкрд╕ рдХрд╛рд░реНрдпрдХреНрд░рдо рдореЗрдВред
рдорд╛рдиреНрдпрддрд╛ рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо рдЗрд╕ рдкреНрд░рдХрд╛рд░ рд╣реИ:
  1. рд╣рдо рд╕рдмрд╕реЗ рдХрдо рдзреНрд╡рдирд┐ рдкрд╛рддреЗ рд╣реИрдВ, рдпрд╣ рдХреЙрд░реНрдб (рдЯреЙрдирд┐рдХ рдХреЗ рд▓рд┐рдП рдЖрдзрд╛рд░ рд╣реЛрдЧрд╛, рдЕрдЧрд░ рдореИрдВ рдЧрд▓рдд рдирд╣реАрдВ рд╣реВрдВ)
  2. рд╣рдо "рдкрдбрд╝реЛрд╕реА" рдиреЛрдЯреЛрдВ рдХреЗ рдмреАрдЪ рдХреЗ рдЕрдВрддрд░рд╛рд▓ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░рддреЗ рд╣реИрдВ
  3. рд╣рдо рдкрд╣рд▓реЗ рд╕реЗ рддреИрдпрд╛рд░ рдЕрдВрддрд░рд╛рд▓ рддрд╛рд▓рд┐рдХрд╛ рдХреА рдЬрд╛рдВрдЪ рдХрд░рддреЗ рд╣реИрдВ

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

рдпрд╣ рдорд╛рдиреНрдпрддрд╛ рдХреЛ рдЬрдЯрд┐рд▓ рдмрдирд╛рддрд╛ рд╣реИ:
рдЬреИрд╕рд╛ рдХрд┐ рдЖрдк рд╢рд╛рдпрдж рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдЕрдиреБрдорд╛рди рд▓рдЧрд╛ рдЪреБрдХреЗ рд╣реИрдВ, рдореИрдВрдиреЗ рднреА рдЬреАрд╡рд╛рдУрдВ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреЛ рдЖрд╕рд╛рди рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рд╡рд░реНрдЧ рдмрдирд╛рдпрд╛:
рдЫрд┐рдкрд╛ рд╣реБрдЖ рдкрд╛рда
 static class Chords { public static ChordType[] chordTypes = new ChordType[]{ new ChordType(" ", "", 4,3), new ChordType(" ", "m", 3,4), new ChordType(" ", "5+", 4,4), new ChordType(" ", "m-5", 3,3), new ChordType("  ", "maj7", 4,3,4), new ChordType("  ", "m+7", 3,4,4), new ChordType("", "7", 4,3,3), new ChordType("  ", "m7", 3,4,3), new ChordType(" ", "maj5+", 4,4,3), new ChordType(" ", "m7-5", 3,3,4), new ChordType(" ", "dim", 3,3,3), new ChordType("   (IV)", "sus2", 2,5), new ChordType("   (II)", "sus4", 5,2), new ChordType("","6", 4,3,2), new ChordType("", "m6", 3,4,2), new ChordType(" ", "9", 4,3,3,4), new ChordType(" ", "m9", 3,4,3,4), new ChordType(" ", "-9", 4,3,3,3), new ChordType(" ", "m-9", 3,4,3,3), new ChordType("",""), new ChordType(" ", " - 2", 1), new ChordType(" ", " - 2", 2), new ChordType(" ", " - 3", 3), new ChordType(" ", " - 3", 4), new ChordType(" ", " - 4", 5), new ChordType(" ", " - 4", 6), new ChordType(" ", " - 5", 7), new ChordType(" ", " - 6", 8), new ChordType(" ", " - 6", 9), new ChordType(" ", " - 7", 10), new ChordType(" ", " - 7", 11), new ChordType("", " - ", 12), new ChordType(" ", " - 9", 13), new ChordType(" ", " - 9", 14) }; public static string[] chordsBases = new string[] { "A","A#","B","C","C#","D","D#","E", "F","F#","G","G#" }; public static string[] chordMods = new string[] { "","m","5+","m-5","maj7","m+7","7", "m7","maj5+","m7-5","dim","sus2","sus4", "6","m6","9","m9","-9","m-9" }; private static int GetChordType( List<Note> tmp ) { int[] intervals = new int[tmp.Count - 1]; for( int i = 0; i < tmp.Count - 1; ++i ) { intervals[i] = tmp[i] - tmp[i + 1]; } int type = 0; foreach( var chordType in Chords.chordTypes ) { if( Utils.CompareArrays( intervals, chordType.intervals ) ) break; ++type; } return type; } public static void GetChord( List<Note> chordNotes, out Note BaseNote, out ChordType type ) { List<Note> notes = PrepareNotes( chordNotes ); //     int typeIndex = GetChordType( notes ); //    if( typeIndex < chordTypes.Length ) //  { BaseNote = notes[0]; type = chordTypes[typeIndex]; } else { bool unknown = true; var possibleChord = new List<Note>( notes ); //    foreach( List<Note> perm in Utils.GeneratePermutation( possibleChord ) ) { //     ( > 12  ) for( int k = 1; k < perm.Count; ++k ) { if( perm[k].tone > perm[k - 1].tone ) { perm[k] = new Note( perm[k - 1].octave, perm[k].tone ); } else { perm[k] = new Note( (byte)(perm[k - 1].octave + 1), perm[k].tone ); } } typeIndex = GetChordType( possibleChord ); if( typeIndex < Chords.chordTypes.Length ) { unknown = false; break; //    ,  } } if( unknown ) { throw new Exception( " " ); } else { BaseNote = possibleChord[0]; type = chordTypes[typeIndex]; } } } private static List<Note> PrepareNotes( List<Note> notes ) { List<Note> tmp = new List<Note>(); bool finded = false; for( int i = 0; i < notes.Count; ++i ) { finded = false; var note = notes[i]; for( int j = 0; j < tmp.Count; ++j ) //     { if( note.tone == tmp[j].tone ) { finded = true; break; } } if( !finded ) //      { tmp.Add( note ); } } //    ,     if( tmp.Count == 1 && notes.Count > 1 ) return notes; // ""  byte lowest = tmp[0].octave; var lowesTone = tmp[0].tone; for( int i = 0; i < tmp.Count; ++i ) { if( tmp[i].octave > lowest ) { if( Utils.CountOfTones( tmp[i].tone, notes ) > 1 ) { if( tmp[i].tone > lowesTone ) { tmp[i] = new Note( lowest, tmp[i].tone ); } else { tmp[i] = new Note( (byte)(lowest + 1), tmp[i].tone ); } } } } tmp = tmp.OrderBy( x => x.id ).ToList(); return tmp; } } 



рдЕрдВрддрд┐рдо рдкрд░рд┐рдгрд╛рдо:

рдЫрд╡рд┐

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

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


All Articles