рдЬрд╛рд╡рд╛рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдореЗрдВ рдПрдХ рд╡реЗрд╡ рдлрд╛рдЗрд▓ рдХреЛ рдкрд╛рд░реНрд╕ рдХрд░рдирд╛

рдЖрдЗрдХрди

рдЗрд╕ рд╡рд┐рд╖рдп рдХреА рдкреНрд░реЗрд░рдгрд╛ рдХреЗ рддрд╣рдд рдмрдирд╛рдпрд╛ рдЧрдпрд╛ред

рд╕рд╛рдорд╛рдиреНрдп рдЬрд╛рд╡рд╛рд╕реНрдХреНрд░рд┐рдкреНрдЯ, рдЬрд┐рд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рд╕рднреА рдХреЛ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рд╡рд╣ рдлрд╝рд╛рдЗрд▓ рд╕рд┐рд╕реНрдЯрдо рдпрд╛ рдмрд╛рдЗрдирд░реА рдбреЗрдЯрд╛ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЙрдкрдХрд░рдг рдкреНрд░рджрд╛рди рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдиреАрдЪреЗ рд╡рд░реНрдгрд┐рдд рд╕рдм рдХреБрдЫ рдиреЛрдб рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╣реЛрдЧрд╛ред js.



Wav рдлрд╝рд╛рдЗрд▓


рддрд░рдВрдЧ рдбрд┐рдЬреАрдЯрд▓ рдСрдбрд┐рдпреЛ рдбреЗрдЯрд╛ рдХреЗ рд▓рд┐рдП рдПрдХ рдкреНрд░рд╛рд░реВрдк рд╣реИред рдпрд╣ рдПрдХ рдорд╛рдирдХ RIFF рд╕рдВрд░рдЪрдирд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИред рдбреЗрдЯрд╛ рдХреЛ 3 рднрд╛рдЧреЛрдВ рдореЗрдВ рд╡рд┐рднрд╛рдЬрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ

  1. рд╣реИрдбрд░
  2. рдкреНрд░рд╛рд░реВрдк рдЕрдиреБрднрд╛рдЧ
  3. рдбреЗрдЯрд╛


рдЕрдзрд┐рдХ рдбреЗрдЯрд╛ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдЗрд╕рдХрд╛ рдЖрдорддреМрд░ рдкрд░ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред



рдлрд╝рд╛рдЗрд▓ рдкрд╛рд░реНрд╕рд┐рдВрдЧ


var http = require('http'); var fs = require('fs'); var sys= require('sys') var Canvas = require('canvas');
      
      





рд╣рдо рдЙрди рдореЙрдбреНрдпреВрд▓ рдХреЛ рдХрдиреЗрдХреНрдЯ рдХрд░рддреЗ рд╣реИрдВ рдЬрд┐рдирдХреА рд╣рдореЗрдВ рдЬрд╝рд░реВрд░рдд рд╣реЛрддреА рд╣реИ, рд╣рдореЗрдВ рддрд░рдВрдЧ рдлрд╝рд╛рдЗрд▓ рдХреА рддрд░рдВрдЧ рдХреЛ рдЦреАрдВрдЪрдиреЗ рдХреЗ рд▓рд┐рдП рдиреЛрдб-рдХреИрдирд╡рд╛рд╕ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИред

 var path = '/my/files/TH.wav'; //   . var wave = {}; //          fs.readFile(path, function (err, data) { if (err) throw err; //         data
      
      





рдлрд╝рд╛рдЗрд▓ рдкрд╛рд░реНрд╕ рд╣реЛ рд░рд╣реА рд╣реИ ...



рд╣реИрдбрд░


