Javascript-library สำหรับค้นหาจังหวะ (BPM) ของเพลงและการติดตามจังหวะ ใช้อัลกอริธึม "Beatroot" ที่เขียนโดย Simon Dixon
แอพตัวอย่าง
เอกสาร
ในเบราว์เซอร์
<script src="music-tempo.min.js"></script>
ใช้ npm:
$ npm i -- บันทึกเพลง-จังหวะ
ส่งบัฟเฟอร์ที่มีข้อมูลในรูปแบบต่อไปนี้ไปยังตัวสร้าง MusicTempo: PCM เชิงเส้น 32 บิต IEEE754 แบบไม่มีการสอดแทรกซึ่งมีช่วงที่กำหนดระหว่าง -1 ถึง +1 นั่นคือบัฟเฟอร์จุดลอยตัว 32 บิต โดยแต่ละตัวอย่างอยู่ระหว่าง -1.0 ถึง 1.0. รูปแบบนี้ใช้ในอินเทอร์เฟซ AudioBuffer ของ Web Audio API วัตถุที่ส่งคืนโดยตัวสร้างมีคุณสมบัติ tempo
- ค่าจังหวะเป็นจังหวะต่อนาที และ beats
- อาร์เรย์พร้อมจังหวะจังหวะเป็นวินาที
บริบท var = AudioContext ใหม่ ({ exampleRate: 44100 }); var fileInput = document.getElementById ("fileInput"); fileInput.onchange = function () { ไฟล์ var = fileInput.files; ถ้า (files.length == 0) กลับ; var reader = new FileReader(); reader.onload = ฟังก์ชั่น (fileEvent) {context.decodeAudioData (fileEvent.target.result, calcTempo); - reader.readAsArrayBuffer (ไฟล์ [0]);} var calcTempo = ฟังก์ชั่น (บัฟเฟอร์) { var audioData = []; // หาค่าเฉลี่ยของทั้งสองช่อง ถ้า (buffer.numberOfChannels == 2) {var channel1Data = buffer.getChannelData(0);var channel2Data = buffer.getChannelData(1);var length = channel1Data.length;for (var i = 0; i < length; i++) { ข้อมูลเสียง[i] = (channel1Data[i] + channel2Data[i]) / 2;} } อื่น ๆ {audioData = buffer.getChannelData(0); - var mt = MusicTempo ใหม่ (ข้อมูลเสียง); console.log(mt.จังหวะ); console.log(mt.beats);}
ในสภาพแวดล้อม Node.js สามารถใช้ไลบรารี node-web-audio-api
var AudioContext = need("web-audio-api").AudioContext;var MusicTempo = need("music-tempo");var fs = need("fs");var calcTempo = ฟังก์ชั่น (บัฟเฟอร์) { var audioData = []; // หาค่าเฉลี่ยของทั้งสองช่อง ถ้า (buffer.numberOfChannels == 2) {var channel1Data = buffer.getChannelData(0);var channel2Data = buffer.getChannelData(1);var length = channel1Data.length;for (var i = 0; i < length; i++) { ข้อมูลเสียง[i] = (channel1Data[i] + channel2Data[i]) / 2;} } อื่น ๆ {audioData = buffer.getChannelData(0); - var mt = MusicTempo ใหม่ (ข้อมูลเสียง); console.log(mt.จังหวะ); console.log(mt.beats);}var data = fs.readFileSync("songname.mp3");var context = new AudioContext();context.decodeAudioData(data, calcTempo);
คุณสามารถส่งวัตถุที่มีพารามิเตอร์เป็นอาร์กิวเมนต์ที่สองไปยังตัวสร้าง:
var p = { expiryTime: 30, maxBeatInterval: 1.5 }; var mt = ใหม่ MusicTempo (audioData, p);
มีประโยชน์มากที่สุดคือ maxBeatInterval
/ minBeatInterval
และ expiryTime
สองอันแรกใช้สำหรับตั้งค่า BPM สูงสุดและต่ำสุด ค่าเริ่มต้นสำหรับ maxBeatInterval
คือ 1 ซึ่งหมายความว่า BPM ขั้นต่ำคือ 60 (60/1 = 60) ค่าเริ่มต้นสำหรับ minBeatInterval
คือ 0.3 ซึ่งหมายความว่า BPM สูงสุดคือ 200 (60 / 0.3 = 200) ระวัง ยิ่งค่า BPM สูงสุดมีค่ามากขึ้น ความน่าจะเป็นของข้อผิดพลาด 2x-BPM ก็จะยิ่งมากขึ้น (เช่น หาก BPM สูงสุด = 210 และจังหวะที่แท้จริงของเพลงคือ 102 BPM ในที่สุดคุณก็จะได้ 204 BPM) expiryTime
สามารถใช้หากไฟล์เสียงมีช่วงเวลาแห่งความเงียบหรือเกือบเงียบ และเนื่องจากการติดตามจังหวะนั้นล้มเหลว พารามิเตอร์อื่นๆ แสดงอยู่ในเอกสารประกอบ
ต้องใช้มอคค่าและชัย
การทดสอบ $ NPM
ต้องใช้ esdoc
$esdoc
ต้องอึกและบาเบล การขึ้นต่อกันอื่นๆ สามารถพบได้ใน package.json
$ อึกสร้าง
ใบอนุญาตเอ็มไอที