рд╕реЙрдлреНрдЯрд╡реЗрдпрд░ рд╕рд┐рдВрдереЗрд╕рд╛рдЗрдЬрд╝рд░

рдФрд░ рдЗрд╕рд▓рд┐рдП рд╕рдЬреНрдЬрдиреЛрдВ, рдореИрдВрдиреЗ рдЕрдВрддрддрдГ рд╕рдВрдЧреАрдд рдХреЗ рд╕реЙрдлреНрдЯрд╡реЗрдпрд░ рд╕рдВрд╢реНрд▓реЗрд╖рдг рд╕реЗ рдирд┐рдкрдЯрдиреЗ рдХрд╛ рдлреИрд╕рд▓рд╛ рдХрд┐рдпрд╛, рдЕрд░реНрдерд╛рддреН рдЗрд╕ рддрд░рд╣ рдХреЗ рдХрд╛рд░реНрдп рдХреЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЗ рд╡реНрдпрд╛рд╡рд╣рд╛рд░рд┐рдХ рднрд╛рдЧ рдХреЗ рд╕рд╛рдеред рдЖрдЗрдП рджреЗрдЦреЗрдВ рдХрд┐ рдпрд╣ рдХреНрдпрд╛ рд╣реБрдЖ рдФрд░ рдЗрд╕реЗ рдХреИрд╕реЗ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЧрдпрд╛ ...



рддрд░рдВрдЧреЗрдВ рдмрдирд╛рдПрдВ


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