рдкрд╣рд▓рд╛ рднрд╛рдЧ рд╕рдмрд╕реЗ рд╕рд░рд▓ рд╣реИред рдЗрд╕реЗ 4 рдмрд╛рдЗрдЯреНрд╕ рдХреЗ 3 рдЯреБрдХрдбрд╝реЛрдВ рдореЗрдВ рднреА рд╡рд┐рднрд╛рдЬрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ

  1. рдлрд╝рд╛рдЗрд▓ рдкреНрд░рдХрд╛рд░ рд╣реЛрддрд╛ рд╣реИ - "RIFF"
  2. рдлрд╝рд╛рдЗрд▓ рдХрд╛ рдЖрдХрд╛рд░
  3. "рддрд░рдВрдЧ" рд▓реЗрдмрд▓ рд╢рд╛рдорд┐рд▓ рд╣реИ


 var text = ''; var j = 0 for (var i = j; i < j + 4; i++) { text += String.fromCharCode(data[i]); } j = i; wave.type = text; //   - ┬лRIFF┬╗ var text = ''; for (var i = j; i < j + 4; i++) { var byt = data[i].toString(2); if (byt.length != 8) { byt = addByte(byt) } text = byt + text; } j = i; wave.size = parseInt(text, 2); //     8    ,    .
      
      







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



 function addByte(byt) { while (8 != byt.length) { byt = '0' + byt; } return byt; }
      
      







 var text = ''; for (var i = j; i < j + 4; i++) { text += String.fromCharCode(data[i]); } j = i; console.log(j + ' Label -' + text); wave.label = text; // ┬лwave┬╗
      
      







рдбреЗрдЯрд╛ рдкреНрд░рд╛рд░реВрдк рдЕрдиреБрднрд╛рдЧ




