Burada javascript Web Audio API'siyle nasıl yapılacağını gösteren bir eğitim yazdım. Adımları
https://askmacgyver.com/blog/tutorial/how-to-implement-tempo-detection-in-your-application
Anahat
- Tampon
Alçak geçiş sayesinde
- Çalıştır Dizisi Tampon
- Tampon
Array 10 saniye Klip Trim Filtre bir Array içine Ses Dosyası Dönüşümü
- Verileri Doldurun Örnek
- Normale Gruplamalarınızdan Veri
- Sayım Hacmi Gruplandırmaları
- Infer Tempo
Bu kod aşağıda ağır işi yapar sayın. Alçak geçiş sayesinde
Yük Ses Dizi Tampon içine Dosya ve Çalıştır Filtre
function createBuffers(url) {
// Fetch Audio Track via AJAX with URL
request = new XMLHttpRequest();
request.open('GET', url, true);
request.responseType = 'arraybuffer';
request.onload = function(ajaxResponseBuffer) {
// Create and Save Original Buffer Audio Context in 'originalBuffer'
var audioCtx = new AudioContext();
var songLength = ajaxResponseBuffer.total;
// Arguments: Channels, Length, Sample Rate
var offlineCtx = new OfflineAudioContext(1, songLength, 44100);
source = offlineCtx.createBufferSource();
var audioData = request.response;
audioCtx.decodeAudioData(audioData, function(buffer) {
window.originalBuffer = buffer.getChannelData(0);
var source = offlineCtx.createBufferSource();
source.buffer = buffer;
// Create a Low Pass Filter to Isolate Low End Beat
var filter = offlineCtx.createBiquadFilter();
filter.type = "lowpass";
filter.frequency.value = 140;
source.connect(filter);
filter.connect(offlineCtx.destination);
// Render this low pass filter data to new Audio Context and Save in 'lowPassBuffer'
offlineCtx.startRendering().then(function(lowPassAudioBuffer) {
var audioCtx = new(window.AudioContext || window.webkitAudioContext)();
var song = audioCtx.createBufferSource();
song.buffer = lowPassAudioBuffer;
song.connect(audioCtx.destination);
// Save lowPassBuffer in Global Array
window.lowPassBuffer = song.buffer.getChannelData(0);
console.log("Low Pass Buffer Rendered!");
});
},
function(e) {});
}
request.send();
}
createBuffers('https://askmacgyver.com/test/Maroon5-Moves-Like-Jagger-128bpm.mp3');
Şimdi Array Alçak Geçiren Filtreli Song Tampon (Ve Orjinal)
O comprise var
Birkaç giriş, sampleRate (44100 şarkının saniye sayısı ile çarpılır).
window.lowPassBuffer // Low Pass Array Buffer
window.originalBuffer // Original Non Filtered Array Buffer
Verilerinizi Normale Kişisel Klip Numune Şarkı
function getClip(length, startTime, data) {
var clip_length = length * 44100;
var section = startTime * 44100;
var newArr = [];
for (var i = 0; i < clip_length; i++) {
newArr.push(data[section + i]);
}
return newArr;
}
// Overwrite our array buffer to a 10 second clip starting from 00:10s
window.lowPassFilter = getClip(10, 10, lowPassFilter);
Aşağı dan
function getSampleClip(data, samples) {
var newArray = [];
var modulus_coefficient = Math.round(data.length/samples);
for (var i = 0; i < data.length; i++) {
if (i % modulus_coefficient == 0) {
newArray.push(data[i]);
}
}
return newArray;
}
// Overwrite our array to down-sampled array.
lowPassBuffer = getSampleClip(lowPassFilter, 300);
10 İkinci Klip Trim
Sayım Düz Çizgi Gruplandırmaları
function countFlatLineGroupings(data) {
var groupings = 0;
var newArray = normalizeArray(data);
function getMax(a) {
var m = -Infinity,
i = 0,
n = a.length;
for (; i != n; ++i) {
if (a[i] > m) {
m = a[i];
}
}
return m;
}
function getMin(a) {
var m = Infinity,
i = 0,
n = a.length;
for (; i != n; ++i) {
if (a[i] < m) {
m = a[i];
}
}
return m;
}
var max = getMax(newArray);
var min = getMin(newArray);
var count = 0;
var threshold = Math.round((max - min) * 0.2);
for (var i = 0; i < newArray.length; i++) {
if (newArray[i] > threshold && newArray[i + 1] < threshold && newArray[i + 2] < threshold && newArray[i + 3] < threshold && newArray[i + 6] < threshold) {
count++;
}
}
return count;
}
// Count the Groupings
countFlatLineGroupings(lowPassBuffer);
İkinci Gruplama Dakika Başına Beats Türetilemedi 60 Saniyede kadar sayın Ölçek 10
var final_tempo = countFlatLineGroupings(lowPassBuffer);
// final_tempo will be 21
final_tempo = final_tempo * 6;
console.log("Tempo: " + final_tempo);
// final_tempo will be 126
sen bağlantılı makale bütün konuyu oldukça lanetlemek kapakları Peki, özellikle zor zamanlar geçiriyor musunuz? – Nit
Evet Biliyorum! Bu yüzden çok sinir bozucu, işe yaramayacağım, yani ilk işlev için eşiği veya verileri nereden alacağım, zirveleri almadan önce veya sonra filtreleri kullanabilir miyim? Aptal hissediyorum. – undefined
Eşik, üzerinde çalıştığınız ses türüne çok bağlıdır. Kısa bir süre sizin seçtiğiniz bir sayıdır. Veri, çalışmak istediğiniz ses dosyasıdır. – Nit