public static double Sine(int index, double frequency) { return Math.Sin(frequency * index); } 

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

 class Program { public static void Main(string[] args) { double[] data = new double[75]; //  . for (int index = 1; index < 76; index++) { //     . data[index-1] = Sine(index, Math.PI * 2 * 2.0 / 75); //     . } Console.ReadKey(true); //    . } public static double Sine(int index, double frequency) { return Math.Sin(frequency * index); } } 

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

 public static void Draw (double[] data) { Console.BufferHeight = 25; //        . Console.CursorVisible = false; //    . for (int y = 0; y < 19; y++) {//    . Console.SetCursorPosition(77, y + 5);//     . Console.Write(9 - y); //    . } for (int x = 0; x < 75; x++) { //     Console.SetCursorPosition(x, x % 3); //    . Console.Write(x + 1); //   . int point = (int)(data[x] * 9); //         -9  9. int step = (point > 0)? -1 : 1; //     0. for (int y = point; y != step; y += step) {//   Console.SetCursorPosition(x, point + 14 - y); //    . Console.Write("тЦИ"); //  . } } } 

рдЕрдм рд╣рдо рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рдорд╢реАрди рдХреЗ рджреГрд╢реНрдп рдореЗрдВ рд╣рдорд╛рд░реЗ рджреЛ рд╣рд░реНрдЯреНрдЬ рдХреНрдпрд╛ рджрд┐рдЦрддреЗ рд╣реИрдВред



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

 private static double Saw(int index, double frequency) { return 2.0 * (index * frequency - Math.Floor(index * frequency )) -1.0; } 

рджреЗрдЦрд╛ рдлрд╝рдВрдХреНрд╢рди рдкрд░рд┐рдгрд╛рдо


 private static double Triangle(int index, double frequency) { return 2.0 * Math.Abs (2.0 * (index * frequency - Math.Floor(index * frequency + 0.5))) - 1.0; } 

рддреНрд░рд┐рднреБрдЬ рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдкрд░рд┐рдгрд╛рдо

 private static double Flat(int index, double frequency) { if (Math.Sin(frequency * index ) > 0) return 1; else return -1; } 

рдлреНрд▓реИрдЯ рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдкрд░рд┐рдгрд╛рдо

рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐ рд╕рд╛рдЗрди рдФрд░ рдлрд╝реНрд▓реИрдЯ рдлрд╝рдВрдХреНрд╢рдВрд╕ рдХреА рдЕрд╡рдзрд┐ 2 * рдкрд╛рдИ рд╣реИ, рдФрд░ рд╕реЙ рдФрд░ рдЯреНрд░рд╛рдЗрдВрдЧрд▓ рдлрд╝рдВрдХреНрд╢рдВрд╕ рдХреА рдЕрд╡рдзрд┐ рдПрдХ рд╣реИред

рдПрдХ wav рдлрд╝рд╛рдЗрд▓ рд▓рд┐рдЦрдирд╛


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

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

 public static void SaveWave(Stream stream, short[] data, int sampleRate) { BinaryWriter writer = new BinaryWriter(stream); short frameSize = (short)(16 / 8); //     (16    8). writer.Write(0x46464952); //  "RIFF". writer.Write(36 + data.Length * frameSize); //     . writer.Write(0x45564157); //  "WAVE". writer.Write(0x20746D66); //  "frm ". writer.Write(16); //   . writer.Write((short)1); //  1  PCM. writer.Write((short)1); //  . writer.Write(sampleRate); //  . writer.Write(sampleRate * frameSize); //  (    ). writer.Write(frameSize); //    . writer.Write((short)16); // . writer.Write(0x61746164); //  "DATA". writer.Write(data.Length * frameSize); //    . for (int index = 0; index < data.Length; index++) { //      . foreach (byte element in BitConverter.GetBytes(data[index])) { //       . stream.WriteByte(element); //     . } } } 

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

 public static void Main(string[] args) { int sampleRate = 8000; //   . short[] data = new short[sampleRate]; //   16  . double frequency = Math.PI * 2 * 440.0 / sampleRate; //   . for (int index = 0; index < sampleRate; index++) { //  . data[index] = (short)(Sine(index, frequency) * short.MaxValue); //      32767  -32767. } Stream file = File.Create("test.wav"); //        . SaveWave(file, data, sampleRate); //     . file.Close(); //  . } 

рд╣рдо рдХрд╛рд░реНрдпрдХреНрд░рдо рдФрд░ рд▓реЛ рдФрд░ рдирд┐рд╣рд╛рд░рдирд╛ рд╢реБрд░реВ рдХрд░рддреЗ рд╣реИрдВ! рд╣рдореЗрдВ рдЯреЗрд╕реНрдЯ рдорд┐рд▓ рдЧрдпрд╛ред рдЗрд╕реЗ рдкреНрд▓реЗрдпрд░ рдореЗрдВ рдбрд╛рдЙрдирд▓реЛрдб рдХрд░рдирд╛, рдмреАрдк рд╕реБрдирдирд╛ рдЬрдм рддрдХ рдХрд┐ рдХреИрдерд╛рд░реНрд╕рд┐рд╕ рд╣рд╛рд╕рд┐рд▓ рдирд╣реАрдВ рд╣реЛ рдЬрд╛рддрд╛ рдФрд░ рдЖрдЧреЗ рдмрдврд╝рддрд╛ рд░рд╣рддрд╛ рд╣реИред рдЖрдЗрдП рдПрдХ рдЖрд╕реНрдЯрд╕реАрд▓рд╕реНрдХрдк рдкрд░ рд╕рднреА рддрд░рдл рд╕реЗ рд╣рдорд╛рд░реА рд▓рд╣рд░ рдХреЛ рджреЗрдЦреЗрдВ рдФрд░ рдпрд╣ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рд╕реНрдкреЗрдХреНрдЯреНрд░реЛрдЧреНрд░рд╛рдо рдХрд┐ рд╣рдо рдкреНрд░рд╛рдкреНрдд рдХрд┐рдП рдЧрдП рдкрд░рд┐рдгрд╛рдо рдХреЗ рдареАрдХ рд╡рд┐рдкрд░реАрдд рд╣реИрдВред



рд▓реЗрдХрд┐рди рдЬреАрд╡рди рдореЗрдВ, рдзреНрд╡рдирд┐рдпрд╛рдВ рдЕрдВрддрд╣реАрди рд░реВрдк рд╕реЗ рдирд╣реАрдВ рд╕реБрдирд╛рдИ рджреЗрддреА рд╣реИрдВ, рд▓реЗрдХрд┐рди рдХрдо рд╣реЛ рдЬрд╛рддреА рд╣реИрдВ, рдЪрд▓реЛ рдПрдХ рд╕рдВрд╢реЛрдзрдХ рд▓рд┐рдЦреЗрдВ рдЬреЛ рд╕рдордп рдХреЗ рд╕рд╛рде рд╣рдорд╛рд░реА рдзреНрд╡рдирд┐ рдХреЛ рдЧреВрдВрде рджреЗрдЧрд╛ред рдЙрд╕реЗ рдкреВрд░реНрдг рдореВрд▓реНрдпреЛрдВ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдЧреА, рдЗрд╕рд▓рд┐рдП рд╣рдо рдЙрд╕реЗ рдЧреБрдгрд╛рдВрдХ, рд╡рд░реНрддрдорд╛рди рд╕реНрдерд┐рддрд┐, рдЖрд╡реГрддреНрддрд┐, рдЧреБрдгрд╛рдВрдХ рдЧреБрдгрдХ рдФрд░ рдирдореВрдирд╛ рдЖрд╡реГрддреНрддрд┐ рджреЗрдВрдЧреЗ, рдФрд░ рд╡рд╣ рдкреВрд░реНрдг рдореВрд▓реНрдпреЛрдВ рдХреА рдЧрдгрдирд╛ рд╕реНрд╡рдпрдВ рдХрд░реЗрдЧрд╛, рдЧреБрдгрд╛рдВрдХ рд╣рдореЗрд╢рд╛ рдирдХрд╛рд░рд╛рддреНрдордХ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред
 public static double Length(double compressor, double frequency, double position, double length, int sampleRate){ return Math.Exp(((compressor / sampleRate) * frequency * sampleRate * (position / sampleRate)) / (length / sampleRate)); } 

рдзреНрд╡рдирд┐ рд╕реНрддрд░ рдХреА рдЧрдгрдирд╛ рдХрд░рдиреЗ рд╡рд╛рд▓реА рд░реЗрдЦрд╛ рдХреЛ рднреА рдмрджрд▓рдирд╛ рд╣реЛрдЧрд╛ред

 data[index] = (short)(Sine(index, frequency) * Length(-0.0015, frequency, index, 1.0, sampleRate) * short.MaxValue); 

рдЕрдм рдЖрд╕реНрдЯрд╕реАрд▓рд╕реНрдХрдк рдкрд░ рд╣рдо рдПрдХ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдЕрд▓рдЧ рддрд╕реНрд╡реАрд░ рджреЗрдЦреЗрдВрдЧреЗред


рд╕рдВрдЧреАрдд рд▓реЗрдЦрди


рдЪреВрдВрдХрд┐ рд╣рдо рдЪреМрдереЗ рд╕рдкреНрддрдХ рдХреЗ рдиреЛрдЯ рдХреЛ рдЪрд▓рд╛рдиреЗ рдореЗрдВ рдХрд╛рдордпрд╛рдм рд░рд╣реЗ, рдЗрд╕рд▓рд┐рдП рдХреЛрдИ рднреА рд╣рдореЗрдВ рдЕрд▓рдЧ-рдЕрд▓рдЧ рдиреЛрдЯ рдЪрд▓рд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдкрд░реЗрд╢рд╛рди рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИред рдХреНрдпрд╛ рдЖрдкрдиреЗ рдХрднреА рд╕реЛрдЪрд╛ рд╣реИ рдХрд┐ рдиреЛрдЯреЛрдВ рдХреА рдЖрд╡реГрддреНрддрд┐рдпреЛрдВ рдХрд╛ рдкрддрд╛ рдХреИрд╕реЗ рд▓рдЧрд╛рдпрд╛ рдЬрд╛рдП? рдпрд╣ рдкрддрд╛ рдЪрд▓рд╛ рд╣реИ рдХрд┐ рдПрдХ рдЕрджреНрднреБрдд рд╕реВрддреНрд░ 440 * 2 ^ (рдкреВрд░реНрдг рдиреЛрдЯ рдЗрдВрдбреЗрдХреНрд╕ / 12) рд╣реИред рдпрджрд┐ рдЖрдк рдХрд┐рд╕реА рднреА рдкрд┐рдпрд╛рдиреЛ рдЬреИрд╕реЗ рдЙрдкрдХрд░рдг рдХреЛ рджреЗрдЦрддреЗ рд╣реИрдВ, рддреЛ рдпрд╛рдж рд░рдЦреЗрдВ рдХрд┐ рдЗрд╕рдореЗрдВ 7 рд╕рдлреЗрдж рдХреБрдВрдЬреА рдФрд░ 5 рдХрд╛рд▓реЗ рд╡рд╛рд▓реЗ рдмреНрд▓реЙрдХ рд╣реИрдВ, рдмреНрд▓реЙрдХ рдЕрд╖реНрдЯрдХ рд╣реИрдВ, рд╕рдлреЗрдж рдХреБрдВрдЬреА рдореБрдЦреНрдп рдиреЛрдЯ рд╣реИрдВ (C, D, E, F, S, A, C) рдФрд░ рдХрд╛рд▓реЗ рдЙрдирдХреЗ рдордзреНрдпрд╡реГрддреНрдд, рдЕрд░реНрдерд╛рддреН, рдПрдХ рд╕рдкреНрддрдХ рдореЗрдВ рдХреЗрд╡рд▓ 12 рдзреНрд╡рдирд┐рдпрд╛рдБ рд╣реИрдВ, рдЗрд╕реЗ рдПрдХ рд╕рдорд╛рди рд╕реНрд╡рднрд╛рд╡ рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИред
рдЖрдЗрдП рдЗрд╕ рдлрд╝рдВрдХреНрд╢рди рдХреЗ рдЧреНрд░рд╛рдл рдХреЛ рджреЗрдЦреЗрдВред

рд▓реЗрдХрд┐рди рд╣рдо рд╡реИрдЬреНрдЮрд╛рдирд┐рдХ рд╕рдВрдХреЗрддрди рдореЗрдВ рдиреЛрдЯ рд▓рд┐рдЦреЗрдВрдЧреЗ, рдЗрд╕рд▓рд┐рдП рд╣рдо рдЗрд╕реЗ 4 рдСрдХреНрдЯреЗрд╡ рд╕реЗ рдХрдо рдХрд░рдХреЗ рд╕реВрддреНрд░ рдХреЛ рдмрджрд▓ рджреЗрдВрдЧреЗ рдФрд░ рдЗрд╕реЗ рдЕрдкрдиреЗ рдореВрд▓ рд░реВрдк рдореЗрдВ рд▓рд┐рдЦреЗрдВрдЧреЗред

 private static double GetNote(int key, int octave) { return 27.5 * Math.Pow(2, (key + octave * 12.0) / 12.0); } 

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

 public class Element { int length; int start; double frequency; double compressor; public Element(double frequency, double compressor, double start, double length, int sampleRate) { this.frequency = Math.PI * 2 * frequency / sampleRate ; this.start = (int)(start * sampleRate); this.length = (int)(length * sampleRate); this.compressor = compressor / sampleRate; } public void Get(ref short[] data, int sampleRate) { double result; int position; for (int index = start; index < start + length * 2; index++) { position = index - start; result = 0.5 * Sine(position, frequency) ; result += 0.4 * Sine(position, frequency / 4); result += 0.2 * Sine(position, frequency / 2); result *= Length(compressor, frequency, position, length, sampleRate) * short.MaxValue * 0.25; result += data[index]; if (result > short.MaxValue) result = short.MaxValue; if (result < -short.MaxValue) result = -short.MaxValue; data[index] = (short)(result); } } private static double Length(double compressor, double frequency, double position, double length, int sampleRate){ return Math.Exp((compressor * frequency * sampleRate * (position / sampleRate)) / (length / sampleRate)); } private static double Sine(int index, double frequency) { return Math.Sin(frequency * index); } } 

 public class Track { private int sampleRate; private List<Element> elements = new List<Element>(); private short[] data; private int length; private static double GetNote(int key, int octave) { return 27.5 * Math.Pow(2, (key + octave * 12.0) / 12.0); } public Track(int sampleRate) { this.sampleRate = sampleRate; } public void Add(double frequency, double compressor, double start, double length) { if (this.length < (start+ length * 2 + 1) * sampleRate) this.length = (int)(start + length * 2 +1) * sampleRate; elements.Add(new Element(frequency, compressor, start, length, sampleRate)); } public void Synthesize() { data = new short[length]; foreach (var element in elements) { element.Get(ref data, sampleRate); } } } 

рдЕрдм рд╣рдо рдЕрдВрддрд┐рдо рд╕рдорд╛рд░реЛрд╣ рдореЗрдВ рдЖрдП рд╣реИрдВ рдЬреЛ рдиреЛрдЯреНрд╕ рдХреЗ рд╕рд╛рде рд▓рд╛рдЗрди рдХреЛ рдкрдврд╝реЗрдЧрд╛ рдФрд░ рд╣рдорд╛рд░реА рдзреБрди рдЙрддреНрдкрдиреНрди рдХрд░реЗрдЧрд╛
рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдПрдХ рдРрд╕рд╛ рд╢рдмреНрджрдХреЛрд╢ рдмрдирд╛рдПрдВ рдЬреЛ рдиреЛрдЯреЛрдВ рдХреЗ рдирд╛рдореЛрдВ рдХреЛ рд╕реВрдЪрдХрд╛рдВрдХреЛрдВ рдХреЗ рд╕рд╛рде рдЬреЛрдбрд╝ рджреЗрдЧрд╛, рдФрд░ рдЗрд╕рдореЗрдВ рдирд┐рдпрдВрддреНрд░рдг рдХреБрдВрдЬреА / рд╕реВрдЪрдХрд╛рдВрдХ рднреА рд╣реЛрдВрдЧреЗред
рдлрд╝рдВрдХреНрд╢рди рд╕реНрд╡рдпрдВ рдХреЛ рд╢рдмреНрджреЛрдВ рдореЗрдВ рдкрдВрдХреНрддрд┐ рдХреЛ рддреЛрдбрд╝ рджреЗрдЧрд╛ рдФрд░ рдкреНрд░рддреНрдпреЗрдХ рд╢рдмреНрдж рдХреЛ рдЕрд▓рдЧ рд╕реЗ рджреЛ рднрд╛рдЧреЛрдВ рдореЗрдВ рд╡рд┐рднрд╛рдЬрд┐рдд рдХрд░рддреЗ рд╣реБрдП рдЖрдЧреЗ рдХреА рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХрд░реЗрдЧрд╛ - рдмрд╛рдПрдВ рдФрд░ рджрд╛рдПрдВ, рджрд╛рдПрдВ рднрд╛рдЧ рдореЗрдВ рд╣рдореЗрд╢рд╛ рдПрдХ рд╡рд░реНрдг (рдЕрдВрдХ) рд╣реЛрддрд╛ рд╣реИ рдЬрд┐рд╕реЗ рдПрдХ рд╕рдВрдЦреНрдпрд╛ рдХреЗ рд░реВрдк рдореЗрдВ рдЪрд░ рд╕рдкреНрддрдХ рдореЗрдВ рд▓рд┐рдЦрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдФрд░ рдкрд╣рд▓реЗ рднрд╛рдЧ рдХреА рд▓рдВрдмрд╛рдИ рд╢рдмреНрдж рдХреА рд▓рдВрдмрд╛рдИ рд╣реЛрддреА рд╣реИ - 1 (рдЕрд░реНрдерд╛рдд, рджрд╛рдИрдВ рдУрд░ рдЛрдг рд╢рдмреНрдж) рдФрд░ рдЖрдЧреЗ рд╣рдорд╛рд░реЗ рд╢рдмреНрджрдХреЛрд╢ рдХреА рдХреБрдВрдЬреА рдХреЗ рд░реВрдк рдореЗрдВ рдХрд╛рд░реНрдп рдХрд░рддрд╛ рд╣реИ, рдЬреЛ рдиреЛрдЯ рдХреЗ рд╕реВрдЪрдХрд╛рдВрдХ рдХреЛ рд╡рд╛рдкрд╕ рдХрд░рддрд╛ рд╣реИ, рдЬрдм рд╣рдо рд╢рдмреНрдж рдХреЛ рдкрд╛рд░реНрд╕ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рд╣рдо рддрдп рдХрд░рддреЗ рд╣реИрдВ рдХрд┐ рдХреНрдпрд╛ рдХрд░рдирд╛ рд╣реИ, рдпрджрд┐ рд╕реВрдЪрдХрд╛рдВрдХ рдирд┐рдпрдВрддреНрд░рд┐рдд рд╣реЛ рд░рд╣рд╛ рд╣реИ, рддреЛ рд╣рдо рд╕реВрдЪрдХрд╛рдВрдХ рдХреЗ рдЕрдиреБрд░реВрдк рдХрд╛рд░реНрдп рдХрд░реЗрдВрдЧреЗ, рдФрд░ рдпрджрд┐ рдирд╣реАрдВ, рддреЛ рдЗрд╕рдХрд╛ рдорддрд▓рдм рд╣реИ рдХрд┐ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдПрдХ рдиреЛрдЯ рдЗрдВрдбреЗрдХреНрд╕ рд╣реИ рдФрд░ рд╣рдо рдЕрдкрдиреЗ рдЯреНрд░реИрдХ рдХреА рд▓рдВрдмрд╛рдИ рдФрд░ рдЖрд╡реГрддреНрддрд┐ рдХреА рдПрдХ рдирдИ рдзреНрд╡рдирд┐ рдЬреЛрдбрд╝реЗрдВрдЧреЗ, рдЬрд┐рд╕рдХреА рд╣рдореЗрдВ рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред

 public void Music (string melody, double temp = 60.0) { string[] words = melody.Split(' '); foreach (string word in words) { int note = notes[word.Substring(0, word.Length - 1)]; int octave = Convert.ToInt32(word.Substring(word.Length - 1, 1)); if (note > 2){ switch (note) { case 3: dtime = Math.Pow(0.5, octave + 1) * 8 * (60.0 / temp); break; case 4: length += (int)(Math.Pow(0.5, octave + 1) * 8 * (60.0 / temp)); position += Math.Pow(0.5, octave + 1) * 8 * (60.0 / temp); break; } } else { Add(GetNote(note, octave), -0.51, position, dtime); position += dtime; } } } 


рдЗрд╕ рдХреНрд╖рдг рд╕реЗ, рдореЗрд▓реЛрдбреА рдХреЛ L4 B6 S4 D7 B6 F#6 S4 B6 F#6 рд░реВрдк рдореЗрдВ рд▓рд┐рдЦрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рдЬрд╣рд╛рдВ L рд╡рд╣ рдХрдорд╛рдВрдб рд╣реИ, рдЬреЛ рдиреЛрдЯ рдХреА рд▓рдВрдмрд╛рдИ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░рддрд╛ рд╣реИ, рдФрд░ S рдПрдХ рдкреЙрдЬ рдмрдирд╛рддрд╛ рд╣реИ, рдмрд╛рдХреА рдЕрдХреНрд╖рд░ рдиреЛрдЯ рд╣реИрдВред рджрд░рдЕрд╕рд▓, рдпрд╣ рд╡рд╣ рдЬрдЧрд╣ рд╣реИ рдЬрд╣рд╛рдВ рд╕реЙрдлреНрдЯрд╡реЗрдпрд░ рд╕рд┐рдВрдереЗрд╕рд╛рдЗрдЬрд╝рд░ рдХрд╛ рд▓реЗрдЦрди рд╕рдорд╛рдкреНрдд рд╣реЛ рдЧрдпрд╛ рд╣реИ рдФрд░ рд╣рдо "рдмрд╛рдЦ рдХреЛрдХ" рдХреЗ рдПрдХ рдЯреБрдХрдбрд╝реЗ рдХреЛ рд╕реБрдирдХрд░ рдкрд░рд┐рдгрд╛рдо рдХреА рдЬрд╛рдВрдЪ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред

рдмрд╛рдЗрдирд░реА рдлрд╝рд╛рдЗрд▓
рд╕реНрд░реЛрдд рдХреЛрдб

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


All Articles