рд╣реЗрдбрд░ рдХреЗ рдареАрдХ рдмрд╛рдж рдбреЗрдЯрд╛ рдлреЙрд░реНрдореЗрдЯ рд╕реЗрдХреНрд╢рди рдЬрд╛рддрд╛ рд╣реИ, рдпрд╣ рдХреАрд╡рд░реНрдб "fmt" рд╕реЗ рд╢реБрд░реВ рд╣реЛрддрд╛ рд╣реИ



 var text = ''; for (var i = j; i < j + 4; i++) { text += String.fromCharCode(data[i]); //text += data[i].toString(16); } j = i;
      
      







рдЗрд╕рдХреЗ рдмрд╛рдж рдлрд╛рдЗрд▓ рд╡рд┐рдХрд▓реНрдк рд╣реИрдВред



рдЖрдХрд╛рд░, рдмрд╛рдЗрдЯ рдирд╛рдо рд╡рд┐рд╡рд░рдг
4 рдЪрдВрдХ рдбреЗрдЯрд╛ рдХрд╛ рдЖрдХрд╛рд░ рдлрд╝рд╛рдЗрд▓ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдбреЗрдЯрд╛ рд░рдЦрдиреЗ рд╡рд╛рд▓реЗ рдмрд╛рдЗрдЯреНрд╕ рдХреА рд╕рдВрдЦреНрдпрд╛ рд╕рдорд╛рд╣рд┐рдд рдХрд░рддрд╛ рд╣реИ
2 рд╕рдВрдкреАрдбрд╝рди рдХреЛрдб рдЗрд╕рдореЗрдВ рдХреЛрдб рд╣реЛрддрд╛ рд╣реИ рдЬреЛ рдлрд╝рд╛рдЗрд▓ рд╕рдВрдкреАрдбрд╝рди рдХреА рдЙрдкрд╕реНрдерд┐рддрд┐ рдХреЛ рдЗрдВрдЧрд┐рдд рдХрд░рддрд╛ рд╣реИ (рдПрдХ wav рдлрд╝рд╛рдЗрд▓ рдореЗрдВ рдПрдордкреАрдИрдЬреА рджреНрд╡рд╛рд░рд╛ рднреА рдзреНрд╡рдирд┐ рдкрд┐рди рдХреА рдЬрд╛ рд╕рдХрддреА рд╣реИ, рд▓реЗрдХрд┐рди рдЗрди рд╕реБрд╡рд┐рдзрд╛рдУрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ), рд╕рдмрд╕реЗ рдЕрдзрд┐рдХ рдмрд╛рд░ 1 рд╣реЛрдЧрд╛, рдЬрд┐рд╕рдХрд╛ рдЕрд░реНрде рд╣реИ рдкреАрд╕реАрдПрдо / рдЕрд╕рдореНрдкреАрдбрд┐рдд, рдЕрд░реНрдерд╛рддреНред рдХреЛрдИ рд╕рдВрдкреАрдбрд╝рди рдирд╣реАрдВ
2 рдЪреИрдирд▓реЛрдВ рдХреА рд╕рдВрдЦреНрдпрд╛ рдЪреИрдирд▓реЛрдВ рдХреА рд╕рдВрдЦреНрдпрд╛, wav рдлрд╝рд╛рдЗрд▓ рдореЗрдВ рдорд▓реНрдЯреА-рдЪреИрдирд▓ рд░рд┐рдХреЙрд░реНрдбрд┐рдВрдЧ рд╣реЛ рд╕рдХрддреА рд╣реИ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП 5.1
4 рдирдореВрдирд╛ рджрд░ рдирдореВрдирд╛ рджрд░, рдЖрдорддреМрд░ рдкрд░ 44100 - рд╕реАрдбреА рдирдореВрдирд╛ рджрд░
4 рдкреНрд░рддрд┐ рд╕реЗрдХрдВрдб рдФрд╕рдд рдмрд╛рдЗрдЯреНрд╕ рдлрд╝рд╛рдЗрд▓ рдмрд┐рдЯрд░реЗрдЯ рдХрд░реЗрдВ
2 рдмреНрд▓реЙрдХ рд╕рдВрд░реЗрдЦрд┐рдд рдХрд░реЗрдВ рдзреНрд╡рдирд┐ рдХрд╛ 1 рдлреНрд░реЗрдо рдЬрд┐рд╕рдореЗрдВ рд╕рднреА рдЪреИрдирд▓ рд╕реНрдерд┐рдд рд╣реИрдВ, рдЕрдЪреНрдЫреА рддрд░рд╣ рд╕реЗ, рдпрд╛ рдЖрдк рдЕрд▓рдЧ-рдЕрд▓рдЧ рдХрд╣ рд╕рдХрддреЗ рд╣реИрдВ - рдирдореВрдирд╛ рдЖрдХрд╛рд░
2 рдирдореВрдирд╛ рдкреНрд░рддрд┐ рдорд╣рддреНрд╡рдкреВрд░реНрдг рдмрд┐рдЯреНрд╕ рдПрдХ рдЪреИрдирд▓ рдХреЗ рдлреНрд░реЗрдо рдХреЛ рдХреВрдЯрдиреЗ рдХреЗ рд▓рд┐рдП рдмрд┐рдЯреНрд╕ (!) рдХреА рд╕рдВрдЦреНрдпрд╛




рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рд╡реЗрд╡ рдлрд╛рдЗрд▓ рдмрдирд╛рдиреЗ рд╡рд╛рд▓реЗ рдкреНрд░реЛрдЧреНрд░рд╛рдо рдпрд╣рд╛рдВ рдХреБрдЫ рднреА рд▓рд┐рдЦ рд╕рдХрддреЗ рд╣реИрдВ, рдЬрд┐рдиреНрд╣реЗрдВ рдЕрдХреНрд╕рд░ рдмрд╛рдж рдореЗрдВ рдЗрди рдХрд╛рд░реНрдпрдХреНрд░рдореЛрдВ рджреНрд╡рд╛рд░рд╛ рд╕рдордЭрд╛ рдЬрд╛рддрд╛ рд╣реИред



 // extra bytes fmt var text = ''; for (var i = j; i < j + 4; i++) { var byt = data[i].toString(2); if (byt.length != 8) { byt = addByte(byt) } text = byt + text; } j = i; wave.extra_bytes_fmt = parseInt(text, 2); //Compression code var text = ''; for (var i = j; i < j + 2; i++) { var byt = data[i].toString(2); if (byt.length != 8) { byt = addByte(byt) } text = byt + text; } j = i; var compression = ''; switch (parseInt(text, 2)) { case 0: compression = 'Unknown'; break; case 1: compression = 'PCM/uncompressed'; break; case 2: compression = 'Microsoft ADPCM'; break; case 6: compression = 'ITU G.711 a-law'; break; case 7: compression = 'ITU G.711 ├В┬╡-law'; break; case 17: compression = 'IMA ADPCM'; break; case 20: compression = 'ITU G.723 ADPCM (Yamaha)'; break; case 49: compression = 'GSM 6.10'; break; case 64: compression = 'ITU G.721 ADPCM'; break; case 80: compression = 'MPEG'; break; case 65536: compression = 'Experimental'; break; default: compression = 'Other'; break; } wave.compression = compression; //Number of channels var text = ''; for (var i = j; i < j + 2; i++) { var byt = data[i].toString(2); if (byt.length != 8) { byt = addByte(byt) } text = byt + text; } j = i; console.log(j + ' Number of channels - ' + parseInt(text, 2)); wave.number_of_channels = parseInt(text, 2); //Sample rate var text = ''; for (var i = j; i < j + 4; i++) { var byt = data[i].toString(2); if (byt.length != 8) { byt = addByte(byt) } text = byt + text; } j = i; console.log(j + ' Sample rate - ' + parseInt(text, 2) + ' hz '); wave.sample_rate = parseInt(text, 2); //Average bytes per second var text = ''; for (var i = j; i < j + 4; i++) { var byt = data[i].toString(2); if (byt.length != 8) { byt = addByte(byt) } text = byt + text; } j = i; wave.average_bytes_per_second = parseInt(text, 2) * 8 / 1000; //        / //Block align var text = ''; for (var i = j; i < j + 2; i++) { var byt = data[i].toString(2); if (byt.length != 8) { byt = addByte(byt) } text = byt + text; } j = i; wave.block_align = parseInt(text, 2); //Significant bits per sample var text = ''; for (var i = j; i < j + 2; i++) { var byt = data[i].toString(2); if (byt.length != 8) { byt = addByte(byt) } text = byt + text; } j = i; wave.significant_bits_per_sample = parseInt(text, 2); //Extra format bytes var text = ''; for (var i = j; i < j + 2; i++) { var byt = data[i].toString(2); if (byt.length != 8) { byt = addByte(byt) } text = byt + text; } j = i; wave.extra_format_bytes = parseInt(text, 2); //end fmt
      
      







рдбреЗрдЯрд╛




рдЪреВрдВрдХрд┐ fmt рдЕрдиреБрднрд╛рдЧ рдореЗрдВ рдЕрддрд┐рд░рд┐рдХреНрдд рдлрд╝реАрд▓реНрдбреНрд╕ рдХреА рд╕рдВрдЦреНрдпрд╛ рдмрд╣реБрдд рдЕрдиреБрдорд╛рдирд┐рдд рдирд╣реАрдВ рд╣реИ (рд╡рд╛рд╕реНрддрд╡рд┐рдХ рд╕реНрдерд┐рддрд┐ рдЕрдХреНрд╕рд░ extra_bytes_format рдлрд╝реАрд▓реНрдб рдореЗрдВ рдкрд░рд┐рд▓рдХреНрд╖рд┐рдд рдирд╣реАрдВ рд╣реЛрддреА рд╣реИ), рд╕реНрдкрд░реНрд╢ рджреНрд╡рд╛рд░рд╛ "рдбреЗрдЯрд╛" рдХреАрд╡рд░реНрдб рдХреЛ рдвреВрдВрдврдирд╛ рд╕рдмрд╕реЗ рдЖрд╕рд╛рди рд╣реИред



 while (!(text == 'data' || j == wave.size)) { text = String.fromCharCode(data[j]) + String.fromCharCode(data[j + 1]) + String.fromCharCode(data[j + 2]) + String.fromCharCode(data[j + 3]); j++; } wave.data_position = j;
      
      







рдХреАрд╡рд░реНрдб рдХреЗ рдмрд╛рдж 4 рдмрд╛рдЗрдЯреНрд╕ рдореЗрдВ рдбреЗрдЯрд╛ рдХрд╛ рдЖрдХрд╛рд░ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП

 var text = ''; for (var i = j; i < j + 4; i++) { var byt = data[i].toString(2); if (byt.length != 8) { byt = addByte(byt) } text = byt + text; } j = i; wave.chunk_size = parseInt(text, 2);
      
      







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



 //sound wave.lc = []; wave.rc = []; var k = 16; /*       -      ,    k */ wave.n = wave.block_align * k; while (j < wave.size) { var text = ''; for (var i = j; i < j + wave.block_align; i++) { var byt = data[i].toString(2); if (byt.length != 8) { byt = addByte(byt) } text = text + byt; } var s1 = text.slice(0, text.length / 2); if (s1[0] == 1) { s1 = -(parseInt(text.slice(1, text.length / 2), 2)) } else { s1 = parseInt(text.slice(0, text.length / 2), 2) } var s2 = text.slice(text.length / 2, text.length); if (s2[0] == 1) { s2 = -(parseInt(text.slice(text.length / 2 + 1, text.length), 2)) } else { s2 = parseInt(text.slice(text.length / 2, text.length), 2) } /*  1   8 ,   ,   (16,24, 32тАж ),      */ wave.lc.push(s1); wave.rc.push(s2); j = i; j += wave.n; }
      
      







рдиреЛрдб рдХреЗ рдкреБрд╕реНрддрдХрд╛рд▓рдп рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рдж - рдХреИрдирд╡рд╛рд╕-рдиреЛрдб, рд╣рдо рддрд░рдВрдЧреЛрдВ рдХреЛ рдЖрдХрд░реНрд╖рд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред



рд▓рд╣рд░реЗрдВ рдЦреАрдВрдЪреЛ




рдЖрдк рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдХреЗ рд╕рд╛рде-рд╕рд╛рде рдмреНрд░рд╛рдЙрдЬрд╝рд░ рдореЗрдВ рдПрдХ рдирд┐рдпрдорд┐рдд рдХреИрдирд╡рд╛рд╕ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ

 var canvas = new Canvas(900, 300); var ctx = canvas.getContext('2d'); var canvas2 = new Canvas(900, 300); var ctx2 = canvas2.getContext('2d'); ctx.strokeStyle = 'rgba(0,187,255,1)'; ctx.beginPath(); ctx.moveTo(0, 150); ctx2.strokeStyle = 'rgba(0,187,255,1)'; ctx2.beginPath(); ctx2.moveTo(0, 150); wave.k = 900 / wave.lc.length; wave.l = 300 / Math.pow(2, wave.significant_bits_per_sample); //               900  300 var q = Math.pow(2, wave.significant_bits_per_sample) / 2; /*  node.js       FreeBSD,       */ var web = http.createServer(function (req, res) { res.writeHead(200, { 'Content-Type': 'text/html' }); for (var i = 1; i < wave.lc.length; i++) { if (wave.lc[i] > 0) { var y = 150 + Math.floor(wave.lc[i] * wave.l) } else { var y = 150 + Math.floor((-q - wave.lc[i]) * wave.l) } if (wave.lc[i] == 0) y = 150 ctx.lineTo(Math.floor(i * wave.k), y); } ctx.stroke(); res.write('<img src="' + canvas.toDataURL() + '" /><br/>'); //   for (var i = 1; i < wave.rc.length; i++) { if (wave.rc[i] > 0) { var y = 150 + Math.floor(wave.rc[i] * wave.l) } else { var y = 150 + Math.floor((-q - wave.rc[i]) * wave.l) } if (wave.rc[i] == 0) y = 150 ctx2.lineTo(Math.floor(i * wave.k), y); } ctx2.stroke(); res.write('<img src="' + canvas2.toDataURL() + '" /><br/>'); //    res.end(); }).listen(8000);
      
      







рдкрд░рд┐рдгрд╛рдо


рд▓рд╣рд░



ps рдЧреБрдгрд╡рддреНрддрд╛ рдФрд░ рдЙрдк-рдХреЛрдб рдХреЛрдб рдХреЗ рд▓рд┐рдП рдХреНрд╖рдорд╛ рдХрд░реЗрдВред рдореИрдВ рд╕рд┐рд░реНрдл рд╕реАрдЦ рд░рд╣рд╛ рд╣реВрдВ, рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛ рдореИрдВрдиреЗ рдЬрд┐рддрдирд╛ рд╕рдВрднрд╡ рд╣реЛ рдЙрддрдирд╛ рд╕рд░рд▓ рд▓рд┐рдЦрдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХреАред



All Articles